@standardagents/builder 0.15.3 → 0.17.0-next.a4b7340
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/built-in-routes.js +362 -281
- package/dist/built-in-routes.js.map +1 -1
- package/dist/client/ApiKeysView.js +1 -1
- package/dist/client/CenteredContentView.js +1 -1
- package/dist/client/CompositionView.js +1 -1
- package/dist/client/ConfirmDialog.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/client/CopyButton.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/client/DataTable.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/client/JsonViewer.js +1 -1
- package/dist/client/LoginView.js +1 -1
- package/dist/client/Modal.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/client/ModelModal.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/client/ModelsView.js +1 -1
- package/dist/client/PromptEditView.js +1 -1
- package/dist/client/PromptModal.js +1 -1
- package/dist/client/PromptsView.js +1 -1
- package/dist/client/ProvidersView.js +2 -2
- package/dist/client/ThreadInspectorPane.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/client/ToolsView.js +1 -1
- package/dist/client/UsersView.js +1 -1
- package/dist/client/VariablesView.js +1 -1
- package/dist/client/assets/index.css +1 -1
- package/dist/client/index.js +3 -3
- package/dist/{discovery-DVviz3By.d.ts → discovery-DiMJWisl.d.ts} +1 -1
- package/dist/{index-BwqQtJ4r.d.ts → index-EaxysUHv.d.ts} +2 -5
- package/dist/index.d.ts +116 -3402
- package/dist/index.js +190 -324
- package/dist/index.js.map +1 -1
- package/dist/packing.d.ts +3 -3
- package/dist/plugin.d.ts +5 -4
- package/dist/plugin.js +143 -78
- package/dist/plugin.js.map +1 -1
- package/dist/runtime.d.ts +3124 -0
- package/dist/runtime.js +21218 -0
- package/dist/runtime.js.map +1 -0
- package/dist/test.d.ts +2 -2
- package/dist/{types-DH3Egc5l.d.ts → types-Bpe7IANZ.d.ts} +1 -1
- package/package.json +10 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agents/types.ts","../src/agents/StreamManager.ts","../src/agents/pricing.ts","../src/agents/providers/types.ts","../src/agents/providers/TestScript.ts","../src/agents/providers/TestProvider.ts","../src/agents/providers/platform-routing.ts","../src/agents/providers/ProviderRegistry.ts","../src/agents/providers/index.ts","../src/agents/LLMRequest.ts","../src/agents/sessionTools.ts","../src/durable-objects/files.ts","../src/agents/ToolExecutor.ts","../src/agents/context.ts","../src/agents/FlowEngine.ts","../src/agents/utilities.ts","../src/agents/code-execution.ts","../src/agents/ThreadStateImpl.ts","../src/image-processing/index.ts","../src/router/index.ts","../src/utils/auth.ts","../src/middleware/auth.ts","../src/durable-objects/migrations/001_initial.ts","../src/durable-objects/migrations/002_add_prompt_and_tools_to_logs.ts","../src/durable-objects/migrations/003_add_log_context_and_parent.ts","../src/durable-objects/migrations/004_add_reasoning_tokens.ts","../src/durable-objects/migrations/005_add_reasoning_content.ts","../src/durable-objects/migrations/006_add_log_id_to_messages.ts","../src/durable-objects/migrations/007_add_errors_and_retry_tracking.ts","../src/durable-objects/migrations/008_add_tool_results.ts","../src/durable-objects/migrations/009_add_request_response_timestamps.ts","../src/durable-objects/migrations/010_add_alarm_queue.ts","../src/durable-objects/migrations/011_add_silent_messages.ts","../src/durable-objects/migrations/012_remove_message_history.ts","../src/durable-objects/migrations/013_add_tool_status.ts","../src/durable-objects/migrations/014_add_parent_id_and_depth.ts","../src/durable-objects/migrations/015_add_reasoning_to_messages.ts","../src/durable-objects/migrations/016_add_reasoning_details.ts","../src/durable-objects/migrations/017_add_files.ts","../src/durable-objects/migrations/018_add_image_dimensions.ts","../src/durable-objects/migrations/019_add_file_chunks.ts","../src/durable-objects/migrations/020_add_provider_tools.ts","../src/durable-objects/migrations/021_add_actual_provider.ts","../src/durable-objects/migrations/022_add_prompt_to_messages.ts","../src/durable-objects/migrations/023_add_queued_tools.ts","../src/durable-objects/migrations/024_add_message_queue_and_termination.ts","../src/durable-objects/migrations/025_add_message_metadata_and_subagent_id.ts","../src/durable-objects/migrations/026_add_thread_values.ts","../src/durable-objects/migrations/027_add_effect_run_metadata.ts","../src/durable-objects/migrations/028_add_effect_canceled_statuses.ts","../src/durable-objects/migrations/029_add_effect_source_log.ts","../src/durable-objects/migrations/030_add_standard_agents_router_used.ts","../src/durable-objects/migrations/index.ts","../src/durable-objects/DurableThread.ts","../src/durable-objects/utils/AlarmQueue.ts","../src/packing/resolver.ts","../src/durable-objects/agentbuilder-migrations/0001_initial.ts","../src/durable-objects/agentbuilder-migrations/0002_add_tenvs_properties.ts","../src/durable-objects/agentbuilder-migrations/0003_add_parent_and_terminated.ts","../src/durable-objects/agentbuilder-migrations/0004_add_env_tables.ts","../src/durable-objects/agentbuilder-migrations/0005_add_pending_subagent_env_requests.ts","../src/durable-objects/agentbuilder-migrations/0006_add_env_value_types.ts","../src/durable-objects/agentbuilder-migrations/index.ts","../src/utils/crypto.ts","../src/durable-objects/DurableAgentBuilder.ts","../src/durable-objects/CodeExecutionBridge.ts","../src/runtime.ts","../src/agents/FlowStateSdk.ts"],"names":["init_types","ProviderError","error","ProviderRegistry","result","FlowEngine","tools","withReference","normalized","FileStorage","toolCalls","imageDescriptions","isAbortError","nonImageFiles","head","tail","end","isPlainObject","settledCodeExecution","TEXT_APPLICATION_TYPES","defineController","migration","loader","pkgId","pkg","globalRegistry","globalLoader","ThreadStateImpl","messages","data","message","messageId","StreamManager","processImage","base64ToArrayBuffer","arrayBufferToBase64","exists","CHUNK_SIZE","normalizePath","basename","migrations","LATEST_SCHEMA_VERSION","base64ToBuffer","DurableObject","def"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAklCa,SAAA,EACA,qBAAA,EACA,oBAAA,EACA,eAAA,EACA,YAAA;AAtlCb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAklCO,IAAM,SAAA,GAAY,GAAA;AAClB,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,YAAA,GAAe,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtlC5B,IAAA,qBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAqBa,aAAA;AArBb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAqBO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,MAIjB,cAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAA;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,GAAyB,CAAA;AAAA;AAAA;AAAA;AAAA,MAKxB,mBAAkC,EAAC;AAAA;AAAA;AAAA;AAAA,MAKpC,YAAA,GAAwB,KAAA;AAAA;AAAA;AAAA;AAAA,MAKvB,OAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAA;AAAA;AAAA;AAAA;AAAA,MAKC,WAAuB,MAAM;AAAA,MAAC,CAAA;AAAA;AAAA;AAAA;AAAA,MAK9B,MAAA,GAAkB,KAAA;AAAA,MAE1B,WAAA,CAAY,WAAA,GAA2C,EAAC,EAAG;AACzD,QAAA,IAAA,CAAK,OAAA,GAAU,IAAI,WAAA,EAAY;AAG/B,QAAA,IAAA,CAAK,UAAA,GAAa,IAAI,cAAA,CAA2B;AAAA,UAC/C,KAAA,EAAO,CAAC,UAAA,KAAe;AACrB,YAAA,IAAA,CAAK,cAAA,GAAiB,UAAA;AAAA,UACxB;AAAA,SACD,CAAA;AAGD,QAAA,IAAA,CAAK,mBAAmB,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAC7C,WAAA,GACA,CAAC,WAAW,CAAA;AAGhB,QAAA,IAAA,CAAK,IAAA,GAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AACnC,UAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,QAClB,CAAC,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,KAAA,EAAqB;AAC/B,QAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,MAAA,EAAQ;AACvC,UAAA,OAAA,CAAQ,KAAK,0DAA0D,CAAA;AACvE,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACxD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,QACrD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,IAAA,EAAyC;AACtD,QAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,GAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAE,CAAA;AAAA,MACrE;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAQ,QAAA,EAAqD;AACjE,QAAA,IAAA,CAAK,cAAA,EAAA;AAEL,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,EAAS;AAAA,QACjB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,UAAA,MAAM,KAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,YAAA,EAAa;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,YAAA,GAAqB;AACnB,QAAA,IAAA,CAAK,cAAA,EAAA;AAEL,QAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,IAAK,CAAC,KAAK,YAAA,IAAgB,CAAC,KAAK,MAAA,EAAQ;AAElE,UAAA,UAAA,CAAW,YAAY;AACrB,YAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,CAAA,IAAK,CAAC,KAAK,MAAA,EAAQ;AAC5C,cAAA,MAAM,KAAK,KAAA,EAAM;AAAA,YACnB;AAAA,UACF,GAAG,eAAe,CAAA;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,KAAA,GAAuB;AAC3B,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAEd,QAAA,IAAI;AAEF,UAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,YACZ,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAO,IAAA,KAAS;AACxC,cAAA,IAAI;AACF,gBAAA,MAAM,IAAA,EAAK;AAAA,cACb,SAAS,KAAA,EAAO;AACd,gBAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,cACnD;AAAA,YACF,CAAC;AAAA,WACH;AAGA,UAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,YAC5B,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,YACnD;AAAA,UACF;AAGA,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QAChB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QAChB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,UAAA,GAAmB;AACjB,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,QAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACsCA,SAAS,yBAAyB,OAAA,EAAsD;AACtF,EAAA,MAAM,UAAA,GAAa,uBAAuB,OAAO,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,qBAAqB,UAAU,CAAA;AAC7C,EAAA,IAAI,OAAO,OAAO,EAAE,GAAG,KAAA,EAAO,QAAQ,eAAA,EAAgB;AACtD,EAAA,MAAM,WAAA,GAAc,8BAA8B,IAAA,CAAK,CAAC,UAAU,UAAA,CAAW,UAAA,CAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AACrG,EAAA,IAAI,aAAa,OAAO,EAAE,GAAG,WAAA,CAAY,OAAA,EAAS,QAAQ,eAAA,EAAgB;AAC1E,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,uBAAuB,OAAA,EAAsD;AACpF,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC5D,EAAA,OAAO,UAAU,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,eAAc,GAAI,IAAA;AAC3D;AAEA,SAAS,sBAAsB,OAAA,EAAsD;AACnF,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC3D,EAAA,OAAO,UAAU,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,cAAa,GAAI,IAAA;AAC1D;AAEA,SAAS,iBAAiB,OAAA,EAAiC;AACzD,EAAA,OAAA,CAAQ,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAC5C;AAEA,SAAS,uBAAuB,OAAA,EAAiC;AAC/D,EAAA,OAAO,gBAAA,CAAiB,OAAO,CAAA,CAC5B,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CACvB,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CACvB,OAAA,CAAQ,iCAAiC,EAAE,CAAA;AAChD;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAC,CAAA;AACjC;AAEO,SAAS,2BAA2B,OAAA,EAAsD;AAC/F,EAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAChE,EAAA,OAAO,UAAU,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,mBAAkB,GAAI,IAAA;AAC/D;AAEO,SAAS,mBAAA,CACd,UACA,YAAA,EAC6B;AAC7B,EAAA,IAAI,OAAO,QAAA,CAAS,UAAA,KAAe,YAAY,OAAO,QAAA,CAAS,gBAAgB,QAAA,EAAU;AACvF,IAAA,OAAO;AAAA,MACL,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAEA,EAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,IAAA,OAAO,0BAAA,CAA2B,SAAS,KAAK,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,IAAA,OAAO,wBAAA,CAAyB,SAAS,KAAK,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,IAAA,OAAO,sBAAA,CAAuB,SAAS,KAAK,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,qBAAA,CAAsB,SAAS,KAAK,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kBAAA,CACd,OACA,OAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,MAAM,qBAAA,EAAuB,aAAA,IAAiB,GAAG,CAAC,CAAA;AAChF,EAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,aAAA,IAAiB,GAAG,CAAC,CAAA;AACzD,EAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,iBAAA,IAAqB,GAAG,CAAC,CAAA;AACjE,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,KAAW,eAAA,GACvC,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,yBAAA,EAA2B,gBAAA,IAAoB,CAAA,EAAG,CAAC,CAAA,GAClE,CAAA;AACJ,EAAA,MAAM,uBAAuB,gBAAA,GAAmB,eAAA;AAChD,EAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,cAAc,CAAC,CAAA;AACpE,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,UAAA;AAExD,EAAA,MAAM,SAAA,GAAY,SAAA;AAAA,IAAA,CACd,oBAAA,GAAuB,OAAA,CAAQ,UAAA,GAAe,YAAA,GAAe,gBAAA,IAC7D;AAAA,GACJ;AACA,EAAA,MAAM,UAAA,GAAa,SAAA,CAAW,oBAAA,GAAuB,OAAA,CAAQ,cAAe,kBAAkB,CAAA;AAE9F,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,SAAA,CAAU,SAAA,GAAY,UAAU;AAAA,GAC7C;AACF;AAxUA,IAAM,kBAAA,EAiCA,sBAAA,EAmBA,oBAAA,EAsFA,6BAAA,EA8DA,kBAAA,EAUA,iBAAA;AAlNN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAAA,IAAM,kBAAA,GAAqB,GAAA;AAiC3B,IAAM,sBAAA,GAA+E;AAAA,MACnF,aAAA,EAAe;AAAA,QACb,UAAA,EAAY,IAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,UAAA,EAAY,IAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,aAAA,EAAe;AAAA,QACb,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,gCAAA,EAAkC;AAAA,QAChC,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa;AAAA;AACf,KACF;AAEA,IAAM,oBAAA,GAA6E;AAAA,MACjF,sBAAA,EAAwB;AAAA,QACtB,UAAA,EAAY,CAAA;AAAA,QACZ,WAAA,EAAa,EAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,wBAAA,EAA0B;AAAA,QACxB,UAAA,EAAY,CAAA;AAAA,QACZ,WAAA,EAAa,EAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,UAAA,EAAY,IAAA;AAAA,QACZ,WAAA,EAAa,EAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,kBAAA,EAAoB;AAAA,QAClB,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,uBAAA,EAAyB;AAAA,QACvB,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,wBAAA,EAA0B;AAAA,QACxB,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,+BAAA,EAAiC;AAAA,QAC/B,UAAA,EAAY,IAAA;AAAA,QACZ,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,mCAAA,EAAqC;AAAA,QACnC,UAAA,EAAY,CAAA;AAAA,QACZ,WAAA,EAAa,EAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,kBAAA,EAAoB;AAAA,QAClB,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,sBAAA,EAAwB;AAAA,QACtB,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA,uBAAA,EAAyB;AAAA,QACvB,UAAA,EAAY,KAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,2BAAA,EAA6B;AAAA,QAC3B,UAAA,EAAY,KAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,yCAAA,EAA2C;AAAA,QACzC,UAAA,EAAY,IAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,wBAAA,EAA0B;AAAA,QACxB,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,gCAAA,EAAkC;AAAA,QAChC,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,4BAAA,EAA8B;AAAA,QAC5B,UAAA,EAAY,CAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,yBAAA,EAA2B;AAAA,QACzB,UAAA,EAAY,CAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,UAAA,EAAY,CAAA;AAAA,QACZ,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa;AAAA;AACf,KACF;AAEA,IAAM,6BAAA,GAGD;AAAA,MACH;AAAA,QACE,MAAA,EAAQ,wBAAA;AAAA,QACR,OAAA,EAAS,qBAAqB,wBAAwB;AAAA,OACxD;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,sBAAA;AAAA,QACR,OAAA,EAAS,qBAAqB,sBAAsB;AAAA,OACtD;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,wBAAA;AAAA,QACR,OAAA,EAAS,qBAAqB,wBAAwB;AAAA,OACxD;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,+BAAA;AAAA,QACR,OAAA,EAAS,qBAAqB,+BAA+B;AAAA,OAC/D;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,gCAAA;AAAA,QACR,OAAA,EAAS,qBAAqB,uBAAuB;AAAA,OACvD;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,qBAAA;AAAA,QACR,OAAA,EAAS,qBAAqB,kBAAkB;AAAA,OAClD;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,0BAAA;AAAA,QACR,OAAA,EAAS,qBAAqB,uBAAuB;AAAA,OACvD;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,mBAAA;AAAA,QACR,OAAA,EAAS,qBAAqB,gBAAgB;AAAA,OAChD;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,UAAA,EAAY,CAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,UAAA,EAAY,CAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,UAAA,EAAY,CAAA;AAAA,UACZ,WAAA,EAAa,CAAA;AAAA,UACb,WAAA,EAAa;AAAA;AACf;AACF,KACF;AAEA,IAAM,kBAAA,GAA2E;AAAA,MAC/E,sBAAA,EAAwB,EAAE,UAAA,EAAY,IAAA,EAAM,aAAa,IAAA,EAAK;AAAA,MAC9D,yBAAA,EAA2B,EAAE,UAAA,EAAY,IAAA,EAAM,aAAa,IAAA,EAAK;AAAA,MACjE,2CAAA,EAA6C,EAAE,UAAA,EAAY,IAAA,EAAM,aAAa,IAAA,EAAK;AAAA,MACnF,6BAAA,EAA+B,EAAE,UAAA,EAAY,CAAA,EAAK,aAAa,CAAA,EAAI;AAAA,MACnE,uBAAuB,EAAE,UAAA,EAAY,MAAM,WAAA,EAAa,KAAA,EAAO,aAAa,GAAA,EAAI;AAAA,MAChF,sBAAsB,EAAE,UAAA,EAAY,OAAO,WAAA,EAAa,KAAA,EAAO,aAAa,GAAA,EAAI;AAAA,MAChF,gBAAA,EAAkB,EAAE,UAAA,EAAY,IAAA,EAAM,aAAa,IAAA;AAAK,KAC1D;AAEA,IAAM,iBAAA,GAA0E;AAAA,MAC9E,eAAe,EAAE,UAAA,EAAY,IAAI,WAAA,EAAa,GAAA,EAAK,aAAa,GAAA,EAAI;AAAA,MACpE,UAAU,EAAE,UAAA,EAAY,IAAI,WAAA,EAAa,GAAA,EAAK,aAAa,GAAA,EAAI;AAAA,MAC/D,iBAAiB,EAAE,UAAA,EAAY,IAAI,WAAA,EAAa,GAAA,EAAK,aAAa,GAAA,EAAI;AAAA,MACtE,yBAAyB,EAAE,UAAA,EAAY,GAAG,WAAA,EAAa,GAAA,EAAK,aAAa,CAAA,EAAE;AAAA,MAC3E,6BAA6B,EAAE,UAAA,EAAY,GAAG,WAAA,EAAa,GAAA,EAAK,aAAa,CAAA,EAAE;AAAA,MAC/E,2BAA2B,EAAE,UAAA,EAAY,GAAG,WAAA,EAAa,GAAA,EAAK,aAAa,CAAA,EAAE;AAAA,MAC7E,+BAA+B,EAAE,UAAA,EAAY,GAAG,WAAA,EAAa,GAAA,EAAK,aAAa,CAAA,EAAE;AAAA,MACjF,4BAA4B,EAAE,UAAA,EAAY,IAAI,WAAA,EAAa,CAAA,EAAG,aAAa,EAAA,EAAG;AAAA,MAC9E,gCAAgC,EAAE,UAAA,EAAY,IAAI,WAAA,EAAa,CAAA,EAAG,aAAa,EAAA,EAAG;AAAA,MAClF,8BAA8B,EAAE,UAAA,EAAY,IAAI,WAAA,EAAa,CAAA,EAAG,aAAa,EAAA,EAAG;AAAA,MAChF,oBAAoB,EAAE,UAAA,EAAY,GAAG,WAAA,EAAa,GAAA,EAAK,aAAa,EAAA,EAAG;AAAA,MACvE,UAAU,EAAE,UAAA,EAAY,IAAI,WAAA,EAAa,GAAA,EAAK,aAAa,GAAA,EAAI;AAAA,MAC/D,iBAAiB,EAAE,UAAA,EAAY,IAAI,WAAA,EAAa,GAAA,EAAK,aAAa,GAAA,EAAI;AAAA,MACtE,eAAe,EAAE,UAAA,EAAY,GAAG,WAAA,EAAa,IAAA,EAAM,aAAa,CAAA,EAAE;AAAA,MAClE,sBAAsB,EAAE,UAAA,EAAY,GAAG,WAAA,EAAa,IAAA,EAAM,aAAa,CAAA;AAAE,KAC3E;AAAA,EAAA;AAAA,CAAA,CAAA;AClOA,IAAAA,WAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IA6Ga,UAAA;AA7Gb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AA6GO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,MACd,YAAgC,EAAC;AAAA,MACjC,eAAA;AAAA;AAAA;AAAA;AAAA,MAKR,OAAO,MAAA,GAAqB;AAC1B,QAAA,OAAO,IAAI,WAAA,EAAW;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,QAAA,EAAkC;AAC5C,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,eAAA,CAAgB,SAAiB,OAAA,EAA2C;AAC1E,QAAA,OAAO,KAAK,WAAA,CAAY;AAAA,UACtB,OAAA;AAAA,UACA,YAAA,EAAc,MAAA;AAAA,UACd,GAAG;AAAA,SACJ,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAA,CACE,SAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,QAAA,OAAO,KAAK,WAAA,CAAY;AAAA,UACtB,SAAS,OAAA,IAAW,IAAA;AAAA,UACpB,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,YAChC,EAAA,EAAI,EAAA,CAAG,EAAA,IAAM,CAAA,KAAA,EAAQ,MAAA,CAAO,YAAW,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,YACxD,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,MAAM,EAAA,CAAG,IAAA;AAAA,cACT,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,SAAS;AAAA;AACxC,WACF,CAAE,CAAA;AAAA,UACF,YAAA,EAAc,YAAA;AAAA,UACd,GAAG;AAAA,SACJ,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAA,CACE,OAAA,EACA,IAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,QAAA,OAAO,KAAK,WAAA,CAAY;AAAA,UACtB,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,UAC/B,GAAG;AAAA,SACJ,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAA,CACE,OAAA,EACA,gBAAA,EACA,OAAA,EACM;AACN,QAAA,OAAO,KAAK,WAAA,CAAY;AAAA,UACtB,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,YAAA,EAAc,MAAA;AAAA,UACd,GAAG;AAAA,SACJ,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,MAAA,EAA+B;AACrD,QAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,YAAA,GAAmC;AACjC,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAA,GAAkD;AAChD,QAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,MAAA,GAAiB;AACnB,QAAA,OAAO,KAAK,SAAA,CAAU,MAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,OAAA,GAAmB;AACjB,QAAA,OAAO,IAAA,CAAK,UAAU,MAAA,KAAW,CAAA;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,GAAoB;AAClB,QAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAW;AAC9B,QAAA,MAAA,CAAO,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AACrC,QAAA,MAAA,CAAO,kBAAkB,IAAA,CAAK,eAAA,GAC1B,EAAE,GAAG,IAAA,CAAK,iBAAgB,GAC1B,MAAA;AACJ,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;AC3MA,SAAS,gBAAgB,OAAA,EAA4D;AACnF,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AAExC,EAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,IAAA,KAAS,MAAM,CAAA,CACrC,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,CAAwC,IAAI,CAAA,CAC3D,KAAK,GAAG,CAAA;AACb;AA0WO,SAAS,mBAAmB,MAAA,EAAmC;AACpE,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,MAAA,EAAQ,MAAA;AAAA,IACR;AAAA,GACD,CAAA;AACH;AA5ZA,IAuEa,YAAA,EA0VA,IAAA;AAjab,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AA+BA,IAAA,eAAA,EAAA;AAwCO,IAAM,eAAN,MAAmD;AAAA,MAC/C,IAAA,GAAO,MAAA;AAAA,MACP,oBAAA,GAAuB,GAAA;AAAA,MAExB,MAAA;AAAA,MACA,aAAA,GAAwB,CAAA;AAAA,MACxB,cAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAgC,EAAC;AAAA,MACjC,kBAAA;AAAA,MAER,YAAY,MAAA,EAA4B;AAEtC,QAAA,IAAA,CAAK,kBAAA,GAAqB,CAAC,MAAA,CAAO,MAAA;AAClC,QAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA,IAAU,WAAW,MAAA,EAAO,CAAE,gBAAgB,yBAAyB,CAAA;AAC5F,QAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,cAAA,IAAkB,KAAA;AAC/C,QAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAA,IAAY,KAAA;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,QAAA,EAA2B;AACvC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,SAAS,OAAA,EAAqD;AAElE,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAA0B,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAA,CAAA,CAAA,EAAK;AAAA,YAC/D,YAAA,EAAc,QAAQ,QAAA,CAAS,MAAA;AAAA,YAC/B,aAAa,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,EAAE,EAAE,CAAC;AAAA,WAC1C,CAAA;AAAA,QACH;AACA,QAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,EAAE,GAAG,SAAS,CAAA;AAGnC,QAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC3B,UAAA,MAAM,IAAIC,aAAAA,CAAc,iBAAA,EAAmB,SAAS,CAAA;AAAA,QACtD;AAGA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AAC3C,QAAA,IAAI,QAAA;AAEJ,QAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,SAAA,CAAU,MAAA,EAAQ;AAC1C,UAAA,IAAI,KAAK,kBAAA,EAAoB;AAE3B,YAAA,QAAA,GAAW,UAAU,CAAC,CAAA;AAAA,UACxB,CAAA,MAAO;AACL,YAAA,MAAM,cAAc,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,EAAE,EAAE,CAAC,CAAA;AAChD,YAAA,MAAM,WAAA,GACJ,WAAA,EAAa,IAAA,KAAS,MAAA,GAClB,eAAA,CAAgB,WAAA,CAAY,OAAO,CAAA,GACnC,WAAA,EAAa,IAAA,KAAS,WAAA,GACpB,WAAA,CAAY,WAAW,EAAA,GACvB,EAAA;AACR,YAAA,MAAM,IAAIA,aAAAA;AAAA,cACR,CAAA,qCAAA,EAAwC,KAAK,aAAa,CAAA,qBAAA,EAC5C,UAAU,MAAM,CAAA,uCAAA,EACH,QAAQ,QAAA,CAAS,MAAM,kCACzB,WAAA,EAAa,IAAI,gBAC3B,MAAA,CAAO,WAAW,EAAE,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,IAAA,CAAA;AAAA,cACpD;AAAA,aACF;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,SAAA,CAAU,KAAK,aAAa,CAAA;AAAA,QACzC;AAEA,QAAA,IAAA,CAAK,aAAA,EAAA;AAGL,QAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,QAAA,CAAS,WAAA,EAAa;AAC/C,UAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,QAAA,CAAS,WAAW,CAAA;AAAA,QAClD;AAGA,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA;AAAA,QACnC;AAGA,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,MAAM,IAAIA,aAAAA;AAAA,YACR,SAAS,KAAA,CAAM,OAAA;AAAA,YACd,QAAA,CAAS,MAAM,IAAA,IAAkC,SAAA;AAAA,YAClD,SAAS,KAAA,CAAM;AAAA,WACjB;AAAA,QACF;AAGA,QAAA,MAAM,eAAe,QAAA,CAAS,KAAA,EAAO,YAAA,IAAgB,IAAA,CAAK,eAAe,OAAO,CAAA;AAChF,QAAA,MAAM,gBAAA,GACJ,QAAA,CAAS,KAAA,EAAO,gBAAA,IAAoB,IAAA,CAAK,MAAM,QAAA,CAAS,OAAA,EAAS,MAAA,IAAU,CAAA,IAAK,CAAC,CAAA;AACnF,QAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,KAAA,EAAO,eAAA,IAAmB,CAAA;AAG3D,QAAA,MAAM,SAAA,GAAgD,QAAA,CAAS,SAAA,EAAW,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,UACrF,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,UAClB,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,SAAS,SAAS;AAAA,SAC7C,CAAE,CAAA;AAEF,QAAA,MAAM,YAAA,GACJ,QAAA,CAAS,YAAA,KAAiB,YAAA,GAAe,YAAA,GAAe,MAAA;AAE1D,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,UAC7B,SAAA,EAAW,SAAS,gBAAA,IAAoB,IAAA;AAAA,UACxC,kBAAkB,QAAA,CAAS,gBAAA;AAAA,UAC3B,SAAA;AAAA,UACA,eAAe,QAAA,CAAS,aAAA;AAAA,UACxB,YAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,YAAA;AAAA,YACA,gBAAA;AAAA,YACA,aAAa,YAAA,GAAe,gBAAA;AAAA,YAC5B,iBAAiB,eAAA,IAAmB;AAAA;AACtC,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAO,OAAA,EAAuE;AAClF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAC5C,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAmB;AACvD,QAAA,MAAM,IAAA,GAAO,IAAA;AAEb,QAAA,OAAO;AAAA,UACL,QAAQ,MAAA,CAAO,aAAa,CAAA,GAAI;AAE9B,YAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC3B,cAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,iBAAA,EAAmB,MAAM,SAAA,EAAU;AACjE,cAAA;AAAA,YACF;AAGA,YAAA,IAAI,SAAS,OAAA,EAAS;AACpB,cAAA,IAAI,eAAA,EAAiB;AAEnB,gBAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,MAAA,EAAQ,CAAA,IAAK,gBAAgB,SAAA,EAAW;AAC3E,kBAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA,EAAG,CAAA,GAAI,gBAAgB,SAAS,CAAA;AACzE,kBAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,KAAA,EAAM;AAE5C,kBAAA,IAAI,eAAA,CAAgB,eAAe,CAAA,EAAG;AACpC,oBAAA,MAAM,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,YAAY,CAAA;AAAA,kBAC/C;AAAA,gBACF;AAAA,cACF,CAAA,MAAO;AAEL,gBAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,SAAS,OAAA,EAAQ;AAAA,cACzD;AACA,cAAA,MAAM,EAAE,MAAM,cAAA,EAAe;AAAA,YAC/B;AAGA,YAAA,IAAI,SAAS,SAAA,EAAW;AACtB,cAAA,MAAM,EAAE,IAAA,EAAM,iBAAA,EAAmB,KAAA,EAAO,SAAS,SAAA,EAAU;AAC3D,cAAA,MAAM,EAAE,MAAM,gBAAA,EAAiB;AAAA,YACjC;AAGA,YAAA,IAAI,SAAS,SAAA,EAAW;AACtB,cAAA,KAAA,MAAW,EAAA,IAAM,SAAS,SAAA,EAAW;AACnC,gBAAA,MAAM,EAAE,MAAM,iBAAA,EAAmB,EAAA,EAAI,GAAG,EAAA,EAAI,IAAA,EAAM,GAAG,IAAA,EAAK;AAC1D,gBAAA,MAAM,EAAE,MAAM,gBAAA,EAAkB,EAAA,EAAI,GAAG,EAAA,EAAI,SAAA,EAAW,GAAG,SAAA,EAAU;AAAA,cACrE;AAAA,YACF;AAEA,YAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,cAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,aAAA,EAAe;AACzC,gBAAA,MAAM,EAAE,IAAA,EAAM,oBAAA,EAAsB,IAAA,EAAK;AAAA,cAC3C;AAAA,YACF;AAGA,YAAA,MAAM;AAAA,cACJ,IAAA,EAAM,QAAA;AAAA,cACN,cAAc,QAAA,CAAS,YAAA;AAAA,cACvB,OAAO,QAAA,CAAS;AAAA,aAClB;AAAA,UACF;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAA,CAAc,SAA0B,YAAA,EAAsC;AACpF,QAAA,IAAI,YAAA,CAAa,iBAAiB,MAAA,EAAW;AAC3C,UAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAA,KAAW,YAAA,CAAa,YAAA,EAAc;AACzD,YAAA,MAAM,IAAIA,aAAAA;AAAA,cACR,0BAA0B,YAAA,CAAa,YAAY,CAAA,eAAA,EAAkB,OAAA,CAAQ,SAAS,MAAM,CAAA,CAAA;AAAA,cAC5F;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,UAAA,MAAM,UAAU,YAAA,CAAa,eAAA;AAC7B,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AACzC,YAAA,MAAM,OAAA,GACJ,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAA,GAAI,CAAA,CAAE,IAAA,KAAS,WAAA,GAAc,CAAA,CAAE,OAAA,GAAU,EAAA;AACxF,YAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,YAAA,OAAO,OAAO,YAAY,QAAA,GAAW,OAAA,CAAQ,SAAS,OAAO,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,UACvF,CAAC,CAAA;AAED,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,MAAM,IAAIA,aAAAA;AAAA,cACR,8CAA8C,OAAO,CAAA,WAAA,CAAA;AAAA,cACrD;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,aAAa,kBAAA,EAAoB;AACnC,UAAA,MAAM,EAAE,QAAA,EAAU,cAAA,EAAe,GAAI,YAAA,CAAa,kBAAA;AAClD,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AACzC,YAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA;AAC9B,YAAA,MAAM,UAAU,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,EAAA;AAC5D,YAAA,OAAO,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA;AAAA,UAC3D,CAAC,CAAA;AAED,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,MAAM,IAAIA,aAAAA;AAAA,cACR,2CAA2C,QAAQ,CAAA,WAAA,CAAA;AAAA,cACnD;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,aAAa,oBAAA,EAAsB;AACrC,UAAA,MAAM,UAAU,YAAA,CAAa,oBAAA;AAC7B,UAAA,MAAM,aAAA,GAAgB,QAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACtE,UAAA,MAAM,aAAA,GAAgB,aAAA,EAAe,IAAA,KAAS,QAAA,GAAW,cAAc,OAAA,GAAU,EAAA;AACjF,UAAA,IAAI,CAAC,aAAA,EAAe;AAClB,YAAA,MAAM,IAAIA,aAAAA,CAAc,CAAA,qCAAA,CAAA,EAAyC,iBAAiB,CAAA;AAAA,UACpF;AACA,UAAA,MAAM,OAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GAAW,aAAA,CAAc,SAAS,OAAO,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAC5F,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,MAAM,IAAIA,aAAAA;AAAA,cACR,iDAAiD,OAAO,CAAA,CAAA,CAAA;AAAA,cACxD;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,OAAA,EAAkC;AACvD,QAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM;AACzC,UAAA,IAAI,OAAA,GAAU,EAAA;AACd,UAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,YAAA,OAAA,GAAU,CAAA,CAAE,OAAA;AAAA,UACd,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AAC5B,YAAA,OAAA,GAAU,eAAA,CAAgB,EAAE,OAAO,CAAA;AAAA,UACrC,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa;AACjC,YAAA,OAAA,GAAU,EAAE,OAAA,IAAW,EAAA;AAAA,UACzB,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AAC5B,YAAA,OAAA,GAAU,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,EAAA;AAAA,UACxD;AAEA,UAAA,OAAO,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,QAC3C,GAAG,CAAC,CAAA;AAAA,MACN;AAAA,MAEQ,MAAM,EAAA,EAA2B;AACvC,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAA,GAAmC;AACjC,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,GAA8C;AAC5C,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,GAAc;AACZ,QAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,QAAA,IAAA,CAAK,aAAa,EAAC;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,MAAA,EAA0B;AAClC,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAA,GAA4B;AAC1B,QAAA,OAAO,IAAA,CAAK,aAAA,KAAkB,IAAA,CAAK,MAAA,CAAO,MAAA;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAA,GAA6B;AAC3B,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,aAAA;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,eAAA,GAA0B;AACxB,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACd;AAAA,KACF;AAeO,IAAM,IAAA,GAAO,CAAC,MAAA,KAAwD;AAC3E,MAAA,OAAO,IAAI,YAAA,CAAa;AAAA,QACtB,GAAG,MAAA;AAAA,QACH,QAAS,MAAA,CAA8B,MAAA;AAAA,QACvC,gBAAiB,MAAA,CAA8B,cAAA;AAAA,QAC/C,UAAW,MAAA,CAA8B;AAAA,OAC1C,CAAA;AAAA,IACH,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChZA,SAAS,UAAU,KAAA,EAAoC;AACrD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,GAAI,KAAA,CAAM,MAAK,GAAI,MAAA;AACpE;AAsBO,SAAS,sBAAA,CACd,cACA,GAAA,EACwB;AACxB,EAAA,MAAM,SAAS,SAAA,CAAU,GAAA,CAAI,uBAAuB,CAAA,IAAK,SAAA,CAAU,IAAI,gBAAgB,CAAA;AACvF,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,UACJ,SAAA,CAAU,GAAA,CAAI,yBAAyB,CAAA,IACvC,UAAU,GAAA,CAAI,iBAAiB,CAAA,IAC/B,SAAA,CAAU,IAAI,uBAAuB,CAAA,IACrC,6BAAA,EACA,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAEpB,EAAA,MAAM,QAAA,GAAW,aAAa,WAAA,EAAY;AAC1C,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,QAAQ,CAAA,IAAK,EAAA;AAElD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,GAAG,MAAM,CAAA,UAAA,EAAa,mBAAmB,QAAQ,CAAC,GAAG,QAAQ,CAAA;AAAA,GACxE;AACF;AAtEA,IAsBM,6BAAA,EAsBA,mBAAA;AA5CN,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAsBA,IAAM,6BAAA,GAAgC,iCAAA;AAsBtC,IAAM,mBAAA,GAA8C;AAAA,MAClD,UAAA,EAAY;AAAA,KACd;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9CA,IA4BM,oBAAA,CAAA,CAqLO;AAjNb,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAMA,IAAA,iBAAA,EAAA;AACA,IAAA,qBAAA,EAAA;AAqBA,IAAM,uBAAN,MAA2B;AAAA,MACjB,aAAA,uBAAoB,GAAA,EAAqE;AAAA,MACzF,kBAAA,GAAgD,IAAA;AAAA,MAChD,wBAAA,GAA2B,CAAA;AAAA,MAEnC,oBAAoB,EAAA,EAAqC;AACvD,QAAA,IAAA,CAAK,kBAAA,GAAqB,EAAA;AAC1B,QAAA,IAAA,CAAK,wBAAA,IAA4B,CAAA;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,MAAM,WAAA,CACJ,SAAA,EACA,GAAA,EACA,MAAA,EACmG;AACnG,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,QAC7D;AAKA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA;AACjD,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAE,CAAA;AAAA,QACjD;AAEA,QAAA,IAAI,OAAO,QAAA,CAAS,QAAA,KAAa,UAAA,EAAY;AAC3C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,UAAU,SAAS,CAAA,oIAAA;AAAA,WACrB;AAAA,QACF;AAEA,QAAA,MAAM,kBAAkB,QAAA,CAAS,QAAA;AACjC,QAAA,MAAM,eAAe,eAAA,CAAgB,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,IAAA;AAErD,QAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,YAAA,EAAc,QAAQ,CAAA;AACtE,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AAC/C,UAAA,IAAI,MAAA,EAAQ,gBAAgB,WAAA,EAAa;AACvC,YAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA;AAAA,UACnD;AAEA,UAAA,OAAO,KAAK,cAAA,CAAe,SAAA,EAAW,kBAAA,EAAmB,EAAG,UAAU,WAAW,CAAA;AAAA,QACnF;AAEA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,YAAA,EAAc,GAAG,CAAA;AAC1D,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,MAAA,GAAgC,EAAE,MAAA,EAAO;AAC/C,UAAA,IAAI,QAAA,CAAS,iBAAiB,OAAA,EAAS;AACrC,YAAA,MAAA,CAAO,OAAA,GAAU,SAAS,eAAA,CAAgB,OAAA;AAAA,UAC5C;AACA,UAAA,IAAI,iBAAiB,YAAA,IAAgB,CAAC,MAAA,CAAO,OAAA,IAAW,IAAI,qBAAA,EAAuB;AACjF,YAAA,MAAA,CAAO,OAAA,GAAU,CAAA,8CAAA,EAAiD,GAAA,CAAI,qBAA+B,CAAA,MAAA,CAAA;AAAA,UACvG;AACA,UAAA,IAAI,YAAA,KAAiB,YAAA,IAAgB,GAAA,CAAI,qBAAA,EAAuB;AAC9D,YAAC,MAAA,CAA0D,YAAY,GAAA,CAAI,qBAAA;AAAA,UAC7E;AAEA,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,YAAA,EAAc,UAAU,MAAM,CAAA;AAC9E,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AAC/C,UAAA,IAAI,MAAA,EAAQ,gBAAgB,WAAA,EAAa;AACvC,YAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA;AAAA,UACnD;AAEA,UAAA,OAAO,KAAK,cAAA,CAAe,SAAA,EAAW,gBAAgB,MAAM,CAAA,EAAG,UAAU,WAAW,CAAA;AAAA,QACtF;AAIA,QAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,UAAA,MAAM,sBAAsB,IAAA,CAAK,sBAAA,CAAuB,YAAY,IAAA,CAAK,wBAAwB,IAAI,QAAQ,CAAA;AAC7G,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AACvD,UAAA,IAAI,cAAA,EAAgB,gBAAgB,mBAAA,EAAqB;AACvD,YAAA,OAAO,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,QAAA,EAAU,QAAQ,CAAA;AAAA,UAC3D;AAEA,UAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,UAAU,GAAG,CAAA;AACzE,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,OAAO,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,gBAAA,EAAkB,UAAU,mBAAmB,CAAA;AAAA,UACvF;AAAA,QACF;AAMA,QAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,YAAA,EAAc,GAA8B,CAAA;AACnF,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,MAAA,GAAgC;AAAA,YACpC,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,SAAS,OAAA,CAAQ;AAAA,WACnB;AAEA,UAAA,MAAM,cAAc,IAAA,CAAK,sBAAA,CAAuB,YAAY,YAAY,CAAA,CAAA,EAAI,UAAU,MAAM,CAAA;AAC5F,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA;AAC/C,UAAA,IAAI,MAAA,EAAQ,gBAAgB,WAAA,EAAa;AACvC,YAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA;AAAA,UACnD;AAEA,UAAA,OAAO,KAAK,cAAA,CAAe,SAAA,EAAW,gBAAgB,MAAM,CAAA,EAAG,UAAU,WAAW,CAAA;AAAA,QACtF;AAEA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,YAAY,CAAA,kDAAA,CAAoD,CAAA;AAAA,MACpH;AAAA,MAEQ,WAAA,CACN,UACA,QAAA,EAC0F;AAC1F,QAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,QAAA,CAAS,OAAO,QAAA,EAAS;AAAA,MACzD;AAAA,MAEQ,cAAA,CACN,SAAA,EACA,QAAA,EACA,QAAA,EACA,WAAA,EAC0F;AAC1F,QAAA,IAAA,CAAK,cAAc,GAAA,CAAI,SAAA,EAAW,EAAE,QAAA,EAAU,aAAa,CAAA;AAC3D,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC5C;AAAA,MAEQ,sBAAA,CACN,YAAA,EACA,QAAA,EACA,MAAA,EACQ;AACR,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,YAAA;AAAA,UACA,OAAA,EAAS,MAAA,EAAQ,OAAA,IAAW,QAAA,CAAS,iBAAiB,OAAA,IAAW,IAAA;AAAA,UACjE,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA;AAAA,UAC1B,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,SACjC,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAA,CAAqB,cAAsB,GAAA,EAAyB;AAC1E,QAAA,MAAM,eAAA,GAA0C;AAAA,UAC9C,UAAA,EAAY,sBAAA;AAAA,UACZ,QAAA,EAAU,kBAAA;AAAA,UACV,MAAA,EAAQ,gBAAA;AAAA,UACR,IAAA,EAAM,cAAA;AAAA,UACN,MAAA,EAAQ,gBAAA;AAAA,UACR,UAAA,EAAY,oBAAA;AAAA,UACZ,SAAA,EAAW,mBAAA;AAAA,UACX,GAAA,EAAK;AAAA,SACP;AAEA,QAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,CAAa,WAAA,EAAa,CAAA;AACzD,QAAA,IAAI,MAAA,IAAW,GAAA,CAAgC,MAAM,CAAA,EAAG;AACtD,UAAA,OAAQ,IAAgC,MAAM,CAAA;AAAA,QAChD;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,UAAA,GAAmB;AACjB,QAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,MAC3B;AAAA,KACF;AAKO,IAAM,gBAAA,GAAmB,IAAI,oBAAA,EAAqB;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjNzD,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,IAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAsCA,IAAAD,WAAAA,EAAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,qBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACKO,SAAS,wBAAwB,QAAA,EAA4C;AAClF,EAAA,MAAM,cAAA,GAAiB,SAAS,YAAA,EAAc,cAAA;AAC9C,EAAA,IAAI,OAAO,mBAAmB,SAAA,EAAW;AACvC,IAAA,OAAO,cAAA;AAAA,EACT;AACA,EAAA,MAAM,YAAA,GAAe,SAAS,YAAA,EAAc,MAAA;AAC5C,EAAA,IAAI,OAAO,iBAAiB,SAAA,EAAW;AACrC,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,uBAAuB,QAAA,EAA4C;AACjF,EAAA,MAAM,iBAAA,GAAoB,SAAS,YAAA,EAAc,iBAAA;AACjD,EAAA,IAAI,OAAO,sBAAsB,SAAA,EAAW;AAC1C,IAAA,OAAO,iBAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,iCAAiC,QAAA,EAI/C;AACA,EAAA,IAAI,qBAAA,GAAwB,CAAA;AAC5B,EAAA,IAAI,2BAAA,GAA8B,CAAA;AAElC,EAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAA6B;AAClE,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,IAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC7D,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,IAAA,KAAS;AACrD,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,SAAS,WAAA,EAAa;AACtD,UAAA,qBAAA,EAAA;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,IAAI,aAAA,CAAc,MAAA,KAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ;AACnD,QAAA,OAAO,OAAA;AAAA,MACT;AAEA,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,QAAA,OAAO;AAAA,UACL,GAAG,OAAA;AAAA,UACH,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,6BAA6B;AAAA,SAC/D;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,OAAA;AAAA,QACH,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,aAAa,MAAA,EAAQ;AAC1D,MAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,CAAC,UAAA,KAAe;AACrE,QAAA,MAAM,OAAA,GACJ,WAAW,IAAA,KAAS,OAAA,IACpB,WAAW,SAAA,CAAU,WAAA,EAAY,CAAE,UAAA,CAAW,QAAQ,CAAA;AAExD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,2BAAA,EAAA;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,IAAI,mBAAA,CAAoB,MAAA,KAAW,OAAA,CAAQ,WAAA,CAAY,MAAA,EAAQ;AAC7D,QAAA,OAAO,OAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,OAAA;AAAA,QACH,WAAA,EAAa,mBAAA,CAAoB,MAAA,GAAS,mBAAA,GAAsB;AAAA,OAClE;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,gBAAA;AAAA,IACV,qBAAA;AAAA,IACA;AAAA,GACF;AACF;AAMO,SAAS,qCAAqC,QAAA,EAAgD;AACnG,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,OAAA,KAAY;AAClC,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,WAAA,EAAa,OAAO,IAAA;AAEzC,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,UAAU,MAAA,GAAS,CAAA;AACpF,IAAA,MAAM,YAAA,GACJ,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,GACzB,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAClC,OAAA,CAAQ,QAAQ,gBAAgB,CAAA;AACtC,IAAA,MAAM,UAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GACvB,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAChC,OAAA,CAAQ,OAAA,KAAY,IAAA;AAE1B,IAAA,OAAO,gBAAgB,YAAA,IAAgB,UAAA;AAAA,EACzC,CAAC,CAAA;AACH;AAEA,SAAS,gCACP,QAAA,EACoC;AACpC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,cAAc,QAAA,CAAS,EAAA;AAAA,IACvB,IAAA,EAAM,SAAS,QAAA,CAAS,IAAA;AAAA,IACxB,QAAA,EAAU,SAAS,QAAA,CAAS,IAAA;AAAA,IAC5B,OAAA,EACE,CAAA,8DAAA,EAAiE,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,oCAAA;AAAA,GAE3F;AACF;AAMO,SAAS,iCACd,QAAA,EAC4B;AAC5B,EAAA,MAAM,aAAyC,EAAC;AAShD,EAAA,IAAI,OAAA,GAAmC,IAAA;AAEvC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK,QAAQ,gBAAgB,CAAA;AAExC,IAAA,KAAA,MAAW,QAAA,IAAY,QAAQ,iBAAA,EAAmB;AAChD,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,SAAS,EAAE,CAAA;AAC5D,MAAA,UAAA,CAAW,IAAA,CAAK,aAAA,IAAiB,+BAAA,CAAgC,QAAQ,CAAC,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAI,OAAA,CAAQ,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,gCAAA,CAAiC,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AAAA,IAC/E;AAEA,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ,CAAA;AAEA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,0BAAA,GACJ,OAAA,CAAQ,IAAA,KAAS,WAAA,IACjB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,IAChC,OAAA,CAAQ,UAAA,CAAW,MAAA,GAAS,CAAA;AAE9B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,CAAC,0BAAA,EAA4B;AAC/B,QAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,IAAc,EAAC;AACzC,MAAA,MAAM,oBAAoB,SAAA,CAAU,MAAA;AAAA,QAClC,CAAC,QAAA,KACC,OAAA,CAAQ,QAAA,IAAY,OAAO,SAAS,EAAA,KAAO,QAAA,IAAY,QAAA,CAAS,QAAA,EAAU,IAAI;AAAA,OAClF;AAEA,MAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,QAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,GAAU;AAAA,QACR,gBAAA,EAAkB,OAAA;AAAA,QAClB,iBAAA;AAAA,QACA,cAAA,sBAAoB,GAAA,EAAI;AAAA,QACxB,kBAAkB;AAAC,OACrB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,wBAAA,GACJ,QAAQ,IAAA,KAAS,MAAA,IACjB,OAAO,OAAA,CAAQ,YAAA,KAAiB,QAAA,IAChC,OAAA,CAAQ,iBAAA,CAAkB,IAAA,CAAK,CAAC,QAAA,KAAa,QAAA,CAAS,EAAA,KAAO,OAAA,CAAQ,YAAY,CAAA,IACjF,CAAC,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA;AAElD,IAAA,IAAI,wBAAA,EAA0B;AAC5B,MAAA,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,OAAA,CAAQ,YAAA,EAAe,OAAO,CAAA;AAEzD,MAAA,IAAI,OAAA,CAAQ,cAAA,CAAe,IAAA,KAAS,OAAA,CAAQ,kBAAkB,MAAA,EAAQ;AACpE,QAAA,YAAA,EAAa;AAAA,MACf;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,gBAAA,CAAiB,KAAK,OAAO,CAAA;AAAA,EACvC;AAEA,EAAA,YAAA,EAAa;AAEb,EAAA,OAAO,UAAA;AACT;AAMA,SAAS,uBAAA,CACP,UACA,YAAA,EACmB;AACnB,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAyB;AAE5C,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,IAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACrD,MAAA,OAAO;AAAA,QACL,GAAG,GAAA;AAAA,QACH,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AAEjC,UAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,MAAA,IAAU,IAAA,EAAM;AAC3C,YAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,YAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAE5B,cAAA,IAAI,KAAK,UAAA,CAAW,OAAO,CAAA,IAAK,IAAA,CAAK,SAAS,GAAA,EAAM;AAClD,gBAAA,MAAM,IAAA,GAAO,YAAA,EAAc,GAAA,CAAI,IAAI,CAAA;AACnC,gBAAA,OAAO;AAAA,kBACL,GAAG,IAAA;AAAA,kBACH,IAAA,EAAM,kBAAA;AAAA,kBACN,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS;AAAC,iBACzB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,UAAA,OAAO,IAAA;AAAA,QACT,CAAC;AAAA,OACH;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,WAAA,EAAa;AAC1C,MAAA,OAAO;AAAA,QACL,GAAG,GAAA;AAAA,QACH,WAAA,EAAa,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,UACzC,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,IAAA,EAAM,kBAAA;AAAA;AAAA,UACN,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,MAAM,GAAA,CAAI;AAAA;AAAA,SACZ,CAAE;AAAA,OACJ;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACH;AAKA,SAAS,uBAAuB,MAAA,EAAgD;AAC9E,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,KAAA;AACH,MAAA,OAAO,EAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,EAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,GAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAKA,SAAS,kBAAkB,QAAA,EAAyD;AAClF,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAyB;AAC5C,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,QAAA;AACH,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,SAAS,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU;AAAA,SAC3D;AAAA,MAEF,KAAK,MAAA;AACH,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,OAAO;AAAA,SACvC;AAAA,MAEF,KAAK,WAAA,EAAa;AAEhB,QAAA,MAAM,SAAA,GAAgD,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,UACjF,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,UAClB,SAAA,EACE,OAAO,EAAA,CAAG,QAAA,CAAS,SAAA,KAAc,QAAA,GAC7B,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA,CAAS,SAAS,CAAA,GAChC,GAAG,QAAA,CAAS,SAAA;AAAA,UAClB,YAAA,EACE,GAAG,aAAA,IAAiB,OAAO,GAAG,aAAA,KAAkB,QAAA,GAC5C,GAAG,aAAA,GACH;AAAA,SACR,CAAE,CAAA;AAEF,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,WAAA;AAAA,UACN,SAAS,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,IAAA;AAAA,UACzD,SAAA,EAAW,SAAA,EAAW,MAAA,GAAS,SAAA,GAAY,MAAA;AAAA;AAAA,UAE3C,SAAA,EAAY,IAAY,iBAAA,IAAqB,MAAA;AAAA,UAC7C,gBAAA,EAAmB,IAAY,iBAAA,IAAqB;AAAA,SACtD;AAAA,MACF;AAAA,MAEA,KAAK,MAAA;AACH,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,UAAA,EAAY,IAAI,YAAA,IAAgB,EAAA;AAAA,UAChC,QAAA,EAAU,IAAI,IAAA,IAAQ,EAAA;AAAA,UACtB,SAAS,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAAA,UACzD,aAAa,GAAA,CAAI;AAAA;AAAA,SACnB;AAAA;AACJ,EACF,CAAC,CAAA;AACH;AAKA,SAAS,iBAAiB,OAAA,EAA6D;AACrF,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AAGxC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAsB;AACxC,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,IACzC;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,SAAA,EAAW;AAE/C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,KAAK,SAAA,CAAU,GAAA;AAAA,QACrB,SAAA,EAAW,YAAA;AAAA;AAAA,QACX,MAAA,EAAQ,KAAK,SAAA,CAAU;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAG;AAAA,EAClC,CAAC,CAAA;AACH;AAKA,SAAS,eAAe,KAAA,EAA4D;AAClF,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,MAAA;AAEzC,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,WAAA,EAAa,KAAK,QAAA,CAAS,WAAA;AAAA,QAC3B,UAAA,EAAY,KAAK,QAAA,CAAS;AAAA;AAC5B,KACF;AAGA,IAAA,IAAK,KAAa,aAAA,EAAe;AAC/B,MAAA,YAAA,CAAa,gBAAiB,IAAA,CAAa,aAAA;AAAA,IAC7C;AACA,IAAA,IAAK,KAAa,iBAAA,EAAmB;AACnC,MAAA,YAAA,CAAa,oBAAqB,IAAA,CAAa,iBAAA;AAAA,IACjD;AAEA,IAAA,OAAO,YAAA;AAAA,EACT,CAAC,CAAA;AACH;AAKA,SAAS,oBACP,UAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAA,CAAW,IAAA,KAAS,UAAA,IAAc,UAAA,CAAW,UAAU,IAAA,EAAM;AAC/D,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,CAAW,QAAA,CAAS,IAAA,EAAK;AAAA,EAC1C;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,gBAAA,CACP,SACA,QAAA,EACwB;AACxB,EAAA,MAAM,kBAAA,GAAqB,gCAAA,CAAiC,OAAA,CAAQ,QAAQ,CAAA;AAC5E,EAAA,MAAM,mBAAA,GAAsB,kBAAkB,kBAAkB,CAAA;AAChE,EAAA,MAAM,kBAAA,GAAqB,wBAAwB,QAAQ,CAAA;AAC3D,EAAA,MAAM,iBAAA,GAAoB,uBAAuB,QAAQ,CAAA;AAEzD,EAAA,IAAI,eAAA,GAAkB,mBAAA;AACtB,EAAA,IAAI,eAAA;AAEJ,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,MAAM,QAAA,GAAW,iCAAiC,mBAAmB,CAAA;AACrE,IAAA,eAAA,GAAkB,QAAA,CAAS,QAAA;AAC3B,IAAA,IAAI,QAAA,CAAS,qBAAA,GAAwB,CAAA,IAAK,QAAA,CAAS,8BAA8B,CAAA,EAAG;AAClF,MAAA,eAAA,GAAkB;AAAA,QAChB,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,iBAAA;AAAA,QACR,uBAAuB,QAAA,CAAS,qBAAA;AAAA,QAChC,6BAA6B,QAAA,CAAS;AAAA,OACxC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAA,GAAkB,qCAAqC,eAAe,CAAA;AAEtE,EAAA,MAAM,KAAA,GAAQ,iBAAA,GAAoB,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA;AAClE,EAAA,MAAM,UAAA,GAAa,iBAAA,GAAoB,mBAAA,CAAoB,OAAA,CAAQ,WAAW,CAAA,GAAI,MAAA;AAElF,EAAA,OAAO;AAAA,IACL,WAAA,EAAa;AAAA,MACb,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,QAAA,EAAU,eAAA;AAAA,MACV,KAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA,EAAmB,iBAAA,GAAoB,OAAA,CAAQ,mBAAA,GAAsB,MAAA;AAAA,MACrE,SAAA,EAAW,QAAQ,SAAA,GACf;AAAA,QACE,KAAA,EAAO,sBAAA,CAAuB,OAAA,CAAQ,SAAA,CAAU,MAAM,CAAA;AAAA,QACtD,SAAA,EAAW,QAAQ,SAAA,CAAU,UAAA;AAAA,QAC7B,OAAA,EAAS,QAAQ,SAAA,CAAU;AAAA,OAC7B,GACA,MAAA;AAAA,MACJ,iBAAiB,QAAA,CAAS;AAAA,KAC1B;AAAA,IACA;AAAA,GACF;AACF;AAKA,SAAS,oBAAA,CACP,OAAA,EACA,QAAA,EACA,MAAA,EACiB;AACjB,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,gBAAA,CAAiB,SAAS,QAAQ,CAAA;AAC1D,EAAA,OAAO;AAAA,IACL,GAAG,WAAA;AAAA,IACH;AAAA,GACF;AACF;AAKA,SAAS,iBAAiB,SAAA,EAA+C;AACvE,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,IAC5B,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,SAAS;AAAA,KACxC;AAAA,IACA,eAAe,EAAA,CAAG;AAAA,GACpB,CAAE,CAAA;AACJ;AAEA,SAAS,4BACP,IAAA,EASyB;AACzB,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAC9B,IAAA,CAAK,IAAA,GACL,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GACnB,IAAA,CAAK,IAAA,GACL,IAAA;AACN,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,CAAK,EAAA,KAAO,UAAU,OAAO,IAAA;AAEjD,EAAA,MAAM,MAAA,GACJ,IAAA,CAAK,MAAA,KAAW,QAAA,GACZ,QAAA,GACA,IAAA,CAAK,MAAA,KAAW,aAAA,IAAiB,IAAA,CAAK,MAAA,KAAW,WAAA,GAC/C,aAAA,GACA,WAAA;AAER,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA,EAAM,IAAA;AAAA,IACN,GAAI,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS,GAAI,EAAC;AAAA,IACvE,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAA;AAAA,IACA,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW,EAAC;AAAA,IAC7C,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa;AAAC,GACrD;AACF;AAEA,SAAS,sBAAA,CACP,aAAA,EACA,iBAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,IAAA,IAAQ,KAAK,IAAI,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA;AAChD,EAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,EAAG;AAChC,EAAA,iBAAA,CAAkB,IAAI,GAAG,CAAA;AACzB,EAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AACzB;AAKA,SAAS,aAAa,KAAA,EAA4C;AAChE,EAAA,OAAO;AAAA,IACL,eAAe,KAAA,CAAM,YAAA;AAAA,IACrB,mBAAmB,KAAA,CAAM,gBAAA;AAAA,IACzB,cAAc,KAAA,CAAM,WAAA;AAAA,IACpB,uBAAuB,KAAA,CAAM,YAAA,GACzB,EAAE,aAAA,EAAe,KAAA,CAAM,cAAa,GACpC,MAAA;AAAA,IACJ,2BAA2B,KAAA,CAAM,eAAA,GAC7B,EAAE,gBAAA,EAAkB,KAAA,CAAM,iBAAgB,GAC1C,MAAA;AAAA,IACJ,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,UAAU,KAAA,CAAM;AAAA,GAClB;AACF;AAnmBA,IAwCM,2BAAA,EAgkBO,UAAA;AAxmBb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0BAAA,GAAA;AAyBA,IAAA,YAAA,EAAA;AACA,IAAA,UAAA,EAAA;AAcA,IAAM,2BAAA,GAA8B,gDAAA;AAgkB7B,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBtB,aAAa,OAAA,CACX,OAAA,EACA,KAAA,EAC6B;AAC7B,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,QAAA,IAAI,eAAA;AAGJ,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,KAAK,QAAA,CAAS,OAAA,EAAS,OAAO,OAAA,CAAQ,KAAA,EAAO,WAAW,KAAA,CAAS,CAAA;AAAA,QAChF,SAAS,YAAA,EAAc;AACrB,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,KAAK,YAAY,YAAY,CAAA;AAGpE,UAAA,eAAA,GAAmB,YAAA,EAA0C,UAAA;AAG7D,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,oBAAA;AAAA,YACN,MAAM,OAAA,CAAQ,KAAA;AAAA,YACd,EAAA,EAAI,oBAAA;AAAA,YACJ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,YAAY,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAO,KAAK,CAAA;AAE9D,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,oBAAA;AAAA,cACN,MAAM,OAAA,CAAQ,KAAA;AAAA,cACd,IAAI,QAAA,CAAS,iBAAA;AAAA,cACb,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,OAAO,MAAM,IAAA,CAAK,QAAA;AAAA,cAChB,OAAA;AAAA,cACA,KAAA;AAAA,cACA,QAAA,CAAS,iBAAA;AAAA,cACT,SAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF,SAAS,aAAA,EAAe;AACtB,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,eAAA,EAAkB,SAAS,iBAAiB,CAAA,QAAA,CAAA;AAAA,cAC5C;AAAA,aACF;AAGA,YAAA,eAAA,GAAmB,aAAA,EAA2C,UAAA;AAI9D,YAAA;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,kBAAkB,IAAI,KAAA;AAAA,UAC1B,CAAA,uCAAA,EAA0C,OAAA,CAAQ,KAAK,CAAA,KAAA,EAAQ,UAAU,MAAM,CAAA,UAAA;AAAA,SACjF;AAEA,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAA,CAAO,OAAO,eAAA,EAAiB;AAAA,YAC7B,UAAA,EAAY,eAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,QACH,CAAA,MAAO;AAEL,UAAA,MAAM,IAAA,CAAK,QAAA;AAAA,YACT,KAAA;AAAA,YACA,eAAA;AAAA,YACA,uBAAA;AAAA,YACA,OAAA,CAAQ,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AAEA,QAAA,MAAM,eAAA;AAAA,MACR;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,QAAA,CACnB,OAAA,EACA,KAAA,EACA,OAAA,EACA,WACA,kBAAA,EAC6B;AAG7B,QAAA,IAAI,aAAA,GAAgB,OAAA;AACpB,QAAA,IAAI,QAAA;AAEJ,QAAA,MAAM,YAAY,KAAA,CAAM,gBAAA,CAAiB,SAAS,QAAA,GAC9C,KAAA,CAAM,iBAAiB,SAAA,GACvB,MAAA;AAEJ,QAAA,IAAI,SAAA,IAAa,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAEvC,UAAA,MAAM,gBAAA,GAAmB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAChD,UAAA,IAAI;AACF,YAAA,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,gBAAgB,CAAA;AACjE,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,aAAA,GAAgB,gBAAA;AAChB,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,gBAAgB,CAAA,CAAE,CAAA;AAAA,YACrE;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,OAAO,CAAA;AAAA,QAC1D;AAEA,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAO,CAAA,CAAE,CAAA;AAAA,QAC1D;AAEA,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAA,GAAoC,kBAAA;AAExC,QAAA,OAAO,WAAW,qBAAA,EAAuB;AACvC,UAAA,QAAA,EAAA;AAEA,UAAA,IAAI;AAGF,YAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,aAAA,EAAe,OAAA,EAAS,UAAU,aAAa,CAAA;AAGpF,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAO,aAAA;AAAA,cACP,OAAA,EAAS,QAAA;AAAA,cACT,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAU,aAAA,EAAe,OAAA,EAAS,OAAO,KAAK,CAAA;AAG1E,YAAA,MAAM,IAAA,CAAK,WAAW,QAAA,EAAU,KAAA,EAAO,eAAe,SAAA,EAAW,OAAA,EAAS,OAAO,QAAQ,CAAA;AAEzF,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,cAAA;AAAA,cACN,MAAA,EAAQ,SAAS,KAAA,CAAM,YAAA;AAAA,cACvB,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,cACtB,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,IAAA,CAAK,sBAAA,CAAuB,QAAA,EAAU,KAAA,EAAO,KAAK,CAAA;AAElD,YAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,UAC3B,SAASE,MAAAA,EAAO;AACd,YAAA,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,aAAa,CAAA,UAAA,EAAa,QAAQ,MAAMA,MAAK,CAAA;AAG5E,YAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAOA,QAAO,WAAA,EAAa,aAAA,EAAe,WAAW,KAAK,CAAA;AAG9E,YAAA,IAAI,WAAW,qBAAA,EAAuB;AACpC,cAAA,MAAM,YAAY,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,CAAC,CAAA;AACzD,cAAA,MAAM,IAAA,CAAK,MAAM,SAAS,CAAA;AAE1B,cAAA,aAAA,GAAgB,KAAA;AAChB,cAAA,KAAA,GAAQ,MAAA;AAAA,YACV,CAAA,MAAO;AAEL,cAAA,IAAIA,MAAAA,IAAS,OAAOA,MAAAA,KAAU,QAAA,EAAU;AACtC,gBAACA,OAAkC,UAAA,GAAa,KAAA;AAAA,cAClD;AACA,cAAA,MAAMA,MAAAA;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UAChB,CAAA,MAAA,EAAS,aAAa,CAAA,yBAAA,EAA4B,qBAAqB,CAAA,SAAA;AAAA,SACzE;AACA,QAAA,KAAA,CAAM,UAAA,GAAa,KAAA;AACnB,QAAA,MAAM,KAAA;AAAA,MACR;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,UAAA,CACnB,KAAA,EACA,OAAA,EACA,OAAA,EACA,UACA,YAAA,EACiB;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAG7B,UAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,UAAA,IAAI;AACF,YAAA,IAAI,OAAO,QAAA,CAAS,QAAA,KAAa,UAAA,EAAY;AAC3C,cAAA,MAAM,eAAe,QAAA,CAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,IAAI,CAAA;AACrD,cAAA,YAAA,GAAe,YAAA,CAAa,IAAA;AAAA,YAC9B;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,GAAG,CAAA;AAAA,UACnD;AAGA,UAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAgB,GAAI,gBAAA,CAAiB,SAAS,QAAQ,CAAA;AAG3E,UAAA,MAAM,iBAAA,GAA6C;AAAA,YACjD,GAAG,WAAA;AAAA,YACH,QAAA,EAAU,uBAAA;AAAA,cACR,WAAA,CAAY,QAAA;AAAA,cACZ,OAAA,CAAQ;AAAA,aACV;AAAA;AAAA,YAEA,SAAA,EAAW;AAAA,cACT,YAAY,OAAA,CAAQ,UAAA;AAAA,cACpB,cAAc,OAAA,CAAQ,YAAA;AAAA,cACtB,GAAI,eAAA,GAAkB,EAAE,eAAA,KAAoB;AAAC;AAC/C,WACF;AAEA,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,iBAAiB,CAAA;AAEvD,UAAA,MAAM,OAAA,GAA6C;AAAA,YACjD,EAAA;AAAA,YACA,UAAA,EAAY,KAAA,CAAM,aAAA,IAAiB,MAAA,CAAO,UAAA,EAAW;AAAA,YACrD,QAAA,EAAU,YAAA,IAAgB,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAAA,YAC3D,KAAA,EAAO,OAAA;AAAA,YACP,YAAY,QAAA,CAAS,KAAA;AAAA,YACrB,QAAA,EAAU,kBAAA;AAAA,YACV,YAAA,EAAc,cAAA;AAAA,YACd,eAAA,EAAiB,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,MAAM,MAAA,GAAS,CAAA;AAAA,YACxD,sBAAA,EAAwB,QAAQ,QAAA,CAAS,MAAA;AAAA,YACzC,WAAA,EAAa,QAAQ,UAAA,IAAc,KAAA,CAAA;AAAA,YACnC,aAAA,EAAe,QAAQ,WAAA,IAAe,KAAA,CAAA;AAAA,YACtC,iBAAiB,YAAA,IAAgB,KAAA,CAAA;AAAA,YACjC,cAAc,OAAA,CAAQ,KAAA,GAAQ,KAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAA;AAAA,YAC9D,aAAA,EAAe,QAAQ,YAAA,IAAgB,KAAA,CAAA;AAAA,YACvC,WAAA,EAAa,KAAA;AAAA;AAAA,YACb,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,WAC3B;AAEA,UAAA,MAAO,MAAM,MAAA,CAAmE,OAAA;AAAA,YAC9E,YAAY;AACV,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,gBAOA,OAAA,CAAQ,EAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,QAAA;AAAA,gBACR,OAAA,CAAQ,KAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,QAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,eAAA;AAAA,gBACR,OAAA,CAAQ,sBAAA;AAAA,gBACR,OAAA,CAAQ,WAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,eAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,cAAc,CAAA,GAAI,CAAA;AAAA,gBAC1B,OAAA,CAAQ;AAAA,eACV;AAAA,YACF;AAAA,WACF;AAGA,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,QAAQ,OAAA,CAAQ,EAAA;AAAA,cAChB,IAAA,EAAM;AAAA,aACP,CAAA;AAAA,UACH;AAEA,UAAA,OAAO,EAAA;AAAA,QACT,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,GAAG,CAAA;AACvD,UAAA,OAAO,OAAO,UAAA,EAAW;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,SAAA,CACnB,OAAA,EACA,OAAA,EACA,OACA,KAAA,EACsB;AAEtB,QAAA,MAAM,EAAE,gBAAA,EAAAC,iBAAAA,EAAiB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AAGnC,QAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,QAAA,EAAS,GAAI,MAAMA,iBAAAA,CAAiB,WAAA;AAAA,UAC/D,OAAA;AAAA,UACA,KAAA,CAAM,GAAA;AAAA,UACN,MAAM,MAAA,CAAO;AAAA,SACf;AAGA,QAAA,MAAM,OAAA,GAAU,oBAAA;AAAA,UACd,OAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAM,eAAA,EAAiB;AAAA,SACzB;AAGA,QAAA,IAAI,QAAA;AACJ,QAAA,MAAO,MAAM,MAAA,CAAmE,OAAA;AAAA,UAC9E,YAAY;AACV,YAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAE5C,YAAA,IAAI,OAAA,GAAU,EAAA;AACd,YAAA,IAAI,SAAA,GAAY,EAAA;AAChB,YAAA,MAAM,YAAA,uBAAmB,GAAA,EAQvB;AACF,YAAA,MAAM,SAA6G,EAAC;AACpH,YAAA,MAAM,cAAsE,EAAC;AAC7E,YAAA,MAAM,oBAAkD,EAAC;AACzD,YAAA,IAAI,YAAA,GAAqC,MAAA;AACzC,YAAA,IAAI,KAAA;AACJ,YAAA,IAAI,gBAAA;AAEJ,YAAA,IAAI,kBAAA;AAEJ,YAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAEhC,cAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,MAAA,EAAQ,OAAA,EAAS;AAC5C,cAAA,IAAI,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,YAAW,EAAG;AAE9C,cAAA,QAAQ,MAAM,IAAA;AAAM,gBAClB,KAAK,eAAA;AACH,kBAAA,OAAA,IAAW,KAAA,CAAM,KAAA;AAEjB,kBAAA,KAAA,CAAM,MAAA,CAAO,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA;AAEpC,kBAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AACxC,kBAAA;AAAA,gBAEF,KAAK,iBAAA;AACH,kBAAA,SAAA,IAAa,KAAA,CAAM,KAAA;AACnB,kBAAA;AAAA,gBAEF,KAAK,iBAAA;AACH,kBAAA,YAAA,CAAa,GAAA,CAAI,MAAM,EAAA,EAAI;AAAA,oBACzB,IAAI,KAAA,CAAM,EAAA;AAAA,oBACV,MAAM,KAAA,CAAM,IAAA;AAAA,oBACZ,cAAA,EAAgB,EAAA;AAAA,oBAChB,cAAc,KAAA,CAAM;AAAA,mBACrB,CAAA;AACD,kBAAA;AAAA,gBAEF,KAAK,iBAAA;AACH,kBAAA;AACE,oBAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACpC,oBAAA,IAAI,EAAA,EAAI;AACN,sBAAA,EAAA,CAAG,kBAAkB,KAAA,CAAM,cAAA;AAAA,oBAC7B;AAAA,kBACF;AACA,kBAAA;AAAA,gBAEF,KAAK,gBAAA;AACH,kBAAA;AAEE,oBAAA,YAAA,CAAa,GAAA,CAAI,MAAM,EAAA,EAAI;AAAA,sBACzB,IAAI,KAAA,CAAM,EAAA;AAAA,sBACV,MAAM,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,EAAE,GAAG,IAAA,IAAQ,EAAA;AAAA,sBAC1C,cAAA,EAAgB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AAAA,sBAC9C,cACE,KAAA,CAAM,YAAA,IAAgB,aAAa,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AAAA,qBACrD,CAAA;AAAA,kBACH;AACA,kBAAA;AAAA,gBAEF,KAAK,QAAA;AACH,kBAAA,YAAA,GAAe,KAAA,CAAM,YAAA;AACrB,kBAAA,KAAA,GAAQ,KAAA,CAAM,KAAA;AACd,kBAAA,gBAAA,GAAmB,KAAA,CAAM,gBAAA;AACzB,kBAAA,kBAAA,GAAsB,KAAA,CAAc,UAAA;AACpC,kBAAA;AAAA,gBAEF,KAAK,YAAA;AACH,kBAAA,MAAA,CAAO,IAAA,CAAK;AAAA,oBACV,EAAA,EAAI,MAAM,KAAA,CAAM,EAAA;AAAA,oBAChB,QAAA,EAAU,MAAM,KAAA,CAAM,QAAA;AAAA,oBACtB,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,oBAClB,SAAA,EAAW,MAAM,KAAA,CAAM,SAAA;AAAA,oBACvB,aAAA,EAAe,MAAM,KAAA,CAAM;AAAA,mBAC5B,CAAA;AACD,kBAAA;AAAA,gBAEF,KAAK,iBAAA;AACH,kBAAA,WAAA,CAAY,IAAA,CAAK,MAAM,MAAM,CAAA;AAC7B,kBAAA;AAAA,gBAEF,KAAK,oBAAA;AACH,kBAAA,iBAAA,CAAkB,IAAA,CAAK,MAAM,IAAI,CAAA;AACjC,kBAAA;AAAA,gBAEF,KAAK,OAAA;AACH,kBAAA,MAAM,IAAIF,aAAAA;AAAA,oBACR,KAAA,CAAM,KAAA;AAAA,oBACL,MAAM,IAAA,IAAkC;AAAA,mBAC3C;AAAA;AACJ,YACF;AAGA,YAAA,MAAM,YAAoC,EAAC;AAC3C,YAAA,KAAA,MAAW,EAAA,IAAM,YAAA,CAAa,MAAA,EAAO,EAAG;AACtC,cAAA,IAAI;AACF,gBAAA,SAAA,CAAU,IAAA,CAAK;AAAA,kBACb,IAAI,EAAA,CAAG,EAAA;AAAA,kBACP,MAAM,EAAA,CAAG,IAAA;AAAA,kBACT,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,kBAAkB,IAAI,CAAA;AAAA,kBAC/C,cAAc,EAAA,CAAG;AAAA,iBAClB,CAAA;AAAA,cACH,CAAA,CAAA,MAAQ;AAEN,gBAAA,SAAA,CAAU,IAAA,CAAK;AAAA,kBACb,IAAI,EAAA,CAAG,EAAA;AAAA,kBACP,MAAM,EAAA,CAAG,IAAA;AAAA,kBACT,WAAW,EAAC;AAAA,kBACZ,cAAc,EAAA,CAAG;AAAA,iBAClB,CAAA;AAAA,cACH;AAAA,YACF;AAGA,YAAA,MAAM,UAAA,GAAa,OAAO,MAAA,CAAO,UAAA,GAAa,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAG9D,YAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,GAAS,IACnC,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,cACnB,IAAA,EAAM,WAAA;AAAA,cACN,IAAI,GAAA,CAAI,EAAA;AAAA,cACR,UAAU,GAAA,CAAI,QAAA;AAAA,cACd,SAAA,EAAW;AAAA,gBACT,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,GAC5B,GAAA,CAAI,IAAA,GACJ,CAAA,KAAA,EAAQ,GAAA,CAAI,SAAS,CAAA,QAAA,EAAW,IAAI,IAAI,CAAA;AAAA;AAC9C,cACA,CAAA,GACF,MAAA;AAEJ,YAAA,QAAA,GAAW;AAAA,cACT,EAAA,EAAI,UAAA;AAAA,cACJ,KAAA,EAAO,SAAA;AAAA,cACP,SAAS,OAAA,IAAW,IAAA;AAAA,cACpB,mBAAmB,SAAA,IAAa,IAAA;AAAA,cAChC,iBAAA,EAAmB,gBAAA;AAAA;AAAA,cACnB,YAAY,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,gBAAA,CAAiB,SAAS,CAAA,GAAI,MAAA;AAAA,cACjE,MAAA,EAAQ,cAAA;AAAA,cACR,aAAA,EAAe,YAAA;AAAA,cACf,KAAA,EAAO,KAAA,GACH,YAAA,CAAa,KAAK,CAAA,GAClB;AAAA,gBACE,aAAA,EAAe,CAAA;AAAA,gBACf,iBAAA,EAAmB,CAAA;AAAA,gBACnB,YAAA,EAAc;AAAA;AAChB,aACN;AAGA,YAAA,QAAA,CAAS,SAAA,GAAY,QAAA;AACrB,YAAA,QAAA,CAAS,mBAAA,GAAsB,kBAAA;AAG/B,YAAA,QAAA,CAAS,mBAAA,GAAsB;AAAA,cAC7B,EAAA,EAAI,UAAA;AAAA,cACJ,KAAA,EAAO,SAAA;AAAA,cACP,OAAA,EAAS;AAAA,gBACP;AAAA,kBACE,KAAA,EAAO,CAAA;AAAA,kBACP,OAAA,EAAS;AAAA,oBACP,IAAA,EAAM,WAAA;AAAA,oBACN,SAAS,OAAA,IAAW,IAAA;AAAA,oBACpB,mBAAmB,SAAA,IAAa,IAAA;AAAA,oBAChC,iBAAA,EAAmB,gBAAA;AAAA,oBACnB,YACE,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,gBAAA,CAAiB,SAAS,CAAA,GAAI,MAAA;AAAA;AAAA;AAAA,oBAGvD,QAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA,GAAA,MAAQ;AAAA,sBAC7C,IAAA,EAAM,WAAA;AAAA,sBACN,KAAK,GAAA,CAAI,EAAA;AAAA;AAAA,sBACT,SAAA,EAAW;AAAA,wBACT,GAAA,EAAK,CAAA,OAAA,EAAU,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA;AAAA;AACvB,sBACA,CAAA,GAAI;AAAA,mBACR;AAAA,kBACA,aAAA,EAAe;AAAA;AACjB,eACF;AAAA,cACA,OAAO,QAAA,CAAS,KAAA;AAAA;AAAA,cAEhB,aAAa,MAAA,CAAO,MAAA;AAAA;AAAA,cAEpB,YAAA,EAAc,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,MAAA;AAAA;AAAA,cAErD,cAAA,EAAgB,iBAAA,CAAkB,MAAA,GAAS,CAAA,GAAI,iBAAA,GAAoB;AAAA,aACrE;AAAA,UACF;AAAA,SACF;AAEA,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,QACxD;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,gBAAA,CAAiB,KAAA,EAAe,KAAA,EAAwB;AACrE,QAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAA,EAAkB;AACpD,UAAA,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,gBAAA,EAAkB,KAAK,CAAA;AAAA,QACtD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,YAAA,CACnB,SAAA,EACA,KAAA,EAC0B;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,SAAS,CAAA;AAChE,UAAA,IAAI,YAAY,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA,EAAG;AAEnE,YAAA,OAAO,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,cAAsB,GAAA,MAAiB;AAAA,cACpE,eAAA,EAAiB,SAAA;AAAA,cACjB,iBAAA,EAAmB,YAAA;AAAA,cACnB;AAAA,aACF,CAAE,CAAA;AAAA,UACJ;AACA,UAAA,OAAO,EAAC;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,WACnB,QAAA,EACA,KAAA,EACA,SACA,SAAA,EACA,OAAA,EACA,OACA,QAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,WAAA,GAAc,QAAA,CAAS,UAAA,GACzB,IAAA,CAAK,UAAU,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,QAAA,CAAS,IAAI,CAAC,CAAA,GAChE,IAAA;AAEJ,UAAA,MAAM,YAAA,GAAgB,SAAS,SAAA,EAAgD,IAAA;AAC/E,UAAA,MAAM,2BAA2B,YAAA,KAAiB,UAAA;AAClD,UAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAClE,UAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,QAAA,CAAS,KAAA,EAAO,eAAe,CAAA;AACzE,UAAA,MAAM,uBAAuB,OAAO,QAAA,CAAS,MAAM,IAAA,KAAS,QAAA,GACxD,SAAS,KAAA,CAAM,IAAA,GACd,OAAO,QAAA,CAAS,MAAM,IAAA,KAAS,QAAA,GAC9B,WAAW,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,GAC9B,IAAA;AAGN,UAAA,MAAM,UAAA,GAA4B,oBAAA,IAAwB,IAAA,IAAQ,CAAC,MAAA,CAAO,MAAM,oBAAoB,CAAA,GAChG,oBAAA,GACA,cAAA,EAAgB,SAAA,IAAa,IAAA;AAGjC,UAAA,MAAM,cAAA,GACH,SAAS,KAAA,CAAkC,QAAA;AAG9C,UAAA,MAAM,oBAAoB,QAAA,CAAS,mBAAA;AACnC,UAAA,MAAM,YAAA,GAAe,oBACjB,IAAA,CAAK,SAAA,CAAU,iBAAiB,CAAA,GAChC,IAAA,CAAK,UAAU,QAAQ,CAAA;AAG3B,UAAA,MAAM,gBAAoC,EAAC;AAC3C,UAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAE1C,UAAA,IAAI,iBAAA,EAAmB;AAErB,YAAA,MAAM,wBAAwB,iBAAA,CAAkB,cAAA;AAShD,YAAA,IAAI,qBAAA,IAAyB,qBAAA,CAAsB,MAAA,GAAS,CAAA,EAAG;AAC7D,cAAA,KAAA,MAAW,QAAQ,qBAAA,EAAuB;AACxC,gBAAA,sBAAA;AAAA,kBACE,aAAA;AAAA,kBACA,iBAAA;AAAA,kBACA,4BAA4B,IAAI;AAAA,iBAClC;AAAA,cACF;AAAA,YACF;AAGA,YAAA,MAAM,cAAc,iBAAA,CAAkB,YAAA;AACtC,YAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzC,cAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,gBAAA,sBAAA;AAAA,kBACE,aAAA;AAAA,kBACA,iBAAA;AAAA,kBACA,2BAAA,CAA4B;AAAA,oBAC1B,IAAA,EAAM,YAAA;AAAA,oBACN,IAAA,EAAM,YAAA;AAAA,oBACN,IAAI,EAAA,CAAG,EAAA;AAAA,oBACP,QAAQ,EAAA,CAAG,MAAA;AAAA,oBACX,QAAQ,EAAA,CAAG,OAAA,GAAU,EAAE,OAAA,EAAS,EAAA,CAAG,SAAQ,GAAI,KAAA;AAAA,mBAChD;AAAA,iBACH;AAAA,cACF;AAAA,YACF;AAGA,YAAA,MAAM,aAAa,iBAAA,CAAkB,WAAA;AACrC,YAAA,MAAM,MAAA,GAAU,iBAAA,CAAkB,OAAA,GAAoF,CAAC,GAAG,OAAA,EAAS,MAAA;AACnI,YAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,cAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,gBAAA,IAAI,IAAI,GAAA,EAAK;AACX,kBAAA,sBAAA;AAAA,oBACE,aAAA;AAAA,oBACA,iBAAA;AAAA,oBACA,2BAAA,CAA4B;AAAA,sBAC1B,IAAA,EAAM,kBAAA;AAAA,sBACN,IAAA,EAAM,kBAAA;AAAA,sBACN,IAAI,GAAA,CAAI,GAAA;AAAA,sBACR,MAAA,EAAQ;AAAA;AAAA,qBAET;AAAA,mBACH;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAM,oBAAoB,aAAA,CAAc,MAAA,GAAS,IAAI,IAAA,CAAK,SAAA,CAAU,aAAa,CAAA,GAAI,IAAA;AAErF,UAAA,MAAM,OAAA,GAA6E;AAAA,YACjF,EAAA,EAAI,KAAA;AAAA,YACJ,aAAA,EAAe,YAAA;AAAA,YACf,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,YAC7B,aAAA,EAAe,QAAA,CAAS,KAAA,CAAM,qBAAA,EAAuB,aAAA,IAAiB,CAAA;AAAA,YACtE,aAAA,EAAe,SAAS,KAAA,CAAM,iBAAA;AAAA,YAC9B,gBAAA,EACE,QAAA,CAAS,KAAA,CAAM,yBAAA,EAA2B,gBAAA,IAAoB,CAAA;AAAA,YAChE,YAAA,EAAc,SAAS,KAAA,CAAM,YAAA;AAAA,YAC7B,YAAY,cAAA,EAAgB,SAAA;AAAA,YAC5B,aAAa,cAAA,EAAgB,UAAA;AAAA,YAC7B,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,YACzB,eAAe,QAAA,CAAS,aAAA;AAAA,YACxB,cAAc,WAAA,IAAe,KAAA,CAAA;AAAA,YAC7B,YAAY,UAAA,IAAc,KAAA,CAAA;AAAA,YAC1B,iBAAiB,cAAA,IAAkB,KAAA,CAAA;AAAA;AAAA,YACnC,2BAAA,EAA6B,wBAAA;AAAA,YAC7B,WAAA,EAAa,IAAA;AAAA;AAAA,YACb,iBAAA,EAAmB,SAAS,iBAAA,IAAqB,KAAA,CAAA;AAAA;AAAA,YACjD,gBAAgB,iBAAA,IAAqB,KAAA;AAAA,WACvC;AAIA,UAAA,MAAO,MAAM,MAAA,CAAmE,OAAA;AAAA,YAC9E,YAAY;AACV,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,gBAsBA,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,gBAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,QAAQ,UAAA,IAAc,IAAA;AAAA,gBACtB,QAAQ,WAAA,IAAe,IAAA;AAAA,gBACvB,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,cAAc,CAAA,GAAI,CAAA;AAAA,gBAC1B,OAAA,CAAQ,iBAAA;AAAA,gBACR,iBAAA;AAAA,gBACA,cAAA;AAAA,gBACA,2BAA2B,CAAA,GAAI,CAAA;AAAA,gBAC/B;AAAA,eACF;AAAA,YACF;AAAA,WACF;AAGA,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,QAAQ,OAAA,CAAQ,EAAA;AAAA,cAChB,IAAA,EAAM;AAAA,aACP,CAAA;AAAA,UACH;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,KAAK,CAAA;AAAA,QACxE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,qBAAqB,OAAA,EAAyB;AAC3D,QAAA,IAAI,QAAQ,UAAA,CAAW,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC3D,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,UAAA,OAAO,WAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,MAAM,EAAA,EAA2B;AAC9C,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAa,uBAAA,CACX,KAAA,EACA,KAAA,EACA,UACA,YAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,oBAAoB,QAAA,CAAS,mBAAA;AACnC,UAAA,IAAI,CAAC,iBAAA,EAAmB;AAGxB,UAAA,MAAM,sBAAsB,IAAA,CAAK,2BAAA;AAAA,YAC/B,iBAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB,CAAA,gDAAA,CAAA;AAAA,YACA,IAAA,CAAK,UAAU,mBAAmB,CAAA;AAAA,YAClC;AAAA,WACF;AAGA,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,MAAA,EAAQ,KAAA;AAAA,cACR,IAAA,EAAM,EAAE,EAAA,EAAI,KAAA,EAAO,eAAe,IAAA,CAAK,SAAA,CAAU,mBAAmB,CAAA;AAAE,aACvE,CAAA;AAAA,UACH;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,KAAK,CAAA;AAAA,QAC3E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,2BAAA,CACb,YAAA,EACA,YAAA,EACyB;AACzB,QAAA,MAAM,UAAU,YAAA,EAAc,OAAA;AAG9B,QAAA,IAAI,CAAC,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,MAAA,EAAQ;AAClC,UAAA,OAAO,YAAA;AAAA,QACT;AAEA,QAAA,OAAO;AAAA,UACL,GAAG,YAAA;AAAA,UACH,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,YAChC,GAAG,MAAA;AAAA,YACH,OAAA,EAAS;AAAA,cACP,GAAG,MAAA,CAAO,OAAA;AAAA,cACV,MAAA,EAAQ,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,GAAA;AAAA,gBAC9B,CAAC,GAAA,KAAsE;AAErE,kBAAA,MAAM,OAAO,GAAA,CAAI,GAAA,GAAM,aAAa,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA;AACnD,kBAAA,IAAI,IAAA,EAAM;AACR,oBAAA,OAAO;AAAA,sBACL,MAAM,GAAA,CAAI,IAAA;AAAA,sBACV,SAAA,EAAW,EAAE,GAAA,EAAK,IAAA;AAAK,qBACzB;AAAA,kBACF;AACA,kBAAA,OAAO,GAAA;AAAA,gBACT;AAAA;AACF;AACF,WACF,CAAE;AAAA,SACJ;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,QAAA,CACnB,KAAA,EACA,OACA,SAAA,EACA,OAAA,EACA,WACA,aAAA,EAC6B;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,kBAAkB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC7E,UAAA,MAAM,UAAA,GAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAA;AAM1D,UAAA,IAAI,YAAA,GAAe,eAAA;AACnB,UAAA,IAAI,kBAAA,GAA8B,IAAA;AAClC,UAAA,MAAM,UAAA,GAAa,gBAAgB,IAAA,EAAK;AACxC,UAAA,IAAI,WAAW,UAAA,CAAW,GAAG,KAAK,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5D,YAAA,IAAI;AACF,cAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAC7C,cAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,gBAAA,kBAAA,GAAqB,MAAA;AACrB,gBAAA,MAAM,GAAA,GAAM,MAAA;AACZ,gBAAA,MAAM,WAAW,GAAA,CAAI,KAAA;AACrB,gBAAA,MAAM,KAAA,GACJ,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,GAC3B,QAAA,CAAqC,OAAA,GACtC,OAAO,QAAA,KAAa,QAAA,GAClB,QAAA,GACA,GAAA,CAAI,OAAA;AACZ,gBAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACxD,kBAAA,YAAA,GAAe,MAAM,IAAA,EAAK;AAAA,gBAC5B;AAAA,cACF;AAAA,YACF,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAGA,UAAA,IAAI,YAAA,GAAe,EAAA;AACnB,UAAA,MAAM,QAAA,GAAW,KAAA;AAGjB,UAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAE5C,YAAA,MAAM,cAAA,GAAiB;AAAA,cACrB,OAAA;AAAA;AAAA,cACA,MAAA;AAAA;AAAA,cACA,QAAA;AAAA;AAAA,cACA,UAAA;AAAA;AAAA,cACA,MAAA;AAAA;AAAA,cACA,OAAA;AAAA;AAAA,cACA,SAAA;AAAA;AAAA,cACA;AAAA;AAAA,aACF;AAEA,YAAA,MAAM,WAAoC,EAAC;AAC3C,YAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,cAAA,IAAI,KAAA,IAAS,QAAA,IAAY,QAAA,CAAS,KAAK,MAAM,KAAA,CAAA,EAAW;AACtD,gBAAA,QAAA,CAAS,KAAK,CAAA,GAAI,QAAA,CAAS,KAAK,CAAA;AAAA,cAClC;AAAA,YACF;AAIA,YAAA,IAAI,kBAAA,IAAsB,OAAO,kBAAA,KAAuB,QAAA,EAAU;AAChE,cAAA,MAAM,IAAA,GAAO,kBAAA;AACb,cAAA,IAAI,IAAA,CAAK,KAAA,KAAU,KAAA,CAAA,EAAW,QAAA,CAAS,QAAQ,IAAA,CAAK,KAAA;AACpD,cAAA,IAAI,IAAA,CAAK,SAAS,KAAA,CAAA,IAAa,QAAA,CAAS,SAAS,KAAA,CAAA,EAAW,QAAA,CAAS,OAAO,IAAA,CAAK,IAAA;AACjF,cAAA,IAAI,IAAA,CAAK,WAAW,KAAA,CAAA,IAAa,QAAA,CAAS,WAAW,KAAA,CAAA,EAAW,QAAA,CAAS,SAAS,IAAA,CAAK,MAAA;AAAA,YACzF;AAEA,YAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AACpC,cAAA,YAAA,GAAe;;AAAA;AAAA,EAAuB,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA,CAAA;AAAA,YACzE;AAAA,UACF;AAEA,UAAA,MAAM,SAAA,GAAY,CAAA,EAAG,YAAY,CAAA,EAAG,UAAA,GAAa;;AAAA;AAAA,EAAqB,UAAU,CAAA,CAAA,GAAK,EAAE,CAAA,EAAG,YAAY,CAAA,CAAA;AAGtG,UAAA,MAAM,eAAA,GAAkB,GAAA;AACxB,UAAA,MAAM,UAAA,GAAa,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AACvC,UAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,MAAA,GAAS,eAAA,GACvC,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI;;AAAA,YAAA,EAAmB,UAAA,CAAW,MAAA,GAAS,eAAe,CAAA,kBAAA,CAAA,GACxG,SAAA;AAGJ,UAAA,MAAM,YAAA,GAAe,iBAAkB,QAAA,EAAU,SAAA;AAEjD,UAAA,IAAI,YAAA,EAAc;AAEhB,YAAA,MAAO,MAAM,MAAA,CAAmE,OAAA;AAAA,cAC9E,YAAY;AAEV,gBAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,kBACrC,CAAA,qCAAA,CAAA;AAAA,kBACA;AAAA,iBACF;AACA,gBAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,gBAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,CAAC,CAAA,EAAG,MAAA;AAG/B,gBAAA,IAAI,cAIC,EAAC;AACN,gBAAA,IAAI,aAAA,EAAe;AACjB,kBAAA,IAAI;AACF,oBAAA,WAAA,GAAc,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA,kBACxC,SAAS,CAAA,EAAG;AACV,oBAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,CAAC,CAAA;AAAA,kBAC3D;AAAA,gBACF;AAGA,gBAAA,WAAA,CAAY,IAAA,CAAK;AAAA,kBACf,OAAA,EAAS,cAAA;AAAA,kBACT,IAAA,EAAM,SAAA;AAAA,kBACN,SAAA,EAAW,KAAK,GAAA;AAAI,iBACrB,CAAA;AAGD,gBAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,kBACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,kBASA,cAAA;AAAA;AAAA,kBACA,SAAA;AAAA;AAAA,kBACA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA;AAAA,kBAC1B,IAAA,CAAK,KAAI,GAAI,SAAA;AAAA,kBACb,CAAA;AAAA;AAAA,kBACA;AAAA,iBACF;AAAA,cACF;AAAA,aACF;AAEA,YAAA,IAAI,MAAM,OAAA,EAAS;AACjB,cAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,gBACZ,IAAA,EAAM,UAAA;AAAA,gBACN,MAAA,EAAQ,YAAA;AAAA,gBACR,IAAA,EAAM;AAAA,kBACJ,EAAA,EAAI,YAAA;AAAA,kBACJ,KAAA,EAAO,cAAA;AAAA,kBACP,UAAA,EAAY,SAAA;AAAA,kBACZ,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,kBACzB,WAAA,EAAa;AAAA;AACf,eACD,CAAA;AAAA,YACH;AAGA,YAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,SAAA,EAAW;AACnC,cAAA,QAAA,CAAS,SAAA,GAAY,YAAA;AAAA,YACvB;AAEA,YAAA,OAAO,YAAA;AAAA,UACT,CAAA,MAAO;AAEL,YAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,YAAA,MAAM,OAAA,GAA6C;AAAA,cACjD,EAAA;AAAA,cACA,UAAA,EAAY,MAAM,aAAA,IAAiB,sCAAA;AAAA,cACnC,QAAA,EAAU,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAAA,cAC3C,KAAA,EAAO,OAAA;AAAA,cACP,KAAA,EAAO,cAAA;AAAA,cACP,UAAA,EAAY,SAAA;AAAA,cACZ,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,cACzB,WAAA,EAAa,IAAA;AAAA,cACb,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,aAC3B;AAEA,YAAA,MAAO,MAAM,MAAA,CAAmE,OAAA;AAAA,cAC9E,YAAY;AACV,gBAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,kBACtB;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,kBAMA,OAAA,CAAQ,EAAA;AAAA,kBACR,OAAA,CAAQ,UAAA;AAAA,kBACR,OAAA,CAAQ,QAAA;AAAA,kBACR,OAAA,CAAQ,KAAA;AAAA,kBACR,OAAA,CAAQ,KAAA;AAAA,kBACR,OAAA,CAAQ,UAAA;AAAA,kBACR,OAAA,CAAQ,UAAA;AAAA,kBACR,CAAA;AAAA,kBACA,OAAA,CAAQ;AAAA,iBACV;AAAA,cACF;AAAA,aACF;AAEA,YAAA,IAAI,MAAM,OAAA,EAAS;AACjB,cAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,gBACZ,IAAA,EAAM,UAAA;AAAA,gBACN,QAAQ,OAAA,CAAQ,EAAA;AAAA,gBAChB,IAAA,EAAM;AAAA,eACP,CAAA;AAAA,YACH;AAGA,YAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,SAAA,EAAW;AACnC,cAAA,QAAA,CAAS,SAAA,GAAY,EAAA;AAAA,YACvB;AAEA,YAAA,OAAO,EAAA;AAAA,UACT;AAAA,QACF,SAAS,QAAA,EAAU;AAEjB,UAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,QAAQ,CAAA;AAAA,QAChE;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAe,sBAAA,CACb,QAAA,EACA,KAAA,EACA,KAAA,EACM;AACN,QAAA,MAAM,WAAW,QAAA,CAAS,SAAA;AAC1B,QAAA,MAAM,aAAa,QAAA,CAAS,mBAAA;AAG5B,QAAA,IAAI,CAAC,QAAA,EAAU,mBAAA,IAAuB,CAAC,UAAA,EAAY;AACjD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,OAAA,GAA2B;AAAA,UAC/B,UAAA;AAAA,UACA,OAAO,QAAA,CAAS,KAAA;AAAA,UAChB,cAAc,QAAA,CAAS,aAAA;AAAA,UACvB,KAAA,EAAO;AAAA,YACL,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,YAC7B,gBAAA,EAAkB,SAAS,KAAA,CAAM,iBAAA;AAAA,YACjC,WAAA,EAAa,SAAS,KAAA,CAAM;AAAA;AAC9B,SACF;AAGA,QAAA,MAAM,kBAAkB,QAAA,CAAS,mBAAA,CAAoB,OAAO,CAAA,CACzD,IAAA,CAAK,OAAO,QAAA,KAAa;AACxB,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAA;AAAA,UACzD;AAAA,QACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAAA,QAC/D,CAAC,CAAA;AAGH,QAAA,KAAA,CAAM,SAAA,CAAU,uBAAA,GAA0B,KAAA,CAAM,SAAA,CAAU,2BAA2B,EAAC;AACtF,QAAA,KAAA,CAAM,SAAA,CAAU,uBAAA,CAAwB,IAAA,CAAK,eAAe,CAAA;AAAA,MAC9D;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,qBAAA,CACnB,KAAA,EACA,KAAA,EACA,QAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,UAAoB,EAAC;AAC3B,UAAA,MAAM,SAAoB,EAAC;AAC3B,UAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,UAAA,IAAI,QAAA,CAAS,oBAAoB,KAAA,CAAA,EAAW;AAC1C,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,UAAA,EAAY,CAAA,CAAE,CAAA;AACjD,YAAA,MAAA,CAAO,IAAA,CAAK,SAAS,eAAe,CAAA;AAAA,UACtC;AAEA,UAAA,IAAI,QAAA,CAAS,oBAAoB,KAAA,CAAA,EAAW;AAC1C,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,UAAA,EAAY,CAAA,CAAE,CAAA;AAC5C,YAAA,MAAA,CAAO,IAAA,CAAK,SAAS,eAAe,CAAA;AAAA,UACtC;AAEA,UAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,YAAA;AAAA,UACF;AAGA,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,UAAA,MAAM,MAAM,CAAA,gBAAA,EAAmB,OAAA,CAAQ,KAAK,IAAI,CAAC,gBAAgB,UAAU,CAAA,CAAA;AAC3E,UAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,GAAG,MAAM,CAAA;AAG3C,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,MAAA,EAAQ,KAAA;AAAA,cACR,IAAA,EAAM;AAAA,gBACJ,EAAA,EAAI,KAAA;AAAA,gBACJ,GAAI,QAAA,CAAS,eAAA,KAAoB,UAAa,EAAE,eAAA,EAAiB,SAAS,eAAA,EAAgB;AAAA,gBAC1F,GAAI,QAAA,CAAS,eAAA,KAAoB,UAAa,EAAE,UAAA,EAAY,SAAS,eAAA;AAAgB;AACvF,aACD,CAAA;AAAA,UACH;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,KAAK,CAAA;AAAA,QACxE;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1xDA,SAAS,mBAAmB,OAAA,EAA8D;AACxF,EAAA,OAAO;AAAA,IACL,UAAU,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,QAAQ,IAAA,GAAO,IAAA;AAAA,IAC5D,iBACE,OAAO,OAAA,CAAQ,eAAA,KAAoB,QAAA,GAAW,QAAQ,eAAA,GAAkB,IAAA;AAAA,IAC1E,qBACE,OAAO,OAAA,CAAQ,mBAAA,KAAwB,QAAA,GAAW,QAAQ,mBAAA,GAAsB;AAAA,GACpF;AACF;AAEO,SAAS,0BACd,OAAA,EAC4B;AAC5B,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,OAAA;AAAA,MACV,eAAA,EAAiB,IAAA;AAAA,MACjB,mBAAA,EAAqB;AAAA,KACvB;AAAA,EACF;AACA,EAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrE,IAAA,MAAM,MAAA,GAAS,mBAAmB,OAAkC,CAAA;AACpE,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA;AAAA,IACV,eAAA,EAAiB,IAAA;AAAA,IACjB,mBAAA,EAAqB;AAAA,GACvB;AACF;AAEO,SAAS,mCAAmC,IAAA,EAIjD;AACA,EAAA,MAAM,MAAA,GAAU,QAAQ,EAAC;AACzB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,yBAAA,CAA0B,MAAA,CAAO,WAAW,CAAA;AAAA,IAClD,IAAA,EAAM,yBAAA,CAA0B,MAAA,CAAO,WAAW,CAAA;AAAA,IAClD,MAAA,EAAQ,yBAAA,CAA0B,MAAA,CAAO,aAAa;AAAA,GACxD;AACF;AAEO,SAAS,sBAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,EAC4B;AAC5B,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,OAAO;AAAA,QACL,UAAU,KAAA,CAAM,wBAAA;AAAA,QAChB,iBAAiB,KAAA,CAAM,oCAAA;AAAA,QACvB,qBAAqB,KAAA,CAAM;AAAA,OAC7B;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,OAAO;AAAA,QACL,UAAU,KAAA,CAAM,wBAAA;AAAA,QAChB,iBAAiB,KAAA,CAAM,oCAAA;AAAA,QACvB,qBAAqB,KAAA,CAAM;AAAA,OAC7B;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,UAAU,KAAA,CAAM,0BAAA;AAAA,MAChB,iBAAiB,KAAA,CAAM,sCAAA;AAAA,MACvB,qBAAqB,KAAA,CAAM;AAAA,KAC7B;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,OAAO;AAAA,MACL,UAAU,KAAA,CAAM,wBAAA;AAAA,MAChB,iBAAiB,KAAA,CAAM,oCAAA;AAAA,MACvB,qBAAqB,KAAA,CAAM;AAAA,KAC7B;AAAA,EACF;AACA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,OAAO;AAAA,MACL,UAAU,KAAA,CAAM,wBAAA;AAAA,MAChB,iBAAiB,KAAA,CAAM,oCAAA;AAAA,MACvB,qBAAqB,KAAA,CAAM;AAAA,KAC7B;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,UAAU,KAAA,CAAM,0BAAA;AAAA,IAChB,iBAAiB,KAAA,CAAM,sCAAA;AAAA,IACvB,qBAAqB,KAAA,CAAM;AAAA,GAC7B;AACF;AAvGA,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAyFO,SAAS,eAAe,QAAA,EAA2B;AAExD,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAGzC,EAAA,OAAO,sBAAA,CAAuB,IAAA;AAAA,IAC5B,CAAC,IAAA,KAAS,QAAA,KAAa,QAAQ,QAAA,CAAS,UAAA,CAAW,OAAO,GAAG;AAAA,GAC/D;AACF;AAKO,SAAS,qBAAqB,QAAA,EAAkC;AACrE,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,IAAI,SAAS,UAAA,CAAW,SAAS,CAAA,IAAK,QAAA,CAAS,WAAW,UAAU,CAAA;AAClE,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,SAAS,IAAA,EAAsB;AAC7C,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC5C,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AACpC;AAKO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,IAAI,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACzC,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,eAAgB,GAAA,GAAM,UAAA;AACpD,EAAA,IAAI,WAAW,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AACrD,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,WAAA,CAAY,GAAG,CAAA;AAC5C,EAAA,IAAI,SAAA,IAAa,GAAG,OAAO,GAAA;AAC3B,EAAA,OAAO,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACtC;AAKO,SAAS,gBAAgB,GAAA,EAAsB;AACpD,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAA;AAAA,IACpD,WAAA,EAAa,IAAI,YAAA,KAAiB,CAAA;AAAA,IAClC,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,IACpB,MAAA,EAAQ,IAAI,MAAA,IAAU,IAAA;AAAA,IACtB,SAAA,EAAW,IAAI,UAAA,KAAe,CAAA;AAAA,IAC9B,UAAA,EAAY,IAAI,WAAA,IAAe;AAAA,GACjC;AACF;AAupBA,SAAS,cAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AAEnD,EAAA,MAAM,SAAA,GAAoC;AAAA;AAAA,IAExC,GAAA,EAAK,YAAA;AAAA,IACL,EAAA,EAAI,eAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,GAAA,EAAK,UAAA;AAAA,IACL,GAAA,EAAK,UAAA;AAAA;AAAA,IAGL,EAAA,EAAI,wBAAA;AAAA,IACJ,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,GAAA,EAAK,iBAAA;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,GAAA,EAAK,kBAAA;AAAA;AAAA,IAGL,GAAA,EAAK,YAAA;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,GAAA,EAAK,WAAA;AAAA,IACL,GAAA,EAAK,WAAA;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,GAAA,EAAK,eAAA;AAAA,IACL,GAAA,EAAK,cAAA;AAAA;AAAA,IAGL,GAAA,EAAK,iBAAA;AAAA;AAAA,IAGL,GAAA,EAAK,iBAAA;AAAA,IACL,GAAA,EAAK,mBAAA;AAAA,IACL,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,OAAO,SAAA,CAAU,GAAA,IAAO,EAAE,CAAA,IAAK,0BAAA;AACjC;AA51BA,IAgBa,YAMP,sBAAA,EA8IO,WAAA;AApKb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAgBO,IAAM,UAAA,GAAa,OAAO,IAAA,GAAO,IAAA;AAMxC,IAAM,sBAAA,GAAyB;AAAA;AAAA,MAE7B,kBAAA;AAAA,MACA,qBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,sBAAA;AAAA,MACA,iBAAA;AAAA,MACA,uBAAA;AAAA,MACA,qBAAA;AAAA,MACA,sBAAA;AAAA,MACA,sBAAA;AAAA,MACA,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA,kBAAA;AAAA,MACA,oBAAA;AAAA;AAAA,MAGA,wBAAA;AAAA,MACA,0BAAA;AAAA,MACA,wBAAA;AAAA,MACA,wBAAA;AAAA,MACA,0BAAA;AAAA,MACA,sBAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,mBAAA;AAAA,MACA,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,0BAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA;AAAA,MAGA,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,qBAAA;AAAA,MACA,uBAAA;AAAA,MACA,0BAAA;AAAA,MACA,iCAAA;AAAA,MACA,gCAAA;AAAA;AAAA,MAGA,yBAAA;AAAA,MACA,qBAAA;AAAA,MACA,mBAAA;AAAA,MACA,iBAAA;AAAA,MACA,sBAAA;AAAA;AAAA,MAGA,mCAAA;AAAA,MACA,2BAAA;AAAA,MACA,8BAAA;AAAA,MACA,qCAAA;AAAA;AAAA,MAGA,mBAAA;AAAA,MACA,0BAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAgFO,IAAM,cAAN,MAAkB;AAAA,MACvB,YAAoB,GAAA,EAAkC;AAAlC,QAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,MAAmC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMvD,MAAM,SAAA,CACJ,IAAA,EACA,IAAA,EACA,UACA,OAAA,EAMqB;AACrB,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,IAAA,GAAO,SAAS,cAAc,CAAA;AACpC,QAAA,MAAM,MAAA,GAAS,eAAe,QAAQ,CAAA;AACtC,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,QAAA,IAAI,OAAA,GAAyB,IAAA;AAC7B,QAAA,IAAI,QAAA,GAA8B,IAAA;AAClC,QAAA,IAAI,IAAA;AAEJ,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAA,GACE,OAAO,SAAS,QAAA,GACZ,IAAA,GACA,IAAI,WAAA,EAAY,CAAE,OAAO,IAAmB,CAAA;AAClD,UAAA,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,OAAO,IAAA,KAAS,QAAA,GACvB,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA,GAC7B,IAAI,UAAA,CAAW,IAAmB,CAAA;AACtC,UAAA,IAAA,GAAO,QAAA,CAAS,UAAA;AAAA,QAClB;AAEA,QAAA,MAAM,eAAe,OAAA,EAAS,QAAA,GAC1B,KAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAC/B,IAAA;AAGJ,QAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,IAAU,QAAA,IAAY,IAAA,GAAO,UAAA;AAEpD,QAAA,IAAI,aAAA,EAAe;AAEjB,UAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,YACV,cAAA;AAAA,YACA,IAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA;AAAA,YACA,IAAA;AAAA,YACA,GAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAIA,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,2CAAA,CAAA,EAA+C,cAAc,CAAA;AAGjF,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA;AAAA,0EAAA,CAAA;AAAA,UAEA,cAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAS,SAAA,IAAa,IAAA;AAAA,UACtB,GAAA;AAAA,UACA,SAAS,KAAA,IAAS,IAAA;AAAA,UAClB,SAAS,MAAA,IAAU;AAAA,SACrB;AAGA,QAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,cAAA;AAAA,UACN,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,IAAA;AAAA,UACA,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,UAC/B,WAAA,EAAa,KAAA;AAAA,UACb,SAAA,EAAW,GAAA;AAAA,UACX,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,UACzB,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,UAC3B,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,iBACZ,cAAA,EACA,IAAA,EACA,MACA,QAAA,EACA,IAAA,EACA,GAAA,EACA,YAAA,EACA,OAAA,EAMqB;AAErB,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,2CAAA,CAAA,EAA+C,cAAc,CAAA;AAGjF,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,UAAU,CAAA;AAG9C,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA;AAAA,6EAAA,CAAA;AAAA,UAEA,cAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,IAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAS,SAAA,IAAa,IAAA;AAAA,UACtB,GAAA;AAAA,UACA,SAAS,KAAA,IAAS,IAAA;AAAA,UAClB,SAAS,MAAA,IAAU,IAAA;AAAA,UACnB;AAAA,SACF;AAGA,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,UAAA,MAAM,QAAQ,CAAA,GAAI,UAAA;AAClB,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC7C,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAEnC,UAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,YACb,CAAA,uEAAA,CAAA;AAAA,YACA,cAAA;AAAA,YACA,CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAGA,QAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,cAAA;AAAA,UACN,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,IAAA;AAAA,UACA,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,UAC/B,WAAA,EAAa,KAAA;AAAA,UACb,SAAA,EAAW,GAAA;AAAA,UACX,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,UACzB,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,UAC3B,SAAA,EAAW,IAAA;AAAA,UACX;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAA,CACJ,IAAA,EACA,QAAA,EACA,OAAA,EAKqB;AACrB,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,IAAA,GAAO,SAAS,cAAc,CAAA;AACpC,QAAA,MAAM,OAAA,GAAU,qBAAqB,QAAQ,CAAA;AAC7C,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,QAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,aAAA,CAAc,IAAI,CAAA;AAExD,QAAA,MAAM,eAAe,OAAA,EAAS,QAAA,GAC1B,KAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAC/B,IAAA;AAEJ,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA;AAAA,2DAAA,CAAA;AAAA,UAEA,cAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAS,IAAA,IAAQ,CAAA;AAAA,UACjB,YAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,cAAA;AAAA,UACN,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA;AAAA,UACA,QAAA;AAAA,UACA,IAAA,EAAM,SAAS,IAAA,IAAQ,CAAA;AAAA,UACvB,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,UAC/B,WAAA,EAAa,KAAA;AAAA,UACb,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,SAAS,IAAA,EAA2C;AACxD,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAO5B,CAAA,qGAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAGlB,QAAA,IAAI,GAAA,CAAI,OAAA,KAAY,OAAA,EAAS,OAAO,IAAA;AAGpC,QAAA,IAAI,GAAA,CAAI,UAAA,KAAe,CAAA,IAAK,GAAA,CAAI,WAAA,EAAa;AAC3C,UAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,cAAA,EAAgB,GAAA,CAAI,WAAW,CAAA;AAAA,QAC7D;AAGA,QAAA,IAAI,GAAA,CAAI,YAAY,IAAA,EAAM;AACxB,UAAA,MAAM,UAAU,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,OAAO,CAAA;AACpD,UAAA,OAAO,OAAA,CAAQ,OAAO,KAAA,CAAM,OAAA,CAAQ,YAAY,OAAA,CAAQ,UAAA,GAAa,QAAQ,UAAU,CAAA;AAAA,QACzF;AAGA,QAAA,OAAO,GAAA,CAAI,IAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,eAAA,CACZ,cAAA,EACA,UAAA,EACsB;AACtB,QAAA,MAAM,SAAuB,EAAC;AAC9B,QAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,YAC5B,CAAA,oEAAA,CAAA;AAAA,YACA,cAAA;AAAA,YACA;AAAA,WACF;AAEA,UAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,UAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,CAAC,CAAA,UAAA,EAAa,cAAc,CAAA,CAAE,CAAA;AAAA,UACjE;AAEA,UAAA,MAAM,QAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,CAAC,EAAE,IAAI,CAAA;AACzC,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,UAAA,SAAA,IAAa,KAAA,CAAM,UAAA;AAAA,QACrB;AAGA,QAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,SAAS,CAAA;AACvC,QAAA,IAAI,MAAA,GAAS,CAAA;AACb,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,UAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,QAClB;AAEA,QAAA,OAAO,MAAA,CAAO,MAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,WAAW,IAAA,EAA2D;AAC3E,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAO5B,CAAA,qGAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,QAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAGlB,QAAA,IAAI,GAAA,CAAI,YAAY,OAAA,EAAS;AAG7B,QAAA,IAAI,GAAA,CAAI,UAAA,KAAe,CAAA,IAAK,GAAA,CAAI,WAAA,EAAa;AAC3C,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,aAAa,CAAA,EAAA,EAAK;AACxC,YAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,cACjC,CAAA,oEAAA,CAAA;AAAA,cACA,cAAA;AAAA,cACA;AAAA,aACF;AAEA,YAAA,MAAM,SAAA,GAAY,YAAY,OAAA,EAAQ;AACtC,YAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,cAAA,MAAM,IAAI,UAAA,CAAW,SAAA,CAAU,CAAC,EAAE,IAAI,CAAA;AAAA,YACxC;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,GAAA,CAAI,YAAY,IAAA,EAAM;AACxB,UAAA,MAAM,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,OAAO,CAAA;AAC1C,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,GAAA,CAAI,SAAS,IAAA,EAAM;AACrB,UAAA,MAAM,IAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAAa,IAAA,EAAsC;AACvD,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAK5B,CAAA,4EAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAGlB,QAAA,IAAI,GAAA,CAAI,OAAA,KAAY,OAAA,EAAS,OAAO,IAAA;AAGpC,QAAA,IAAI,GAAA,CAAI,OAAA,KAAY,IAAA,EAAM,OAAO,GAAA,CAAI,OAAA;AAGrC,QAAA,IAAI,GAAA,CAAI,SAAS,IAAA,EAAM;AACrB,UAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,IAAmB,CAAA;AAAA,QACzD;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,KAAK,IAAA,EAA0C;AACnD,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA;AAAA,gCAAA,CAAA;AAAA,UAEA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAO,IAAA,EAAgC;AAC3C,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA,kDAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,MAAA,CAAO,GAAA,EAAI,CAAE,KAAA,GAAQ,CAAA;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAO,IAAA,EAA6B;AACxC,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA,qDAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,KAAK,WAAA,EAAY;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAM,IAAA,EAAmC;AAC7C,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,IAAA,GAAO,SAAS,cAAc,CAAA;AACpC,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA;AAAA,uFAAA,CAAA;AAAA,UAEA,cAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,cAAA;AAAA,UACN,IAAA;AAAA,UACA,QAAA,EAAU,iBAAA;AAAA,UACV,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,IAAA,EAAM,CAAA;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,WAAA,EAAa,IAAA;AAAA,UACb,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAQ,IAAA,EAAqC;AACjD,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,MAAA,GAAS,cAAA,KAAmB,GAAA,GAAM,GAAA,GAAM,cAAA,GAAiB,GAAA;AAG/D,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,CAAA;AAAA,UAMA,MAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,eAAe,CAAA;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAM,IAAA,EAA6B;AACvC,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,SAAS,cAAA,GAAiB,GAAA;AAGhC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA,4DAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,MAAA,CAAO,GAAA,EAAI,CAAE,KAAA,GAAQ,CAAA,EAAG;AAC1B,UAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,QACvC;AAEA,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA,qDAAA,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,GAAmC;AACvC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAG3B,CAAA,0DAAA,CAA4D,CAAA;AAE/D,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,UAAA,OAAO,EAAE,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,QACtC;AAEA,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,IAAA,CAAK,CAAC,CAAA,CAAE,UAAA;AAAA,UACnB,SAAA,EAAW,IAAA,CAAK,CAAC,CAAA,CAAE;AAAA,SACrB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,WAAA,GAA6B;AACzC,QAAA,MAAM,IAAA,CAAK,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKnB,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAAa,IAAA,EAA2C;AAC5D,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA,+DAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,OAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAA;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAA,CACJ,OAAA,EACA,OAAA,EAIiE;AACjE,QAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,GAAA;AAEhC,QAAA,IAAI,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOZ,QAAA,MAAM,MAAA,GAAgB,CAAC,OAAO,CAAA;AAE9B,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,KAAA,IAAS,CAAA,6BAAA,CAAA;AACT,UAAA,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,QACzC;AAEA,QAAA,KAAA,IAAS,CAAA,QAAA,CAAA;AACT,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,IAAA,CAI3B,KAAA,EAAO,GAAG,MAAM,CAAA;AAEnB,QAAA,OAAO,OAAO,OAAA,EAAQ;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAA,CACJ,OAAA,EACA,OAAA,EAIuB;AACvB,QAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,GAAA;AAChC,QAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,KAAA;AAG9B,QAAA,IAAI,UAAA,GAAa,OAAA,CACd,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAGrB,QAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,UAAA,UAAA,GAAa,GAAA,GAAM,UAAA;AAAA,QACrB;AAEA,QAAA,IAAI,UAAA,GAAa,EAAA;AACjB,QAAA,IAAI,IAAA,KAAS,QAAQ,UAAA,GAAa,uBAAA;AAClC,QAAA,IAAI,IAAA,KAAS,aAAa,UAAA,GAAa,uBAAA;AAEvC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA;AAAA;AAAA,wBAAA,EAEoB,UAAU;AAAA;AAAA,cAAA,CAAA;AAAA,UAG9B,UAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,eAAe,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjwBA,SAAS,aAAa,KAAA,EAAsC;AAC1D,EAAA,OAAO,MAAM,gBAAA,CAAiB,IAAA,KAAS,QAAA,GACnC,KAAA,CAAM,iBAAiB,SAAA,GACvB,MAAA;AACN;AApDA,IAiBM,oBAAA,EACA,qBAAA,EACA,yBAAA,EACA,4BAAA,EACA,+BAAA,EAqCO,YAAA;AA1Db,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAaA,IAAA,UAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AAEA,IAAM,oBAAA,GAAuB,iBAAA;AAC7B,IAAM,qBAAA,GAAwB,kBAAA;AAC9B,IAAM,yBAAA,GAA4B,eAAA;AAClC,IAAM,4BAAA,GAA+B,cAAA;AACrC,IAAM,+BAAA,GAAkC,mCAAA;AAqCjC,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxB,aAAa,eAAA,CACX,KAAA,EACA,SAAA,EACe;AAEf,QAAA,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,GAAG,SAAS,CAAA;AACtC,QAAA,KAAA,CAAM,SAAS,UAAA,GAAa,IAAA;AAE5B,QAAA,OAAO,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAEtC,UAAA,IAAK,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,YAAW,IAAM,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AAEvF,YAAA,KAAA,CAAM,QAAA,CAAS,QAAQ,EAAC;AACxB,YAAA,KAAA,CAAM,SAAS,UAAA,GAAa,KAAA;AAC5B,YAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,UAC3B;AAEA,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,EAAM;AAExC,UAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AAExC,UAAA,IAAI;AAEF,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,cAAA;AAAA,cACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,cACpB,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AACzD,YAAA,IAAI,eAAA,EAAiB;AAEnB,cAAA,MAAMG,OAAAA,GAAqB;AAAA,gBACzB,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO;AAAA,eACT;AAEA,cAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAMA,OAAAA,EAAQ,OAAO,aAAa,CAAA;AAE7D,cAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,gBACpB,IAAA,EAAM,gBAAA;AAAA,gBACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,gBACpB,MAAA,EAAQ,OAAA;AAAA,gBACR,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AAED,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,SAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,OAAO,aAAa,CAAA;AAGpE,YAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,cAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,SAAS,uBAAuB,CAAA;AAE/D,cAAA,IAAI,OAAO,KAAA,EAAO;AAChB,gBAAA,KAAA,CAAM,QAAQ,MAAA,CAAO,KAAA;AAAA,cACvB;AACA,cAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,YACtD;AAIA,YAAA,MAAM,EAAE,UAAA,EAAAC,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAE7B,YAAA,MAAM,aAAa,MAAA,CAAO,MAAA,KAAW,SAAA,GACjC,MAAMA,YAAW,2BAAA,CAA4B,KAAA,EAAO,IAAA,EAAM,MAAM,IAChE,MAAMA,WAAAA,CAAW,2BAAA,CAA4B,KAAA,EAAO,MAAM,MAAM,CAAA;AAGpE,YAAA,IAAI,eAAe,IAAA,EAAM;AACb,cAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,KAAK,CAAA;AAC1D,cAAA;AAAA,YACF;AAIA,YAAA,MAAM,IAAA,CAAK,2BAAA;AAAA,cACT,KAAA;AAAA,cACA,KAAK,QAAA,CAAS,IAAA;AAAA,cACd,UAAA;AAAA,cACA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,QAAA,CAAS,SAAS;AAAA,aACjD;AAIA,YAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,OAAO,aAAa,CAAA;AAGjE,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,gBAAA;AAAA,cACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,cACpB,QAAQ,UAAA,CAAW,MAAA;AAAA,cACnB,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAAA,UACH,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,MAAM,CAAA,qBAAA,EAAwB,IAAA,CAAK,QAAA,CAAS,IAAI,KAAK,KAAK,CAAA;AAGlE,YAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAGpD,YAAA,MAAM,WAAA,GAA0B;AAAA,cAC9B,MAAA,EAAQ,OAAA;AAAA,cACR,OAAQ,KAAA,CAAgB;AAAA,aAC1B;AAGA,YAAA,MAAM,EAAE,UAAA,EAAAA,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC7B,YAAA,MAAM,aAAa,MAAMA,WAAAA,CAAW,2BAAA,CAA4B,KAAA,EAAO,MAAM,WAAW,CAAA;AAGxF,YAAA,IAAI,eAAe,IAAA,EAAM;AACb,cAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,KAAK,CAAA;AAC1D,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,OAAO,aAAa,CAAA;AAGjE,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,gBAAA;AAAA,cACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,cACpB,MAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,SAAS,UAAA,GAAa,KAAA;AAI5B,QAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,UAAA,KAAA,CAAM,iBAAiB,KAAA,CAAM,gBAAA;AAC7B,UAAA,KAAA,CAAM,gBAAA,GAAmB,MAAA;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,eAAA,CACnB,IAAA,EACA,KAAA,EACA,aAAA,EACqB;AACrB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,KAAK,CAAA;AAExD,QAAA,QAAQ,QAAA;AAAU,UAChB,KAAK,QAAA;AACH,YAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAA;AAAA,UACjD,KAAK,QAAA;AACH,YAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,OAAO,aAAa,CAAA;AAAA,UAChE,KAAK,OAAA;AACH,YAAA,OAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AAAA,UAChD,KAAK,UAAA;AAKH,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8BAAA,EAAiC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,yDAAA,CAA2D,CAAA;AAC3H,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,OAAA;AAAA,cACR,KAAA,EAAO,CAAA,MAAA,EAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,gJAAA;AAAA,aACpC;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA;AAClE,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAe,gBAAA,CACb,IAAA,EACA,KAAA,EACe;AAEf,QAAA,IAAI,CAAC,KAAA,CAAM,YAAA,IAAgB,IAAA,CAAK,UAAA,EAAY;AAC1C,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,IAAA;AAAA,UACnC,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,KAAK,QAAA,CAAS;AAAA,SACjD;AAEA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,kBAAA,GAAqB,MAAM,YAAA,CAAa,IAAA;AAAA,YAC5C,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS;AAAA,WACnC;AACA,UAAA,MAAM,UAAA,GAAa,oBAAoB,QAAA,CAAS,UAAA;AAChD,UAAA,MAAM,UAAA,GACJ,cAAc,OAAO,UAAA,KAAe,YAAY,YAAA,IAAgB,UAAA,GAC3D,WAAuC,UAAA,GACxC,MAAA;AACN,UAAA,MAAM,aAAA,GACJ,cAAc,OAAO,UAAA,KAAe,YAAY,OAAA,IAAW,UAAA,GACtD,WAAuC,KAAA,GACxC,MAAA;AACN,UAAA,MAAM,kBAAA,GACJ,iBACA,OAAO,aAAA,KAAkB,YACzB,MAAA,IAAU,aAAA,GACL,cAA0C,IAAA,GAC3C,MAAA;AACN,UAAA,IACE,KAAA,CAAM,QAAQ,kBAAkB,CAAA,IAChC,mBAAmB,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAC9C;AACA,YAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,gCAAA,EAAmC,oBAAoB,CAAA,aAAA,EAAgB,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,2BAAA,EAA8B,qBAAqB,CAAA,kCAAA,CAAA;AAAA,UAChL;AAEA,UAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,2GAAA,CAAA;AAAA,QACpC;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,gBAAA,CACnB,IAAA,EACA,KAAA,EACmB;AACnB,QAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,IAAA;AAE/B,QAAA,IACE,QAAA,KAAa,oBAAA,IACb,QAAA,KAAa,qBAAA,IACb,aAAa,yBAAA,EACb;AACA,UAAA,OAAO,OAAA;AAAA,QACT;AAIA,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,IAAA;AAAA,YACtC,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,IAAA,KAAS,QAAA,IAAa,KAAa,aAAA,KAAkB;AAAA,WAC/E;AACA,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,OAAO,UAAA;AAAA,UACT;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AAGpC,QAAA,IAAI,SAAA,EAAW;AAEb,UAAA,IAAI;AACF,YAAA,MAAM,aAAA,GAAgB,SAAS,QAAA,CAAS,GAAG,IAAI,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAClF,YAAA,MAAM,UAAU,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,SAAS,aAAa,CAAA;AAClE,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,OAAO,QAAA;AAAA,YACT;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAC1C,QAAA,IAAI,YAAY,KAAA,EAAO;AACrB,UAAA,OAAO,QAAA;AAAA,QACT;AAIA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI;AACF,YAAA,MAAM,aAAA,GAAgB,SAAS,QAAA,CAAS,GAAG,IAAI,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAClF,YAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,aAAa,CAAA;AACtE,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,OAAO,QAAA;AAAA,YACT;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,QAAQ,CAAA;AACjE,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,OAAO,QAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAIA,QAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,KAA+B;AACrD,UAAA,MAAMC,MAAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AACtC,UAAA,OAAOA,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,WAAW,CAAA,KAAM,SAAA,GAAY,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA;AAAA,QACvF,CAAA;AAEA,QAAA,MAAM,eAAA,GAAkB,CAAC,QAAA,EAAe,sBAAA,KAA4C;AAClF,UAAA,IAAI,KAAK,UAAA,EAAY;AAInB,YAAA,OAAO,QAAA,CAAS,IAAA,KAAS,UAAA,IAAc,cAAA,CAAe,sBAAsB,CAAA;AAAA,UAC9E;AAEA,UAAA,OAAO,CAAC,EAAE,QAAA,CAAS,YAAA,IAAgB,eAAe,sBAAsB,CAAA,CAAA;AAAA,QAC1E,CAAA;AAGA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI;AACF,YAAA,MAAM,aAAA,GAAgB,SAAS,QAAA,CAAS,GAAG,IAAI,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAClF,YAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,aAAa,CAAA;AACpE,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,IACE,gBAAgB,QAAA,EAAU,QAAQ,KAClC,eAAA,CAAgB,QAAA,EAAU,aAAa,CAAA,EACvC;AACA,gBAAA,OAAO,OAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,QAAQ,CAAA;AAE/D,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAI,eAAA,CAAgB,QAAA,EAAU,QAAQ,CAAA,EAAG;AACvC,cAAA,OAAO,OAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAGA,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,aAAA,EAAc;AACvD,QAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,UAAA,IAAI;AACF,YAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,IAAI,CAAA;AAC3D,YAAA,IAAI,QAAA,CAAS,UAAU,QAAA,EAAU;AAC/B,cAAA,IACE,gBAAgB,QAAA,EAAU,IAAI,KAC9B,eAAA,CAAgB,QAAA,EAAU,QAAQ,CAAA,EAClC;AACA,gBAAA,OAAO,OAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,iBAAA,CACnB,IAAA,EACA,KAAA,EACqB;AACrB,QAAA,IAAI;AAEF,UAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AACpC,UAAA,IAAI,UAAA;AAEJ,UAAA,IAAI,SAAA,EAAW;AAEb,YAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAS,GAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,IAAI,CAAA,CAAA;AAChH,YAAA,IAAI;AACF,cAAA,UAAA,GAAa,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,SAAS,aAAa,CAAA;AAC/D,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,aAAa,CAAA,CAAE,CAAA;AAAA,YACtE,CAAA,CAAA,MAAQ;AAEN,cAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAC1C,cAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC3C,cAAA,IAAI,CAAC,UAAA,EAAY;AACf,gBAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,SAAS,IAAI,CAAA,gBAAA,EAAmB,aAAa,CAAA,CAAA,CAAG,CAAA;AAAA,cACjG;AACA,cAAA,UAAA,GAAa,MAAM,UAAA,EAAW;AAAA,YAChC;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAG1C,YAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC3C,YAAA,IAAI,CAAC,UAAA,EAAY;AACf,cAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,YAChE;AAEA,YAAA,UAAA,GAAa,MAAM,UAAA,EAAW;AAAA,UAChC;AACA,UAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,QAAO,GAAI,UAAA;AAG3D,UAAA,MAAM,WAAY,UAAA,CAAmB,IAAA;AAGrC,UAAA,MAAM,IAAA,GAA4B,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,SAAS,CAAA;AAGpE,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAM,UAAA,GAAa,UAAA,CAAW,SAAA,CAAU,IAAI,CAAA;AAC5C,YAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,cAAA,MAAM,eAAe,UAAA,CAAW,KAAA,CAAM,MAAA,CACnC,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,gBAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AACxE,gBAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,cACnC,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,cAAA,OAAO;AAAA,gBACL,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO,oCAAoC,YAAY,CAAA;AAAA,eACzD;AAAA,YACF;AAAA,UACF;AAGA,UAAA,KAAA,CAAM,MAAA,GAAS;AAAA,YACb,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,YACpB,IAAA;AAAA,YACA,OAAA,EAAS,CAAA;AAAA,YACT,SAAS;AAAC,WACZ;AAGA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAIvD,UAAA,MAAM,mBAAmB,KAAA,CAAM,eAAA;AAC/B,UAAA,KAAA,CAAM,eAAA,GAAkB,QAAA;AAIxB,UAAA,IAAI,MAAA;AACJ,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,UAAA,GACL,MAAO,MAAA,CAA8E,WAAA,EAAa,IAAI,CAAA,GACtG,MAAO,OAA+C,WAAW,CAAA;AAAA,UACvE,CAAA,SAAE;AAEA,YAAA,KAAA,CAAM,eAAA,GAAkB,gBAAA;AAAA,UAC1B;AAGA,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,KAAW,OAAA,GAAU,OAAA,GAAU,SAAA;AAErD,UAAA,IAAI,UAAA;AACJ,UAAA,IAAI,SAAA;AAGJ,UAAA,MAAM,UAAW,MAAA,CAAe,OAAA;AAChC,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,YAAA,MAAM,YAAY,OAAA,CACf,MAAA;AAAA,cACC,CAAC,SACC,IAAA,IACA,IAAA,CAAK,SAAS,MAAA,IACd,OAAO,KAAK,IAAA,KAAS;AAAA,aACzB,CACC,GAAA,CAAI,CAAC,IAAA,KAAc,KAAK,IAAc,CAAA;AAEzC,YAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,cAAA,UAAA,GAAa,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,YAClC;AAAA,UACF;AAGA,UAAA,IAAI,CAAC,UAAA,IAAe,MAAA,CAAe,MAAA,KAAW,KAAA,CAAA,EAAW;AACvD,YAAA,MAAM,MAAO,MAAA,CAAe,MAAA;AAC5B,YAAA,UAAA,GACE,OAAO,QAAQ,QAAA,GAAW,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,UAC/D;AAGA,UAAA,IAAI,OAAQ,MAAA,CAAe,KAAA,KAAU,QAAA,EAAU;AAC7C,YAAA,SAAA,GAAa,MAAA,CAAe,KAAA;AAAA,UAC9B;AAEA,UAAA,IAAI,MAAA,KAAW,OAAA,IAAW,CAAC,SAAA,EAAW;AAGpC,YAAA,SAAA,GAAY,UAAA;AAAA,UACd;AAEA,UAAA,OAAO;AAAA,YACL,MAAA;AAAA,YACA,MAAA,EAAQ,UAAA;AAAA,YACR,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,SAAA,GAAY,KAAA,CAAA;AAAA,YACxC,aAAa,MAAA,CAAO;AAAA,WACtB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,MAAM,aAAa,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,GAAQ,MAAA;AACzE,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,YAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,aAAqB,iBAAA,CACnB,IAAA,EACA,KAAA,EACA,aAAA,EACqB;AAGrB,QAAA,OAAO,MAAM,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,OAAO,aAAa,CAAA;AAAA,MACxE;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,yBAAA,CACnB,IAAA,EACA,KAAA,EACA,aAAA,EACqB;AACrB,QAAA,IAAI;AAEF,UAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AACpC,UAAA,IAAI,SAAA;AACJ,UAAA,IAAI,mBAAA;AAGJ,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,mBAAA,GAAsB,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,IAAA,GAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,IAAI,CAAA,CAAA;AAChH,YAAA,IAAI;AACF,cAAA,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,mBAAmB,CAAA;AACtE,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4CAAA,EAA+C,mBAAmB,CAAA,CAAE,CAAA;AAAA,YAClF,CAAA,CAAA,MAAQ;AAEN,cAAA,mBAAA,GAAsB,KAAK,QAAA,CAAS,IAAA;AACpC,cAAA,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,SAAS,UAAA,CAAW,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,YACvE;AAAA,UACF,CAAA,MAAO;AACL,YAAA,mBAAA,GAAsB,KAAK,QAAA,CAAS,IAAA;AACpC,YAAA,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,SAAS,UAAA,CAAW,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,UACvE;AAEA,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,UAChE;AAGA,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,SAAS,CAAA;AAG/C,UAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,YAAA,MAAM,UAAA,GAAa,SAAA,CAAU,cAAA,CAAe,SAAA,CAAU,IAAI,CAAA;AAC1D,YAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,cAAA,MAAM,eAAe,UAAA,CAAW,KAAA,CAAM,OACnC,GAAA,CAAI,CAAC,UAAe,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CAChE,KAAK,IAAI,CAAA;AACZ,cAAA,OAAO;AAAA,gBACL,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO,2CAA2C,YAAY,CAAA;AAAA,eAChE;AAAA,YACF;AAAA,UACF;AAGA,UAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AAClD,UAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA;AAAA,YAAK,CAAC,CAAA,KACzC,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,IAAA,GAAO,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS;AAAA,WAC9E;AACA,UAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,sBAAA,CAAuB,UAAU,CAAA;AAClE,UAAA,MAAM,uBAAA,GAA0B,qBAAqB,uBAAA,IAA2B,IAAA;AAChF,UAAA,MAAM,uBAAA,GAA0B,qBAAqB,uBAAA,IAA2B,IAAA;AAGhF,UAAA,MAAM,EAAE,UAAA,EAAAD,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAK7B,UAAA,MAAM,WAAA,GAAuC;AAAA,YAC3C,IAAI,SAAA,CAAU,IAAA;AAAA,YACd,OAAO,SAAA,CAAU,IAAA;AAAA,YACjB,IAAA,EAAM,UAAA;AAAA;AAAA,YACN,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA;AAAA,YAGrB,iBAAA,EAAmB,IAAA;AAAA;AAAA,YAGnB,YAAA,EAAc,IAAA;AAAA,YACd,mBAAA,EAAqB,mBAAA;AAAA;AAAA,YACrB,uBAAA,EAAyB,IAAA;AAAA,YACzB,gBAAA,EAAkB,IAAA;AAAA,YAClB,kCAAA,EAAoC,IAAA;AAAA,YACpC,gBAAA,EAAkB,IAAA;AAAA,YAClB,wBAAA,EAA0B,IAAA;AAAA,YAC1B,oCAAA,EAAsC,IAAA;AAAA,YACtC,wCAAA,EAA0C,IAAA;AAAA,YAC1C,wBAAA,EAA0B,IAAA;AAAA,YAC1B,oCAAA,EAAsC,IAAA;AAAA,YACtC,wCAAA,EAA0C,IAAA;AAAA,YAC1C,0BAAA,EAA4B,IAAA;AAAA,YAC5B,sCAAA,EAAwC,IAAA;AAAA,YACxC,0CAAA,EAA4C,IAAA;AAAA;AAAA,YAG5C,YAAA,EAAc,IAAA;AAAA,YACd,mBAAA,EAAqB,IAAA;AAAA,YACrB,uBAAA,EAAyB,IAAA;AAAA,YACzB,gBAAA,EAAkB,IAAA;AAAA,YAClB,kCAAA,EAAoC,IAAA;AAAA,YACpC,gBAAA,EAAkB,IAAA;AAAA,YAClB,wBAAA,EAA0B,IAAA;AAAA,YAC1B,oCAAA,EAAsC,IAAA;AAAA,YACtC,wCAAA,EAA0C,IAAA;AAAA,YAC1C,wBAAA,EAA0B,IAAA;AAAA,YAC1B,oCAAA,EAAsC,IAAA;AAAA,YACtC,wCAAA,EAA0C,IAAA;AAAA,YAC1C,0BAAA,EAA4B,IAAA;AAAA,YAC5B,sCAAA,EAAwC,IAAA;AAAA,YACxC,0CAAA,EAA4C;AAAA,WAC9C;AAGA,UAAA,IAAI,kBAAA;AACJ,UAAA,IAAI,sBAAA;AAEJ,UAAA,IAAI,uBAAA,IAA2B,IAAA,CAAK,uBAAuB,CAAA,KAAM,KAAA,CAAA,EAAW;AAE1E,YAAA,MAAM,aAAA,GAAgB,KAAK,uBAAuB,CAAA;AAClD,YAAA,kBAAA,GAAqB,OAAO,aAAA,KAAkB,QAAA,GAC1C,aAAA,GACA,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,UAClC;AAIA,UAAA,IAAI,uBAAA,IAA2B,IAAA,CAAK,uBAAuB,CAAA,KAAM,KAAA,CAAA,EAAW;AAC1E,YAAA,MAAM,eAAA,GAAkB,KAAK,uBAAuB,CAAA;AAGpD,YAAA,MAAM,kBAA4B,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,GAC3D,eAAA,GACA,CAAC,eAAe,CAAA;AAEpB,YAAA,sBAAA,GAAyB,EAAC;AAE1B,YAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAC5C,cAAA,IAAI,OAAO,cAAA,KAAmB,QAAA,IAAY,cAAA,CAAe,UAAA,CAAW,eAAe,CAAA,EAAG;AACpF,gBAAA,IAAI;AACF,kBAAA,MAAM,aAAa,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,SAAS,cAAc,CAAA;AACtE,kBAAA,IAAI,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,IAAA,EAAM;AACzC,oBAAA,sBAAA,CAAuB,IAAA,CAAK;AAAA,sBAC1B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,sBACtB,IAAA,EAAM,MAAA;AAAA,sBACN,IAAA,EAAM,cAAA;AAAA,sBACN,IAAA,EAAM,WAAW,IAAA,CAAK,IAAA;AAAA,sBACtB,QAAA,EAAU,WAAW,IAAA,CAAK,QAAA;AAAA,sBAC1B,IAAA,EAAM,WAAW,IAAA,CAAK,IAAA;AAAA,sBACtB,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAA,IAAS,KAAA,CAAA;AAAA,sBAChC,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,MAAA,IAAU,KAAA;AAAA,qBACnC,CAAA;AAAA,kBACH,CAAA,MAAO;AACL,oBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yCAAA,EAA4C,cAAc,CAAA,CAAA,CAAA,EAAK,WAAW,KAAK,CAAA;AAAA,kBAC/F;AAAA,gBACF,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4CAAA,EAA+C,cAAc,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,gBACnF;AAAA,cACF;AAAA,YACF;AAGA,YAAA,IAAI,sBAAA,CAAuB,WAAW,CAAA,EAAG;AACvC,cAAA,sBAAA,GAAyB,KAAA,CAAA;AAAA,YAC3B;AAAA,UACF;AAEA,UAAA,MAAM,gBAA2B,CAAC,GAAI,KAAA,CAAM,aAAA,IAAiB,EAAG,CAAA;AAChE,UAAA,IAAI,sBAAsB,sBAAA,EAAwB;AAChD,YAAA,aAAA,CAAc,IAAA,CAAK;AAAA,cACjB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,cACtB,IAAA,EAAM,MAAA;AAAA,cACN,SAAS,kBAAA,IAAsB,EAAA;AAAA,cAC/B,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAAA,cACzB,WAAA,EAAa,sBAAA,GAAyB,IAAA,CAAK,SAAA,CAAU,sBAAsB,CAAA,GAAI,KAAA;AAAA,aAChF,CAAA;AAAA,UACH;AAMA,UAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAgB,IAAA;AAC1C,UAAA,MAAM,qBAAA,GAAwB,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,aAAA,IAAiB,IAAA;AAE/E,UAAA,MAAM,MAAA,GAAS,MAAMA,WAAAA,CAAW,OAAA,CAAQ;AAAA,YACtC,WAAA,EAAa,WAAA;AAAA,YACb,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,KAAK,KAAA,CAAM,GAAA;AAAA;AAAA;AAAA,YAGX,QAAA,EAAU,KAAA,CAAM,SAAA,EAAW,QAAA,IAAY,KAAA,CAAM,QAAA;AAAA,YAC7C,QAAQ,KAAA,CAAM,MAAA;AAAA;AAAA;AAAA,YAEd,kBAAkB,KAAA,CAAM,gBAAA;AAAA,YACxB,OAAA,EAAS;AAAA,cACP,GAAG,IAAA;AAAA;AAAA;AAAA,cAEH,kBAAA,EAAoB,UAAA;AAAA,cACpB,gBAAA,EAAkB,KAAK,QAAA,CAAS;AAAA,aAClC;AAAA;AAAA,YAEA,MAAA,EAAQ,CAAA,OAAA,EAAU,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA;AAAA;AAAA,YAGzB,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,kBAAkB,KAAA,CAAM,gBAAA;AAAA;AAAA,YAExB,WAAA;AAAA;AAAA,YAEA,aAAA,EAAe,qBAAA;AAAA;AAAA,YAEf,WAAW,KAAA,CAAM,SAAA;AAAA;AAAA,YAEjB,eAAA,EAAiB,aAAA;AAAA;AAAA,YAEjB,KAAA,EAAO,MAAM,KAAA,GAAQ,CAAA;AAAA;AAAA,YAErB,YAAY,CAAC,GAAG,KAAA,CAAM,UAAA,EAAY,UAAU,IAAI,CAAA;AAAA;AAAA,YAEhD;AAAA,aACC,IAAI,CAAA;AAIP,UAAA,IAAI,mBAAA,GAAsB;AAAA,YACxB,qBAAA,EAAuB,IAAA;AAAA,YACvB,kBAAA,EAAoB,IAAA;AAAA,YACpB,cAAA,EAAgB;AAAA,WAClB;AAEA,UAAA,IAAI,mBAAA,EAAqB;AACvB,YAAA,mBAAA,GAAsB;AAAA,cACpB,qBAAA,EAAuB,oBAAoB,mBAAA,IAAuB,IAAA;AAAA,cAClE,kBAAA,EAAoB,oBAAoB,gBAAA,IAAoB,IAAA;AAAA,cAC5D,cAAA,EAAgB,oBAAoB,aAAA,IAAiB;AAAA,aACvD;AAAA,UACF;AAGA,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,SAAA,EAAU;AACvC,UAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,UAAA,IAAI,WAAA,GAAc,EAAA;AAElB,UAAA,IAAI;AACF,YAAA,OAAO,IAAA,EAAM;AACX,cAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,cAAA,IAAI,IAAA,EAAM;AACV,cAAA,WAAA,IAAe,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,YACvD;AAAA,UACF,CAAA,SAAE;AACA,YAAA,MAAA,CAAO,WAAA,EAAY;AAAA,UACrB;AAGA,UAAA,MAAM,uBAAA,GAA0B,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,YACtD,CAAA,uGAAA,CAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,MAAM,aAAA,GAAgB,wBAAwB,OAAA,EAAQ;AAGtD,UAAA,MAAM,0BAAA,GAA6B,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,YACzD,CAAA,uGAAA,CAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,MAAM,uBAAA,GAA0B,2BAA2B,OAAA,EAAQ;AAInE,UAAA,MAAM,uBAAwC,EAAC;AAC/C,UAAA,KAAA,MAAW,OAAO,uBAAA,EAAyB;AACzC,YAAA,IAAI,IAAI,WAAA,EAAa;AACnB,cAAA,IAAI;AACF,gBAAA,MAAM,IAAA,GAAwB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAqB,CAAA;AAClE,gBAAA,oBAAA,CAAqB,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,cACnC,SAAS,CAAA,EAAG;AACV,gBAAA,OAAA,CAAQ,KAAA,CAAM,0DAA0D,CAAC,CAAA;AAAA,cAC3E;AAAA,YACF;AAAA,UACF;AAGA,UAAA,IAAI,aAAA,GAAqC,SAAA;AACzC,UAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,YAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,WAAqB,CAAA;AACnE,YAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,MAAM,OAAO,CAAA;AAGjD,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,aAAA,GAAgB,OAAA;AAAA,YAClB;AAAA,UACF;AAGA,UAAA,MAAM,gBAA0B,EAAC;AAEjC,UAAA,IAAI,kBAAkB,OAAA,EAAS;AAI7B,YAAA,MAAM,cAAwD,EAAC;AAC/D,YAAA,MAAM,sBAAgC,EAAC;AAEvC,YAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,cAAA,MAAM,QAAA,GAAY,IAAI,IAAA,IAAmB,cAAA;AACzC,cAAA,MAAM,OAAA,GAAU,IAAI,WAAA,KAAgB,OAAA;AAEpC,cAAA,IAAI,OAAA,EAAS;AACX,gBAAA,WAAA,CAAY,IAAA,CAAK;AAAA,kBACf,IAAA,EAAM,QAAA;AAAA,kBACN,SAAS,GAAA,CAAI;AAAA,iBACd,CAAA;AAAA,cACH,CAAA,MAAO;AACL,gBAAA,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA,cACnC;AAAA,YACF;AAGA,YAAA,IAAI,mBAAA,CAAoB,cAAA,IAAkB,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAChE,cAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,CAAA,IAAA,KAAQ;AAEzC,gBAAA,IAAI,WAAW,IAAA,CAAK,OAAA;AACpB,gBAAA,IAAI,QAAA,CAAS,UAAA,CAAW,0BAA0B,CAAA,EAAG;AACnD,kBAAA,QAAA,GAAW,QAAA,CAAS,SAAA,CAAU,0BAAA,CAA2B,MAAM,CAAA;AAAA,gBACjE;AACA,gBAAA,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA;AAAA,cACpC,CAAC,CAAA;AAED,cAAA,aAAA,CAAc,IAAA,CAAK,CAAA,uBAAA,EAA0B,WAAA,CAAY,MAAM,CAAA;AAAA,EAAe,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,YACvG;AAGA,YAAA,IAAI,mBAAA,CAAoB,kBAAA,IAAsB,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AAC5E,cAAA,aAAA,CAAc,KAAK,CAAA,iBAAA,EAAoB,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,YACzE;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,IAAI,mBAAA,CAAoB,yBAAyB,WAAA,EAAa;AAC5D,cAAA,aAAA,CAAc,KAAK,WAAW,CAAA;AAAA,YAChC;AAEA,YAAA,IAAI,mBAAA,CAAoB,kBAAA,IAAsB,mBAAA,CAAoB,cAAA,EAAgB;AAEhF,cAAA,MAAM,4BAAA,GAA+B,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,gBAC3D,CAAA,yGAAA,CAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,MAAM,kBAAA,GAAqB,6BAA6B,OAAA,EAAQ;AAEhE,cAAA,MAAM,mBAA6B,EAAC;AAGpC,cAAA,IAAI,mBAAA,CAAoB,kBAAA,IAAsB,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AAC3E,gBAAA,KAAA,MAAW,OAAO,kBAAA,EAAoB;AACpC,kBAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAoB,CAAA;AACrD,kBAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,oBAAA,gBAAA,CAAiB,IAAA;AAAA,sBACf,cAAc,EAAA,CAAG,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,SAAS,SAAS,CAAA,CAAA;AAAA,qBACzD;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAGA,cAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,gBAAA,MAAM,OAAA,GAAW,GAAA,CAAI,OAAA,EAAoB,UAAA,CAAW,SAAS,CAAA;AAG7D,gBAAA,IAAK,WAAW,mBAAA,CAAoB,cAAA,IAC/B,CAAC,OAAA,IAAW,oBAAoB,kBAAA,EAAqB;AACxD,kBAAA,gBAAA,CAAiB,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,gBACvD;AAAA,cACF;AAEA,cAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,gBAAA,aAAA,CAAc,IAAA;AAAA,kBACZ,oBAAA,GAAuB,gBAAA,CAAiB,IAAA,CAAK,IAAI;AAAA,iBACnD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAM,gBAAgB,aAAA,CAAc,MAAA,GAAS,IACzC,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA,GACzB,8BAAA;AAEJ,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,aAAA;AAAA,YACR,MAAA,EAAQ,aAAA,KAAkB,SAAA,GAAY,aAAA,GAAgB,KAAA,CAAA;AAAA,YACtD,KAAA,EAAO,aAAA,KAAkB,OAAA,GAAU,aAAA,GAAgB,KAAA,CAAA;AAAA,YACnD,WAAA,EAAa,oBAAA,CAAqB,MAAA,GAAS,CAAA,GAAI,oBAAA,GAAuB,KAAA;AAAA,WACxE;AAAA,QACF,SAAS,KAAA,EAAO;AAEd,UAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AAClD,UAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA;AAAA,YAAK,CAAC,CAAA,KACzC,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,IAAA,GAAO,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS;AAAA,WAC9E;AACA,UAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,sBAAA,CAAuB,UAAU,CAAA;AAElE,UAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,UAAA,IAAI,mBAAA,EAAqB;AACvB,YAAA,aAAA,GAAgB,oBAAoB,aAAA,IAAiB,IAAA;AAAA,UACvD;AAEA,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,MAAM,aAAa,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,GAAQ,MAAA;AAGzE,UAAA,MAAM,cAAA,GAAiB,aAAA,GACnB,CAAA,OAAA,EAAU,YAAY,CAAA,CAAA,GACtB,8BAAA;AAEJ,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,cAAA;AAAA,YACP,KAAA,EAAO,gBAAgB,UAAA,GAAa;AAAA,WACtC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAqB,gBAAA,CACnB,IAAA,EACA,KAAA,EACqB;AACrB,QAAA,IAAI;AACF,UAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,wBAAA,CAAyB,IAAA,CAAK,SAAS,IAAI,CAAA;AAC9E,UAAA,IAAI,0BAA0B,SAAA,EAAW;AACvC,YAAA,OAAO,MAAM,IAAA,CAAK,0BAAA,CAA2B,IAAA,EAAM,KAAK,CAAA;AAAA,UAC1D;AACA,UAAA,MAAM,UAAA,GACJ,0BAA0B,QAAA,GACtB,IAAA,CAAK,wBAAwB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,GACpD,IAAA;AACN,UAAA,IAAI,YAAY,KAAA,EAAO;AACrB,YAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,UACpD;AACA,UAAA,MAAM,uBAAuB,UAAA,EAAY,KAAA;AACzC,UAAA,MAAM,uBAAuB,UAAA,EAAY,OAAA;AACzC,UAAA,MAAM,+BAA+B,UAAA,EAAY,WAAA;AACjD,UAAA,MAAM,iBAAA,GAAoB,oBAAA,IAAwB,IAAA,CAAK,QAAA,CAAS,IAAA;AAGhE,UAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AAIpC,UAAA,IAAI,QAAA,GAAgB,IAAA;AACpB,UAAA,IAAI,SAAA,GAAY,iBAAA;AAEhB,UAAA,IAAI,qBAAA,KAA0B,YAAY,oBAAA,EAAsB;AAC9D,YAAA,MAAM,kBAAA,GAAqB,MAAM,IAAA,CAAK,sBAAA,CAAuB,KAAK,CAAA;AAClE,YAAA,IAAI,CAAC,kBAAA,CAAmB,QAAA,CAAS,oBAAoB,CAAA,EAAG;AACtD,cAAA,OAAO;AAAA,gBACL,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO,aAAa,oBAAoB,CAAA,gDAAA,EAAmD,mBAAmB,IAAA,CAAK,IAAI,KAAK,QAAQ,CAAA,CAAA;AAAA,eACtI;AAAA,YACF;AAAA,UACF;AAGA,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI;AACF,cAAA,MAAM,aAAA,GAAgB,UAAU,QAAA,CAAS,GAAG,IAAI,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACrF,cAAA,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,aAAa,CAAA;AAC9D,cAAA,SAAA,GAAY,aAAA;AACZ,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uCAAA,EAA0C,aAAa,CAAA,CAAE,CAAA;AAAA,YACvE,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAGA,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,IAAI;AACF,cAAA,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,SAAS,CAAA;AAAA,YAC5D,CAAA,CAAA,MAAQ;AAEN,cAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,aAAA,EAAc;AACvD,cAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,gBAAA,IAAI;AACF,kBAAA,MAAM,MAAM,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,IAAI,CAAA;AACtD,kBAAA,IAAI,GAAA,CAAI,KAAA,KAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM;AACpC,oBAAA,QAAA,GAAW,GAAA;AACX,oBAAA,SAAA,GAAY,IAAA;AACZ,oBAAA;AAAA,kBACF;AAAA,gBACF,CAAA,CAAA,MAAQ;AAAA,gBAER;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,UAC/D;AAEA,UAAA,MAAM,YAAY,QAAA,CAAS,IAAA;AAC3B,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,SAAS,SAAS,CAAA;AAC/D,UAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,wBAAA,CAAyB,KAAA,EAAO,MAAM,OAAO,CAAA;AAC5E,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,wBAAA,CAAyB,OAAO,CAAA;AAGlD,UAAA,IAAI,cAAc,UAAA,EAAY;AAE5B,YAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AAClD,YAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA;AAAA,cAAK,CAAC,MACzC,OAAO,CAAA,KAAM,WAAW,CAAA,KAAM,SAAA,GAAY,EAAE,IAAA,KAAS;AAAA,aACvD;AACA,YAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,sBAAA,CAAuB,UAAU,CAAA;AAKlE,YAAA,MAAM,WAAA,GAAc,MAAM,SAAA,IAAa,KAAA;AACvC,YAAA,WAAA,CAAY,cAAA,GAAiB;AAAA,cAC3B,OAAA,EAAS,SAAA;AAAA,cACT,IAAA;AAAA,cACA,YAAY,mBAAA,GACR;AAAA,gBACE,yBAAyB,mBAAA,CAAoB,uBAAA;AAAA,gBAC7C,yBAAyB,mBAAA,CAAoB;AAAA,eAC/C,GACA,KAAA;AAAA,aACN;AACA,YAAA,MAAM,IAAA,GAAO,kBAAA;AAGb,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,SAAA;AAAA,cACR,MAAA,EAAQ;AAAA,aACV;AAAA,UACF;AAEA,UAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAE,CAAA;AAAA,UACxD;AAEA,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,iBAAiB,CAAA;AAC9E,UAAA,MAAM,QAAA,GAAW,eAAe,QAAA,IAAY,IAAA;AAC5C,UAAA,MAAM,0BAA0B,cAAA,CAAe,uBAAA;AAC/C,UAAA,MAAM,0BAA0B,cAAA,CAAe,uBAAA;AAC/C,UAAA,MAAM,wBAAwB,cAAA,CAAe,qBAAA;AAC7C,UAAA,MAAM,SAAA,GACJ,eAAe,SAAA,IAAa,OAAO,eAAe,SAAA,KAAc,QAAA,GAC5D,eAAe,SAAA,GACf,IAAA;AACN,UAAA,MAAM,gBAAA,GAAmB,WAAW,iBAAA,IAAqB,QAAA;AACzD,UAAA,MAAM,eAAe,SAAA,EAAW,YAAA;AAChC,UAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,0BAAA,CAA2B,cAAc,CAAA;AAC1E,UAAA,MAAM,oBAAA,GACJ,qBAAA,KAA0B,QAAA,GAAW,UAAA,EAAY,IAAA,GAAO,IAAA;AAC1D,UAAA,MAAM,mBACJ,qBAAA,KAA0B,QAAA,GACtB,KAAK,mBAAA,CAAoB,oBAAoB,IAC7C,IAAA,CAAK,uBAAA;AAAA,YACH,IAAA;AAAA,YACA,qBAAA;AAAA,YACA;AAAA,WACF;AACN,UAAA,MAAM,qBAAA,GACJ,qBAAA,KAA0B,QAAA,GACrB,oBAAA,GACD,IAAA,CAAK,+BAAA;AAAA,YACH,IAAA;AAAA,YACA;AAAA,WACF;AACN,UAAA,MAAM,yBAAA,GACJ,qBAAA,KAA0B,QAAA,GACtB,MAAM,IAAA,CAAK,8BAAA;AAAA,YACT,KAAA;AAAA,YACA;AAAA,WACF,GACA,MAAM,IAAA,CAAK,4BAAA;AAAA,YACT,KAAA;AAAA,YACA,IAAA;AAAA,YACA;AAAA,WACF;AAEN,UAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAC7D,UAAA,MAAM,kBAAkB,gBAAA,CAAiB,MAAA;AAAA,YACvC,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,KAAS,iBAAA,IAAqB,MAAM,MAAA,KAAW;AAAA,WAClE;AAEA,UAAA,IACE,OAAO,YAAA,KAAiB,QAAA,IACxB,eAAe,CAAA,IACf,eAAA,CAAgB,UAAU,YAAA,EAC1B;AACA,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,OAAO;AAAA,gBACL,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO,CAAA,qCAAA,EAAwC,iBAAiB,CAAA,GAAA,EAAM,YAAY,CAAA,EAAA;AAAA,eACpF;AAAA,YACF;AAEA,YAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,cAAA,OAAO;AAAA,gBACL,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO,yDAAyD,iBAAiB,CAAA,EAAA;AAAA,eACnF;AAAA,YACF;AAEA,YAAA,MAAM,UAAA,GAAa,gBAAgB,GAAA,CAAI,CAAC,UAAU,KAAA,CAAM,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC5E,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,OAAA;AAAA,cACR,KAAA,EACE,wCAAwC,iBAAiB,CAAA,GAAA,EAAM,YAAY,CAAA,OAAA,EACpE,qBAAqB,2DACN,UAAU,CAAA,CAAA;AAAA,aACpC;AAAA,UACF;AAEA,UAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACrE,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC/D,UAAA,MAAM,mBACJ,OAAO,YAAA,CAAa,wCAAwC,UAAA,GACxD,MAAM,aAAa,mCAAA,CAAoC;AAAA,YACrD,kBAAkB,KAAA,CAAM,QAAA;AAAA,YACxB,UAAA,EAAY,SAAA;AAAA,YACZ,YAAA,EAAc;AAAA,WACf,IACD,EAAC;AACP,UAAA,IAAI,MAAM,OAAA,CAAQ,gBAAgB,CAAA,IAAK,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAClE,YAAA,IAAI,OAAO,YAAA,CAAa,+BAAA,KAAoC,UAAA,EAAY;AACtE,cAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,YACjF;AAEA,YAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,+BAAA,CAAgC;AAAA,cACjE,kBAAkB,KAAA,CAAM,QAAA;AAAA,cACxB,UAAA,EAAY,SAAA;AAAA,cACZ,mBAAA,EAAqB,iBAAA;AAAA,cACrB,kBAAA,EAAoB,gBAAA;AAAA,cACpB,iBAAA,EAAmB,gBAAA;AAAA,cACnB,OAAA,EAAS;AAAA,gBACP,QAAA;AAAA,gBACA,SAAA,EAAW,CAAC,CAAC,SAAA;AAAA,gBACb,iBAAA,EAAmB,gBAAA;AAAA,gBACnB,oBAAA,EAAsB,mBAAA;AAAA,gBACtB,uBAAA,EAAyB,qBAAA;AAAA,gBACzB,2BAAA,EAA6B,yBAAA,CAA0B,GAAA,CAAI,CAAC,UAAA,MAAgB;AAAA,kBAC1E,MAAM,UAAA,CAAW,IAAA;AAAA,kBACjB,MAAM,UAAA,CAAW,IAAA;AAAA,kBACjB,UAAU,UAAA,CAAW,QAAA;AAAA,kBACrB,MAAM,UAAA,CAAW,IAAA;AAAA,kBACjB,OAAO,UAAA,CAAW,KAAA;AAAA,kBAClB,QAAQ,UAAA,CAAW;AAAA,iBACrB,CAAE,CAAA;AAAA,gBACF,kBAAA,EAAoB,gBAAA;AAAA,gBACpB,WAAA,EAAa,SAAS,KAAA,IAAS,iBAAA;AAAA,gBAC/B,mBACE,QAAA,CAAS,eAAA,IACT,CAAA,oBAAA,EAAuB,QAAA,CAAS,SAAS,iBAAiB,CAAA,CAAA;AAAA,gBAC5D,cAAA,EAAgB,MAAM,gBAAA,IAAoB;AAAA;AAC5C,aACD,CAAA;AACD,YAAA,MAAM,SAAA,GACJ,WAAW,OAAO,OAAA,CAAQ,eAAe,QAAA,GACrC,OAAA,CAAQ,UAAA,GACR,MAAA,CAAO,UAAA,EAAW;AACxB,YAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,KAAA,CAAM,QAAQ,cAAc,SAAS,CAAA,CAAA;AAEtE,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,OAAA;AAAA,cACR,KAAA,EACE,CAAA,UAAA,EAAa,iBAAiB,CAAA,0GAAA,EACa,QAAQ,CAAA,CAAA,CAAA;AAAA,cACrD,UAAA,EAAY,uBAAA;AAAA,cACZ,UAAA,EAAY;AAAA,gBACV,UAAA,EAAY,SAAA;AAAA,gBACZ,QAAA;AAAA,gBACA,QAAA,EACE,WAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,QAAQ,CAAA,GACrC,QAAQ,QAAA,GACR,gBAAA;AAAA,gBACN,OAAA,EACE,WAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,OAAO,CAAA,GACpC,QAAQ,OAAA,GACR,gBAAA;AAAA,gBACN,KAAA,EAAO;AAAA;AACT,aACF;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,YAClD,UAAA,EAAY,SAAA;AAAA,YACZ,QAAQ,KAAA,CAAM,QAAA;AAAA,YACd,KAAK,iBAAA,IAAqB,KAAA,CAAA;AAAA,YAC1B,MAAM,gBAAA,GACF,CAAC,KAAK,kBAAA,CAAmB,gBAAgB,CAAC,CAAA,GAC1C,KAAA;AAAA,WACL,CAAA;AACD,UAAA,MAAM,gBAAgB,WAAA,CAAY,EAAA;AAElC,UAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,WAAW,aAAa,CAAA;AACzE,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,IAAI,SAAS,CAAA;AAEzD,UAAA,IAAI;AACF,YAAA,MAAM,EAAE,UAAA,EAAAA,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC7B,YAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,kBAAA,CAAmB,IAAA,EAAa;AAAA,cACjE,EAAA,EAAI,aAAA;AAAA,cACJ,QAAA,EAAU,SAAA;AAAA,cACV,OAAA,EAAS,YAAY,OAAA,IAAW,IAAA;AAAA,cAChC,GAAA,EAAM,WAAA,CAAY,GAAA,IAAO,WAAA,CAAY,KAAA,IAAS,IAAA;AAAA,cAC9C,SAAA,EAAW,YAAY,SAAA,IAAa,IAAA;AAAA,cACpC,KAAA,EAAO,YAAY,KAAA,IAAS,IAAA;AAAA,cAC5B,UAAA,EAAY,YAAY,UAAA,IAAc,IAAA;AAAA,cACtC,MAAA,EAAQ,WAAA,CAAY,MAAA,IAAU,KAAA,CAAM,QAAA;AAAA,cACpC,UAAA,EAAY,YAAY,UAAA,IAAc,IAAA;AAAA,cACtC,UAAA,EAAY,YAAY,UAAA,IAAc,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,aACnE,CAAA;AACD,YAAA,MAAMA,WAAAA,CAAW,2BAAA,CAA4B,KAAA,EAAO,UAAU,CAAA;AAAA,UAChE,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,6DAAwD,KAAK,CAAA;AAAA,UAC7E;AAEA,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,4BAAA;AAAA,YACjC,KAAA;AAAA,YACA,IAAA;AAAA,YACA,qBAAA;AAAA,YACA,gBAAA;AAAA,YACA;AAAA,WACF;AAEA,UAAA,MAAM,IAAA,CAAK,oBAAoB,KAAA,EAAO;AAAA,YACpC,SAAA,EAAW,aAAA;AAAA,YACX,IAAA,EAAM,iBAAA;AAAA,YACN,KAAA,EAAO,SAAS,KAAA,IAAS,iBAAA;AAAA,YACzB,aACE,QAAA,CAAS,eAAA,IACT,CAAA,oBAAA,EAAuB,QAAA,CAAS,SAAS,iBAAiB,CAAA,CAAA;AAAA,YAC5D,SAAA,EAAW,CAAC,CAAC,SAAA;AAAA,YACb,QAAA;AAAA,YACA,GAAI,SAAA,GAAY,EAAE,mBAAA,KAAwB,EAAC;AAAA,YAC3C,MAAA,EAAQ,SAAA;AAAA,YACR,GAAI,gBAAA,GAAmB,EAAE,UAAA,EAAY,gBAAA,KAAqB,EAAC;AAAA,YAC3D,GAAI,MAAM,gBAAA,GAAmB,EAAE,cAAc,KAAA,CAAM,gBAAA,KAAqB,EAAC;AAAA,YACzE,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,WACzB,CAAA;AAED,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA;AAAA,cAC7B,aAAA;AAAA,cACA,SAAA;AAAA,cACA,eAAA;AAAA,cACA;AAAC,aACH;AAEA,YAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,6BAAA;AAAA,cACnC,IAAA;AAAA,cACA,MAAM,MAAA,CAAO,QAAA;AAAA,cACb,WAAA,CAAY,WAAA;AAAA,cACZ,iBAAiB,aAAa,CAAA;AAAA,aAChC;AAEA,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,IAAA,CAAK,4BAAA;AAAA,gBACT,KAAA;AAAA,gBACA,IAAA;AAAA,gBACA,aAAA;AAAA,gBACA;AAAA,eACF;AAAA,YACF,CAAA,MAAA,IAAW,KAAK,eAAA,EAAiB;AAC/B,cAAA,MAAM,IAAA,CAAK,gBAAgB,aAAa,CAAA;AAAA,YAC1C;AAEA,YAAA,MAAM,UAAA,GAAyB;AAAA,cAC7B,QAAQ,WAAA,CAAY,MAAA;AAAA,cACpB,QAAQ,WAAA,CAAY,MAAA;AAAA,cACpB,OAAO,WAAA,CAAY,KAAA;AAAA,cACnB,WAAA,EAAa,iBAAA;AAAA,cACb,WAAA,EAAa;AAAA,aACf;AAEA,YAAA,OAAO,SAAA,IAAa,CAAC,IAAA,CAAK,wBAAA,CAAyB,WAAW,IAC1D,IAAA,CAAK,yBAAA,CAA0B,UAAA,EAAY,aAAa,CAAA,GACxD,UAAA;AAAA,UACN;AAGA,UAAA,KAAA,CAAM,YAAY;AAChB,YAAA,IAAI;AACF,cAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA;AAAA,gBAC7B,aAAA;AAAA,gBACA,SAAA;AAAA,gBACA,eAAA;AAAA,gBACA;AAAC,eACH;AAEA,cAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,6BAAA;AAAA,gBACnC,IAAA;AAAA,gBACA,MAAM,MAAA,CAAO,QAAA;AAAA,gBACb,WAAA,CAAY,WAAA;AAAA,gBACZ,iBAAiB,aAAa,CAAA;AAAA,eAChC;AAEA,cAAA,MAAM,iBAAiB,IAAA,CAAK,6BAAA;AAAA,gBAC1B,aAAA;AAAA,gBACA,WAAA,CAAY,MAAA;AAAA,gBACZ,WAAA,CAAY,MAAA;AAAA,gBACZ,WAAA,CAAY,KAAA;AAAA,gBACZ;AAAA,eACF;AAEA,cAAA,IAAI,wBAAwB,UAAA,EAAY;AACtC,gBAAA,MAAM,IAAA,CAAK,0BAAA;AAAA,kBACT,KAAA;AAAA,kBACA,aAAA;AAAA,kBACA,cAAA;AAAA,kBACA;AAAA,iBACF;AAAA,cACF;AAEA,cAAA,IAAI,SAAA,EAAW;AACb,gBAAA,MAAM,IAAA,CAAK,4BAAA;AAAA,kBACT,KAAA;AAAA,kBACA,IAAA;AAAA,kBACA,aAAA;AAAA,kBACA;AAAA,iBACF;AAAA,cACF,CAAA,MAAA,IAAW,KAAK,eAAA,EAAiB;AAC/B,gBAAA,MAAM,IAAA,CAAK,gBAAgB,aAAa,CAAA;AAAA,cAC1C;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,qEAAqE,KAAK,CAAA;AACxF,cAAA,IAAI,SAAA,EAAW;AACb,gBAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,aAAA,EAAe,MAAM,CAAA;AAAA,cAC3D;AAAA,YACF;AAAA,UACF,CAAA,GAAG;AAEH,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,SAAA;AAAA,YACR,MAAA,EAAQ,SAAA,GACJ,CAAA,oDAAA,EAAuD,aAAa,CAAA,CAAA,GACpE,mFAAA;AAAA,YACJ,WAAA,EAAa;AAAA,WACf;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,MAAM,aAAa,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,GAAQ,MAAA;AACzE,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,YAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAe,mBAAmB,GAAA,EAAsC;AACtE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,UAAA,OAAO,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,GAAO,SAAS,EAAC;AAAA,QACnE,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA,MAEA,OAAe,yBACb,IAAA,EACyB;AACzB,QAAA,IAAI,EAAE,gCAAgC,IAAA,CAAA,EAAO;AAC3C,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,IAAA,GAAgC,EAAE,GAAG,IAAA,EAAK;AAChD,QAAA,OAAO,KAAK,4BAA4B,CAAA;AACxC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,OAAe,wBAAA,CACb,KAAA,EACA,MAAA,EAC+B;AAC/B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,+BAA+B,CAAA;AACzD,QAAA,IAAI,CAAC,OAAO,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzD,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,QAAA,GAAW,GAAA;AACjB,QAAA,MAAM,KAAA,GAAQ,SAAS,MAAM,CAAA;AAC7B,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,SAAS,MAAM,CAAA;AACtB,QAAA,MAAM,aAAqC,EAAC;AAC5C,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC5E,UAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,UAAA,IAAI,CAAC,GAAA,EAAK;AACV,UAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAC3C,UAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,UAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,UAAA,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA;AAAA,QACpB;AAEA,QAAA,OAAO,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,IAAA;AAAA,MAC3D;AAAA,MAEA,OAAe,wBAAA,CACb,KAAA,EACA,IAAA,EACA,IAAA,EAC+B;AAC/B,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,wBAAA,CAAyB,KAAA,EAAO,KAAK,EAAE,CAAA;AAChE,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,MAAM,GAAA,GAAM,KAAK,4BAA4B,CAAA;AAC7C,QAAA,IAAI,CAAC,OAAO,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzD,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,aAAqC,EAAC;AAC5C,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AAC1E,UAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,UAAA,IAAI,CAAC,GAAA,EAAK;AACV,UAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAC3C,UAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,UAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,UAAA,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA;AAAA,QACpB;AAEA,QAAA,OAAO,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,IAAA;AAAA,MAC3D;AAAA,MAEA,OAAe,yBACb,QAAA,EAC6B;AAC7B,QAAA,IAAI,aAAa,oBAAA,EAAsB;AACrC,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,IACE,QAAA,KAAa,qBAAA,IACb,QAAA,KAAa,yBAAA,EACb;AACA,UAAA,OAAO,SAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,OAAe,wBAAwB,GAAA,EAMrC;AACA,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AACxC,QAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA,CAAM,MAAK,GAAI,EAAA;AACnE,QAAA,MAAM,UAAU,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU,EAAA;AAClE,QAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AACzB,QAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,IAAA,KAAS,WAAW,IAAA,CAAK,IAAA,CAAK,MAAK,GAAI,EAAA;AAEhE,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,OAAO;AAAA,YACL,KAAA,EAAO,EAAA;AAAA,YACP,OAAA;AAAA,YACA,WAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA,EAAO,GAAG,oBAAoB,CAAA,gBAAA;AAAA,WAChC;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG;AACnB,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,OAAA;AAAA,YACA,WAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA,EAAO,GAAG,oBAAoB,CAAA,kBAAA;AAAA,WAChC;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/B,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,OAAA;AAAA,YACA,WAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA,EAAO,GAAG,oBAAoB,CAAA,yCAAA;AAAA,WAChC;AAAA,QACF;AAEA,QAAA,IAAI,KAAK,IAAA,KAAS,MAAA,IAAa,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AAC5D,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,OAAA;AAAA,YACA,WAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA,EAAO,GAAG,oBAAoB,CAAA,qCAAA;AAAA,WAChC;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,OAAA;AAAA,YACA,WAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA,EAAO,GAAG,oBAAoB,CAAA,eAAA;AAAA,WAChC;AAAA,QACF;AAEA,QAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,IAAA,EAAK;AAAA,MAC7C;AAAA,MAEA,OAAe,uBAAuB,MAAA,EAAyC;AAC7E,QAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IACE,qBAAA,IAAyB,UACzB,kBAAA,IAAsB,MAAA,IACtB,mBAAmB,MAAA,IACnB,yBAAA,IAA6B,MAAA,IAC7B,yBAAA,IAA6B,MAAA,EAC7B;AACA,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,OAAe,yBAAA,CACb,KAAA,EACA,SAAA,EACoB;AACpB,QAAA,MAAM,MAAA,GAAA,CAAU,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG,IAAA;AAAA,UAAK,CAAC,SAC/C,OAAO,IAAA,KAAS,WAAW,IAAA,KAAS,SAAA,GAAY,KAAK,IAAA,KAAS;AAAA,SAChE;AAEA,QAAA,IACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,KAET,UAAA,IAAc,UACd,WAAA,IAAe,MAAA,IACf,WAAA,IAAe,MAAA,IACf,cAAc,MAAA,IACd,yBAAA,IAA6B,UAC7B,yBAAA,IAA6B,MAAA,IAC7B,2BAA2B,MAAA,CAAA,EAE7B;AACA,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAAA,MAC3B;AAAA,MAEA,OAAe,2BACb,cAAA,EACyB;AACzB,QAAA,MAAM,SAAA,GACJ,eAAe,SAAA,IAAa,OAAO,eAAe,SAAA,KAAc,QAAA,GAC5D,eAAe,SAAA,GACf,IAAA;AACN,QAAA,OAAO,SAAA,EAAW,mBAAA,KAAwB,UAAA,GAAa,UAAA,GAAa,UAAA;AAAA,MACtE;AAAA,MAEA,aAAqB,oBACnB,KAAA,EACuC;AACvC,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,mBAAA,EAAqB;AAC7C,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,mBAAA,CAAoB,MAAM,QAAQ,CAAA;AAAA,QACjE;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,UACrC,CAAA,yEAAA;AAAA,SACF;AACA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS,IAAA;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,UAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,SAA0C,EAAC;AAAA,QAC7E,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA,MAEA,aAAqB,mBAAA,CACnB,KAAA,EACA,KAAA,EACe;AACf,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,mBAAA,EAAqB;AAC7C,UAAA,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,mBAAA,CAAoB,KAAA,CAAM,UAAU,KAAK,CAAA;AACrE,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AACrD,QAAA,MAAM,IAAA,GAAO,SAAS,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,SAAA,KAAc,MAAM,SAAS,CAAA;AACzE,QAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB,CAAA,oEAAA,CAAA;AAAA,UACA,IAAA,CAAK,UAAU,IAAI;AAAA,SACrB;AAAA,MACF;AAAA,MAEA,aAAqB,iBAAA,CACnB,KAAA,EACA,SAAA,EACA,MAAA,EACe;AACf,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,yBAAA,EAA2B;AACnD,UAAA,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,0BAA0B,KAAA,CAAM,QAAA,EAAU,WAAW,MAAM,CAAA;AACvF,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AACrD,QAAA,MAAM,OAAO,QAAA,CAAS,GAAA;AAAA,UAAI,CAAC,UACzB,KAAA,CAAM,SAAA,KAAc,YAAY,EAAE,GAAG,KAAA,EAAO,MAAA,EAAO,GAAI;AAAA,SACzD;AACA,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB,CAAA,oEAAA,CAAA;AAAA,UACA,IAAA,CAAK,UAAU,IAAI;AAAA,SACrB;AAAA,MACF;AAAA,MAEA,OAAe,yBAAyB,MAAA,EAAyC;AAC/E,QAAA,OAAO,OAAO,QAAA,KAAa,IAAA;AAAA,MAC7B;AAAA,MAEA,aAAqB,4BAAA,CACnB,KAAA,EACA,WAAA,EACA,WACA,MAAA,EACe;AACf,QAAA,IAAI,CAAC,IAAA,CAAK,wBAAA,CAAyB,MAAM,CAAA,EAAG;AAC1C,UAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA;AACrD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,YAAY,CAAA;AAC3D,QAAA,IAAI,OAAO,WAAA,CAAY,eAAA,KAAoB,UAAA,EAAY;AACrD,UAAA,MAAM,WAAA,CAAY,gBAAgB,SAAS,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA,MAEA,aAAqB,4BAAA,CACnB,KAAA,EACA,WAAA,EAUA,OAAA,EACA,kBACA,iBAAA,EACoB;AACpB,QAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,6BAAA;AAAA,UACnC,MAAM,MAAA,CAAO,QAAA;AAAA,UACb,WAAA;AAAA,UACA,iBAAA;AAAA,UACA,CAAA,YAAA,EAAe,MAAM,QAAQ,CAAA;AAAA,SAC/B;AAEA,QAAA,MAAM,UAAA,GAAa,gBAAA,KAAqB,QAAA,GAAW,MAAA,GAAS,WAAA;AAC5D,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AACnC,QAAA,MAAM,WAAsB,EAAC;AAI7B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAA,EAAK;AACjD,UAAA,MAAM,UAAA,GAAa,kBAAkB,CAAC,CAAA;AACtC,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,YACtB,IAAA,EAAM,UAAA;AAAA,YACN,OAAA,EAAS,CAAA,+BAAA,EAAkC,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,YAC1D,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,CAAC,UAAU,CAAC,CAAA;AAAA,YACxC,MAAA,EAAQ,IAAA;AAAA,YACR,YAAY,aAAA,GAAgB;AAAA,WAC7B,CAAA;AAAA,QACH;AAEA,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,UACtB,IAAA,EAAM,UAAA;AAAA,UACN,OAAA;AAAA;AAAA;AAAA,UAGA,WAAA,EAAa,MAAA;AAAA,UACb,UAAA,EAAY,gBAAgB,iBAAA,CAAkB;AAAA,SAC/C,CAAA;AAED,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MAEA,OAAe,yBAAA,CACb,MAAA,EACA,WAAA,EACY;AACZ,QAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW;AAC/B,UAAA,MAAME,cAAAA,GAAgB,MAAA,CAAO,MAAA,GACzB,CAAA,EAAG,OAAO,MAAM;;AAAA,WAAA,EAAkB,WAAW,CAAA,CAAA,GAC7C,CAAA,WAAA,EAAc,WAAW,CAAA,CAAA;AAC7B,UAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQA,cAAAA,EAAc;AAAA,QAC5C;AAEA,QAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,GACzB,CAAA,EAAG,OAAO,KAAK;;AAAA,WAAA,EAAkB,WAAW,CAAA,CAAA,GAC5C,CAAA,WAAA,EAAc,WAAW,CAAA,CAAA;AAC7B,QAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAc;AAAA,MAC3C;AAAA,MAEA,OAAe,+BAAA,CACb,IAAA,EACA,uBAAA,EACQ;AACR,QAAA,IACE,uBAAA,IACA,IAAA,CAAK,uBAAuB,CAAA,KAAM,MAAA,EAClC;AACA,UAAA,MAAM,KAAA,GAAQ,KAAK,uBAAuB,CAAA;AAC1C,UAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,QACjE;AAEA,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClC,UAAA,OAAO,EAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,MACrC;AAAA,MAEA,OAAe,uBAAA,CACb,IAAA,EACA,qBAAA,EACA,oBAAmD,IAAA,EACpC;AACf,QAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,QAAA,GAAW,KAAK,qBAAqB,CAAA;AAC3C,QAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,UAAA,MAAMC,cAAa,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACtD,UAAA,OAAOA,WAAAA,CAAW,MAAA,GAAS,CAAA,GAAIA,WAAAA,GAAa,IAAA;AAAA,QAC9C;AAEA,QAAA,MAAM,aAAA,GACJ,qBAAqB,iBAAA,CAAkB,qBAAqB,MAAM,MAAA,GAC9D,iBAAA,CAAkB,qBAAqB,CAAA,GACvC,IAAA;AACN,QAAA,IAAI,OAAO,kBAAkB,QAAA,EAAU;AACrC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,aAAa,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC3D,QAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,IAAA;AAAA,MAC9C;AAAA,MAEA,OAAe,oBAAoB,IAAA,EAAgD;AACjF,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,aAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAClD,QAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,IAAA;AAAA,MAC9C;AAAA,MAEA,OAAe,mBAAmB,IAAA,EAAsB;AACtD,QAAA,MAAM,aAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAClD,QAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACvC,QAAA,OAAO,QAAQ,OAAO,CAAA,CAAA;AAAA,MACxB;AAAA,MAEA,aAAqB,4BAAA,CACnB,KAAA,EACA,IAAA,EACA,uBAAA,EAC0B;AAC1B,QAAA,IAAI,CAAC,uBAAA,IAA2B,IAAA,CAAK,uBAAuB,MAAM,MAAA,EAAW;AAC3E,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,QAAA,GAAW,KAAK,uBAAuB,CAAA;AAC7C,QAAA,MAAM,kBAAkB,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AACtE,QAAA,MAAM,cAA+B,EAAC;AAEtC,QAAA,KAAA,MAAW,iBAAiB,eAAA,EAAiB;AAC3C,UAAA,IACE,OAAO,aAAA,KAAkB,QAAA,IACzB,CAAC,aAAA,CAAc,UAAA,CAAW,eAAe,CAAA,EACzC;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,aAAa,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,SAAS,aAAa,CAAA;AACrE,YAAA,IAAI,CAAC,UAAA,EAAY,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC5C,cAAA;AAAA,YACF;AAEA,YAAA,WAAA,CAAY,IAAA,CAAK;AAAA,cACf,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,cACtB,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,aAAA;AAAA,cACN,IAAA,EAAM,WAAW,IAAA,CAAK,IAAA;AAAA,cACtB,QAAA,EAAU,WAAW,IAAA,CAAK,QAAA;AAAA,cAC1B,IAAA,EAAM,WAAW,IAAA,CAAK,IAAA;AAAA,cACtB,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAA,IAAS,KAAA,CAAA;AAAA,cAChC,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,MAAA,IAAU,KAAA;AAAA,aACnC,CAAA;AAAA,UACH,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,MAEA,aAAqB,8BAAA,CACnB,KAAA,EACA,QAAA,EAC0B;AAC1B,QAAA,OAAO,MAAM,IAAA,CAAK,4BAAA;AAAA,UAChB,KAAA;AAAA,UACA,EAAE,aAAa,QAAA,EAAS;AAAA,UACxB;AAAA,SACF;AAAA,MACF;AAAA,MAEA,aAAqB,uBAAuB,KAAA,EAAqC;AAC/E,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AACtC,QAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AAEpC,QAAA,KAAA,MAAW,cAAc,KAAA,EAAO;AAC9B,UAAA,MAAM,eAAA,GACJ,OAAO,UAAA,KAAe,QAAA,IACtB,UAAA,KAAe,IAAA,IACf,WAAA,IAAe,UAAA,IACf,OAAQ,UAAA,CAAkC,SAAA,KAAc,QAAA,GACnD,UAAA,GACD,IAAA;AACN,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,kBACJ,OAAQ,UAAA,CAAkC,QAAA,KAAa,QAAA,GAClD,WAAkC,QAAA,GACnC,MAAA;AACN,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,yBAAA;AAAA,YACjC,KAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,QAAA,GACJ,OAAO,UAAA,KAAe,QAAA,GAClB,UAAA,GACA,OAAO,UAAA,EAAY,IAAA,KAAS,QAAA,GAC1B,UAAA,CAAW,IAAA,GACX,IAAA;AACR,UAAA,IAAI,CAAC,QAAA,IAAY,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACnC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,aAAuB,EAAC;AAC9B,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAI,WAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAAA,UAChF;AACA,UAAA,UAAA,CAAW,KAAK,QAAQ,CAAA;AAExB,UAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,YAAA,IAAI;AACF,cAAA,MAAM,SAAS,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,SAAS,CAAA;AAC9D,cAAA,IAAI,MAAA,EAAQ,SAAS,SAAA,EAAW;AAC9B,gBAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,gBAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,gBAAA;AAAA,cACF;AAAA,YACF,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MAEA,OAAe,0BAA0B,KAAA,EAAoC;AAC3E,QAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAC5C,QAAA,OAAO,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,GAAA,IAAO,UAAA,KAAe,KAAA;AAAA,MACvE;AAAA,MAEA,aAAqB,yBAAA,CACnB,KAAA,EACA,eAAA,EACkB;AAClB,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,UAAA,GAAa,gBAAgB,IAAA,EAAK;AACxC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAC9C,UAAA,OAAO,IAAA,CAAK,0BAA0B,KAAK,CAAA;AAAA,QAC7C,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,aAAqB,+BAA+B,KAAA,EAA4C;AAC9F,QAAA,KAAA,IAAS,IAAI,KAAA,CAAM,cAAA,CAAe,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACzD,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA;AAClC,UAAA,IAAI,IAAI,WAAA,EAAa;AACnB,YAAA,IAAI;AACF,cAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AACzC,cAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,gBAAA,OAAO,MAAA;AAAA,cACT;AAAA,YACF,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,MAEA,OAAe,sBAAsB,IAAA,EAA6B;AAChE,QAAA,MAAM,UAAA,GAAa,KAAK,WAAA,EAAY;AACpC,QAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,QAAA,IAAI,UAAA,CAAW,SAAS,MAAM,CAAA,IAAK,WAAW,QAAA,CAAS,OAAO,GAAG,OAAO,YAAA;AACxE,QAAA,IAAI,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,YAAA;AACzC,QAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,QAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,QAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,eAAA;AACxC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,OAAe,qBAAqB,QAAA,EAAoD;AACtF,QAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,QAAA,MAAM,UAAA,GAAa,SAAS,WAAA,EAAY;AACxC,QAAA,IAAI,UAAA,KAAe,cAAc,OAAO,KAAA;AACxC,QAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,QAAA,IAAI,UAAA,KAAe,cAAc,OAAO,MAAA;AACxC,QAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,QAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,QAAA,IAAI,UAAA,KAAe,iBAAiB,OAAO,KAAA;AAC3C,QAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,QAAA,IAAI,UAAA,KAAe,EAAA,IAAM,UAAA,KAAe,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7D,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,MACxC;AAAA,MAEA,OAAe,iBAAiB,KAAA,EAAuB;AACrD,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,EAAI,IAAK,OAAA;AACjE,QAAA,MAAM,UAAU,WAAA,CACb,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,OAAA,CAAQ,kBAAA,EAAoB,GAAG,CAAA,CAC/B,QAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,YAAY,EAAE,CAAA;AACzB,QAAA,OAAO,OAAA,IAAW,OAAA;AAAA,MACpB;AAAA,MAEA,OAAe,cAAc,KAAA,EAAqD;AAChF,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA;AACrC,QAAA,IAAI,OAAA,IAAW,CAAA,IAAK,OAAA,KAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AAChD,UAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,IAAA,EAAK;AAAA,QAClC;AACA,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAAA,UAC5B,KAAK,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,CAAC,EAAE,WAAA;AAAY,SAC5C;AAAA,MACF;AAAA,MAEA,OAAe,yBAAA,CACb,cAAA,EACA,gBAAA,EACA,IAAA,EACQ;AACR,QAAA,MAAM,MAAA,GAAS,gBAAgB,IAAA,EAAK;AACpC,QAAA,IAAI,MAAA,IAAU,WAAW,0BAAA,EAA4B;AACnD,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,MAAM,QAAA,GAAW,kBAAkB,IAAA,EAAK;AACxC,QAAA,IAAI,QAAA,IAAY,aAAa,0BAAA,EAA4B;AACvD,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAA,IAAK,UAAU,QAAA,IAAY,0BAAA;AAAA,MACnE;AAAA,MAEA,OAAe,yBAAA,CACb,aAAA,EACA,QAAA,EACA,UAAA,EACQ;AACR,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,aAAa,CAAA;AACpD,QAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAI,GAAI,IAAA,CAAK,cAAc,QAAQ,CAAA;AACjD,QAAA,MAAM,WAAA,GACJ,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA,IAClC,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,qBAAA,CAAsB,UAAU,CAAC,CAAA,IAChE,KAAA;AACF,QAAA,MAAM,WAAW,GAAA,IAAO,WAAA;AACxB,QAAA,MAAM,cAAA,GAAA,CAAkB,IAAA,IAAQ,OAAA,EAAS,KAAA,CAAM,GAAG,EAAE,CAAA;AACpD,QAAA,MAAM,UAAU,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC9C,QAAA,OAAO,CAAA,aAAA,EAAgB,cAAc,CAAA,CAAA,EAAI,OAAO,IAAI,QAAQ,CAAA,CAAA;AAAA,MAC9D;AAAA,MAEA,aAAqB,6BAAA,CACnB,YAAA,EAIA,YAAA,EAQA,aACA,WAAA,EAC0B;AAC1B,QAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,SAA0B,EAAC;AACjC,QAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,UAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,QAAA,CAAS,WAAW,IAAI,CAAA;AAC9D,UAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC3C,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,aAAa,UAAA,CAAW,IAAA;AAC9B,UAAA,MAAM,aAAA,GACJ,UAAA,CAAW,IAAA,IACX,UAAA,CAAW,IAAA,IACX,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAC/B,OAAA;AACF,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,aAAa,CAAA;AACvD,UAAA,MAAM,oBAAoB,IAAA,CAAK,yBAAA;AAAA,YAC7B,UAAA,CAAW,QAAA;AAAA,YACX,UAAA,CAAW,QAAA;AAAA,YACX,UAAA,CAAW;AAAA,WACb;AACA,UAAA,MAAM,aAAa,IAAA,CAAK,yBAAA;AAAA,YACtB,WAAA;AAAA,YACA,iBAAA;AAAA,YACA,UAAA,CAAW;AAAA,WACb;AAEA,UAAA,IAAI,UAAA,GAAkB,IAAA;AAEtB,UAAA,IAAI,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,OAAA,KAAY,OAAA,EAAS;AACxD,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,4BAAA;AAAA,cAC5B,YAAA;AAAA,cACA,UAAA,CAAW,IAAA;AAAA,cACX;AAAA,aACF;AACA,YAAA,IAAI,CAAC,UAAA,EAAY;AACf,cAAA;AAAA,YACF;AACA,YAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,SAAA;AAAA,cACrC,UAAA;AAAA,cACA,UAAA;AAAA,cACA,iBAAA;AAAA,cACA;AAAA,gBACE,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA;AAAA,gBACtC,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,MAAA;AAAA,gBACxC,UAAU,UAAA,CAAW;AAAA;AACvB,aACF;AACA,YAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,IAAA,EAAM;AAC3C,cAAA,UAAA,GAAa,WAAA,CAAY,IAAA;AAAA,YAC3B;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,QAAA,CAAS,WAAW,IAAI,CAAA;AAC9D,YAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC3C,cAAA;AAAA,YACF;AAEA,YAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,SAAA;AAAA,cACrC,UAAA;AAAA,cACA,UAAA,CAAW,IAAA;AAAA,cACX,iBAAA;AAAA,cACA;AAAA,gBACE,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA;AAAA,gBACtC,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,MAAA;AAAA,gBACxC,UAAU,UAAA,CAAW;AAAA;AACvB,aACF;AACA,YAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,IAAA,EAAM;AAC3C,cAAA,UAAA,GAAa,WAAA,CAAY,IAAA;AAAA,YAC3B;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,UAAA,EAAY;AACf,YAAA;AAAA,UACF;AAEA,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,YACtB,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,UAAA;AAAA,YACN,IAAA,EAAM,WAAA;AAAA,YACN,UAAU,IAAA,CAAK,yBAAA;AAAA,cACb,UAAA,CAAW,QAAA;AAAA,cACX,iBAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,IAAA,EAAM,UAAA,CAAW,IAAA,IAAQ,UAAA,CAAW,IAAA;AAAA,YACpC,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,SAAS,UAAA,CAAW,KAAA;AAAA,YAC1D,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,UAAU,UAAA,CAAW;AAAA,WAC9D,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,aAAqB,4BAAA,CACnB,YAAA,EAGA,IAAA,EACA,UAAA,EACwB;AAGxB,QAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,QAAA,CAAS,IAAI,CAAA;AACnD,QAAA,IAAI,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,IAAA,EAAM;AACzC,UAAA,OAAO,UAAA,CAAW,IAAA;AAAA,QACpB;AAEA,QAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,YAAY,OAAA,EAAS;AACzD,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,QAAA,IAAI,CAAC,QAAA,IAAY,CAAC,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChD,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAQ,CAAA;AACrC,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAY;AAC1C,UAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,QACxC,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,OAAe,oBAAoB,MAAA,EAA6B;AAC9D,QAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,QAAA,IAAI,MAAA,GAAS,EAAA;AACb,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QACxC;AACA,QAAA,OAAO,KAAK,MAAM,CAAA;AAAA,MACpB;AAAA,MAEA,OAAe,oCACb,WAAA,EACQ;AACR,QAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,UAAA,OAAO,EAAA;AAAA,QACT;AACA,QAAA,MAAM,QAAQ,WAAA,CACX,GAAA,CAAI,CAAC,UAAA,KAAe,WAAW,IAAI,CAAA,CACnC,MAAA,CAAO,CAAC,SAAS,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,SAAS,CAAC,CAAA;AAC/D,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,EAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,YAAA,GAAe,aAAA;AAClD,QAAA,OAAO;;AAAA,yCAAA,EAAgD,KAAK,CAAA;;AAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MACtF;AAAA,MAEA,OAAe,6BAAA,CACb,WAAA,EACA,MAAA,EACA,MAAA,EACA,OACA,WAAA,EACQ;AACR,QAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,mCAAA,CAAoC,WAAW,CAAA;AAC9E,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,OAAO,wBAAwB,WAAW,CAAA;;AAAA,EAAgC,KAAA,IAAS,MAAA,IAAU,8BAA8B,CAAA,EAAG,iBAAiB,CAAA,CAAA;AAAA,QACjJ;AACA,QAAA,OAAO,wBAAwB,WAAW,CAAA;;AAAA,EAA2C,MAAA,IAAU,KAAA,IAAS,oBAAoB,CAAA,EAAG,iBAAiB,CAAA,CAAA;AAAA,MAClJ;AAAA,MAEA,OAAe,2BAAA,CACb,IAAA,EACA,eAAA,EACe;AACf,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA,GAAQ,KAAK,eAAe,CAAA;AAClC,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,UAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,IAAA;AAAA,QACxC;AACA,QAAA,IAAI;AACF,UAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,QAC7B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,OAAO,KAAK,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,OAAe,mBAAA,CACb,QAAA,EACA,UAAA,EACiB;AACjB,QAAA,MAAM,SAA0B,EAAC;AACjC,QAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,QAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAuB;AACnC,UAAA,MAAM,MAAM,GAAA,CAAI,IAAA;AAChB,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,YAAA;AAAA,UACF;AACA,UAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,UAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,QACjB,CAAA;AAEA,QAAA,KAAA,MAAW,GAAA,IAAO,QAAA,IAAY,EAAC,EAAG;AAChC,UAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QACV;AACA,QAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,UAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QACV;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,OAAe,gCAAgC,QAAA,EAA6B;AAC1E,QAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAC7D,QAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,QAAA,MAAM,QAAkB,EAAC;AAEzB,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,UAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,YAAA,SAAA,GAAY,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,IAAA;AAAA,UAC7C,CAAA,MAAA,IAAW,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AAC7C,YAAA,MAAM,YAAa,KAAA,CAA6B,IAAA;AAChD,YAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,cAAA,MAAM,OAAA,GAAU,UAAU,IAAA,EAAK;AAC/B,cAAA,SAAA,GAAY,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,IAAA;AAAA,YAC7C;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,SAAA,IAAa,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AACrC,YAAA;AAAA,UACF;AACA,UAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAClB,UAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,QACtB;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MAEA,OAAe,sCAAsC,YAAA,EAAgC;AACnF,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,OAAA;AACnD,QAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACnC,QAAA,OAAO;AAAA,UACL,CAAA,oBAAA,EAAuB,KAAK,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAA;AAAA,UAC9D;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,MACZ;AAAA,MAEA,aAAqB,0BAAA,CACnB,KAAA,EACA,WAAA,EACA,SACA,WAAA,EACe;AACf,QAAA,MAAM,QAAA,GAAW,EAAE,WAAA,EAAa,WAAA,EAAY;AAC5C,QAAA,IAAI,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,YAAA,EAAc;AACtC,UAAA,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,YAAA,CAAa,MAAM,QAAA,EAAU;AAAA,YACvD,IAAA,EAAM,MAAA;AAAA,YACN,OAAA;AAAA,YACA,WAAA;AAAA,YACA,MAAA,EAAQ,IAAA;AAAA,YACR;AAAA,WACD,CAAA;AACD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB,CAAA;AAAA,0CAAA,CAAA;AAAA,UAEA,OAAO,UAAA,EAAW;AAAA,UAClB,MAAA;AAAA,UACA,OAAA;AAAA,UACA,eAAe,WAAA,CAAY,MAAA,GAAS,IAAI,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,GAAI,IAAA;AAAA,UACtE,CAAA;AAAA,UACA,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,UACvB,IAAA,CAAK,KAAI,GAAI;AAAA,SACf;AAAA,MACF;AAAA,MAEA,aAAqB,2BAAA,CACnB,KAAA,EACA,QAAA,EACA,QACA,IAAA,EACe;AACf,QAAA,MAAM,aAAA,GAAgB,sBAAA;AAAA,UACpB,KAAA,CAAM,WAAA;AAAA,UACN,KAAA,CAAM,WAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,MAAM,wBAAwB,aAAA,CAAc,QAAA;AAE5C,QAAA,IAAI,CAAC,qBAAA,IAAyB,qBAAA,KAA0B,QAAA,EAAU;AAChE,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,cACJ,aAAA,CAAc,eAAA,IAAmB,OAC7B,IAAA,CAAK,aAAA,CAAc,eAAe,CAAA,GAClC,MAAA;AACN,QAAA,MAAM,UAAA,GACJ,OAAO,WAAA,KAAgB,QAAA,GACnB,YAAY,IAAA,EAAK,GACjB,WAAA,KAAgB,MAAA,IAAa,WAAA,KAAgB,IAAA,GAC3C,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,GAC1B,EAAA;AAER,QAAA,MAAM,UAAA,GAAa,cAAc,MAAA,CAAO,MAAA,EAAQ,MAAK,IAAK,MAAA,CAAO,OAAO,IAAA,EAAK;AAC7E,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AACzD,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,WAAW,cAAc,CAAA;AACzE,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,IAAI,QAAQ,CAAA;AAC9D,UAAA,IAAI,WAAW,yBAAA,EAA2B;AACxC,YAAA,MAAM,UAAA,CAAW,yBAAA;AAAA,cACf,cAAA;AAAA,cACA,KAAA,CAAM,QAAA;AAAA,cACN;AAAA,aACF;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8DAA8D,KAAK,CAAA;AAAA,QACnF;AAAA,MACF;AAAA,MAEA,aAAqB,kBAAkB,KAAA,EAA0C;AAC/E,QAAA,IAAI,KAAA,CAAM,mBAAmB,MAAA,EAAW;AACtC,UAAA,OAAO,KAAA,CAAM,cAAA;AAAA,QACf;AAEA,QAAA,MAAM,YAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,EAAkB,MAAA,IAAU,IAAA;AAC/D,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,KAAA,CAAM,cAAA,GAAiB,YAAA;AACvB,UAAA,OAAO,YAAA;AAAA,QACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACrE,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC/D,UAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,MAAM,QAAQ,CAAA;AAC1D,UAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,IAAA;AACjC,UAAA,KAAA,CAAM,cAAA,GAAiB,MAAA;AACvB,UAAA,OAAO,MAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AACN,UAAA,KAAA,CAAM,cAAA,GAAiB,IAAA;AACvB,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,aAAqB,0BAAA,CACnB,IAAA,EACA,KAAA,EACqB;AACrB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,SAAS,SAAS,CAAA;AAC5D,QAAA,MAAM,cAAc,OAAO,IAAA,CAAK,WAAA,KAAgB,QAAA,GAAW,KAAK,WAAA,GAAc,EAAA;AAC9E,QAAA,MAAM,UAAU,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU,EAAA;AAClE,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,yBAAA;AAC5C,QAAA,MAAM,kBACJ,IAAA,CAAK,WAAA,KAAgB,UAAa,YAAA,GAAe,KAAK,IAAA,CAAK,WAAA;AAE7D,QAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC5B,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,GAAG,qBAAqB,CAAA,kCAAA;AAAA,WACjC;AAAA,QACF;AACA,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AACnC,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,GAAG,qBAAqB,CAAA,yCAAA;AAAA,WACjC;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AACrD,QAAA,MAAM,QAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,cAAc,WAAW,CAAA;AACtE,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,YAAA,EAAc;AAC3C,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,uBAAuB,WAAW,CAAA,gBAAA;AAAA,WAC3C;AAAA,QACF;AAEA,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,WAAW,WAAW,CAAA;AACrE,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAC5D,QAAA,IAAI,OAAO,SAAA,CAAU,aAAA,KAAkB,UAAA,EAAY;AACjD,UAAA,MAAM,UAAA,GAAa,MAAM,SAAA,CAAU,aAAA,CAAc,WAAW,CAAA;AAC5D,UAAA,IAAI,eAAe,IAAA,EAAM;AACvB,YAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,WAAA,EAAa,YAAY,CAAA;AAC7D,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,OAAA;AAAA,cACR,KAAA,EAAO,uBAAuB,WAAW,CAAA,gBAAA;AAAA,aAC3C;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,MAAM,IAAI,CAAA;AACvE,QAAA,MAAM,QAAA,GACJ,eAAe,SAAA,IAAa,OAAO,eAAe,SAAA,KAAc,QAAA,GAC5D,cAAA,CAAe,SAAA,CAAU,iBAAA,GACzB,QAAA;AAEN,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA;AAAA,UACxB,KAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAM,IAAA,CAAK,8BAAA,CAA+B,KAAA,EAAO,eAAe;AAAA,SAClE;AACA,QAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,WAAA,EAAa,SAAS,CAAA;AAE1D,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,SAAA;AAAA,UACR,MAAA,EAAQ,4BAA4B,WAAW,CAAA,CAAA,CAAA;AAAA,UAC/C,WAAA,EAAa;AAAA,SACf;AAAA,MACF;AAAA,MAEA,aAAqB,mBAAA,CACnB,KAAA,EACA,WAAA,EACA,cAAA,EACA,kBACA,iBAAA,EACqB;AACrB,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,WAAW,WAAW,CAAA;AACrE,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAE5D,QAAA,MAAM,iBAAA,GAAoB,iBAAA,IAAqB,MAAM,IAAA,CAAK,+BAA+B,KAAK,CAAA;AAC9F,QAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,6BAAA;AAAA,UACnC,MAAM,MAAA,CAAO,QAAA;AAAA,UACb,SAAA;AAAA,UACA,iBAAA;AAAA,UACA,CAAA,YAAA,EAAe,MAAM,QAAQ,CAAA;AAAA,SAC/B;AAEA,QAAA,MAAM,SAAA,CAAU,aAAa,WAAA,EAAa;AAAA,UACxC,IAAA,EAAM,gBAAA,KAAqB,QAAA,GAAW,MAAA,GAAS,WAAA;AAAA,UAC/C,OAAA,EAAS,cAAA;AAAA,UACT,WAAA,EAAa;AAAA,SACd,CAAA;AAED,QAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,sCAAA,EAAuC;AAAA,MAC7E;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,eAAA,CACnB,IAAA,EACA,MAAA,EACA,OACA,aAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,EAAE,UAAA,EAAAH,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAG7B,UAAA,IAAI,eAAA,GAAkB,MAAMA,WAAAA,CAAW,4BAAA;AAAA,YACrC,KAAA;AAAA,YACA,IAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,MAAM,SAAA,GAAY,aAAA;AAGlB,UAAA,IAAI,cAAA;AACJ,UAAA,IAAI,eAAA,CAAgB,WAAA,IAAe,eAAA,CAAgB,WAAA,CAAY,SAAS,CAAA,EAAG;AACzE,YAAA,MAAM,iBAAmC,EAAC;AAC1C,YAAA,MAAM,eAAgC,EAAC;AAEvC,YAAA,KAAA,MAAW,IAAA,IAAQ,gBAAgB,WAAA,EAAa;AAC9C,cAAA,IAAI,UAAU,IAAA,EAAM;AAElB,gBAAA,cAAA,CAAe,KAAK,IAAsB,CAAA;AAAA,cAC5C,CAAA,MAAO;AAEL,gBAAA,YAAA,CAAa,KAAK,IAAqB,CAAA;AAAA,cACzC;AAAA,YACF;AAEA,YAAA,cAAA,GAAiB,YAAA;AACjB,YAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,cAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,sBAAA,CAAuB,gBAAgB,KAAK,CAAA;AAC7E,cAAA,cAAA,GAAiB,CAAC,GAAG,cAAA,EAAgB,GAAG,aAAa,CAAA;AAAA,YACvD;AACA,YAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,cAAA,cAAA,GAAiB,KAAA,CAAA;AAAA,YACnB;AAAA,UACF;AAEA,UAAA,MAAM,OAAO,KAAA,CAAM,WAAA;AACnB,UAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,KAAA,CAAM,WAAA,EAAa,MAAM,MAAM,CAAA;AAC1E,UAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,KAAA,CAAM,WAAA,EAAa,MAAM,MAAM,CAAA;AAC1E,UAAA,MAAM,aAAA,GAAgB,sBAAA,CAAuB,KAAA,CAAM,WAAA,EAAa,MAAM,QAAQ,CAAA;AAC9E,UAAA,MAAM,iBACJ,WAAA,CAAY,QAAA,KAAa,KAAK,QAAA,CAAS,IAAA,GACnC,cACA,WAAA,CAAY,QAAA,KAAa,IAAA,CAAK,QAAA,CAAS,OACrC,WAAA,GACA,aAAA,CAAc,aAAa,IAAA,CAAK,QAAA,CAAS,OACvC,aAAA,GACA,IAAA;AACV,UAAA,MAAM,WAAW,IAAA,CAAK,wBAAA;AAAA,YACpB,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,QAAA,CAAS,SAAS;AAAA,WACjD;AACA,UAAA,MAAM,gBAAgB,cAAA,GAClB,IAAA,CAAK,4BAA4B,QAAA,EAAU,cAAA,CAAe,eAAe,CAAA,GACzE,IAAA;AAEJ,UAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,SAAA,IAAa,cAAA,EAAgB,mBAAA,EAAqB;AAC/E,YAAA,MAAM,qBAAA,GAAwB,QAAA,CAAS,cAAA,CAAe,mBAAmB,CAAA;AACzE,YAAA,IAAI,0BAA0B,KAAA,CAAA,EAAW;AACvC,cAAA,MAAM,iCACJ,KAAA,CAAM,OAAA,CAAQ,qBAAqB,CAAA,IAAK,sBAAsB,MAAA,KAAW,CAAA;AAC3E,cAAA,IAAI,CAAC,8BAAA,EAAgC;AACnC,gBAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,+BAAA,CAAgC,qBAAqB,CAAA;AACjF,gBAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,8BAAA;AAAA,kBAC5B,KAAA;AAAA,kBACA;AAAA,iBACF;AACA,gBAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AAC/D,gBAAA,MAAM,YAAA,GAAe,eAAe,MAAA,CAAO,CAAC,SAAS,CAAC,aAAA,CAAc,GAAA,CAAI,IAAI,CAAC,CAAA;AAE7E,gBAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,IAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AAC1D,kBAAA,eAAA,GAAkB;AAAA,oBAChB,MAAA,EAAQ,OAAA;AAAA,oBACR,OAAO,IAAA,CAAK,qCAAA;AAAA,sBACV,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,CAAC,iCAAiC,CAAA,GAAI;AAAA;AACtE,mBACF;AACA,kBAAA,cAAA,GAAiB,KAAA,CAAA;AAAA,gBACnB,CAAA,MAAO;AACL,kBAAA,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,cAAA,EAAgB,UAAU,CAAA;AAAA,gBACtE;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAKA,UAAA,IAAI,OAAA;AACJ,UAAA,IAAI,eAAA,CAAgB,WAAW,SAAA,EAAW;AACxC,YAAA,OAAA,GAAU,aAAA,IAAiB,eAAA,CAAgB,MAAA,EAAQ,IAAA,EAAK,IAAK,4BAAA;AAAA,UAC/D,CAAA,MAAO;AACL,YAAA,MAAM,SAAA,GACJ,eAAA,CAAgB,KAAA,EAAO,IAAA,EAAK,IAC5B,uBAAA;AACF,YAAA,OAAA,GAAU,2BAA2B,SAAS,CAAA,CAAA;AAAA,UAChD;AAEA,UAAA,MAAM,sBAAsB,WAAA,CAAY,QAAA;AACxC,UAAA,MAAM,sBAAsB,WAAA,CAAY,QAAA;AACxC,UAAA,MAAM,2BAAA,GAAA,CACH,CAAC,mBAAA,IAAuB,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,mBAAA,MAC/C,CAAC,mBAAA,IAAuB,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,mBAAA,CAAA;AAKlD,UAAA,IAAI,2BAAA,IAA+B,cAAA,IAAkB,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC9E,YAAA,MAAM,eAAA,GAAkB,cAAA,CACrB,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,qBAAA,EAAwB,GAAA,CAAI,IAAI,CAAA,GAAA,EAAM,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA,CAC3D,KAAK,IAAI,CAAA;AACZ,YAAA,OAAA,IAAW;;AAAA,EAAO,eAAe,CAAA,CAAA;AAAA,UACnC;AAGA,UAAA,IAAI,KAAA,CAAM,eAAA,KAAoB,KAAA,CAAA,IAAa,eAAA,CAAgB,WAAW,OAAA,EAAS;AAE7E,YAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,kBAAA;AAGvC,YAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,YAAA,IAAI,gBAAA,KAAqB,KAAA,CAAA,IAAa,gBAAA,KAAqB,IAAA,EAAM;AAC/D,cAAA,aAAA,GAAgB,iBAAiB,aAAA,IAAiB,IAAA;AAAA,YACpD;AAGA,YAAA,IAAI,aAAA,IAAiB,CAAC,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACnD,cAAA,OAAA,GAAU,UAAU,OAAO,CAAA,CAAA;AAAA,YAC7B;AAAA,UACF;AAGA,UAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,MAAA,KAAW,SAAA,GAAY,SAAA,GAAY,OAAA;AAEtE,UAAA,IAAI,OAAA,GAAmB;AAAA,YACrB,EAAA,EAAI,SAAA;AAAA,YACJ,IAAA,EAAM,MAAA;AAAA,YACN,OAAA;AAAA,YACA,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA;AAAA,YACpB,cAAc,IAAA,CAAK,EAAA;AAAA,YACnB,UAAA,EAAY,CAAA;AAAA;AAAA,YACZ,WAAA,EAAa,UAAA;AAAA,YACb,SAAA,EAAW,MAAM,eAAA,IAAmB,IAAA;AAAA,YACpC,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,WAAA,EAAa,kBAAkB,cAAA,CAAe,MAAA,GAAS,IACnD,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,GAC7B,IAAA;AAAA,YACJ,WAAA,EACE,OAAO,eAAA,CAAgB,WAAA,KAAgB,YACvC,eAAA,CAAgB,WAAA,CAAY,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GACxC,eAAA,CAAgB,WAAA,CAAY,MAAK,GACjC;AAAA,WACR;AAGA,UAAA,OAAA,GAAU,MAAMA,WAAAA,CAAW,0BAAA,CAA2B,KAAA,EAAO,OAAO,CAAA;AAGpE,UAAA,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAGlC,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAGpG,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,YAIA,OAAA,CAAQ,EAAA;AAAA,YACR,OAAA,CAAQ,IAAA;AAAA,YACR,OAAA,CAAQ,OAAA;AAAA,YACR,OAAA,CAAQ,IAAA;AAAA,YACR,OAAA,CAAQ,YAAA;AAAA,YACR,OAAA,CAAQ,UAAA;AAAA,YACR,OAAA,CAAQ,WAAA;AAAA,YACR,OAAA,CAAQ,SAAA;AAAA,YACR,OAAA,CAAQ,KAAA;AAAA,YACR,OAAA,CAAQ,WAAA;AAAA,YACR,QAAQ,WAAA,IAAe,IAAA;AAAA,YACvB;AAAA,WACF;AAGA,UAAA,MAAMA,WAAAA,CAAW,yBAAA,CAA0B,KAAA,EAAO,OAAO,CAAA;AAGvD,UAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAgB,IAAA;AAC1C,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAI;AAEF,cAAA,MAAMD,OAAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,gBACrC,CAAA,2CAAA,CAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,MAAM,IAAA,GAAOA,QAAO,OAAA,EAAQ;AAC5B,cAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,CAAC,CAAA,EAAG,YAAA;AAGpC,cAAA,IAAI,mBAMC,EAAC;AAEN,cAAA,IAAI,kBAAA,EAAoB;AACtB,gBAAA,IAAI;AACF,kBAAA,gBAAA,GAAmB,IAAA,CAAK,MAAM,kBAA4B,CAAA;AAAA,gBAC5D,CAAA,CAAA,MAAQ;AAAA,gBAER;AAAA,cACF;AAGA,cAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,gBACpB,cAAc,IAAA,CAAK,EAAA;AAAA,gBACnB,SAAA,EAAW,KAAK,QAAA,CAAS,IAAA;AAAA,gBACzB,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAAA,gBACrC,QAAQ,eAAA,CAAgB,MAAA;AAAA,gBACxB,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AAGD,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB,CAAA,+CAAA,CAAA;AAAA,gBACA,IAAA,CAAK,UAAU,gBAAgB,CAAA;AAAA,gBAC/B;AAAA,eACF;AAGA,cAAA,IAAI,MAAM,OAAA,EAAS;AACjB,gBAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,kBACZ,IAAA,EAAM,UAAA;AAAA,kBACN,MAAA,EAAQ,WAAA;AAAA,kBACR,IAAA,EAAM;AAAA,oBACJ,EAAA,EAAI,WAAA;AAAA,oBACJ,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,gBAAgB;AAAA;AAC/C,iBACD,CAAA;AAAA,cACH;AAAA,YACF,SAAS,QAAA,EAAU;AAEjB,cAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,QAAQ,CAAA;AAAA,YAClE;AAAA,UACF;AAGF,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,UAC3B;AAGA,UAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,SAAA,IAAa,eAAA,CAAgB,MAAA,EAAQ;AAClE,YAAA,KAAA,CAAM,OAAO,WAAA,CAAY;AAAA,OAAA,EAAY,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,gBAAgB,MAAM;AAAA,CAAI,CAAA;AAAA,UACxF;AAGA,UAAA,KAAA,CAAM,cAAA,CAAe,KAAK,OAAO,CAAA;AAKjC,UAAA,MAAM,IAAA,CAAK,oDAAA;AAAA,YACT,KAAA;AAAA,YACA,OAAA;AAAA,YACA,cAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAEjD,UAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAO,KAAA,EAAO,mBAAmB,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,QAC3E;AAAA,MACF;AAAA,MAEA,aAAqB,oDAAA,CACnB,KAAA,EACA,iBAAA,EACA,MACA,OAAA,EACe;AACf,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAW,CAAA,EAAG;AAC1C,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,WAAA,GAAc,MAAA;AACvD,QAAA,MAAM,aAAA,GACJ,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,GACtB,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAC5C,IAAA;AACN,QAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,SAAA,IAAa,KAAA,CAAM,eAAA,IAAmB,IAAA;AACzE,QAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,KAAA,IAAS,KAAA,CAAM,KAAA;AAE/C,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ;AACrC,UAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,EAAU,WAAA,EAAY,IAAK,EAAA;AAChD,UAAA,IAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AACjC,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY;AAClC,UAAA,OACE,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IACpB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IACpB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,SAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IACpB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IACpB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,QAExB,CAAC,CAAA;AAED,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,QAAA,MAAM,uBAAuB,IAAI,GAAA;AAAA,UAC/B,MAAM,cAAA,CACH,MAAA;AAAA,YACC,CAAC,OAAA,KACC,OAAA,CAAQ,MAAA,KAAW,IAAA,IACnB,QAAQ,IAAA,KAAS,IAAA,IAAA,CAChB,OAAA,CAAQ,SAAA,IAAa,IAAA,MAAU,QAAA,IAAA,CAC/B,QAAQ,KAAA,IAAS,KAAA,CAAM,KAAA,MAAW,KAAA,IACnC,OAAO,OAAA,CAAQ,YAAY,QAAA,IAC3B,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW,wBAAwB;AAAA,WACvD,CACC,GAAA,CAAI,CAAC,OAAA,KAAY,QAAQ,OAAiB;AAAA,SAC/C;AAEA,QAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,QAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,UAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,UAAU,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACxC,YAAA;AAAA,UACF;AACA,UAAA,SAAA,CAAU,GAAA,CAAI,IAAI,IAAI,CAAA;AAEtB,UAAA,MAAM,OAAA,GAAU,CAAA,sBAAA,EAAyB,GAAA,CAAI,IAAI,CAAA,CAAA;AACjD,UAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,YAAA;AAAA,UACF;AACA,UAAA,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAEhC,UAAA,MAAM,aAAA,GAAyB;AAAA,YAC7B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,YACtB,IAAA;AAAA,YACA,OAAA;AAAA,YACA,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,CAAC,GAAG,CAAC,CAAA;AAAA,YACjC,MAAA,EAAQ,IAAA;AAAA,YACR,MAAA,EAAQ,WAAA;AAAA,YACR,UAAA,EAAY,iBAAA,CAAkB,UAAA,GAAa,cAAA,GAAiB,CAAA;AAAA,YAC5D,SAAA,EAAW,QAAA;AAAA,YACX,KAAA;AAAA,YACA,WAAA,EAAa,kBAAkB,WAAA,IAAe;AAAA,WAChD;AACA,UAAA,cAAA,IAAkB,CAAA;AAElB,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,YAMA,aAAA,CAAc,EAAA;AAAA,YACd,aAAA,CAAc,IAAA;AAAA,YACd,aAAA,CAAc,OAAA;AAAA,YACd,aAAA,CAAc,WAAA;AAAA,YACd,CAAA;AAAA,YACA,aAAA,CAAc,UAAA;AAAA,YACd,aAAA,CAAc,MAAA;AAAA,YACd,aAAA,CAAc,SAAA;AAAA,YACd,aAAA,CAAc,KAAA;AAAA,YACd,cAAc,WAAA,IAAe,IAAA;AAAA,YAC7B;AAAA,WACF;AAEA,UAAA,KAAA,CAAM,cAAA,CAAe,KAAK,aAAa,CAAA;AACvC,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,YAAY,aAAa,CAAA;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,sBAAA,CACnB,WAAA,EACA,KAAA,EAC0B;AAE1B,QAAA,MAAM,EAAE,WAAA,EAAAK,YAAAA,EAAY,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AAC9B,QAAA,MAAM,EAAA,GAAK,IAAIA,YAAAA,CAAY,KAAA,CAAM,QAAQ,GAAG,CAAA;AAE5C,QAAA,MAAM,OAAwB,EAAC;AAE/B,QAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,UAAA,IAAI;AACF,YAAA,MAAM,YAAA,GAAe,OAAO,UAAA,EAAW;AACvC,YAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,YAAA,MAAM,GAAA,GAAM,WAAW,QAAA,KAAa,WAAA,GAAc,QACtC,UAAA,CAAW,QAAA,KAAa,YAAA,GAAe,KAAA,GACvC,UAAA,CAAW,QAAA,KAAa,cAAc,KAAA,GACtC,UAAA,CAAW,QAAA,KAAa,YAAA,GAAe,MAAA,GACvC,UAAA,CAAW,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,KAAA;AAEhD,YAAA,MAAM,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,EAAI,YAAY,IAAI,GAAG,CAAA,CAAA;AAG7D,YAAA,MAAM,YAAA,GAAe,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AACzC,YAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AACrD,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,cAAA,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,YAC3C;AAIA,YAAA,MAAM,GAAG,SAAA,CAAU,IAAA,EAAM,UAAA,CAAW,MAAA,EAAuB,WAAW,QAAA,EAAU;AAAA,cAC9E,OAAO,UAAA,CAAW,KAAA;AAAA,cAClB,QAAQ,UAAA,CAAW;AAAA,aACpB,CAAA;AAGD,YAAA,MAAM,GAAA,GAAqB;AAAA,cACzB,EAAA,EAAI,YAAA;AAAA,cACJ,IAAA,EAAM,MAAA;AAAA,cACN,IAAA;AAAA,cACA,MAAM,UAAA,CAAW,IAAA;AAAA,cACjB,UAAU,UAAA,CAAW,QAAA;AAAA,cACrB,MAAM,UAAA,CAAW;AAAA,aACnB;AAEA,YAAA,IAAI,UAAA,CAAW,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,UAAA,CAAW,KAAA;AAC7C,YAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,GAAA,CAAI,MAAA,GAAS,UAAA,CAAW,MAAA;AAE/C,YAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,UACf,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,UAAA,CAAW,IAAI,KAAK,KAAK,CAAA;AAAA,UAE5E;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,cAAA,CACnB,IAAA,EACA,KAAA,EACA,KAAA,EACe;AACf,QAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AAExC,QAAA,MAAM,MAAA,GAAqB;AAAA,UACzB,MAAA,EAAQ,OAAA;AAAA,UACR,OAAO,KAAA,CAAM;AAAA,SACf;AAEA,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,MAAA,EAAQ,OAAO,aAAa,CAAA;AAAA,MAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,QAAA,CACnB,KAAA,EACA,KAAA,EACA,QAAA,EACe;AACf,QAAA,IAAI;AACF,UAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,UAAA,MAAM,UAAA,GAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAA;AAG1D,UAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAgB,IAAA;AAE1C,UAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,QAAQ,CAAA,EAAA,CAAA,EAAM,YAAY,CAAA;AACvD,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,YAAY,CAAA,MAAA,EAAS,QAAQ,CAAA,UAAA,EAAa,YAAY,GAAG,UAAA,GAAa;;AAAA;AAAA,EAAqB,UAAU,KAAK,EAAE,CAAA,CAAA;AAGlH,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,YAOA,SAAA;AAAA,YACA,sBAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,MAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAM;AAAA,gBACJ,EAAA,EAAI,WAAA;AAAA,gBACJ,KAAA,EAAO,SAAA;AAAA,gBACP,UAAA,EAAY;AAAA;AACd,aACD,CAAA;AAAA,UACH;AAAA,QACF,SAAS,QAAA,EAAU;AAEjB,UAAA,OAAA,CAAQ,KAAA,CAAM,gDAAgD,QAAQ,CAAA;AAAA,QACxE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAe,kBAAA,CACb,IAAA,EACA,MAAA,EACe;AAIf,QAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,UAAA,EAAY;AAEjD,UAAA,IAAI,OAAO,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AACrD,YAAA,KAAA,MAAW,KAAA,IAAS,OAAO,QAAA,EAAU;AACnC,cAAA,IAAI,EAAE,SAAS,IAAA,CAAA,EAAO;AACpB,gBAAA,OAAO,2BAA2B,KAAK,CAAA,CAAA;AAAA,cACzC;AAAA,YACF;AAAA,UACF;AAGA,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,YACrC,MAAA,CAAO;AAAA,WACT,EAAG;AACD,YAAA,IAAI,OAAO,IAAA,EAAM;AACf,cAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,cAAA,MAAM,eAAe,UAAA,CAAW,IAAA;AAGhC,cAAA,IAAI,YAAA,KAAiB,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AAC1D,gBAAA,OAAO,SAAS,GAAG,CAAA,iBAAA,CAAA;AAAA,cACrB;AACA,cAAA,IAAI,YAAA,KAAiB,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AAC1D,gBAAA,OAAO,SAAS,GAAG,CAAA,iBAAA,CAAA;AAAA,cACrB;AACA,cAAA,IAAI,YAAA,KAAiB,SAAA,IAAa,OAAO,KAAA,KAAU,SAAA,EAAW;AAC5D,gBAAA,OAAO,SAAS,GAAG,CAAA,kBAAA,CAAA;AAAA,cACrB;AACA,cAAA,IAAI,iBAAiB,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,gBAAA,OAAO,SAAS,GAAG,CAAA,iBAAA,CAAA;AAAA,cACrB;AACA,cAAA,IACE,iBAAiB,QAAA,KAChB,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,CAAA,EACxC;AACA,gBAAA,OAAO,SAAS,GAAG,CAAA,kBAAA,CAAA;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAqB,iBAAA,CACnB,UAAA,EACA,IAAA,EACA,KAAA,EACiB;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAOtC,UAAA,MAAM,UAAoB,EAAC;AAE3B,UAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,YAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAE7B,cAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AAAA,YAClC,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AAEtC,cAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AAC9C,cAAA,IAAI,kBAAkB,KAAA,CAAA,EAAW;AAC/B,gBAAA,OAAA,CAAQ,IAAA;AAAA,kBACN,OAAO,aAAA,KAAkB,QAAA,GACrB,aAAA,GACA,IAAA,CAAK,UAAU,aAAa;AAAA,iBAClC;AAAA,cACF,CAAA,MAAO;AAEL,gBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,cACrC;AAAA,YACF,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AAEpC,cAAA,IAAI;AACF,gBAAA,MAAM,aAAa,OAAA,CAAQ,EAAA;AAC3B,gBAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,UAAW,CAAA;AAEpE,gBAAA,IAAI,CAAC,SAAA,EAAW;AACd,kBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAE,CAAA;AACzD,kBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,OAAA,CAAQ,KAAA,IAAS,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,gBACnE,CAAA,MAAO;AAIL,kBAAA,IAAI,aAAa,SAAA,CAAU,MAAA;AAG3B,kBAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,gBAAA,EAAkB,CAAC,OAAe,OAAA,KAAoB;AACpF,oBAAA,MAAM,KAAA,GAAQ,KAAK,OAAO,CAAA;AAC1B,oBAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,sBAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,oBACjE;AACA,oBAAA,OAAO,KAAA;AAAA,kBACT,CAAC,CAAA;AAED,kBAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,gBACzB;AAAA,cACF,SAAS,KAAA,EAAO;AACd,gBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAA,CAAQ,EAAE,KAAK,KAAK,CAAA;AAC1D,gBAAA,OAAA,CAAQ,KAAK,CAAA,uBAAA,EAA0B,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,cACvE;AAAA,YACF;AAAA,UACF;AAEA,UAAA,OAAO,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,QACxB,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,yBAAA,CACnB,IAAA,EACA,KAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,SAAA;AAAA,YACxC,CAAC,GAAA,KAAQ;AACP,cAAA,IAAI,CAAC,GAAA,CAAI,UAAA,EAAY,OAAO,KAAA;AAC5B,cAAA,IAAI;AACF,gBAAA,MAAMC,UAAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3C,gBAAA,OAAOA,WAAU,IAAA,CAAK,CAAC,OAAiB,EAAA,CAAG,EAAA,KAAO,KAAK,EAAE,CAAA;AAAA,cAC3D,CAAA,CAAA,MAAQ;AACN,gBAAA,OAAO,KAAA;AAAA,cACT;AAAA,YACF;AAAA,WACF;AAEA,UAAA,IAAI,iBAAiB,CAAA,CAAA,EAAI;AACvB,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2DAAA,EAA8D,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACpF,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,cAAA,CAAe,YAAY,CAAA;AACjD,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAW,CAAA;AAGhD,UAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE1B,YAAA,KAAA,CAAM,cAAA,CAAe,MAAA,CAAO,YAAA,EAAc,CAAC,CAAA;AAG3C,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB,CAAA,iCAAA,CAAA;AAAA,cACA,OAAA,CAAQ;AAAA,aACV;AAAA,UAEM,CAAA,MAAO;AAEb,YAAA,MAAM,gBAAA,GAAmB,UAAU,MAAA,CAAO,CAAC,OAAiB,EAAA,CAAG,EAAA,KAAO,KAAK,EAAE,CAAA;AAC7E,YAAA,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,gBAAgB,CAAA;AAGpD,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB,CAAA,+CAAA,CAAA;AAAA,cACA,OAAA,CAAQ,UAAA;AAAA,cACR,OAAA,CAAQ;AAAA,aACV;AAAA,UAEM;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yDAAyD,KAAK,CAAA;AAAA,QAC9E;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7uGO,SAAS,oBAAoB,OAAA,EAA2B;AAC7D,EAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAa,OAAO,KAAA;AAEjC,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GACJ,OAAO,OAAA,CAAQ,WAAA,KAAgB,QAAA,GAC3B,KAAK,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAC9B,OAAA,CAAQ,WAAA;AAEd,IAAA,OAAO,WAAA,CAAY,KAAK,CAAC,GAAA,KAAQ,IAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,EACpE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,SAAS,gCACd,OAAA,EACiB;AACjB,EAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAa,OAAO,EAAC;AAElC,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GACJ,OAAO,OAAA,CAAQ,WAAA,KAAgB,QAAA,GAC3B,KAAK,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAC9B,OAAA,CAAQ,WAAA;AAEd,IAAA,OAAO,WAAA,CAAY,MAAA;AAAA,MACjB,CAAC,QAAQ,GAAA,CAAI,QAAA,CAAS,WAAW,QAAQ,CAAA,IAAK,CAAC,GAAA,CAAI;AAAA,KACrD;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAMO,SAAS,sBAAA,CACd,QAAA,EACA,MAAA,GAA6B,cAAA,EACnB;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,sBAAA;AAE3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,mBAAA,CAAoB,GAAG,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,sBAAsB,UAAA,EAAmC;AACvE,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,OAAO,CAAA,QAAA,EAAW,UAAA,CAAW,IAAI,CAAA,EAAA,EAAK,WAAW,WAAW,CAAA,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,UAAA,GACJ,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,MAAA,GAC3B,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,CAAA,CAAA,CAAA,GAC1C,EAAA;AACN,EAAA,OAAO,CAAA,QAAA,EAAW,UAAA,CAAW,IAAI,CAAA,EAAG,UAAU,CAAA,CAAA,CAAA;AAChD;AAMO,SAAS,6BAAA,CACd,SACA,WAAA,EACgB;AAEhB,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAMC,kBAAAA,GAAoB,WAAA,CACvB,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAC,CAAA,CACjD,GAAA,CAAI,qBAAqB,CAAA,CACzB,KAAK,IAAI,CAAA;AAEZ,IAAA,IAAI,CAACA,oBAAmB,OAAO,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAS,OAAOA,kBAAAA;AACrB,IAAA,OAAO,GAAGA,kBAAiB;;AAAA,EAAO,OAAO,CAAA,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,MAAM,CAAA;AAC/D,EAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA;AAAA,IAAO,CAAC,GAAA,KAC3C,GAAA,CAAI,QAAA,CAAS,WAAW,QAAQ;AAAA,GAClC;AAEA,EAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,oBAAoB,gBAAA,CAAiB,GAAA,CAAI,qBAAqB,CAAA,CAAE,KAAK,IAAI,CAAA;AAG/E,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,YAAA,GAAe,UAAU,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1D,IAAA,OAAO,GAAG,iBAAiB;;AAAA,EAAO,YAAY,CAAA,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,iBAAA;AACT;AAUO,SAAS,oBAAA,CACd,QAAA,EACA,MAAA,GAA6B,cAAA,EAClB;AACX,EAAA,MAAM,mBAAA,GAAsB,sBAAA,CAAuB,QAAA,EAAU,MAAM,CAAA;AAEnE,EAAA,IAAI,mBAAA,CAAoB,WAAW,CAAA,EAAG;AACpC,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU;AAClC,IAAA,IAAI,CAAC,mBAAA,CAAoB,QAAA,CAAS,KAAK,CAAA,EAAG;AACxC,MAAA,OAAO,GAAA;AAAA,IACT;AAGA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GACE,OAAO,GAAA,CAAI,WAAA,KAAgB,QAAA,GACvB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,GAC1B,GAAA,CAAI,WAAA,IAAe,EAAC;AAAA,IAC5B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,GAAA;AAAA,IACT;AAGA,IAAA,MAAM,gBAAA,GAAmB,6BAAA;AAAA,MACvB,IAAI,OAAA,IAAW,EAAA;AAAA,MACf;AAAA,KACF;AAGA,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA,MACH,SACE,OAAO,gBAAA,KAAqB,WACxB,gBAAA,GACA,IAAA,CAAK,UAAU,gBAAgB,CAAA;AAAA;AAAA,MAErC,aAAa,IAAA,CAAK,SAAA;AAAA,QAChB,WAAA,CAAY,OAAO,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAC;AAAA;AAChE,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAcA,eAAsB,wBAAA,CACpB,YAAA,EACA,SAAA,EACA,MAAA,EACwB;AASxB,EAAA,OAAO,IAAA;AACT;AAhOA,IAmBM,cAAA;AAnBN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAmBA,IAAM,cAAA,GAAqC;AAAA,MACzC,sBAAA,EAAwB,EAAA;AAAA,MACxB,iBAAA,EACE;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,kBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAyDM,6BAAA,EAMO,UAAA;AA/Db,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0BAAA,GAAA;AAsBA,IAAA,UAAA,EAAA;AAEA,IAAA,kBAAA,EAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AAIA,IAAA,oBAAA,EAAA;AAyBA,IAAM,6BAAA,GAAgC,8BAAA;AAM/B,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,MACtB,OAAwB,gCAAA,GACtB,mCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYF,aAAa,OAAA,CACX,UAAA,EAUA,eAAA,GAA2B,KAAA,EACN;AAGrB,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAEnD,QAAA,IAAI,eAAA,EAAiB;AAEnB,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAAA,UAC/C,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,YAAA,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,yBAAyB,yBAAyB,CAAA;AACpF,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,IAAA,CAAK,aAAa,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAA,CAAM,OAAO,KAAA,KAAU;AAC9D,YAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,YAAA,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,yBAAyB,yBAAyB,CAAA;AAAA,UACtF,CAAC,CAAA;AAAA,QACH;AAGA,QAAA,OAAO;AAAA,UACL,UAAU,KAAA,CAAM,cAAA;AAAA,UAChB,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,gBAAgB,KAAA,CAAM,cAAA;AAAA,UACtB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,MAAA,EAAQ,MAAM,MAAA,CAAO;AAAA,SACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,YAAA,CACnB,KAAA,EACA,QAAA,EACe;AAEf,QAAA,OAAO,KAAA,CAAM,SAAA,GAAY,SAAA,IAAa,CAAC,KAAA,CAAM,WAAW,CAAC,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AAE9F,UAAA,IAAI;AAEF,YAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AAEzC,cAAA,MAAM,qBAAA,GAAwB,OAAO,UAAA,EAAW;AAChD,cAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAG/B,cAAA,IAAI,mBAAA,GAA+B;AAAA,gBACjC,EAAA,EAAI,qBAAA;AAAA,gBACJ,IAAA,EAAM,QAAA;AAAA,gBACN,OAAA,EAAS,2BAAA;AAAA,gBACT,UAAA,EAAY,SAAA;AAAA,gBACZ,MAAA,EAAQ;AAAA,eACV;AAEA,cAAA,mBAAA,GAAsB,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,mBAAmB,CAAA;AAGtF,cAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAExG,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB,CAAA,8FAAA,CAAA;AAAA,gBACA,mBAAA,CAAoB,EAAA;AAAA,gBACpB,mBAAA,CAAoB,IAAA;AAAA,gBACpB,mBAAA,CAAoB,OAAA;AAAA,gBACpB,mBAAA,CAAoB,UAAA;AAAA,gBACpB,mBAAA,CAAoB,MAAA;AAAA,gBACpB;AAAA,eACF;AAGA,cAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,mBAAmB,CAAA;AAG/D,cAAA,IAAI,MAAM,WAAA,EAAa;AACrB,gBAAA,KAAA,CAAM,WAAA,CAAY;AAAA,kBAChB,IAAI,mBAAA,CAAoB,EAAA;AAAA,kBACxB,MAAM,mBAAA,CAAoB,IAAA;AAAA,kBAC1B,SAAS,mBAAA,CAAoB,OAAA;AAAA,kBAC7B,YAAY,mBAAA,CAAoB,UAAA;AAAA,kBAChC,QAAQ,mBAAA,CAAoB;AAAA,iBAC7B,CAAA;AAAA,cACH;AAEA,cAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,gBACpB,IAAA,EAAM,iBAAA;AAAA,gBACN,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AACD,cAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,cAAA,KAAA,CAAM,UAAA,GAAa,2BAAA;AACnB,cAAA,KAAA,CAAM,cAAA,GAAiB,iBAAA;AACvB,cAAA;AAAA,YACF;AAEA,YAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAC5B,YAAA,KAAA,CAAM,SAAA,EAAA;AAMN,YAAA,IAAI,KAAA,CAAM,oBAAoB,KAAA,CAAA,EAAW;AACvC,cAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,cAAA;AAAA,YACF;AAAA,UACF,SAAS,KAAA,EAAO;AAEd,YAAA,MAAMC,aAAAA,GAAe,iBAAiB,KAAA,KACnC,KAAA,CAAM,SAAS,YAAA,IAAgB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,CAAA;AAElE,YAAA,IAAIA,aAAAA,EAAc;AAEhB,cAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,cAAA,KAAA,CAAM,UAAA,GAAa,MAAM,UAAA,IAAc,mBAAA;AACvC,cAAA,KAAA,CAAM,cAAA,GAAiB,MAAM,cAAA,IAAkB,SAAA;AAC/C,cAAA;AAAA,YACF;AAGA,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,cAAA,EAAiB,KAAA,CAAM,SAAS,KAAK,KAAK,CAAA;AAGxD,YAAA,MAAM,IAAA,CAAK,QAAA;AAAA,cACT,KAAA;AAAA,cACA,KAAA;AAAA,cACA,sBAAA;AAAA,cACA,CAAA,KAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,OAAA,EAAU,MAAM,WAAW,CAAA;AAAA,aACpD;AAGA,YAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,YAAA,KAAA,CAAM,OAAO,WAAA,CAAY;;AAAA,QAAA,EAAe,YAAY;AAAA,CAAI,CAAA;AAGxD,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,SAAA;AAAA,cACN,MAAA,EAAQ,UAAU,YAAY,CAAA,CAAA;AAAA,cAC9B,MAAM,KAAA,CAAM,WAAA;AAAA,cACZ,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,YAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AACxB,YAAA,KAAA,CAAM,UAAA,GAAa,UAAU,YAAY,CAAA,CAAA;AACzC,YAAA,KAAA,CAAM,cAAA,GAAiB,YAAA;AACvB,YAAA;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,SAAA,IAAa,SAAA,IAAa,CAAC,MAAM,OAAA,EAAS;AAClD,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,QAAQ,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,CAAG,CAAA;AAGtE,UAAA,MAAM,IAAA,CAAK,QAAA;AAAA,YACT,KAAA;AAAA,YACA,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,YACvD,mBAAA;AAAA,YACA,UAAU,QAAQ,CAAA;AAAA,WACpB;AAEA,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,uBAAA;AAAA,YACR,MAAM,KAAA,CAAM,WAAA;AAAA,YACZ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AACD,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,UAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AACxB,UAAA,KAAA,CAAM,UAAA,GAAa,0BAA0B,SAAS,CAAA,CAAA,CAAA;AACtD,UAAA,KAAA,CAAM,cAAA,GAAiB,iBAAA;AAAA,QACzB;AAIA,QAAA,IAAI,KAAA,CAAM,uBAAA,IAA2B,KAAA,CAAM,uBAAA,CAAwB,SAAS,CAAA,EAAG;AAC7E,UAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,KAAA,CAAM,uBAAuB,CAAA;AAAA,QACxD;AAGA,QAAA,MAAM,KAAA,CAAM,OAAO,KAAA,EAAM;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,uBAAA,CAAwB,EAAA,EAAY,GAAA,EAAwC;AACjF,QAAA,OAAO;AAAA,UACL,EAAA;AAAA,UACA,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,kBAAkB,GAAA,CAAI,eAAA;AAAA,UACtB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,YAAA,EAAc,IAAI,WAAA,IAAe,KAAA;AAAA,UACjC,kBAAA,EAAoB,IAAI,gBAAA,IAAoB,KAAA;AAAA,UAC5C,mBAAA,EAAqB,IAAI,iBAAA,IAAqB,KAAA;AAAA,UAC9C,WAAA,EAAa,IAAI,UAAA,IAAc,MAAA;AAAA,UAC/B,gBAAA,EAAkB,GAAA,CAAI,SAAA,EAAW,MAAA,IAAU,IAAA;AAAA,UAC3C,oBAAA,EAAsB,GAAA,CAAI,SAAA,EAAW,SAAA,IAAa,IAAA;AAAA,UAClD,iBAAA,EAAmB,GAAA,CAAI,SAAA,EAAW,OAAA,IAAW,KAAA;AAAA,UAC7C,iBAAA,EAAmB,GAAA,CAAI,SAAA,EAAW,OAAA,IAAW,KAAA;AAAA,UAC7C,oBAAA,EAAsB,IAAI,oBAAA,IAAwB,IAAA;AAAA,UAClD,MAAA,EAAQ,GAAA,CAAI,KAAA,IAAS,EAAC;AAAA,UACtB,UAAA,EAAY,GAAA,CAAI,SAAA,IAAa,EAAC;AAAA,UAC9B,IAAA,EAAM,GAAA,CAAI,GAAA,IAAO,GAAA,CAAI,SAAS,EAAC;AAAA,UAC/B,eAAA,EAAiB,IAAI,cAAA,IAAkB,IAAA;AAAA,UACvC,MAAA,EAAQ,GAAA,CAAI,KAAA,IAAS;AAAC,SACxB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,aAAqB,mBAAA,CACnB,WAAA,EACA,MAAA,EAKC;AAED,QAAA,MAAM,kBAAkB,WAAA,CAAY,mBAAA;AACpC,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,WAAA,CAAY,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAAA,QAC1E;AAEA,QAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,eAAe,CAAA;AAGvE,QAAA,MAAM,cAAA,GAAiB,eAAe,SAAA,EAAW,SAAA;AACjD,QAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,eAAe,CAAA,EAAG,iBAAiB,CAAA,WAAA,EAAc,cAAc,CAAA,CAAA,CAAA,GAAM,WAAW,CAAA,CAAE,CAAA;AAC7H,QAAA,IAAI,cAAA,CAAe,OAAO,MAAA,EAAQ;AAChC,UAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+B,cAAA,CAAe,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAW,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,CAAA,CAAE,IAAI,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,QACnI;AAGA,QAAA,MAAM,WAAA,GAAc,WAAA,CAAW,uBAAA,CAAwB,eAAA,EAAiB,cAAc,CAAA;AAGtF,QAAA,IAAI,WAAA,GAAmD,IAAA;AACvD,QAAA,MAAM,kBAAkB,WAAA,CAAY,mBAAA;AACpC,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,eAAe,CAAA;AAGvE,UAAA,MAAM,cAAA,GAAiB,eAAe,SAAA,EAAW,SAAA;AACjD,UAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,eAAe,CAAA,EAAG,iBAAiB,CAAA,WAAA,EAAc,cAAc,CAAA,CAAA,CAAA,GAAM,WAAW,CAAA,CAAE,CAAA;AAC7H,UAAA,IAAI,cAAA,CAAe,OAAO,MAAA,EAAQ;AAChC,YAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+B,cAAA,CAAe,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAW,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,CAAA,CAAE,IAAI,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UACnI;AAEA,UAAA,WAAA,GAAc,WAAA,CAAW,uBAAA,CAAwB,eAAA,EAAiB,cAAc,CAAA;AAAA,QAClF;AAEA,QAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,WAAA,EAAY;AAAA,MACjD;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,gBACnB,UAAA,EAUoB;AAEpB,QAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,MAAM,IAAA,CAAK,mBAAA;AAAA,UAC9C,UAAA,CAAW,WAAA;AAAA,UACX,UAAA,CAAW;AAAA,SACb;AAGA,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,IAAU,IAAI,aAAA,EAAc;AAGtD,QAAA,MAAM,KAAA,GAAkE;AAAA,UACtE,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,MAAA,CAAO,UAAA,EAAW;AAAA,UAC/C,QAAQ,UAAA,CAAW,MAAA;AAAA,UACnB,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,WAAA,EAAa,WAAW,WAAA,IAAe,GAAA;AAAA,UACvC,OAAA,EAAS;AAAA,YACP,KAAA,EAAO,WAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT;AAAA,UACA,SAAS,UAAA,CAAW,WAAA,IAAe,GAAA,MAAS,GAAA,GAAM,cAAe,WAAA,IAAe,WAAA;AAAA,UAChF,SAAA,EAAW,WAAW,SAAA,IAAa,CAAA;AAAA,UACnC,cAAA,EAAgB,WAAW,cAAA,IAAkB,CAAA;AAAA,UAC7C,cAAA,EAAgB,WAAW,cAAA,IAAkB,CAAA;AAAA,UAC7C,OAAA,EAAS,WAAW,OAAA,IAAW,KAAA;AAAA,UAC/B,WAAW,UAAA,CAAW,SAAA;AAAA,UACtB,YAAY,UAAA,CAAW,UAAA;AAAA,UACvB,gBAAgB,UAAA,CAAW,cAAA;AAAA,UAC3B,gBAAgB,EAAC;AAAA,UACjB,QAAA,EAAU,WAAW,QAAA,IAAY;AAAA,YAC/B,OAAO,EAAC;AAAA,YACR,aAAa,EAAC;AAAA,YACd,UAAA,EAAY;AAAA,WACd;AAAA,UACA,MAAA,EAAQ,WAAW,MAAA,IAAU;AAAA,YAC3B,IAAA,EAAM,EAAA;AAAA,YACN,MAAM,EAAC;AAAA,YACP,OAAA,EAAS,CAAA;AAAA,YACT,SAAS;AAAC,WACZ;AAAA,UACA,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,EAAC;AAAA,UAC5B,MAAA;AAAA,UACA,OAAA,EAAS,UAAA,CAAW,OAAA,IAAW,EAAC;AAAA,UAChC,UAAA,EAAY,WAAW,UAAA,IAAc,CAAA;AAAA,UACrC,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,KAAK,UAAA,CAAW,GAAA;AAAA;AAAA,UAEhB,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,kBAAkB,UAAA,CAAW,gBAAA;AAAA,UAC7B,eAAe,UAAA,CAAW,aAAA;AAAA,UAC1B,WAAW,UAAA,CAAW,SAAA;AAAA,UACtB,eAAe,UAAA,CAAW,aAAA;AAAA,UAC1B,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,cAAc,UAAA,CAAW,YAAA;AAAA,UACzB,iBAAiB,UAAA,CAAW,eAAA;AAAA,UAC5B,KAAA,EAAO,WAAW,KAAA,IAAS,CAAA;AAAA;AAAA;AAAA,UAE3B,UAAA,EAAY,UAAA,CAAW,UAAA,IAAc,CAAC,YAAY,IAAI,CAAA;AAAA,UACtD,kBAAkB,UAAA,CAAW,gBAAA;AAAA,UAC7B,iBAAiB,UAAA,CAAW,eAAA;AAAA,UAC5B,cAAc,UAAA,CAAW,YAAA;AAAA,UACzB,aAAA,EAAe,UAAA,CAAW,aAAA,IAAiB,EAAC;AAAA;AAAA;AAAA,UAG5C,gBAAA,EAAkB,UAAA,CAAW,gBAAA,IAAoB,EAAE,MAAM,QAAA,EAAS;AAAA;AAAA,UAElE,iBAAiB,UAAA,CAAW,eAAA;AAAA,UAC5B,mBAAA,EAAqB,UAAA,CAAW,mBAAA,oBAAuB,IAAI,GAAA,EAAY;AAAA,UACvE,4BAAA,EAA8B,WAAW,4BAAA,IAAgC;AAAA,SAC3E;AACA,QAAA,IAAI,WAAW,SAAA,EAAW;AACxB,UAAA,KAAA,CAAM,YAAY,UAAA,CAAW,SAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,SAAA,GAAY,KAAA;AAAA,QACpB;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,YAAY,KAAA,EAAiC;AAEhE,QAAA,IAAI,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,YAAW,EAAG;AAC5C,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAGA,QAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AACzC,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAIA,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA;AAC7D,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,KAAA,CAAM,gBAAgB,cAAA,CAAe,aAAA;AACrC,UAAA,KAAA,CAAM,cAAc,cAAA,CAAe,UAAA;AACnC,UAAA,KAAA,CAAM,MAAA,GACJ,cAAA,CAAe,UAAA,KAAe,GAAA,IAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,GAC/C,KAAA,CAAM,OAAA,CAAQ,KAAA,GACd,KAAA,CAAM,OAAA,CAAQ,KAAA;AACpB,UAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,UAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAClB,UAAA,KAAA,CAAM,UAAA,GAAa,MAAA;AACnB,UAAA,KAAA,CAAM,cAAA,GAAiB,MAAA;AAAA,QACzB;AAEA,QAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAK,CAAA;AACpE,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,QAAA,GAAW,MAAM,WAAA,KAAgB,GAAA,GACnC,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAEtB,QAAA,MAAM,uBAAuB,KAAA,CAAM,WAAA,KAAgB,GAAA,GAC/C,KAAA,CAAM,iBACN,KAAA,CAAM,cAAA;AAEV,QAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,oBAAA,IAAwB,QAAA,EAAU;AACpE,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,UAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AACxB,UAAA,KAAA,CAAM,UAAA,GAAa,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAW,uBAAuB,QAAQ,CAAA,CAAA,CAAA;AAC3E,UAAA,KAAA,CAAM,cAAA,GAAiB,gBAAA;AAEvB,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAW,uBAAuB,QAAQ,CAAA,CAAA,CAAA;AAAA,YAChE,MAAM,KAAA,CAAM,WAAA;AAAA,YACZ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AACD,UAAA;AAAA,QACF;AAGA,QAAA,IACE,KAAA,CAAM,YAAY,IAAA,KAAS,SAAA,IAC3B,OAAO,KAAA,CAAM,WAAA,CAAY,sBAAsB,QAAA,EAC/C;AAEA,UAAA,MAAM,qBAAqB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,cAAA,EAAgB,MAAM,cAAc,CAAA;AAE9E,UAAA,IAAI,kBAAA,IAAsB,KAAA,CAAM,WAAA,CAAY,iBAAA,EAAmB;AAC7D,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,YAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AACxB,YAAA,KAAA,CAAM,UAAA,GAAa,CAAA,2BAAA,EAA8B,KAAA,CAAM,WAAA,CAAY,iBAAiB,CAAA,WAAA,CAAA;AACpF,YAAA,KAAA,CAAM,cAAA,GAAiB,mBAAA;AAEvB,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,SAAA;AAAA,cACN,QAAQ,KAAA,CAAM,UAAA;AAAA,cACd,MAAM,KAAA,CAAM,WAAA;AAAA,cACZ,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AACD,YAAA;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,gBAAgB,GAAA,EAAK;AAC7B,UAAA,KAAA,CAAM,cAAA,EAAA;AAAA,QACR,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,cAAA,EAAA;AAAA,QACR;AAGA,QAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,UACpB,IAAA,EAAM,cAAA;AAAA,UACN,MAAM,KAAA,CAAM,SAAA;AAAA,UACZ,MAAM,KAAA,CAAM,WAAA;AAAA,UACZ,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AAED,QAAA,KAAA,CAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAG1D,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAGhD,QAAA,KAAA,CAAM,eAAe,OAAA,CAAQ,KAAA;AAK7B,QAAA,OAAA,CAAQ,WAAW,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAGhF,QAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAK,CAAA;AAG9D,QAAA,KAAA,CAAM,gBAAA,GAAmB,gBAAA;AAGzB,QAAA,IAAI,cAAA,GAAyC,WAAA;AAC7C,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,KAAA;AAEJ,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,SAAS,KAAK,CAAA;AACtD,UAAA,QAAA,GAAW,MAAA,CAAO,QAAA;AAClB,UAAA,KAAA,GAAQ,MAAA,CAAO,KAAA;AAAA,QACjB,SAAS,KAAA,EAAO;AAEd,UAAA,cAAA,GAAiB,QAAA;AACjB,UAAA,MAAM,IAAA,CAAK,mBAAA,CAAoB,gBAAA,EAAkB,QAAA,EAAU,KAAK,CAAA;AAChE,UAAA,MAAM,KAAA;AAAA,QACR;AAGA,QAAA,IAAK,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,YAAW,IAAM,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AAGvF,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB,CAAA,iCAAA,CAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB,CAAA,sDAAA,CAAA;AAAA,YACA,qBAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF;AAEA,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAGA,QAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AAGrB,QAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,QAAQ,CAAA;AAK5C,QAAA,MAAM,IAAA,CAAK,0BAAA,CAA2B,QAAA,EAAU,KAAA,EAAO,gBAAgB,CAAA;AACvE,QAAA,MAAM,IAAA,CAAK,iCAAA;AAAA,UACT,QAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAkB,QAAA,EAAU,gBAAgB,KAAK,CAAA;AAI1E,QAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,UAAA,EAAY,MAAA,CAAO,CAAA,EAAA,KAAM;AAGvD,UAAA,MAAM,iBAAA,GAAoB,MAAM,cAAA,CAAe,IAAA;AAAA,YAC7C,SAAO,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,iBAAiB,EAAA,CAAG;AAAA,WACxD;AACA,UAAA,OAAO,CAAC,iBAAA;AAAA,QACV,CAAC,CAAA;AAID,QAAA,IAAK,cAAA,IAAkB,eAAe,MAAA,GAAS,CAAA,IAAM,MAAM,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,EAAG;AACpF,UAAA,MAAM,YAAA,CAAa,eAAA,CAAgB,KAAA,EAAO,cAAA,IAAkB,EAAE,CAAA;AAAA,QAChE;AAIA,QAAA,IAAI,MAAM,QAAA,CAAS,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,MAAM,YAAA,EAAc;AAC/D,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,WAAW,CAAA;AACjE,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB,CAAA,+CAAA,CAAA;AAAA,YACA,eAAA;AAAA,YACA,KAAA,CAAM;AAAA,WACR;AAGA,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,kBAAA;AAAA,cACN,QAAQ,KAAA,CAAM,YAAA;AAAA,cACd,YAAA,EAAc;AAAA,aACf,CAAA;AAAA,UACH;AAEA,UAAA,KAAA,CAAM,QAAA,CAAS,cAAc,EAAC;AAAA,QAChC;AAGA,QAAA,IAAK,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,YAAW,IAAM,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AACvF,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAGA,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,QAAQ,CAAA;AAG7D,QAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,QAAA,KAAA,CAAM,gBAAA,GAAmB,MAAA;AAOzB,QAAA,IAAI,MAAM,cAAA,EAAgB;AAGxB,UAAA,MAAM,IAAA,CAAK,eAAe,KAAK,CAAA;AAG/B,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,cAAA,CAAe,SAAA,CAAU,CAAC,CAAA;AAGnD,UAAA,IAAI,KAAA,CAAM,WAAA,CAAY,IAAA,KAAS,UAAA,IAAc,eAAe,GAAA,EAAK;AAC/D,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,YAAA,KAAA,CAAM,SAAA,GAAY,GAAA;AAClB,YAAA,KAAA,CAAM,UAAA,GAAa,+BAAA;AACnB,YAAA,KAAA,CAAM,cAAA,GAAiB,mBAAA;AACvB,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,SAAA;AAAA,cACN,QAAQ,KAAA,CAAM,UAAA;AAAA,cACd,MAAM,KAAA,CAAM,WAAA;AAAA,cACZ,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAAA,UACH,CAAA,MAAA,IAES,UAAA,KAAe,KAAA,CAAM,WAAA,EAAa;AACzC,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,YAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,UACpB,CAAA,MAEK;AACH,YAAA,KAAA,CAAM,WAAA,GAAc,UAAA;AACpB,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAGhB,YAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,GAAA,IAAO,KAAA,CAAM,QAAQ,KAAA,EAAO;AACpD,cAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,YAC/B,CAAA,MAAO;AACL,cAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,YAC/B;AAAA,UACF;AAGA,UAAA,KAAA,CAAM,cAAA,GAAiB,MAAA;AAGvB,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AACzC,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAMA,QAAA,IAAI,MAAM,WAAA,CAAY,IAAA,KAAS,SAAA,IAAa,CAAC,MAAM,OAAA,EAAS;AAC1D,UAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,8BAAA,CAA+B,KAAK,CAAA;AACtE,UAAA,MAAM,iBAAA,GACJ,CAAC,oBAAA,IAAwB,aAAA,CAAc,iBAAA;AAEzC,UAAA,IAAI,iBAAA,EAAmB;AACrB,YAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,UACxB;AAAA,QACF;AAGA,QAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,UACpB,IAAA,EAAM,gBAAA;AAAA,UACN,MAAM,KAAA,CAAM,SAAA;AAAA,UACZ,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,eAAe,KAAA,EAAiC;AACnE,QAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AACzB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,OAAA;AAE1C,QAAA,IAAI;AAEF,UAAA,MAAM,cAAc,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,YAAY,CAAA;AAGtE,UAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,WAAA,CAAY,KAAK,CAAA;AACzE,UAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,WAAA,CAAY,KAAK,CAAA;AACzE,UAAA,MAAM,WAAA,GAAqB;AAAA,YACzB,EAAA,EAAI,YAAA;AAAA,YACJ,KAAA,EAAO,YAAY,KAAA,IAAS,YAAA;AAAA,YAC5B,MAAM,WAAA,CAAY,IAAA;AAAA,YAClB,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,YACrB,iBAAA,EAAmB,YAAY,eAAA,IAAmB,IAAA;AAAA,YAClD,YAAA,EAAc,WAAA,CAAY,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,YAC1C,mBAAA,EAAqB,WAAA,CAAY,KAAA,EAAO,MAAA,IAAU,IAAA;AAAA,YAClD,uBAAA,EAAyB,WAAA,CAAY,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,YAC9D,gBAAA,EAAkB,WAAA,CAAY,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,YACjD,kCAAA,EAAoC,WAAA,CAAY,KAAA,EAAO,wBAAA,IAA4B,IAAA;AAAA,YACnF,gBAAA,EAAkB,WAAA,CAAY,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,YACjD,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,YAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,YACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,YAC5D,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,YAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,YACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,YAC5D,0BAAA,EAA4B,aAAa,MAAA,CAAO,QAAA;AAAA,YAChD,sCAAA,EAAwC,aAAa,MAAA,CAAO,eAAA;AAAA,YAC5D,0CAAA,EAA4C,aAAa,MAAA,CAAO,mBAAA;AAAA,YAChE,YAAA,EAAc,WAAA,CAAY,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,YAC1C,mBAAA,EAAqB,WAAA,CAAY,KAAA,EAAO,MAAA,IAAU,IAAA;AAAA,YAClD,uBAAA,EAAyB,WAAA,CAAY,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,YAC9D,gBAAA,EAAkB,WAAA,CAAY,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,YACjD,kCAAA,EAAoC,WAAA,CAAY,KAAA,EAAO,wBAAA,IAA4B,IAAA;AAAA,YACnF,gBAAA,EAAkB,WAAA,CAAY,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,YACjD,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,YAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,YACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,YAC5D,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,YAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,YACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,YAC5D,0BAAA,EAA4B,aAAa,MAAA,CAAO,QAAA;AAAA,YAChD,sCAAA,EAAwC,aAAa,MAAA,CAAO,eAAA;AAAA,YAC5D,0CAAA,EAA4C,aAAa,MAAA,CAAO;AAAA,WAClE;AAGA,UAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,MAAM,IAAA,CAAK,mBAAA;AAAA,YAC9C,WAAA;AAAA,YACA,KAAA,CAAM;AAAA,WACR;AAGA,UAAA,IAAI;AACF,YAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,GAAA;AAAA,cAC/C,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW;AAAA,aAChD;AACA,YAAA,MAAM,gBAAA,CAAiB,iBAAA,CAAkB,KAAA,CAAM,QAAA,EAAU,YAAY,CAAA;AAAA,UACvE,SAAS,YAAA,EAAc;AACrB,YAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,YAAY,CAAA;AAAA,UAE1E;AAGA,UAAA,KAAA,CAAM,WAAA,GAAc,WAAA;AACpB,UAAA,KAAA,CAAM,QAAQ,KAAA,GAAQ,WAAA;AACtB,UAAA,KAAA,CAAM,QAAQ,KAAA,GAAQ,WAAA;AAGtB,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,cAAA,EAAgB,IAAA,IAAQ,EAAC;AAC5C,UAAA,MAAM,UAAA,GAAa,MAAM,cAAA,EAAgB,UAAA;AACzC,UAAA,MAAM,0BAA0B,UAAA,EAAY,uBAAA;AAC5C,UAAA,MAAM,0BAA0B,UAAA,EAAY,uBAAA;AAG5C,UAAA,KAAA,CAAM,UAAU,EAAE,GAAG,KAAA,CAAM,OAAA,EAAS,GAAG,IAAA,EAAK;AAG5C,UAAA,IAAI,kBAAA;AACJ,UAAA,IAAI,sBAAA;AAEJ,UAAA,IAAI,uBAAA,IAA2B,IAAA,CAAK,uBAAuB,CAAA,KAAM,KAAA,CAAA,EAAW;AAC1E,YAAA,MAAM,aAAA,GAAgB,KAAK,uBAAuB,CAAA;AAClD,YAAA,kBAAA,GAAqB,OAAO,aAAA,KAAkB,QAAA,GAC1C,aAAA,GACA,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,UAClC;AAGA,UAAA,IAAI,uBAAA,IAA2B,IAAA,CAAK,uBAAuB,CAAA,KAAM,KAAA,CAAA,EAAW;AAC1E,YAAA,MAAM,eAAA,GAAkB,KAAK,uBAAuB,CAAA;AACpD,YAAA,MAAM,kBAA4B,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,GAC3D,eAAA,GACA,CAAC,eAAyB,CAAA;AAE9B,YAAA,MAAM,sBAA6B,EAAC;AACpC,YAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAC5C,cAAA,IAAI,OAAO,cAAA,KAAmB,QAAA,IAAY,cAAA,CAAe,UAAA,CAAW,eAAe,CAAA,EAAG;AACpF,gBAAA,IAAI;AACF,kBAAA,MAAM,aAAa,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,SAAS,cAAc,CAAA;AACtE,kBAAA,IAAI,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,IAAA,EAAM;AACzC,oBAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,sBACvB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,sBACtB,IAAA,EAAM,MAAA;AAAA,sBACN,IAAA,EAAM,cAAA;AAAA,sBACN,IAAA,EAAM,WAAW,IAAA,CAAK,IAAA;AAAA,sBACtB,QAAA,EAAU,WAAW,IAAA,CAAK,QAAA;AAAA,sBAC1B,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAA,IAAS,KAAA,CAAA;AAAA,sBAChC,MAAA,EAAQ,UAAA,CAAW,IAAA,CAAK,MAAA,IAAU,KAAA;AAAA,qBACnC,CAAA;AAAA,kBACH;AAAA,gBACF,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0CAAA,EAA6C,cAAc,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,gBACjF;AAAA,cACF;AAAA,YACF;AACA,YAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,cAAA,sBAAA,GAAyB,IAAA,CAAK,UAAU,mBAAmB,CAAA;AAAA,YAC7D;AAAA,UACF;AAGA,UAAA,KAAA,CAAM,WAAA,GAAc,GAAA;AACpB,UAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAG7B,UAAA,KAAA,CAAM,UAAA,GAAa,CAAC,WAAA,CAAY,IAAI,CAAA;AACpC,UAAA,KAAA,CAAM,4BAAA,GAA+B,IAAA;AAIrC,UAAA,IAAI,sBAAsB,sBAAA,EAAwB;AAChD,YAAA,MAAM,gBAAA,GAAmB,OAAO,UAAA,EAAW;AAC3C,YAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AACtC,YAAA,MAAM,cAAA,GAA0B;AAAA,cAC9B,EAAA,EAAI,gBAAA;AAAA,cACJ,IAAA,EAAM,MAAA;AAAA,cACN,SAAS,kBAAA,IAAsB,EAAA;AAAA,cAC/B,UAAA,EAAY,gBAAA;AAAA,cACZ,WAAA,EAAa;AAAA,aACf;AAGA,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB,CAAA,mGAAA,CAAA;AAAA,cACA,cAAA,CAAe,EAAA;AAAA,cACf,cAAA,CAAe,IAAA;AAAA,cACf,cAAA,CAAe,OAAA;AAAA,cACf,eAAe,WAAA,IAAe,IAAA;AAAA,cAC9B,cAAA,CAAe,UAAA;AAAA,cACf,WAAA,CAAY;AAAA,aACd;AAGA,YAAA,KAAA,CAAM,cAAA,CAAe,KAAK,cAAc,CAAA;AAGxC,YAAA,IAAI,MAAM,WAAA,EAAa;AACrB,cAAA,KAAA,CAAM,YAAY,cAAc,CAAA;AAAA,YAClC;AAAA,UACF;AAGA,UAAA,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAA;AAGvB,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,eAAA;AAAA,YACN,YAAA,EAAc,YAAA;AAAA,YACd,eAAA,EAAiB,MAAM,WAAA,CAAY,KAAA;AAAA,YACnC,SAAA,EAAW,KAAK,GAAA;AAAI,WACd,CAAA;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,UAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAO,OAAO,yBAAA,EAA2B,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAE,CAAA;AAC/F,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,MAEA,OAAe,iBAAiB,KAAA,EAA2C;AACzE,QAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,KAAA;AAClD,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAC5C,QAAA,OAAO,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,GAAA,IAAO,UAAA,KAAe,KAAA;AAAA,MACvE;AAAA,MAEA,aAAqB,4BAAA,CACnB,KAAA,EACA,QAAA,EACA,QAAA,EACwB;AACxB,QAAA,IAAI,CAAC,QAAA,IAAY,EAAE,eAAA,IAAmB,QAAA,CAAA,EAAW;AAC/C,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,YAAY,QAAA,CAAS,aAAA;AAI3B,UAAA,IACE,OAAO,SAAA,EAAW,UAAA,KAAe,cACjC,OAAO,SAAA,EAAW,QAAQ,UAAA,EAC1B;AACA,YAAA,OAAO,IAAA;AAAA,UACT;AAEA,UAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,UAAA,CAAW,WAAW,CAAC,CAAA;AAU5D,UAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,CAAK,qBAAqB,UAAA,EAAY;AACxD,YAAA,OAAO,IAAA;AAAA,UACT;AAEA,UAAA,OAAO,MAAM,KAAK,gBAAA,CAAiB;AAAA,YACjC,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,QAAA;AAAA,YACA,UAAA,EAAY,MAAM,MAAA,EAAQ;AAAA,WAC3B,CAAA;AAAA,QACH,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,aAAqB,qBAAA,CACnB,KAAA,EACA,eAAA,EACkB;AAClB,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,UAAA,GAAa,gBAAgB,IAAA,EAAK;AACxC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,IAAA;AAAA,QACT;AAIA,QAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,4BAAA;AAAA,UACnC,KAAA;AAAA,UACA,UAAA;AAAA,UACA,KAAA,CAAM;AAAA,SACR;AACA,QAAA,IAAI,iBAAA,KAAsB,IAAA,IAAQ,iBAAA,KAAsB,MAAA,EAAW;AACjE,UAAA,OAAO,IAAA,CAAK,iBAAiB,iBAAiB,CAAA;AAAA,QAChD;AAEA,QAAA,MAAM,kBAAA,GAAqB,MAAM,IAAA,CAAK,4BAAA;AAAA,UACpC,KAAA;AAAA,UACA,UAAA;AAAA,UACA,KAAA,CAAM,QAAQ,QAAA,EAAU;AAAA,SAC1B;AACA,QAAA,IAAI,kBAAA,KAAuB,IAAA,IAAQ,kBAAA,KAAuB,MAAA,EAAW;AACnE,UAAA,OAAO,IAAA,CAAK,iBAAiB,kBAAkB,CAAA;AAAA,QACjD;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MAEA,OAAe,mBAAmB,KAAA,EAAwC;AACxE,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,aAAqC,EAAC;AAC5C,QAAA,KAAA,MAAW,CAAC,OAAA,EAAS,QAAQ,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,UACvC;AAAA,SACF,EAAG;AACD,UAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA;AAAA,UACF;AACA,UAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AAC/C,YAAA;AAAA,UACF;AACA,UAAA,UAAA,CAAW,IAAI,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA;AAAA,QACpC;AACA,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MAEA,OAAe,qCACb,KAAA,EAC4C;AAC5C,QAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,GAAA,GAAM,KAAA;AACZ,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,SAAqD,EAAC;AAC5D,QAAA,KAAA,MAAW,KAAA,IAAS,IAAI,SAAA,EAAW;AACjC,UAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,UAAA,MAAM,QAAA,GAAW,KAAA;AAKjB,UAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,UAAA,MAAM,IAAA,GACJ,OAAO,QAAA,CAAS,IAAA,KAAS,WAAW,QAAA,CAAS,IAAA,CAAK,MAAK,GAAI,EAAA;AAC7D,UAAA,IAAI,CAAC,IAAA,EAAM;AACX,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,CAAC,CAAC,QAAA,CAAS,UAAU,CAAA;AAAA,QACrD;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,aAAqB,iBAAA,CACnB,KAAA,EACA,QAAA,EACkB;AAClB,QAAA,IAAI;AACF,UAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,QAAQ,CAAA;AAC/D,UAAA,OAAO,UAAU,IAAA,KAAS,SAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,aAAqB,8BAAA,CACnB,KAAA,EACA,SAAA,EACgD;AAChD,QAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,QAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,QAAA,MAAM,KAAA,GAAoE;AAAA,UACxE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA;AAAU,SACnC;AACA,QAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,QAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAY,KAAA,CAAM,OAAO,QAAA,CAAS,cAAA,IAAiB,IAAK,EAAE,CAAA;AAClF,QAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAY,KAAA,CAAM,OAAO,QAAA,CAAS,aAAA,IAAgB,IAAK,EAAE,CAAA;AAChF,QAAA,MAAM,YAAY,IAAI,GAAA,CAAY,MAAA,CAAO,IAAA,CAAK,aAAa,CAAC,CAAA;AAC5D,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAgD;AAEzE,QAAA,MAAM,kBAAA,GAAqB,CACzB,eAAA,KACG;AACH,UAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,YAAA,GAAA,CAAI,GAAA,CAAI,SAAS,IAAI,CAAA;AACrB,YAAA,IAAI,SAAS,QAAA,EAAU;AACrB,cAAA,QAAA,CAAS,GAAA,CAAI,SAAS,IAAI,CAAA;AAAA,YAC5B;AAAA,UACF;AAAA,QACF,CAAA;AAEA,QAAA,MAAM,iBAAA,GAAoB,OACxB,IAAA,KACgD;AAChD,UAAA,IAAI,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,YAAA,OAAO,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,UACnC;AACA,UAAA,IAAI,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG;AACzB,YAAA,YAAA,CAAa,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC/B,YAAA,OAAO,QAAA;AAAA,UACT;AACA,UAAA,IAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AACxB,YAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAO,CAAA;AAC9B,YAAA,OAAO,OAAA;AAAA,UACT;AACA,UAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,YAAA,YAAA,CAAa,GAAA,CAAI,MAAM,MAAM,CAAA;AAC7B,YAAA,OAAO,MAAA;AAAA,UACT;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAC3C,YAAA,WAAA,CAAY,IAAI,IAAI,CAAA;AACpB,YAAA,YAAA,CAAa,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC/B,YAAA,OAAO,QAAA;AAAA,UACT,CAAA,CAAA,MAAQ;AAAA,UAER;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,cAAc,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,IAAI,CAAA;AAC9D,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,UAAA,CAAW,IAAI,IAAI,CAAA;AACnB,cAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAO,CAAA;AAC9B,cAAA,OAAO,OAAA;AAAA,YACT;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAEA,UAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,YAAA,YAAA,CAAa,GAAA,CAAI,MAAM,MAAM,CAAA;AAC7B,YAAA,OAAO,MAAA;AAAA,UACT;AAEA,UAAA,YAAA,CAAa,GAAA,CAAI,MAAM,IAAI,CAAA;AAC3B,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AAEA,QAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,UAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,UAAA,MAAM,WAAW,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAA;AAChD,UAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AACzB,YAAA;AAAA,UACF;AACA,UAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAEpB,UAAA,IAAI,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC5B,YAAA,IAAI,QAAA,GAAoB,IAAA;AACxB,YAAA,IAAI;AACF,cAAA,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,YAC/D,CAAA,CAAA,MAAQ;AACN,cAAA,QAAA,GAAW,IAAA;AAAA,YACb;AACA,YAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,cAAA;AAAA,YACF;AAEA,YAAA,kBAAA,CAAmB,IAAA,CAAK,oCAAA,CAAqC,QAAQ,CAAC,CAAA;AAEtE,YAAA,MAAM,KAAA,GACJ,OAAQ,QAAA,CAA8C,KAAA,EAAO,WAC7D,QAAA,GACM,QAAA,CAA2C,MAAM,MAAA,GACnD,EAAA;AACN,YAAA,MAAM,KAAA,GACJ,OAAQ,QAAA,CAA8C,KAAA,EAAO,WAC7D,QAAA,GACM,QAAA,CAA2C,MAAM,MAAA,GACnD,EAAA;AAEN,YAAA,IAAI,KAAA,CAAM,MAAK,EAAG;AAChB,cAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,YACnD;AACA,YAAA,IAAI,KAAA,CAAM,MAAK,EAAG;AAChB,cAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,YACnD;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,YAAA,IAAI,SAAA,GAAqB,IAAA;AACzB,YAAA,IAAI;AACF,cAAA,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,QAAQ,IAAI,CAAA;AAAA,YACjE,CAAA,CAAA,MAAQ;AACN,cAAA,SAAA,GAAY,IAAA;AAAA,YACd;AACA,YAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,cAAA;AAAA,YACF;AAEA,YAAA,kBAAA,CAAmB,IAAA,CAAK,oCAAA,CAAqC,SAAS,CAAC,CAAA;AAEvE,YAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAS,SAAA,CAAkC,KAAK,CAAA,GAC9D,SAAA,CAAmC,QACrC,EAAC;AACL,YAAA,KAAA,MAAW,aAAa,KAAA,EAAO;AAC7B,cAAA,MAAM,WACJ,OAAO,SAAA,KAAc,QAAA,GACjB,SAAA,CAAU,MAAK,GACf,OAAQ,SAAA,EAAkC,IAAA,KAAS,WACjD,MAAA,CAAQ,SAAA,CAA+B,IAAI,CAAA,CAAE,MAAK,GAClD,EAAA;AACR,cAAA,IAAI,CAAC,QAAA,EAAU;AACb,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,SAAS,UAAA,CAAW,WAAW,KAAK,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AACnE,gBAAA;AAAA,cACF;AAEA,cAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,QAAQ,CAAA;AAChD,cAAA,IAAI,OAAA,EAAS;AACX,gBAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAAA,cAC9C;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA;AACzC,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,OAAA,GAAmB,IAAA;AACvB,UAAA,IAAI;AACF,YAAA,OAAA,GAAU,MAAM,MAAA,EAAO;AAAA,UACzB,CAAA,CAAA,MAAQ;AACN,YAAA,OAAA,GAAU,IAAA;AAAA,UACZ;AACA,UAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,YAAA;AAAA,UACF;AAEA,UAAA,kBAAA,CAAmB,IAAA,CAAK,oCAAA,CAAqC,OAAO,CAAC,CAAA;AAErE,UAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAS,OAAA,CAA+B,IAAI,CAAA,GACzD,OAAA,CAAgC,OAClC,EAAC;AACL,UAAA,KAAA,MAAW,YAAY,IAAA,EAAM;AAC3B,YAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,cAAA;AAAA,YACF;AACA,YAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,YAAA,IAAI,CAAC,OAAA,EAAS;AACZ,cAAA;AAAA,YACF;AAEA,YAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,OAAO,CAAA;AAC/C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,UACtD,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC;AAAA,SAClE;AAAA,MACF;AAAA,MAEA,OAAe,iBAAiB,KAAA,EAA2C;AACzE,QAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AAAA,MAC5D;AAAA,MAEA,OAAe,iBAAiB,KAAA,EAAoC;AAClE,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,QAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAA;AAAA,MAC9C;AAAA,MAEA,OAAe,qBAAqB,KAAA,EAA0B;AAC5D,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,QAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC9C,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,KAAA,CAAM,IAAI,UAAU,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,MACzB;AAAA,MAEA,OAAe,oBACb,SAAA,EACiC;AACjC,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI,cAAc,IAAA,EAAM;AACtB,UAAA,OAAO,EAAC;AAAA,QACV;AACA,QAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7D,UAAA,OAAO,EAAC;AAAA,QACV;AACA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,MAEA,OAAe,oBACb,GAAA,EACwC;AACxC,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,qBAAqB,CAAA;AAC7C,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AACjC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,SAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AACzD,QAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AACxC,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,MACvB;AAAA,MAEA,OAAe,iCAAiC,MAAA,EAU9C;AACA,QAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,MAAA,CAAO,mBAAmB,CAAA;AAC1D,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,aAAa,CAAA;AAChE,QAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,oBAAoB,CAAA;AAE9E,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,eAAA,CAAgB,IAAI,aAAa,CAAA;AAAA,QACnC;AACA,QAAA,IAAI,oBAAA,EAAsB;AACxB,UAAA,eAAA,CAAgB,IAAI,oBAAoB,CAAA;AAAA,QAC1C;AAEA,QAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,UAAA,OAAO;AAAA,YACL,WAAW,CAAC,EAAE,SAAA,EAAW,IAAI,CAAA;AAAA,YAC7B,YAAA,sBAAkB,GAAA;AAAY,WAChC;AAAA,QACF;AAEA,QAAA,MAAM,YAAA,GACJ,OAAO,MAAA,CAAO,YAAA,KAAiB,YAAY,MAAA,CAAO,YAAA,GAAe,CAAA,GAC7D,MAAA,CAAO,YAAA,GACP,MAAA;AACN,QAAA,MAAM,eAAA,GACJ,OAAO,MAAA,CAAO,eAAA,KAAoB,YAAY,MAAA,CAAO,eAAA,GAAkB,CAAA,GACnE,MAAA,CAAO,eAAA,GACP,CAAA;AACN,QAAA,MAAM,cAAA,GACJ,OAAO,YAAA,KAAiB,QAAA,GACpB,KAAK,GAAA,CAAI,YAAA,GAAe,eAAA,EAAiB,CAAC,CAAA,GAC1C,MAAA;AACN,QAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,UAAA,OAAO,EAAE,SAAA,EAAW,IAAI,YAAA,kBAAc,IAAI,KAAY,EAAE;AAAA,QAC1D;AAEA,QAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoC;AAC9D,QAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,QAAA,KAAA,MAAW,CAAC,QAAQ,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AACjE,UAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AACpC,YAAA;AAAA,UACF;AACA,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA;AAC9C,UAAA,IAAI,CAAC,MAAA,IAAU,CAAC,gBAAgB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAChD,YAAA;AAAA,UACF;AACA,UAAA,iBAAA,CAAkB,GAAA,CAAI,OAAO,KAAK,CAAA;AAClC,UAAA,IAAI,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAC3C,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,MAAA,GAAS,EAAC;AACV,YAAA,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA;AAAA,UACxC;AACA,UAAA,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,GAAI,QAAA;AAAA,QACxB;AAEA,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACxE,QAAA,MAAM,eAAA,GACJ,aAAA,CAAc,MAAA,GAAS,CAAA,GACnB,aAAA,CAAc,MAAM,CAAA,EAAG,cAAc,CAAA,GACrC,CAAC,CAAC,CAAA;AAER,QAAA,MAAM,YAA0C,EAAC;AACjD,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,QAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,UAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,KAAK,KAAK,EAAC;AAC5C,UAAA,MAAM,YAAoC,EAAC;AAC3C,UAAA,KAAA,MAAW,YAAA,IAAgB,OAAO,mBAAA,EAAqB;AACrD,YAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,YAAY,CAAC,CAAA,EAAG;AAC/C,cAAA,SAAA,CAAU,YAAY,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA;AAAA,YAC/C;AAAA,UACF;AACA,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,SAAA;AAAA,YACA,GAAI,aAAA,IAAiB,IAAA,CAAK,gBAAA,CAAiB,OAAO,aAAa,CAAC,CAAA,GAC5D,EAAE,UAAA,EAAY,MAAA,CAAO,aAAa,CAAA,KAClC,EAAC;AAAA,YACL,GAAI,oBAAA,IAAwB,IAAA,CAAK,gBAAA,CAAiB,OAAO,oBAAoB,CAAC,CAAA,GAC1E,EAAE,iBAAA,EAAmB,MAAA,CAAO,oBAAoB,CAAA,KAChD;AAAC,WACN,CAAA;AAED,UAAA,KAAA,MAAW,gBAAgB,eAAA,EAAiB;AAC1C,YAAA,MAAM,SAAS,KAAA,KAAU,CAAA,GAAI,eAAe,CAAA,EAAG,YAAY,KAAK,KAAK,CAAA,CAAA;AACrE,YAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,KAAK,MAAA,CAAO,SAAA,EAAW,MAAM,CAAA,EAAG;AAClE,cAAA,YAAA,CAAa,IAAI,MAAM,CAAA;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AAAA,MACnC;AAAA,MAEA,aAAqB,2BAAA,CACnB,KAAA,EACA,QAAA,EACA,GAAA,EACkB;AAClB,QAAA,IAAI,CAAC,QAAA,IAAY,EAAE,eAAA,IAAmB,QAAA,CAAA,EAAW;AAC/C,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,YAAY,QAAA,CAAS,aAAA;AAI3B,UAAA,IACE,OAAO,SAAA,EAAW,UAAA,KAAe,cACjC,OAAO,SAAA,EAAW,QAAQ,UAAA,EAC1B;AACA,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,UAAA,CAAW,WAAW,CAAC,CAAA;AAS5D,UAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,CAAK,iBAAiB,UAAA,EAAY;AACpD,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,MAAM,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,QAAA,EAAU;AAAA,YACtC,GAAA;AAAA,YACA,KAAA,EAAO;AAAA,WACR,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,aAAqB,gCAAA,CACnB,KAAA,EACA,GAAA,EACe;AACf,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AAC9C,QAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,IAAA;AAElE,QAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,2BAAA;AAAA,UACjC,KAAA;AAAA,UACA,KAAA,CAAM,GAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,MAAM,gBAAA,GAAmB,eAAA,GACrB,KAAA,GACA,MAAM,IAAA,CAAK,2BAAA,CAA4B,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,OAAO,CAAA;AAEtF,QAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,gBAAA,EAAkB;AACzC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,UAAA,KAAA,CAAM,MAAA,CAAO,SAAS,GAAA,GAAM,OAAA;AAC5B,UAAA,KAAA,CAAM,MAAA,CAAO,SAAS,KAAA,GAAQ,OAAA;AAAA,QAChC;AAAA,MACF;AAAA,MAEA,OAAe,mCAAA,CACb,cAAA,EACA,cAAA,EACyB;AACzB,QAAA,MAAM,OAAgC,EAAC;AAEvC,QAAA,IACE,eAAe,qBAAA,IACf,IAAA,CAAK,gBAAA,CAAiB,cAAA,CAAe,UAAU,CAAA,EAC/C;AACA,UAAA,IAAA,CAAK,cAAA,CAAe,qBAAqB,CAAA,GAAI,cAAA,CAAe,WAAY,IAAA,EAAK;AAAA,QAC/E;AAEA,QAAA,IACE,eAAe,uBAAA,IACf,IAAA,CAAK,gBAAA,CAAiB,cAAA,CAAe,iBAAiB,CAAA,EACtD;AACA,UAAA,IAAA,CAAK,cAAA,CAAe,uBAAuB,CAAA,GACzC,cAAA,CAAe,kBAAmB,IAAA,EAAK;AAAA,QAC3C;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,OAAe,4BACb,QAAA,EACgC;AAChC,QAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,SAAS,UAAU,CAAA,GACnD,SAAS,UAAA,CAAW,IAAA;AAAA,UAClB,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU,IAAA,KAAS;AAAA,SACpC,GACA,IAAA;AAEJ,QAAA,IAAI,CAAC,aAAA,EAAe;AAClB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,SAAS,SAAS,CAAA;AAC1D,UAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,YAAA,OAAO,MAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,OAAe,4BACb,cAAA,EACyC;AACzC,QAAA,MAAM,aAAsC,EAAC;AAE7C,QAAA,IAAI,eAAe,qBAAA,EAAuB;AACxC,UAAA,UAAA,CAAW,cAAA,CAAe,qBAAqB,CAAA,GAAI;AAAA,YACjD,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,QACF;AAEA,QAAA,IAAI,eAAe,uBAAA,EAAyB;AAC1C,UAAA,UAAA,CAAW,cAAA,CAAe,uBAAuB,CAAA,GAAI;AAAA,YACnD,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,QACF;AAEA,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACxC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,6BAAA;AAAA,YACN,WAAA,EACE,qEAAA;AAAA,YACF,UAAA,EAAY;AAAA,cACV,IAAA,EAAM,QAAA;AAAA,cACN,UAAA;AAAA,cACA,UAAU;AAAC;AACb;AACF,SACF;AAAA,MACF;AAAA,MAEA,aAAqB,gCAAA,CACnB,KAAA,EACA,QAAA,EACA,gBACA,cAAA,EACkC;AAClC,QAAA,MAAM,eAAe,IAAA,CAAK,mCAAA;AAAA,UACxB,cAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,2BAAA,CAA4B,cAAc,CAAA;AAErE,QAAA,IACE,CAAC,aAAA,IACA,CAAC,IAAA,CAAK,gBAAA,CAAiB,cAAA,CAAe,UAAU,CAAA,IAC/C,CAAC,IAAA,CAAK,gBAAA,CAAiB,cAAA,CAAe,iBAAiB,CAAA,EACzD;AACA,UAAA,OAAO,YAAA;AAAA,QACT;AAEA,QAAA,IAAI,UAAA,GAAa,QAAA;AACjB,QAAA,IAAI,gBAAA,GAAmB,sBAAsB,QAAQ,CAAA,CAAA;AACrD,QAAA,IAAI;AACF,UAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,QAAQ,CAAA;AAC/D,UAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,YAAA,UAAA,GACE,OAAQ,QAAA,CAAiC,KAAA,KAAU,QAAA,IAClD,QAAA,CAA+B,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GACjD,QAAA,CAA+B,KAAA,CAAM,MAAK,GAC3C,UAAA;AACN,YAAA,gBAAA,GACE,OAAQ,QAAA,CAA2C,eAAA,KAAoB,QAAA,IACtE,QAAA,CAAyC,eAAA,CAAgB,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GACrE,QAAA,CAAyC,eAAA,CAAgB,MAAK,GAC/D,gBAAA;AAAA,UACR;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,MAAM,YAAA,GAAe;AAAA,UACnB,2EAAA;AAAA,UACA,8BAA8B,6BAA6B,CAAA,CAAA,CAAA;AAAA,UAC3D,+CAAA;AAAA,UACA,sDAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,IAAI,CAAA;AAEX,QAAA,MAAM,OAAA,GAA0B;AAAA,UAC9B,QAAA,EAAU;AAAA,YACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,YACxC;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,SAAS,IAAA,CAAK,SAAA;AAAA,gBACZ;AAAA,kBACE,KAAA,EAAO;AAAA,oBACL,IAAA,EAAM,QAAA;AAAA,oBACN,KAAA,EAAO,UAAA;AAAA,oBACP,WAAA,EAAa;AAAA,mBACf;AAAA,kBACA,qBAAA,EAAuB,eAAe,qBAAA,IAAyB,IAAA;AAAA,kBAC/D,uBAAA,EAAyB,eAAe,uBAAA,IAA2B,IAAA;AAAA,kBACnE,QAAA,EAAU,eAAe,UAAA,IAAc,IAAA;AAAA,kBACvC,eAAA,EAAiB,eAAe,iBAAA,IAAqB;AAAA,iBACvD;AAAA,gBACA,IAAA;AAAA,gBACA;AAAA;AACF;AACF,WACF;AAAA,UACA,KAAA,EAAO,MAAM,MAAA,CAAO,KAAA;AAAA,UACpB,KAAA,EAAO,CAAC,aAAa,CAAA;AAAA,UACrB,MAAA,EAAQ,KAAA;AAAA,UACR,UAAA,EAAY,yBAAyB,QAAQ,CAAA,CAAA;AAAA,UAC7C,YAAA;AAAA,UACA,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,UAClC,mBAAA,EAAqB,KAAA;AAAA,UACrB,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,EAAE,IAAA,EAAM,6BAAA;AAA8B;AAClD,SACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,UAAA,CAAW,OAAA,CAAQ,SAAS,KAAK,CAAA;AAC5D,UAAA,OAAO,IAAA,CAAK,2BAAA,CAA4B,QAAQ,CAAA,IAAK,YAAA;AAAA,QACvD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,kEAAkE,QAAQ,CAAA,CAAA,CAAA;AAAA,YAC1E;AAAA,WACF;AACA,UAAA,OAAO,YAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,OAAe,8BAAA,CACb,KAAA,EACA,MAAA,EACA,SAAA,EACM;AACN,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAK,SAAS,CAAA,CAAE,WAAW,CAAA,EAAG;AAClD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,MAAM,IAAA,CAAK,gCAAA;AACjB,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AACrC,QAAA,MAAM,QAAA,GACJ,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GACvE,WAAA,GACD,EAAC;AACP,QAAA,QAAA,CAAS,MAAM,CAAA,GAAI,SAAA;AACnB,QAAA,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,QAAA;AAAA,MACvB;AAAA,MAEA,aAAqB,0BACnB,KAAA,EACkB;AAClB,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,EAAC;AAChF,QAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,IAAI,CAAC,MAAM,mBAAA,EAAqB;AAC9B,UAAA,KAAA,CAAM,mBAAA,uBAA0B,GAAA,EAAY;AAAA,QAC9C;AAEA,QAAA,MAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,WAAA,CAAY,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,WAAW,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,CAAA;AAChF,QAAA,IAAI,MAAM,4BAAA,EAA8B;AACtC,UAAA,KAAA,CAAM,mBAAA,CAAoB,OAAO,MAAM,CAAA;AAAA,QACzC,CAAA,MAAA,IAAW,KAAA,CAAM,mBAAA,CAAoB,GAAA,CAAI,MAAM,CAAA,EAAG;AAChD,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAC1D,QAAA,MAAM,sBAAA,GAAyB,cAAA,CAAe,IAAA,CAAK,CAAC,OAAA,KAAY;AAC9D,UAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AACtC,UAAA,IAAI,OAAA,CAAQ,QAAQ,OAAO,KAAA;AAC3B,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,IAAI,CAAC,KAAA,CAAM,4BAAA,IAAgC,sBAAA,EAAwB;AACjE,UAAA,KAAA,CAAM,mBAAA,CAAoB,IAAI,MAAM,CAAA;AACpC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,qBAAiC,EAAC;AACxC,QAAA,MAAM,kBAAkB,IAAA,CAAK,kBAAA,CAAmB,KAAA,CAAM,MAAA,EAAQ,UAAU,GAAG,CAAA;AAC3E,QAAA,MAAM,qBAAA,uBAA4B,GAAA,EAAY;AAC9C,QAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAC7D,QAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAoB;AACrD,QAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,UAAA,IAAI,KAAA,CAAM,WAAW,YAAA,EAAc;AACjC,YAAA;AAAA,UACF;AACA,UAAA,oBAAA,CAAqB,GAAA;AAAA,YACnB,KAAA,CAAM,IAAA;AAAA,YAAA,CACL,oBAAA,CAAqB,GAAA,CAAI,KAAA,CAAM,IAAI,KAAK,CAAA,IAAK;AAAA,WAChD;AAAA,QACF;AAEA,QAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,UAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,cAAA,GAAiB,UAAA;AACvB,UAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,mBAAA,CAAoB,cAAA,CAAe,SAAS,CAAA;AAC1E,UAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,QAAA,GACJ,OAAQ,UAAA,CAAmB,IAAA,KAAS,WAC9B,UAAA,CAAmB,IAAA,CAAgB,MAAK,GAC1C,EAAA;AACN,UAAA,IAAI,CAAC,YAAY,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,IAAK,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AAChF,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,kBACJ,OAAO,cAAA,CAAe,QAAA,KAAa,QAAA,GAC/B,eAAe,QAAA,GACf,MAAA;AACN,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,qBAAA,CAAsB,OAAO,eAAe,CAAA;AAC/E,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,qBAAmD,EAAC;AACxD,UAAA,IAAI,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA,EAAG;AACjD,YAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,8BAAA,CAA+B,OAAO,QAAQ,CAAA;AACxE,YAAA,MAAM,sBAAA,GACJ,gBAAA,CAAiB,SAAA,IAAa,gBAAA,CAAiB,SAAA,CAAU,MAAA,GAAS,CAAA,GAC9D,IAAA,CAAK,oBAAA,CAAqB,gBAAA,CAAiB,SAAS,CAAA,GACpD,MAAA,CAAO,GAAA;AACb,YAAA,IACE,sBAAA,CAAuB,MAAA,GAAS,CAAA,IAChC,IAAA,CAAK,gBAAA,CAAiB,gBAAA,CAAiB,OAAO,CAAA,IAC9C,IAAA,CAAK,gBAAA,CAAiB,gBAAA,CAAiB,cAAc,CAAA,EACrD;AACA,cAAA,MAAM,kBAAkB,cAAA,CAAe,SAAA;AACvC,cAAA,MAAM,YAAA,GACJ,OAAO,eAAA,KAAoB,QAAA,IAC3B,eAAA,IACA,OAAO,eAAA,CAAgB,YAAA,KAAiB,QAAA,GACpC,eAAA,CAAgB,YAAA,GAChB,MAAA;AACN,cAAA,MAAM,eAAA,GAAkB,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAC9D,cAAA,MAAM,mBAAA,GAAsB,KAAK,gCAAA,CAAiC;AAAA,gBAChE,SAAA,EAAW,eAAA;AAAA,gBACX,mBAAA,EAAqB,sBAAA;AAAA,gBACrB,eAAe,gBAAA,CAAiB,OAAA;AAAA,gBAChC,sBAAsB,gBAAA,CAAiB,cAAA;AAAA,gBACvC,YAAA;AAAA,gBACA;AAAA,eACD,CAAA;AACD,cAAA,kBAAA,GAAqB,mBAAA,CAAoB,SAAA;AACzC,cAAA,KAAA,MAAW,GAAA,IAAO,oBAAoB,YAAA,EAAc;AAClD,gBAAA,qBAAA,CAAsB,IAAI,GAAG,CAAA;AAC7B,gBAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,cAC5B;AACA,cAAA,oBAAA,CAAqB,GAAA,CAAI,QAAA,EAAU,eAAA,GAAkB,kBAAA,CAAmB,MAAM,CAAA;AAAA,YAChF;AAAA,UACF;AAEA,UAAA,MAAM,eAAA,GACJ,kBAAA,CAAmB,MAAA,GAAS,CAAA,GAAI,kBAAA,GAAqB,CAAC,EAAE,SAAA,EAAW,EAAC,EAAG,CAAA;AACzE,UAAA,KAAA,MAAW,qBAAqB,eAAA,EAAiB;AAC/C,YAAA,MAAM,aAAA,GACJ,eAAe,SAAA,IAAa,OAAO,eAAe,SAAA,KAAc,QAAA,GAC5D,MAAM,IAAA,CAAK,gCAAA;AAAA,cACT,KAAA;AAAA,cACA,QAAA;AAAA,cACA,cAAA;AAAA,cACA;AAAA,gBAEF,EAAC;AACP,YAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,YAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,cACtB,EAAA,EAAI,MAAA;AAAA,cACJ,IAAA,EAAM,UAAA;AAAA,cACN,QAAA,EAAU;AAAA,gBACR,IAAA,EAAM,QAAA;AAAA,gBACN,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,aAAa;AAAA,eACzC;AAAA,cACA,UAAA,EAAY;AAAA,aACb,CAAA;AACD,YAAA,IAAA,CAAK,8BAAA,CAA+B,KAAA,EAAO,MAAA,EAAQ,iBAAA,CAAkB,SAAS,CAAA;AAAA,UAChF;AAAA,QACF;AAEA,QAAA,IAAI,qBAAA,CAAsB,OAAO,CAAA,EAAG;AAClC,UAAA,MAAM,IAAA,CAAK,gCAAA,CAAiC,KAAA,EAAO,eAAe,CAAA;AAAA,QACpE;AAEA,QAAA,KAAA,CAAM,4BAAA,GAA+B,KAAA;AACrC,QAAA,KAAA,CAAM,mBAAA,CAAoB,IAAI,MAAM,CAAA;AACpC,QAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACnC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAA,CAAa,eAAA,CAAgB,KAAA,EAAO,kBAAkB,CAAA;AAC5D,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,MAAM,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,QACjC;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,aAAqB,sBACnB,KAAA,EACkE;AAClE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,YASrC;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,WAKF;AACA,UAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,UAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,YAAA,OAAO,IAAA;AAAA,UACT;AAEA,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AAC1B,UAAA,MAAM,UAAA,GAAwB,SAAA,KAAc,MAAA,GAAS,GAAA,GAAM,GAAA;AAC3D,UAAA,MAAM,aAAA,GACJ,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,GACtB,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAC5C,IAAA;AAEN,UAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,YAAA,IAAI,cAAA;AACJ,YAAA,IAAI,IAAI,QAAA,EAAU;AAChB,cAAA,IAAI;AACF,gBAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACtC,gBAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,kBAAA,cAAA,GAAiB,MAAA;AAAA,gBACnB;AAAA,cACF,CAAA,CAAA,MAAQ;AACN,gBAAA,cAAA,GAAiB,KAAA,CAAA;AAAA,cACnB;AAAA,YACF;AAEA,YAAA,MAAM,OAAA,GAAmB;AAAA,cACvB,IAAI,GAAA,CAAI,EAAA;AAAA,cACR,MAAM,GAAA,CAAI,IAAA;AAAA,cACV,SAAS,GAAA,CAAI,OAAA;AAAA,cACb,YAAY,GAAA,CAAI,UAAA;AAAA,cAChB,MAAA,EAAQ,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA;AAAA,cAC1C,aAAa,GAAA,CAAI,WAAA;AAAA,cACjB,QAAA,EAAU,cAAA;AAAA,cACV,WAAA,EAAa,IAAA,CAAK,6BAAA,CAA8B,GAAA,CAAI,QAAQ;AAAA,aAC9D;AAEA,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB,CAAA;AAAA,sDAAA,CAAA;AAAA,cAEA,OAAA,CAAQ,EAAA;AAAA,cACR,OAAA,CAAQ,IAAA;AAAA,cACR,OAAA,CAAQ,OAAA;AAAA,cACR,QAAQ,WAAA,IAAe,IAAA;AAAA,cACvB,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAA;AAAA,cACrB,QAAQ,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA;AAAA,cACtD,QAAQ,WAAA,IAAe,IAAA;AAAA,cACvB,OAAA,CAAQ,UAAA;AAAA,cACR;AAAA,aACF;AAEA,YAAA,IAAI,MAAM,WAAA,EAAa;AACrB,cAAA,MAAM,cAAc,GAAA,CAAI,WAAA,GAAc,KAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,GAAI,IAAA;AACpE,cAAA,KAAA,CAAM,WAAA,CAAY;AAAA,gBAChB,IAAI,OAAA,CAAQ,EAAA;AAAA,gBACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,gBACd,SAAS,OAAA,CAAQ,OAAA;AAAA,gBACjB,WAAA;AAAA,gBACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,gBAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,gBACpB,QAAA,EAAU,cAAA;AAAA,gBACV,WAAA,EAAa,QAAQ,WAAA,IAAe;AAAA,eACrC,CAAA;AAAA,YACH;AAAA,UACF;AAEA,UAAA,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,CAAA,yBAAA,CAA2B,CAAA;AACxD,UAAA,OAAO;AAAA,YACL,UAAA;AAAA,YACA,aAAA,EAAe,IAAA,CAAK,CAAC,CAAA,CAAE;AAAA,WACzB;AAAA,QACF,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,KAAK,CAAA;AACtE,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,aAAqB,oBACnB,KAAA,EACkC;AAClC,QAAA,IAAI,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,wBAAwB,UAAA,EAAY;AACnE,UAAA,IAAI;AACF,YAAA,OAAO,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,mBAAA,CAAoB,MAAM,QAAQ,CAAA;AAAA,UACvE,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,kEAAkE,KAAK,CAAA;AAAA,UACvF;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,YACrC,CAAA,yEAAA;AAAA,WACF;AACA,UAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS,IAAA;AAC9B,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,UAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,SAAqC,EAAC;AAAA,QACxE,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,uEAAuE,KAAK,CAAA;AAC1F,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA,MAEA,OAAe,sBACb,KAAA,EACe;AACf,QAAA,MAAM,QAAS,KAAA,CAA2D,UAAA;AAC1E,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACnD,QAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,IAAA;AAAA,MAC9C;AAAA,MAEA,OAAe,8BACb,QAAA,EACe;AACf,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAClC,UAAA,MAAM,KAAA,GACJ,OAAO,MAAA,CAAO,WAAA,KAAgB,QAAA,GAC1B,MAAA,CAAO,WAAA,GACP,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAC3B,MAAA,CAAO,UAAA,GACP,IAAA;AACR,UAAA,OAAO,KAAA,IAAS,MAAM,IAAA,EAAK,CAAE,SAAS,CAAA,GAAI,KAAA,CAAM,MAAK,GAAI,IAAA;AAAA,QAC3D,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,OAAe,sBAAsB,IAAA,EAA8B;AACjE,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,UAAU,IAAA,CAAK,IAAA;AAAA,UACnB,CAAC,GAAA,KAAuB,OAAO,QAAQ,QAAA,IAAY,GAAA,CAAI,WAAW,OAAO;AAAA,SAC3E;AACA,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,EAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK;AACtE,QAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,IAAA;AAAA,MACpC;AAAA,MAEA,aAAqB,4BAAA,CACnB,KAAA,EACA,OAAA,EAC8B;AAC9B,QAAA,MAAM,oBAAA,GAAuB,OAAA,CAC1B,MAAA,CAAO,CAAC,UAAU,CAAC,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAC,CAAA,CACpD,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,SAAS,CAAA;AAEjC,QAAA,IAAI,oBAAA,CAAqB,WAAW,CAAA,EAAG;AACrC,UAAA,2BAAW,GAAA,EAAI;AAAA,QACjB;AAEA,QAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,QAAA,IAAI;AACF,UAAA,MAAM,gBAAA,GAAmB,MAAM,GAAA,EAAK,aAAA;AACpC,UAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,YAAA,OAAO,OAAA;AAAA,UACT;AACA,UAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,UAAA,CAAW,WAAW,CAAA;AACzD,UAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA;AAIlD,UAAA,IAAI,OAAO,WAAA,CAAY,SAAA,KAAc,UAAA,EAAY;AAC/C,YAAA,OAAO,OAAA;AAAA,UACT;AAEA,UAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,YACZ,oBAAA,CAAqB,GAAA,CAAI,OAAO,SAAA,KAAc;AAC5C,cAAA,IAAI;AACF,gBAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,SAAA,CAAW,SAAS,CAAA;AACrD,gBAAA,MAAM,UAAA,GAAa,IAAA,CAAK,qBAAA,CAAsB,MAAA,EAAQ,IAAI,CAAA;AAC1D,gBAAA,IAAI,UAAA,EAAY;AACd,kBAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,UAAU,CAAA;AAAA,gBACnC;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF,CAAC;AAAA,WACH;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,OAAO,OAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,gBACnB,KAAA,EACyB;AACzB,QAAA,MAAM,WAAuC,EAAC;AAE9C,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAG7C,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA;AAC3B,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA;AAChC,QAAA,MAAM,iBAAA,GAAoB,MAAM,MAAA,CAAO,mBAAA;AACvC,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,WAAA;AAChC,QAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,gBAAA;AACrC,QAAA,MAAM,kBAAA,GAAqB,MAAM,MAAA,CAAO,oBAAA;AACxC,QAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,iBAAA;AACtC,QAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,iBAAA;AACtC,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,CAAO,kBAAA,IAAsB,IAAA;AAG5D,QAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA;AAAA,UAC/B,MAAM,MAAA,CAAO,MAAA;AAAA,UACb,KAAA,CAAM,WAAW,EAAC;AAAA,UAClB;AAAA,SACF;AAEA,QAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,yBAAA;AAAA,UAClC,KAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AAGD,QAAA,MAAM,iBAAA,GAAoB,MAAM,cAAA,CAAe,MAAA;AAAA,UAC7C,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAA,KAAW;AAAA,SAC1B;AAKA,QAAA,MAAM,sBAAA,GAAyB,KAAA,CAAM,MAAA,CAAO,oBAAA,IAAwB,EAAA;AACpE,QAAA,MAAM,mBAAA,GAAsB,kBAAkB,MAAA,GAAS,sBAAA;AAQvD,QAAA,IAAI,YAAA,GAAe,CAAA;AACnB,QAAA,KAAA,MAAW,OAAO,iBAAA,EAAmB;AAOnC,UAAA,IAAI,CAAC,gBAAA,IAAoB,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAC5C,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,KAAA,CAAM,YAAY,IAAA,KAAS,SAAA,IAAa,IAAI,IAAA,KAAS,MAAA,IAAU,IAAI,YAAA,EAAc;AAEnF,YAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,IAAA,CAAK,CAAA,CAAA,KAAK;AAC5C,cAAA,IAAI,CAAC,CAAA,CAAE,UAAA,EAAY,OAAO,KAAA;AAC1B,cAAA,IAAI;AACF,gBAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,UAAU,CAAA;AACzC,gBAAA,OAAO,UAAU,IAAA,CAAK,CAAC,OAAY,EAAA,CAAG,EAAA,KAAO,IAAI,YAAY,CAAA;AAAA,cAC/D,CAAA,CAAA,MAAQ;AACN,gBAAA,OAAO,KAAA;AAAA,cACT;AAAA,YACF,CAAC,CAAA;AAED,YAAA,IAAI,SAAA,EAAW;AAIb,cAAA,MAAM,YAAA,GAAe,SAAA,CAAU,IAAA,KAAS,WAAA,GAAc,GAAA,GAAM,GAAA;AAG5D,cAAA,IAAI,YAAA,KAAiB,MAAM,WAAA,EAAa;AACtC,gBAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,OAAO,GAAA,CAAI,IAAA;AAGf,UAAA,IAAI,KAAA,CAAM,WAAA,CAAY,IAAA,KAAS,SAAA,EAAW;AACxC,YAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAE5B,cAAA,IAAA,GAAO,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,WAAA,GAAc,MAAA;AAAA,YACnD,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAE9B,cAAA,IAAA,GAAO,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,MAAA,GAAS,WAAA;AAAA,YAC9C;AAAA,UAEF;AAMA,UAAA,IAAI,cAAA;AACJ,UAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,WAAA,KAAgB,IAAA;AAC9D,UAAA,MAAM,eAAe,YAAA,GAAe,mBAAA;AAEpC,UAAA,IAAI,cAAA,IAAkB,SAAS,MAAA,EAAQ;AACrC,YAAA,MAAM,WAAA,GAA+B,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAY,CAAA;AAChE,YAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA;AAAA,cAAO,CAAC,CAAA,KAC3C,CAAA,CAAE,QAAA,CAAS,WAAW,QAAQ;AAAA,aAChC;AAEA,YAAA,IAAI,YAAA,IAAgB,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAE/C,cAAA,MAAM,oBAAoB,gBAAA,CACvB,GAAA,CAAI,qBAAqB,CAAA,CACzB,KAAK,IAAI,CAAA;AACZ,cAAA,MAAM,gBAAgB,WAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAC,CAAA,CAC9C,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACpB,cAAA,MAAM,YAAA,GACJ,aAAA,CAAc,MAAA,GAAS,CAAA,GACnB;AAAA,cAAA,EAAmB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAC3C,EAAA;AAEN,cAAA,cAAA,GAAiB,GAAA,CAAI,OAAA,GACjB,CAAA,EAAG,iBAAiB,GAAG,YAAY;;AAAA,EAAO,IAAI,OAAO,CAAA,CAAA,GACrD,CAAA,EAAG,iBAAiB,GAAG,YAAY,CAAA,CAAA;AAAA,YACzC,CAAA,MAAO;AAGL,cAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,gBAAA,cAAA,GAAiB,MAAM,IAAA,CAAK,2BAAA,CAA4B,GAAA,EAAK,OAAO,YAAY,CAAA;AAAA,cAClF,CAAA,MAAO;AAEL,gBAAA,MAAM,QAAA,GAAW,YAAY,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzD,gBAAA,cAAA,GAAiB,GAAA,CAAI,OAAA,GACjB,CAAA,EAAG,GAAA,CAAI,OAAO;;AAAA,iBAAA,EAAwB,QAAQ,CAAA,CAAA,CAAA,GAC9C,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,CAAA;AAAA,cAClC;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,cAAA,GAAiB,IAAI,OAAA,IAAW,EAAA;AAAA,UAClC;AACA,UAAA,YAAA,EAAA;AAEA,UAAA,MAAM,kCACJ,gBAAA,IAAoB,IAAA,KAAS,WAAA,IAAe,OAAA,CAAQ,IAAI,UAAU,CAAA;AAGpE,UAAA,MAAM,YAAA,GAAoB;AAAA,YACxB,IAAA;AAAA,YACA,OAAA,EAAS,cAAA;AAAA,YACT,YAAY,+BAAA,GAAkC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAW,CAAA,GAAI,MAAA;AAAA,YAC5E,YAAA,EACE,oBAAoB,GAAA,CAAI,IAAA,KAAS,UAAU,GAAA,CAAI,YAAA,GAC3C,IAAI,YAAA,GACJ,MAAA;AAAA,YACN,IAAA,EAAM,IAAI,IAAA,IAAQ,MAAA;AAAA;AAAA,YAElB,QAAA,EAAU,GAAA,CAAI,IAAA,KAAS,MAAA,GAAS,IAAI,IAAA,GAAO;AAAA,WAC7C;AAIA,UAAA,IAAI,IAAI,IAAA,KAAS,MAAA,IAAU,IAAI,WAAA,IAAe,GAAA,CAAI,gBAAgB,IAAA,EAAM;AACtE,YAAA,MAAM,cAAA,GAAkC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AAClE,YAAA,MAAM,sBAA4C,EAAC;AAEnD,YAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,cAAA,IAAI,GAAA,CAAI,QAAA,EAAU,UAAA,CAAW,QAAQ,CAAA,EAAG;AACtC,gBAAA,IAAI;AAEF,kBAAA,MAAM,SAAS,MAAM,KAAA,CAAM,OAAO,QAAA,CAAS,QAAA,CAAS,IAAI,IAAI,CAAA;AAC5D,kBAAA,IAAI,MAAA,EAAQ,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AAElC,oBAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,sBACvB,IAAA,EAAM,OAAA;AAAA,sBACN,MAAM,MAAA,CAAO,IAAA;AAAA,sBACb,WAAW,GAAA,CAAI,QAAA;AAAA,sBACf,MAAM,GAAA,CAAI,IAAA;AAAA,sBACV,MAAM,GAAA,CAAI;AAAA,qBACX,CAAA;AAAA,kBACH;AAAA,gBACF,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,GAAA,CAAI,IAAI,KAAK,CAAC,CAAA;AAAA,gBACxE;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,cAAA,YAAA,CAAa,WAAA,GAAc,mBAAA;AAAA,YAC7B;AAAA,UACF;AAKA,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,MAAM,wBAA+B,EAAC;AAGtC,YAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,cAAA,qBAAA,CAAsB,IAAA,CAAK;AAAA,gBACzB,IAAA,EAAM,gBAAA;AAAA,gBACN,MAAM,GAAA,CAAI;AAAA,eACX,CAAA;AAAA,YACH;AAGA,YAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,cAAA,IAAI;AACF,gBAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,iBAAiB,CAAA;AACtD,gBAAA,qBAAA,CAAsB,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,cAC7C,SAAS,CAAA,EAAG;AACV,gBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2DAAA,EAA8D,GAAA,CAAI,EAAE,KAAK,CAAC,CAAA;AAAA,cAC1F;AAAA,YACF;AAGA,YAAA,IAAI,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACpC,cAAA,YAAA,CAAa,iBAAA,GAAoB,qBAAA;AAAA,YACnC;AAAA,UACF;AAIA,UAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAAA,QAC5B;AAGA,QAAA,MAAM,QAAA,GAAW,MAAM,WAAA,KAAgB,GAAA,GACnC,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAGtB,QAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,CAAA,EAAG;AACpD,UAAA,MAAM,uBAAuB,KAAA,CAAM,WAAA,KAAgB,GAAA,GAC/C,KAAA,CAAM,iBACN,KAAA,CAAM,cAAA;AAEV,UAAA,MAAM,iBAAiB,QAAA,GAAW,oBAAA;AAGlC,UAAA,IAAI,aAAA;AAEJ,UAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,YAAA,aAAA,GAAgB,2HAAA;AAAA,UAClB,CAAA,MAAA,IAAW,mBAAmB,CAAA,EAAG;AAC/B,YAAA,aAAA,GAAgB,qIAAA;AAAA,UAClB,CAAA,MAAA,IAAW,kBAAkB,CAAA,EAAG;AAC9B,YAAA,aAAA,GAAgB,4CAAkC,cAAc,CAAA,sFAAA,CAAA;AAAA,UAClE,CAAA,MAAO;AACL,YAAA,aAAA,GAAgB,iBAAiB,cAAc,CAAA,oFAAA,CAAA;AAAA,UACjD;AAEA,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAC7D,QAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,4BAAA,CAA6B,OAAO,gBAAgB,CAAA;AACvF,UAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,GAAA,CAAI,CAAC,KAAA,KAAU;AAC5C,YAAA,MAAM,UAAA,GACJ,KAAK,qBAAA,CAAsB,KAAK,KAChC,eAAA,CAAgB,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,IACnC,IAAA;AACF,YAAA,MAAM,WAAA,GAAc,aAAa,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,UAAU,MAAM,KAAA,CAAM,IAAA;AACzE,YAAA,OAAO,CAAA,aAAA,EAAgB,MAAM,SAAS;AAAA,QAAA,EAAa,WAAW;AAAA,eAAA,EAAoB,MAAM,WAAW;AAAA,UAAA,EAAe,MAAM,MAAM,CAAA,CAAA;AAAA,UAChI,CAAC,CAAA;AACD,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS,CAAA;;AAAA,EAAiC,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,WAC7D,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,MAAM,MAAM,CAAA;AAG9D,QAAA,IAAI,eAAA;AACJ,QAAA,IAAI,UAAA,KAAe,UAAA,IAAc,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAEnD,UAAA,eAAA,GAAkB;AAAA,YAChB,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS;AAAA;AAC1B,WACF;AAAA,QACF,CAAA,MAAA,IAAW,UAAA,IAAc,UAAA,KAAe,UAAA,EAAY;AAElD,UAAA,eAAA,GAAkB,UAAA;AAAA,QACpB;AAGA,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI,mBAAmB,kBAAA,EAAoB;AACzC,UAAA,SAAA,GAAY;AAAA,YACV,QAAQ,eAAA,IAAmB,MAAA;AAAA;AAAA,YAC3B,YAAY,kBAAA,IAAsB,MAAA;AAAA,YAClC,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,QAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAc,gBAAA;AAAA,UACd,UAAA;AAAA;AAAA,UAEA,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,YAAA,IAAgB,IAAA;AAAA;AAAA,UAExD,mBAAA,EAAqB,iBAAA;AAAA,UACrB,WAAA,EAAa,eAAA;AAAA,UACb,SAAA;AAAA,UACA,YAAA,EAAc,YAAA,CAAa,IAAA,GAAO,CAAA,GAAI,YAAA,GAAe;AAAA,SACvD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAqB,iBAAA,CACnB,cAAA,EACA,OAAA,EACA,KAAA,EACiB;AAEjB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjC,UAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,cAAA,EAAgB,OAAA,EAAS,KAAK,CAAA;AAAA,QAC/D;AAGA,QAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AAEtC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AACxC,YAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,cAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAAA,YACvD;AAEA,YAAA,OAAO,cAAA;AAAA,UACT,CAAA,CAAA,MAAQ;AAEN,YAAA,OAAO,cAAA;AAAA,UACT;AAAA,QACF;AAGA,QAAA,OAAO,OAAO,cAAc,CAAA;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,kBAAA,CACnB,KAAA,EACA,OAAA,EACA,KAAA,EACiB;AACjB,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,UAC5B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAc;AAE7B,YAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,cAAA,OAAO,KAAK,OAAA,IAAW,EAAA;AAAA,YACzB,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAChC,cAAA,MAAM,aAAa,IAAA,CAAK,MAAA;AACxB,cAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,UAAA,EAAY,SAAS,KAAK,CAAA;AAAA,YACvE,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAC5B,cAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,cAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AACtB,cAAA,IAAI;AACF,gBAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,gBAAA,OAAO,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAAA,cACvC,CAAA,CAAA,MAAQ;AACN,gBAAA,OAAO,EAAA;AAAA,cACT;AAAA,YACF,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AAC/B,cAAA,OAAO,KAAK,KAAA,IAAS,EAAA;AAAA,YACvB,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACjC,cAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAChC,cAAA,IAAI,UAAU,MAAA,EAAW;AACvB,gBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AACzD,gBAAA,OAAO,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,EAAA,CAAA;AAAA,cACxB;AACA,cAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,YACjE,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AAC/B,cAAA,MAAM,aAAa,IAAA,CAAK,EAAA;AACxB,cAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,YAAY,OAAA,EAAS,KAAA,EAAO,KAAK,KAAK,CAAA;AAAA,YACnF;AACA,YAAA,OAAO,EAAA;AAAA,UACT,CAAC;AAAA,SACH;AAEA,QAAA,OAAO,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,wBAAA,CACnB,UAAA,EACA,OAAA,EACA,OACA,KAAA,EACiB;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,UAAU,CAAA;AAEnE,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAE,CAAA;AACzD,YAAA,OAAO,CAAA,mBAAA,EAAsB,SAAS,UAAU,CAAA,CAAA,CAAA;AAAA,UAClD;AAGA,UAAA,OAAO,MAAM,IAAA,CAAK,iBAAA;AAAA,YAChB,SAAA,CAAU,MAAA;AAAA,YACV,OAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC1D,UAAA,OAAO,CAAA,uBAAA,EAA0B,SAAS,UAAU,CAAA,CAAA,CAAA;AAAA,QACtD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,aAAqB,iBAAA,CACnB,KAAA,EACA,UAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAGnD,QAAA,MAAM,YAAY,KAAA,CAAM,gBAAA,CAAiB,SAAS,QAAA,GAC9C,KAAA,CAAM,iBAAiB,SAAA,GACvB,MAAA;AAEJ,QAAA,IAAI;AAEF,UAAA,MAAM,WAAA,GAAc,UAAA,CAAW,MAAA,IAAU,EAAC;AAC1C,UAAA,MAAM,qBAEF,EAAC;AACL,UAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,YAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,cAAA,MAAM,kBACJ,OAAQ,KAAA,CAA6B,QAAA,KAAa,QAAA,GAC7C,MAA6B,QAAA,GAC9B,KAAA,CAAA;AACN,cAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,qBAAA;AAAA,gBACjC,KAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,gBAAA;AAAA,cACF;AAAA,YACF;AACA,YAAA,kBAAA,CAAmB,KAAK,KAAK,CAAA;AAAA,UAC/B;AAEA,UAAA,MAAM,YAAY,kBAAA,CAAmB,GAAA;AAAA,YAAI,CAAC,CAAA,KACxC,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,CAAA,CAAE;AAAA,WAChC;AACA,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,sBAAA;AAAA,YACjC,KAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,MAAM,2BAA2B,eAAA,CAAgB,MAAA;AAAA,YAC/C,CAAC,UAAU,KAAA,CAAM;AAAA,WACnB;AACA,UAAA,MAAM,kBAAkB,IAAI,GAAA;AAAA,YAC1B,wBAAA,CAAyB,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI;AAAA,WACpD;AAEA,UAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAgC;AAChE,UAAA,KAAA,MAAW,UAAU,kBAAA,EAAoB;AACvC,YAAA,IACE,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,KAAW,IAAA,IACX,UAAU,MAAA,KACT,UAAA,IAAc,MAAA,IAAU,WAAA,IAAe,MAAA,CAAA,EACxC;AACA,cAAA,mBAAA,CAAoB,GAAA,CAAI,MAAA,CAAO,IAAA,EAAgB,MAA4B,CAAA;AAAA,YAC7E;AAAA,UACF;AAEA,UAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAC7D,UAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAoB;AACrD,UAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,YAAA,IAAI,KAAA,CAAM,WAAW,YAAA,EAAc;AACjC,cAAA,oBAAA,CAAqB,GAAA;AAAA,gBACnB,KAAA,CAAM,IAAA;AAAA,gBAAA,CACL,oBAAA,CAAqB,GAAA,CAAI,KAAA,CAAM,IAAI,KAAK,CAAA,IAAK;AAAA,eAChD;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAExB,YAAA,MAAM,oBAA8B,EAAC;AACrC,YAAA,MAAM,mBAA6B,EAAC;AAEpC,YAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,cAAA,IAAI,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,EAAG;AACpC,gBAAA,iBAAA,CAAkB,KAAK,QAAQ,CAAA;AAAA,cACjC,CAAA,MAAA,IAAW,CAAC,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACzC,gBAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAAA,cAChC;AAAA,YACF;AAGA,YAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAE/B,cAAA,IAAI,SAAA,EAAW;AACb,gBAAA,OAAA,CAAQ,GAAA,CAAI,0DAA0D,SAAS,CAAA,IAAA,EAAO,iBAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAEpH,gBAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,kBAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,GAAA,CAAI,QAAQ,CAAA;AACvD,kBAAA,MAAM,YAAA,GACJ,cAAA,IACA,cAAA,CAAe,SAAA,IACf,OAAO,eAAe,SAAA,KAAc,QAAA,GAChC,cAAA,CAAe,SAAA,CAAU,YAAA,GACzB,KAAA,CAAA;AACN,kBAAA,IACE,OAAO,YAAA,KAAiB,QAAA,IACxB,YAAA,GAAe,CAAA,IAAA,CACd,qBAAqB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA,KAAM,YAAA,EAC7C;AACA,oBAAA;AAAA,kBACF;AAGA,kBAAA,MAAM,aAAA,GAAgB,SAAS,QAAA,CAAS,GAAG,IAAI,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAClF,kBAAA,IAAI,MAAA,GAAS,KAAA;AAGb,kBAAA,IAAI;AACF,oBAAA,MAAM,UAAU,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,SAAS,aAAa,CAAA;AAElE,oBAAA,IAAI,OAAA,EAAS;AAEX,sBAAA,IAAI,UAAA;AACJ,sBAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,wBAAA,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAAA,sBAChD;AAEA,sBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,wBACT,IAAA,EAAM,UAAA;AAAA,wBACN,QAAA,EAAU;AAAA,0BACR,IAAA,EAAM,QAAA;AAAA;AAAA,0BACN,aAAa,OAAA,CAAQ,WAAA;AAAA,0BACrB;AAAA;AACF,uBACD,CAAA;AACD,sBAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,EAAoC,aAAa,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAA;AAC9E,sBAAA,MAAA,GAAS,IAAA;AAAA,oBACX;AAAA,kBACF,CAAA,CAAA,MAAQ;AAAA,kBAER;AAGA,kBAAA,IAAI,CAAC,MAAA,EAAQ;AACX,oBAAA,IAAI;AACF,sBAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,aAAa,CAAA;AAEtE,sBAAA,IAAI,SAAA,EAAW;AAEb,wBAAA,IAAI,UAAA;AACJ,wBAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,0BAAA,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,cAAc,CAAA;AAAA,wBAC5D;AAEA,wBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,0BACT,IAAA,EAAM,UAAA;AAAA,0BACN,QAAA,EAAU;AAAA,4BACR,IAAA,EAAM,QAAA;AAAA;AAAA,4BACN,WAAA,EAAa,SAAA,CAAU,eAAA,IAAmB,CAAA,YAAA,EAAe,UAAU,IAAI,CAAA,OAAA,CAAA;AAAA,4BACvE;AAAA;AACF,yBACD,CAAA;AACD,wBAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uCAAA,EAA0C,aAAa,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAA;AACpF,wBAAA,MAAA,GAAS,IAAA;AAAA,sBACX;AAAA,oBACF,CAAA,CAAA,MAAQ;AAAA,oBAER;AAAA,kBACF;AAGA,kBAAA,IAAI,CAAC,MAAA,EAAQ;AACX,oBAAA,IAAI;AACF,sBAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,aAAa,CAAA;AAEpE,sBAAA,IAAI,aAAa,QAAA,CAAS,IAAA,KAAS,UAAA,IAAc,QAAA,CAAS,SAAS,SAAA,CAAA,EAAY;AAE7E,wBAAA,IAAI,UAAA;AACJ,wBAAA,MAAM,eAAA,GAAkB,SAAS,KAAA,EAAO,MAAA;AACxC,wBAAA,IAAI,eAAA,EAAiB;AACnB,0BAAA,IAAI;AAEF,4BAAA,MAAM,mBAAA,GAAsB,gBAAgB,QAAA,CAAS,GAAG,IAAI,eAAA,GAAkB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA;AAC7G,4BAAA,MAAM,iBAAiB,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,mBAAmB,CAAA;AACjF,4BAAA,IAAI,eAAe,cAAA,EAAgB;AACjC,8BAAA,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,cAAA,CAAe,cAAc,CAAA;AAAA,4BACjE;AAAA,0BACF,SAAS,WAAA,EAAa;AACpB,4BAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0DAAA,EAA6D,QAAQ,CAAA,CAAA,CAAA,EAAK,WAAW,CAAA;AAAA,0BACrG;AAAA,wBACF;AAEA,wBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,0BACT,IAAA,EAAM,UAAA;AAAA,0BACN,QAAA,EAAU;AAAA,4BACR,IAAA,EAAM,QAAA;AAAA,4BACN,WAAA,EACE,QAAA,CAAS,eAAA,KACR,QAAA,CAAS,SAAS,SAAA,GACf,CAAA,IAAA,EAAO,QAAA,CAAS,KAAA,IAAS,QAAQ,CAAA,SAAA,CAAA,GACjC,CAAA,yBAAA,EAA4B,QAAA,CAAS,SAAS,QAAQ,CAAA,MAAA,CAAA,CAAA;AAAA,4BAC5D;AAAA;AACF,yBACD,CAAA;AACD,wBAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0CAAA,EAA6C,aAAa,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAA;AACvF,wBAAA,MAAA,GAAS,IAAA;AAAA,sBACX;AAAA,oBACF,CAAA,CAAA,MAAQ;AAAA,oBAER;AAAA,kBACF;AAEA,kBAAA,IAAI,CAAC,MAAA,EAAQ;AACX,oBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sDAAA,EAAyD,QAAQ,CAAA,QAAA,EAAW,aAAa,CAAA,CAAA,CAAG,CAAA;AAAA,kBAC3G;AAAA,gBACF;AAAA,cACF,CAAA,MAAO;AAGL,gBAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAGnD,gBAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,MAAA,CAAO,CAAC,IAAA,KAAS;AAC9C,kBAAA,IAAI,CAAC,gBAAA,CAAiB,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAClD,oBAAA,OAAO,KAAA;AAAA,kBACT;AAEA,kBAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA;AACjE,kBAAA,MAAM,YAAA,GACJ,cAAA,IACA,cAAA,CAAe,SAAA,IACf,OAAO,eAAe,SAAA,KAAc,QAAA,GAChC,cAAA,CAAe,SAAA,CAAU,YAAA,GACzB,KAAA,CAAA;AAEN,kBAAA,IACE,OAAO,YAAA,KAAiB,QAAA,IACxB,YAAA,GAAe,CAAA,IAAA,CACd,oBAAA,CAAqB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,IAAK,CAAA,KAAM,YAAA,EACvD;AACA,oBAAA,OAAO,KAAA;AAAA,kBACT;AAEA,kBAAA,OAAO,IAAA;AAAA,gBACT,CAAC,CAAA;AACD,gBAAA,KAAA,CAAM,IAAA,CAAK,GAAG,aAAa,CAAA;AAG3B,gBAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA;AAGtE,gBAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,kBAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,GAAA,CAAI,QAAQ,CAAA;AACvD,kBAAA,MAAM,YAAA,GACJ,cAAA,IACA,cAAA,CAAe,SAAA,IACf,OAAO,eAAe,SAAA,KAAc,QAAA,GAChC,cAAA,CAAe,SAAA,CAAU,YAAA,GACzB,KAAA,CAAA;AACN,kBAAA,IACE,OAAO,YAAA,KAAiB,QAAA,IACxB,YAAA,GAAe,CAAA,IAAA,CACd,qBAAqB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA,KAAM,YAAA,EAC7C;AACA,oBAAA;AAAA,kBACF;AAEA,kBAAA,IAAI,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AAElC,kBAAA,IAAI;AACF,oBAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,QAAQ,CAAA;AAC/D,oBAAA,IAAI,aAAa,QAAA,CAAS,IAAA,KAAS,UAAA,IAAc,QAAA,CAAS,SAAS,SAAA,CAAA,EAAY;AAE7E,sBAAA,IAAI,UAAA;AACJ,sBAAA,MAAM,eAAA,GAAkB,SAAS,KAAA,EAAO,MAAA;AACxC,sBAAA,IAAI,eAAA,EAAiB;AACnB,wBAAA,IAAI;AACF,0BAAA,MAAM,iBAAiB,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,eAAe,CAAA;AAC7E,0BAAA,IAAI,eAAe,cAAA,EAAgB;AACjC,4BAAA,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,cAAA,CAAe,cAAc,CAAA;AAAA,0BACjE;AAAA,wBACF,SAAS,WAAA,EAAa;AACpB,0BAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,QAAQ,CAAA,CAAA,CAAA,EAAK,WAAW,CAAA;AAAA,wBACjF;AAAA,sBACF;AAEA,sBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,wBACT,IAAA,EAAM,UAAA;AAAA,wBACN,QAAA,EAAU;AAAA,0BACR,IAAA,EAAM,QAAA;AAAA,0BACN,WAAA,EACE,QAAA,CAAS,eAAA,KACR,QAAA,CAAS,SAAS,SAAA,GACf,CAAA,IAAA,EAAO,QAAA,CAAS,KAAA,IAAS,QAAQ,CAAA,SAAA,CAAA,GACjC,CAAA,yBAAA,EAA4B,QAAA,CAAS,SAAS,QAAQ,CAAA,MAAA,CAAA,CAAA;AAAA,0BAC5D;AAAA;AACF,uBACD,CAAA;AAAA,oBACH;AAAA,kBACF,CAAA,CAAA,MAAQ;AAAA,kBAER;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,YAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,cAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,iBAAiB,CAAA;AAC3E,cAAA,KAAA,CAAM,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,YAC7B;AAAA,UACF;AAEA,UAAA,IACE,wBAAA,CAAyB,MAAA,GAAS,CAAA,IAClC,CAAC,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,iBAAiB,CAAA,EAC9D;AACA,YAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,uBAAA,CAAwB,wBAAwB,CAAC,CAAA;AAAA,UACnE;AAGA,UAAA,MAAM,qBAAqB,gBAAA,CAAiB,IAAA;AAAA,YAC1C,CAAC,KAAA,KAAU,KAAA,CAAM,MAAA,KAAW;AAAA,WAC9B;AACA,UAAA,IACE,kBAAA,IACA,CAAC,KAAA,CAAM,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,kBAAkB,CAAA,EAC/D;AACA,YAAA,KAAA,CAAM,IAAA,CAAK;AAAA,cACT,IAAA,EAAM,UAAA;AAAA,cACN,QAAA,EAAU;AAAA,gBACR,IAAA,EAAM,kBAAA;AAAA,gBACN,WAAA,EACE,4EAAA;AAAA,gBACF,UAAA,EAAY;AAAA,kBACV,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY;AAAA,oBACV,WAAA,EAAa;AAAA,sBACX,IAAA,EAAM,QAAA;AAAA,sBACN,WAAA,EAAa;AAAA,qBACf;AAAA,oBACA,OAAA,EAAS;AAAA,sBACP,IAAA,EAAM,QAAA;AAAA,sBACN,WAAA,EAAa;AAAA,qBACf;AAAA,oBACA,WAAA,EAAa;AAAA,sBACX,IAAA,EAAM,OAAA;AAAA,sBACN,WAAA,EACE,wFAAA;AAAA,sBACF,KAAA,EAAO;AAAA,wBACL,IAAA,EAAM;AAAA;AACR;AACF,mBACF;AAAA,kBACA,QAAA,EAAU,CAAC,aAAA,EAAe,SAAA,EAAW,aAAa;AAAA;AACpD;AACF,aACD,CAAA;AAAA,UACH;AAEA,UAAA,OAAA,CAAQ,IAAI,CAAA,uCAAA,EAA0C,KAAA,CAAM,MAAM,CAAA,yBAAA,EAA4B,UAAA,CAAW,IAAI,CAAA,CAAE,CAAA;AAC/G,UAAA,OAAO,KAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,UAAA,MAAM,IAAA,CAAK,QAAA;AAAA,YACT,KAAA;AAAA,YACA,KAAA;AAAA,YACA,oBAAA;AAAA,YACA,CAAA,sCAAA,EAAyC,WAAW,IAAI,CAAA,CAAA;AAAA,WAC1D;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAqB,iBAAA,CACnB,KAAA,EACA,iBAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,KAAA;AAC/B,UAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,SAAS,CAAA;AAChE,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gDAAA,EAAmD,SAAS,CAAA,WAAA,CAAa,CAAA;AACtF,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,MAAM,gBAAA,GAAmB,OAAO,QAAA,CAAS,QAAA,KAAa,UAAA,GAClD,QAAA,CAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,GAChC,IAAA;AACJ,UAAA,MAAM,YAAA,GAAe,kBAAkB,IAAA,KACpC,OAAO,SAAS,QAAA,KAAa,QAAA,GAAW,SAAS,QAAA,GAAW,IAAA,CAAA;AAE/D,UAAA,IAAI,CAAC,YAAA,EAAc;AACjB,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gEAAA,EAAmE,SAAS,CAAA,CAAA,CAAG,CAAA;AAC5F,YAAA,OAAO,KAAA;AAAA,UACT;AAGA,UAAA,MAAM,aAAA,GAAgB,kBAAkB,QAAA,GACpC,MAAM,iBAAiB,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,GAC9C,EAAC;AAGL,UAAA,KAAA,MAAW,gBAAgB,iBAAA,EAAmB;AAC5C,YAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA;AACtD,YAAA,MAAM,YAAA,GAAe,cAAc,QAAQ,CAAA;AAE3C,YAAA,IAAI,YAAA,EAAc;AAChB,cAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,aAAA,EAAe,mBAAkB,GAAI,YAAA;AAE5E,cAAA,KAAA,CAAM,IAAA,CAAK;AAAA,gBACT,IAAA,EAAM,UAAA;AAAA,gBACN,QAAA,EAAU;AAAA,kBACR,IAAA,EAAM,QAAA;AAAA;AAAA,kBACN,WAAA,EAAa,WAAA,IAAe,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAA;AAAA,kBACtD,UAAA,EAAY,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA,GAAI,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC;AAAE,iBAC/F;AAAA;AAAA,gBAEA,eAAe,aAAA,IAAiB,UAAA;AAAA,gBAChC,mBAAmB,iBAAA,IAAqB;AAAA,eACL,CAAA;AAAA,YACvC,CAAA,MAAO;AACL,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4BAAA,EAA+B,QAAQ,CAAA,0BAAA,EAA6B,YAAY,CAAA,CAAA,CAAG,CAAA;AAAA,YAClG;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,QACtD;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MAEA,aAAqB,sBAAA,CACnB,KAAA,EACA,WAAA,EAGA,SAAA,EACqC;AACrC,QAAA,MAAM,cAA0C,EAAC;AACjD,QAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,QAAA,KAAA,MAAW,eAAe,WAAA,EAAa;AACrC,UAAA,MAAM,QAAA,GACJ,OAAO,WAAA,KAAgB,QAAA,GACnB,WAAA,GACA,OAAO,WAAA,EAAa,IAAA,KAAS,QAAA,GAC3B,WAAA,CAAY,IAAA,GACZ,IAAA;AAER,UAAA,IAAI,CAAC,YAAY,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACvE,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAW,MAAM,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,UAAU,SAAS,CAAA;AAC7E,UAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,SAAA,EAAW;AAC5C,YAAA;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,oBAAA,CAAqB,WAAW,IACxD,WAAA,GACA,MAAA;AACJ,UAAA,MAAM,QAAA,GAAW,gBAAgB,QAAA,IAAY,IAAA;AAC7C,UAAA,MAAM,YACJ,CAAC,CAAC,gBAAgB,SAAA,IAAa,OAAO,eAAe,SAAA,KAAc,QAAA;AAErE,UAAA,WAAA,CAAY,IAAA,CAAK;AAAA,YACf,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,SAAS,KAAA,IAAS,QAAA;AAAA,YACzB,aACE,QAAA,CAAS,eAAA,IACT,CAAA,IAAA,EAAO,QAAA,CAAS,SAAS,QAAQ,CAAA,SAAA,CAAA;AAAA,YACnC,QAAA;AAAA,YACA,SAAA;AAAA,YACA,YAAA,EACE,gBAAgB,SAAA,IAAa,OAAO,eAAe,SAAA,KAAc,QAAA,GAC7D,cAAA,CAAe,SAAA,CAAU,YAAA,GACzB;AAAA,WACP,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,MAEA,aAAqB,sBAAA,CACnB,KAAA,EACA,QAAA,EACA,SAAA,EACqB;AACrB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI;AACF,YAAA,MAAM,aAAA,GAAgB,SAAS,QAAA,CAAS,GAAG,IACvC,QAAA,GACA,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC5B,YAAA,MAAM,SAAS,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,aAAa,CAAA;AAClE,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,OAAO,MAAA;AAAA,YACT;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,QACvD,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEA,OAAe,qBACb,WAAA,EACmC;AACnC,QAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,KAAgB,IAAA,EAAM;AAC3D,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OACE,UAAA,IAAc,WAAA,IACd,WAAA,IAAe,WAAA,IACf,WAAA,IAAe,WAAA,IACf,UAAA,IAAc,WAAA,IACd,yBAAA,IAA6B,WAAA,IAC7B,yBAAA,IAA6B,WAAA,IAC7B,uBAAA,IAA2B,WAAA;AAAA,MAE/B;AAAA,MAEA,OAAe,wBACb,eAAA,EACkC;AAClC,QAAA,MAAM,aAAa,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC5D,QAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,KAAU;AACtD,UAAA,MAAM,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,QAAA,GAAW,UAAA,GAAa,cAAc,CAAA,EAAA,EAC1D,KAAA,CAAM,SAAA,GAAY,WAAA,GAAc,eAClC,CAAA,CAAA;AACA,UAAA,MAAM,YAAA,GACJ,OAAO,KAAA,CAAM,YAAA,KAAiB,QAAA,IAAY,KAAA,CAAM,YAAA,GAAe,CAAA,GAC3D,CAAA,iBAAA,EAAoB,KAAA,CAAM,YAAY,CAAA,CAAA,GACtC,EAAA;AACN,UAAA,OAAO,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA,EAAA,EAAK,MAAM,WAAW,CAAA,QAAA,EAAW,IAAI,CAAA,EAAG,YAAY,CAAA,CAAA,CAAA;AAAA,QAC5E,CAAC,CAAA;AAED,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,iBAAA;AAAA,YACN,WAAA,EAAa;AAAA,cACX,yDAAA;AAAA,cACA,gCAAA;AAAA,cACA,GAAG,gBAAA;AAAA,cACH;AAAA,aACF,CAAE,KAAK,IAAI,CAAA;AAAA,YACX,UAAA,EAAY;AAAA,cACV,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM,QAAA;AAAA,kBACN,IAAA,EAAM,UAAA;AAAA,kBACN,WAAA,EAAa;AAAA,iBACf;AAAA,gBACA,OAAA,EAAS;AAAA,kBACP,IAAA,EAAM,QAAA;AAAA,kBACN,WAAA,EAAa;AAAA,iBACf;AAAA,gBACA,WAAA,EAAa;AAAA,kBACX,IAAA,EAAM,OAAA;AAAA,kBACN,WAAA,EACE,wFAAA;AAAA,kBACF,KAAA,EAAO;AAAA,oBACL,IAAA,EAAM;AAAA;AACR,iBACF;AAAA,gBACA,IAAA,EAAM;AAAA,kBACJ,IAAA,EAAM,QAAA;AAAA,kBACN,WAAA,EACE;AAAA;AACJ,eACF;AAAA,cACA,QAAA,EAAU,CAAC,OAAA,EAAS,SAAA,EAAW,eAAe,MAAM;AAAA;AACtD;AACF,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAe,uBAAuB,KAAA,EAAyB;AAC7D,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,UAAA,OAAO,MAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,sBAAA,CAAuB,IAAI,CAAC,CAAA;AAAA,QAC9D;AACA,QAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAqC,EAAC;AAC5C,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,UAAA,IAAI,GAAA,KAAQ,SAAA,IAAa,GAAA,KAAQ,eAAA,EAAiB;AAChD,YAAA;AAAA,UACF;AACA,UAAA,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA,CAAK,sBAAA,CAAuB,KAAK,CAAA;AAAA,QACpD;AAEA,QAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,QAAA,MAAM,cAAA,GACJ,SAAS,QAAA,IACR,KAAA,CAAM,QAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAChD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,SAAA,CAAU,oBAAA,GAAuB,KAAA;AAAA,QACnC;AAEA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,MAEA,OAAe,gBAAgB,SAAA,EAAqB;AAClD,QAAA,IAAI;AAEF,UAAA,MAAM,UAAA,GAAa,CAAA,CAAE,YAAA,CAAa,SAAS,CAAA;AAC3C,UAAA,OAAO,KAAK,sBAAA,CAAuB;AAAA,YACjC,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAa,UAAA,CAAmB,UAAA,IAAc,EAAC;AAAA,YAC/C,QAAA,EAAW,UAAA,CAAmB,QAAA,IAAY,EAAC;AAAA,YAC3C,oBAAA,EAAsB;AAAA,WACvB,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,0DAA0D,KAAK,CAAA;AAE7E,UAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC,EAAE;AAAA,QAC1C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,kBACnB,KAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AACpD,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,WAAW,CAAA;AAGzB,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AACpD,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,WAAW,CAAA;AAGzB,UAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAClD,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAU,CAAA;AAGxB,UAAA,MAAM,eAAA,uBAAsB,GAAA,EAAyB;AAGrD,UAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,YAAA,MAAM,OAAA,GAAU,gBAAgB,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA,wBAAS,GAAA,EAAI;AACnE,YAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,YAAA,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,UACjD;AACA,UAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,YAAA,MAAM,OAAA,GAAU,gBAAgB,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA,wBAAS,GAAA,EAAI;AACnE,YAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACpB,YAAA,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,UACjD;AACA,UAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,YAAA,MAAM,OAAA,GAAU,gBAAgB,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA,wBAAS,GAAA,EAAI;AACnE,YAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,YAAA,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,UACjD;AAGA,UAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,eAAA,EAAiB;AAC7C,YAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpB,cAAA,OAAA,CAAQ,IAAA;AAAA,gBACN,CAAA,oCAAA,EAAuC,IAAI,CAAA,qBAAA,EAAwB,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,qEAAA;AAAA,eAE5F;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,UAAA,MAAM,IAAA,CAAK,QAAA;AAAA,YACT,KAAA;AAAA,YACA,KAAA;AAAA,YACA,sBAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,gBACnB,KAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAEjD,UAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACjE,YAAA,IAAI;AACF,cAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAM,UAAA,EAAW,GAAI,MAAM,UAAA,EAAW;AAG3D,cAAA,IAAI,UAAA;AAEJ,cAAA,IAAI,UAAA,EAAY;AACd,gBAAA,UAAA,GAAa,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,cAC9C;AAEA,cAAA,KAAA,CAAM,IAAA,CAAK;AAAA,gBACT,IAAA,EAAM,UAAA;AAAA,gBACN,QAAA,EAAU;AAAA,kBACR,IAAA,EAAM,QAAA;AAAA,kBACN,WAAA;AAAA,kBACA;AAAA;AACF,eACD,CAAA;AAAA,YACH,SAAS,SAAA,EAAW;AAClB,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAA,CAAA,EAAK,SAAS,CAAA;AAAA,YACnE;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,QAC7D;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,gBACnB,KAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,cAAA,EAAe;AAEzD,UAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,YAAA,IAAI;AACF,cAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,IAAI,CAAA;AAG7D,cAAA,IAAI,UAAA;AAEJ,cAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,gBAAA,IAAI;AACF,kBAAA,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,cAAc,CAAA;AAAA,gBAC5D,SAAS,UAAA,EAAY;AACnB,kBAAA,OAAA,CAAQ,KAAA;AAAA,oBACN,sCAAsC,IAAI,CAAA,CAAA,CAAA;AAAA,oBAC1C;AAAA,mBACF;AAAA,gBACF;AAAA,cACF;AAEA,cAAA,KAAA,CAAM,IAAA,CAAK;AAAA,gBACT,IAAA,EAAM,UAAA;AAAA,gBACN,QAAA,EAAU;AAAA,kBACR,MAAM,SAAA,CAAU,IAAA;AAAA,kBAChB,aAAa,SAAA,CAAU,eAAA;AAAA,kBACvB;AAAA;AACF,eACD,CAAA;AAAA,YACH,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,YACtD;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,QACpD;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,eACnB,KAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,aAAA,EAAc;AAEvD,UAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,YAAA,IAAI;AACF,cAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,IAAI,CAAA;AAE3D,cAAA,IAAI,SAAS,YAAA,EAAc;AAEzB,gBAAA,IAAI,UAAA;AACJ,gBAAA,MAAM,eAAA,GAAkB,SAAS,KAAA,EAAO,MAAA;AACxC,gBAAA,IAAI,eAAA,EAAiB;AACnB,kBAAA,IAAI;AACF,oBAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,eAAe,CAAA;AACxE,oBAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,sBAAA,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,cAAc,CAAA;AAAA,oBAC5D;AAAA,kBACF,SAAS,WAAA,EAAa;AACpB,oBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,IAAI,CAAA,CAAA,CAAA,EAAK,WAAW,CAAA;AAAA,kBAC7E;AAAA,gBACF;AAEA,gBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,kBACT,IAAA,EAAM,UAAA;AAAA,kBACN,QAAA,EAAU;AAAA,oBACR,IAAA;AAAA,oBACA,aAAa,QAAA,CAAS,eAAA,IAAmB,CAAA,YAAA,EAAe,QAAA,CAAS,SAAS,IAAI,CAAA,MAAA,CAAA;AAAA,oBAC9E;AAAA;AACF,iBACD,CAAA;AAAA,cACH;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,YACrD;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,QACnD;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,OAAe,iBAAiB,KAAA,EAA4B;AAE1D,QAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,KAAW,MAAA,IAAa,MAAM,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AACxE,UAAA,OAAO,MAAM,MAAA,CAAO,MAAA;AAAA,QACtB;AAGA,QAAA,IAAI,KAAA,CAAM,YAAY,KAAA,KAAU,MAAA,IAAa,MAAM,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AAC/E,UAAA,OAAO,MAAM,WAAA,CAAY,KAAA;AAAA,QAC3B;AAGA,QAAA,OAAO,EAAC;AAAA,MACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,aAAqB,eAAA,CACnB,KAAA,EACA,QAAA,EACiC;AACjC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC3C,QAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAElC,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,QAAA,IAAI,CAAC,aAAA,EAAe,OAAO,EAAC;AAE5B,QAAA,MAAM,YAAoC,EAAC;AAE3C,QAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,UAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,UAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAgC,MAAM,UAAA,EAAW;AAEvD,YAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AAExC,cAAA,SAAA,CAAU,IAAA,CAAK,QAAQ,OAA0B,CAAA;AAAA,YACnD;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,MAAM,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,UACjE;AAAA,QACF;AAEA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAcA,aAAqB,0BAAA,CACnB,KAAA,EACA,QAAA,EACqC;AACrC,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,uBAAuB,CAAA;AAC3E,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AAKnC,QAAA,IAAI,MAAA,GAAsD,QAAA;AAC1D,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAa,MAAM,CAAA;AAAA,UAC7C,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,4DAAuD,KAAK,CAAA;AAAA,UAC5E;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAoB,yBAAA,CAClB,KAAA,EACA,aAAA,EACiB;AACjB,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,sBAAsB,CAAA;AAC1E,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,aAAA;AAEnC,QAAA,IAAI,MAAA,GAAS,aAAA;AACb,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,WAAA,EAAa,MAAM,CAAA;AAC/C,YAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,KAAA,CAAA,EAAW;AACvC,cAAA,MAAA,GAAS,IAAA;AAAA,YACX;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,2DAAsD,KAAK,CAAA;AAAA,UAC3E;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAoB,2BAAA,CAClB,KAAA,EACA,UAAA,EACe;AACf,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,wBAAwB,CAAA;AAC5E,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE5B,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,CAAS,aAAa,UAAU,CAAA;AAAA,UACxC,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,6DAAwD,KAAK,CAAA;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAoB,0BAAA,CAClB,KAAA,EACA,OAAA,EACkB;AAClB,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,uBAAuB,CAAA;AAC3E,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AAEnC,QAAA,IAAI,MAAA,GAAS,OAAA;AACb,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAa,MAAM,CAAA;AAAA,UAC7C,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,4DAAuD,KAAK,CAAA;AAAA,UAC5E;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAoB,yBAAA,CAClB,KAAA,EACA,OAAA,EACe;AACf,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,sBAAsB,CAAA;AAC1E,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE5B,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,CAAS,aAAa,OAAO,CAAA;AAAA,UACrC,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,2DAAsD,KAAK,CAAA;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,aAAoB,0BAAA,CAClB,KAAA,EACA,SAAA,EACA,OAAA,EACY;AACZ,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,uBAAuB,CAAA;AAC3E,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AAEnC,QAAA,IAAI,MAAA,GAAkC,OAAA;AACtC,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAa,SAAA,EAAW,MAAM,CAAA;AAAA,UACxD,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,4DAAuD,KAAK,CAAA;AAAA,UAC5E;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAoB,yBAAA,CAClB,KAAA,EACA,OAAA,EACe;AACf,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,sBAAsB,CAAA;AAC1E,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE5B,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,CAAS,aAAa,OAAO,CAAA;AAAA,UACrC,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,2DAAsD,KAAK,CAAA;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,aAAoB,4BAAA,CAClB,KAAA,EACA,QAAA,EACA,UAAA,EACqB;AACrB,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,0BAA0B,CAAA;AAC9E,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,UAAA;AAEnC,QAAA,IAAI,MAAA,GAAqB,UAAA;AACzB,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAa,QAAA,EAAU,MAAM,CAAA;AAAA,UACvD,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,+DAA0D,KAAK,CAAA;AAAA,UAC/E;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAoB,2BAAA,CAClB,KAAA,EACA,QAAA,EACA,UAAA,EAC4B;AAC5B,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,yBAAyB,CAAA;AAC7E,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,UAAA;AAEnC,QAAA,IAAI,MAAA,GAA4B,UAAA;AAChC,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI,WAAW,IAAA,EAAM;AACrB,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAa,QAAA,EAAU,MAAM,CAAA;AAAA,UACvD,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,8DAAyD,KAAK,CAAA;AAAA,UAC9E;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAoB,2BAAA,CAClB,KAAA,EACA,QAAA,EACA,UAAA,EAC4B;AAC5B,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,yBAAyB,CAAA;AAC7E,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,UAAA;AAEnC,QAAA,IAAI,MAAA,GAA4B,UAAA;AAChC,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI,WAAW,IAAA,EAAM;AACrB,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAa,QAAA,EAAU,MAAM,CAAA;AAAA,UACvD,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,8DAAyD,KAAK,CAAA;AAAA,UAC9E;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,qBAAqB,KAAA,EAAmC;AAC3E,QAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AAGpC,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,WAAA,GAAc,MAAA;AAEvD,QAAA,IAAI,OAAA,GAAmB;AAAA,UACrB,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA;AAAA,UACA,OAAA,EAAS,IAAA;AAAA;AAAA,UACT,UAAA,EAAY,IAAA;AAAA,UACZ,MAAA,EAAQ,IAAA;AAAA,UACR,UAAA,EAAY,CAAA;AAAA;AAAA,UACZ,eAAA,EAAiB,CAAA;AAAA;AAAA,UACjB,qBAAA,EAAuB,IAAA;AAAA,UACvB,MAAA,EAAQ;AAAA,SACV;AAGA,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,OAAO,CAAA;AAG9D,QAAA,OAAA,CAAQ,SAAA,GAAY,MAAM,eAAA,IAAmB,IAAA;AAC7C,QAAA,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AAGtB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AACzB,QAAA,OAAA,CAAQ,UAAA,GAAa,GAAA;AACrB,QAAA,OAAA,CAAQ,eAAA,GAAkB,GAAA;AAG1B,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAGpG,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,UAOA,OAAA,CAAQ,EAAA;AAAA,UACR,OAAA,CAAQ,IAAA;AAAA,UACR,OAAA,CAAQ,OAAA;AAAA,UACR,OAAA,CAAQ,UAAA;AAAA,UACR,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,UAAA;AAAA,UACR,OAAA,CAAQ,eAAA;AAAA,UACR,OAAA,CAAQ,qBAAA;AAAA,UACR,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,SAAA;AAAA,UACR,OAAA,CAAQ,KAAA;AAAA,UACR,IAAA;AAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,OAAO,CAAA;AAGnD,QAAA,KAAA,CAAM,cAAA,CAAe,KAAK,OAAO,CAAA;AAGjC,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,QAC3B;AAEA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,mBAAA,CACnB,SAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAGzB,QAAA,IAAI,OAAA,GAGA;AAAA,UACF,MAAA;AAAA,UACA,qBAAA,EAAuB;AAAA,SACzB;AAGA,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,WAAW,OAAO,CAAA;AAGzE,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,UAKA,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,qBAAA;AAAA,UACR;AAAA,SACF;AAGA,QAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AACnE,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AACzB,UAAA,OAAA,CAAQ,wBAAwB,OAAA,CAAQ,qBAAA;AAGxC,UAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,OAAO,CAAA;AAGnD,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,aAAA,CACnB,SAAA,EACA,QAAA,EACA,QACA,KAAA,EACe;AAEf,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,IAAgB,IAAA;AAGpC,QAAA,IAAI,UAAU,QAAA,CAAS,OAAA;AACvB,QAAA,MAAM,gBAAgB,QAAA,CAAS,UAAA,GAAa,KAAK,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,GAAI,IAAA;AAClF,QAAA,MAAM,gBAAA,GAAmB,SAAS,iBAAA,IAAqB,IAAA;AACvD,QAAA,MAAM,uBAAuB,QAAA,CAAS,iBAAA,GAAoB,KAAK,SAAA,CAAU,QAAA,CAAS,iBAAiB,CAAA,GAAI,IAAA;AAGvG,QAAA,IAAI,cAAA;AACJ,QAAA,IAAI,oBAAA;AACJ,QAAA,IAAI,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA,EAAG;AACjD,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,QAAA,CAAS,QAAQ,KAAK,CAAA;AACtE,UAAA,cAAA,GAAiB,MAAA,CAAO,IAAA;AACxB,UAAA,oBAAA,GAAuB,MAAA,CAAO,YAAA;AAAA,QAChC;AAMA,QAAA,MAAM,2BAA2B,IAAA,CAAK,gCAAA;AAAA,UACpC,SAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,eAAA,GAAkB,kBAAkB,cAAA,CAAe,MAAA,GAAS,IAAI,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,GAAI,IAAA;AAGvG,QAAA,IAAI,cAAA,GAA0B;AAAA,UAC5B,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,WAAA,GAAc,MAAA;AAAA,UAChD,OAAA;AAAA,UACA,UAAA,EAAY,aAAA;AAAA,UACZ,MAAA,EAAQ,KAAA;AAAA,UACR,UAAA,EAAY,CAAA;AAAA;AAAA,UACZ,eAAA,EAAiB,CAAA;AAAA;AAAA,UACjB,qBAAA,EAAuB,CAAA;AAAA;AAAA,UACvB,MAAA;AAAA,UACA,iBAAA,EAAmB,gBAAA;AAAA,UACnB,WAAA,EAAa;AAAA,SACf;AAIA,QAAA,cAAA,GAAiB,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,cAAc,CAAA;AAC5E,QAAA,OAAA,GAAU,cAAA,CAAe,OAAA;AAGzB,QAAA,IAAI,OAAA,GASA;AAAA,UACF,OAAA;AAAA,UACA,UAAA,EAAY,aAAA;AAAA,UACZ,MAAA,EAAQ,KAAA;AAAA,UACR,qBAAA,EAAuB,CAAA;AAAA;AAAA,UACvB,MAAA;AAAA,UACA,iBAAA,EAAmB,gBAAA;AAAA,UACnB,iBAAA,EAAmB,oBAAA;AAAA,UACnB,WAAA,EAAa;AAAA,SACf;AAGA,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,WAAW,OAAO,CAAA;AAGzE,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AACzB,QAAA,OAAA,CAAQ,qBAAA,GAAwB,GAAA;AAGhC,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,UAOA,OAAA,CAAQ,OAAA;AAAA,UACR,OAAA,CAAQ,UAAA;AAAA,UACR,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,qBAAA;AAAA,UACR,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,iBAAA;AAAA,UACR,OAAA,CAAQ,iBAAA;AAAA,UACR,OAAA,CAAQ,WAAA;AAAA,UACR;AAAA,SACF;AAGA,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,KAAA,MAAW,QAAA,IAAY,SAAS,UAAA,EAAY;AAC1C,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACpB;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,cAKA,QAAA,CAAS,EAAA;AAAA,cACT,SAAA;AAAA,cACA,SAAS,IAAA,IAAQ,UAAA;AAAA,cACjB,SAAS,QAAA,CAAS,IAAA;AAAA,cAClB,SAAS,QAAA,CAAS,SAAA;AAAA,cAClB;AAAA,aACF;AAAA,UACJ;AAAA,QACF;AAGA,QAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AACnE,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAClB,UAAA,OAAA,CAAQ,UAAA,GAAa,aAAA;AACrB,UAAA,OAAA,CAAQ,MAAA,GAAS,KAAA;AACjB,UAAA,OAAA,CAAQ,qBAAA,GAAwB,GAAA;AAChC,UAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AACjB,UAAA,OAAA,CAAQ,iBAAA,GAAoB,gBAAA;AAC5B,UAAA,OAAA,CAAQ,WAAA,GAAc,eAAA;AAGtB,UAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,OAAO,CAAA;AAGnD,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,UAC3B;AAGA,UAAA,MAAM,IAAA,CAAK,sCAAA;AAAA,YACT,OAAA;AAAA,YACA,wBAAA;AAAA,YACA,KAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAGA,QAAA,IAAI,oBAAA,IAAwB,oBAAA,CAAqB,IAAA,GAAO,CAAA,IAAK,KAAA,EAAO;AAClE,UAAA,MAAM,UAAA,CAAW,uBAAA;AAAA,YACf,KAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MAIF;AAAA,MAEA,OAAe,gCAAA,CACb,SAAA,EACA,QAAA,EACA,KAAA,EACiB;AACjB,QAAA,MAAM,YAAA,GACJ,MAAM,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAAK,QAAA,CAAS,WAAW,MAAA,GAAS,CAAA;AACrE,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,mBAAA,GAAsB,MAAM,cAAA,CAAe,SAAA;AAAA,UAC/C,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAA,KAAO;AAAA,SAC9B;AACA,QAAA,IAAI,uBAAuB,CAAA,EAAG;AAC5B,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,cAAA,CAAe,mBAAmB,CAAA;AAC/D,QAAA,IAAI,cAAA,CAAe,IAAA,KAAS,WAAA,IAAe,cAAA,CAAe,SAAS,MAAA,EAAQ;AACzE,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,QAAA,IAAI,iCAAA,GAAoC,KAAA;AAExC,QAAA,KAAA,IAAS,CAAA,GAAI,mBAAA,GAAsB,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACjD,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA;AAGtC,UAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,cAAA,CAAe,IAAA,EAAM;AACxC,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,YAAA;AAAA,UACF;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA;AACrD,YAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,IAAK,eAAA,CAAgB,WAAW,CAAA,EAAG;AACnE,cAAA;AAAA,YACF;AAEA,YAAA,iCAAA,GAAoC,IAAA;AAEpC,YAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,cAAA,IAAI,QAAA,IAAY,OAAO,QAAA,CAAS,EAAA,KAAO,QAAA,EAAU;AAC/C,gBAAA,WAAA,CAAY,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,cAC7B;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AACN,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,iCAAA,IAAqC,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG;AAChE,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,OAAwB,EAAC;AAE/B,QAAA,KAAA,MAAW,OAAA,IAAW,MAAM,cAAA,EAAgB;AAC1C,UAAA,IACE,QAAQ,IAAA,KAAS,MAAA,IACjB,CAAC,OAAA,CAAQ,gBACT,CAAC,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA,IACrC,CAAC,QAAQ,WAAA,IACT,OAAA,CAAQ,gBAAgB,IAAA,EACxB;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAC7C,YAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,cAAA,IAAA,CAAK,IAAA,CAAK,GAAI,MAA0B,CAAA;AAAA,YAC1C;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,aAAqB,sCAAA,CACnB,aAAA,EACA,IAAA,EACA,OACA,aAAA,EACe;AACf,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,cAA+B,EAAC;AACtC,QAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,UAAU,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACxC,YAAA;AAAA,UACF;AACA,UAAA,SAAA,CAAU,GAAA,CAAI,IAAI,IAAI,CAAA;AACtB,UAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,QACtB;AAEA,QAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,aAAA,GACJ,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,GACtB,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAC5C,IAAA;AACN,QAAA,MAAM,QAAA,GAAW,aAAA,CAAc,SAAA,IAAa,KAAA,CAAM,eAAA,IAAmB,IAAA;AACrE,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,IAAS,KAAA,CAAM,KAAA;AAC3C,QAAA,MAAM,uBAAuB,IAAI,GAAA;AAAA,UAC/B,MAAM,cAAA,CACH,MAAA;AAAA,YACC,CAAC,OAAA,KACC,OAAA,CAAQ,MAAA,KAAW,IAAA,IACnB,QAAQ,IAAA,KAAS,aAAA,CAAc,IAAA,IAAA,CAC9B,OAAA,CAAQ,SAAA,IAAa,IAAA,MAAU,aAC/B,OAAA,CAAQ,KAAA,IAAS,KAAA,CAAM,KAAA,MAAW,KAAA,IACnC,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,IAC3B,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW,wBAAwB;AAAA,WACvD,CACC,GAAA,CAAI,CAAC,OAAA,KAAY,QAAQ,OAAiB;AAAA,SAC/C;AAEA,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,UAAA,MAAM,GAAA,GAAM,YAAY,CAAC,CAAA;AACzB,UAAA,MAAM,OAAA,GAAU,CAAA,sBAAA,EAAyB,GAAA,CAAI,IAAI,CAAA,CAAA;AACjD,UAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,YAAA;AAAA,UACF;AACA,UAAA,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAEhC,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,CAAC,GAAG,CAAC,CAAA;AAC5C,UAAA,MAAM,aAAA,GAAyB;AAAA,YAC7B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,YACtB,MAAM,aAAA,CAAc,IAAA;AAAA,YACpB,OAAA;AAAA,YACA,WAAA,EAAa,eAAA;AAAA,YACb,UAAA,EAAY,gBAAgB,CAAA,GAAI,CAAA;AAAA,YAChC,MAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAQ,IAAA;AAAA,YACR,SAAA,EAAW,QAAA;AAAA,YACX;AAAA,WACF;AAEA,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,YAMA,aAAA,CAAc,EAAA;AAAA,YACd,aAAA,CAAc,IAAA;AAAA,YACd,aAAA,CAAc,OAAA;AAAA,YACd,eAAA;AAAA,YACA,CAAA;AAAA,YACA,aAAA,CAAc,UAAA;AAAA,YACd,aAAA,CAAc,MAAA;AAAA,YACd,aAAA,CAAc,SAAA;AAAA,YACd,aAAA,CAAc,KAAA;AAAA,YACd;AAAA,WACF;AAEA,UAAA,KAAA,CAAM,cAAA,CAAe,KAAK,aAAa,CAAA;AAEvC,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,YAAY,aAAa,CAAA;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAqB,qBAAA,CACnB,MAAA,EACA,KAAA,EACuE;AACvE,QAAA,MAAM,OAAwB,EAAC;AAC/B,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAE7C,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,GAAA;AAGpC,UAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,4BAA4B,CAAA;AAC5D,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,OAAA,CAAQ,MAAM,sDAAsD,CAAA;AACpE,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,UAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,UAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAEtC,UAAA,MAAM,YAAA,GAAe,OAAO,UAAA,EAAW;AACvC,UAAA,MAAM,IAAA,GAAO,gBAAgB,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,YAAY,IAAI,GAAG,CAAA,CAAA;AAE9D,UAAA,IAAI;AAGF,YAAA,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,IAAA,EAAM,YAAY,QAAQ,CAAA;AAIhE,YAAA,IAAI,MAAM,EAAA,EAAI;AACZ,cAAA,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,IAAI,CAAA;AAAA,YACjC;AAEA,YAAA,IAAA,CAAK,IAAA,CAAK;AAAA,cACR,EAAA,EAAI,YAAA;AAAA,cACJ,IAAA,EAAM,MAAA;AAAA,cACN,IAAA;AAAA,cACA,IAAA,EAAM,CAAA,UAAA,EAAa,YAAY,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,cACtC,QAAA;AAAA,cACA,MAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,IAAI,CAAC;AAAA,aAC1C,CAAA;AAAA,UACH,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAAA,UAC9D;AAAA,QACF;AAEA,QAAA,OAAO,EAAE,MAAM,YAAA,EAAa;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAqB,0BAAA,CACnB,QAAA,EACA,KAAA,EACA,kBAAA,EACe;AACf,QAAA,IAAI,CAAC,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA,EAAG;AACpD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,CAAO,MAAA,CAAO,SAAO,GAAA,CAAI,EAAA,IAAM,IAAI,QAAQ,CAAA;AAE3E,QAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,UAAA,QAAA,CAAS,aAAa,EAAC;AAAA,QACzB;AAGA,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAE7C,QAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAIlC,UAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,UAAA,GAAa,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA,CAAA;AAChE,UAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAIvB,UAAA,MAAM,iBAAA,GAA8B;AAAA,YAClC,EAAA,EAAI,UAAA;AAAA,YACJ,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,IAAA,EAAM,QAAA;AAAA;AAAA;AAAA,cAGN,SAAA,EAAW;AAAA;AACb,WACF;AACA,UAAA,QAAA,CAAS,UAAA,CAAW,KAAK,iBAAiB,CAAA;AAG1C,UAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AAIxC,UAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,GAAA;AACjC,UAAA,MAAM,UAAA,GAAa,OAAA;AACnB,UAAA,MAAM,YAAA,GAAe,UAAA;AAErB,UAAA,IAAI,CAAC,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA,EAAG;AACpC,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+CAAA,EAAkD,QAAQ,CAAA,UAAA,CAAY,CAAA;AACpF,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,YAAY,CAAA;AACjD,UAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+CAAA,EAAkD,QAAQ,CAAA,UAAA,CAAY,CAAA;AACpF,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,UAAA,CAAW,QAAQ,WAAW,CAAA;AAC9D,UAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,WAAA,GAAc,aAAa,MAAM,CAAA;AACnE,UAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAGtC,UAAA,MAAM,YAAA,GAAe,OAAO,UAAA,EAAW;AACvC,UAAA,MAAM,IAAA,GAAO,gBAAgB,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,YAAY,IAAI,GAAG,CAAA,CAAA;AAE9D,UAAA,IAAI;AACF,YAAA,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,IAAA,EAAM,YAAY,QAAQ,CAAA;AAEhE,YAAA,MAAM,aAAA,GAA+B;AAAA,cACnC,EAAA,EAAI,YAAA;AAAA,cACJ,IAAA,EAAM,MAAA;AAAA,cACN,IAAA;AAAA,cACA,IAAA,EAAM,CAAA,UAAA,EAAa,YAAY,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,cACtC,QAAA;AAAA,cACA,MAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,IAAI,CAAC;AAAA,aAC3C;AAGA,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAC/B,YAAA,MAAM,WAAA,GAAuB;AAAA,cAC3B,EAAA,EAAI,aAAA;AAAA,cACJ,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,QAAA;AAAA;AAAA,cACN,OAAA,EAAS,CAAA,4BAAA,CAAA;AAAA,cACT,YAAA,EAAc,UAAA;AAAA,cACd,UAAA,EAAY,SAAA;AAAA,cACZ,WAAA,EAAa,SAAA;AAAA,cACb,SAAA,EAAW,MAAM,eAAA,IAAmB,IAAA;AAAA,cACpC,OAAO,KAAA,CAAM,KAAA;AAAA,cACb,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,CAAC,aAAa,CAAC;AAAA,aAC7C;AAGA,YAAA,MAAM,0BAAA,GAA6B,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAGjH,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,cAIA,WAAA,CAAY,EAAA;AAAA,cACZ,WAAA,CAAY,IAAA;AAAA,cACZ,WAAA,CAAY,OAAA;AAAA,cACZ,WAAA,CAAY,IAAA;AAAA,cACZ,WAAA,CAAY,YAAA;AAAA,cACZ,WAAA,CAAY,UAAA;AAAA,cACZ,WAAA,CAAY,WAAA;AAAA,cACZ,WAAA,CAAY,SAAA;AAAA,cACZ,WAAA,CAAY,KAAA;AAAA,cACZ,WAAA,CAAY,WAAA;AAAA,cACZ;AAAA,aACF;AAGA,YAAA,KAAA,CAAM,cAAA,CAAe,KAAK,WAAW,CAAA;AAGrC,YAAA,IAAI,MAAM,WAAA,EAAa;AACrB,cAAA,KAAA,CAAM,YAAY,WAAW,CAAA;AAAA,YAC/B;AAGA,YAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAgB,IAAA;AAC1C,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAI;AACF,gBAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,kBACrC,CAAA,2CAAA,CAAA;AAAA,kBACA;AAAA,iBACF;AACA,gBAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,gBAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,CAAC,CAAA,EAAG,YAAA;AAEpC,gBAAA,IAAI,mBAOC,EAAC;AAEN,gBAAA,IAAI,kBAAA,EAAoB;AACtB,kBAAA,IAAI;AACF,oBAAA,gBAAA,GAAmB,IAAA,CAAK,MAAM,kBAA4B,CAAA;AAAA,kBAC5D,CAAA,CAAA,MAAQ;AAAA,kBAER;AAAA,gBACF;AAGA,gBAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,kBACpB,YAAA,EAAc,UAAA;AAAA,kBACd,SAAA,EAAW,QAAA;AAAA,kBACX,OAAA,EAAS,8BAAA;AAAA,kBACT,MAAA,EAAQ,SAAA;AAAA,kBACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,kBACpB,eAAA,EAAiB;AAAA,iBAClB,CAAA;AAED,gBAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,kBACtB,CAAA,+CAAA,CAAA;AAAA,kBACA,IAAA,CAAK,UAAU,gBAAgB,CAAA;AAAA,kBAC/B;AAAA,iBACF;AAGA,gBAAA,IAAI,MAAM,OAAA,EAAS;AACjB,kBAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,oBACZ,IAAA,EAAM,UAAA;AAAA,oBACN,MAAA,EAAQ,WAAA;AAAA,oBACR,IAAA,EAAM;AAAA,sBACJ,EAAA,EAAI,WAAA;AAAA,sBACJ,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,gBAAgB;AAAA;AAC/C,mBACD,CAAA;AAAA,gBACH;AAAA,cACF,SAAS,QAAA,EAAU;AACjB,gBAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,QAAQ,CAAA;AAAA,cAClE;AAAA,YACF;AAIA,YAAA,IAAI,MAAM,EAAA,EAAI;AACZ,cAAA,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,IAAI,CAAA;AAAA,YACjC;AAAA,UAEF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sDAAA,EAAyD,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,UAC3F;AAAA,QACF;AAGA,QAAA,IAAI,YAAA,CAAa,IAAA,GAAO,CAAA,IAAK,KAAA,CAAM,YAAA,EAAc;AAC/C,UAAA,IAAI;AACF,YAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,cACxC,CAAA,4CAAA,CAAA;AAAA,cACA,KAAA,CAAM;AAAA,aACR;AACA,YAAA,MAAM,OAAA,GAAU,UAAU,OAAA,EAAQ;AAClC,YAAA,IAAI,QAAQ,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,CAAC,EAAE,aAAA,EAAe;AAClD,cAAA,IAAI,YAAA,GAAe,OAAA,CAAQ,CAAC,CAAA,CAAE,aAAA;AAG9B,cAAA,KAAA,MAAW,CAAC,OAAA,EAAS,SAAS,CAAA,IAAK,YAAA,EAAc;AAC/C,gBAAA,YAAA,GAAe,aAAa,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,SAAS,CAAA;AAAA,cACxE;AAEA,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB,CAAA,gDAAA,CAAA;AAAA,gBACA,YAAA;AAAA,gBACA,KAAA,CAAM;AAAA,eACR;AAAA,YACF;AAAA,UACF,SAAS,WAAA,EAAa;AACpB,YAAA,OAAA,CAAQ,KAAA,CAAM,iEAAiE,WAAW,CAAA;AAAA,UAC5F;AAAA,QACF;AAIA,QAAA,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,GAAA,CAAI,QAAQ,CAAA;AACxE,QAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAChC,UAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAqB,iCAAA,CACnB,QAAA,EACA,KAAA,EACA,kBAAA,EACe;AACf,QAAA,MAAM,YAAA,GACJ,MAAM,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAAK,QAAA,CAAS,WAAW,MAAA,GAAS,CAAA;AACrE,QAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,IAAK,QAAA,CAAS,OAAO,MAAA,GAAS,CAAA;AAC7E,QAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,OAAA,EAAS,IAAA,EAAK,IAAK,EAAA;AACtD,QAAA,MAAM,UAAA,GAAa,kBAAkB,MAAA,GAAS,CAAA;AAE9C,QAAA,IAAI,YAAA,IAAgB,aAAa,UAAA,EAAY;AAC3C,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,UAAA,QAAA,CAAS,aAAa,EAAC;AAAA,QACzB;AAEA,QAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,UAAA,GAAa,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA,CAAA;AAChE,QAAA,MAAM,QAAA,GAAW,4BAAA;AACjB,QAAA,MAAM,YAAA,GACJ,6GAAA;AAEF,QAAA,QAAA,CAAS,WAAW,IAAA,CAAK;AAAA,UACvB,EAAA,EAAI,UAAA;AAAA,UACJ,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,SAAA,EAAW,KAAK,SAAA,CAAU;AAAA,cACxB,MAAA,EAAQ,gBAAA;AAAA,cACR;AAAA,aACD;AAAA;AACH,SACD,CAAA;AAED,QAAA,MAAM,WAAA,GAAuB;AAAA,UAC3B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,UACtB,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,YAAA;AAAA,UACT,YAAA,EAAc,UAAA;AAAA,UACd,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAAA,UACzB,WAAA,EAAa,OAAA;AAAA,UACb,SAAA,EAAW,MAAM,eAAA,IAAmB,IAAA;AAAA,UACpC,OAAO,KAAA,CAAM;AAAA,SACf;AAEA,QAAA,MAAM,iBAAA,GACJ,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,GACtB,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAC5C,IAAA;AAEN,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,UAIA,WAAA,CAAY,EAAA;AAAA,UACZ,WAAA,CAAY,IAAA;AAAA,UACZ,WAAA,CAAY,OAAA;AAAA,UACZ,WAAA,CAAY,IAAA;AAAA,UACZ,WAAA,CAAY,YAAA;AAAA,UACZ,WAAA,CAAY,UAAA;AAAA,UACZ,WAAA,CAAY,WAAA;AAAA,UACZ,WAAA,CAAY,SAAA;AAAA,UACZ,WAAA,CAAY,KAAA;AAAA,UACZ;AAAA,SACF;AAEA,QAAA,KAAA,CAAM,cAAA,CAAe,KAAK,WAAW,CAAA;AAErC,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,YAAY,WAAW,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAe,uBAAA,CACb,KAAA,EACA,QAAA,EACM;AACN,QAAA,IAAI,CAAC,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5D,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,QAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAExB,QAAA,MAAM,wBAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,kCAAA,GAClB,MAAM,WAAA,CAAY,kCAAA;AAGxB,QAAA,IAAI,CAAC,QAAA,IAAY,CAAC,wBAAA,EAA0B;AAC1C,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,YAAA,GAAe,SAAS,UAAA,CAAW,IAAA;AAAA,UACvC,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS;AAAA,SACnC;AAEA,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA;AAAA,QACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,SAAS,SAAS,CAAA;AACvD,UAAA,MAAM,iBAAA,GAAoB,KAAK,wBAAwB,CAAA;AAEvD,UAAA,IAAI,iBAAA,IAAqB,OAAO,iBAAA,KAAsB,QAAA,EAAU;AAE9D,YAAA,QAAA,CAAS,OAAA,GAAU,iBAAA;AAGnB,YAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAA,EAAkB;AAGpD,cAAA,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,gBAAA,EAAkB,iBAAiB,CAAA;AAAA,YAClE;AAIA,YAAC,MAAc,aAAA,GAAgB,iBAAA;AAAA,UACjC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,qCAAA,EAAwC,wBAAwB,CAAA,kBAAA,EAAqB,QAAQ,CAAA,EAAA,CAAA;AAAA,YAC7F;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,kBAAA,CACb,KAAA,EACA,QAAA,EAIA;AACA,QAAA,MAAM,mBAAA,GAAsB,sBAAA;AAAA,UAC1B,KAAA,CAAM,WAAA;AAAA,UACN,KAAA,CAAM,WAAA;AAAA,UACN;AAAA,SACF,CAAE,QAAA;AAEF,QAAA,IAAI,mBAAA,EAAqB;AACvB,UAAA,MAAM,wBAAA,GACJ,SAAS,UAAA,EAAY,MAAA;AAAA,YACnB,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS;AAAA,eAC9B,EAAC;AAER,UAAA,IAAI,wBAAA,CAAyB,SAAS,CAAA,EAAG;AACvC,YAAA,MAAM,+BAA+B,wBAAA,CAAyB,IAAA;AAAA,cAC5D,CAAC,IAAA,KAAS,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,KAAK,EAAE;AAAA,aAClD;AAEA,YAAA,IAAI,4BAAA,EAA8B;AAChC,cAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,cAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AACxB,cAAA,KAAA,CAAM,UAAA,GAAa,4BAA4B,mBAAmB,CAAA,CAAA;AAClE,cAAA,KAAA,CAAM,cAAA,GAAiB,cAAA;AAEvB,cAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,gBACpB,IAAA,EAAM,SAAA;AAAA,gBACN,MAAA,EAAQ,4BAA4B,mBAAmB,CAAA,CAAA;AAAA,gBACvD,MAAM,KAAA,CAAM,WAAA;AAAA,gBACZ,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AACD,cAAA,OAAO;AAAA,gBACL,UAAA,EAAY,IAAA;AAAA,gBACZ,iBAAA,EAAmB;AAAA,eACrB;AAAA,YACF;AAGA,YAAA,OAAO;AAAA,cACL,UAAA,EAAY,KAAA;AAAA,cACZ,iBAAA,EAAmB;AAAA,aACrB;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,mBAAA,GAAsB,sBAAA;AAAA,UAC1B,KAAA,CAAM,WAAA;AAAA,UACN,KAAA,CAAM,WAAA;AAAA,UACN;AAAA,SACF,CAAE,QAAA;AAEF,QAAA,IAAI,mBAAA,EAAqB;AACvB,UAAA,MAAM,uBAAA,GACJ,SAAS,UAAA,EAAY,MAAA;AAAA,YACnB,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS;AAAA,eAC9B,EAAC;AAER,UAAA,IAAI,uBAAA,CAAwB,SAAS,CAAA,EAAG;AACtC,YAAA,MAAM,8BAA8B,uBAAA,CAAwB,IAAA;AAAA,cAC1D,CAAC,IAAA,KAAS,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,KAAK,EAAE;AAAA,aAClD;AAEA,YAAA,IAAI,2BAAA,EAA6B;AAC/B,cAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,cAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AACxB,cAAA,KAAA,CAAM,UAAA,GAAa,4BAA4B,mBAAmB,CAAA,CAAA;AAClE,cAAA,KAAA,CAAM,cAAA,GAAiB,cAAA;AAEvB,cAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,gBACpB,IAAA,EAAM,SAAA;AAAA,gBACN,MAAA,EAAQ,4BAA4B,mBAAmB,CAAA,CAAA;AAAA,gBACvD,MAAM,KAAA,CAAM,WAAA;AAAA,gBACZ,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AACD,cAAA,OAAO;AAAA,gBACL,UAAA,EAAY,IAAA;AAAA,gBACZ,iBAAA,EAAmB;AAAA,eACrB;AAAA,YACF;AAGA,YAAA,OAAO;AAAA,cACL,UAAA,EAAY,KAAA;AAAA,cACZ,iBAAA,EAAmB;AAAA,aACrB;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,cAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,uBAAA,GAClB,MAAM,WAAA,CAAY,uBAAA;AAExB,QAAA,MAAM,QAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAExB,QAAA,MAAM,YAAA,GACJ,MAAM,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,IAAK,QAAA,CAAS,WAAW,MAAA,GAAS,CAAA;AACrE,QAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,OAAA,EAAS,IAAA,EAAK,IAAK,EAAA;AAEtD,QAAA,MAAM,wBACJ,OAAA,CAAQ,cAAA,IAAkB,kBAAkB,MAAA,GAAS,CAAA,IAAK,CAAC,YAAY,CAAA;AACzE,QAAA,MAAM,eAAA,GAAkB,OAAA;AAAA,UACtB,QAAA,IACE,SAAS,UAAA,EAAY,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,QAAQ;AAAA,SACvE;AACA,QAAA,MAAM,oBAAoB,qBAAA,IAAyB,eAAA;AAEnD,QAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,UAAA,OAAO;AAAA,YACL,UAAA,EAAY,KAAA;AAAA,YACZ,iBAAA,EAAmB;AAAA,WACrB;AAAA,QACF;AAIA,QAAA,IAAI,KAAA,CAAM,WAAA,CAAY,IAAA,KAAS,SAAA,EAAW;AACxC,UAAA,OAAO;AAAA,YACL,UAAA,EAAY,KAAA;AAAA,YACZ,iBAAA,EAAmB;AAAA,WACrB;AAAA,QACF;AAGA,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,QAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AACxB,QAAA,KAAA,CAAM,UAAA,GAAa,eAAA,GACf,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,GAC7B,iCAAA;AACJ,QAAA,KAAA,CAAM,cAAA,GAAiB,kBAAkB,WAAA,GAAc,kBAAA;AAIvD,QAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,UACpB,IAAA,EAAM,SAAA;AAAA,UACN,QAAQ,KAAA,CAAM,UAAA;AAAA,UACd,MAAM,KAAA,CAAM,WAAA;AAAA,UACZ,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AAED,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,KAAA;AAAA,UACZ,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF;AAAA,MAEA,OAAe,+BAA+B,KAAA,EAA2B;AACvE,QAAA,MAAM,cAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,uBAAA,GAClB,MAAM,WAAA,CAAY,uBAAA;AACxB,QAAA,MAAM,QAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAExB,QAAA,OAAO,OAAA,CAAQ,kBAAkB,QAAQ,CAAA;AAAA,MAC3C;AAAA,MAEA,OAAe,kBAAA,CACb,KAAA,EACA,UAAA,EACS;AACT,QAAA,KAAA,IAAS,IAAI,KAAA,CAAM,cAAA,CAAe,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACzD,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA;AACtC,UAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,iBAAiB,UAAA,EAAY;AAClE,YAAA;AAAA,UACF;AAEA,UAAA,OAAO,QAAQ,WAAA,KAAgB,SAAA;AAAA,QACjC;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,YAAY,KAAA,EAAwB;AACzC,QAAA,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,GAAA,GAAM,GAAA;AAItD,QAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,GAAA,IAAO,KAAA,CAAM,QAAQ,KAAA,EAAO;AACpD,UAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,OAAe,0CAA0C,GAAA,EAAuB;AAC9E,QAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,OAAA,KAAY,WAAW,GAAA,CAAI,OAAA,CAAQ,MAAK,GAAI,EAAA;AACvE,QAAA,MAAM,uBAAuB,OAAA,CAAQ,KAAA;AAAA,UACnC;AAAA,YACE,CAAC,CAAA;AAEL,QAAA,OACE,IAAI,IAAA,KAAS,MAAA,IACb,oBAAA,KAAyB,MAAA,KAEtB,OAAO,GAAA,CAAI,WAAA,KAAgB,QAAA,IAAY,GAAA,CAAI,YAAY,IAAA,EAAK,CAAE,SAAS,CAAA,IACxE,OAAO,IAAI,IAAA,KAAS,QAAA,CAAA;AAAA,MAG1B;AAAA,MAEA,OAAe,mBAAmB,KAAA,EAAyB;AACzD,QAAA,OAAO,KAAA,KAAU,KAAK,KAAA,KAAU,IAAA;AAAA,MAClC;AAAA,MAEA,OAAe,wBAAwB,QAAA,EAAgC;AAIrE,QAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAY;AAC7C,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,UAAA,IAAA,CAAK,IAAI,IAAA,KAAS,WAAA,IAAe,IAAI,IAAA,KAAS,MAAA,KAAW,IAAI,UAAA,EAAY;AACvE,YAAA,IAAI;AACF,cAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3C,cAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,gBAAA,IAAI,KAAK,EAAA,EAAI;AACX,kBAAA,oBAAA,CAAqB,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,gBAClC;AAAA,cACF;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,GAAA,CAAI,EAAE,KAAK,KAAK,CAAA;AAAA,YAC1E;AAAA,UACF;AAAA,QACF;AAKA,QAAA,MAAM,WAAsB,EAAC;AAC7B,QAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAE1B,UAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,YAAA,EAAc;AAC3C,YAAA,IAAI,CAAC,oBAAA,CAAqB,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,EAAG;AAC/C,cAAA,IAAI,IAAA,CAAK,yCAAA,CAA0C,GAAG,CAAA,EAAG;AACvD,gBAAA;AAAA,cACF;AACA,cAAA,OAAA,CAAQ,KAAK,CAAA,oDAAA,EAAuD,GAAA,CAAI,EAAE,CAAA,4BAAA,EAA+B,GAAA,CAAI,YAAY,CAAA,CAAE,CAAA;AAC3H,cAAA,kBAAA,IAAsB,CAAA;AACtB,cAAA;AAAA,YACF;AAAA,UACF;AAGA,UAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,QACnB;AAEA,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,MAAA;AAChD,QAAA,IAAI,YAAA,GAAe,CAAA,IAAK,kBAAA,GAAqB,CAAA,EAAG;AAC9C,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sBAAA,EAAyB,YAAY,CAAA,mCAAA,CAAqC,CAAA;AAAA,QACzF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,aAAoB,mBAClB,KAAA,EACoB;AACpB,QAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,QAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,MAAA,CAAO,YAAA,IAAgB,IAAA;AAC1D,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,CAAO,kBAAA,IAAsB,IAAA;AAE5D,QAAA,IAAI;AACF,UAAA,IAAI,OAAc,EAAC;AAGnB,UAAA,IAAI,oBAAA,EAAsB;AAQxB,YAAA,MAAM,OAAA,GAAU;AAAA,cACd,IAAA;AAAA,cAAM,MAAA;AAAA,cAAQ,SAAA;AAAA,cAAW,MAAA;AAAA,cAAQ,aAAA;AAAA,cACjC,GAAI,gBAAA,GAAmB,CAAC,cAAc,cAAA,EAAgB,aAAa,IAAI,EAAC;AAAA,cACxE,QAAA;AAAA,cAAU,YAAA;AAAA,cAAc,iBAAA;AAAA,cAAmB,uBAAA;AAAA,cAC3C,QAAA;AAAA,cAAU,QAAA;AAAA,cAAU,WAAA;AAAA,cAAa,OAAA;AAAA,cACjC,mBAAA;AAAA,cAAqB;AAAA,aACvB;AAEA,YAAA,MAAM,KAAA,GAAQ;AAAA;AAAA,YAAA,EAER,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAMxB,YAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAoC,KAAK,CAAA;AAE1E,YAAA,IAAA,GAAO,OAAO,OAAA,EAAQ;AAAA,UACxB;AAGA,UAAA,IAAI,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA,EAAG;AACzD,YAAA,IAAA,CAAK,IAAA,CAAK,GAAG,KAAA,CAAM,aAAa,CAAA;AAEhC,YAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAA,KAAe,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA,GAAK,IAAI,CAAA,CAAE,CAAA;AAAA,UAC7F;AAGA,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,YACvC,IAAI,GAAA,CAAI,EAAA;AAAA,YACR,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,aAAa,GAAA,CAAI,WAAA;AAAA,YACjB,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,cAAc,GAAA,CAAI,YAAA;AAAA,YAClB,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,iBAAiB,GAAA,CAAI,eAAA;AAAA,YACrB,uBAAuB,GAAA,CAAI,qBAAA;AAAA,YAC3B,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,MAAA,EAAQ,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA;AAAA,YAC1C,aAAa,GAAA,CAAI,WAAA;AAAA,YACjB,WAAW,GAAA,CAAI,SAAA;AAAA,YACf,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,mBAAmB,GAAA,CAAI,iBAAA;AAAA,YACvB,mBAAmB,GAAA,CAAI;AAAA,WACzB,CAAE,CAAA;AAIF,UAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,YACV,MAAA,CAAO,QAAA;AAAA,YACP,KAAA;AAAA,YACA,IAAA,CAAK,wBAAwB,QAAQ;AAAA,WACvC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,aAAqB,qBAAA,CACnB,MAAA,EACA,KAAA,EACA,QAAA,EACoB;AACpB,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,iBAAiB,CAAA;AACrE,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AAEnC,QAAA,IAAI,MAAA,GAAS,QAAA;AACb,QAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAEvD,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAa,MAAM,CAAA;AAAA,UAC7C,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,sDAAiD,KAAK,CAAA;AAAA,UACtE;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,QAAA,CACnB,KAAA,EACA,KAAA,EACA,WACA,OAAA,EACe;AACf,QAAA,IAAI;AACF,UAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,UAAA,MAAM,UAAA,GAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAA;AAE1D,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,YAMA,OAAO,UAAA,EAAW;AAAA,YAClB,sCAAA;AAAA;AAAA,YACA,QAAA;AAAA,YACA,OAAA,IAAW,SAAA;AAAA,YACX,CAAA,EAAG,YAAY,CAAA,EAAG,UAAA,GAAa;;AAAA;AAAA,EAAqB,UAAU,KAAK,EAAE,CAAA,CAAA;AAAA,YACrE,SAAA;AAAA,YACA,IAAA,CAAK,KAAI,GAAI;AAAA,WACf;AAAA,QACF,SAAS,QAAA,EAAU;AAEjB,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,QAAQ,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,gBAAgB,QAAA,EAA2B;AACxD,QAAA,OAAO,QAAA,CAAS,WAAW,QAAQ,CAAA;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAqB,2BAAA,CACnB,GAAA,EACA,KAAA,EACA,YAAA,EACyB;AACzB,QAAA,MAAM,WAAA,GAAc,IAAI,OAAA,IAAW,EAAA;AAGnC,QAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AACpB,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,IAAI,WAAA;AACJ,QAAA,IAAI;AACF,UAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AAAA,QAC1C,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wCAAA,EAA2C,GAAA,CAAI,EAAE,KAAK,CAAC,CAAA;AACrE,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,UAAA,OAAO,WAAA;AAAA,QACT;AAGA,QAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA;AAAA,UAAO,CAAC,CAAA,KAC3C,IAAA,CAAK,eAAA,CAAgB,EAAE,QAAQ;AAAA,SACjC;AAEA,QAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AAEjC,UAAA,MAAMC,iBAAgB,WAAA,CAAY,MAAA;AAAA,YAChC,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,eAAA,CAAgB,EAAE,QAAQ;AAAA,WACzC;AACA,UAAA,IAAIA,cAAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,YAAA,MAAM,QAAA,GAAWA,eAAc,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3D,YAAA,OAAO,GAAG,WAAW;;AAAA,iBAAA,EAAwB,QAAQ,CAAA,CAAA,CAAA;AAAA,UACvD;AACA,UAAA,OAAO,WAAA;AAAA,QACT;AAGA,QAAA,MAAM,kBAAqC,EAAC;AAG5C,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,YACnB,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACP,CAAA;AAAA,QACH;AAGA,QAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,UAAA,IAAI;AAEF,YAAA,MAAM,MAAA,GAAS,MAAO,KAAA,CAAM,MAAA,CAAO,QAAA,CAAiB,QAAA;AAAA,cAClD,UAAA,CAAW;AAAA,aACb;AAEA,YAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AAEjC,cAAA,MAAM,UAAU,CAAA,KAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,CAAA;AAEjE,cAAA,IAAI,YAAA,EAAc;AAChB,gBAAA,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,IAAI,CAAA;AAAA,cAC3C;AACA,cAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,gBACnB,IAAA,EAAM,WAAA;AAAA,gBACN,SAAA,EAAW;AAAA,kBACT,GAAA,EAAK,OAAA;AAAA,kBACL,MAAA,EAAQ;AAAA;AACV,eACD,CAAA;AAAA,YACH,CAAA,MAAO;AAEL,cAAA,OAAA,CAAQ,IAAA;AAAA,gBACN,CAAA,gCAAA,EAAmC,WAAW,IAAI,CAAA,CAAA,CAAA;AAAA,gBAClD,MAAA,CAAO;AAAA,eACT;AACA,cAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,gBACnB,IAAA,EAAM,MAAA;AAAA,gBACN,IAAA,EAAM,CAAA,sBAAA,EAAyB,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,eAC/C,CAAA;AAAA,YACH;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,UAAA,CAAW,IAAI,KAAK,KAAK,CAAA;AACzE,YAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,cACnB,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,CAAA,sBAAA,EAAyB,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,aAC/C,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,MAAM,gBAAgB,WAAA,CAAY,MAAA;AAAA,UAChC,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,eAAA,CAAgB,EAAE,QAAQ;AAAA,SACzC;AACA,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,UAAA,MAAM,QAAA,GAAW,cAAc,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3D,UAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,YACnB,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;;AAAA,iBAAA,EAAwB,QAAQ,CAAA,CAAA;AAAA,WACvC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,eAAA;AAAA,MACT;AAAA,KAEF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjlKO,SAAS,SAAA,CACd,IAAA,EACA,QAAA,EACA,IAAA,GAAgC,EAAC,EAC3B;AAEN,EAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAW;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,QAAQ,CAAA,kEAAA,EACC,IAAA,CAAK,gBAAgB,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,QAAQ,UACtF,QAAQ,CAAA,wDAAA;AAAA,OAClB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,IACtB,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAChC;AAAA,IACA,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AAAA,GAC1B;AAEA,EAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACjC,EAAA,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA;AACzC;AAuCA,eAAsB,aAAA,CACpB,MACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,EAAA,IAAM,MAAA,CAAO,UAAA,EAAW;AAClD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AAIjC,EAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,KAAA;AAC/C,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,EAAA,EAAI,SAAA;AAAA,IACJ,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,IACtB,YAAA,EAAc,QAAQ,UAAA,IAAc,IAAA;AAAA,IACpC,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA;AAAA,IACA,SAAA,EAAW,aAAA,GAAgB,IAAA,GAAQ,IAAA,CAAK,eAAA,IAAmB,IAAA;AAAA,IAC3D,KAAA,EAAO,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,KAAA;AAAA,IAChC,UAAU,OAAA,CAAQ;AAAA,GACpB;AAEA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAG3B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACpC,CAAA,4CAAA,CAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,MAAM,aAAA,GAAgB,KAAK,CAAC,CAAA;AAE5B,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gBAAA,EAAmB,QAAQ,eAAe,CAAA,UAAA;AAAA,OAC5C;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,UAAA,GAAc,cAAc,UAAA,GAAwB,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAGjG,EAAA,MAAM,eAAe,OAAA,CAAQ,QAAA,GAAW,KAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA;AAC3E,EAAA,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAI,IAAA;AAAA,IACrB,CAAA,wKAAA,CAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,CAAQ,IAAA;AAAA,IACR,OAAA,CAAQ,OAAA;AAAA,IACR,OAAA,CAAQ,IAAA;AAAA,IACR,OAAA,CAAQ,YAAA;AAAA,IACR,OAAA,CAAQ,UAAA;AAAA,IACR,OAAA,CAAQ,MAAA;AAAA,IACR,SAAS,CAAA,GAAI,CAAA;AAAA,IACb,OAAA,CAAQ,SAAA;AAAA,IACR,OAAA,CAAQ,KAAA;AAAA,IACR,YAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,EAClC,CAAA,MAAO;AAEL,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,EAChD;AAGA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,SAAA,CAAU,IAAA,EAAM,QAAQ,SAAS,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,OAAA;AACT;AA4BA,eAAsB,YACpB,IAAA,EACA,KAAA,GAAgB,KAChB,MAAA,GAAiB,CAAA,EACjB,QAAwB,KAAA,EACJ;AACpB,EAAA,MAAM,WAAA,GAAc,KAAA,KAAU,MAAA,GAAS,MAAA,GAAS,KAAA;AAE9C,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,IACpC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAkBoB,WAAW,WAAW,WAAW;AAAA,oBAAA,CAAA;AAAA,IAErD,KAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,EAAU;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACtC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,UAAA,QAAA,GAAW,MAAA;AAAA,QACb;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,GAAW,MAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,uBAAuB,GAAA,CAAI,qBAAA;AAAA,MAC3B,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,MAAA,EAAQ,IAAI,MAAA,KAAW,CAAA;AAAA,MACvB,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,QAAA;AAAA,MACA,aAAa,GAAA,CAAI;AAAA,KAClB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,QAAA;AACT;AAqBA,eAAsB,cAAc,KAAA,EAAsC;AAExE,EAAA,MAAM,EAAE,UAAA,EAAAR,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC7B,EAAA,KAAA,CAAM,cAAA,GAAiB,MAAMA,WAAAA,CAAW,kBAAA,CAAmB,KAAK,CAAA;AAChE,EAAA,OAAO,KAAA,CAAM,cAAA;AACf;AA2BO,SAAS,eAAA,CACd,IAAA,EACA,IAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,IAAA,OAAA,CAAQ,KAAK,wDAAwD,CAAA;AACrE,IAAA;AAAA,EACF;AAGA,EAAA,IAAA,CAAK,SAAA,CAAU,MAAM,IAAI,CAAA;AAC3B;AAwCO,SAAS,SAAA,CAAU,MAAiB,IAAA,EAAiC;AAG1E,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,EAC1B,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AACF;AA+DA,eAAsB,YAAA,CACpB,QACA,MAAA,EAWQ;AACR,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAS,iBAAiB,MAAA,CAAO,QAAA,CAAS,IAAI,MAAM,CAAA;AAChF,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,MAAA,EAAQ;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,MAAA;AAChB;AA4BA,eAAsB,SAAA,CACpB,IAAA,EACA,IAAA,EACA,IAAA,EACA,UACA,OAAA,EAIqB;AACrB,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAG7B,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,UAAA,GAAa,KAAK,IAAI,CAAA;AAAA,EACxB,CAAA,MAAO;AACL,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAI,CAAA;AACjC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,UAAA,GAAa,KAAK,MAAM,CAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA;AAC9C,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,eAAA,GAAkB,KAAK,MAAM,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,SAAS,MAAM,QAAA,CAAS,SAAA,CAAU,IAAA,EAAM,YAAY,QAAA,EAAU;AAAA,IAClE,UAAU,OAAA,EAAS,QAAA;AAAA,IACnB,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,sBAAsB,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAsBA,eAAsB,UAAA,CACpB,IAAA,EACA,IAAA,EACA,IAAA,EACA,UACA,OAAA,EAIqB;AACrB,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,OAAO,CAAA;AACtD;AA2BA,eAAsB,QAAA,CACpB,IAAA,EACA,IAAA,EACA,QAAA,EACA,OAAA,EAKqB;AACrB,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,SAAS,MAAM,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,UAAU,OAAO,CAAA;AAE9D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,qBAAqB,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAmBA,eAAsB,QAAA,CACpB,MACA,IAAA,EAC6B;AAC7B,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAmBA,eAAsB,IAAA,CACpB,MACA,IAAA,EAC4B;AAC5B,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAkBA,eAAsB,MAAA,CAAO,MAAiB,IAAA,EAAgC;AAC5E,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAC7C,EAAA,OAAO,MAAA,CAAO,WAAW,MAAA,CAAO,MAAA;AAClC;AAeA,eAAsB,MAAA,CAAO,MAAiB,IAAA,EAA6B;AACzE,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAE7C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,uBAAuB,CAAA;AAAA,EACzD;AACF;AAgBA,eAAsB,KAAA,CAAM,MAAiB,IAAA,EAAmC;AAC9E,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAE5C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,4BAA4B,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,MAAA,CAAO,SAAA;AAChB;AAmBA,eAAsB,OAAA,CACpB,MACA,IAAA,EACuB;AACvB,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA;AAE9C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,0BAA0B,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AAeA,eAAsB,KAAA,CAAM,MAAiB,IAAA,EAA6B;AACxE,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAE5C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,4BAA4B,CAAA;AAAA,EAC9D;AACF;AAgBA,eAAsB,aAAa,IAAA,EAAqC;AACtE,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA,EAAa;AAE3C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,0BAA0B,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AAgBA,eAAsB,YAAA,CACpB,MACA,IAAA,EAC6B;AAC7B,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,gBAAA,CAAiB,IAAI,CAAA;AAEnD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAgBA,eAAsB,GAAA,CAAI,MAAiB,IAAA,EAAsC;AAC/E,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAE/C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AAiBA,eAAsB,IAAA,CACpB,IAAA,EACA,IAAA,EACA,KAAA,GAAgB,EAAA,EACQ;AACxB,EAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACpC,EAAA,IAAI,OAAA,KAAY,MAAM,OAAO,IAAA;AAE7B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACnC,EAAA,OAAO,SAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3C;AAiBA,eAAsB,IAAA,CACpB,IAAA,EACA,IAAA,EACA,KAAA,GAAgB,EAAA,EACQ;AACxB,EAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACpC,EAAA,IAAI,OAAA,KAAY,MAAM,OAAO,IAAA;AAE7B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACnC,EAAA,OAAO,SAAS,KAAA,CAAM,CAAC,KAAK,CAAA,CAAE,KAAK,IAAI,CAAA;AACzC;AAqBA,eAAsB,IAAA,CACpB,IAAA,EACA,OAAA,EACA,OAAA,EAIuB;AACvB,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,SAAA,CAAU,SAAS,OAAO,CAAA;AAExD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,eAAe,CAAA;AAAA,EACjD;AAGA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,IACrC,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAA,EAAS,CAAC,CAAA,CAAE,OAAO;AAAA,GACrB,CAAE,CAAA;AACJ;AAqBA,eAAsB,IAAA,CACpB,IAAA,EACA,OAAA,EACA,OAAA,EAIuB;AACvB,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,SAAA,CAAU,SAAS,OAAO,CAAA;AAExD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,aAAa,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AA9hCA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AACA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACyJO,SAAS,uBAAuB,MAAA,EAMrB;AAChB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAA;AACtD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,oBAAA,CAAqB;AAAA,MAC1B,MAAA,EAAQ,YAAA;AAAA,MACR,SAAS,EAAC;AAAA,MACV,MAAM,EAAC;AAAA,MACP,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AACnC,EAAA,MAAM,UAAqB,EAAC;AAC5B,EAAA,MAAM,OAA2B,EAAC;AAClC,EAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAChC,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,eAAA,GAAkB,2BAAA;AACtB,EAAA,IAAI,iBAAA,GAAoE,IAAA;AAExE,EAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAA6B,CAAC,OAAA,KAAY;AAChE,IAAA,iBAAA,GAAoB,OAAA;AAAA,EACtB,CAAC,CAAA;AAED,EAAA,MAAM,UAAU,YAA0C;AACxD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,cAAA,CAAe,GAAA,CAAI,qBAAqB,CAAA;AAI9D,IAAA,IAAI,CAAC,UAAW,OAAO,MAAA,CAAO,SAAS,UAAA,IAAc,OAAO,MAAA,CAAO,GAAA,KAAQ,UAAA,EAAa;AACtF,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,qBAAA;AAAA,UACN,OAAA,EACE,oCAAoC,qBAAqB,CAAA,2HAAA;AAAA;AAE7D,OACF;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,YAAA;AACrC,IAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,gBAAA;AACrC,IAAA,MAAM,YAAA,GAAe,yBAAA;AAAA,MACnB,MAAA,CAAO,MAAA;AAAA,MACP,OAAA,CAAQ,OAAA;AAAA,MACR;AAAA,KACF;AACA,IAAA,MAAM,mBAAmB,MAAM,uBAAA;AAAA,MAC7B,YAAA,CAAa,MAAA;AAAA,MACb,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,oBAAoB,MAAM,wBAAA;AAAA,MAC9B,YAAA,CAAa,OAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,OAAA,CAAQ,OAAO,CAAA;AAE9D,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AACrD,IAAA,MAAM,aAAa,MAAA,CAAO,cAAA;AAC1B,IAAA,IAAI,OAAO,UAAA,CAAW,2BAAA,KAAgC,UAAA,EAAY;AAChE,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAA0C;AAAA,MAC9C,IAAA,EAAM,OAAO,UAAA,EAAY,WAAA,KAAgB;AACvC,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC5C,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,UAAU,CAAA,CAAE,CAAA;AAAA,QAC3D;AACA,QAAA,MAAM,OAAQ,WAAA,CAA+B,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,GAAG,CAAC,CAAA;AAC1E,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAC9B,UAAA,OAAO,YAAY,KAAK,CAAA;AAAA,QAC1B,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,cAAc,KAAK,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,KACF;AAEA,IAAA,UAAA,CAAW,2BAAA,CAA4B,OAAO,MAAM,CAAA;AACpD,IAAA,IAAI,iBAAgD,EAAC;AAErD,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,6BAAA,CAA8B,MAAA,CAAO,cAAc,CAAA;AACzE,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,YAAA;AAAA,UACR,OAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,UACzB,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,4BAAA;AAAA,YACN,OAAA,EACE;AAAA;AAGJ,SACF;AAAA,MACF;AAEA,MAAA,MAAM,iBAAA,GACH,MAAA,CAAO,cAAA,CAAe,GAAA,CAAI,qCAAA,IAC3B,0BAAA;AACF,MAAA,MAAM,WAAW,cAAA,CAAe;AAAA,QAC9B,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAA;AAAA,QACA,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA;AAAA,QACA,iBAAA;AAAA,QACA,kBAAkB,OAAA,CAAQ;AAAA,OAC3B,CAAA;AAED,MAAA,MAAM,aAAa,eAAA,CAAgB;AAAA,QACjC,MAAA,EAAQ,gBAAA;AAAA,QACR,QAAA;AAAA,QACA,OAAA,EAAS,iBAAA;AAAA,QACT,QAAA;AAAA,QACA,iBAAA;AAAA,QACA,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AACD,MAAA,cAAA,GAAiB,qBAAqB,UAAU,CAAA;AAEhD,MAAA,MAAM,MAAA,GACJ,OAAO,MAAA,CAAO,GAAA,KAAQ,UAAA,GAClB,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,MAAM,UAAU,CAAA,GACrC,MAAA,CAAO,KAAM,UAAU,CAAA;AAE7B,MAAA,MAAM,WAAA,GAAc,KAAK,SAAA,CAAU;AAAA,QACjC,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,KAAA;AAAA,QACA,OAAA,EAAS,eAAA;AAAA,QACT,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB;AAAA,OAC/C,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,eAAA,CAAgB,MAAA,EAAQ,OAAO,WAAW,CAAA;AAC7E,MAAA,MAAM,WAAW,MAAM,MAAA,CACpB,aAAA,EAAc,CACd,MAAM,sCAAA,EAAwC;AAAA,QAC7C,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,WAAA;AAAA,QACN;AAAA,OACD,CAAA;AAEH,MAAA,MAAM,OAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,MAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACf,QAAA,SAAA,CAAU,IAAA,EAAM,QAAQ,IAAI,CAAA;AAC5B,QAAA,YAAA,CAAa,OAAA,EAAS,QAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,WAAA,CAAY,MAAM,CAAC,CAAC,CAAA;AAC1E,QAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,OAAA,CAAQ,KAAA,EAAO,cAAc,CAAA;AACvE,QAAA,OAAO;AAAA,UACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,KAAA,EAAO,WAAA;AAAA,UACP,OAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,IAAA,EAAM,QAAQ,IAAI,CAAA;AAC5B,MAAA,YAAA,CAAa,OAAA,EAAS,QAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,WAAA,CAAY,MAAM,CAAC,CAAC,CAAA;AAC1E,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAA;AAAA,QAClC,OAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAA,IAAc,YAAA,CAAa,KAAK,CAAA,EAAG;AACrC,QAAA,OAAO,gBAAA,CAAiB,eAAA,EAAiB,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,oBAAA,CAAqB,KAAK,GAAG,cAAc,CAAA;AACxF,MAAA,MAAM,MAAA,GAAS,cAAc,cAAc,CAAA,GACvC,WACA,iBAAA,CAAkB,cAAc,IAC9B,YAAA,GACA,OAAA;AACN,MAAA,OAAO;AAAA,QACL,MAAA;AAAA,QACA,KAAA,EAAO,cAAA;AAAA,QACP,OAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC3B;AAAA,IACF,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,gCAAgC,KAAK,CAAA;AAAA,IAClD;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,IAAW,WAAW,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM;AACnE,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,EACxB,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAAA,IAC/B,UAAU,MAAA,EAAuB;AAC/B,MAAA,IAAI,CAAC,WAAW,UAAA,EAAY;AAC1B,QAAA;AAAA,MACF;AACA,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,eAAA,GAAkB,MAAA,IAAU,eAAA;AAC5B,MAAA,eAAA,CAAgB,MAAM,eAAe,CAAA;AACrC,MAAA,iBAAA,GAAoB,gBAAA,CAAiB,eAAA,EAAiB,OAAA,EAAS,IAAA,EAAM,SAAS,CAAC,CAAA;AAAA,IACjF,CAAA;AAAA,IACA,IAAI,OAAA,GAAU;AACZ,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,IAAI,OAAA,GAAU;AACZ,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GACF;AACF;AAEA,eAAsB,gCAAA,CACpB,SACA,OAAA,EACmB;AACnB,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,EAAG,mBAAmB,GAAG,CAAA,EAAG;AACvD,IAAA,OAAO,IAAI,QAAA,CAAS,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,OAAO,KAAA,EAAO,MAAM,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACpD,EAAA,IAAI,CAAC,KAAA,IAAS,MAAA,KAAW,MAAA,EAAQ;AAC/B,IAAA,OAAO,IAAI,QAAA,CAAS,2BAAA,EAA6B,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd;AAAA,QACE,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,EAAK;AAIjC,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,KAAK,UAAA,EAAY,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA;AAChE,IAAA,OAAO,SAAS,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAAA,EAC1C,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd;AAAA,QACE,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO,qBAAqB,KAAK;AAAA,OACnC;AAAA,MACA,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF;AAEO,SAAS,6BAA6B,OAAA,EAA2B;AACtE,EAAA,OAAO,IAAI,IAAI,OAAA,CAAQ,GAAG,EAAE,QAAA,CAAS,UAAA,CAAW,CAAA,EAAG,mBAAmB,CAAA,CAAA,CAAG,CAAA;AAC3E;AAEA,SAAS,qBAAqB,MAAA,EAA4C;AACxE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAAA,IAC/B,SAAA,GAAY;AAAA,IAEZ,CAAA;AAAA,IACA,OAAA,EAAS,KAAA;AAAA,IACT,SAAS,MAAA,CAAO;AAAA,GAClB;AACF;AAEA,SAAS,gBAAgB,OAAA,EAA2D;AAClF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS,2BAA2B,GAAG,CAAA;AAAA,OACzC;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,QAAA,IAAY,OAAA,CAAQ,aAAa,YAAA,IAAgB,OAAA,CAAQ,aAAa,YAAA,EAAc;AAC9F,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,6BAAA;AAAA,MACN,OAAA,EAAS,CAAA,8BAAA,EAAiC,OAAA,CAAQ,QAAQ,CAAA;AAAA,KAC5D;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC7F,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,IACE,OAAA,CAAQ,OAAA,CAAQ,EAAA,KAAO,MAAA,KACtB,OAAO,OAAA,CAAQ,OAAA,CAAQ,EAAA,KAAO,QAAA,IAAY,OAAA,CAAQ,OAAA,CAAQ,EAAA,CAAG,WAAW,CAAA,CAAA,EACzE;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,IAAA,KAAS,MAAA,IAAa,CAAC,MAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC9E,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG;AAC5C,QAAA,WAAA,CAAY,GAAG,CAAA;AAAA,MACjB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACpD;AAAA,IACF;AAAA,EACF;AACA,EAAA,IACE,OAAA,CAAQ,gBAAA,KAAqB,MAAA,KAC5B,CAAC,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,gBAAgB,CAAA,IAAK,OAAA,CAAQ,gBAAA,IAAoB,CAAA,CAAA,EAC3E;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,6BAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,KAAA,MAAW,CAAC,WAAW,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpE,MAAA,IAAI,CAAC,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC/B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,6BAAA;AAAA,UACN,OAAA,EAAS,gDAAgD,SAAS,CAAA,CAAA;AAAA,UAClE;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,aAAa,OAAO,SAAA,KAAc,YAAY,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3E,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,6BAAA;AAAA,UACN,OAAA,EAAS,+CAA+C,SAAS,CAAA,CAAA;AAAA,UACjE;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,IAAI,OAAO,QAAQ,OAAA,KAAY,QAAA,IAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AACzE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,KAAA,MAAW,CAAC,WAAW,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjE,MAAA,IAAI,CAAC,mBAAA,CAAoB,SAAS,CAAA,EAAG;AACnC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,6BAAA;AAAA,UACN,OAAA,EAAS,oDAAoD,SAAS,CAAA,CAAA;AAAA,UACtE;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,6BAAA;AAAA,UACN,OAAA,EAAS,2CAA2C,SAAS,CAAA,CAAA;AAAA,UAC7D;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,OAAO,OAAA,CAAQ,OAAA,KAAY,YAAY,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI;AAC9F,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,6BAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,uBAAA,CACb,MAAA,EACA,QAAA,EACA,QAAA,GAAW,gBAAA,EACM;AACjB,EAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAA,GAAK,MAAM,sBAAA,EAAuB;AACxC,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAO,qBAAqB,MAAM,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,eAAA,CAAgB,MAAA,EAAQ;AAAA,IACxC,QAAA,EAAU,QAAA;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,eAAA,EAAiB,+BAA+B,EAAE;AAAA,GACnD,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,EAAC;AAC3C,EAAA,MAAM,WAAW,WAAA,CAAY,IAAA;AAAA,IAC3B,CAAC,UAAA,KAAe,UAAA,CAAW,QAAA,KAAa,GAAG,kBAAA,CAAmB;AAAA,GAChE;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,8BAAA,CAA+B,EAAA,EAAI,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,MAAA,CAAO,UAAA;AAChB;AAEA,eAAe,wBAAA,CACb,SACA,QAAA,EACiC;AACjC,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,WAAW,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA,EAAG;AAC/D,IAAA,GAAA,CAAI,gCAAA,CAAiC,SAAS,CAAC,CAAA,GAAI,MAAM,uBAAA;AAAA,MACvD,MAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,yBAAA,CACP,MAAA,EACA,OAAA,EACA,QAAA,EACiE;AACjE,EAAA,IAAI,CAAC,OAAA,IAAW,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACjD,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAAA,EAC3B;AAEA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,YAAY,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC/D,IAAA,MAAM,UAAA,GAAa,0BAAA,CAA2B,EAAA,EAAI,SAAS,CAAA;AAC3D,IAAA,aAAA,CAAc,GAAA,CAAI,YAAY,YAAY,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,aAAA,CAAc,MAAM,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,yBAAyB,QAAQ,CAAA;AACnD,EAAA,MAAM,eAAA,GAAkB,8BAAA,CAA+B,MAAA,EAAQ,SAAA,EAAW,IAAI,WAAW,CAAA;AACzF,EAAA,MAAM,mBAA2C,EAAC;AAElD,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,YAAY,CAAA,IAAK,aAAA,EAAe;AACtD,IAAA,gBAAA,CAAiB,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAA,GAAI,8BAAA;AAAA,MACpC,YAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,OAAA,EAAS,gBAAA,EAAiB;AAC9D;AAEA,SAAS,sBAAA,GAA2D;AAClE,EAAA,yBAAA,KAA8B,OAAO,YAAY,CAAA,CAC9C,IAAA,CAAK,CAAC,MAAA,KAAW,2BAAA,CAA4B,MAAM,CAAC,CAAA,CACpD,KAAA,CAAM,MAAM,IAAI,CAAA;AACnB,EAAA,OAAO,yBAAA;AACT;AAEA,SAAS,4BAA4B,MAAA,EAA0C;AAC7E,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,MAAA;AAAA,IACA,UAAU,OAAO,MAAA,KAAW,YAAY,SAAA,IAAa,MAAA,GAChD,OAAiC,OAAA,GAClC;AAAA,GACN;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IACE,aACA,OAAO,SAAA,KAAc,YACrB,OAAQ,SAAA,CAA+B,oBAAoB,UAAA,EAC3D;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,+BACP,EAAA,EACsC;AACtC,EAAA,MAAM,OAAA,GAAgD;AAAA,IACpD,eAAA,EAAiB,IAAA;AAAA,IACjB,oBAAA,EAAsB,KAAA;AAAA,IACtB,SAAA,EAAW,KAAA;AAAA,IACX,eAAA,EAAiB,KAAA;AAAA,IACjB,aAAA,EAAe;AAAA,GACjB;AAEA,EAAA,MAAM,MAAA,GACJ,GAAG,YAAA,EAAc,MAAA,IAAU,GAAG,YAAA,EAAc,MAAA,IAAU,GAAG,YAAA,EAAc,MAAA;AACzE,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AAAA,EACnB;AAEA,EAAA,MAAM,UAAA,GAAa,GAAG,UAAA,EAAY,MAAA,IAAU,GAAG,UAAA,EAAY,MAAA,IAAU,GAAG,UAAA,EAAY,MAAA;AACpF,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,OAAA,CAAQ,MAAA,GAAS,UAAA;AAAA,EACnB;AAEA,EAAA,MAAM,gBAAA,GACJ,EAAA,CAAG,oBAAA,EAAsB,OAAA,IACzB,EAAA,CAAG,oBAAA,EAAsB,QAAA,IACzB,EAAA,CAAG,oBAAA,EAAsB,MAAA,IACzB,EAAA,CAAG,oBAAA,EAAsB,MAAA;AAC3B,EAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,IAAA,OAAA,CAAQ,gBAAA,GAAmB,gBAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,EAAS,QAAA,IAAY,GAAG,OAAA,EAAS,QAAA;AAChD,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAA,CAAQ,GAAA,GAAM,GAAA;AAAA,EAChB;AAEA,EAAA,MAAM,sBAAA,GAAyB,GAAG,sBAAA,EAAwB,MAAA;AAC1D,EAAA,IAAI,2BAA2B,MAAA,EAAW;AACxC,IAAA,OAAA,CAAQ,sBAAA,GAAyB,sBAAA;AAAA,EACnC;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,8BAAA,CACP,EAAA,EACA,UAAA,EACA,gBAAA,EACoB;AACpB,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,4BAAA,CAA6B,UAAA,CAAW,aAAa,IAAI,CAAA;AAC5E,EAAA,MAAM,OAAO,UAAA,CAAW,IAAA;AACxB,EAAA,IAAI,IAAA,IAAQ,OAAO,UAAA,CAAW,KAAA,KAAU,QAAA,EAAU;AAChD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,6BAAA,CAA8B,UAAA,CAAW,KAAK,CAAA;AACpE,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,QAAA,IAAY,gBAAgB,CAAA;AAClE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,0BAAA;AAAA,MACN,OAAA,EAAS,QAAQ,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,IAAA,EAAO,QAAQ,KAAK,OAAO,CAAA,CAAA;AAAA,MAC7D,IAAA,EAAM,SAAS,IAAA,GAAO,CAAA;AAAA,MACtB,MAAA,EAAQ,SAAS,SAAA,GAAY,CAAA;AAAA,MAC7B;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,0BAAA;AAAA,IACN,OAAA;AAAA,IACA,QAAA,EAAU,gBAAgB,gBAAgB;AAAA,GAC5C;AACF;AAEA,SAAS,uBAAuB,OAAA,EAAmE;AACjG,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,SAAS,EAAA,IAAM,SAAA;AAAA,IACnB,IAAA,EAAA,CAAO,OAAA,EAAS,IAAA,IAAQ,EAAC,EAAG,IAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,GAAG,CAAC;AAAA,GAC3D;AACF;AAEA,SAAS,aAAA,CACP,OAAA,EACA,OAAA,EACA,IAAA,EACgB;AAChB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA4B;AAClD,EAAA,MAAM,UAAmC,EAAE,GAAI,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG;AAEtE,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA,EAAG;AAC7D,IAAA,OAAA,CAAQ,OAAA,GAAU,uBAAuB,IAAI,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,MAAA,GAAS,CAAC,KAAA,KAAmB;AACnC,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,MAAA,OAAO,OAAA,CAAQ,SAAS,KAAK,CAAA;AAAA,IAC/B,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AACpC,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,OAAA,EAAS,sBAAA,CAAuB,OAAA,EAAS,SAAA,EAAW,SAAS,CAAA;AAAA,IAC7D,OAAA,EAAS,kBAAA,CAAmB,OAAA,EAAS,SAAA,EAAW,SAAS;AAAA,GAC3D;AAEA,EAAA,MAAM,gBAAgD,EAAC;AACvD,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5D,IAAA,aAAA,CAAc,SAAS,IAAI,EAAE,EAAA,EAAI,kBAAkB,SAAA,EAAW,SAAA,EAAW,0BAA0B,CAAA,EAAE;AAAA,EACvG;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,IAChC,aAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,sBAAA,CACP,KAAA,EACA,IAAA,EACA,SAAA,EAC8C;AAC9C,EAAA,MAAM,MAAoD,EAAC;AAC3D,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACpD,IAAA,GAAA,CAAI,GAAG,IAAI,kBAAA,CAAmB,SAAA,EAAW,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,kBAAA,CACP,KAAA,EACA,IAAA,EACA,SAAA,EAC8B;AAC9B,EAAA,MAAM,MAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,GAAA,CAAI,GAAG,IAAI,kBAAA,CAAmB,IAAA,EAAM,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,kBAAA,CACP,KAAA,EACA,IAAA,EACA,SAAA,EACc;AACd,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,SAAA,CAAU,GAAA,CAAI,MAAM,KAAuB,CAAA;AAC3C,IAAA,OAAO,EAAE,kBAAA,EAAoB,UAAA,EAAY,EAAA,EAAI,IAAA,EAAK;AAAA,EACpD;AACA,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACrB,IAAA,MAAM,SAAA,GAAY,GAAG,IAAI,CAAA,UAAA,CAAA;AACzB,IAAA,SAAA,CAAU,GAAA,CAAI,SAAA,EAAW,YAAY,KAAK,CAAA;AAC1C,IAAA,OAAO,EAAE,kBAAA,EAAoB,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACxD;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU,kBAAA,CAAmB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,SAAS,CAAC,CAAA;AAAA,EAC3F;AACA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,IAAI,KAAA,YAAiB,IAAA,IAAQ,KAAA,YAAiB,GAAA,IAAO,KAAA,YAAiB,GAAA,IAAO,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,IAAK,KAAA,YAAiB,WAAA,EAAa;AACtI,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,UAAU,+CAA+C,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,MAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC1E,MAAA,GAAA,CAAI,GAAG,IAAI,kBAAA,CAAmB,IAAA,EAAM,GAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,YAAY,KAAK,CAAA;AAC1B;AAEA,SAAS,gBAAgB,MAAA,EAQE;AACzB,EAAA,MAAM,aAAA,GAAgB,2BAAA;AACtB,EAAA,MAAM,UAAA,GAAa,wBAAA;AACnB,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,WAAA,EAAa,MAAA,CAAO,QAAA,EAAU,CAAA,EAAA,EAAK,aAAa,CAAA,CAAE,CAAA;AACrH,EAAA,MAAM,OAAA,GAA0C;AAAA,IAC9C,CAAC,WAAW,GAAG,EAAE,IAAI,eAAA,CAAgB,aAAA,EAAe,UAAU,CAAA,EAAE;AAAA,IAChE,CAAC,aAAa,GAAG,EAAE,EAAA,EAAI,oBAAmB,EAAE;AAAA,IAC5C,CAAC,UAAU,GAAG;AAAA,GAChB;AACA,EAAA,KAAA,MAAW,CAAC,WAAW,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AAChE,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI;AAAA,MACnB,GAAG,eAAA;AAAA,QACD,MAAA;AAAA,QACA,OAAO,QAAA,CAAS,WAAA;AAAA,QAChB,SAAA;AAAA,QACA,uBAAA,CAAwB,WAAW,aAAa;AAAA;AAClD,KACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAC,WAAW,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AAC/E,IAAA,OAAA,CAAQ,SAAS,IAAI,EAAE,EAAA,EAAI,OAAO,EAAA,CAAG,UAAA,CAAW,0BAAA,EAA4B,aAAa,CAAA,EAAE;AAAA,EAC7F;AAEA,EAAA,OAAO;AAAA,IACL,mBAAmB,MAAA,CAAO,iBAAA;AAAA,IAC1B,UAAA,EAAY,WAAA;AAAA,IACZ,OAAA;AAAA,IACA,GAAA,EAAK;AAAA,MACH,uBAAuB,MAAA,CAAO;AAAA,KAChC;AAAA,IACA,cAAA,EAAgB;AAAA,GAClB;AACF;AAEA,SAAS,qBAAqB,UAAA,EAAmE;AAC/F,EAAA,MAAM,OAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,CAAC,YAAY,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AACrE,IAAA,MAAM,EAAA,GAAK,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,MAAA,CAAO,EAAA;AACxD,IAAA,MAAM,QAAA,GAAW,2BAA2B,EAAE,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,IAAA,CAAK,UAAU,CAAA,GAAI,QAAA;AACnB,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA,GAAI,QAAA;AACxC,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA;AAC1B,IAAA,IAAA,CAAK,SAAS,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,GAAI,QAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,2BAA2B,EAAA,EAAkC;AACpE,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,qCAAqC,CAAA;AAC5D,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AACpC,IAAA,IAAI,OAAO,QAAA,CAAS,QAAA,KAAa,YAAY,OAAO,QAAA,CAAS,eAAe,QAAA,EAAU;AACpF,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAIA,SAAS,eAAA,CAAgB,eAAuB,UAAA,EAA4B;AAC1E,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,yCAAA,EAekC,UAAU,CAAA;AAAA,8EAAA,EAC2B,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2GAAA,EAuBgB,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAc1H;AAEA,SAAS,kBAAA,GAA6B;AACpC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;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;AAmOT;AAEA,SAAS,eAAA,CACP,MAAA,EACA,WAAA,EACA,QAAA,EACA,gBAAA,EACgB;AAChB,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,WAAW,CAAA;AACzC,EAAA,MAAM,mBAAA,GAAsB,yBAAyB,MAAM,CAAA;AAC3D,EAAA,MAAM,eAAe,WAAA,CAClB,MAAA;AAAA,IACC,CAAC,IAAA,KACC,iBAAA,CAAkB,IAAI,CAAA,IACtB,IAAA,KAAS,YAAA,IACT,IAAA,KAAS,UAAA,IACT,IAAA,KAAS,eAAA,IACT,IAAA,KAAS;AAAA,GACb,CACC,GAAA,CAAI,CAAC,IAAA,KAAS,SAAS,IAAI,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA,CACrE,KAAK,IAAI,CAAA;AACZ,EAAA,MAAM,qBAAA,GAAwB,4BAAA,CAC3B,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,IAAK,CAAC,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAA,IAAK,iBAAA,CAAkB,IAAI,CAAC,CAAA,CACtG,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,MAAA,EAAS,IAAI,CAAA,aAAA,CAAe,CAAA,CAC1C,IAAA,CAAK,IAAI,CAAA;AACZ,EAAA,MAAM,UAAA,GAAa,WAAW,QAAQ,CAAA,CAAA;AACtC,EAAA,MAAM,kBAAkB,MAAA,CAAO,OAAA,CAAQ,0BAA0B,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AAC3F,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,CAAA,oEAAA,EAAuE,IAAA,CAAK,SAAA,CAAU,gBAAgB,CAAC,CAAA,CAAA,CAAA;AAAA,IACvG,2CAAA;AAAA,IACA,qCAAA;AAAA,IACA,0CAAA;AAAA,IACA,8CAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,WAAW,MAAM,CAAA;AACpC,EAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,YAAY,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,GAAG,MAAM;AAAA,EACf,eAAe;AAAA,0BAAA,EACW,QAAQ;AAAA,sBAAA,EACZ,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC;AAAA;AAAA,GAEnD;AACF;AAEA,SAAS,iBAAA,CACP,SAAA,EACA,SAAA,EACA,aAAA,EACQ;AACR,EAAA,IAAI,SAAA,KAAc,WAAW,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA,EAAG;AACvF,IAAA,OAAO,uBAAuB,aAAa,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,+BAAA,EAAkC,aAAa,CAAA,EAAA,CAAI,CAAA;AAClE,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,iBAAA,CAAkB,GAAG,CAAA,EAAG;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,GAAG,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,IACvG;AAAA,EACF;AACA,EAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA,EAAG;AAC9D,IAAA,KAAA,CAAM,KAAK,CAAA,2BAAA,EAA8B,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,aAAA,CAAe,CAAA;AAAA,EACnF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,uBAAuB,aAAA,EAA+B;AAC7D,EAAA,OAAO;AAAA,+BAAA,EACwB,aAAa,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;;AAAA;AAAA;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;AA8G9C;AAEA,SAAS,yBAAyB,MAAA,EAA6B;AAC7D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,aAAA,GAAgB,2DAAA;AACtB,EAAA,IAAI,KAAA;AACJ,EAAA,OAAQ,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA,EAAI;AAC3C,IAAA,uBAAA,CAAwB,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,IAAQ,KAAK,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,kBAAA,GAAqB,0DAAA;AAC3B,EAAA,OAAQ,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,EAAI;AAChD,IAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACpB;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,uBAAA,CAAwB,QAAgB,KAAA,EAA0B;AACzE,EAAA,MAAM,aAAa,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AACvD,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,KAAA,CAAM,gCAAgC,CAAA;AACxE,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,KAAA,CAAM,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,CAAA;AAC3B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,UAAU,EAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,IAAA,EAAK;AAC3E,IAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG,KAAA,CAAM,IAAI,WAAW,CAAA;AAAA,EAC3D,CAAA,MAAA,IAAW,eAAe,CAAA,EAAG;AAC3B,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,KAAA,CAAM,qBAAqB,CAAA;AAC3D,IAAA,IAAI,YAAA,EAAc,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,aAAa,CAAA;AACjD,EAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,EAAA,KAAA,MAAW,QAAQ,UAAA,CAAW,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,EAAG;AAC3C,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,EAAK,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,aAAa,CAAC,CAAA,IAAK,KAAK,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AACxD,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG,KAAA,CAAM,IAAI,SAAS,CAAA;AAAA,EACvD;AACF;AAEA,SAAS,8BAA8B,cAAA,EAAmE;AACxG,EAAA,MAAM,MAAO,cAAA,CAAsE,GAAA;AACnF,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,EAAS,mBAAA;AAC9B,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAI,CAAA;AAC9B;AAEA,SAAS,uBAAuB,IAAA,EAA0D;AACxF,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAqC,CAAA,GAAI,IAAA,KAAoB;AAC5E,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,mBAAA,CAAoB,IAAI,CAAA,EAAG,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,CAAA;AAAA,EAC7E,CAAA;AACA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAQ,KAAK,CAAA;AAAA,IAClB,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,IACpB,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,IACpB,KAAA,EAAO,QAAQ,OAAO,CAAA;AAAA,IACtB,KAAA,EAAO,QAAQ,OAAO;AAAA,GACxB;AACF;AAEA,SAAS,gBAAA,CACP,MAAA,EACA,OAAA,EACA,IAAA,EACA,SAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,YAAA;AAAA,IACR,OAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS;AAAA;AACX,GACF;AACF;AAEA,SAAS,YAAY,KAAA,EAA8B;AACjD,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,EAAE,oBAAoB,WAAA,EAAY;AAAA,EAC3C;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,IAAc,OAAO,UAAU,QAAA,EAAU;AAC5D,IAAA,MAAM,IAAI,UAAU,+CAA+C,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,kBAAA,EAAoB,QAAA,EAAU,KAAA,EAAO,KAAA,CAAM,UAAS,EAAE;AAAA,EACjE;AACA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,EAAE,kBAAA,EAAoB,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,aAAY,EAAE;AAAA,EAClE;AACA,EAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,KAAA;AAAA,MACpB,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA,KAAM,CAAC,WAAA,CAAY,GAAG,GAAG,WAAA,CAAY,IAAI,CAAC,CAAC;AAAA,KACjG;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,KAAA;AAAA,MACpB,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,WAAA,CAAY,IAAI,CAAC;AAAA,KACpE;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,aAAA;AAAA,MACpB,IAAA,EAAM,aAAA,CAAc,IAAI,UAAA,CAAW,KAAK,CAAC;AAAA,KAC3C;AAAA,EACF;AACA,EAAA,IAAI,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAAG;AAC7B,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,YAAA;AAAA,MACpB,IAAA,EAAM,MAAM,WAAA,CAAY,IAAA;AAAA,MACxB,IAAA,EAAM,aAAA,CAAc,IAAI,UAAA,CAAW,KAAA,CAAM,QAAQ,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,UAAU,CAAC;AAAA,KACtF;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,UAAU,+CAA+C,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,MAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC1E,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,WAAA,CAAY,IAAI,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,EAAE,kBAAA,EAAoB,QAAA,EAAU,SAAS,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAE;AAAA,EACtE;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAA8B;AACjD,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,IAAA,MAAM,SAAU,KAAA,CAA0C,kBAAA;AAC1D,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,WAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,MAAA,CAAQ,MAA4B,KAAK,CAAA;AAAA,MAClD,KAAK,MAAA;AACH,QAAA,OAAO,IAAI,IAAA,CAAM,KAAA,CAA4B,KAAK,CAAA;AAAA,MACpD,KAAK,KAAA;AACH,QAAA,OAAO,IAAI,GAAA;AAAA,UAAA,CACP,KAAA,CAAsD,WAAW,EAAC,EAAG,IAAI,CAAC,CAAC,GAAA,EAAK,IAAI,CAAA,KAAM;AAAA,YAC1F,YAAY,GAAG,CAAA;AAAA,YACf,YAAY,IAAI;AAAA,WACjB;AAAA,SACH;AAAA,MACF,KAAK,KAAA;AACH,QAAA,OAAO,IAAI,GAAA,CAAA,CAAM,KAAA,CAAqC,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,KAAS,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,MACtG,KAAK,aAAA;AACH,QAAA,OAAO,aAAA,CAAe,KAAA,CAA2B,IAAI,CAAA,CAAE,MAAA;AAAA,MACzD,KAAK,YAAA,EAAc;AACjB,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAe,KAAA,CAA2B,IAAI,CAAA;AAC5D,QAAA,MAAM,QAAA,GAAY,MAA4B,IAAA,IAAQ,YAAA;AACtD,QAAA,MAAM,IAAA,GAAQ,UAAA,CAA4D,QAAQ,CAAA,IAAK,UAAA;AACvF,QAAA,OAAO,IAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,MAC9B;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,MAA+B,EAAC;AACtC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAM,KAAA,CAAgD,OAAA,IAAW,EAAC,EAAG;AACxF,UAAA,GAAA,CAAI,GAAG,CAAA,GAAI,WAAA,CAAY,IAAI,CAAA;AAAA,QAC7B;AACA,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,MACA;AACE,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK,KAAA,EAAO,oBAAoB,CAAA,EAAG;AACtE,UAAA,MAAM,MAA+B,EAAC;AACtC,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAqC,CAAA,EAAG;AAC/E,YAAA,GAAA,CAAI,GAAG,CAAA,GAAI,WAAA,CAAY,IAAI,CAAA;AAAA,UAC7B;AACA,UAAA,OAAO,GAAA;AAAA,QACT;AACA,QAAA;AAAA;AACJ,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAA2B;AAChD,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAEA,SAAS,cAAc,IAAA,EAA0B;AAC/C,EAAA,MAAM,MAAA,GAAS,KAAK,IAAI,CAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,MAAM,UAAA,GAAa,qBAAqB,KAAK,CAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,IAAI,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAChD,EAAA,WAAA,CAAY,OAAO,UAAA,CAAW,IAAA;AAC9B,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,qBAAqB,KAAA,EAAoC;AAChE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EACjD;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA;AASd,EAAA,OAAO;AAAA,IACL,MAAM,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,OAAA;AAAA,IACpD,OAAA,EAAS,OAAO,KAAA,CAAM,OAAA,KAAY,WAAW,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,IACzE,KAAA,EAAO,OAAO,KAAA,CAAM,KAAA,KAAU,WAAW,aAAA,CAAc,KAAA,CAAM,KAAK,CAAA,GAAI,MAAA;AAAA,IACtE,IAAA,EAAM,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,KAAA,CAAM,IAAA,GAAO,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,GAAW,KAAA,CAAM,UAAA,GAAa,MAAA;AAAA,IAC9G,MAAA,EACE,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GACtB,KAAA,CAAM,MAAA,GACN,OAAO,KAAA,CAAM,YAAA,KAAiB,QAAA,GAC1B,KAAA,CAAM,YAAA,GACN;AAAA,GACV;AACF;AAEA,SAAS,qBAAA,CACP,OACA,cAAA,EACoB;AACpB,EAAA,MAAM,iBAAA,GAAoB,sBAAsB,KAAK,CAAA;AACrD,EAAA,IAAI,CAAC,mBAAmB,OAAO,KAAA;AAE/B,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,iBAAA,CAAkB,UAAU,CAAA,IAC3D,cAAA,CAAe,iBAAA,CAAkB,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA;AAClE,EAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,GAAO,SAAA,CAAU,UAAA;AACtD,EAAA,IAAI,UAAA,GAAa,GAAG,OAAO,KAAA;AAE3B,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,SAAA,CAAU,QAAQ,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,UAAU,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA;AAClD,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,OAAA,EAAS,mBAAA,CAAoB,KAAA,CAAM,OAAA,EAAS,QAAQ,CAAA;AAAA,IACpD,KAAA,EAAO,MAAM,KAAA,GAAQ,qBAAA,CAAsB,MAAM,KAAA,EAAO,cAAc,IAAI,KAAA,CAAM,KAAA;AAAA,IAChF,IAAA,EAAM,UAAA;AAAA,IACN,QAAQ,iBAAA,CAAkB,MAAA;AAAA,IAC1B;AAAA,GACF;AACF;AAEA,SAAS,sBAAsB,KAAA,EAItB;AACP,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACnE,EAAA,MAAM,OAAA,GAAU,8DAAA;AAChB,EAAA,IAAI,KAAA;AACJ,EAAA,OAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAI;AACnC,IAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,IAAA,IAAI,WAAW,QAAA,CAAS,qBAAqB,KAAK,UAAA,CAAW,QAAA,CAAS,wBAAwB,CAAA,EAAG;AAC/F,MAAA;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACrB,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC;AAAA,KACzB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,mBAAA,CAAoB,SAAiB,QAAA,EAA0B;AACtE,EAAA,MAAM,iBAAiB,OAAA,CAAQ,OAAA,CAAQ,4CAAA,EAA8C,EAAE,EAAE,IAAA,EAAK;AAC9F,EAAA,IAAI,cAAA,CAAe,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,cAAA;AAChD,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,cAAA,IAAkB,OAAO,CAAA,CAAA;AAClD;AAEA,SAAS,qBAAA,CACP,OACA,cAAA,EACQ;AACR,EAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACX,mDAAA;AAAA,IACA,CAAC,KAAA,EAAO,UAAA,EAAoB,IAAA,EAAc,MAAA,KAAmB;AAC3D,MAAA,MAAM,SAAA,GAAY,eAAe,UAAU,CAAA,IAAK,eAAe,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA;AAC9F,MAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAI,CAAA,GAAI,SAAA,CAAU,UAAA;AAC5C,MAAA,IAAI,UAAA,GAAa,GAAG,OAAO,KAAA;AAC3B,MAAA,OAAO,CAAA,EAAG,gBAAgB,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA,EAAI,UAAU,IAAI,MAAM,CAAA,CAAA;AAAA,IACvE;AAAA,GACF;AACF;AAEA,SAAS,gBAAgB,QAAA,EAA0B;AACjD,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACnC;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,EAAE,MAAA,GAAS,CAAA;AAC5C;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,OAAO,MACJ,KAAA,CAAM,IAAI,EACV,MAAA,CAAO,CAAC,SAAS,CAAC,IAAA,CAAK,SAAS,qBAAqB,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,wBAAwB,CAAC,CAAA,CAClG,KAAK,IAAI,CAAA;AACd;AAEA,SAAS,kBAAkB,KAAA,EAAoC;AAC7D,EAAA,OACE,MAAM,IAAA,KAAS,aAAA,IACf,KAAA,CAAM,IAAA,KAAS,8BACf,oHAAA,CAAqH,IAAA;AAAA,IACnH,KAAA,CAAM;AAAA,GACR;AAEJ;AAEA,SAAS,cAAc,KAAA,EAAoC;AACzD,EAAA,OAAO,yBAAA,CAA0B,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACrD;AAEA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,OACE,CAAC,CAAC,KAAA,IACF,OAAO,UAAU,QAAA,KACd,KAAA,CAA6B,IAAA,KAAS,YAAA,IACvC,iBAAiB,IAAA,CAAK,MAAA,CAAQ,KAAA,CAAgC,OAAA,IAAW,EAAE,CAAC,CAAA,CAAA;AAElF;AAEA,SAAS,YAAA,CAAa,QAAmB,QAAA,EAA2B;AAClE,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAAA,EACF;AACF;AAEA,SAAS,SAAA,CAAU,QAA4B,QAAA,EAAoC;AACjF,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,OAAA,EAAsD;AACpF,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,UAAA,CAAW,KAAA,CAAM,OAAO,MAAM,CAAA;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,UAAA,CAAW,MAAA;AACpB;AAEA,SAAS,oBAAuB,KAAA,EAAa;AAC3C,EAAA,IAAI;AACF,IAAA,OAAO,gBAAgB,KAAK,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACzC;AACF;AAEA,SAAS,WAAW,KAAA,EAA+C;AACjE,EAAA,OAAO,CAAC,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,UAAA,CAAA,IAAe,OAAQ,KAAA,CAA6B,IAAA,KAAS,UAAA;AAChI;AAEA,SAAS,cAAc,KAAA,EAAkD;AACvE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AAC7C,EAAA,OAAO,SAAA,KAAc,MAAA,CAAO,SAAA,IAAa,SAAA,KAAc,IAAA;AACzD;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,OAAO,qBAAqB,IAAA,CAAK,KAAK,CAAA,IAAK,KAAA,KAAU,UAAU,KAAA,KAAU,WAAA;AAC3E;AAEA,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,OACE,CAAC,CAAC,KAAA,IACF,CAAC,MAAM,UAAA,CAAW,IAAI,KACtB,CAAC,KAAA,CAAM,WAAW,KAAK,CAAA,IACvB,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IACrB,CAAC,6BAAA,CAA8B,IAAA,CAAK,KAAK,CAAA;AAE7C;AAEA,SAAS,oBAAoB,KAAA,EAAwB;AACnD,EAAA,OAAO,MAAM,UAAA,CAAW,IAAI,CAAA,IAAK,KAAA,CAAM,WAAW,KAAK,CAAA;AACzD;AAEA,SAAS,iCAAiC,SAAA,EAA2B;AACnE,EAAA,OAAO,UAAU,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC3D;AAEA,SAAS,yBAAyB,QAAA,EAA0B;AAC1D,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,oBAAoB,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAC1E,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,0BAAA,CAA2B,IAAI,CAAA,EAAA,EAAK,QAAA,CAAS,QAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEA,SAAS,0BAAA,CAA2B,UAAkB,SAAA,EAA2B;AAC/E,EAAA,MAAM,KAAA,GAAQ,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GAAI,EAAC;AAChE,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,EAAG;AAC3D,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,GAAA,EAAK;AAC3B,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oDAAA,EAAuD,SAAS,CAAA,CAAE,CAAA;AAAA,MACpF;AACA,MAAA,KAAA,CAAM,GAAA,EAAI;AACV,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACjC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6DAAA,EAAgE,SAAS,CAAA,CAAE,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAClC,EAAA,OAAO,SAAS,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA;AAC9C;AAEA,SAAS,mBAAmB,IAAA,EAAuB;AACjD,EAAA,OAAO,iBAAA,CAAkB,KAAK,IAAI,CAAA;AACpC;AAEA,SAAS,2BAAA,CACP,QAAA,EACA,SAAA,EACA,WAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,0BAAA,CAA2B,iBAAA,CAAkB,QAAQ,GAAG,SAAS,CAAA;AAC9E,EAAA,MAAM,aAAa,kBAAA,CAAmB,IAAI,CAAA,GACtC,CAAC,IAAI,CAAA,GACL;AAAA,IACE,IAAA;AAAA,IACA,GAAG,IAAI,CAAA,GAAA,CAAA;AAAA,IACP,GAAG,IAAI,CAAA,IAAA,CAAA;AAAA,IACP,GAAG,IAAI,CAAA,GAAA,CAAA;AAAA,IACP,GAAG,IAAI,CAAA,IAAA,CAAA;AAAA,IACP,GAAG,IAAI,CAAA,KAAA,CAAA;AAAA,IACP,GAAG,IAAI,CAAA,SAAA,CAAA;AAAA,IACP,GAAG,IAAI,CAAA,UAAA,CAAA;AAAA,IACP,GAAG,IAAI,CAAA,SAAA;AAAA,GACT;AACJ,EAAA,OAAO,UAAA,CAAW,KAAK,CAAC,SAAA,KAAc,YAAY,GAAA,CAAI,SAAS,CAAC,CAAA,IAAK,IAAA;AACvE;AAEA,SAAS,8BAAA,CACP,MAAA,EACA,eAAA,EACA,YAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,CAAC,SAAA,KAAsB;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,2BAAA,CAA4B,eAAA,EAAiB,SAAA,EAAW,WAAW,CAAA;AACtF,MAAA,OAAO,UAAA,GAAa,uBAAA,CAAwB,YAAA,EAAc,UAAU,CAAA,GAAI,SAAA;AAAA,IAC1E,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,MAAA,CACJ,OAAA;AAAA,IACC,4EAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,MAAA,KAAW,CAAA,EAAG,MAAM,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAC,CAAA,EAAG,MAAM,CAAA;AAAA,GAChF,CACC,OAAA;AAAA,IACC,qDAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,MAAA,KAAW,CAAA,EAAG,MAAM,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAC,CAAA,EAAG,MAAM,CAAA;AAAA,GAChF;AACJ;AAEA,SAAS,uBAAA,CAAwB,gBAAwB,gBAAA,EAAkC;AACzF,EAAA,MAAM,SAAA,GAAY,cAAA,GAAiB,cAAA,CAAe,KAAA,CAAM,GAAG,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,EAAC;AAC7E,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA;AAC9C,EAAA,OAAO,SAAA,CAAU,UAAU,WAAA,CAAY,MAAA,IAAU,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAC,CAAA,EAAG;AAChF,IAAA,SAAA,CAAU,KAAA,EAAM;AAChB,IAAA,WAAA,CAAY,KAAA,EAAM;AAAA,EACpB;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,SAAA,CAAU,IAAI,MAAM,IAAI,CAAA,EAAG,GAAG,WAAW,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAChC,EAAA,OAAO,UAAU,UAAA,CAAW,GAAG,CAAA,GAAI,SAAA,GAAY,KAAK,SAAS,CAAA,CAAA;AAC/D;AAEA,SAAS,eAAe,MAAA,EAOb;AACT,EAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAAA,IACzB,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,CAC1C,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA,CACrC,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,SAAS,CAAA,KAAM;AAAA,MAC/B,SAAA;AAAA,MACA,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA;AAAK,KAC7B;AAAA,GACL;AACA,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU;AAAA,IAC/B,cAAA,EAAgB,8BAAA;AAAA,IAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,OAAA,EAAS,OAAO,WAAA,CAAY,MAAA,CAAO,QAAQ,MAAA,CAAO,OAAO,EAAE,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,EAAE,aAAA,CAAc,CAAC,CAAC,CAAC,CAAA;AAAA,IACjG,WAAA;AAAA,IACA,aAAa,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,KAAA,GAAQ,IAAA,EAAK;AAAA,IACtD,mBAAmB,MAAA,CAAO,iBAAA;AAAA,IAC1B,gBAAA,EAAkB,OAAO,gBAAA,IAAoB;AAAA,GAC9C,CAAA;AACD,EAAA,OAAO,CAAA,sBAAA,EAAyB,UAAA,CAAW,SAAS,CAAC,CAAA,CAAA;AACvD;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,IAAA,GAAO,UAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAA,IAAQ,KAAA,CAAM,WAAW,CAAC,CAAA;AAC1B,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAU,CAAA;AAAA,EACnC;AACA,EAAA,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA;AACjC;AAEA,SAAS,qBAAqB,MAAA,EAAwB;AACpD,EAAA,IAAI,MAAA,GAAS,MAAA;AAEb,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,mCAAA,EAAqC,EAAE,CAAA;AAC/D,EAAA,MAAA,GAAS,gBAAA,CAAiB,QAAQ,WAAW,CAAA;AAC7C,EAAA,MAAA,GAAS,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AAExC,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAC9C,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,mCAAA,EAAqC,EAAE,CAAA;AAC/D,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,0CAAA,EAA4C,EAAE,CAAA;AAEtE,EAAA,MAAA,GAAS,8BAA8B,MAAM,CAAA;AAC7C,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,gFAAA,EAAkF,IAAI,CAAA;AAC9G,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,uCAAA,EAAyC,IAAI,CAAA;AACrE,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,8BAAA,EAAgC,EAAE,CAAA;AAE1D,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,8BAA8B,MAAA,EAAwB;AAC7D,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,OAAO,MAAA,GAAS,OAAO,MAAA,EAAQ;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACvC,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAA,IAAU,MAAA,CAAO,MAAM,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,MAAA,EAAQ,IAAI,CAAA;AAC5C,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,IAAU,MAAA,CAAO,MAAM,MAAM,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,CAAC,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,GAAG,KAAK,CAAA;AAC3C,IAAA,MAAA,IAAU,sBAAsB,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAA,GAC/C,uBAAA,CAAwB,MAAM,CAAA,GAC9B,MAAA;AACJ,IAAA,MAAA,GAAS,KAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,MAAA,EAAgB,IAAA,EAAc,KAAA,EAAwB;AACnF,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,GAAO,GAAG,CAAA,EAAG,IAAI,CAAA;AACzD,EAAA,IAAI,wCAAA,CAAyC,IAAA,CAAK,MAAM,CAAA,EAAG;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,QAAQ,EAAE,CAAA;AAChD,EAAA,OAAO,QAAA,CAAS,KAAK,KAAK,CAAA;AAC5B;AAEA,SAAS,wBAAwB,MAAA,EAAwB;AACvD,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,MAAA,EAAQ,GAAG,CAAA;AAC1C,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,yBAAyB,CAAA,CAAE,KAAK,GAAG,CAAA;AACzD;AAEA,SAAS,0BAA0B,OAAA,EAAyB;AAC1D,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,OAAA,EAAS,GAAG,CAAA;AAC5C,EAAA,MAAMS,QAAO,MAAA,IAAU,CAAA,GAAI,QAAQ,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,GAAI,OAAA;AACtD,EAAA,MAAMC,QAAO,MAAA,IAAU,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,GAAI,EAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiBD,KAAAA,EAAM,GAAG,CAAA;AACxC,EAAA,MAAM,cAAc,KAAA,IAAS,CAAA,GAAIA,MAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAIA,KAAAA;AACxD,EAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,uCAAA,EAAyC,MAAM,CAAA,GAAIC,KAAAA;AAChF;AAEA,SAAS,gBAAA,CAAiB,QAAgB,MAAA,EAAwB;AAChE,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,EAAA,EAAS;AAClD,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,CAAA,MAAA,IAAW,SAAS,IAAA,EAAM;AACxB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,EAAK;AAChD,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,GAAA,EAAK,UAAA,EAAA;AAAA,SAAA,IACT,SAAS,GAAA,EAAK,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,aAAa,CAAC,CAAA;AAAA,SAAA,IACrD,SAAS,GAAA,EAAK,YAAA,EAAA;AAAA,SAAA,IACd,SAAS,GAAA,EAAK,YAAA,GAAe,KAAK,GAAA,CAAI,CAAA,EAAG,eAAe,CAAC,CAAA;AAAA,SAAA,IACzD,SAAS,GAAA,EAAK,UAAA,EAAA;AAAA,SAAA,IACd,SAAS,GAAA,EAAK,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,aAAa,CAAC,CAAA;AAAA,SAAA,IACrD,SAAS,MAAA,IAAU,UAAA,KAAe,KAAK,YAAA,KAAiB,CAAA,IAAK,eAAe,CAAA,EAAG;AACtF,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,aAAA,CAAc,QAAgB,SAAA,EAA6B;AAClE,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,EAAA,EAAS;AAClD,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,CAAA,MAAA,IAAW,SAAS,IAAA,EAAM;AACxB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,EAAK;AAChD,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,GAAA,EAAK,UAAA,EAAA;AAAA,SAAA,IACT,SAAS,GAAA,EAAK,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,aAAa,CAAC,CAAA;AAAA,SAAA,IACrD,SAAS,GAAA,EAAK,YAAA,EAAA;AAAA,SAAA,IACd,SAAS,GAAA,EAAK,YAAA,GAAe,KAAK,GAAA,CAAI,CAAA,EAAG,eAAe,CAAC,CAAA;AAAA,SAAA,IACzD,SAAS,GAAA,EAAK,UAAA,EAAA;AAAA,SAAA,IACd,SAAS,GAAA,EAAK,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,aAAa,CAAC,CAAA;AAAA,SAAA,IACrD,SAAS,SAAA,IAAa,UAAA,KAAe,KAAK,YAAA,KAAiB,CAAA,IAAK,eAAe,CAAA,EAAG;AACzF,MAAA,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,KAAK,CAAC,CAAA;AACxC,MAAA,KAAA,GAAQ,KAAA,GAAQ,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AACjC,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,QAAgB,IAAA,EAAsB;AAC/D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,IAAS,KAAA,GAAQ,IAAA,EAAM,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,EAAA,EAAS;AACrD,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,CAAA,MAAA,IAAW,SAAS,IAAA,EAAM;AACxB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,EAAK;AAChD,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,GAAA,EAAK,KAAA,EAAA;AAClB,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,KAAA,KAAU,GAAG,OAAO,KAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,QAAgB,OAAA,EAAuC;AAC/E,EAAA,MAAM,UAAU,IAAI,MAAA,CAAO,CAAA,wBAAA,EAA2B,OAAO,yBAAyB,GAAG,CAAA;AACzF,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,KAAA;AAEJ,EAAA,OAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAI;AACrC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,CAAC,IAAI,CAAA,GAAI,CAAA,CAAA;AAC5C,IAAA,MAAA,IAAU,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA;AAEpC,IAAA,IAAI,QAAQ,OAAA,CAAQ,SAAA;AACpB,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAC3C,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAC1C,MAAA,MAAMC,IAAAA,GAAM,aAAa,CAAA,GAAI,SAAA,GAAY,IAAI,OAAA,IAAW,CAAA,GAAI,UAAU,MAAA,CAAO,MAAA;AAC7E,MAAA,MAAA,GAASA,IAAAA;AACT,MAAA,OAAA,CAAQ,SAAA,GAAYA,IAAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AACvC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,GAAS,KAAA;AACT,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,GAAA,GAAM,KAAA;AACV,IAAA,OAAO,GAAA,GAAM,MAAA,CAAO,MAAA,EAAQ,GAAA,EAAA,EAAO;AACjC,MAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AACzB,MAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,GAAA,EAAK,KAAA,EAAA;AACzB,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,GAAA,EAAA;AACA,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAA,GAAS,GAAA;AACT,IAAA,OAAA,CAAQ,SAAA,GAAY,GAAA;AAAA,EACtB;AAEA,EAAA,MAAA,IAAU,MAAA,CAAO,MAAM,MAAM,CAAA;AAC7B,EAAA,OAAO,MAAA;AACT;AA/nEA,IASM,qBAAA,EACA,aACA,mBAAA,EACA,gBAAA,EACA,4BACA,8BAAA,EACA,4BAAA,EA6BA,aA4GF,yBAAA,EA+vBE,0BAAA;AAv5BN,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AASA,IAAM,qBAAA,GAAwB,2BAAA;AAC9B,IAAM,WAAA,GAAc,wBAAA;AACpB,IAAM,mBAAA,GAAsB,0BAAA;AAC5B,IAAM,gBAAA,GAAmB,WAAA;AACzB,IAAM,0BAAA,GAA6B,YAAA;AACnC,IAAM,8BAAA,GAAiC,+BAAA;AACvC,IAAM,4BAAA,GAA+B;AAAA,MACnC,SAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,MAC1B,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,kBAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAmGD,IAAI,yBAAA,GAAqE,IAAA;AA+vBzE,IAAM,0BAAA,GAA6B,iCAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACv5BnC,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAoFA,SAAS,6BAA6B,cAAA,EAAyC;AAC7E,EAAA,MAAM,SAAA,GAAY,cAAA;AAClB,EAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,GAAA,IAAO,SAAA,CAAU,GAAG,CAAA;AAC/C;AAEA,SAASC,eAAc,KAAA,EAAkD;AACvE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AAC7C,EAAA,OAAO,SAAA,KAAc,MAAA,CAAO,SAAA,IAAa,SAAA,KAAc,IAAA;AACzD;AAEA,SAAS,yBAAyB,KAAA,EAAgB,IAAA,EAAc,IAAA,mBAAO,IAAI,SAAgB,EAAkB;AAC3G,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,IAAc,OAAO,UAAU,QAAA,EAAU;AAC5D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,iBAAiB,IAAA,IAAQ,KAAA,YAAiB,eAAe,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAAG;AACtF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AAC3C,MAAA,MAAM,KAAA,GAAQ,yBAAyB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,IAAI,CAAA;AACrE,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AACzC,MAAA,MAAM,QAAA,GAAW,yBAAyB,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,KAAK,IAAI,IAAI,CAAA;AAC7E,MAAA,IAAI,UAAU,OAAO,QAAA;AACrB,MAAA,MAAM,UAAA,GAAa,yBAAyB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,SAAA,EAAY,KAAK,IAAI,IAAI,CAAA;AAClF,MAAA,IAAI,YAAY,OAAO,UAAA;AACvB,MAAA,KAAA,IAAS,CAAA;AAAA,IACX;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,MAAA,EAAO,EAAG;AACjC,MAAA,MAAM,KAAA,GAAQ,yBAAyB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,SAAA,EAAY,KAAK,IAAI,IAAI,CAAA;AAC7E,MAAA,IAAI,OAAO,OAAO,KAAA;AAClB,MAAA,KAAA,IAAS,CAAA;AAAA,IACX;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAACA,cAAAA,CAAc,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,MAAM,KAAA,GAAQ,yBAAyB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,IAAI,IAAI,CAAA;AACnE,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,yBAAA,CACP,OAAA,EACA,OAAA,GAAqB,IACrB,WAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,iBAAA,GAAoE,IAAA;AACxE,EAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAA6B,CAAC,OAAA,KAAY;AAChE,IAAA,iBAAA,GAAoB,OAAA;AAAA,EACtB,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,IAAW,WAAW,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM;AACnE,IAAA,OAAA,GAAU,KAAA;AAAA,EACZ,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAAA,IAC/B,UAAU,MAAA,EAAuB;AAC/B,MAAA,IAAI,CAAC,WAAW,UAAA,EAAY;AAC5B,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,WAAA,IAAc;AACd,MAAA,iBAAA,GAAoB;AAAA,QAClB,MAAA,EAAQ,YAAA;AAAA,QACR,OAAA;AAAA,QACA,MAAM,EAAC;AAAA,QACP,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,yBAAA;AAAA,UACN,SAAS,MAAA,IAAU;AAAA;AACrB,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,IAAI,OAAA,GAAU;AACZ,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,IAAI,OAAA,GAAU;AACZ,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GACF;AACF;AAEA,SAASC,sBAAqB,MAAA,EAA4C;AACxE,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AACnC,EAAA,OAAO,yBAAA,CAA0B,YAAY,MAAA,EAAQ,OAAO,CAAA;AAC9D;AAEA,SAAS,mBAAA,CACP,cAAA,EACA,QAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,WAAA,GAAc,wBAAA;AAAA,IAClB;AAAA,MACE,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,kBAAkB,OAAA,EAAS,gBAAA;AAAA,MAC3B,UAAU,OAAA,EAAS;AAAA,KACrB;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAOA,qBAAAA,CAAqB;AAAA,MAC1B,MAAA,EAAQ,YAAA;AAAA,MACR,SAAS,EAAC;AAAA,MACV,MAAM,EAAC;AAAA,MACP,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EAAS,6FAA6F,WAAW,CAAA,4EAAA;AAAA;AACnH,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,SAAS,OAAA,EAAS,MAAA;AACxB,EAAA,MAAM,aAAA,GAAgB,OAAA,GAAU,EAAE,GAAG,SAAQ,GAAI,MAAA;AACjD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,aAAA,CAAc,MAAA;AAAA,EACvB;AACA,EAAA,MAAM,UAAqB,EAAC;AAC5B,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,OAAO,0BAA0B,YAAY;AAC3C,IAAA,IAAI,OAAO,cAAA,CAAe,yBAAA,KAA8B,UAAA,EAAY;AAClE,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,OAAA;AAAA,QACA,MAAM,EAAC;AAAA,QACP,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,8BAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,yBAAA;AAAA,QAClC,QAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAO,MAAA,KAAW;AAAA,OACpB;AACA,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,OAAA,CAAQ,MAAA,EAAQ,GAAI,MAAA,CAAO,OAAA,IAAW,EAAG,CAAA;AAC3D,QAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,UAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,OAAA;AAAA,QACA,MAAM,EAAC;AAAA,QACP,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,0BAAA;AAAA,UAC5C,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE,OACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG,SAAS,MAAM;AAChB,IAAA,UAAA,GAAa,IAAA;AAAA,EACf,CAAC,CAAA;AACH;AAtRA,IA+Ra,eAAA,EA08BP,kBAAA;AAzuCN,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAiDA,IAAA,cAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AA6OO,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAuC;AAAA,MAC1C,UAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA,GAA6C,IAAA;AAAA,MAC7C,iBAA0C,EAAC;AAAA,MAC3C,gBAAA,GAAkC,IAAA;AAAA,MAE1C,YACE,SAAA,EACA,cAAA,EACA,QAAA,EACA,cAAA,GAA4C,EAAC,EAC7C;AACA,QAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAClB,QAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AACvB,QAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,QAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AACvB,QAAA,IAAA,CAAK,gBAAA,GAAmB,SAAS,UAAA,IAAc,IAAA;AAG/C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,kBAAA,CAAmB,SAAS,CAAA;AAAA,QACzD;AAGA,QAAA,IAAI,OAAO,IAAA,CAAK,eAAA,CAAgB,mBAAA,KAAwB,UAAA,EAAY;AAClE,UAAA,IAAA,CAAK,eAAA,CACF,oBAAoB,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA,CACrC,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,YAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AAAA,UACxB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,UAEb,CAAC,CAAA;AAAA,QACL;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,QAAA,GAAmB;AACrB,QAAA,OAAO,KAAK,SAAA,CAAU,EAAA;AAAA,MACxB;AAAA,MAEA,IAAI,OAAA,GAAkB;AACpB,QAAA,OAAO,KAAK,SAAA,CAAU,QAAA;AAAA,MACxB;AAAA,MAEA,IAAI,MAAA,GAAwB;AAC1B,QAAA,OAAO,KAAK,SAAA,CAAU,OAAA;AAAA,MACxB;AAAA,MAEA,IAAI,SAAA,GAAoB;AACtB,QAAA,OAAO,KAAK,SAAA,CAAU,UAAA;AAAA,MACxB;AAAA,MAEA,IAAI,QAAA,GAAoC;AACtC,QAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACd;AAAA,MAEA,IAAI,UAAA,GAA4B;AAC9B,QAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAI,WAAA,GAA4B;AAC9B,QAAA,OAAO,IAAA,CAAK,YAAY,WAAA,IAAe,IAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,IAAI,0BAAA,GAAsD;AACxD,QAAA,MAAM,OAAA,GAAmC;AAAA,UACvC,gBAAgB,IAAA,CAAK;AAAA,SACvB;AAEA,QAAA,IAAI,IAAA,CAAK,YAAY,GAAA,EAAK;AACxB,UAAA,OAAA,CAAQ,GAAA,GAAM,KAAK,UAAA,CAAW,GAAA;AAAA,QAChC;AAEA,QAAA,OAAO,OAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,YAAY,OAAA,EAAuD;AACvE,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAA;AAAA,UACxC,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,MAAA;AAAA,UACT,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,aAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAGA,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,KAAK,WAAW,CAAA;AAAA,UAC9C,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,SAAS,MAAA,CAAO;AAAA,SAClB;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,SAAA,EAA4C;AAG3D,QAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,KAAK,eAAA,CAAgB,WAAA;AAAA,UAC9C,MAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AACnD,QAAA,OAAO,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,GAAI,IAAA;AAAA,MACvC;AAAA,MAEA,MAAM,cAAc,KAAA,EAA6C;AAC/D,QAAA,IAAI,OAAA;AACJ,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,0BAAA,CAA2B,KAAK,CAAA;AAE1D,QAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,UAAA,OAAA,GAAU,MAAM,aAAA,CAAkB,IAAA,CAAK,UAAA,EAAY;AAAA,YACjD,MAAM,YAAA,CAAa,IAAA;AAAA,YACnB,SAAS,YAAA,CAAa,OAAA;AAAA,YACtB,QAAQ,YAAA,CAAa,MAAA;AAAA,YACrB,UAAU,YAAA,CAAa;AAAA,WACxB,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,eAAA,CAAgB,kBAAkB,UAAA,EAAY;AACnE,UAAA,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,QAChF,CAAA,MAAO;AACL,UAAA,MAAM,IAAI,MAAM,iFAAiF,CAAA;AAAA,QACnG;AAEA,QAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,MACjC;AAAA,MAEQ,2BAA6E,KAAA,EAAa;AAChG,QAAA,MAAM,eAAA,GAAkB,KAAK,eAAA,CAAgB,eAAA;AAC7C,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,QAAA,EAAU;AAAA,YACR,GAAI,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,YACvB;AAAA;AACF,SACF;AAAA,MACF;AAAA,MAEA,MAAM,aAAA,CAAc,SAAA,EAAmB,OAAA,EAA2C;AAGhF,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AAAA,MAEA,MAAM,cAAc,SAAA,EAAqC;AACvD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,cAAc,SAAS,CAAA;AACjE,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,MAEA,MAAM,aAAa,OAAA,EAA2C;AAC5D,QAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,cAAA,CAAgB,CAAA;AAAA,QACzD;AAEA,QAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,YAAA,EAAc;AACtC,UAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,QACxE;AAEA,QAAA,MAAM,KAAK,eAAA,CAAgB,YAAA;AAAA,UACzB,IAAA,CAAK,QAAA;AAAA,UACL,IAAA,CAAK,2BAA2B,OAAO;AAAA,SACzC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,QAAQ,OAAA,EAA0C;AACtD,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAA;AAAA,UACtC,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,MAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAGA,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,UAC7B,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,IAAA,EAAM,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA,CAAI,IAAA;AAAA,UAChE,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,WAAW,GAAA,CAAI;AAAA,SACjB,CAAE,CAAA;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,UAAuB,IAAA,EAA0B;AACrD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAAA,MAC5C;AAAA,MAEA,MAAM,WAAwB,IAAA,EAA0B;AACtD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA;AAAA,MAC7C;AAAA,MAEA,MAAM,UAAuB,IAAA,EAA0B;AACrD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAAA,MAC5C;AAAA,MAEA,cAAA,GAA2B;AACzB,QAAA,OAAO,IAAA,CAAK,gBAAgB,cAAA,EAAe;AAAA,MAC7C;AAAA,MAEA,aAAA,GAA0B;AACxB,QAAA,OAAO,IAAA,CAAK,gBAAgB,aAAA,EAAc;AAAA,MAC5C;AAAA,MAEA,aAAA,GAA0B;AACxB,QAAA,IAAI,OAAO,IAAA,CAAK,eAAA,CAAgB,aAAA,KAAkB,UAAA,EAAY;AAC5D,UAAA,OAAO,IAAA,CAAK,gBAAgB,aAAA,EAAc;AAAA,QAC5C;AACA,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,MAEA,MAAM,IAAI,YAAA,EAAuC;AAC/C,QAAA,MAAM,YAAA,GAAe,KAAK,oBAAA,EAAqB;AAC/C,QAAA,IAAI,OAAO,YAAA,CAAa,gBAAA,KAAqB,UAAA,EAAY;AACvD,UAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,QACrE;AAEA,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,gBAAA,CAAiB;AAAA,UAChD,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,QAAA,EAAU,YAAA;AAAA,UACV,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ;AAAA,SACtC,CAAA;AAED,QAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,YAAY,CAAA,CAAE,CAAA;AAAA,QACnE;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MAEA,MAAM,QAAQ,YAAA,EAA6C;AACzD,QAAA,MAAM,YAAA,GAAe,KAAK,oBAAA,EAAqB;AAC/C,QAAA,IAAI,OAAO,YAAA,CAAa,oBAAA,KAAyB,UAAA,EAAY;AAC3D,UAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,oBAAA,CAAqB;AAAA,YACpD,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,QAAA,EAAU,YAAA;AAAA,YACV,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ;AAAA,WACtC,CAAA;AACD,UAAA,OAAO,KAAA,KAAU,SAAS,MAAA,GAAS,QAAA;AAAA,QACrC;AAEA,QAAA,MAAM,MAAA,GAAS,OAAO,YAAA,CAAa,SAAA,KAAc,UAAA,GAC7C,MAAM,YAAA,CAAa,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,GAC1C,IAAA;AACJ,QAAA,MAAM,WAAW,MAAA,EAAQ,SAAA;AACzB,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,YAAY,CAAA,KAAM,MAAA,EAAQ;AACjD,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MAEA,MAAM,MAAA,CACJ,YAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,QAAA,MAAM,YAAA,GAAe,KAAK,oBAAA,EAAqB;AAC/C,QAAA,IAAI,OAAO,YAAA,CAAa,YAAA,KAAiB,UAAA,EAAY;AACnD,UAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,QAC3D;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,KAAK,QAAQ,CAAA;AACzD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,QACtD;AAEA,QAAA,MAAM,OAAA,GAAU,KAAK,mBAAA,CAAoB,MAAA,CAAO,OAAO,MAAA,CAAO,KAAA,IAAS,IAAI,CAAA,IAAK,EAAC;AACjF,QAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,KAAA;AAExB,QAAA,MAAM,YAAA,GAGF,EAAE,GAAA,EAAK,OAAA,EAAQ;AAEnB,QAAA,IAAI,OAAA,EAAS,SAAS,MAAA,EAAW;AAC/B,UAAA,MAAM,eAA6C,EAAC;AACpD,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,MAAA,CAAO,QAAQ,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA,EAAG;AAChE,YAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,KAAM,MAAA,IAAa,SAAS,MAAA,EAAQ;AACjD,cAAA,YAAA,CAAa,GAAG,CAAA,GAAI,MAAA;AAAA,YACtB;AAAA,UACF;AACA,UAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,YAAA,YAAA,CAAa,YAAY,CAAA,GAAI,MAAA;AAAA,UAC/B,CAAA,MAAO;AACL,YAAA,OAAO,aAAa,YAAY,CAAA;AAAA,UAClC;AACA,UAAA,YAAA,CAAa,SAAA,GAAY,YAAA;AAAA,QAC3B;AAEA,QAAA,MAAM,UAAU,MAAM,YAAA,CAAa,YAAA,CAAa,IAAA,CAAK,UAAU,YAAY,CAAA;AAC3E,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,QACnF;AAEA,QAAA,IAAA,CAAK,UAAU,GAAA,GAAM,OAAA;AACrB,QAAC,IAAA,CAAK,SAAA,CAAkB,SAAA,GAAa,OAAA,CAAgB,SAAA,IAAa,IAAA;AAClE,QAAA,IAAA,CAAK,UAAU,KAAA,GAAQ,OAAA;AAAA,MACzB;AAAA,MAEA,MAAM,aAAa,OAAA,EAAgC;AACjD,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAK,EAAG;AAC/B,UAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,QAC3D;AAEA,QAAA,MAAM,EAAE,cAAA,EAAgB,UAAA,EAAW,GAAI,MAAM,KAAK,oBAAA,EAAqB;AACvE,QAAA,IAAI,OAAO,UAAA,CAAW,YAAA,KAAiB,UAAA,EAAY;AACjD,UAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,QACxE;AAEA,QAAA,MAAM,UAAA,CAAW,aAAa,cAAA,EAAgB;AAAA,UAC5C,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,QAAQ,IAAA,EAAK;AAAA,UACtB,MAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,EAAE,WAAA,EAAa,IAAA,CAAK,QAAA;AAAS,SACxC,CAAA;AAAA,MACH;AAAA,MAEA,MAAM,UAAU,MAAA,EAA+B;AAC7C,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAK,EAAG;AAC7B,UAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,QACvD;AAEA,QAAA,MAAM,EAAE,cAAA,EAAgB,UAAA,EAAW,GAAI,MAAM,KAAK,oBAAA,EAAqB;AACvE,QAAA,IAAI,OAAO,UAAA,CAAW,yBAAA,KAA8B,UAAA,EAAY;AAC9D,UAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,QACrE;AAEA,QAAA,MAAM,UAAA,CAAW,yBAAA;AAAA,UACf,cAAA;AAAA,UACA,IAAA,CAAK,QAAA;AAAA,UACL,OAAO,IAAA;AAAK,SACd;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,WAAA,EAAkD;AACrE,QAAA,MAAM,YAAA,GAAe,KAAK,oBAAA,EAAqB;AAC/C,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,SAAA,CAAU,WAAW,CAAA;AACtD,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,KAAK,QAAA,EAAU;AAC5C,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAY,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,oBAAA,CAAqB,WAAW,WAAW,CAAA;AACtF,QAAA,MAAM,YAAY,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,oBAAA,CAAqB,IAAI,SAAS,CAAA;AAE7E,QAAA,OAAO,gBAAA,CAAgB,mBAAmB,SAAA,EAAW;AAAA,UACnD,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,UAAU,KAAA,CAAM,UAAA;AAAA,UAChB,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,KAAK,IAAA,CAAK,mBAAA,CAAoB,MAAM,GAAA,IAAO,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,UAC9D,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,UAC9B,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,UACtB,UAAA,EAAY,MAAM,UAAA,IAAc,IAAA;AAAA,UAChC,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,UACxB,UAAA,EAAY,MAAM,UAAA,IAAc,IAAA;AAAA,UAChC,YAAY,KAAA,CAAM;AAAA,SACnB,CAAA;AAAA,MACH;AAAA,MAEA,MAAM,eAAA,GAA+C;AACnD,QAAA,MAAM,YAAA,GAAe,KAAK,oBAAA,EAAqB;AAC/C,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC1D,QAAA,MAAM,QAAA,GAAW,SAAS,MAAA,IAAU,IAAA;AACpC,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AACpD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAY,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,oBAAA,CAAqB,WAAW,QAAQ,CAAA;AACnF,QAAA,MAAM,aAAa,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,oBAAA,CAAqB,IAAI,SAAS,CAAA;AAE9E,QAAA,OAAO,gBAAA,CAAgB,mBAAmB,UAAA,EAAY;AAAA,UACpD,IAAI,MAAA,CAAO,EAAA;AAAA,UACX,UAAU,MAAA,CAAO,UAAA;AAAA,UACjB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,KAAK,IAAA,CAAK,mBAAA,CAAoB,OAAO,GAAA,IAAO,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,UAChE,SAAA,EAAW,OAAO,SAAA,IAAa,IAAA;AAAA,UAC/B,KAAA,EAAO,OAAO,KAAA,IAAS,IAAA;AAAA,UACvB,UAAA,EAAY,OAAO,UAAA,IAAc,IAAA;AAAA,UACjC,MAAA,EAAQ,OAAO,MAAA,IAAU,IAAA;AAAA,UACzB,UAAA,EAAY,OAAO,UAAA,IAAc,IAAA;AAAA,UACjC,YAAY,MAAA,CAAO;AAAA,SACpB,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAMA,SAAA,CAAU,UAAkB,IAAA,EAAqC;AAC/D,QAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEpB,UAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,QACnE;AAEA,QAAA,SAAA,CAAc,IAAA,CAAK,UAAA,EAAY,QAAA,EAAU,IAAI,CAAA;AAAA,MAC/C;AAAA,MAEA,MAAM,UAAA,CAAW,QAAA,EAAkB,IAAA,EAAoD;AAErF,QAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA,MAMA,IAAA,CAAK,OAAe,IAAA,EAAqB;AACvC,QAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,UAAA,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,IAAI,CAAA;AAAA,QACvC;AAAA,MAEF;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,OAAA,GAAmC;AACrC,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,OAAO,KAAK,UAAA,CAAW,OAAA;AAAA,QACzB;AAGA,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,MAEA,IAAI,QAAQ,KAAA,EAAgC;AAC1C,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,IAAA,CAAK,WAAW,OAAA,GAAU,KAAA;AAAA,QAC5B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,SAAsB,GAAA,EAAgC;AAC1D,QAAA,IAAI,OAAO,IAAA,CAAK,eAAA,CAAgB,QAAA,KAAa,UAAA,EAAY;AACvD,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,QACpE;AAEA,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAY,GAAG,CAAA;AAAA,MAC7C;AAAA,MAEA,MAAM,QAAA,CAAS,GAAA,EAAa,KAAA,EAA+B;AACzD,QAAA,IAAI,OAAO,IAAA,CAAK,eAAA,CAAgB,QAAA,KAAa,UAAA,EAAY;AACvD,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,QACpE;AAEA,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,GAAA,EAAK,KAAK,CAAA;AAAA,MAChD;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,SAAA,CACJ,IAAA,EACA,IAAA,EACA,UACA,OAAA,EACqB;AAErB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAE5C,QAAA,IAAI,MAAA,EAAQ;AAEV,UAAA,IAAI,WAAA;AACJ,UAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,YAAA,WAAA,GAAc,IAAA;AAAA,UAChB,CAAA,MAAO;AAEL,YAAA,WAAA,GAAc,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA;AAAA,UAC7C;AACA,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,cAAc,IAAA,EAAM,WAAA,EAAa,UAAU,OAAkC,CAAA;AACvH,UAAA,OAAO,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAAA,QACxC,CAAA,MAAO;AAEL,UAAA,IAAI,UAAA;AACJ,UAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAG5B,YAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,YAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AACjC,YAAA,IAAI,MAAA,GAAS,EAAA;AACb,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,cAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,YACxC;AACA,YAAA,UAAA,GAAa,KAAK,MAAM,CAAA;AAAA,UAC1B,CAAA,MAAO;AAEL,YAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAI,CAAA;AACjC,YAAA,IAAI,MAAA,GAAS,EAAA;AACb,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,cAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,YACxC;AACA,YAAA,UAAA,GAAa,KAAK,MAAM,CAAA;AAAA,UAC1B;AACA,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,IAAA,EAAM,UAAA,EAAY,UAAU,OAAkC,CAAA;AAClH,UAAA,OAAO,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAAA,QACxC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,gBAAgB,QAAA,EAA2B;AAEjD,QAAA,IAAI,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAGzC,QAAA,MAAMC,uBAAAA,GAAyB;AAAA;AAAA,UAE7B,kBAAA;AAAA,UACA,qBAAA;AAAA,UACA,mBAAA;AAAA,UACA,mBAAA;AAAA,UACA,sBAAA;AAAA,UACA,iBAAA;AAAA,UACA,uBAAA;AAAA,UACA,qBAAA;AAAA,UACA,sBAAA;AAAA,UACA,sBAAA;AAAA,UACA,kBAAA;AAAA,UACA,oBAAA;AAAA,UACA,kBAAA;AAAA,UACA,oBAAA;AAAA;AAAA,UAGA,wBAAA;AAAA,UACA,0BAAA;AAAA,UACA,wBAAA;AAAA,UACA,wBAAA;AAAA,UACA,0BAAA;AAAA,UACA,sBAAA;AAAA,UACA,oBAAA;AAAA,UACA,oBAAA;AAAA,UACA,mBAAA;AAAA,UACA,kBAAA;AAAA,UACA,oBAAA;AAAA,UACA,mBAAA;AAAA,UACA,mBAAA;AAAA,UACA,0BAAA;AAAA,UACA,mBAAA;AAAA,UACA,mBAAA;AAAA;AAAA,UAGA,iBAAA;AAAA,UACA,mBAAA;AAAA,UACA,qBAAA;AAAA,UACA,uBAAA;AAAA,UACA,0BAAA;AAAA,UACA,iCAAA;AAAA,UACA,gCAAA;AAAA;AAAA,UAGA,yBAAA;AAAA,UACA,qBAAA;AAAA,UACA,mBAAA;AAAA,UACA,iBAAA;AAAA,UACA,sBAAA;AAAA;AAAA,UAGA,mCAAA;AAAA,UACA,2BAAA;AAAA,UACA,8BAAA;AAAA,UACA,qCAAA;AAAA;AAAA,UAGA,mBAAA;AAAA,UACA,0BAAA;AAAA,UACA,mBAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAOA,uBAAAA,CAAuB,IAAA;AAAA,UAAK,UACjC,QAAA,KAAa,IAAA,IAAQ,QAAA,CAAS,UAAA,CAAW,OAAO,GAAG;AAAA,SACrD;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,IAAA,EAA2C;AACxD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,IAAI,CAAA;AACvD,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAChD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,QACtC;AACA,QAAA,OAAO,KAAA,CAAM,MAAA;AAAA,MACf;AAAA,MAEA,MAAM,cAAA,CACJ,IAAA,EACA,OAAA,EAC0C;AAE1C,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,IAAI,CAAA;AAEzD,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,IAAI,QAAA,CAAS,YAAY,OAAA,EAAS;AAChC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,UAAA,IAAc,KAAA;AAC/D,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,WAAA,IAAe,CAAA;AAClE,QAAA,MAAM,WAAA,GAAc,YAAY,UAAA,GAAa,CAAA;AAE7C,QAAA,MAAM,iBAAiB,IAAA,CAAK,eAAA;AAC5B,QAAA,MAAM,SAAS,OAAA,EAAS,MAAA;AAGxB,QAAA,OAAO;AAAA,UACL,CAAC,MAAA,CAAO,aAAa,GAAG,mBAA8C;AAEpE,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA;AACjD,cAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,gBAAA;AAAA,cACF;AAEA,cAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AACrC,cAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAChD,cAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,gBAAA,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,cACtC;AACA,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,KAAA;AAAA,gBACN,KAAA,EAAO,CAAA;AAAA,gBACP,WAAA,EAAa,CAAA;AAAA,gBACb,MAAA,EAAQ;AAAA,eACV;AACA,cAAA;AAAA,YACF;AAGA,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AAEpC,cAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,gBAAA;AAAA,cACF;AAEA,cAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,aAAA,CAAc,MAAM,CAAC,CAAA;AAEzD,cAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,gBAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,CAAA,qBAAA,EAAwB,CAAC,CAAA,CAAE,CAAA;AAAA,cAC7D;AAGA,cAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC/B,cAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AACzC,cAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,gBAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,cAC/B;AAEA,cAAA,MAAM;AAAA,gBACJ,IAAA;AAAA,gBACA,KAAA,EAAO,CAAA;AAAA,gBACP,WAAA;AAAA,gBACA,MAAA,EAAQ,MAAM,WAAA,GAAc;AAAA,eAC9B;AAAA,YACF;AAAA,UACF;AAAA,SACF;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,IAAA,EAA0C;AACvD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,IAAI,CAAA;AACvD,QAAA,OAAO,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,GAAI,IAAA;AAAA,MAChD;AAAA,MAEA,MAAM,YAAY,IAAA,EAAsC;AACtD,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,YAAY,IAAI,CAAA;AAC3D,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,QAAQ,GAAA,CAAI,CAAC,MAAW,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC;AAAA,SACzD;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,IAAA,EAA6B;AAC5C,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA;AAAA,MAC5C;AAAA,MAEA,MAAM,UAAU,IAAA,EAAmC;AACjD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,IAAI,CAAA;AACxD,QAAA,OAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,MACnC;AAAA,MAEA,MAAM,UAAU,IAAA,EAA6B;AAC3C,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAAA,MAC3C;AAAA,MAEA,MAAM,YAAA,GAAmC;AACvC,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,eAAA,CAAgB,YAAA,EAAa;AACtD,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,UAAA,IAAc,CAAA;AAAA,UAClD,cAAA,EAAgB,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,eAAA,IAAmB,CAAA;AAAA,UACjE,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,UAAA,IAAc;AAAA,SACpD;AAAA,MACF;AAAA,MAEA,MAAM,UAAU,OAAA,EAAwC;AACtD,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,OAAO,CAAA;AAC5D,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,UAC9B,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW;AAAC,SACzB,CAAE,CAAA;AAAA,MACJ;AAAA,MAEA,MAAM,UAAU,OAAA,EAAsC;AACpD,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,OAAO,CAAA;AAC5D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,GAAU,OAAA,CAAQ,SAAS;AAAC,SAC9D;AAAA,MACF;AAAA,MAEA,MAAM,iBAAiB,IAAA,EAA2C;AAChE,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,SAAA,GAAmC;AACrC,QAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,SAAS,SAAA,EAAkC;AAC/C,QAAA,MAAM,KAAK,eAAA,CAAgB,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,SAAS,CAAA;AAAA,MAClE;AAAA,MAEA,MAAM,SAAA,GAA2B;AAC/B,QAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,eAAA,EAAiB;AACzC,UAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,QACrE;AAEA,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,KAAK,QAAQ,CAAA;AACvE,QAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,UAAA;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,cAAA,CAAe,IAAA,EAAc,IAAA,EAA+B,QAAgB,CAAA,EAAoB;AACpG,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,EAAY,YAAA,IAAgB,IAAA;AACrD,QAAA,OAAO,IAAA,CAAK,gBAAgB,cAAA,CAAe,IAAA,CAAK,UAAU,EAAA,EAAI,IAAA,EAAM,MAAM,KAAA,EAAO;AAAA,UAC/E;AAAA,SACD,CAAA;AAAA,MACH;AAAA,MAEA,MAAM,oBAAoB,IAAA,EAA2C;AACnE,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,mBAAA,CAAoB,IAAI,CAAA;AAAA,MACtD;AAAA,MAEA,MAAM,sBAAsB,EAAA,EAA8B;AACxD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,qBAAA,CAAsB,EAAE,CAAA;AAAA,MACtD;AAAA;AAAA;AAAA;AAAA,MAMA,OAAA,CAAQ,QAAgB,OAAA,EAA+C;AACrE,QAAA,IAAI,CAAC,4BAAA,CAA6B,IAAA,CAAK,eAAe,CAAA,EAAG;AACvD,UAAA,OAAO,mBAAA;AAAA,YACL,IAAA,CAAK,eAAA;AAAA,YACL,IAAA,CAAK,QAAA;AAAA,YACL,MAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAEA,QAAA,OAAO,sBAAA,CAAuB;AAAA,UAC5B,MAAA;AAAA,UACA,OAAA;AAAA,UACA,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,gBAAgB,IAAA,CAAK,eAAA;AAAA,UACrB,WAAA,EAAa,IAAA,CAAK,UAAA,EAAY,eAAA,EAAiB;AAAA,SAChD,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAMQ,WAAA,GAAc,CAAC,GAAA,KAAiC;AACtD,QAAA,OAAO;AAAA,UACL,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,UAAU,GAAA,CAAI;AAAA,SAChB;AAAA,MACF,CAAA;AAAA,MAEQ,cAAA,GAAiB,CAAC,MAAA,KAA4B;AACpD,QAAA,OAAO;AAAA,UACL,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,SAAA,IAAa,0BAAA;AAAA,UACjD,OAAA,EAAS,OAAO,OAAA,IAAW,OAAA;AAAA,UAC3B,IAAA,EAAM,OAAO,IAAA,IAAQ,CAAA;AAAA,UACrB,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,YAAA,IAAgB,KAAA;AAAA,UAC1D,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,UAAA;AAAA,UACtC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO;AAAA,SACxC;AAAA,MACF,CAAA;AAAA,MAEQ,oBACN,KAAA,EAC+B;AAC/B,QAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AAChD,QAAA,MAAM,aAAqC,EAAC;AAC5C,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,UAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,UAAA,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,QAChC;AACA,QAAA,OAAO,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,IAAA;AAAA,MAC3D;AAAA,MAEA,MAAc,kBAAA,GAAsC;AAClD,QAAA,MAAM,iBACJ,OAAQ,IAAA,CAAK,SAAA,CAAkB,MAAA,KAAW,YACzC,IAAA,CAAK,SAAA,CAAkB,MAAA,CAAO,IAAA,GAAO,MAAA,GAAS,CAAA,GAC1C,KAAK,SAAA,CAAkB,MAAA,CAAO,MAAK,GACpC,IAAA;AACN,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAO,cAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAA,GAAe,KAAK,oBAAA,EAAqB;AAC/C,QAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,KAAK,QAAQ,CAAA;AACzD,QAAA,MAAM,MAAA,GACJ,MAAA,IAAU,OAAO,MAAA,CAAO,WAAW,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,IAAA,GAAO,MAAA,GAAS,CAAA,GACzE,MAAA,CAAO,MAAA,CAAO,MAAK,GACnB,IAAA;AACN,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,qBAAA,CAAuB,CAAA;AAAA,QAChE;AAEA,QAAC,IAAA,CAAK,UAAkB,MAAA,GAAS,MAAA;AACjC,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,MAAc,oBAAA,GAGX;AACD,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AACrD,QAAA,MAAM,YAAY,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,oBAAA,CAAqB,WAAW,cAAc,CAAA;AACzF,QAAA,MAAM,aAAa,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,oBAAA,CAAqB,IAAI,SAAS,CAAA;AAC9E,QAAA,OAAO,EAAE,gBAAgB,UAAA,EAAW;AAAA,MACtC;AAAA,MAEQ,oBAAA,GAiBN;AACA,QAAA,MAAM,GAAA,GAAM,KAAK,eAAA,CAAgB,GAAA;AACjC,QAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,QAAA,OAAO,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,OAAO,cAAc,SAAA,EAAmC;AACtD,QAAA,OAAO,IAAI,gBAAA;AAAA,UACT,SAAA;AAAA,UACA,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,UAAU,MAAA,CAAO;AAAA,SACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBAAA,CACL,cAAA,EACA,QAAA,EACA,cAAA,GAA4C,EAAC,EAChC;AACb,QAAA,OAAO,IAAI,gBAAA,CAAgB,IAAA,EAAM,cAAA,EAAgB,UAAU,cAAc,CAAA;AAAA,MAC3E;AAAA,KACF;AAKA,IAAM,qBAAN,MAAmD;AAAA,MACzC,UAAA;AAAA,MAER,YAAY,SAAA,EAAsB;AAChC,QAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,MACpB;AAAA,MAEA,IAAI,MAAA,GAAiB;AACnB,QAAA,OAAO,KAAK,UAAA,CAAW,MAAA;AAAA,MACzB;AAAA,MAEA,IAAI,WAAA,GAAyB;AAC3B,QAAA,OAAO,KAAK,UAAA,CAAW,WAAA;AAAA,MACzB;AAAA,MAEA,IAAI,SAAA,GAAoB;AACtB,QAAA,OAAO,KAAK,UAAA,CAAW,SAAA;AAAA,MACzB;AAAA,MAEA,IAAI,cAAA,GAAyB;AAC3B,QAAA,OAAO,KAAK,UAAA,CAAW,cAAA;AAAA,MACzB;AAAA,MAEA,IAAI,cAAA,GAAyB;AAC3B,QAAA,OAAO,KAAK,UAAA,CAAW,cAAA;AAAA,MACzB;AAAA,MAEA,IAAI,OAAA,GAAmB;AACrB,QAAA,OAAO,KAAK,UAAA,CAAW,OAAA;AAAA,MACzB;AAAA,MAEA,IAAI,SAAA,GAAmC;AACrC,QAAA,OAAO,KAAK,UAAA,CAAW,SAAA;AAAA,MACzB;AAAA,MAEA,IAAI,cAAA,GAA4B;AAE9B,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,UAClD,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,QAAA,EAAU;AAAA,SACZ,CAAE,CAAA;AAAA,MACJ;AAAA,MAEA,IAAI,UAAA,GAAuB;AACzB,QAAA,OAAO,KAAK,UAAA,CAAW,UAAA;AAAA,MACzB;AAAA,MAEA,UAAU,IAAA,EAAuB;AAC/B,QAAA,IAAA,CAAK,UAAA,CAAW,cAAA,GAAiB,IAAA,KAAS,GAAA,GAAM,QAAA,GAAW,QAAA;AAAA,MAC7D;AAAA,MAEA,IAAA,GAAa;AACX,QAAA,IAAA,CAAK,WAAW,OAAA,GAAU,IAAA;AAC1B,QAAA,IAAA,CAAK,UAAA,CAAW,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,WAAA;AAAA,MAC9C;AAAA,MAEA,IAAI,WAAA,GAA2B;AAC7B,QAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,eAAA,EAAiB;AACpC,UAAA,IAAA,CAAK,UAAA,CAAW,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,QACxD;AACA,QAAA,OAAO,IAAA,CAAK,WAAW,eAAA,CAAgB,MAAA;AAAA,MACzC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChzCA,IAAA,wBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,wBAAA,EAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,YAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAiCA,SAAS,aAAa,OAAA,EAAyB;AAC7C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAC,CAAA;AACvD;AAEA,eAAe,uBAAA,CACb,KAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,YAAA,CAAa,OAAO,CAAA,EAAG,CAAA;AAChF,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,MAAM,QAAQ,KAAK,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK;AAAA,GACf;AACF;AAEA,eAAe,qBAAA,CACb,KAAA,EACA,QAAA,EACA,SAAA,EACA,UACA,OAAA,EACyB;AACzB,EAAA,IAAI,cAAA,GAAiB,aAAa,OAAO,CAAA;AACzC,EAAA,IAAI,SAAS,MAAM,uBAAA,CAAwB,KAAA,EAAO,QAAA,EAAU,WAAW,cAAc,CAAA;AAErF,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,GAAa,QAAA,IAAY,iBAAiB,WAAA,EAAa;AACxE,IAAA,cAAA,IAAkB,EAAA;AAClB,IAAA,MAAA,GAAS,MAAM,uBAAA,CAAwB,KAAA,EAAO,QAAA,EAAU,WAAW,cAAc,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,GAAa,QAAA,EAAU;AACxC,IAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,WAAW,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,GAAI,GAAA;AACnE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,CAAO,KAAA,GAAQ,WAAW,CAAC,CAAC,CAAA;AAChG,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,WAAW,CAAC,CAAC,CAAA;AAEnG,IAAA,IAAI,SAAA,IAAa,MAAA,CAAO,KAAA,IAAS,UAAA,IAAc,OAAO,MAAA,EAAQ;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,GAAS,MAAM,uBAAA,CAAwB,KAAA,EAAO,SAAA,EAAW,YAAY,cAAc,CAAA;AAAA,EACrF;AAEA,EAAA,OAAO,MAAA;AACT;AAaA,eAAsB,YAAA,CACpB,OACA,aAAA,EACyB;AAEzB,EAAA,IAAI,KAAA,CAAM,aAAa,cAAA,EAAgB;AACrC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,UAAU,CAAA,eAAA,EAAkB,cAAc,CAAA,WAAA,CAAa,CAAA;AAAA,EACnG;AAEA,EAAA,OAAO,MAAM,qBAAA,CAAsB,KAAA,EAAO,aAAA,EAAe,aAAA,EAAe,UAAU,EAAE,CAAA;AACtF;AAuCO,SAAS,eAAA,CAAgB,MAAc,QAAA,EAA2B;AAEvE,EAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,IAAI,CAAC,CAAA;AAGlD,EAAA,OACE,YAAA,GAAe,YACf,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,IACxB,QAAA,CAAS,SAAS,MAAM,CAAA;AAE5B;AAKO,SAAS,oBAAoB,MAAA,EAA6B;AAC/D,EAAA,MAAM,YAAA,GAAe,KAAK,MAAM,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAChD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAKO,SAAS,oBAAoB,MAAA,EAA6B;AAC/D,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAlLA,IAiBM,QAAA,EAGA,eAGA,cAAA,EACA,WAAA;AAxBN,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAiBA,IAAM,QAAA,GAAW,MAAM,IAAA,GAAO,IAAA;AAG9B,IAAM,aAAA,GAAgB,IAAA;AAGtB,IAAM,cAAA,GAAiB,KAAK,IAAA,GAAO,IAAA;AACnC,IAAM,WAAA,GAAc,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACbpB,oBAAA,EAAA;AAkfO,SAASC,kBACd,UAAA,EACwB;AACxB,EAAA,OAAO,UAAA;AACT;AA6HO,SAAS,4BACd,OAAA,EACwB;AACxB,EAAA,QAAQ,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAqC;AACrE,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,EAAA;AAE3C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEtD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,UACzC,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAInD,MAAA,MAAM,QAAA,GAAW,IAAA;AAGjB,MAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,kBAAA,CAAmB,QAAA,EAAU,QAAQ,CAAA;AAEzE,MAAA,MAAM,iBAAyC,EAAC;AAChD,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,QAAA,IAAI,QAAQ,UAAA,IAAe,GAAA,KAAQ,IAAA,IAAQ,CAAC,OAAO,QAAA,EAAW;AAC5D,UAAA;AAAA,QACF;AACA,QAAA,cAAA,CAAe,GAAA,KAAQ,GAAA,GAAM,GAAA,GAAM,GAAG,CAAA,GAAI,KAAA;AAAA,MAC5C;AAGA,MAAA,OAAO,MAAM,OAAA,CAAQ,GAAA,EAAK,WAAA,EAAa,cAAc,CAAA;AAAA,IACvD,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAChE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,uBAAA,EAAwB;AAAA,QAClD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;ACnjBA,eAAsB,UAAU,KAAA,EAAgC;AAC9D,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAEjC,EAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,UAAU,CAAA;AAE3C,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA,IAAA,KAAQ,KAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAClF;AAoBO,SAAS,iBAAiB,KAAA,EAAwB;AACvD,EAAA,OAAO,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,IAAK,MAAM,MAAA,GAAS,EAAA;AACxD;AAKO,SAAS,cAAc,GAAA,EAAsB;AAClD,EAAA,OAAO,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,IAAK,IAAI,MAAA,GAAS,EAAA;AACpD;AAyCA,eAAsB,iBAAA,CAAkB,aAAqB,aAAA,EAA+C;AAC1G,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACnC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,YAAY,CAAA,GAAI,KAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAGhC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MACpC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,KAAA;AAAA,MACA,CAAC,QAAQ;AAAA,KACX;AAGA,IAAA,MAAM,WAAA,GAAc,eAAe,UAAU,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,eAAe,YAAY,CAAA;AAG7C,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,OAAO,MAAA,EAAQ,SAAA,EAAW,WAAW,WAAW,CAAA;AAEpF,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,OAAO,OAAA,CAAQ,OAAO,WAAW,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAiBA,eAAsB,qBAAA,CAAsB,OAAe,aAAA,EAAyC;AAClG,EAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,KAAA,EAAO,aAAa,CAAA;AAC5D,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,aAAA,EAAe;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AACzB,EAAA,MAAM,MAAA,GAAS,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAEnC,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAWA,SAAS,eAAe,MAAA,EAA4B;AAClD,EAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA;AACT;;;AC3RA,IAAM,YAAA,GAAe;AAAA,EACnB,6BAAA,EAA+B,GAAA;AAAA,EAC/B,8BAAA,EAAgC,wCAAA;AAAA,EAChC,8BAAA,EAAgC,+CAAA;AAAA,EAChC,wBAAA,EAA0B;AAC5B,CAAA;AAgBA,SAAS,mBAAmB,OAAA,EAAiC;AAE3D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AACtD,EAAA,IAAI,UAAA,IAAc,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AAClD,IAAA,OAAO,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,EAC/B;AAGA,EAAA,MAAM,cACJ,OAAA,CAAQ,OAAA,CAAQ,IAAI,SAAS,CAAA,EAAG,aAAY,KAAM,WAAA;AACpD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAC1C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,SAAS,GAAA,EAAK;AAAA,IAEd;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,gBAAgB,GAAA,EAAe;AACtC,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,EAAA,OAAO,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAC7C;AAKA,eAAsB,YAAA,CACpB,SACA,GAAA,EAC6B;AAC7B,EAAA,MAAM,KAAA,GAAQ,mBAAmB,OAAO,CAAA;AAExC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA,CAAI,oBAAA,IAAwB,GAAA,CAAI,cAAA,EAAgB;AAElD,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,MAAA,MAAM,oBAAoB,MAAM,qBAAA;AAAA,QAC9B,KAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AACA,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM;AAAA,YACJ,EAAA,EAAI,aAAA;AAAA,YACJ,QAAA,EAAU,OAAA;AAAA,YACV,IAAA,EAAM;AAAA,WACR;AAAA,UACA,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,KAAK,CAAA;AACvC,IAAA,MAAM,YAAA,GAAe,gBAAgB,GAAG,CAAA;AAExC,IAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,eAAA,CAAgB,SAAS,CAAA;AAC5D,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,WAAA,CAAY,QAAQ,OAAO,CAAA;AAC3D,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAO;AAAA,UACL,IAAA,EAAM;AAAA,YACJ,IAAI,IAAA,CAAK,EAAA;AAAA,YACT,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,MAAM,IAAA,CAAK;AAAA,WACb;AAAA,UACA,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,KAAK,CAAA;AACrC,IAAA,MAAM,YAAA,GAAe,gBAAgB,GAAG,CAAA;AAExC,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,cAAA,CAAe,OAAO,CAAA;AACxD,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,WAAA,CAAY,OAAO,OAAO,CAAA;AAC1D,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAO;AAAA,UACL,IAAA,EAAM;AAAA,YACJ,IAAI,IAAA,CAAK,EAAA;AAAA,YACT,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,MAAM,IAAA,CAAK;AAAA,WACb;AAAA,UACA,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,eAAsB,WAAA,CACpB,SACA,GAAA,EACiC;AACjC,EAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAEnD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA,EAAG;AAAA,MAC7D,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,YAAA;AAAa,KAChE,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,WAAA;AACT;AAMA,eAAsB,YAAA,CACpB,SACA,GAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,OAAA,EAAS,GAAG,CAAA;AAE7C,EAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,OAAO,IAAI,QAAA;AAAA,MACT,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,oCAAoC,CAAA;AAAA,MAC5D;AAAA,QACE,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,YAAA;AAAa;AACjE,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACnMO,IAAM,SAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAUd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAUd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,IAAA,CA6Cd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAID,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMd,CAAA;AAAA,EACH;AACF,CAAA;;;ACvIO,IAAMC,UAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACjBO,IAAMA,UAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;AC3CO,IAAMA,UAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACbO,IAAMA,UAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAGzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACdO,IAAMA,UAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;AClBO,IAAMA,UAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;AClCO,IAAMA,UAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACbO,IAAMA,UAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA,IAAA,CAGd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAOd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;AClCO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAIzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAYd,CAAA;AAID,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,IAAA,CAId,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,IAAA,CAId,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACxCO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAGzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA,IAAA,CAGd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACzBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAGzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACdO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAIzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA,IAAA,CAGd,CAAA;AAMD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACnCO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAIzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAID,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAQD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACpCO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAGzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACdO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAMzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACjBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAMzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAqBd,CAAA;AAID,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAOd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAID,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACpGO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAGzC,IAAA,MAAM,GAAA,CAAI,KAAK,CAAA,0CAAA,CAA4C,CAAA;AAC3D,IAAA,MAAM,GAAA,CAAI,KAAK,CAAA,2CAAA,CAA6C,CAAA;AAG5D,IAAA,MAAM,GAAA,CAAI,KAAK,CAAA,8DAAA,CAAgE,CAAA;AAAA,EACjF;AACF,CAAA;;;ACXO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAKzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQd,CAAA;AAGD,IAAA,MAAM,GAAA,CAAI,KAAK,CAAA,2DAAA,CAA6D,CAAA;AAG5E,IAAA,MAAM,GAAA,CAAI,KAAK,CAAA,yDAAA,CAA2D,CAAA;AAC1E,IAAA,MAAM,GAAA,CAAI,KAAK,CAAA,gDAAA,CAAkD,CAAA;AAGjE,IAAA,MAAM,GAAA,CAAI,KAAK,CAAA,8DAAA,CAAgE,CAAA;AAAA,EACjF;AACF,CAAA;;;ACrBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,IAAA,EAAM,oBAAA;AAAA,EACN,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,CAAA,uBAAA,CAAyB,EAAE,OAAA,EAAQ;AAC9D,IAAA,MAAM,mBAAmB,SAAA,CAAU,IAAA,CAAK,CAAC,GAAA,KAAa,GAAA,CAAI,SAAS,gBAAgB,CAAA;AAEnF,IAAA,IAAI,CAAC,gBAAA,EAAkB;AAErB,MAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,MAAA,CAEd,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;;;ACfO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,IAAA,EAAM,qBAAA;AAAA,EACN,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,CAAA,uBAAA,CAAyB,EAAE,OAAA,EAAQ;AAC9D,IAAA,MAAM,oBAAoB,SAAA,CAAU,IAAA,CAAK,CAAC,GAAA,KAAa,GAAA,CAAI,SAAS,iBAAiB,CAAA;AAErF,IAAA,IAAI,CAAC,iBAAA,EAAmB;AAEtB,MAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,MAAA,CAEd,CAAA;AAGD,MAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,MAAA,CAEd,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;;;AC1BO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAIzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACpBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;AClBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAEzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAUd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA,IAAA,CAGd,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,IAAA,CAId,CAAA;AAGD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACjCO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AACzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA,IAAA,CAGd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACpBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AACzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACfO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AACzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,IAAA,CAId,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACzBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AAGzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAgBd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CA6Bd,CAAA;AAED,IAAA,MAAM,GAAA,CAAI,KAAK,CAAA,iCAAA,CAAmC,CAAA;AAElD,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,IAAA,CAId,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,IAAA,CAId,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,IAAA,CAId,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;AClFO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAkC;AACzC,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,IAAA,CAId,CAAA;AAED,IAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAEd,CAAA;AAAA,EACH;AACF,CAAA;;;ACdO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,EAAA;AAAA,EACT,IAAA,EAAM,iCAAA;AAAA,EACN,MAAM,GAAG,GAAA,EAAkC;AACzC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,CAAA,uBAAA,CAAyB,EAAE,OAAA,EAAQ;AAC9D,IAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA,CAAK,CAAC,GAAA,KAAa,GAAA,CAAI,SAAS,6BAA6B,CAAA;AAE7F,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA,MAAA,CAEd,CAAA;AACD,MAAA,MAAM,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA,MAAA,CAGd,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;;;ACSO,IAAM,UAAA,GAAa,CAAC,SAAA,EAAMA,UAAAA,EAAMA,UAAAA,EAAMA,UAAAA,EAAMA,UAAAA,EAAMA,UAAAA,EAAMA,UAAAA,EAAMA,UAAAA,EAAMA,UAAAA,EAAMA,WAAAA,EAAMA,aAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,aAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,WAAAA,EAAMA,aAAMA,WAAI,CAAA;AAEtM,IAAM,wBAAwB,UAAA,CAAW,MAAA;;;ACxBhD,UAAA,EAAA;;;ACuDO,IAAM,aAAN,MAAiB;AAAA,EACd,GAAA;AAAA,EACA,GAAA;AAAA,EAER,YAAY,GAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,OAAA,CAAQ,GAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QACJ,MAAA,EACA,IAAA,EACA,UAAkB,CAAA,EAClB,OAAA,GAAoC,EAAC,EACpB;AACjB,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,cAAc,GAAA,GAAM,OAAA;AAG1B,IAAA,MAAM,YAAY,GAAA,GAAM,GAAA;AACxB,IAAA,MAAM,oBAAoB,WAAA,GAAc,GAAA;AACxC,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,KAAc,IAAA;AACxC,IAAA,MAAM,WAAA,GAAc,YAAY,SAAA,GAAY,IAAA;AAG5C,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAKA,EAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,MACnB,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAY,CAAA,GAAI,CAAA;AAAA,MAChB,WAAA;AAAA,MACA,QAAQ,YAAA,IAAgB,IAAA;AAAA,MACxB,QAAQ,WAAA,IAAe;AAAA,KACzB;AAGA,IAAA,MAAM,KAAK,eAAA,EAAgB;AAE3B,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAY,SAAA,EAAqE;AAErF,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAG9B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAEzB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MAM5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAOA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAErB,MAAA,MAAM,KAAK,eAAA,EAAgB;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AAGnB,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,MACb,CAAA,kFAAA,CAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAGjC,MAAA,MAAM,KAAK,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,KAAK,EAAE,CAAA;AAGnD,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,YAAY,CAAA;AAGrC,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,IAAA,CAAK,EAAE,KAAK,KAAK,CAAA;AAAA,IACxE;AAGA,IAAA,MAAM,KAAK,eAAA,EAAgB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,aAAA,CAAc,MAAA,EAAgB,IAAA,EAA2B,MAAA,EAAgC;AAErG,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,QAAA,EAA+F;AACzG,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,SAAS,EAAA,EAA2B;AAChD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AACzB,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAKA,GAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,IAAA,CAAK,EAAA,EAAY,KAAA,EAA8B;AAC3D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AACzB,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAKA,KAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,GAAoC;AAChD,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,KAAK,GAAA,IAAQ,GAAA;AACpD,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,MACb,CAAA,oEAAA,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,eAAA,GAAiC;AAE7C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,KAOF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAErB,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,CAAC,CAAA,CAAE,YAAA;AAEhC,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,GAAI,CAAA;AAI3D,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAA,GAAsC;AAC1C,IAAA,MAAM,KAAK,eAAA,EAAgB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,oBAAoB,IAAA,EAMtB;AACF,IAAA,IAAI,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAKZ,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,IAAA,EAAM;AAER,MAAA,KAAA,IAAS,CAAA,2CAAA,CAAA;AACT,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,KAAA,IAAS,CAAA,0BAAA,CAAA;AAET,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,IAAA,CAK3B,KAAA,EAAO,GAAG,MAAM,CAAA;AAEnB,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO;AACrB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,IAAI,CAAA;AACnD,MAAA,OAAO;AAAA,QACL,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,MAAM,UAAA,CAAW,UAAA;AAAA,QACjB,MAAM,UAAA,CAAW,UAAA;AAAA,QACjB,aAAa,GAAA,CAAI,YAAA;AAAA,QACjB,WAAW,GAAA,CAAI;AAAA,OACjB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CAAe,OAAA,GAAgC,EAAC,EAAiC;AACrF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA;AAElD,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MACjC,CAAA,oEAAA;AAAA,KACF;AACA,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA,EAAQ,CAAE,CAAC,GAAG,KAAA,IAAS,CAAA;AAEjD,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,KAKF;AACA,IAAA,MAAM,gBAAgB,cAAA,CAAe,OAAA,EAAQ,CAAE,CAAC,GAAG,KAAA,IAAS,CAAA;AAE5D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MAa5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MA4BA,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,GAAA,KAAyB;AAC7D,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,IAAI,CAAA;AACnD,MAAA,OAAO;AAAA,QACL,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,MAAM,UAAA,CAAW,UAAA;AAAA,QACjB,MAAM,UAAA,CAAW,UAAA;AAAA,QACjB,aAAa,GAAA,CAAI,YAAA;AAAA,QACjB,WAAW,GAAA,CAAI,UAAA;AAAA,QACf,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,aAAa,GAAA,CAAI,YAAA;AAAA,QACjB,SAAA,EAAW,IAAI,UAAA,KAAe,CAAA;AAAA,QAC9B,aAAa,GAAA,CAAI,aAAA;AAAA,QACjB,cAAc,GAAA,CAAI;AAAA,OACpB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,EAAA,EAA4C;AAC7D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,kBAAA,CAAmB,EAAE,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,MAAA,MAAM,KAAK,qBAAA,CAAsB,IAAA,EAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,MAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,EAAA,EAAG;AAAA,IAC7B;AAEA,IAAA,IACE,IAAA,CAAK,MAAA,KAAW,WAAA,IAChB,IAAA,CAAK,MAAA,KAAW,QAAA,IAChB,IAAA,CAAK,MAAA,KAAW,gBAAA,IAChB,IAAA,CAAK,MAAA,KAAW,eAAA,EAChB;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,EAAG;AAAA,QAC3E,SAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAC7D,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,UAAU,CAAA,CAAE,CAAA;AAAA,MAC5E;AACA,MAAA,MAAM,IAAA,CAAK,sBAAsB,YAAY,CAAA;AAC7C,MAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,EAAA,EAAI,UAAA,EAAW;AAAA,IAC9C;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,EAAE,CAAA,2BAAA,EAA8B,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,qBAAA,CAAsB,EAAA,EAAY,UAAA,GAAiC,OAAA,EAA2B;AAClG,IAAA,MAAM,YAAA,GACJ,UAAA,KAAe,MAAA,GAAS,eAAA,GAAkB,gBAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAIzB,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAKA,YAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MAC7B,CAAA,2BAAA;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAc,QAAQ,OAAA,EAAQ;AACpC,IAAA,MAAM,WAAW,WAAA,CAAY,MAAA,GAAS,KAAK,WAAA,CAAY,CAAC,EAAE,OAAA,GAAU,CAAA;AAEpE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,KAAK,eAAA,EAAgB;AAAA,IAC7B;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAKH;AAED,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MACjC,CAAA,iEAAA;AAAA,KACF;AAEA,IAAA,MAAM,MAAA,GAAS,YAAY,OAAA,EAAQ;AACnC,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,CAAC,MAAyC,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,EAAG,KAAA,IAAS,CAAA;AACxG,IAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,CAAC,MAAyC,CAAA,CAAE,MAAA,KAAW,YAAY,CAAA,EAAG,KAAA,IAAS,CAAA;AAC9G,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,CAAC,MAAyC,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,EAAG,KAAA,IAAS,CAAA;AAGtG,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MAChC,CAAA,+FAAA;AAAA,KACF;AACA,IAAA,MAAM,QAAA,GAAW,WAAW,OAAA,EAAQ;AACpC,IAAA,MAAM,kBAAkB,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,CAAS,CAAC,EAAE,YAAA,GAAe,IAAA;AAEzE,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAAmC;AACxD,IAAA,MAAM,MAAA,GAAS,OAAO,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,CAAM,KAAK,IAAI,MAAA,CAAO,GAAA;AACtE,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAO,GAAA;AACrC,IAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,MAAA,EAAQ,CAAC,GAAG,GAAG,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAc,mBAAmB,EAAA,EAKvB;AACR,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MAM5B;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAMA;AAAA,KACF;AACA,IAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,CAAC,CAAA,IAAK,IAAA;AAAA,EAChC;AAAA,EAEA,MAAc,qBAAA,CAAsB,IAAA,EAKjC,OAAA,GAAoC,EAAC,EAAkB;AACxD,IAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAA,CAAK,EAAE,CAAA,eAAA,CAAiB,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,KAAc,IAAA;AACxC,IAAA,MAAM,WAAA,GAAc,SAAA,GAAY,IAAA,CAAK,GAAA,KAAQ,GAAA,GAAO,IAAA;AACpD,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAUA,IAAA,CAAK,EAAA;AAAA,MACL,YAAY,CAAA,GAAI,CAAA;AAAA,MAChB;AAAA,KACF;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MAC7B,CAAA,2BAAA;AAAA,KACF;AACA,IAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,GAAU,CAAC,CAAA,EAAG,WAAW,CAAA,IAAK,CAAA;AACvD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAA,CAAK,EAAE,CAAA,qBAAA,CAAuB,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA;AACpE,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,YAAY,CAAA;AACrC,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,MAAM,KAAK,eAAA,EAAgB;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,gBAAgB,KAAA,EAAmC;AACzD,IAAA,MAAM,MAAA,GAAS,OAAO,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,CAAM,KAAK,IAAI,MAAA,CAAO,GAAA;AACtE,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAO,CAAA;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC3B;AAAA,EAEQ,mBAAmB,IAAA,EAGzB;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAK9B,IAAA,OAAO;AAAA,MACL,YAAY,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GACrC,OAAO,UAAA,GACP,gBAAA;AAAA,MACJ,UAAA,EAAY,MAAA,CAAO,UAAA,IACjB,OAAO,OAAO,UAAA,KAAe,QAAA,IAC7B,CAAC,KAAA,CAAM,QAAQ,MAAA,CAAO,UAAU,CAAA,GAC9B,MAAA,CAAO,aACP;AAAC,KACP;AAAA,EACF;AACF,CAAA;;;ADhoBA,kBAAA,EAAA;;;AEEO,IAAM,wBAAA,GAAN,cAAuC,KAAA,CAAM;AAAA,EAClD,WAAA,CACkB,QAAA,EACA,QAAA,EACA,SAAA,EAChB,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AALG,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAIhB,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;AAiBO,SAAS,mBAAmB,IAAA,EAAuC;AAExE,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAExB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,IAAA,IAAI,eAAe,EAAA,EAAI;AAErB,MAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,IACpB;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,aAAa,CAAC,CAAA;AACpD,IAAA,IAAI,gBAAgB,EAAA,EAAI;AAEtB,MAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,IACpB;AAEA,IAAA,OAAO,CAAC,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,WAAW,GAAG,IAAA,CAAK,SAAA,CAAU,WAAA,GAAc,CAAC,CAAC,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACvC,EAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,IAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,CAAC,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,cAAc,GAAG,IAAA,CAAK,SAAA,CAAU,cAAA,GAAiB,CAAC,CAAC,CAAA;AAC/E;AAKO,SAAS,WAAA,CAAY,WAAmB,SAAA,EAA2B;AACxE,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAClC;AAKO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,MAAM,GAAG,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AAC7C,EAAA,OAAO,SAAA;AACT;AAoBO,SAAS,WAAA,CACd,QAAA,EACA,IAAA,EACA,SAAA,EAC2B;AAC3B,EAAA,MAAM,CAAC,KAAA,EAAO,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AAGlD,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,MAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAY,KAAK,CAAA,WAAA;AAAA,OACnB;AAAA,IACF;AAIA,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,MAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,CAAA,oBAAA,EAAuB,SAAS,CAAA,gBAAA,EAAmB,KAAK,CAAA,wDAAA;AAAA,KAE1D;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,MAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA,SAAA,EAAY,UAAU,SAAS,CAAA,WAAA;AAAA,OACjC;AAAA,IACF;AAEA,IAAA,MAAMC,OAAAA,GAAS,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AAClC,IAAA,IAAI,CAACA,OAAAA,EAAQ;AACX,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,MAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA,MAAA,EAAS,SAAS,CAAA,wBAAA,EAA2B,SAAA,CAAU,SAAS,CAAA,CAAA;AAAA,OAClE;AAAA,IACF;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT;AAGA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAC9C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,MAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS,SAAS,CAAA,+BAAA;AAAA,KACpB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAcO,SAAS,aAAA,CACd,QAAA,EACA,IAAA,EACA,SAAA,EAC2B;AAC3B,EAAA,MAAM,CAAC,KAAA,EAAO,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AAGlD,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,SAAS,CAAA,gBAAA,EAAmB,KAAK,CAAA,gCAAA;AAAA,KAE5D;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,QAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA,SAAA,EAAY,UAAU,SAAS,CAAA,WAAA;AAAA,OACjC;AAAA,IACF;AAEA,IAAA,MAAMA,OAAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA;AACpC,IAAA,IAAI,CAACA,OAAAA,EAAQ;AACX,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,QAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA,QAAA,EAAW,SAAS,CAAA,wBAAA,EAA2B,SAAA,CAAU,SAAS,CAAA,CAAA;AAAA,OACpE;AAAA,IACF;AACA,IAAA,OAAOA,OAAAA;AAAA,EACT;AAGA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,QAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAW,SAAS,CAAA,+BAAA;AAAA,KACtB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAiBO,SAAS,YAAA,CACd,QAAA,EACA,IAAA,EACA,SAAA,EAC2B;AAC3B,EAAA,MAAM,CAAC,aAAA,EAAe,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AAK1D,EAAA,IAAI,aAAA,KAAkB,IAAA,IAAQ,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,EAAG;AAC9D,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,CAAA,iCAAA,EAAoC,IAAI,CAAA,0FAAA,EACsB,aAAa,CAAA,SAAA;AAAA,KAC7E;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,IAAA;AAGnB,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAMA,OAAAA,GAAS,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA;AACpC,MAAA,IAAIA,OAAAA,EAAQ;AACV,QAAA,OAAOA,OAAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AACtD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,CAAA,OAAA,EAAU,UAAU,CAAA,wBAAA,EAA2B,SAAA,CAAU,SAAS,CAAA,qBAAA;AAAA,KACpE;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAU,UAAU,CAAA,+BAAA;AAAA,KACtB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAmBO,SAAS,YAAA,CACd,QAAA,EACA,IAAA,EACA,SAAA,EAC2B;AAC3B,EAAA,MAAM,CAAC,KAAA,EAAO,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AAGlD,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAY,KAAK,CAAA,WAAA;AAAA,OACnB;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA,OAAA,EAAU,SAAS,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAA;AAAA,OACjE;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA,OAAA,EAAU,SAAS,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAA;AAAA,OACrD;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA,SAAA,EAAY,UAAU,SAAS,CAAA,WAAA;AAAA,OACjC;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA,OAAA,EAAU,SAAS,CAAA,wBAAA,EAA2B,SAAA,CAAU,SAAS,CAAA,CAAA;AAAA,OACnE;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AACrD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,CAACC,QAAO,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC5D,IAAA,IAAI,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACvC,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA;AACnC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,wBAAA;AAAA,IACR,OAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAU,SAAS,CAAA,+BAAA;AAAA,GACrB;AACF;AAgBO,SAAS,WAAA,CACd,QAAA,EACA,IAAA,EACA,SAAA,EACkC;AAClC,EAAA,MAAM,CAAC,KAAA,EAAO,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AAGlD,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,MAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,mCAAmC,IAAI,CAAA,6BAAA;AAAA,KACzC;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAMD,OAAAA,GAAS,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AAClC,MAAA,IAAIA,OAAAA,EAAQ;AACV,QAAA,OAAOA,OAAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAC9C,EAAA,OAAO,MAAA,IAAU,IAAA;AACnB;AAaO,SAAS,mBAAA,CACd,UACA,SAAA,EACU;AACV,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,EAAC;AAAA,EACzC;AAGA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAC1C;AASO,SAAS,oBAAA,CACd,UACA,SAAA,EACU;AACV,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,MAAM,YAAY,GAAA,GAAM,MAAA,CAAO,KAAK,GAAA,CAAI,MAAM,IAAI,EAAC;AAGnD,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,CACtD,MAAA,CAAO,CAAC,CAAC,EAAE,CAAA,KAAM,EAAA,KAAO,SAAA,CAAU,SAAS,CAAA,CAC3C,OAAA;AAAA,MAAQ,CAAC,CAAC,KAAA,EAAOE,IAAG,CAAA,KACnBA,IAAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAA,IAAA,KAAQ,WAAA,CAAY,KAAA,EAAO,IAAI,CAAC;AAAA,KACtD;AAEF,IAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,gBAAgB,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,OAAO,MAAM,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,CAChD,OAAA,CAAQ,CAAA,GAAA,KAAO,GAAA,CAAI,WAAW,CAAA;AAGjC,EAAA,OAAO,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,YAAA,EAAc,GAAG,WAAW,CAAC,CAAC,CAAA;AACvD;AAKO,SAAS,qBAAA,CACd,UACA,SAAA,EACU;AACV,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,OAAO,IAAI,EAAC;AAAA,EAC3C;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAC5C;AAKO,SAAS,oBAAA,CACd,UACA,SAAA,EACU;AACV,EAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA;AACjD,IAAA,MAAM,YAAY,GAAA,GAAM,MAAA,CAAO,KAAK,GAAA,CAAI,MAAM,IAAI,EAAC;AACnD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,OAAO,MAAM,CAAA;AACvD,IAAA,OAAO,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,SAAA,EAAW,GAAG,YAAY,CAAC,CAAC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAC3C;AAYO,SAAS,uBACd,QAAA,EACkB;AAClB,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,QAAA,CAAS,UAAU,SAAA,EAAU;AAAA,EACnE;AACA,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AASO,SAAS,gBAAgB,IAAA,EAAuB;AACrD,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAExB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,IAAA,IAAI,UAAA,KAAe,IAAI,OAAO,KAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,UAAA,GAAa,CAAC,CAAA,KAAM,EAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA,CAAK,SAAS,GAAG,CAAA;AAC1B;;;AFpjBA,iBAAA,EAAA;AACA,mBAAA,EAAA;AAsBA,IAAM,sBAAA,GAAyB,mCAAA;AAE/B,SAAS,4BAA4B,IAAA,EAAsB;AACzD,EAAA,IAAI,CAAC,IAAA,IAAQ,2BAAA,CAA4B,IAAA,CAAK,IAAI,CAAA,EAAG;AACnD,IAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,EAAG;AACtD,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,GAAA,EAAK;AAC3B,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,+CAA+C,CAAA;AACvF,MAAA,KAAA,CAAM,GAAA,EAAI;AACV,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAC5B;AAEA,SAAS,2BAA2B,IAAA,EAAqC;AACvE,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM,OAAO,MAAA;AAChD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,IAAA,YAAgB,aAAa,OAAO,IAAA;AACxC,EAAA,IAAI,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,UAAA,EAAY,KAAK,UAAU,CAAA;AAC1E,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,KAAA,CAAM,UAAU,CAAA;AAC5C,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACA,EAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAC5E;AAEA,SAAS,yBAAA,GAA4B;AACnC,EAAA,MAAM,YAAA,GAAe,OAAO,KAAA,EAAe,IAAA,KAA0D;AACnG,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,aAAa,QAAA,EAAU;AAC/D,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,GAAG,QAAA,EAAS,GAAI,QAAQ,EAAC;AAChD,IAAA,MAAM,WAAA,GAA2B,EAAE,GAAG,QAAA,EAAS;AAC/C,IAAA,MAAM,IAAA,GAAO,2BAA2B,OAAO,CAAA;AAC/C,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAC,YAAoC,IAAA,GAAO,IAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,WAAW,CAAA;AAC3D,IAAA,OAAO;AAAA,MACL,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,SAAS,MAAA,CAAO,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA;AAAA,MACtD,IAAA,EAAM,MAAM,QAAA,CAAS,WAAA;AAAY,KACnC;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,EAAE,SAAS,YAAA,EAAa;AACjC;AAEA,SAAS,uBAAuB,KAAA,EAAY;AAC1C,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,OAAO,IAAA,KAAiB;AAChC,MAAA,MAAM,OAAO,MAAM,KAAA,CAAM,QAAA,CAAS,2BAAA,CAA4B,IAAI,CAAC,CAAA;AACnE,MAAA,OAAO,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAAA,IACvC,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,IAAA,EAAc,OAAA,EAAiB,WAAW,YAAA,KAAiB;AAC3E,MAAA,OAAO,MAAM,SAAA,CAAU,2BAAA,CAA4B,IAAI,CAAA,EAAG,SAAS,QAAQ,CAAA;AAAA,IAC7E;AAAA,GACF;AACF;AAEA,SAAS,2BAA2B,GAAA,EAAqB;AACvD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,WAAW,CAAA,EAAG;AAC/C,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,GAAG,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,CAAA,EAAG,sBAAsB,CAAA,EAAG,GAAG,CAAA,CAAA;AACxC;AAEA,SAAS,4BAA4B,KAAA,EAAY;AAC/C,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,KAAK,OAAO,GAAA,KAAgB,MAAM,QAAA,CAAS,0BAAA,CAA2B,GAAG,CAAC,CAAA;AAAA,MAC1E,GAAA,EAAK,OAAO,GAAA,EAAa,KAAA,KAAmB;AAC1C,QAAA,MAAM,KAAA,CAAM,QAAA,CAAS,0BAAA,CAA2B,GAAG,GAAG,KAAK,CAAA;AAC3D,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,MAAA,EAAQ,OAAO,GAAA,KAAgB;AAC7B,QAAA,MAAM,KAAA,CAAM,QAAA,CAAS,0BAAA,CAA2B,GAAG,GAAG,IAAI,CAAA;AAC1D,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,GAAA,EAAK,OAAO,GAAA,KAAiB,MAAM,MAAM,QAAA,CAAS,0BAAA,CAA2B,GAAG,CAAC,CAAA,KAAO;AAAA;AAC1F,GACF;AACF;AAEA,SAAS,gCAAgC,KAAA,EAAY;AACnD,EAAA,OAAO;AAAA,IACL,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,IACxB,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,IAC9B,UAAA,EAAY,MAAM,UAAA,IAAc,IAAA;AAAA,IAChC,WAAA,EAAa,CAAC,OAAA,KAAkB,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,IACzD,UAAA,EAAY,CAAC,SAAA,KAAsB,KAAA,CAAM,WAAW,SAAS,CAAA;AAAA,IAC7D,aAAA,EAAe,CAAC,OAAA,KAAiB,KAAA,CAAM,cAAc,OAAO,CAAA;AAAA,IAC5D,eAAe,CAAC,SAAA,EAAmB,YAAiB,KAAA,CAAM,aAAA,CAAc,WAAW,OAAO,CAAA;AAAA,IAC1F,aAAA,EAAe,CAAC,SAAA,KAAsB,KAAA,CAAM,cAAc,SAAS,CAAA;AAAA,IACnE,YAAA,EAAc,CAAC,OAAA,KAAiB,KAAA,CAAM,aAAa,OAAO,CAAA;AAAA,IAC1D,GAAA,EAAK,CAAC,YAAA,KAAyB,KAAA,CAAM,IAAI,YAAY,CAAA;AAAA,IACrD,OAAA,EAAS,CAAC,YAAA,KAAyB,KAAA,CAAM,QAAQ,YAAY,CAAA;AAAA,IAC7D,MAAA,EAAQ,CAAC,YAAA,EAAsB,KAAA,EAAe,YAAkB,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc,KAAA,EAAO,OAAO,CAAA;AAAA,IACzG,YAAA,EAAc,CAAC,OAAA,KAAoB,KAAA,CAAM,aAAa,OAAO,CAAA;AAAA,IAC7D,SAAA,EAAW,CAAC,MAAA,KAAmB,KAAA,CAAM,UAAU,MAAM,CAAA;AAAA,IACrD,WAAW,CAAC,QAAA,EAAkB,SAAkC,KAAA,CAAM,SAAA,CAAU,UAAU,IAAI,CAAA;AAAA,IAC9F,YAAY,CAAC,QAAA,EAAkB,SAAkC,KAAA,CAAM,UAAA,CAAW,UAAU,IAAI,CAAA;AAAA,IAChG,cAAA,EAAgB,CAAC,IAAA,EAAc,IAAA,EAA+B,UAAmB,KAAA,CAAM,cAAA,CAAe,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IACvH,mBAAA,EAAqB,CAAC,IAAA,KAAkB,KAAA,CAAM,oBAAoB,IAAI,CAAA;AAAA,IACtE,qBAAA,EAAuB,CAAC,EAAA,KAAe,KAAA,CAAM,sBAAsB,EAAE,CAAA;AAAA,IACrE,OAAA,EAAS,OAAO,MAAA,EAAgB,OAAA,KAAmC;AACjE,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,GAAA,CAAI,UAAU,wDAAwD,CAAA;AAAA,MACxE,GAAG,GAAM,CAAA;AACT,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA;AAAA,MACf,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,OAAO,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,SAAA,KAAsB,KAAA,CAAM,SAAS,SAAS,CAAA;AAAA,IACzD,SAAA,EAAW,MAAM,KAAA,CAAM,SAAA,EAAU;AAAA,IACjC,MAAM,CAAC,KAAA,EAAe,SAAkB,KAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IAC9D,QAAA,EAAU,CAAC,GAAA,KAAgB,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,IAC7C,UAAU,CAAC,GAAA,EAAa,UAAmB,KAAA,CAAM,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACpE,UAAU,CAAC,IAAA,KAAiB,MAAM,QAAA,CAAS,2BAAA,CAA4B,IAAI,CAAC,CAAA;AAAA,IAC5E,WAAW,CAAC,IAAA,EAAc,IAAA,EAA4B,QAAA,GAAW,4BAA4B,OAAA,KAAkB;AAC7G,MAAA,OAAO,MAAM,SAAA,CAAU,2BAAA,CAA4B,IAAI,CAAA,EAAG,IAAA,EAAM,UAAU,OAAO,CAAA;AAAA,IACnF,CAAA;AAAA,IACA,UAAU,CAAC,IAAA,KAAiB,MAAM,QAAA,CAAS,2BAAA,CAA4B,IAAI,CAAC,CAAA;AAAA,IAC5E,aAAa,CAAC,IAAA,KAAiB,MAAM,WAAA,CAAY,2BAAA,CAA4B,IAAI,CAAC,CAAA;AAAA,IAClF,YAAY,CAAC,IAAA,KAAiB,MAAM,UAAA,CAAW,2BAAA,CAA4B,IAAI,CAAC,CAAA;AAAA,IAChF,WAAW,CAAC,IAAA,KAAiB,MAAM,SAAA,CAAU,2BAAA,CAA4B,IAAI,CAAC,CAAA;AAAA,IAC9E,WAAW,CAAC,IAAA,KAAiB,MAAM,SAAA,CAAU,2BAAA,CAA4B,IAAI,CAAC,CAAA;AAAA,IAC9E,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA,EAAa;AAAA,IACvC,SAAA,EAAW,CAAC,OAAA,KAAoB,KAAA,CAAM,UAAU,OAAO,CAAA;AAAA,IACvD,SAAA,EAAW,CAAC,OAAA,KAAoB,KAAA,CAAM,UAAU,OAAO,CAAA;AAAA,IACvD,kBAAkB,CAAC,IAAA,KAAiB,MAAM,gBAAA,CAAiB,2BAAA,CAA4B,IAAI,CAAC;AAAA,GAC9F;AACF;AAEO,IAAM,aAAA,GAAN,cAA+D,aAAA,CAAmB;AAAA,EAC/E,iBAAA,GAAmC,IAAA;AAAA,EACnC,UAAA,uBAAiC,GAAA,EAAI;AAAA,EACrC,cAAA,uBAAqC,GAAA,EAAI;AAAA,EACzC,UAAA;AAAA,EACA,iBAAA,GAAoB,KAAA;AAAA,EACpB,sBAAA,GAAiD,IAAA;AAAA,EACjD,WAAA,GAAc,KAAA;AAAA,EACd,oBAAA,uBAAyE,GAAA,EAAI;AAAA,EAErF,WAAA,CAAY,KAAyB,GAAA,EAAU;AAC7C,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAGd,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,GAAG,CAAA;AAGpC,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA;AAAA,MACd,OAAO,MAAA,EAAgB,IAAA,EAA2B,MAAA,KAAoB;AACpE,QAAA,QAAQ,MAAA;AAAQ,UACd,KAAK,aAAA;AACH,YAAA,MAAM,IAAA,CAAK,WAAA;AAAA,cACT,IAAA,CAAK,QAAA;AAAA,cACL,IAAA,CAAK,OAAA;AAAA,cACL,IAAA,CAAK,gBAAA;AAAA,cACL,IAAA,CAAK,IAAA;AAAA,cACL,KAAK,eAAA,IAAmB;AAAA,aAC1B;AACA,YAAA;AAAA,UACF,KAAK,gBAAA;AACH,YAAA,MAAM,IAAA,CAAK,cAAA;AAAA,cACT,IAAA,CAAK,QAAA;AAAA,cACL,IAAA,CAAK,OAAA;AAAA,cACL,IAAA,CAAK,IAAA;AAAA,cACL,IAAA,CAAK,WAAA;AAAA,cACL,IAAA,CAAK,SAAA;AAAA,cACL,IAAA,CAAK;AAAA,aACP;AACA,YAAA;AAAA,UACF,KAAK,eAAA;AACH,YAAA,MAAM,KAAK,aAAA,CAAc,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,EAAO,KAAK,aAAa,CAAA;AAChE,YAAA;AAAA,UACF,KAAK,WAAA;AACH,YAAA,MAAM,IAAA,CAAK,cAAc,IAAA,CAAK,UAAA,EAAY,KAAK,UAAA,EAAY,IAAA,CAAK,UAAU,MAAM,CAAA;AAChF,YAAA;AAAA,UACF,KAAK,mBAAA;AACH,YAAA,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,QAAA,EAAU,KAAK,IAAI,CAAA;AACvD,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA;AAC/C,MACF;AAAA,KACF;AAIA,IAAA,MAAM,OAAA,GAAU,IAAI,aAAA,EAAc;AAClC,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,MAAM,UAAA,GAAa,GAAG,qBAAA,EAAsB;AAC5C,MAAA,IAAI,UAAA,EAAY,SAAS,KAAA,EAAO;AAC9B,QAAA,IAAA,CAAK,UAAA,CAAW,IAAI,EAAE,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,UAAA,EAAY,IAAA,KAAS,SAAA,EAAW;AACzC,QAAA,IAAA,CAAK,cAAA,CAAe,IAAI,EAAE,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,KAAA,GAA4C;AAC1C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,KAAA,GAA4C;AAC1C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,GAA6C;AAC3C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,GAA8C;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,GAA6C;AAC3C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAA,GAA8C;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAA,GAAgB;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,UAAU,IAAA,EAA4B;AAE1C,IAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,CAAC,SAAA,EAAW,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AACtD,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAE1B,MAAA,IAAI,GAAA,EAAK,YAAY,SAAA,EAAW;AAC9B,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA;AAClC,QAAA,IAAI,GAAA,EAAK;AAEP,UAAA,IAAI,GAAA,CAAI,MAAA,GAAS,SAAS,CAAA,EAAG;AAC3B,YAAA,OAAO,MAAM,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAE;AAAA,UACrC;AAGA,UAAA,MAAMC,eAAAA,GAAiB,KAAK,MAAA,EAAO;AACnC,UAAA,MAAMC,aAAAA,GAAeD,gBAAe,SAAS,CAAA;AAC7C,UAAA,IAAIC,aAAAA,EAAc;AAChB,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAA6B,SAAS,CAAA,uCAAA,CAAyC,CAAA;AAC3F,YAAA,OAAO,MAAMA,aAAAA,EAAa;AAAA,UAC5B;AAEA,UAAA,MAAM,IAAI,MAAM,CAAA,iBAAA,EAAoB,IAAI,YAAY,SAAS,CAAA,wBAAA,EAA2B,SAAS,CAAA,sBAAA,CAAwB,CAAA;AAAA,QAC3H;AAAA,MACF;AAIA,MAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,EAAO;AACnC,MAAA,MAAM,YAAA,GAAe,eAAe,IAAI,CAAA;AACxC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,MAAM,YAAA,EAAa;AAAA,MAC5B;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5C;AAGA,IAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO;AAC7B,IAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA0B;AACxB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,IAAA,EAA4B;AAG3C,IAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,CAAC,SAAA,EAAW,UAAU,CAAA,GAAI,mBAAmB,IAAI,CAAA;AACvD,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+B,IAAI,gBAAgB,SAAS,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAE,CAAA;AAErG,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAAA,MAC9E;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,6BAAA,CAA+B,CAAA;AAAA,MAC1E;AACA,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,cAAc,SAAS,CAAA,wBAAA,EAA2B,MAAA,CAAO,IAAA,CAAK,IAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACnI;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,GAAU,UAAU,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,UAAA,EAAa,UAAU,2BAA2B,SAAS,CAAA,sBAAA,EAAyB,OAAO,IAAA,CAAK,GAAA,CAAI,WAAW,EAAE,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC1K;AACA,MAAA,OAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAA,EAAE;AAAA,IACvC;AAGA,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,EAAQ;AAC9B,IAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA2B;AACzB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,IAAA,EAA4B;AAE1C,IAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,CAAC,SAAA,EAAW,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AACtD,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAA6B,IAAI,CAAA,aAAA,EAAgB,SAAS,gBAAgB,SAAS,CAAA,qBAAA,EAAwB,GAAA,EAAK,QAAA,GAAW,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,GAAI,WAAW,CAAA,CAAE,CAAA;AAEhL,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAAA,MAC7E;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,6BAAA,CAA+B,CAAA;AAAA,MACzE;AACA,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,cAAc,SAAS,CAAA,wBAAA,EAA2B,MAAA,CAAO,IAAA,CAAK,IAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAClI;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,MAAA,GAAS,SAAS,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,SAAA,EAAY,SAAS,2BAA2B,SAAS,CAAA,qBAAA,EAAwB,OAAO,IAAA,CAAK,GAAA,CAAI,UAAU,EAAE,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACrK;AACA,MAAA,OAAO,MAAM,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAE;AAAA,IACrC;AAGA,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,EAAO;AACjC,IAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA0B;AACxB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAA4B;AAG3C,IAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,CAAC,SAAA,EAAW,UAAU,CAAA,GAAI,mBAAmB,IAAI,CAAA;AACvD,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAE1B,MAAA,IAAI,GAAA,EAAK,YAAY,SAAA,EAAW;AAC9B,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA;AAClC,QAAA,IAAI,GAAA,EAAK,OAAA,GAAU,UAAU,CAAA,EAAG;AAC9B,UAAA,OAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAA,EAAE;AAAA,QACvC;AAGA,QAAA,MAAMA,aAAAA,GAAe,IAAA,CAAK,OAAA,EAAQ,CAAE,IAAI,CAAA;AACxC,QAAA,IAAIA,aAAAA,EAAc;AAChB,UAAA,OAAO,MAAMA,aAAAA,EAAa;AAAA,QAC5B;AAEA,QAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,IAAI,aAAa,UAAU,CAAA,wBAAA,EAA2B,SAAS,CAAA,sBAAA,CAAwB,CAAA;AAAA,MAC9H;AAGA,MAAA,MAAMA,aAAAA,GAAe,IAAA,CAAK,OAAA,EAAQ,CAAE,IAAI,CAAA;AACxC,MAAA,IAAIA,aAAAA,EAAc;AAChB,QAAA,OAAO,MAAMA,aAAAA,EAAa;AAAA,MAC5B;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,EAAQ,CAAE,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,MAAM,YAAA,EAAa;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA2B;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAY,MAAA,CAAO,KAAK,IAAA,CAAK,OAAA,EAAS,CAAC,CAAA;AACzD,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,IAAA,MAAM,WAAW,GAAA,EAAK,QAAA;AAEtB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACvD,QAAA,KAAA,MAAW,cAAc,MAAA,CAAO,IAAA,CAAK,IAAI,OAAA,IAAW,EAAE,CAAA,EAAG;AACvD,UAAA,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,CAAC,GAAG,KAAK,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,IAAA,EAA4B;AAGzC,IAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,CAAC,SAAA,EAAW,QAAQ,CAAA,GAAI,mBAAmB,IAAI,CAAA;AACrD,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,IAAI,CAAA,wBAAA,EAA2B,IAAI,gBAAgB,SAAS,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAE,CAAA;AAE7F,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAAA,MAC5E;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,6BAAA,CAA+B,CAAA;AAAA,MACxE;AACA,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,cAAc,SAAS,CAAA,wBAAA,EAA2B,MAAA,CAAO,IAAA,CAAK,IAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACjI;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,GAAQ,QAAQ,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,QAAA,EAAW,QAAQ,2BAA2B,SAAS,CAAA,oBAAA,EAAuB,OAAO,IAAA,CAAK,GAAA,CAAI,SAAS,EAAE,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAChK;AACA,MAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,EAAE;AAAA,IACnC;AAGA,IAAA,MAAM,WAAA,GAAc,KAAK,KAAA,EAAM;AAC/B,IAAA,MAAM,MAAA,GAAS,YAAY,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,QAAA,EAA2C;AACjE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACpE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC9D,IAAA,MAAM,cAAA,GAAiB,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAE5D,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACjD;AAGA,IAAA,OAAO;AAAA,MACL,IAAI,cAAA,CAAe,EAAA;AAAA,MACnB,UAAU,cAAA,CAAe,UAAA;AAAA;AAAA,MACzB,SAAS,cAAA,CAAe,OAAA;AAAA,MACxB,GAAA,EAAK,cAAA,CAAe,GAAA,IAAO,cAAA,CAAe,KAAA,IAAS,IAAA;AAAA,MACnD,SAAA,EAAW,eAAe,SAAA,IAAa,IAAA;AAAA,MACvC,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,YAAY,cAAA,CAAe,UAAA;AAAA,MAC3B,MAAA,EAAQ,eAAe,MAAA,IAAU,IAAA;AAAA,MACjC,UAAA,EAAY,eAAe,UAAA,IAAc,IAAA;AAAA,MACzC,YAAY,cAAA,CAAe;AAAA,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,yBAAA,CACJ,QAAA,EACA,MAAA,EACA,OAAA,EAC8B;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AACtD,IAAA,MAAM,EAAE,eAAA,EAAAC,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQA,gBAAAA,CAAgB,kBAAA,CAAmB,IAAA,EAAa,QAAQ,CAAA;AAEtE,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ;AAAA,MAChC,GAAG,OAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,EAAA,EAAI,uBAAuB,KAAK,CAAA;AAAA,QAChC,OAAO,yBAAA,EAA0B;AAAA,QACjC,OAAA,EAAS,4BAA4B,KAAK;AAAA,OAC5C;AAAA,MACA,OAAA,EAAS;AAAA,QACP,yBAAA,EAA2B,gCAAgC,KAAK;AAAA;AAClE,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,GAAA,CAAI,UAAU,iDAAiD,CAAA;AAAA,IACjE,GAAG,GAAM,CAAA;AAET,IAAA,MAAM,SAAS,MAAM,GAAA;AACrB,IAAA,YAAA,CAAa,OAAO,CAAA;AACpB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,yBAAA,CACJ,QAAA,EACA,MAAA,EACA,OAAA,EACA,cAAc,KAAA,EACgB;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AACtD,IAAA,MAAM,EAAE,eAAA,EAAAA,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQA,gBAAAA,CAAgB,kBAAA,CAAmB,IAAA,EAAa,QAAQ,CAAA;AAEtE,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,WAAA,GAAc;AAAA,MAC9C,GAAI,WAAW,EAAC;AAAA,MAChB,QAAQ,MAAM;AAAA,QACZ,OAAO,CAAA;AAEX,IAAA,OAAO,MAAM,GAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAsB,GAAA,EAAgC;AAC1D,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,IAAA,CAAK,0BAA0B,GAAG,CAAA;AAElC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MACxC,CAAA,qDAAA,CAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA;AACrB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,6BAAA,EAAgC,GAAG,CAAA,qBAAA,EAAwB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACnH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CAAS,GAAA,EAAa,KAAA,EAA+B;AACzD,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,IAAA,CAAK,0BAA0B,GAAG,CAAA;AAElC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,2CAA2C,GAAG,CAAA;AAC9E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,oBAAA,CAAqB,KAAK,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAOA,GAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,CAAK,KAAI,GAAI;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,OAAA,GAIb,EAAC,EAaF;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,MACjB,IAAA,CAAK,GAAA;AAAA,QACH,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,KAAA,IAAS,MAAA,CAAO,GAAG,CAAA,GACvC,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,IAAS,GAAG,CAAA,GAC/B,GAAA;AAAA,QACJ;AAAA,OACF;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AAAA,MAClB,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,IAAU,MAAA,CAAO,GAAG,CAAA,GACxC,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,IAAU,CAAC,CAAA,GAC9B,CAAA;AAAA,MACJ;AAAA,KACF;AACA,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,IAAY,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAK,GACrE,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAK,GACpB,IAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,SAAS,CAAA,wDAAA,CAAA,GAA6D,EAAA;AACpF,IAAA,MAAM,cAAc,MAAA,GAAS,CAAA,CAAA,EAAI,KAAK,qBAAA,CAAsB,MAAM,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AACzE,IAAA,MAAM,YAAY,WAAA,GAAc,CAAC,WAAA,EAAa,WAAW,IAAI,EAAC;AAC9D,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAC7C,+CAA+C,KAAK,CAAA,CAAA;AAAA,MACpD,GAAG;AAAA,KACL;AACA,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA,EAAQ,CAAE,CAAC,GAAG,KAAA,IAAS,CAAA;AAEjD,IAAA,MAAM,OAAA,GAAU,WAAA,GACZ,CAAC,WAAA,EAAa,WAAA,EAAa,OAAO,MAAM,CAAA,GACxC,CAAC,KAAA,EAAO,MAAM,CAAA;AAClB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAK5C;AAAA;AAAA;AAAA,MAAA,EAGE,KAAK;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAIP,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,SAAS,UAAA,CAAW,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC/C,MAAA,IAAI;AACF,QAAA,OAAO;AAAA,UACL,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAAA,UAC3B,YAAY,GAAA,CAAI,KAAA;AAAA,UAChB,IAAA,EAAM,IAAI,KAAA,CAAM,MAAA;AAAA,UAChB,WAAW,GAAA,CAAI;AAAA,SACjB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAO;AAAA,UACL,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,KAAA,EAAO,IAAA;AAAA,UACP,YAAY,GAAA,CAAI,KAAA;AAAA,UAChB,IAAA,EAAM,IAAI,KAAA,CAAM,MAAA;AAAA,UAChB,WAAW,GAAA,CAAI,UAAA;AAAA,UACf,YAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SACnE;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,QAAQ,MAAA,EAAO;AAAA,EAChD;AAAA,EAEQ,0BAA0B,GAAA,EAAmB;AACnD,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAAA,EACF;AAAA,EAEQ,sBAAsB,KAAA,EAAuB;AACnD,IAAA,OAAO,MAAM,OAAA,CAAQ,SAAA,EAAW,CAAC,KAAA,KAAU,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACzD;AAAA,EAEQ,qBAAqB,KAAA,EAAwB;AACnD,IAAA,IAAA,CAAK,iCAAA,CAAkC,KAAA,EAAO,GAAA,kBAAK,IAAI,SAAiB,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEQ,iCAAA,CACN,KAAA,EACA,IAAA,EACA,IAAA,EACM;AACN,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,QAAQ,OAAO,KAAA;AAAO,MACpB,KAAK,QAAA;AAAA,MACL,KAAK,SAAA;AACH,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,QACnE;AACA,QAAA;AAAA,MACF,KAAK,QAAA,EAAU;AACb,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACnB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,mCAAA,CAAqC,CAAA;AAAA,QAC9E;AACA,QAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAEd,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,YAAA,IAAA,CAAK,iCAAA,CAAkC,MAAM,CAAC,CAAA,EAAG,GAAG,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA,EAAK,IAAI,CAAA;AAAA,UACxE;AACA,UAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AAC7C,QAAA,IAAI,SAAA,KAAc,MAAA,CAAO,SAAA,IAAa,SAAA,KAAc,IAAA,EAAM;AACxD,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,2CAAA,CAA6C,CAAA;AAAA,QACtF;AAEA,QAAA,IAAI,MAAA,CAAO,qBAAA,CAAsB,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAClD,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAAA,QACtE;AAEA,QAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AACrF,UAAA,IAAA,CAAK,kCAAkC,UAAA,EAAY,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA;AAAA,QAChF;AACA,QAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,QAAA;AAAA,MACF;AAAA,MACA;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,0BAAA,CAA4B,CAAA;AAAA;AACvE,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,QAAA,CAAS,QAAA,EAAkB,SAAA,EAAkC;AACjE,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAG/B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO;AAC3B,IAAA,IAAI,CAAC,MAAA,CAAO,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAE,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AAAA,MACpB,aAAA;AAAA,MACA;AAAA,QACE,QAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACX;AAAA,MACA;AAAA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,SAAA,EAAqD;AAC7E,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MACxC,CAAA,yEAAA;AAAA,KACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS,IAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,SAAqC,EAAC;AAAA,IACxE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,OAAA,EAAiD;AACjF,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,oEAAA,CAAA;AAAA,MACA,IAAA,CAAK,UAAU,OAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,MAAM,mBAAA,CAAoB,SAAA,EAAmB,KAAA,EAA6C;AACxF,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,mBAAA,CAAoB,EAAE,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,QAAQ,MAAA,CAAO,CAAC,aAAa,QAAA,CAAS,SAAA,KAAc,MAAM,SAAS,CAAA;AAChF,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,IAAA,MAAM,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,yBAAA,CACJ,SAAA,EACA,SAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,mBAAA,CAAoB,EAAE,CAAA;AACjD,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AAClC,MAAA,IAAI,KAAA,CAAM,cAAc,SAAA,EAAW;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAO;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,mBAAA,CAAoB,SAAA,EAAmB,SAAA,EAAkC;AAC7E,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,mBAAA,CAAoB,EAAE,CAAA;AACjD,IAAA,MAAM,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,cAAc,SAAS,CAAA;AACpE,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AAClC,MAAA,MAAM,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAAA,EAA+B;AACtD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,IAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,IAAA;AAAA,EAC9C;AAAA,EAEQ,kBAAkB,KAAA,EAAgC;AACxD,IAAA,OAAO,OAAO,KAAA,KAAU,SAAA,GAAY,KAAA,GAAQ,IAAA;AAAA,EAC9C;AAAA,EAEQ,sBAAsB,IAAA,EAA8B;AAC1D,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA;AAAA,MACnB,CAAC,GAAA,KAAuB,OAAO,QAAQ,QAAA,IAAY,GAAA,CAAI,WAAW,OAAO;AAAA,KAC3E;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,EAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK;AACtE,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,IAAA;AAAA,EACpC;AAAA,EAEQ,qBAAqB,KAAA,EAAyD;AACpF,IAAA,MAAM,eAAA,GAAkB,KAAA;AAQxB,IAAA,OAAO;AAAA,MACL,eAAe,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAI,CAAA,IAAK,MAAM,IAAA,IAAQ,IAAA;AAAA,MAClE,cAAA,EAAgB,IAAA,CAAK,gBAAA,CAAiB,eAAA,CAAgB,KAAK,CAAA;AAAA,MAC3D,sBAAsB,IAAA,CAAK,gBAAA,CAAiB,MAAM,WAAW,CAAA,IAAK,MAAM,WAAA,IAAe,IAAA;AAAA,MACvF,iBAAiB,IAAA,CAAK,gBAAA,CAAiB,MAAM,MAAM,CAAA,IAAK,MAAM,MAAA,IAAU,IAAA;AAAA,MACxE,kBAAA,EAAoB,IAAA,CAAK,iBAAA,CAAkB,eAAA,CAAgB,SAAS,CAAA;AAAA,MACpE,iBAAA,EAAmB,IAAA,CAAK,iBAAA,CAAkB,eAAA,CAAgB,QAAQ,CAAA;AAAA,MAClE,oBAAA,EAAsB,IAAA,CAAK,gBAAA,CAAiB,eAAA,CAAgB,UAAU,CAAA;AAAA,MACtE,uBAAA,EAAyB,IAAA,CAAK,gBAAA,CAAiB,eAAA,CAAgB,YAAY;AAAA,KAC7E;AAAA,EACF;AAAA,EAEA,MAAc,kCACZ,WAAA,EACiD;AACjD,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAuC;AAC/D,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,WAAW,CAAC,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,SAAS,CAAA;AAGnC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,EAAE,CAAA;AAClD,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAClC,QAAA,WAAA,CAAY,IAAI,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,oBAAA,CAAqB,KAAK,CAAC,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,UAAU,MAAA,CAAO,CAAC,OAAO,CAAC,WAAA,CAAY,GAAA,CAAI,EAAE,CAAC,CAAA;AAChE,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,OAAO,WAAA;AAAA,IACT;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AAC/D,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAI,SAAS,CAAA;AASpD,MAAA,IAAI,OAAO,OAAA,CAAQ,SAAA,KAAc,UAAA,EAAY;AAC3C,QAAA,OAAO,WAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,UAAA,CAAW,GAAA,CAAI,OAAO,UAAA,KAAe;AACnC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,CAAW,UAAU,CAAA;AAClD,YAAA,IAAI,CAAC,MAAA,EAAQ;AACX,cAAA;AAAA,YACF;AAEA,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAA;AACzD,YAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,YAAA,IAAI,WAAA,GAA6B,IAAA;AAEjC,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,IAAI;AACF,gBAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC/C,gBAAA,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,KAAK,CAAA;AAClD,gBAAA,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,eAAe,CAAA;AAAA,cAC/D,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AAEA,YAAA,WAAA,CAAY,IAAI,UAAA,EAAY;AAAA,cAC1B,aAAA,EAAe,SAAA;AAAA,cACf,cAAA,EAAgB,UAAA;AAAA,cAChB,oBAAA,EAAsB,WAAA;AAAA,cACtB,eAAA,EACE,OAAO,MAAA,CAAO,UAAA,KAAe,WAAW,YAAA,GAAe,IAAA;AAAA,cACzD,kBAAA,EAAoB,IAAA;AAAA,cACpB,iBAAA,EAAmB,IAAA;AAAA,cACnB,oBAAA,EAAsB,IAAA,CAAK,qBAAA,CAAsB,MAAA,CAAO,IAAI,CAAA;AAAA,cAC5D,uBAAA,EAAyB;AAAA,aAC1B,CAAA;AAAA,UACH,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,CAAc,QAAA,EAAkB,OAAA,EAA+C;AACnF,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAE/B,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,KAAW,IAAA;AAClC,IAAA,MAAM,eAAe,OAAA,CAAQ,QAAA,GAAW,KAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA;AAE3E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA;AAAA,uDAAA,CAAA;AAAA,MAEA,EAAA;AAAA,MACA,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,OAAA;AAAA,MACR,SAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAS,CAAA,GAAI,CAAA;AAAA,MACb,IAAA;AAAA,MACA,CAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,QAAA,GAAoB;AAAA,MACxB,EAAA;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,UAAA,EAAY,SAAA;AAAA,MACZ,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA;AAAA,MACA,SAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,CAAA;AAAA,MACP,UAAU,OAAA,CAAQ;AAAA,KACpB;AAEA,IAAA,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAE9B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,QAAA,EAAkB,OAAA,EAA2C;AAC9E,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAE/B,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AACzB,IAAA,MAAM,kBAAkB,OAAA,CAAQ,WAAA,GAAc,KAAK,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAA,GAAI,IAAA;AACpF,IAAA,MAAM,eAAe,OAAA,CAAQ,QAAA,GAAW,KAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA;AAC3E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA;AAAA,0CAAA,CAAA;AAAA,MAEA,EAAA;AAAA,MACA,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,OAAA;AAAA,MACR,eAAA;AAAA,MACA,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAA;AAAA,MACrB,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,IAAA,GAAO,CAAA,EAAG;AACjC,MAAA,MAAM,KAAK,sCAAA,CAAuC;AAAA,QAChD,EAAA;AAAA,QACA,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,QACpC,MAAA,EAAQ,CAAC,CAAC,OAAA,CAAQ,MAAA;AAAA,QAClB,UAAA,EAAY,GAAA;AAAA,QACZ,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO,CAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,GAAI,OAAA,CAAQ,QAAA,IAAY,EAAC;AAAA,UACzB,MAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,WAAA,EAAa,IAAA,CAAK,6BAAA,CAA8B,YAAY;AAAA,OAC7D,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAS,GAAA,GAAM,GAAA;AAC7C,IAAA,MAAM,IAAA,CAAK,4BAAA,CAA6B,QAAA,EAAU,IAAI,CAAA;AAAA,EACxD;AAAA,EAEA,MAAc,mBAAA,GAAwC;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,OAOF;AACA,MAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,MAAA,GAAS,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0DAA0D,KAAK,CAAA;AAC7E,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,4BAAA,CACZ,QAAA,EACA,IAAA,EACe;AACf,IAAA,IAAI,MAAM,IAAA,CAAK,mBAAA,EAAoB,EAAG;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,WAAW,OAAA,CAAQ,mBAAA,EAAqB,EAAE,QAAA,EAAU,IAAA,IAAQ,CAAC,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAc,oBACZ,qBAAA,EACiB;AACjB,IAAA,IAAI,OAAO,qBAAA,KAA0B,QAAA,IAAY,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACjF,MAAA,OAAO,qBAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MACxC,CAAA,yFAAA;AAAA,KACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,CAAC,CAAA,EAAG,EAAA;AAC7B,IAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,CAAY,SAAS,CAAA,EAAG;AAC7D,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AACxC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,wFAAA,CAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,CAAK,KAAI,GAAI,GAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAA,EAAqE;AACzF,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAElC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,6DAAA,CAAA;AAAA,MACA,OAAO,YAAY;AAAA,KACrB;AACA,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,+DAAA;AAAA,KACF;AAEA,IAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,MAAA,IAAA,CAAK,uBAAuB,KAAA,EAAM;AAAA,IACpC;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACpE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC9D,IAAA,MAAM,aAAa,YAAA,CAAa,QAAA,EAAU,EAAE,UAAA,EAAY,cAAc,CAAA;AAEtE,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AACxD,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,WAAW,MAAM,CAAA;AAC3E,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,IAAI,QAAQ,CAAA;AAC7D,QAAA,MAAM,UAAA,CAAW,yBAAA,CAA0B,UAAA,CAAW,MAAA,EAAQ,UAAU,YAAY,CAAA;AAAA,MACtF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,4EAA4E,KAAK,CAAA;AAAA,MACjG;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,YAAA,EAAa;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,eACJ,QAAA,EACA,UAAA,EACA,YACA,OAAA,GAAkB,CAAA,EAClB,OAAA,GAA2C,EAAC,EAC3B;AACjB,IAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAE,CAAA;AAAA,IACnD;AAGA,IAAA,OAAO,KAAK,UAAA,CAAW,OAAA;AAAA,MACrB,WAAA;AAAA,MACA,EAAE,UAAA,EAAY,UAAA,EAAY,QAAA,EAAS;AAAA,MACnC,OAAA;AAAA,MACA,EAAE,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,IAAA;AAAK,KAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,IAAA,EAAuB;AAC1C,IAAA,MAAM,cAAA,GAAiB,KAAK,OAAA,EAAQ;AACpC,IAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,CAAC,SAAA,EAAW,UAAU,CAAA,GAAI,mBAAmB,IAAI,CAAA;AACvD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,QAAA,OAAO,QAAQ,GAAA,EAAK,QAAA,GAAW,SAAS,CAAA,EAAG,OAAA,GAAU,UAAU,CAAC,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAoB,IAAA,EAMtB;AACF,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,IAAI,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAA8D;AACjF,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,WAAA,EAAqD;AACtE,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,WAAW,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,qBAAA,CAAsB,EAAA,EAAY,UAAA,GAAiC,OAAA,EAA2B;AAClG,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,qBAAA,CAAsB,EAAA,EAAI,UAAU,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,cAAA,GAAgC;AAE5C,IAAA,IAAI,IAAA,CAAK,sBAAsB,qBAAA,EAAuB;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAEpD,IAAA,IAAI,iBAAiB,qBAAA,EAAuB;AAC1C,MAAA,MAAM,IAAA,CAAK,cAAc,cAAc,CAAA;AAAA,IACzC;AAGA,IAAA,IAAA,CAAK,iBAAA,GAAoB,qBAAA;AAEzB,IAAA,IACE,CAAC,IAAA,CAAK,iBAAA,IACN,OAAO,IAAA,CAAK,UAAA,CAAW,yBAAyB,UAAA,EAChD;AACA,MAAA,MAAM,IAAA,CAAK,WAAW,oBAAA,EAAqB;AAC3C,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBAAA,GAAqC;AACjD,IAAA,IAAI;AAGF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAI,KAEvC,CAAA,gEAAA,CAAkE,CAAA;AAErE,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAE5B,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA;AACtB,QAAA,MAAM,SACJ,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,QAAA,CAAS,OAAiB,EAAE,CAAA;AAClE,QAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAK,MAAA,GAAoB,CAAA;AAAA,MACxD;AAEA,MAAA,OAAO,CAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAc,WAAA,EAAoC;AAC9D,IAAA,KAAA,MAAWN,eAAa,UAAA,EAAY;AAClC,MAAA,IAAIA,WAAAA,CAAU,UAAU,WAAA,EAAa;AACnC,QAAA,MAAMA,WAAAA,CAAU,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,OAAA,EAAqC;AAC/C,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI,4BAAA,CAA6B,OAAO,CAAA,EAAG;AACzC,MAAA,OAAO,gCAAA,CAAiC,IAAA,CAAK,oBAAA,EAAsB,OAAO,CAAA;AAAA,IAC5E;AAGA,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,IAAI,aAAA,EAAe,WAAA,EAAY,KAAM,WAAA,EAAa;AAEhD,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AACpC,QAAA,OAAO,IAAA,CAAK,+BAA+B,OAAO,CAAA;AAAA,MACpD,CAAA,MAAO;AAEL,QAAA,OAAO,IAAA,CAAK,2BAA2B,OAAO,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,CAAS,kCAAA,EAAoC,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EACzE;AAAA,EAEA,2BAAA,CACE,OACA,MAAA,EACM;AACN,IAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAAA,EAC7C;AAAA,EAEA,8BAA8B,KAAA,EAAqB;AACjD,IAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,uBAAA,CACJ,KAAA,EACA,UAAA,EACA,WAAA,EACkB;AAClB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,KAAK,CAAA;AAClD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,WAAW,CAAA;AACvD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,KAAA,GAAQ,KAAA;AACd,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,MAAM,OAAO,KAAA,EAAO,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,OAAA;AAAA,UACrD,OAAA,EAAS,OAAO,KAAA,EAAO,OAAA,KAAY,WAAW,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UAC1E,OAAO,OAAO,KAAA,EAAO,KAAA,KAAU,QAAA,GAAW,MAAM,KAAA,GAAQ;AAAA;AAC1D,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CACJ,QAAA,EACA,OAAA,EACA,kBACA,IAAA,EACmB;AACnB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,mBAAA,EAAoB;AAG/B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA;AAAA,QACpC,aAAA;AAAA,QACA;AAAA,UACE,QAAA;AAAA,UACA,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,IAAA;AAAA,UACA,eAAA,EAAiB;AAAA,SACnB;AAAA,QACA;AAAA;AAAA,OACF;AAIA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd;AAAA,UACE,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA;AAAA,UACA,OAAA,EACE;AAAA,SACJ;AAAA,QACA,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,2BAAA,EAA4B;AAAA,QACtD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAA,CACJ,QAAA,EACA,OAAA,EACA,kBACA,IAAA,EAOC;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAE/B,IAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,IAAA,MAAM,yBAA0B,IAAA,CAAa,iBAAA;AAC7C,IAAA,IAAI,OAAO,2BAA2B,UAAA,EAAY;AAChD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,CAAuB,IAAA,CAAK,MAAM,QAAQ,CAAA;AACjE,QAAA,cAAA,GAAiB,UAAU,MAAA,IAAU,IAAA;AAAA,MACvC,CAAA,CAAA,MAAQ;AACN,QAAA,cAAA,GAAiB,IAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,MAAM,uBAAA,GAA0B,OAAO,IAAA,KAA8C;AACnF,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,yCAA0C,IAAA,CAC7C,iCAAA;AACH,MAAA,IAAI,OAAO,2CAA2C,UAAA,EAAY;AAChE,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,MAAM,sCAAA,CAAuC,IAAA;AAAA,UAC3C,IAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AACxC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,WAAA;AAAA,MAC5B,QAAA;AAAA,MACA,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,2BAAA,CAA4B,OAAO,CAAA;AACxE,IAAA,MAAM,uBAAuB,iBAAA,CAAkB,IAAA;AAC/C,IAAA,MAAM,uBAAA,GAA0B,iBAAA,CAAkB,GAAA,CAAI,IAAA,GAAO,CAAA;AAE7D,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAOnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAQA;AAAA,KACF;AACA,IAAA,IAAI,GAAA,GAAM,iBAAA,CAAkB,OAAA,EAAQ,CAAE,CAAC,CAAA,IAAK,IAAA;AAE5C,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAA;AACzD,IAAA,IAAI,mBAAA,GAAsB,KAAA;AAC1B,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,MAAM,eAAe,gBAAA,CAAiB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9D,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAOhD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAMiB,YAAY,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,QAI7B,kBAAA;AAAA,QACA,GAAG;AAAA,OACL;AACA,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,OAAA,EAAQ,CAAE,CAAC,CAAA;AAC9C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,GAAA,GAAM,WAAA;AACN,QAAA,mBAAA,GAAsB,IAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAOrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,OAOF;AACA,MAAA,GAAA,GAAM,mBAAA,CAAoB,OAAA,EAAQ,CAAE,CAAC,CAAA,IAAK,IAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,MAAM,wBAAwB,SAAS,CAAA;AACvC,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAO,IAAA,CAAK,kCAAA,CAAmC,UAAU,CAAA;AAAA,UACzD,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAEA,MAAA,MAAM,wBAAwB,QAAQ,CAAA;AACtC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,MAAA,EAAQ,qBAAA;AAAA,QACR,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GACJ,2BAA2B,CAAC,mBAAA,GACxB,SACA,IAAA,CAAK,uBAAA,CAAwB,IAAI,WAAW,CAAA;AAElD,IAAA,MAAM,qBAAA,GACJ,GAAA,CAAI,IAAA,KAAS,MAAA,IACb,CAAC,CAAC,GAAA,CAAI,IAAA,IACN,oBAAA,CAAqB,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,MAAM,kCACJ,mBAAA,IACA,GAAA,CAAI,IAAA,KAAS,MAAA,IACb,CAAC,CAAC,GAAA,CAAI,IAAA,IACN,iBAAA,CAAkB,IAAI,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,IAClC,IAAI,WAAA,KAAgB,OAAA;AAEtB,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,MAAM,wBAAwB,SAAS,CAAA;AACvC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,IAAI,OAAA,IAAW,oCAAA;AAAA,QACtB,WAAA;AAAA,QACA,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,gBAAgB,OAAA,EAAS;AACtD,MAAA,MAAM,wBAAwB,SAAS,CAAA;AACvC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,IAAI,OAAA,IAAW,2BAAA;AAAA,QACtB,WAAA;AAAA,QACA,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,IAAI,uBAAA,IAA2B,CAAC,+BAAA,EAAiC;AAC/D,MAAA,MAAM,wBAAwB,SAAS,CAAA;AACvC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,IAAA,CAAK,kCAAA,CAAmC,UAAU,CAAA;AAAA,QACzD,WAAA,EAAa,MAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAEA,IAAA,MAAM,wBAAwB,QAAQ,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,IAAI,OAAA,IAAW,qBAAA;AAAA,MACvB,WAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,CACJ,QAAA,EACA,OAAA,EACA,IAAA,GAAe,QACf,WAAA,EACmB;AACnB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,mBAAA,EAAoB;AAE/B,MAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AACpC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAG9B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA;AAAA,QACpC,gBAAA;AAAA,QACA;AAAA,UACE,QAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA;AAAA;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA,EAAa,IAAA,CAAK,uBAAA,CAAwB,WAAA,IAAe,IAAI,CAAA,IAAK,IAAA;AAAA,QAClE,UAAA,EAAY,QAAA;AAAA,QACZ,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,KAAA;AAAA,QACR,QAAA,EAAU;AAAA,UACR,MAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAc,QAAA;AAAA,UACd,YAAA,EAAc,aAAA;AAAA,UACd,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAID,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd;AAAA,UACE,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EACE;AAAA,SACJ;AAAA,QACA,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,yBAAA,EAA0B;AAAA,QACpD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAA+B;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QACxC,CAAA,uDAAA;AAAA,OACF;AACA,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,MAAA,OAAO,KAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,CAAC,EAAE,KAAA,KAAU,MAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0DAA0D,KAAK,CAAA;AAC7E,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAA2C;AAC7D,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QACxC,CAAA,kEAAA;AAAA,OACF;AACA,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,MAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,CAAC,IAAA,CAAK,CAAC,EAAE,KAAA,EAAO;AACvC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,KAAK,CAAA;AACnC,MAAA,OAAO,OAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA;AAAA,IAC1D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gEAAgE,KAAK,CAAA;AACnF,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,mBAAA,GAAqC;AACjD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA;AAC9C,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,MAAc,wBAAA,GAQJ;AACR,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MASxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,KAOF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAAA,EACrC;AAAA,EAEA,MAAc,4BAA4B,SAAA,EAIvC;AACD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC/C,MAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,QAAA,CAAS,KAAK,CAAA;AACtE,MAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,QAAA,CAAS,KAAK,CAAA;AACtE,MAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,MAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,MAAA,IAAI,YAAA,CAAa,KAAK,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,MACrC;AACA,MAAA,IAAI,YAAA,CAAa,KAAK,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,MACrC;AACA,MAAA,IAAI,YAAA,CAAa,KAAK,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,MACrC;AACA,MAAA,IAAI,YAAA,CAAa,KAAK,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,MACrC;AAEA,MAAA,MAAM,GAAA,uBAAU,GAAA,CAAY,CAAC,GAAG,IAAA,EAAM,GAAG,IAAI,CAAC,CAAA;AAC9C,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,GAAA,EAAI;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,IAAA,kBAAM,IAAI,GAAA,EAAY,EAAG,IAAA,kBAAM,IAAI,GAAA,EAAY,EAAG,GAAA,kBAAK,IAAI,GAAA,EAAY,EAAE;AAAA,IACpF;AAAA,EACF;AAAA,EAEQ,wBAAwB,GAAA,EAAiD;AAC/E,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,MAAA,GAA6B,KAAA,CAAA;AAAA,IAC/D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,6BAA6B,GAAA,EAAmC;AAC5E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,uBAAA,CAAwB,GAAG,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,IAAI,IAAA,EAAM;AACZ,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,SAAA,EAAqC;AACrE,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CACvC,IAAA;AAAA,MACC,CAAA,sDAAA,CAAA;AAAA,MACA;AAAA,MAED,OAAA,EAAQ;AAEX,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,MAAM,IAAA,CAAK,4BAAA,CAA6B,GAAA,CAAI,WAAW,CAAA;AACvD,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,sCAAA,CAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AACA,MAAA,SAAA,GAAY,IAAA;AAAA,IACd;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CACtC,IAAA;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAUA,SAAA;AAAA,MACA;AAAA,MAED,OAAA,EAAQ;AAEX,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAChC,QAAA,IAAI,OAAO,IAAA,CAAK,WAAA,KAAgB,QAAA,EAAU;AACxC,UAAA,MAAM,IAAA,CAAK,4BAAA,CAA6B,IAAA,CAAK,WAAW,CAAA;AAAA,QAC1D;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,wDAAwD,KAAK,CAAA;AAAA,MAC7E;AACA,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,2DAAA,CAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AACA,MAAA,SAAA,GAAY,IAAA;AAAA,IACd;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,GAAA,EAAyD;AACpF,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,OAAO,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAChE,MAAA,GACA,KAAA,CAAA;AAAA,IACN,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,8BAA8B,GAAA,EAAmC;AACvE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,GAAG,CAAA;AAC9C,IAAA,MAAM,KAAA,GACJ,OAAO,QAAA,EAAU,WAAA,KAAgB,QAAA,GAC7B,QAAA,CAAS,WAAA,GACT,OAAO,QAAA,EAAU,UAAA,KAAe,QAAA,GAC9B,QAAA,CAAS,UAAA,GACT,IAAA;AACR,IAAA,OAAO,KAAA,IAAS,MAAM,IAAA,EAAK,CAAE,SAAS,CAAA,GAAI,KAAA,CAAM,MAAK,GAAI,IAAA;AAAA,EAC3D;AAAA,EAEA,MAAc,oCAAA,CACZ,SAAA,EACA,iBAAA,EASQ;AACR,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA;AAC9C,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAChD,CAAA,+CAAA,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,aAAA,GAAgB,cAAA,CAAe,OAAA,EAAQ,CAAE,CAAC,GAAG,KAAA,IAAS,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,eAAe,SAAA,CAAU,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACvD,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAShD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAMiB,YAAY,CAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,MAI7B,aAAA;AAAA,MACA,GAAG;AAAA,KACL;AAEA,IAAA,OAAO,cAAA,CAAe,OAAA,EAAQ,CAAE,CAAC,CAAA,IAAK,IAAA;AAAA,EACxC;AAAA,EAEQ,sBAAsB,IAAA,EAA6B;AACzD,IAAA,MAAM,UAAA,GAAa,KAAK,WAAA,EAAY;AACpC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,IAAA,IAAI,UAAA,CAAW,SAAS,MAAM,CAAA,IAAK,WAAW,QAAA,CAAS,OAAO,GAAG,OAAO,YAAA;AACxE,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,YAAA;AACzC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,eAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,QAAA,EAAoD;AAC/E,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,UAAA,GAAa,SAAS,WAAA,EAAY;AACxC,IAAA,IAAI,UAAA,KAAe,cAAc,OAAO,KAAA;AACxC,IAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,IAAA,IAAI,UAAA,KAAe,cAAc,OAAO,MAAA;AACxC,IAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,IAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,IAAA,IAAI,UAAA,KAAe,iBAAiB,OAAO,KAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,IAAA,IAAI,UAAA,KAAe,EAAA,IAAM,UAAA,KAAe,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,EACxC;AAAA,EAEQ,iBAAiB,KAAA,EAAuB;AAC9C,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,EAAI,IAAK,OAAA;AACjE,IAAA,MAAM,UAAU,WAAA,CACb,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,OAAA,CAAQ,kBAAA,EAAoB,GAAG,CAAA,CAC/B,QAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,YAAY,EAAE,CAAA;AACzB,IAAA,OAAO,OAAA,IAAW,OAAA;AAAA,EACpB;AAAA,EAEQ,cAAc,KAAA,EAAqD;AACzE,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA;AACrC,IAAA,IAAI,OAAA,IAAW,CAAA,IAAK,OAAA,KAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AAChD,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,IAAA,EAAK;AAAA,IAClC;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAAA,MAC5B,KAAK,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,CAAC,EAAE,WAAA;AAAY,KAC5C;AAAA,EACF;AAAA,EAEQ,yBAAA,CACN,cAAA,EACA,gBAAA,EACA,IAAA,EACQ;AACR,IAAA,MAAM,MAAA,GAAS,gBAAgB,IAAA,EAAK;AACpC,IAAA,IAAI,MAAA,IAAU,WAAW,0BAAA,EAA4B;AACnD,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAA,GAAW,kBAAkB,IAAA,EAAK;AACxC,IAAA,IAAI,QAAA,IAAY,aAAa,0BAAA,EAA4B;AACvD,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAA,IAAK,UAAU,QAAA,IAAY,0BAAA;AAAA,EACnE;AAAA,EAEQ,yBAAA,CACN,aAAA,EACA,QAAA,EACA,UAAA,EACQ;AACR,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,aAAa,CAAA;AACpD,IAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAI,GAAI,IAAA,CAAK,cAAc,QAAQ,CAAA;AACjD,IAAA,MAAM,WAAA,GACJ,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA,IAClC,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,qBAAA,CAAsB,UAAU,CAAC,CAAA,IAChE,KAAA;AACF,IAAA,MAAM,WAAW,GAAA,IAAO,WAAA;AACxB,IAAA,MAAM,cAAA,GAAA,CAAkB,IAAA,IAAQ,OAAA,EAAS,KAAA,CAAM,GAAG,EAAE,CAAA;AACpD,IAAA,MAAM,UAAU,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC9C,IAAA,OAAO,CAAA,aAAA,EAAgB,cAAc,CAAA,CAAA,EAAI,OAAO,IAAI,QAAQ,CAAA,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAc,0BAAA,CACZ,IAAA,EACA,YAAA,EAQA,WAAA,EAC0B;AAC1B,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,SAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,IAAI,CAAA;AAC/C,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC3C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,aAAa,UAAA,CAAW,IAAA;AAC9B,MAAA,MAAM,aAAA,GACJ,GAAA,CAAI,IAAA,IAAQ,UAAA,CAAW,IAAA,IAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,OAAA;AAC9D,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,aAAa,CAAA;AACvD,MAAA,MAAM,oBAAoB,IAAA,CAAK,yBAAA;AAAA,QAC7B,UAAA,CAAW,QAAA;AAAA,QACX,GAAA,CAAI,QAAA;AAAA,QACJ,GAAA,CAAI;AAAA,OACN;AACA,MAAA,MAAM,aAAa,IAAA,CAAK,yBAAA;AAAA,QACtB,WAAA;AAAA,QACA,iBAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AAEA,MAAA,IAAI,UAAA,GAAkB,IAAA;AAEtB,MAAA,IACE,UAAA,CAAW,OAAA,IACX,UAAA,CAAW,OAAA,KAAY,OAAA,EACvB;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,4BAAA;AAAA,UAC5B,GAAA,CAAI,IAAA;AAAA,UACJ;AAAA,SACF;AACA,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA;AAAA,QACF;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,SAAA;AAAA,UACrC,UAAA;AAAA,UACA,UAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA,YACE,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,GAAA,CAAI,KAAA;AAAA,YAC/B,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,GAAA,CAAI,MAAA;AAAA,YACjC,UAAU,UAAA,CAAW;AAAA;AACvB,SACF;AACA,QAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,IAAA,EAAM;AAC3C,UAAA,UAAA,GAAa,WAAA,CAAY,IAAA;AAAA,QAC3B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,IAAI,CAAA;AAC/C,QAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC3C,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,SAAA;AAAA,UACrC,UAAA;AAAA,UACA,UAAA,CAAW,IAAA;AAAA,UACX,iBAAA;AAAA,UACA;AAAA,YACE,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,GAAA,CAAI,KAAA;AAAA,YAC/B,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,GAAA,CAAI,MAAA;AAAA,YACjC,UAAU,UAAA,CAAW;AAAA;AACvB,SACF;AACA,QAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,IAAA,EAAM;AAC3C,UAAA,UAAA,GAAa,WAAA,CAAY,IAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,UAAU,IAAA,CAAK,yBAAA;AAAA,UACb,UAAA,CAAW,QAAA;AAAA,UACX,iBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,IAAA,EAAM,UAAA,CAAW,IAAA,IAAQ,GAAA,CAAI,IAAA;AAAA,QAC7B,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,SAAS,GAAA,CAAI,KAAA;AAAA,QACnD,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,UAAU,GAAA,CAAI;AAAA,OACvD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,4BAAA,CACZ,IAAA,EACA,UAAA,EACwB;AAGxB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC3C,IAAA,IAAI,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,IAAA,EAAM;AACzC,MAAA,OAAO,UAAA,CAAW,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,YAAY,OAAA,EAAS;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAQ,CAAA;AACrC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAY;AAC1C,MAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,oBAAoB,MAAA,EAA6B;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,KAAK,MAAM,CAAA;AAAA,EACpB;AAAA,EAEQ,oCACN,WAAA,EACQ;AACR,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAQ,WAAA,CACX,GAAA,CAAI,CAAC,UAAA,KAAe,WAAW,IAAI,CAAA,CACnC,MAAA,CAAO,CAAC,SAAS,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,SAAS,CAAC,CAAA;AAC/D,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,YAAA,GAAe,aAAA;AAClD,IAAA,OAAO;;AAAA,yCAAA,EAAgD,KAAK,CAAA;;AAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,EACtF;AAAA,EAEA,MAAc,iCAAA,CACZ,cAAA,EACA,IAAA,EACe;AACf,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAC/B,IAAA,MAAM,OAAA,GACJ,IAAA,KAAS,SAAA,GACL,sDAAA,GACA,8CAAA;AACN,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,WAAA,EAAa,gBAAA;AAAA,MACb,cAAA,EAAgB,gBAAA;AAAA,MAChB,YAAA,EAAc,IAAA;AAAA,MACd,gBAAA,EAAkB;AAAA,KACpB;AAEA,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,kHAAA,CAAA;AAAA,MACA,EAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,CAAA;AAAA,MACA,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,MACvB;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,MACpB,EAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,OAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,MAAA,EAAQ,IAAA;AAAA,MACR,QAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAAA,EAEQ,mCACN,UAAA,EACQ;AACR,IAAA,MAAM,MAAA,GACJ,UAAA,CAAW,UAAA,EAAY,IAAA,EAAK,IAC5B,yCAAA;AACF,IAAA,OACE,iDAAiD,MAAM,CAAA,qEAAA,CAAA;AAAA,EAG3D;AAAA,EAEA,MAAc,iCAAA,CACZ,QAAA,EACA,SAAA,EACA,cAAA,EACA,2BACA,UAAA,EACe;AACf,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,UAAA,CAAW,OAAA,EAAS;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,2BAAA,CAA4B,SAAS,CAAA;AAC1E,IAAA,MAAM,uBAAuB,iBAAA,CAAkB,IAAA;AAC/C,IAAA,MAAM,uBAAA,GAA0B,iBAAA,CAAkB,GAAA,CAAI,IAAA,GAAO,CAAA;AAE7D,IAAA,MAAM,qBAAA,GAAwB,uBAAA,GAC1B,MAAM,IAAA,CAAK,oCAAA;AAAA,MACT,yBAAA;AAAA,MACA,iBAAA,CAAkB;AAAA,KACpB,GACA,IAAA;AACJ,IAAA,MAAM,MAAA,GAAS,qBAAA,IAAyB,MAAM,IAAA,CAAK,wBAAA,EAAyB;AAC5E,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,uBAAA,EAAyB;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,EAAA,KAAO,yBAAA,IAA6B,CAAC,uBAAA,EAAyB;AACjF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,wBAAA,GACJ,CAAC,CAAC,MAAA,IACF,OAAO,IAAA,KAAS,MAAA,IAChB,CAAC,CAAC,OAAO,IAAA,IACT,iBAAA,CAAkB,GAAA,CAAI,GAAA,CAAI,OAAO,IAAI,CAAA;AACvC,IAAA,MAAM,qBAAA,GACJ,4BAA4B,CAAC,CAAC,OAAO,IAAA,IAAQ,oBAAA,CAAqB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AACnF,IAAA,MAAM,kCAAA,GACJ,wBAAA,IAA4B,MAAA,EAAQ,WAAA,KAAgB,OAAA;AACtD,IAAA,MAAM,+BAAA,GACJ,2BAA2B,CAAC,kCAAA;AAC9B,IAAA,MAAM,eAAA,GACJ,MAAA,EAAQ,WAAA,KAAgB,OAAA,IACxB,qBAAA,IACA,+BAAA;AAEF,IAAA,IAAI,OAAwB,EAAC;AAC7B,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,IAAA,GAAO,KAAK,uBAAA,CAAwB,qBAAA,EAAuB,WAAA,IAAe,IAAI,KAAK,EAAC;AAAA,IACtF,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,IAAA,GAAO,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,WAAW,KAAK,EAAC;AAAA,IAC9D;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,WAAW,cAAc,CAAA;AACxE,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,IAAI,QAAQ,CAAA;AAC7D,MAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,kCAAA;AAAA,QACrC,UAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,0BAAA;AAAA,QAC5B,IAAA;AAAA,QACA,UAAA;AAAA,QACA,iBAAiB,QAAQ,CAAA;AAAA,OAC3B;AAEA,MAAA,MAAM,aAAA,GACJ,kCACI,IAAA,CAAK,kCAAA,CAAmC,UAAU,CAAA,GACjD,MAAA,EAAQ,OAAA,KACR,eAAA,GACG,4BAAA,GACA,qBAAA,CAAA;AACV,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,mCAAA,CAAoC,UAAU,CAAA;AAC7E,MAAA,MAAM,cAAA,GAAiB,eAAA,GACnB,CAAA,qBAAA,EAAwB,QAAQ,CAAA;;AAAA,EAAgC,aAAa,CAAA,EAAG,iBAAiB,CAAA,CAAA,GACjG,wBAAwB,QAAQ,CAAA;;AAAA,EAA2C,aAAa,GAAG,iBAAiB,CAAA,CAAA;AAEhH,MAAA,IAAI,wBAAwB,UAAA,EAAY;AACtC,QAAA,MAAM,UAAA,CAAW,aAAa,cAAA,EAAgB;AAAA,UAC5C,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,cAAA;AAAA,UACT,WAAA,EAAa,UAAA;AAAA,UACb,MAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,EAAE,WAAA,EAAa,QAAA;AAAS,SACnC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,gBAAA,GAAmB,uBAAA;AACzB,MAAA,MAAM,UAAA,CAAW,yBAAA;AAAA,QACf,cAAA;AAAA,QACA,QAAA;AAAA,QACA,mBAAmB,YAAA,GAAe;AAAA,OACpC;AACA,MAAA,IAAI,wBAAwB,UAAA,EAAY;AACtC,QAAA,MAAM,IAAA,CAAK,iCAAA;AAAA,UACT,cAAA;AAAA,UACA,kBAAkB,SAAA,GAAY;AAAA,SAChC;AAAA,MACF;AACA,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,MACrC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oEAAoE,KAAK,CAAA;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,MAAc,kCAAA,CACZ,UAAA,EACA,cAAA,EACA,aAAA,EACkC;AAClC,IAAA,IAAI,OAAO,UAAA,CAAW,mBAAA,KAAwB,UAAA,EAAY;AACxD,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,mBAAA,CAAoB,cAAc,CAAA;AACnE,MAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,cAAc,aAAa,CAAA;AAG5E,MAAA,OAAO,UAAA,EAAY,mBAAA,KAAwB,UAAA,GAAa,UAAA,GAAa,UAAA;AAAA,IACvE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,GAA0B;AAC9B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,+DAAA;AAAA,OACF;AAGA,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,IAAA,CAAK,uBAAuB,KAAA,EAAM;AAAA,MACpC;AAGA,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AACzB,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAC9C,CAAA,yFAAA,CAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QACxC,CAAA,iLAAA,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,aAAa,GAAA,CAAI,WAAA;AAAA,UACjB,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,MAAA,EAAQ,QAAA;AAAA,UACR,iBAAiB,GAAA,CAAI,eAAA;AAAA,UACrB,uBAAuB,GAAA,CAAI;AAAA,SAC5B,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,uBAAA,GAA0B,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QACzD,CAAA,iIAAA;AAAA,OACF;AAEA,MAAA,KAAA,MAAW,UAAU,uBAAA,EAAyB;AAC5C,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,UAAoB,CAAA;AACxD,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,YAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAE1B,cAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,gBAChD,CAAA,gEAAA,CAAA;AAAA,gBACA,EAAA,CAAG;AAAA,eACL;AACA,cAAA,MAAM,SAAA,GAAY,eAAe,OAAA,EAAQ;AAEzC,cAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE1B,gBAAA,MAAM,cAAA,GAAiB,OAAO,UAAA,EAAW;AACzC,gBAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,kBACzB,CAAA,+HAAA,CAAA;AAAA,kBACA,cAAA;AAAA,kBACA,MAAA;AAAA,kBACA,2BAAA;AAAA,kBACA,EAAA,CAAG,EAAA;AAAA,kBACH,OAAA;AAAA,kBACA,GAAA;AAAA,kBACA,WAAA;AAAA,kBACA;AAAA,iBACF;AAGA,gBAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,kBACpB,EAAA,EAAI,cAAA;AAAA,kBACJ,IAAA,EAAM,MAAA;AAAA,kBACN,OAAA,EAAS,2BAAA;AAAA,kBACT,cAAc,EAAA,CAAG,EAAA;AAAA,kBACjB,WAAA,EAAa,OAAA;AAAA,kBACb,UAAA,EAAY,GAAA;AAAA,kBACZ,MAAA,EAAQ;AAAA,iBACT,CAAA;AAAA,cAEa;AAAA,YAClB;AAAA,UACF;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,qDAAqD,CAAC,CAAA;AAAA,QACtE;AAAA,MACF;AAGA,MAAA,MAAM,qBAAA,GAAwB,OAAO,UAAA,EAAW;AAChD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAE/B,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,8FAAA,CAAA;AAAA,QACA,qBAAA;AAAA,QACA,QAAA;AAAA,QACA,2BAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,EAAA,EAAI,qBAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,2BAAA;AAAA,QACT,UAAA,EAAY,SAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACT,CAAA;AAGD,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,qDAAA;AAAA,OACF;AAIA,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAC5C,CAAA;AAAA;AAAA,0EAAA;AAAA,OAGF;AACA,MAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,QAAA,IAAA,CAAK,YAAA,CAAa;AAAA,UAChB,IAAA,EAAM,UAAA;AAAA,UACN,QAAQ,MAAA,CAAO,EAAA;AAAA,UACf,IAAA,EAAM;AAAA,YACJ,IAAI,MAAA,CAAO,EAAA;AAAA,YACX,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,aAAa,MAAA,CAAO,WAAA;AAAA,YACpB,cAAc,MAAA,CAAO,YAAA;AAAA,YACrB,cAAc,MAAA,CAAO,YAAA;AAAA,YACrB,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,eAAe,MAAA,CAAO,aAAA;AAAA,YACtB,iBAAiB,MAAA,CAAO,eAAA;AAAA,YACxB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,WAAA,EAAa,IAAA;AAAA,YACb,YAAY,MAAA,CAAO;AAAA;AACrB,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAA,CAAK,YAAA,CAAa;AAAA,QAChB,IAAA,EAAM,iBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAED,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,0BAAA,EAA2B;AAAA,QACzD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,kBAAkB,KAAK,CAAA;AACrC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,uBAAA,EAAwB;AAAA,QAClD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,iBAAA,CACJ,QAAA,EACA,IAAA,GAAkB,GAAA,EACC;AACnB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,mBAAA,EAAoB;AAG/B,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,gEAAA;AAAA,OACF;AAGA,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA;AAAA,QACpC,mBAAA;AAAA,QACA,EAAE,UAAU,IAAA,EAAK;AAAA,QACjB;AAAA;AAAA,OACF;AAEA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd;AAAA,UACE,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,QACA,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,8BAAA,EAA+B;AAAA,QACzD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,WAAA,CACJ,KAAA,GAAgB,GAAA,EAChB,MAAA,GAAiB,CAAA,EACjB,KAAA,GAAwB,MAAA,EACxB,aAAA,GAAyB,KAAA,EACzB,QAAA,GAAmB,CAAA,EACnB;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,IAAI;AAEF,MAAA,MAAM,eAAe,EAAC;AACtB,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,MAChC;AACA,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,UAAA,EAAa,QAAQ,CAAA,kBAAA,CAAoB,CAAA;AAC3D,MAAA,MAAM,WAAA,GACJ,aAAa,MAAA,GAAS,CAAA,GAAI,SAAS,YAAA,CAAa,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AACpE,MAAA,MAAM,cAAA,GAAiB,KAAA,KAAU,KAAA,GAAQ,KAAA,GAAQ,MAAA;AACjD,MAAA,MAAM,mBAAA,GAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAuD5B,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAC7C;AAAA,QAAA,EACE,mBAAmB;AAAA,wDAAA,EAC6B,WAAW;AAAA,MAAA;AAAA,OAE/D;AACA,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAI,CAAE,KAAA;AAIhC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAqBxC;AAAA,QAAA,EACE,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAMnB,WAAW;AAAA,4BAAA,EACS,cAAc,CAAA,eAAA,EAAkB,cAAc,CAAA,eAAA,EAAkB,cAAc;AAAA;AAAA,MAAA,CAAA;AAAA,QAGpG,KAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,WAAW,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC3C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA;AACvD,QAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,MAAA,KAAW,OAAA,IAAW,IAAI,MAAA,KAAW,YAAA;AAChE,QAAA,MAAM,kBAAkB,cAAA,GACpB;AAAA,UACE,GAAI,YAAY,EAAC;AAAA,UACjB,MAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAc,QAAA;AAAA,UACd,YAAA,EAAc,GAAA,CAAI,MAAA,KAAW,YAAA,GAAe,aAAA,GAAgB;AAAA,SAC9D,GACA,QAAA;AAEJ,QAAA,OAAO;AAAA,UACL,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,aAAa,GAAA,CAAI,WAAA;AAAA,UACjB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,MAAA,EAAQ,IAAI,MAAA,KAAW,CAAA;AAAA,UACvB,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,aAAa,GAAA,CAAI,WAAA,GAAc,KAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,GAAI,IAAA;AAAA,UAC7D,QAAA,EAAU,eAAA;AAAA,UACV,WAAA,EACE,GAAA,CAAI,WAAA,KACF,GAAA,CAAI,MAAA,KAAW,UACX,IAAA,CAAK,6BAAA,CAA8B,GAAA,CAAI,QAAQ,CAAA,GAC/C,IAAA;AAAA,SAEV;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAM,cAAc,KAAA,CAAM,IAAA;AAAA,QACxB,IAAI,GAAA;AAAA,UACF,QAAA,CACG,GAAA;AAAA,YAAI,CAAC,YACJ,OAAO,OAAA,CAAQ,gBAAgB,QAAA,GAC3B,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAK,GACzB;AAAA,YAEL,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,CAAC;AAAA;AACjC,OACF;AACA,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iCAAA;AAAA,UAC/B;AAAA,SACF;AACA,QAAA,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AACnC,UAAA,MAAM,UAAA,GACJ,OAAO,OAAA,CAAQ,WAAA,KAAgB,WAC3B,OAAA,CAAQ,WAAA,CAAY,MAAK,GACzB,EAAA;AACN,UAAA,IAAI,CAAC,UAAA,EAAY;AACf,YAAA,OAAO,OAAA;AAAA,UACT;AACA,UAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA;AAC/C,UAAA,OAAO,aAAa,EAAE,GAAG,OAAA,EAAS,GAAG,YAAW,GAAI,OAAA;AAAA,QACtD,CAAC,CAAA;AAAA,MACH;AAIA,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,QAAA,GAAW,SAAS,OAAA,EAAQ;AAAA,MAC9B;AAEA,MAAA,MAAM,OAAA,GAAU,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,KAAA;AAE3C,MAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,OAAA,EAAQ;AAAA,IACpC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBACJ,GAAA,EACA,aAAA,GAAyB,OACzB,QAAA,GAAmB,CAAA,EACnB,oBAA6B,KAAA,EAC7B;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA;AAChF,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,EAAE,QAAA,EAAU,IAAI,KAAA,EAAO,CAAA,EAAG,SAAS,KAAA,EAAM;AAAA,IAClD;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,eAAe,EAAC;AACtB,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAChC;AACA,IAAA,YAAA,CAAa,IAAA,CAAK,CAAA,UAAA,EAAa,QAAQ,CAAA,kBAAA,CAAoB,CAAA;AAC3D,IAAA,MAAM,kBACJ,YAAA,CAAa,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,GAAI,OAAA;AAuBzD,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAuB;AAC5C,MAAA,IAAIO,SAAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC/B,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,EAAU;AACpC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACtC,YAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,cAAA,QAAA,GAAW,MAAA;AAAA,YACb;AAAA,UACF,CAAA,CAAA,MAAQ;AACN,YAAA,QAAA,GAAW,MAAA;AAAA,UACb;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,aAAa,GAAA,CAAI,WAAA;AAAA,UACjB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,MAAA,EAAQ,IAAI,MAAA,KAAW,CAAA;AAAA,UACvB,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,aAAa,GAAA,CAAI,WAAA,GAAc,KAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,GAAI,IAAA;AAAA,UAC7D,QAAA;AAAA,UACA,aAAa,GAAA,CAAI;AAAA,SACnB;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAM,cAAc,KAAA,CAAM,IAAA;AAAA,QACxB,IAAI,GAAA;AAAA,UACFA,SAAAA,CACG,GAAA;AAAA,YAAI,CAAC,YACJ,OAAO,OAAA,CAAQ,gBAAgB,QAAA,GAC3B,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAK,GACzB;AAAA,YAEL,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,CAAC;AAAA;AACjC,OACF;AACA,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iCAAA;AAAA,UAC/B;AAAA,SACF;AACA,QAAAA,SAAAA,GAAWA,SAAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AACnC,UAAA,MAAM,UAAA,GACJ,OAAO,OAAA,CAAQ,WAAA,KAAgB,WAC3B,OAAA,CAAQ,WAAA,CAAY,MAAK,GACzB,EAAA;AACN,UAAA,IAAI,CAAC,UAAA,EAAY;AACf,YAAA,OAAO,OAAA;AAAA,UACT;AACA,UAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA;AAC/C,UAAA,OAAO,aAAa,EAAE,GAAG,OAAA,EAAS,GAAG,YAAW,GAAI,OAAA;AAAA,QACtD,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAOA,SAAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAMtB,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,MAAM,eAAe,SAAA,CAAU,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACvD,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CACjC,IAAA;AAAA,QACC;AAAA,iBAAA,EACS,aAAa;AAAA;AAAA,gBAAA,EAEd,eAAe,eAAe,YAAY,CAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAGlD,GAAG;AAAA,QAEJ,OAAA,EAAQ;AACX,MAAA,MAAMA,SAAAA,GAAW,MAAM,OAAA,CAAQ,IAAI,CAAA;AACnC,MAAA,OAAO,EAAE,QAAA,EAAAA,SAAAA,EAAU,OAAOA,SAAAA,CAAS,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,IAC5D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CACpC,IAAA;AAAA,MACC;AAAA,eAAA,EACS,aAAa;AAAA;AAAA,cAAA,EAEd,eAAe;AAAA;AAAA,MAAA;AAAA,MAIxB,OAAA,EAAQ;AAEX,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KACtB,GAAA,CAAI,SAAS,MAAA,IACZ,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,IAAY,GAAA,CAAI,WAAW,MAAA,GAAS,CAAA;AAE7F,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,QAAQ,KAAA,EAAA,EAAS;AACnD,MAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA;AACzB,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AAE/B,MAAA,IAAI,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG;AACxB,QAAA,WAAA,CAAY,GAAA,CAAI,IAAI,EAAE,CAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,OAAO,QAAQ,CAAA,IAAK,cAAA,CAAe,QAAQ,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAG;AACtD,QAAA,KAAA,EAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,GAAM,KAAA;AACV,MAAA,OAAO,GAAA,GAAM,IAAI,OAAA,CAAQ,MAAA,IAAU,eAAe,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG;AACnE,QAAA,GAAA,EAAA;AAAA,MACF;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,IAAK,GAAA,EAAK,CAAA,EAAA,EAAK;AACjC,QAAA,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,MAAM,OAAA;AAAA,MACrB,OAAA,CAAQ,OAAO,CAAC,GAAA,KAAQ,YAAY,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC;AAAA,KACjD;AAEA,IAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,SAAA,EAAmB;AACrC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,IAAI,MAAM,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAC7C,QAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,MACzB;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CACjC,IAAA;AAAA,QACC,CAAA,iDAAA,CAAA;AAAA,QACA;AAAA,QAED,OAAA,EAAQ;AAEX,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,MACtD;AAGA,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,CAAC,CAAA,CAAE,WAAA;AAChC,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,IAAI;AAEF,UAAA,MAAM,IAAA,CAAK,6BAA6B,eAAe,CAAA;AAAA,QACzD,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,CAAC,CAAA;AAAA,QAEnD;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,iCAAA,CAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CAAqB,SAAA,EAAmB,OAAA,EAAiB;AAC7D,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAC7C,CAAA,oCAAA,CAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,OAAA,EAAQ,CAAE,MAAA,GAAS,CAAA;AAErD,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,MACtD;AAGA,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,4CAAA,CAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,IAAA,EAQhB;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,GAAA,IAAO,KAAK,QAAA,EAAU;AAC/B,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,UACzB;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,UAIA,GAAA,CAAI,EAAA;AAAA,UACJ,GAAA,CAAI,IAAA;AAAA,UACJ,GAAA,CAAI,OAAA;AAAA,UACJ,GAAA,CAAI,UAAA;AAAA,UACJ,IAAI,MAAA,IAAU,IAAA;AAAA,UACd;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,KAAK,QAAA,CAAS;AAAA,OACvB;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,IAAA,EAQX;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,QAIA,IAAA,CAAK,EAAA;AAAA,QACL,IAAA,CAAK,UAAA;AAAA,QACL,IAAA,CAAK,QAAA;AAAA,QACL,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK,cAAc,CAAA,GAAI,CAAA;AAAA,QACvB,KAAK,WAAA,IAAe,IAAA;AAAA,QACpB,IAAA,CAAK;AAAA,OACP;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAI,IAAA,CAAK;AAAA,OACX;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,KAAA,GAAgB,KAChB,MAAA,GAAiB,CAAA,EACjB,QAAwB,KAAA,EACxB;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAC7C,CAAA,kCAAA;AAAA,OACF;AACA,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAI,CAAE,KAAA,IAAS,CAAA;AAGzC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAoBxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAMsB,KAAK;AAAA;AAAA,MAAA,CAAA;AAAA,QAG3B,KAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAC1C,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,iBAAiB,GAAA,CAAI,eAAA;AAAA,QACrB,2BAAA,EAA6B,IAAI,2BAAA,KAAgC,CAAA;AAAA,QACjE,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,gBAAgB,GAAA,CAAI,cAAA;AAAA,QACpB,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,iBAAiB,GAAA,CAAI,eAAA;AAAA,QACrB,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,WAAA,EAAa,IAAI,WAAA,KAAgB,CAAA;AAAA,QACjC,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,cAAc,GAAA,CAAI;AAAA,OACpB,CAAE,CAAA;AAEF,MAAA,MAAM,OAAA,GAAU,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,KAAA;AAEvC,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAQ;AAAA,IAChC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,GAAA,EACA,kBAAA,GAA8B,KAAA,EAC9B,QAAwB,KAAA,EACxB;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA;AAChF,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,EAAE,IAAA,EAAM,IAAI,KAAA,EAAO,CAAA,EAAG,SAAS,KAAA,EAAM;AAAA,IAC9C;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,eAAe,SAAA,CAAU,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACvD,IAAA,MAAM,cAAc,kBAAA,GAChB;AAAA;AAAA;AAAA,2CAAA,EAGqC,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAuB3B,KAAK,WAAW,KAAK;AAAA,MAAA,CAAA,GAE3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAMe,YAAY,CAAA;AAAA,4BAAA,EACL,KAAK,WAAW,KAAK;AAAA,MAAA,CAAA;AAG/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA,CAkBvC,WAAA,EAAa,GAAG,SAAS,CAAA;AAE5B,IAAA,MAAM,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC1C,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,gBAAgB,GAAA,CAAI,cAAA;AAAA,MACpB,eAAe,GAAA,CAAI,aAAA;AAAA,MACnB,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,WAAA,EAAa,IAAI,WAAA,KAAgB,CAAA;AAAA,MACjC,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,cAAc,GAAA,CAAI;AAAA,KACpB,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBACJ,UAAA,EACA,iBAAA,GAA6B,OAC7B,kBAAA,GAA8B,KAAA,EAC9B,QAAwB,KAAA,EACxB;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,mBAAmB,KAAA,CAAM,IAAA;AAAA,MAC7B,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC;AAAA,KAC3D;AACA,IAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,IAAA,EAAM,IAAI,KAAA,EAAO,CAAA,EAAG,SAAS,KAAA,EAAM;AAAA,IAC9C;AAEA,IAAA,IAAI,gBAAA,CAAiB,SAAS,GAAA,EAAK;AACjC,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAQA,IAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAY;AAE3C,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CACpC,IAAA;AAAA,QACC;AAAA;AAAA;AAAA;AAAA,QAAA;AAAA,QAMD,OAAA,EAAQ;AAEX,MAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,gBAAgB,CAAA;AAC7C,MAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KACtB,GAAA,CAAI,SAAS,MAAA,IACZ,GAAA,CAAI,IAAA,KAAS,WAAA,IACZ,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,IAC1B,GAAA,CAAI,WAAW,MAAA,GAAS,CAAA;AAE5B,MAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,QAAQ,KAAA,EAAA,EAAS;AACnD,QAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA;AACzB,QAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AAE/B,QAAA,IAAI,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG;AACxB,UAAA,kBAAA,CAAmB,GAAA,CAAI,IAAI,EAAE,CAAA;AAC7B,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,QAAA,OAAO,QAAQ,CAAA,IAAK,cAAA,CAAe,QAAQ,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAG;AACtD,UAAA,KAAA,EAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,GAAM,KAAA;AACV,QAAA,OAAO,GAAA,GAAM,IAAI,OAAA,CAAQ,MAAA,IAAU,eAAe,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG;AACnE,UAAA,GAAA,EAAA;AAAA,QACF;AAEA,QAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,IAAK,GAAA,EAAK,CAAA,EAAA,EAAK;AACjC,UAAA,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAE,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,QAAQ,CAAC,EAAA,KAAO,kBAAA,CAAmB,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,qBAAA,GAAwB,KAAA,CAAM,IAAA,CAAK,kBAAkB,CAAA;AAC3D,IAAA,IAAI,qBAAA,CAAsB,WAAW,CAAA,EAAG;AACtC,MAAA,OAAO,EAAE,IAAA,EAAM,IAAI,KAAA,EAAO,CAAA,EAAG,SAAS,KAAA,EAAM;AAAA,IAC9C;AAuBA,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAwB;AAC7C,IAAA,MAAM,qBAAA,GAAwB,EAAA;AAE9B,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,qBAAA,CAAsB,MAAA,EAAQ,SAAS,qBAAA,EAAuB;AACxF,MAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,KAAA,CAAM,KAAA,EAAO,QAAQ,qBAAqB,CAAA;AAC9E,MAAA,MAAM,eAAe,KAAA,CAAM,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACnD,MAAA,MAAM,cAAc,kBAAA,GAChB;AAAA;AAAA;AAAA,qDAAA,EAG6C,YAAY,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,8BAAA,EAwBnC,KAAK,WAAW,KAAK;AAAA,QAAA,CAAA,GAE3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAOuB,YAAY,CAAA;AAAA,8BAAA,EACb,KAAK,WAAW,KAAK;AAAA,QAAA,CAAA;AAG/C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA,CAAiB,WAAA,EAAa,GAAG,KAAK,CAAA;AAChF,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,OAAA,EAAQ,EAAG;AAClC,QAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU;AAC/D,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,UAAA,GAAa,KAAA,CAAM,UAAA;AAC/C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,SAAA;AACxC,MAAA,OAAO,UAAU,KAAA,GACb,cAAA,IAAkB,QAAA,GAClB,CAAC,kBAAkB,CAAC,QAAA;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC9B,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,gBAAgB,GAAA,CAAI,cAAA;AAAA,MACpB,eAAe,GAAA,CAAI,aAAA;AAAA,MACnB,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,WAAA,EAAa,IAAI,WAAA,KAAgB,CAAA;AAAA,MACjC,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,cAAc,GAAA,CAAI;AAAA,KACpB,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,KAAA,EAAe;AACjC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QA+CxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,QAkBA;AAAA,OACF;AAEA,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,EAAQ,CAAE,CAAC,CAAA,IAAK,IAAA;AACnC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,sBAAA,GAAyB,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAaxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,QAQA;AAAA,OACF;AAEA,MAAA,MAAM,mBAAmB,sBAAA,CAAuB,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,SAAA,KAAc;AAC3E,QAAA,IAAI,UAAA,GAAa,gBAAA;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAGzC,UAAA,IAAI,OAAO,OAAA,CAAQ,UAAA,KAAe,QAAA,EAAU;AAC1C,YAAA,UAAA,GAAa,OAAA,CAAQ,UAAA;AAAA,UACvB;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,OAAO;AAAA,UACL,IAAI,SAAA,CAAU,EAAA;AAAA,UACd,IAAA,EAAM,UAAA;AAAA,UACN,aAAa,SAAA,CAAU,YAAA;AAAA,UACvB,WAAW,SAAA,CAAU,UAAA;AAAA,UACrB,QAAQ,SAAA,CAAU,MAAA;AAAA,UAClB,UAAU,SAAA,CAAU,QAAA;AAAA,UACpB,OAAO,SAAA,CAAU,KAAA;AAAA,UACjB,aAAa,SAAA,CAAU,YAAA;AAAA,UACvB,SAAA,EAAW,UAAU,UAAA,KAAe,CAAA;AAAA,UACpC,aAAa,SAAA,CAAU,aAAA;AAAA,UACvB,cAAc,SAAA,CAAU;AAAA,SAC1B;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,MAAA,IAAI,IAAI,YAAA,EAAc;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,YAAY,CAAA;AAC/C,UAAA,IAAI,YAAY,QAAA,EAAU;AACxB,YAAA,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtD;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,4DAA4D,CAAC,CAAA;AAAA,QAC7E;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,iBAAiB,GAAA,CAAI,eAAA;AAAA,QACrB,2BAAA,EAA6B,IAAI,2BAAA,KAAgC,CAAA;AAAA,QACjE,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,iBAAiB,GAAA,CAAI,eAAA;AAAA,QACrB,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,kBAAkB,GAAA,CAAI,gBAAA;AAAA,QACtB,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,QACvB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,kBAAkB,GAAA,CAAI,gBAAA;AAAA,QACtB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,wBAAwB,GAAA,CAAI,sBAAA;AAAA,QAC5B,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,wBAAwB,GAAA,CAAI,sBAAA;AAAA,QAC5B,iBAAiB,GAAA,CAAI,eAAA;AAAA,QACrB,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,gBAAgB,GAAA,CAAI,cAAA;AAAA,QACpB,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,eAAA,EAAiB,cAAA;AAAA;AAAA,QACjB,eAAe,GAAA,CAAI,aAAA;AAAA,QACnB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,iBAAiB,GAAA,CAAI,eAAA;AAAA,QACrB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,WAAA,EAAa,IAAI,WAAA,KAAgB,CAAA;AAAA,QACjC,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,qBAAqB,GAAA,CAAI,mBAAA;AAAA,QACzB,wBAAwB,GAAA,CAAI,sBAAA;AAAA,QAC5B,2BAA2B,GAAA,CAAI,yBAAA;AAAA,QAC/B,yBAAyB,GAAA,CAAI,uBAAA;AAAA,QAC7B,iBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,gBAAgB;AAAA,OACpD;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAA,EAAkB;AACpC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACpE,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC9D,MAAA,MAAM,cAAA,GAAiB,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAE5D,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,UACzC,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AAGA,MAAA,IAAI,SAAA,GAAY,IAAA;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,eAAe,UAAU,CAAA;AAC/D,QAAA,MAAM,SAAA,GAAY,SAAS,SAAA,EAAW,SAAA;AACtC,QAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAA4C;AACrE,UAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,UAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAC/B,UAAA,OAAO,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAAA,QAC9C,CAAA;AACA,QAAA,SAAA,GAAY;AAAA,UACV,IAAI,cAAA,CAAe,UAAA;AAAA,UACnB,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,cAAA,CAAe,UAAA;AAAA,UACxC,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,aAAa,QAAA,CAAS,WAAA;AAAA,UACtB,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,YAAA,EAAc,SAAS,KAAA,EAAO,KAAA;AAAA,UAC9B,YAAA,EAAc,SAAS,KAAA,EAAO,KAAA;AAAA,UAC9B,mBAAA,EAAqB,iBAAA,CAAkB,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,UAC7D,mBAAA,EAAqB,iBAAA,CAAkB,QAAA,CAAS,KAAA,EAAO,MAAM;AAAA,SAC/D;AAAA,MACF,SAAS,CAAA,EAAG;AAEV,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,cAAA,CAAe,UAAU,CAAA,oBAAA,CAAsB,CAAA;AAAA,MACvE;AAGA,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAC9C,CAAA,sCAAA;AAAA,OACF;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAC1C,CAAA,kCAAA;AAAA,OACF;AAEA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ;AAAA,UACN,IAAI,cAAA,CAAe,EAAA;AAAA,UACnB,UAAU,cAAA,CAAe,UAAA;AAAA;AAAA,UACzB,SAAS,cAAA,CAAe,OAAA;AAAA,UACxB,IAAA,EAAM,cAAA,CAAe,IAAA,IAAQ,EAAC;AAAA,UAC9B,MAAA,EAAQ,eAAe,MAAA,IAAU,IAAA;AAAA,UACjC,UAAA,EAAY,eAAe,UAAA,IAAc,IAAA;AAAA,UACzC,YAAY,cAAA,CAAe;AAAA,SAC7B;AAAA,QACA,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,aAAA,EAAe,YAAA,CAAa,GAAA,EAAI,CAAE,KAAA,IAAS,CAAA;AAAA,UAC3C,SAAA,EAAW,QAAA,CAAS,GAAA,EAAI,CAAE,KAAA,IAAS;AAAA;AACrC,OACF;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAA,CACJ,QAAA,EACA,MAAA,EAOA;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACpE,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC9D,MAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,YAAA,CAAa,UAAU,MAAM,CAAA;AAEhE,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,MAClE;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ;AAAA,UACN,IAAI,OAAA,CAAQ,EAAA;AAAA,UACZ,UAAU,OAAA,CAAQ,UAAA;AAAA,UAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,EAAC;AAAA,UACvB,YAAY,OAAA,CAAQ;AAAA;AACtB,OACF;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,GAAe;AACnB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AAEF,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,UAAA,EAAY;AAChC,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,KAAA,CAAM,KAAM,gBAAgB,CAAA;AAAA,QACjC,SAAS,CAAA,EAAG;AAAA,QAEZ;AAAA,MACF;AACA,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,cAAA,EAAgB;AACpC,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,KAAA,CAAM,KAAM,gBAAgB,CAAA;AAAA,QACjC,SAAS,CAAA,EAAG;AAAA,QAEZ;AAAA,MACF;AACA,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,MAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAG1B,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY;AAInC,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAU;AAGjC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAEzB,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,2BAAA,EAA4B;AAAA,IAC/D,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,2BACZ,OAAA,EACmB;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,aAAA,EAAc;AAC/B,IAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,MAAA,CAAO,OAAO,IAAI,CAAA;AAI3C,IAAA,IAAA,CAAK,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAG/B,IAAA,MAAA,CAAO,mBAAA,CAAoB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAG1C,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,MAAM,CAAA;AAE1B,IAAA,OAAO,IAAI,SAAS,IAAA,EAAM;AAAA,MACxB,MAAA,EAAQ,GAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,+BACZ,OAAA,EACmB;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,aAAA,EAAc;AAC/B,IAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,MAAA,CAAO,OAAO,IAAI,CAAA;AAG3C,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,eAAe,CAAA,KAAM,MAAA;AAChE,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAC/C,IAAA,MAAM,WAAW,UAAA,KAAe,IAAA,GAAO,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA,GAAI,CAAA;AAIlE,IAAA,IAAA,CAAK,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAI/B,IAAA,MAAA,CAAO,oBAAoB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAA,EAAe,UAAU,CAAA;AAGvE,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,MAAM,CAAA;AAE9B,IAAA,OAAO,IAAI,SAAS,IAAA,EAAM;AAAA,MACxB,MAAA,EAAQ,GAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,GAAA,EAAgC;AACnD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAClC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5C,MAAA,IAAI;AACF,QAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AACpC,UAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA,QAC3B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,OAAA,EAAoC;AAE3D,IAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,IAAS,CAAA;AAEtC,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU;AAAA,MAC7B,IAAA,EAAM,cAAA;AAAA,MACN,YAAY,OAAA,CAAQ,EAAA;AAAA,MACpB,KAAA,EAAO,YAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP,CAAA;AAGD,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,KAAW,IAAA,IAAQ,QAAQ,MAAA,KAAW,CAAA;AAE/D,IAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAc,CAAA,EAAG;AAChD,MAAA,IAAI;AACF,QAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAEpC,UAAA,MAAM,UAAA,GAAa,GAAG,qBAAA,EAAsB;AAK5C,UAAA,MAAM,aAAA,GAAgB,YAAY,aAAA,IAAiB,KAAA;AACnD,UAAA,MAAM,QAAA,GAAW,YAAY,QAAA,IAAY,CAAA;AAGzC,UAAA,IAAI,QAAA,IAAY,CAAC,aAAA,EAAe;AAC9B,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,YAAA;AAAA,UACF;AAEA,UAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,QAC/B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,sDAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,uCACZ,OAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,WAAW,CAAA;AAC5D,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iCAAA,CAAkC;AAAA,QACjE;AAAA,OACD,CAAA;AACD,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA;AAC/C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,iBAAiB,EAAE,GAAG,OAAA,EAAS,GAAG,YAAY,CAAA;AACnD,QAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,CAAsB,SAAA,EAAmB,KAAA,EAAe,KAAA,GAAgB,CAAA,EAAS;AACvF,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU;AAAA,MAC7B,IAAA,EAAM,eAAA;AAAA,MACN,UAAA,EAAY,SAAA;AAAA,MACZ,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAc,CAAA,EAAG;AAChD,MAAA,IAAI;AACF,QAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAEpC,UAAA,MAAM,UAAA,GAAa,GAAG,qBAAA,EAAsB;AAI5C,UAAA,MAAM,QAAA,GAAW,YAAY,QAAA,IAAY,CAAA;AAGzC,UAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,YAAA;AAAA,UACF;AAEA,UAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,QAC/B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,4DAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,KAAA,EAA6B;AACtD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAEpC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAc,CAAA,EAAG;AAChD,MAAA,IAAI;AACF,QAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AACpC,UAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,QAC/B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,wDAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,CAAe,MAAc,IAAA,EAAqB;AACxD,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU;AAAA,MAC7B,IAAA,EAAM,OAAA;AAAA,MACN,SAAA,EAAW,IAAA;AAAA,MACX,IAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAED,IAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAc,CAAA,EAAG;AAChD,MAAA,IAAI;AACF,QAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AACpC,UAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,QAC/B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,oDAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI;AAEF,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,MAAA,EAAQ;AACrD,QAAA,EAAA,CAAG,KAAK,MAAM,CAAA;AACd,QAAA;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAqD,KAAK,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,EAAA,EACA,KAAA,EACA,SACA,SAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,GAAG,qBAAA,EAAsB;AAG5C,IAAA,IAAI,UAAA,EAAY,SAAS,KAAA,EAAO;AAC9B,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,UAAA,EAAY,IAAA,KAAS,SAAA,EAAW;AACzC,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CAAe,EAAA,EAAe,KAAA,EAA+B;AACjE,IAAA,MAAM,UAAA,GAAa,GAAG,qBAAA,EAAsB;AAC5C,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,CAAA,uCAAA,EAA0C,YAAY,IAAI,CAAA,EAAA,CAAA;AAAA,MAC1D;AAAA,KACF;AAGA,IAAA,IAAI,UAAA,EAAY,SAAS,KAAA,EAAO;AAC9B,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,UAAA,EAAY,IAAA,KAAS,SAAA,EAAW;AACzC,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAW,WAAA,EAAY;AAAA,IACpC,SAAS,KAAA,EAAO;AAGd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,WAAA,CACZ,QAAA,EACA,WACA,gBAAA,EACA,IAAA,EACA,kBAA2B,IAAA,EACN;AACrB,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAO/B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAI,eAAA,EAAgB;AAElD,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAG/C,MAAA,MAAM,SAAA,GAAY,SAAS,SAAA,EAAW,SAAA;AACtC,MAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAA4C;AACrE,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAE/B,QAAA,IAAI,SAAA,EAAW,OAAO,CAAA,EAAG,SAAS,IAAI,IAAI,CAAA,CAAA;AAC1C,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AACA,MAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,QAAA,CAAS,KAAK,CAAA;AACtE,MAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,QAAA,CAAS,KAAK,CAAA;AAGtE,MAAA,MAAM,KAAA,GAAe;AAAA,QACnB,EAAA,EAAI,SAAA;AAAA,QACJ,KAAA,EAAO,SAAS,KAAA,IAAS,SAAA;AAAA,QACzB,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,QACrB,mBAAmB,QAAA,CAAS,eAAA;AAAA,QAC5B,YAAA,EAAc,SAAS,KAAA,EAAO,KAAA;AAAA,QAC9B,mBAAA,EAAqB,iBAAA,CAAkB,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,QAC7D,uBAAA,EAAyB,QAAA,CAAS,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,QAC3D,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,kCAAA,EAAoC,SAAS,KAAA,EAAO,wBAAA;AAAA,QACpD,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,0BAAA,EAA4B,aAAa,MAAA,CAAO,QAAA;AAAA,QAChD,sCAAA,EAAwC,aAAa,MAAA,CAAO,eAAA;AAAA,QAC5D,0CAAA,EAA4C,aAAa,MAAA,CAAO,mBAAA;AAAA,QAChE,YAAA,EAAc,SAAS,KAAA,EAAO,KAAA;AAAA,QAC9B,mBAAA,EAAqB,iBAAA,CAAkB,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,QAC7D,uBAAA,EAAyB,QAAA,CAAS,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,QAC3D,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,kCAAA,EAAoC,SAAS,KAAA,EAAO,wBAAA;AAAA,QACpD,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,0BAAA,EAA4B,aAAa,MAAA,CAAO,QAAA;AAAA,QAChD,sCAAA,EAAwC,aAAa,MAAA,CAAO,eAAA;AAAA,QAC5D,0CAAA,EAA4C,aAAa,MAAA,CAAO;AAAA,OAClE;AAGA,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACpE,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC9D,MAAA,MAAM,cAAA,GAAiB,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAE5D,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAE,CAAA;AAAA,MACjD;AAGA,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,IAAI,cAAA,CAAe,EAAA;AAAA,QACnB,UAAU,cAAA,CAAe,UAAA;AAAA;AAAA,QACzB,SAAS,cAAA,CAAe,OAAA;AAAA,QACxB,GAAA,EAAK,cAAA,CAAe,GAAA,IAAO,cAAA,CAAe,KAAA,IAAS,IAAA;AAAA,QACnD,SAAA,EAAW,eAAe,SAAA,IAAa,IAAA;AAAA,QACvC,OAAO,cAAA,CAAe,KAAA;AAAA,QACtB,YAAY,cAAA,CAAe,UAAA;AAAA,QAC3B,MAAA,EAAQ,eAAe,MAAA,IAAU,IAAA;AAAA,QACjC,UAAA,EAAY,eAAe,UAAA,IAAc,IAAA;AAAA,QACzC,YAAY,cAAA,CAAe;AAAA,OAC7B;AAGA,MAAA,MAAM,EAAE,UAAA,EAAAvB,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAG/B,MAAA,IAAI,aAAA;AACJ,MAAA,IACE,oBACA,KAAA,CAAM,OAAA,CAAQ,gBAAgB,CAAA,IAC9B,gBAAA,CAAiB,SAAS,CAAA,EAC1B;AACA,QAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,UAC1D,GAAG,GAAA;AAAA,UACH,EAAA,EAAI,GAAA,CAAI,EAAA,IAAM,MAAA,CAAO,UAAA,EAAW;AAAA,UAChC,UAAA,EAAY,GAAA,CAAI,UAAA,IAAc,IAAA,CAAK,KAAI,GAAI;AAAA,SAC7C,CAAE,CAAA;AAEF,QAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,UAAA,MAAM,kBACJ,GAAA,CAAI,WAAA,KAAgB,KAAA,CAAA,IAAa,GAAA,CAAI,gBAAgB,IAAA,GACjD,IAAA,GACA,OAAO,GAAA,CAAI,gBAAgB,QAAA,GACzB,GAAA,CAAI,cACJ,IAAA,CAAK,SAAA,CAAU,IAAI,WAAW,CAAA;AACtC,UAAA,MAAM,gBACJ,GAAA,CAAI,UAAA,KAAe,KAAA,CAAA,IAAa,GAAA,CAAI,eAAe,IAAA,GAC/C,IAAA,GACA,OAAO,GAAA,CAAI,eAAe,QAAA,GACxB,GAAA,CAAI,aACJ,IAAA,CAAK,SAAA,CAAU,IAAI,UAAU,CAAA;AACrC,UAAA,MAAM,eACJ,GAAA,CAAI,QAAA,KAAa,KAAA,CAAA,IAAa,GAAA,CAAI,aAAa,IAAA,GAC3C,IAAA,GACA,OAAO,GAAA,CAAI,aAAa,QAAA,GACtB,GAAA,CAAI,WACJ,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEnC,UAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,YACzB,CAAA,mMAAA,CAAA;AAAA,YACA,GAAA,CAAI,EAAA;AAAA,YACJ,GAAA,CAAI,IAAA;AAAA,YACJ,IAAI,OAAA,IAAW,IAAA;AAAA,YACf,IAAI,IAAA,IAAQ,IAAA;AAAA,YACZ,aAAA;AAAA,YACA,IAAI,YAAA,IAAgB,IAAA;AAAA,YACpB,eAAA;AAAA,YACA,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA;AAAA,YACjB,YAAA;AAAA,YACA,OAAO,GAAA,CAAI,WAAA,KAAgB,QAAA,GAAW,IAAI,WAAA,GAAc,IAAA;AAAA,YACxD,GAAA,CAAI,UAAA;AAAA,YACJ;AAAA,WACF;AACA,UAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,CAAC,IAAI,MAAA,EAAQ;AACtC,YAAA,aAAA,GAAgB,GAAA,CAAI,EAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAEE,MAAA,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,CAAoB,aAAa,CAAA;AAI5D,MAAA,MAAM,gBAAA,GAAmB,uBAAuB,QAAQ,CAAA;AAExD,MAAA,MAAM,UAAA,GAAa,MAAMA,WAAAA,CAAW,OAAA,CAAQ;AAAA,QAC1C,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,QAClB,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,QAAA,EAAU,IAAA;AAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,gBAAA;AAAA,QACA,OAAA,EAAS,CAAC,GAAA,KAAiB,IAAA,CAAK,aAAa,GAA0B,CAAA;AAAA,QACvE,WAAA,EAAa,CAAC,OAAA,KAAqB;AACjC,UAAA,KAAK,IAAA,CAAK,sCAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF,CAAA;AAAA,QACA,gBAAA,EAAkB,CAAC,SAAA,EAAmB,KAAA,EAAe,UACnD,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AAAA,QACpD,aAAA,EAAe,CAAC,KAAA,KAAU,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,QACvD,WAAW,CAAC,IAAA,EAAMwB,UAAS,IAAA,CAAK,cAAA,CAAe,MAAMA,KAAI,CAAA;AAAA,QACzD,aAAA;AAAA,QACA,iBAAiB,IAAA,CAAK;AAAA,SACrB,eAAe,CAAA;AAClB,MAAA,OAAO,UAAA;AAAA,IACT,CAAA,SAAE;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,MAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAA,CACZ,UAAA,EACA,UAAA,EACA,UACA,WAAA,EACe;AACf,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,UAAU,CAAA,CAAE,CAAA;AAE7D,IAAA,IAAI;AAEF,MAAA,MAAM,CAAC,aAAa,MAAA,EAAQ,OAAO,IAAI,MAAM,IAAA,CAAK,WAAW,UAAU,CAAA;AAGvE,MAAA,IAAI,aAAA,GAAgB,UAAA;AACpB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAC1C,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,MAAM,IAAI,MAAM,CAAA,OAAA,EAAU,UAAU,4BAA4B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,QACxF;AACA,QAAA,aAAA,GAAgB,MAAA,CAAO,IAAA;AAAA,MACzB;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAGtD,MAAA,MAAM,EAAE,eAAA,EAAAF,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAClC,MAAA,MAAM,KAAA,GAAQA,gBAAAA,CAAgB,kBAAA,CAAmB,IAAA,EAAa,QAAA,EAAU;AAAA,QACtE,eAAA,EAAiB;AAAA,UACf,IAAI,WAAA,IAAe,IAAA;AAAA,UACnB,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAGD,MAAA,MAAM,OAAA,CAAQ,OAAO,aAAa,CAAA;AAElC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAA0B,UAAU,CAAA,uBAAA,CAAyB,CAAA;AAAA,IAC3E,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uBAAA,EAA0B,UAAU,CAAA,QAAA,CAAA,EAAY,KAAK,CAAA;AACnE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,eACZ,QAAA,EACA,OAAA,EACA,OAAe,MAAA,EACf,WAAA,EACA,iBACA,QAAA,EACe;AACf,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAG/B,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,gEAAA;AAAA,OACF;AAAA,IACI;AAGN,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAI,eAAA,EAAgB;AAElD,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACpE,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC9D,MAAA,MAAM,cAAA,GAAiB,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAE5D,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAE,CAAA;AAAA,MACjD;AAGA,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,IAAI,cAAA,CAAe,EAAA;AAAA,QACnB,UAAU,cAAA,CAAe,UAAA;AAAA;AAAA,QACzB,SAAS,cAAA,CAAe,OAAA;AAAA,QACxB,GAAA,EAAK,cAAA,CAAe,GAAA,IAAO,cAAA,CAAe,KAAA,IAAS,IAAA;AAAA,QACnD,SAAA,EAAW,eAAe,SAAA,IAAa,IAAA;AAAA,QACvC,OAAO,cAAA,CAAe,KAAA;AAAA,QACtB,YAAY,cAAA,CAAe,UAAA;AAAA,QAC3B,MAAA,EAAQ,eAAe,MAAA,IAAU,IAAA;AAAA,QACjC,UAAA,EAAY,eAAe,UAAA,IAAc,IAAA;AAAA,QACzC,YAAY,cAAA,CAAe;AAAA,OAC7B;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,eAAe,UAAU,CAAA;AAG/D,MAAA,MAAM,SAAA,GAAY,SAAS,SAAA,EAAW,SAAA;AACtC,MAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAA4C;AACrE,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAE/B,QAAA,IAAI,SAAA,EAAW,OAAO,CAAA,EAAG,SAAS,IAAI,IAAI,CAAA,CAAA;AAC1C,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AACA,MAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,QAAA,CAAS,KAAK,CAAA;AACtE,MAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,QAAA,CAAS,KAAK,CAAA;AAGtE,MAAA,MAAM,KAAA,GAAe;AAAA,QACnB,IAAI,cAAA,CAAe,UAAA;AAAA,QACnB,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,cAAA,CAAe,UAAA;AAAA,QACxC,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,QACrB,mBAAmB,QAAA,CAAS,eAAA;AAAA,QAC5B,YAAA,EAAc,SAAS,KAAA,EAAO,KAAA;AAAA,QAC9B,mBAAA,EAAqB,iBAAA,CAAkB,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,QAC7D,uBAAA,EAAyB,QAAA,CAAS,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,QAC3D,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,kCAAA,EAAoC,SAAS,KAAA,EAAO,wBAAA;AAAA,QACpD,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,0BAAA,EAA4B,aAAa,MAAA,CAAO,QAAA;AAAA,QAChD,sCAAA,EAAwC,aAAa,MAAA,CAAO,eAAA;AAAA,QAC5D,0CAAA,EAA4C,aAAa,MAAA,CAAO,mBAAA;AAAA,QAChE,YAAA,EAAc,SAAS,KAAA,EAAO,KAAA;AAAA,QAC9B,mBAAA,EAAqB,iBAAA,CAAkB,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,QAC7D,uBAAA,EAAyB,QAAA,CAAS,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,QAC3D,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,kCAAA,EAAoC,SAAS,KAAA,EAAO,wBAAA;AAAA,QACpD,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,0BAAA,EAA4B,aAAa,MAAA,CAAO,QAAA;AAAA,QAChD,sCAAA,EAAwC,aAAa,MAAA,CAAO,eAAA;AAAA,QAC5D,0CAAA,EAA4C,aAAa,MAAA,CAAO;AAAA,OAClE;AAGA,MAAA,MAAM,YAAY,IAAA,CAAK,gBAAA,CAAiB,eAAe,CAAA,IAAK,OAAO,UAAA,EAAW;AAC9E,MAAA,MAAM,SAAA,GACJ,OAAO,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,QAAA,GAAW,CAAA,GACpE,QAAA,GACA,IAAA,CAAK,KAAI,GAAI,GAAA;AAEnB,MAAA,IAAI,OAAA,GAAe;AAAA,QACjB,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAa,WAAA,IAAe,IAAA;AAAA,QAC5B,UAAA,EAAY;AAAA,OACd;AAGA,MAAA,MAAM,KAAA,GAAQ;AAAA,QACZ,QAAA;AAAA,QACA,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,QAClB,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU;AAAA;AACZ,OACF;AAGA,MAAA,MAAM,EAAE,UAAA,EAAAtB,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC7B,MAAA,OAAA,GAAU,MAAMA,WAAAA,CAAW,0BAAA,CAA2B,KAAA,EAAc,OAAO,CAAA;AAG3E,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,KAAA,EAAO,MAAA,IAAU,IAAA;AAGhD,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,mGAAA,CAAA;AAAA,QACA,OAAA,CAAQ,EAAA;AAAA,QACR,OAAA,CAAQ,IAAA;AAAA,QACR,OAAA,CAAQ,OAAA;AAAA,QACR,OAAA,CAAQ,WAAA;AAAA,QACR,OAAA,CAAQ,UAAA;AAAA,QACR;AAAA,OACF;AAGA,MAAA,MAAMA,WAAAA,CAAW,yBAAA,CAA0B,KAAA,EAAc,OAAO,CAAA;AAIhE,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,aAAa,OAAA,CAAQ,WAAA,GAAc,KAAK,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,IAAA;AAAA,QACrE,YAAY,OAAA,CAAQ;AAAA,OACrB,CAAA;AAQD,MAAA,MAAM,QAAA,GAAW,IAAA,KAAS,WAAA,GAAc,GAAA,GAAM,GAAA;AAG9C,MAAA,MAAM,MAAA,GAAS,IAAI,aAAA,EAAc;AAGjC,MAAA,MAAM,gBAAA,GAAmB,uBAAuB,QAAQ,CAAA;AAExD,MAAA,MAAMA,YAAW,OAAA,CAAQ;AAAA,QACvB,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,QAClB,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,QAAA,EAAU,IAAA;AAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,gBAAA;AAAA,QACA,eAAe,OAAA,CAAQ,EAAA;AAAA,QACvB,WAAA,EAAa,QAAA;AAAA,QACb,MAAA;AAAA,QACA,OAAA,EAAS,CAAC,GAAA,KAAiB,IAAA,CAAK,aAAa,GAA0B,CAAA;AAAA,QACvE,WAAA,EAAa,CAACyB,QAAAA,KAAqB;AACjC,UAAA,KAAK,IAAA,CAAK,sCAAA;AAAA,YACRA;AAAA,WACF;AAAA,QACF,CAAA;AAAA,QACA,gBAAA,EAAkB,CAACC,UAAAA,EAAmB,KAAA,EAAe,UACnD,IAAA,CAAK,qBAAA,CAAsBA,UAAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AAAA,QACpD,aAAA,EAAe,CAAC,KAAA,KAAU,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,QACvD,WAAW,CAAC,IAAA,EAAM,SAAS,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AAAA,QACzD,iBAAiB,IAAA,CAAK;AAAA,SACrB,IAAI,CAAA;AAAA,IACT,CAAA,SAAE;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,MAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,mBAAA,CACZ,QAAA,EACA,IAAA,GAAkB,GAAA,EACH;AACf,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAG/B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAI,eAAA,EAAgB;AAElD,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACpE,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC9D,MAAA,MAAM,cAAA,GAAiB,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAE5D,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAE,CAAA;AAAA,MACjD;AAGA,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,IAAI,cAAA,CAAe,EAAA;AAAA,QACnB,UAAU,cAAA,CAAe,UAAA;AAAA,QACzB,SAAS,cAAA,CAAe,OAAA;AAAA,QACxB,GAAA,EAAK,cAAA,CAAe,GAAA,IAAO,cAAA,CAAe,KAAA,IAAS,IAAA;AAAA,QACnD,SAAA,EAAW,eAAe,SAAA,IAAa,IAAA;AAAA,QACvC,OAAO,cAAA,CAAe,KAAA;AAAA,QACtB,YAAY,cAAA,CAAe,UAAA;AAAA,QAC3B,MAAA,EAAQ,eAAe,MAAA,IAAU,IAAA;AAAA,QACjC,UAAA,EAAY,eAAe,UAAA,IAAc,IAAA;AAAA,QACzC,YAAY,cAAA,CAAe;AAAA,OAC7B;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,eAAe,UAAU,CAAA;AAG/D,MAAA,MAAM,SAAA,GAAY,SAAS,SAAA,EAAW,SAAA;AACtC,MAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAA4C;AACrE,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAE/B,QAAA,IAAI,SAAA,EAAW,OAAO,CAAA,EAAG,SAAS,IAAI,IAAI,CAAA,CAAA;AAC1C,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AACA,MAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,QAAA,CAAS,KAAK,CAAA;AACtE,MAAA,MAAM,YAAA,GAAe,kCAAA,CAAmC,QAAA,CAAS,KAAK,CAAA;AAGtE,MAAA,MAAM,KAAA,GAAe;AAAA,QACnB,IAAI,cAAA,CAAe,UAAA;AAAA,QACnB,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,cAAA,CAAe,UAAA;AAAA,QACxC,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,QACrB,mBAAmB,QAAA,CAAS,eAAA;AAAA,QAC5B,YAAA,EAAc,SAAS,KAAA,EAAO,KAAA;AAAA,QAC9B,mBAAA,EAAqB,iBAAA,CAAkB,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,QAC7D,uBAAA,EAAyB,QAAA,CAAS,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,QAC3D,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,kCAAA,EAAoC,SAAS,KAAA,EAAO,wBAAA;AAAA,QACpD,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,0BAAA,EAA4B,aAAa,MAAA,CAAO,QAAA;AAAA,QAChD,sCAAA,EAAwC,aAAa,MAAA,CAAO,eAAA;AAAA,QAC5D,0CAAA,EAA4C,aAAa,MAAA,CAAO,mBAAA;AAAA,QAChE,YAAA,EAAc,SAAS,KAAA,EAAO,KAAA;AAAA,QAC9B,mBAAA,EAAqB,iBAAA,CAAkB,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,QAC7D,uBAAA,EAAyB,QAAA,CAAS,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,QAC3D,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,kCAAA,EAAoC,SAAS,KAAA,EAAO,wBAAA;AAAA,QACpD,gBAAA,EAAkB,SAAS,KAAA,EAAO,QAAA;AAAA,QAClC,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,wBAAA,EAA0B,aAAa,IAAA,CAAK,QAAA;AAAA,QAC5C,oCAAA,EAAsC,aAAa,IAAA,CAAK,eAAA;AAAA,QACxD,wCAAA,EAA0C,aAAa,IAAA,CAAK,mBAAA;AAAA,QAC5D,0BAAA,EAA4B,aAAa,MAAA,CAAO,QAAA;AAAA,QAChD,sCAAA,EAAwC,aAAa,MAAA,CAAO,eAAA;AAAA,QAC5D,0CAAA,EAA4C,aAAa,MAAA,CAAO;AAAA,OAClE;AAGA,MAAA,MAAM,EAAE,aAAA,EAAAC,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,kBAAA,EAAA,EAAA,qBAAA,CAAA,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,IAAIA,cAAAA,EAAc;AAGjC,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAGrD,MAAA,MAAM,EAAE,UAAA,EAAA3B,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAG7B,MAAA,MAAM,gBAAA,GAAmB,uBAAuB,QAAQ,CAAA;AAExD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6CAAA,EAAgD,IAAI,CAAA,gBAAA,EAAmB,aAAa,CAAA,CAAE,CAAA;AAElG,MAAA,MAAM,uBAAA,GAA0B,MAAM,IAAA,CAAK,wBAAA,EAAyB;AACpE,MAAA,MAAM,UAAA,GAAa,MAAMA,WAAAA,CAAW,OAAA,CAAQ;AAAA,QAC1C,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,QAClB,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,gBAAA;AAAA,QACA,aAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,MAAA;AAAA,QACA,OAAA,EAAS,CAAC,GAAA,KAAiB,IAAA,CAAK,aAAa,GAA0B,CAAA;AAAA,QACvE,WAAA,EAAa,CAAC,OAAA,KAAqB;AACjC,UAAA,KAAK,IAAA,CAAK,sCAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF,CAAA;AAAA,QACA,gBAAA,EAAkB,CAAC,SAAA,EAAmB,KAAA,EAAe,UACnD,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AAAA,QACpD,aAAA,EAAe,CAAC,KAAA,KAAU,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,QACvD,WAAW,CAAC,IAAA,EAAM,SAAS,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AAAA,QACzD,iBAAiB,IAAA,CAAK;AAAA,SACrB,IAAI,CAAA;AAEP,MAAA,MAAM,IAAA,CAAK,iCAAA;AAAA,QACT,QAAA;AAAA,QACA,cAAA,CAAe,UAAA;AAAA,QACf,MAAA,CAAO,MAAA;AAAA,QACP,yBAAyB,EAAA,IAAM,IAAA;AAAA,QAC/B;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,MAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAE9B,MAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,0BAAA,EAA2B;AAC/D,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,IAAA,CAAK,4BAAA,CAA6B,QAAA,EAAU,gBAAgB,CAAA;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,0BAAA,GAAwD;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QACxC;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,OAMF;AACA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,CAAC,CAAA,EAAG,IAAA;AAClC,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,IAAI,SAAS,WAAA,EAAa;AACxB,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,KAAK,CAAA;AACzE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAA,CACJ,EAAA,EACA,KAAA,EACA,eACA,OAAA,EACmB;AACnB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA;AAAA,QACpC,eAAA;AAAA,QACA,EAAE,EAAA,EAAI,KAAA,EAAO,aAAA,EAAc;AAAA,QAC3B;AAAA,OACF;AAEA,MAAA,OAAO,SAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAA;AAAA,IACpD,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,gCAAA,EAAiC;AAAA,QAC3D,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAmC;AACvC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,aAAA,EAAc;AAClD,MAAA,OAAO,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,2BAAA,EAA4B;AAAA,QACtD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAiC;AACrC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,IAAA,CAKvC;AAAA;AAAA;AAAA;AAAA,MAAA,CAIF,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AAAA,IAC/B,SAAS,KAAA,EAAY;AAEnB,MAAA,OAAO,SAAS,IAAA,CAAK,EAAE,IAAA,EAAM,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAmC;AACvC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAO/B,CAAA;AAGD,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,2BAAA,CAA6B,CAAA;AAE7D,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC5C,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,2BAAA,EAA4B;AAAA,QACtD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,uBAAuB,MAAA,EAKP;AACpB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AACpC,MAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU;AAAA,QAC/B;AAAA,UACE,IAAI,MAAA,CAAO,UAAA;AAAA,UACX,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,MAAM,MAAA,CAAO,QAAA;AAAA,YACb,WAAW,MAAA,CAAO;AAAA;AACpB;AACF,OACD,CAAA;AAGD,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA;AAAA,4CAAA,CAAA;AAAA,QAEA,SAAA;AAAA,QACA,OAAO,OAAA,IAAW,IAAA;AAAA,QAClB,SAAA;AAAA,QACA,IAAA,CAAK,KAAI,GAAI,GAAA;AAAA,QACb;AAAA,OACF;AAEA,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,MAAA,EAAQ,UAAA;AAAA,QACR,SAAA;AAAA,QACA,YAAY,MAAA,CAAO;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAC1D,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,qCAAA,EAAsC;AAAA,QAChE,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAA,CACZ,EAAA,EACA,KAAA,EACA,aAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAGzB,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAO/B,CAAA;AAGD,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,wFAAA,CAAA;AAAA,MACA,EAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,cAAA,GAAiB;AAEvB,IAAA,MAAM,EAAE,WAAA,EAAAI,YAAAA,EAAY,IAAI,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,CAAA;AACxB,IAAA,OAAO,IAAIA,YAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,IAAA,EACA,IAAA,EACA,UACA,OAAA,EAIA;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAG/B,MAAA,MAAM,YAAA,GAAe,MAAM,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AACvC,MAAA,MAAM,WAAW,YAAA,KAAiB,IAAA;AAGlC,MAAA,MAAM,YAAA,GAAe,KAAK,IAAI,CAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AACrD,MAAA,MAAM,cAAA,GAAiB,KAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,QAAA,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AACzC,QAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,cAAA,KAAmB,CAAA,EAAG;AACrC,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,QACrD;AAAA,MACF;AAEA,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,QAAA,eAAA,GAAkB,IAAI,UAAA,CAAW,WAAA,CAAY,MAAM,CAAA;AACnD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,UAAA,eAAA,CAAgB,CAAC,CAAA,GAAI,WAAA,CAAY,UAAA,CAAW,CAAC,CAAA;AAC7C,UAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,cAAA,KAAmB,CAAA,EAAG;AACrC,YAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,MAAM,EAAA,CAAG,SAAA,CAAU,IAAA,EAAM,YAAY,QAAA,EAAU;AAAA,QAC5D,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,SAAA,EAAW;AAAA,OACZ,CAAA;AAGD,MAAA,IAAA,CAAK,cAAA,CAAe,QAAA,GAAW,cAAA,GAAiB,cAAA,EAAgB;AAAA,QAC9D,IAAA;AAAA,QACA,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,IAAA,EACA,OAAA,EACA,QAAA,GAAmB,cACnB,OAAA,EAGA;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAG/B,MAAA,MAAM,YAAA,GAAe,MAAM,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AACvC,MAAA,MAAM,WAAW,YAAA,KAAiB,IAAA;AAElC,MAAA,MAAM,SAAS,MAAM,EAAA,CAAG,UAAU,IAAA,EAAM,OAAA,EAAS,UAAU,OAAO,CAAA;AAGlE,MAAA,IAAA,CAAK,cAAA,CAAe,QAAA,GAAW,cAAA,GAAiB,cAAA,EAAgB;AAAA,QAC9D,IAAA;AAAA,QACA,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAA,CACJ,IAAA,EACA,QAAA,EAQC;AACD,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,cAAAwB,aAAAA,EAAc,mBAAA,EAAAC,sBAAqB,mBAAA,EAAAC,oBAAAA,KAAwB,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,qBAAA,EAAA,EAAA,wBAAA,CAAA,CAAA;AAIzE,MAAA,MAAM,MAAA,GAASD,qBAAoB,IAAI,CAAA;AACvC,MAAA,MAAM,SAAA,GAAY,MAAMD,aAAAA,CAAa,MAAA,EAAQ,QAAQ,CAAA;AAErD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAME,oBAAAA,CAAoB,SAAA,CAAU,IAAI,CAAA;AAAA,QACxC,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,OAAO,SAAA,CAAU,KAAA;AAAA,QACjB,QAAQ,SAAA,CAAU;AAAA,OACpB;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAC1D,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CACJ,IAAA,EACA,QAAA,EACA,OAAA,EAKA;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,SAAS,MAAM,EAAA,CAAG,QAAA,CAAS,IAAA,EAAM,UAAU,OAAO,CAAA;AACxD,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,IAAA,EAAc;AAC3B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,QAAA,CAAS,IAAI,CAAA;AAEnC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,4BAAA,EAA6B;AAAA,MAC/D;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAI,CAAA;AACjC,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACxC;AACA,MAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAE1B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,IAAA,EAAc;AAC/B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA;AAE1C,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,4BAAA,EAA6B;AAAA,MAC/D;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,IAClC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAA,EAAc;AAC3B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAEjC,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAAc;AAC7B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAMC,OAAAA,GAAS,MAAM,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA;AACnC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAAA,OAAAA,EAAO;AAAA,IACjC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAAc;AAC7B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,EAAA,CAAG,OAAO,IAAI,CAAA;AAGpB,MAAA,IAAA,CAAK,cAAA,CAAe,cAAA,EAAgB,EAAE,IAAA,EAAM,CAAA;AAE5C,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,IAAA,EAAc;AAC5B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA;AAGlC,MAAA,IAAA,CAAK,eAAe,cAAA,EAAgB,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAE1D,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,MAAA,EAAO;AAAA,IAC5C,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,IAAA,EAAc;AAC9B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,OAAA,CAAQ,IAAI,CAAA;AACnC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,IAChC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,IAAA,EAAc;AAC5B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,EAAA,CAAG,MAAM,IAAI,CAAA;AAGnB,MAAA,IAAA,CAAK,cAAA,CAAe,cAAA,EAAgB,EAAE,IAAA,EAAM,CAAA;AAE5C,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAe;AACnB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,YAAA,EAAa;AACpC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,IAChC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAiB,IAAA,EAAc;AACnC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA;AAEvC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AAAA,MACxD;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAI,CAAA;AACjC,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACxC;AACA,MAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAE1B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,OAAA,EACA,OAAA,EAIA;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,IAAA,CAAK,SAAS,OAAO,CAAA;AAC9C,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,IAClC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,OAAA,EACA,OAAA,EAIA;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,IAAA,CAAK,SAAS,OAAO,CAAA;AAC5C,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,IAChC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,kBAAA,CACJ,IAAA,EACA,SAAA,EACA,UACA,OAAA,EAUC;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,YAAAC,WAAAA,EAAY,aAAA,EAAAC,gBAAe,QAAA,EAAAC,SAAAA,KAAa,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AACtD,MAAA,MAAM,cAAA,GAAiBD,eAAc,IAAI,CAAA;AACzC,MAAA,MAAM,IAAA,GAAOC,UAAS,cAAc,CAAA;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,CAAK,SAAA,GAAYF,WAAU,CAAA;AAEvD,MAAA,MAAM,eAAe,OAAA,EAAS,QAAA,GAC1B,KAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAC/B,IAAA;AAGJ,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,2CAAA,CAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA;AAAA,qFAAA,CAAA;AAAA,QAEA,cAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA,GAAA;AAAA,QACA,SAAS,KAAA,IAAS,IAAA;AAAA,QAClB,SAAS,MAAA,IAAU;AAAA,OACrB;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAWA,WAAAA;AAAA,QACX;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CACJ,IAAA,EACA,UAAA,EACA,IAAA,EAIC;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,aAAA,EAAAC,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AAChC,MAAA,MAAM,cAAA,GAAiBA,eAAc,IAAI,CAAA;AAGzC,MAAA,MAAM,YAAA,GAAe,KAAK,IAAI,CAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AACrD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,QAAA,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,MAC3C;AAGA,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,kFAAA,CAAA;AAAA,QACA,cAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAA,CACJ,IAAA,EACA,cAAA,EACA,OAAA,EAOC;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,aAAA,EAAAA,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AAChC,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,cAAA,GAAiBA,eAAc,IAAI,CAAA;AAGzC,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QAC7C,CAAA,6DAAA,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,GAAA,EAAI,CAAE,KAAA;AAEtC,MAAA,IAAI,gBAAgB,cAAA,EAAgB;AAClC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,CAAA,SAAA,EAAY,cAAc,CAAA,aAAA,EAAgB,WAAW,CAAA;AAAA,SAC9D;AAAA,MACF;AAGA,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC1C,QAAA,eAAA,GAAkB,IAAI,UAAA,CAAW,WAAA,CAAY,MAAM,CAAA;AACnD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,UAAA,eAAA,CAAgB,CAAC,CAAA,GAAI,WAAA,CAAY,UAAA,CAAW,CAAC,CAAA;AAAA,QAC/C;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,8DAAA,CAAA;AAAA,QACA,cAAA;AAAA,QACA,eAAA,IAAmB,IAAA;AAAA,QACnB;AAAA,OACF;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,IAAA,CAAK,cAAc,CAAA;AAGzC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,eAAe,cAAA,EAAgB,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,CAAA;AAAA,MACpE;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAQ,KAAA,CAAA,EAAU;AAAA,IAClD,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,IAAA,EACA,UAAA,EAKC;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,aAAA,EAAAA,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AAChC,MAAA,MAAM,cAAA,GAAiBA,eAAc,IAAI,CAAA;AAEzC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,QACxC,CAAA,oEAAA,CAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,MAAA,EAAS,UAAU,CAAA,UAAA,CAAA,EAAa;AAAA,MAClE;AAGA,MAAA,MAAM,QAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,CAAC,EAAE,IAAI,CAAA;AACzC,MAAA,IAAI,MAAA,GAAS,EAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACxC;AACA,MAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAE1B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,IAAA,EAKC;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAK,cAAA,EAAe;AAC/B,MAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAE/B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,IAC/B,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,OAAA,EAAQ;AAAA,IAChD;AAAA,EACF;AACF;;;AGr0LO,IAAMjB,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAiB;AAExB,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKR,CAAA;AAID,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQR,CAAA;AACD,IAAA,GAAA,CAAI,KAAK,CAAA,0DAAA,CAA4D,CAAA;AACrE,IAAA,GAAA,CAAI,KAAK,CAAA,oDAAA,CAAsD,CAAA;AAC/D,IAAA,GAAA,CAAI,KAAK,CAAA,0DAAA,CAA4D,CAAA;AAGrE,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CASR,CAAA;AACD,IAAA,GAAA,CAAI,KAAK,CAAA,kDAAA,CAAoD,CAAA;AAC7D,IAAA,GAAA,CAAI,KAAK,CAAA,0CAAA,CAA4C,CAAA;AAGrD,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAUR,CAAA;AACD,IAAA,GAAA,CAAI,KAAK,CAAA,6FAAA,CAA+F,CAAA;AACxG,IAAA,GAAA,CAAI,KAAK,CAAA,kEAAA,CAAoE,CAAA;AAG7E,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAYR,CAAA;AACD,IAAA,GAAA,CAAI,KAAK,CAAA,wDAAA,CAA0D,CAAA;AACnE,IAAA,GAAA,CAAI,KAAK,CAAA,sDAAA,CAAwD,CAAA;AACjE,IAAA,GAAA,CAAI,KAAK,CAAA,4DAAA,CAA8D,CAAA;AAGvE,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CASR,CAAA;AACD,IAAA,GAAA,CAAI,KAAK,CAAA,4DAAA,CAA8D,CAAA;AACvE,IAAA,GAAA,CAAI,KAAK,CAAA,sDAAA,CAAwD,CAAA;AACjE,IAAA,GAAA,CAAI,KAAK,CAAA,4DAAA,CAA8D,CAAA;AAGvE,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMR,CAAA;AAID,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAQR,CAAA;AACD,IAAA,GAAA,CAAI,KAAK,CAAA,+CAAA,CAAiD,CAAA;AAG1D,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAER,CAAA;AAAA,EACH;AACF,CAAA;;;ACtHO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAiB;AAExB,IAAA,GAAA,CAAI,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAGpD,IAAA,GAAA,CAAI,KAAK,CAAA,8CAAA,CAAgD,CAAA;AAGzD,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAER,CAAA;AAAA,EACH;AACF,CAAA;;;ACrBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAiB;AACxB,IAAA,GAAA,CAAI,KAAK,CAAA,iEAAA,CAAmE,CAAA;AAC5E,IAAA,GAAA,CAAI,KAAK,CAAA,iDAAA,CAAmD,CAAA;AAC5D,IAAA,GAAA,CAAI,KAAK,CAAA,gEAAA,CAAkE,CAAA;AAE3E,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAER,CAAA;AAAA,EACH;AACF,CAAA;;;ACRO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAiB;AACxB,IAAA,GAAA,CAAI,KAAK,CAAA,uCAAA,CAAyC,CAAA;AAClD,IAAA,GAAA,CAAI,KAAK,CAAA,sEAAA,CAAwE,CAAA;AAEjF,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAUR,CAAA;AACD,IAAA,GAAA,CAAI,KAAK,CAAA,sEAAA,CAAwE,CAAA;AAEjF,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAER,CAAA;AAAA,EACH;AACF,CAAA;;;AC1BO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAiB;AACxB,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAYR,CAAA;AACD,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,6GAAA;AAAA,KACF;AAEA,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAER,CAAA;AAAA,EACH;AACF,CAAA;;;ACtBO,IAAMA,WAAAA,GAAY;AAAA,EACvB,OAAA,EAAS,CAAA;AAAA,EACT,MAAM,GAAG,GAAA,EAAiB;AACxB,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA;AAAA;AAAA,+CAAA;AAAA,KAGF;AAEA,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA;AAAA,IAAA,CAER,CAAA;AAAA,EACH;AACF,CAAA;;;ACfO,IAAMmB,cAAa,CAACnB,WAAAA,EAAOA,aAAOA,WAAAA,EAAOA,WAAAA,EAAOA,aAAOA,WAAK,CAAA;AAE5D,IAAMoB,sBAAAA,GAAwB,CAAA;;;ACL9B,IAAM,aAAN,MAAiB;AAAA,EACtB,OAAe,SAAA,GAAY,aAAA;AAAA;AAAA;AAAA;AAAA,EAK3B,aAAa,OAAA,CAAQ,IAAA,EAAc,GAAA,EAA8B;AAC/D,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAGhC,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MACpC,KAAA;AAAA,MACA,YAAY,GAAG,CAAA;AAAA,MACf,EAAE,MAAM,SAAA,EAAU;AAAA,MAClB,KAAA;AAAA,MACA,CAAC,SAAS;AAAA,KACZ;AAGA,IAAA,MAAM,KAAK,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAGpD,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,OAAA;AAAA,MACpC;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN;AAAA,OACF;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,WAAW,IAAI,UAAA,CAAW,EAAA,CAAG,MAAA,GAAS,UAAU,UAAU,CAAA;AAChE,IAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG,GAAG,MAAM,CAAA;AAGjD,IAAA,OAAO,eAAe,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,OAAA,CAAQ,aAAA,EAAuB,GAAA,EAA8B;AACxE,IAAA,MAAM,QAAA,GAAWC,gBAAe,aAAa,CAAA;AAG7C,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAGnC,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MACpC,KAAA;AAAA,MACA,YAAY,GAAG,CAAA;AAAA,MACf,EAAE,MAAM,SAAA,EAAU;AAAA,MAClB,KAAA;AAAA,MACA,CAAC,SAAS;AAAA,KACZ;AAGA,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,OAAA;AAAA,MACpC;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN;AAAA,OACF;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,OAAO,OAAA,CAAQ,OAAO,SAAS,CAAA;AAAA,EACjC;AACF,CAAA;AAGA,SAAS,YAAY,GAAA,EAAyB;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAC,CAAA;AAC3C,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA,EAAG;AACtC,IAAA,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA,CAAS,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,MAAA,EAA4B;AAClD,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAEA,SAASA,gBAAe,MAAA,EAA4B;AAClD,EAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA;AACT;AAaA,eAAsB,WAAA,CACpB,KACA,aAAA,EACiB;AACjB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AACpC,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,aAAa,CAAA;AACpD;AASA,eAAsB,WAAA,CACpB,WACA,aAAA,EACiC;AACjC,EAAA,MAAM,SAAA,GAAY,MAAM,UAAA,CAAW,OAAA,CAAQ,WAAW,aAAa,CAAA;AACnE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACnC,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,MAAA;AACT;;;AC3IA,IAAM,kBAAA,GAAqB,0BAAA;AAqKpB,IAAM,mBAAA,GAAN,cAEGC,aAAAA,CAAmB;AAAA,EACnB,iBAAA,GAAmC,IAAA;AAAA,EACnC,YAAA,uBAAmC,GAAA,EAAI;AAAA,EAE/C,WAAA,CAAY,KAAyB,GAAA,EAAU;AAC7C,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAGd,IAAA,MAAM,OAAA,GAAU,IAAI,aAAA,EAAc;AAClC,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,MAAM,UAAA,GAAa,GAAG,qBAAA,EAAsB;AAC5C,MAAA,IAAI,UAAA,EAAY,YAAY,QAAA,EAAU;AACpC,QAAA,IAAA,CAAK,YAAA,CAAa,IAAI,EAAE,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBACN,KAAA,EAK+B;AAC/B,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA;AAAA,EACnD;AAAA,EAEQ,sBAAA,CACN,OACA,GAAA,EACqC;AACrC,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,GAAA,EAAK;AAC/C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,IAAI,GAAA,CAAI,GAAG,CAAA,KAAM,MAAA,EAAW;AAC5B,MAAA,IAAI,UAAU,MAAA,EAAQ;AAGpB,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA;AAAA,EACnD;AAAA,EAEQ,oBAAA,CACN,YACA,GAAA,EACqC;AACrC,IAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,UAAU,OAAO,IAAA;AAC1D,IAAA,MAAM,GAAA,GAAM,WAAW,kBAAkB,CAAA;AACzC,IAAA,IAAI,CAAC,OAAO,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,IAAA;AAClE,IAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,GAAA,EAAgC,GAAG,CAAA;AAAA,EACxE;AAAA,EAEQ,iBAAA,CACN,YACA,QAAA,EACgC;AAChC,IAAA,MAAM,IAAA,GAAO,cAAc,OAAO,UAAA,KAAe,WAC7C,EAAE,GAAG,UAAA,EAAW,GAChB,EAAC;AAEL,IAAA,IAAI,YAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAChD,MAAA,IAAA,CAAK,kBAAkB,CAAA,GAAI,QAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,OAAO,KAAK,kBAAkB,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,OAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,IAAA,GAAO,IAAA;AAAA,EAC/C;AAAA,EAEQ,kBACN,QAAA,EACQ;AACR,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA,CAC1C,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAM,CAAA,CACtC,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACxC,IAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAC/B;AAAA,EAEQ,kBAAA,CACN,UACA,IAAA,EACe;AACf,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,IAAI,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA;AAE3B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI;AAClC,MAAA,IAAI,KAAA,IAAS,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAAA,IACvC;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,IAAI,CAAA,CAAA;AACvB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AAC5E,IAAA,IAAI,aAAa,OAAO,WAAA;AAExB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,uBACN,GAAA,EAC4C;AAC5C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,SAAS,CAAA,EAAG;AAClC,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,SAAqD,EAAC;AAC5D,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,SAAA,EAAW;AACjC,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,MAAA,MAAM,WAAA,GAAc,KAAA;AAKpB,MAAA,IAAI,CAAC,YAAY,MAAA,EAAQ;AACzB,MAAA,MAAM,IAAA,GAAO,OAAO,WAAA,CAAY,IAAA,KAAS,WACrC,WAAA,CAAY,IAAA,CAAK,MAAK,GACtB,EAAA;AACJ,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA;AAAA,QACA,QAAA,EAAU,CAAC,CAAC,WAAA,CAAY;AAAA,OACzB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,wBAAA,CACN,KACA,mBAAA,EAC+B;AAC/B,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,IAAI,mBAAA,CAAoB,IAAA,KAAS,CAAA,EAAG,OAAO,GAAA;AAE3C,IAAA,MAAM,WAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,MAAA,IAAI,mBAAA,CAAoB,GAAA,CAAI,GAAG,CAAA,EAAG;AAClC,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,IAClB;AACA,IAAA,OAAO,OAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW,IAAA;AAAA,EACvD;AAAA,EAEQ,6BAAA,CACN,QAAA,EACA,GAAA,EACA,mBAAA,EACqC;AACrC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,GAAA,EAAK,OAAO,IAAA;AAC9B,IAAA,MAAM,WAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnD,MAAA,IAAI,GAAA,CAAI,GAAG,CAAA,KAAM,MAAA,EAAW;AAC5B,MAAA,IAAI,mBAAA,CAAoB,GAAA,CAAI,GAAG,CAAA,EAAG;AAClC,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,MAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,OAAO,OAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW,IAAA;AAAA,EACvD;AAAA,EAEA,MAAc,+BACZ,SAAA,EACsD;AACtD,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,MAAM,KAAA,GAAoE;AAAA,MACxE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA;AAAU,KACnC;AACA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,IAAA,MAAM,eAAA,GAAkB,KAAK,OAAA,EAAQ;AACrC,IAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,EAAO;AACnC,IAAA,MAAM,aAAA,GAAgB,KAAK,KAAA,EAAM;AACjC,IAAA,MAAM,kBAAA,GAAqB,CAAC,SAAA,KAA0D;AACpF,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,GAAA,CAAI,GAAA,CAAI,SAAS,IAAI,CAAA;AACrB,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,QAAA,CAAS,GAAA,CAAI,SAAS,IAAI,CAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,MAAA,MAAM,WAAW,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAA;AAChD,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAEpB,MAAA,IAAI,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC5B,QAAA,IAAIC,IAAAA,GAAW,IAAA;AACf,QAAA,IAAI;AACF,UAAAA,IAAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,QACzC,CAAA,CAAA,MAAQ;AACN,UAAAA,IAAAA,GAAM,IAAA;AAAA,QACR;AACA,QAAA,IAAI,CAACA,IAAAA,EAAK;AACR,UAAA;AAAA,QACF;AAEA,QAAA,kBAAA,CAAmB,IAAA,CAAK,sBAAA,CAAuBA,IAAG,CAAC,CAAA;AAEnD,QAAA,IAAI,OAAOA,IAAAA,CAAI,KAAA,EAAO,WAAW,QAAA,IAAYA,IAAAA,CAAI,MAAM,MAAA,EAAQ;AAC7D,UAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAMA,IAAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAAA,QACvD;AACA,QAAA,IAAI,OAAOA,IAAAA,CAAI,KAAA,EAAO,WAAW,QAAA,IAAYA,IAAAA,CAAI,MAAM,MAAA,EAAQ;AAC7D,UAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAMA,IAAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AAAA,QACvD;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,QAAA,IAAIA,IAAAA,GAAW,IAAA;AACf,QAAA,IAAI;AACF,UAAAA,IAAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,IAAI,CAAA;AAAA,QAC1C,CAAA,CAAA,MAAQ;AACN,UAAAA,IAAAA,GAAM,IAAA;AAAA,QACR;AACA,QAAA,IAAI,CAACA,IAAAA,EAAK;AACR,UAAA;AAAA,QACF;AAEA,QAAA,kBAAA,CAAmB,IAAA,CAAK,sBAAA,CAAuBA,IAAG,CAAC,CAAA;AAEnD,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQA,IAAAA,CAAI,KAAK,CAAA,GAAIA,IAAAA,CAAI,QAAQ,EAAC;AACtD,QAAA,KAAA,MAAW,aAAa,KAAA,EAAO;AAC7B,UAAA,MAAM,UAAA,GACJ,SAAA,IAAa,OAAO,SAAA,KAAc,WAC7B,SAAA,GACD,IAAA;AACN,UAAA,MAAM,QAAA,GACJ,OAAO,SAAA,KAAc,QAAA,GACjB,SAAA,GACC,UAAA,IAAc,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACtC,UAAA,CAAW,IAAA,GACX,IAAA;AACV,UAAA,IAAI,CAAC,YAAY,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,IAAK,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AAChF,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,eAAA,EAAiB,QAAQ,CAAA,EAAG;AACtD,YAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA;AAAA,UAC/C,CAAA,MAAA,IAAW,IAAA,CAAK,kBAAA,CAAmB,cAAA,EAAgB,QAAQ,CAAA,EAAG;AAC5D,YAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAAA,UAC9C,CAAA,MAAA,IAAW,IAAA,CAAK,kBAAA,CAAmB,aAAA,EAAe,QAAQ,CAAA,EAAG;AAC3D,YAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,UAAU,CAAA;AAAA,UAC7C;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,aAAA,EAAe,QAAQ,IAAI,CAAA;AACnE,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,GAAW,IAAA;AACf,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,MAAM,aAAA,CAAc,OAAO,CAAA,EAAE;AAAA,MACrC,CAAA,CAAA,MAAQ;AACN,QAAA,GAAA,GAAM,IAAA;AAAA,MACR;AACA,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA;AAAA,MACF;AAEA,MAAA,kBAAA,CAAmB,IAAA,CAAK,sBAAA,CAAuB,GAAG,CAAC,CAAA;AAEnD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA,CAAI,OAAO,EAAC;AACnD,MAAA,KAAA,MAAW,cAAc,IAAA,EAAM;AAC7B,QAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AACpC,QAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,eAAA,EAAiB,OAAO,CAAA,EAAG;AACrD,UAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA;AAAA,QAC9C,CAAA,MAAA,IAAW,IAAA,CAAK,kBAAA,CAAmB,cAAA,EAAgB,OAAO,CAAA,EAAG;AAC3D,UAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAAA,QAC7C,CAAA,MAAA,IAAW,IAAA,CAAK,kBAAA,CAAmB,aAAA,EAAe,OAAO,CAAA,EAAG;AAC1D,UAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAK,QAAA,EAAS;AAAA,EACzB;AAAA,EAEA,MAAc,+BACZ,SAAA,EACsB;AACtB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,8BAAA,CAA+B,SAAS,CAAA;AAClE,IAAA,OAAO,MAAA,CAAO,GAAA;AAAA,EAChB;AAAA,EAEA,MAAc,uCACZ,SAAA,EACmB;AACnB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,8BAAA,CAA+B,SAAS,CAAA;AAClE,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,EACtE;AAAA,EAEQ,4BAA4B,KAAA,EAA0B;AAC5D,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC/B,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,UAAA,IAAc,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AACzC,MAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AACnB,MAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,IACxB;AACA,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACxC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,4BAA4B,KAAA,EAAgD;AAClF,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,SAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,MAAA,MAAM,UAAA,GAAa,KAAA;AAQnB,MAAA,MAAM,IAAA,GAAO,OAAO,UAAA,CAAW,IAAA,KAAS,WAAW,UAAA,CAAW,IAAA,CAAK,MAAK,GAAI,EAAA;AAC5E,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA;AAAA,QACA,MAAM,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GAAW,WAAW,IAAA,GAAO,MAAA;AAAA,QAC9D,UAAU,OAAO,UAAA,CAAW,QAAA,KAAa,QAAA,GAAW,WAAW,QAAA,GAAW,MAAA;AAAA,QAC1E,MAAM,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GAAW,WAAW,IAAA,GAAO,MAAA;AAAA,QAC9D,OAAO,OAAO,UAAA,CAAW,KAAA,KAAU,QAAA,GAAW,WAAW,KAAA,GAAQ,MAAA;AAAA,QACjE,QAAQ,OAAO,UAAA,CAAW,MAAA,KAAW,QAAA,GAAW,WAAW,MAAA,GAAS;AAAA,OACrE,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,KAAA,EAAuB;AAC9C,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,IAAA,MAAM,cAAc,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,UAAA;AACnD,IAAA,MAAM,SAAA,GAAY,YAAY,OAAA,CAAQ,mBAAA,EAAqB,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAClF,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AACtD,IAAA,OAAO,OAAA,IAAW,YAAA;AAAA,EACpB;AAAA,EAEQ,sBAAsB,IAAA,EAA6B;AACzD,IAAA,MAAM,UAAA,GAAa,KAAK,WAAA,EAAY;AACpC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,IAAA,IAAI,UAAA,CAAW,SAAS,MAAM,CAAA,IAAK,WAAW,QAAA,CAAS,OAAO,GAAG,OAAO,YAAA;AACxE,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,YAAA;AACzC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,WAAA;AACxC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,eAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,QAAA,EAAoD;AAC/E,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,UAAA,GAAa,SAAS,WAAA,EAAY;AACxC,IAAA,IAAI,UAAA,KAAe,cAAc,OAAO,KAAA;AACxC,IAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,IAAA,IAAI,UAAA,KAAe,cAAc,OAAO,MAAA;AACxC,IAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,IAAA,IAAI,UAAA,KAAe,aAAa,OAAO,KAAA;AACvC,IAAA,IAAI,UAAA,KAAe,iBAAiB,OAAO,KAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,IAAA,IAAI,UAAA,KAAe,EAAA,IAAM,UAAA,KAAe,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,EACxC;AAAA,EAEQ,yBAAA,CACN,aAAA,EACA,QAAA,EACA,UAAA,EACQ;AACR,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,aAAa,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACxC,IAAA,MAAM,OAAO,OAAA,GAAU,CAAA,GAAI,SAAS,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,GAAI,QAAA;AACxD,IAAA,MAAM,WAAA,GAAc,UAAU,CAAA,GAAI,QAAA,CAAS,MAAM,OAAA,GAAU,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA;AAC9E,IAAA,MAAM,GAAA,GACJ,WAAA,IACA,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA,IAClC,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,qBAAA,CAAsB,UAAU,CAAC,CAAA,IAChE,KAAA;AACF,IAAA,MAAM,UAAU,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC9C,IAAA,MAAM,cAAA,GAAA,CAAkB,IAAA,IAAQ,YAAA,EAAc,KAAA,CAAM,GAAG,EAAE,CAAA;AACzD,IAAA,OAAO,CAAA,aAAA,EAAgB,cAAc,CAAA,CAAA,EAAI,OAAO,IAAI,GAAG,CAAA,CAAA;AAAA,EACzD;AAAA,EAEQ,oCACN,WAAA,EACQ;AACR,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAQ,WAAA,CACX,GAAA,CAAI,CAAC,UAAA,KAAe,WAAW,IAAI,CAAA,CACnC,MAAA,CAAO,CAAC,SAAyB,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,SAAS,CAAC,CAAA;AAC/E,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,YAAA,GAAe,aAAA;AAClD,IAAA,OAAO;;AAAA,yCAAA,EAAgD,KAAK,CAAA;;AAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,EACtF;AAAA,EAEQ,6BAAA,CACN,WAAA,EACA,MAAA,EACA,MAAA,EACA,OACA,WAAA,EACQ;AACR,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,mCAAA,CAAoC,WAAW,CAAA;AAC9E,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,OAAO,wBAAwB,WAAW,CAAA;;AAAA,EAAgC,KAAA,IAAS,MAAA,IAAU,8BAA8B,CAAA,EAAG,iBAAiB,CAAA,CAAA;AAAA,IACjJ;AACA,IAAA,OAAO,wBAAwB,WAAW,CAAA;;AAAA,EAA2C,MAAA,IAAU,KAAA,IAAS,oBAAoB,CAAA,EAAG,iBAAiB,CAAA,CAAA;AAAA,EAClJ;AAAA,EAEA,MAAc,oCAAA,CACZ,YAAA,EAIA,YAAA,EAQA,WAAA,EAUE;AACF,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,SASD,EAAC;AAEN,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,QAAA,CAAS,WAAW,IAAI,CAAA;AAC9D,MAAA,IAAI,CAAC,UAAA,EAAY,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,QAAA,CAAS,WAAW,IAAI,CAAA;AAC9D,MAAA,IAAI,CAAC,UAAA,EAAY,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,aAAa,UAAA,CAAW,IAAA;AAC9B,MAAA,MAAM,aAAA,GACJ,UAAA,CAAW,IAAA,IACX,UAAA,CAAW,IAAA,IACX,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAC/B,YAAA;AACF,MAAA,MAAM,QAAA,GACJ,WAAW,QAAA,IACX,UAAA,CAAW,YACX,IAAA,CAAK,qBAAA,CAAsB,UAAA,CAAW,IAAI,CAAA,IAC1C,0BAAA;AACF,MAAA,MAAM,aAAa,IAAA,CAAK,yBAAA;AAAA,QACtB,aAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA,CAAW;AAAA,OACb;AAEA,MAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,SAAA;AAAA,QACrC,UAAA;AAAA,QACA,UAAA,CAAW,IAAA;AAAA,QACX,QAAA;AAAA,QACA;AAAA,UACE,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA;AAAA,UACtC,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,MAAA;AAAA,UACxC,UAAU,UAAA,CAAW;AAAA;AACvB,OACF;AACA,MAAA,IAAI,CAAC,WAAA,EAAa,OAAA,IAAW,CAAC,YAAY,IAAA,EAAM;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,IAAA,CAAK,gBAAA,CAAiB,aAAa,CAAA;AAAA,QACzC,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,QAAA,IAAY,QAAA;AAAA,QACvC,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAA,IAAQ,WAAW,IAAA,IAAQ,CAAA;AAAA,QAClD,OAAO,WAAA,CAAY,IAAA,CAAK,KAAA,IAAS,UAAA,CAAW,SAAS,UAAA,CAAW,KAAA;AAAA,QAChE,QAAQ,WAAA,CAAY,IAAA,CAAK,MAAA,IAAU,UAAA,CAAW,UAAU,UAAA,CAAW;AAAA,OACpE,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,IAAA,EAAsB;AAC/C,IAAA,MAAM,aAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAClD,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACvC,IAAA,OAAO,QAAQ,OAAO,CAAA,CAAA;AAAA,EACxB;AAAA,EAEA,MAAc,iBACZ,GAAA,EACwB;AACxB,IAAA,IAAI,CAAC,GAAA,IAAO,MAAA,CAAO,KAAK,GAAG,CAAA,CAAE,WAAW,CAAA,EAAG;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,cAAA;AAC/B,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,WAAA,CAAY,KAAK,aAAa,CAAA;AAAA,EACvC;AAAA,EAEA,MAAc,iBAAiB,SAAA,EAAkE;AAC/F,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,cAAA;AAC/B,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,WAAA,CAAY,SAAA,EAAW,aAAa,CAAA;AACtD,IAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,IAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,8BAA8B,YAAA,EAAyC;AACnF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MACxC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAAA,CAAA;AAAA,MAWA,YAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,OAAO,OAAA,EAAQ,CAAE,IAAI,CAAC,GAAA,KAAQ,IAAI,EAAE,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAc,+BAAA,CACZ,YAAA,EACA,GAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,6BAAA,CAA8B,YAAY,CAAA;AAC3E,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAyB;AACjD,IAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAChD,MAAA,MAAM,iBAAiB,WAAA,EAAa,UAAA;AAEpC,MAAA,IAAI,QAAA,GAAW,GAAA;AACf,MAAA,IAAI,aAAA,GAAgB,QAAA;AACpB,MAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,QAAA,IAAI,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,cAAc,CAAA;AAC3C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAA,GAAS,MAAM,IAAA,CAAK,8BAAA,CAA+B,cAAc,CAAA;AACjE,UAAA,WAAA,CAAY,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAAA,QACxC;AACA,QAAA,QAAA,GAAW,IAAA,CAAK,wBAAA,CAAyB,GAAA,EAAK,MAAM,CAAA;AACpD,QAAA,aAAA,GAAgB,IAAA,CAAK,6BAAA,CAA8B,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAAA,MAC/E;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AACzD,MAAA,MAAM,aAAa,IAAA,CAAK,iBAAA,CAAkB,WAAA,EAAa,UAAA,IAAc,MAAM,aAAa,CAAA;AACxF,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA,kEAAA,CAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA,GAAI,IAAA;AAAA,QAC1C;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAA4C;AAC1C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAA4C;AAC1C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAA6C;AAC3C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAA8C;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAA6C;AAC3C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAgB;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAA,GAAgC;AAC5C,IAAA,IAAI,IAAA,CAAK,sBAAsBH,sBAAAA,EAAuB;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAEpD,IAAA,IAAI,iBAAiBA,sBAAAA,EAAuB;AAC1C,MAAA,MAAM,IAAA,CAAK,cAAc,cAAc,CAAA;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,iBAAA,GAAoBA,sBAAAA;AAAA,EAC3B;AAAA,EAEA,MAAc,iBAAA,GAAqC;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAI,KAEvC,CAAA,gEAAA,CAAkE,CAAA;AAErE,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAE5B,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA;AACtB,QAAA,MAAM,SACJ,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,QAAA,CAAS,OAAiB,EAAE,CAAA;AAClE,QAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAK,MAAA,GAAoB,CAAA;AAAA,MACxD;AAEA,MAAA,OAAO,CAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,WAAA,EAAoC;AAC9D,IAAA,KAAA,MAAWpB,eAAamB,WAAAA,EAAY;AAClC,MAAA,IAAInB,WAAAA,CAAU,UAAU,WAAA,EAAa;AACnC,QAAA,MAAMA,WAAAA,CAAU,EAAA,CAAG,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,MAAA,EAUc;AAC/B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,MAAM,cAAc,IAAA,CAAK,kBAAA,CAAmB,OAAO,GAAA,IAAO,MAAA,CAAO,SAAS,IAAI,CAAA;AAC9E,IAAA,MAAM,mBAAmB,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,SAAA,IAAa,MAAM,WAAW,CAAA;AAC1F,IAAA,IAAI,GAAA,GAAM,WAAA;AACV,IAAA,IAAI,QAAA,GAAW,gBAAA;AAIf,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,MAAM,CAAA;AACvD,MAAA,MAAM,SAAA,GAAY,cAAc,GAAA,IAAO,IAAA;AACvC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,8BAAA;AAAA,UACjC,MAAA,CAAO;AAAA,SACT;AACA,QAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,wBAAA,CAAyB,SAAA,EAAW,eAAe,CAAA;AAClF,QAAA,MAAM,wBAAwB,IAAA,CAAK,6BAAA;AAAA,UACjC,cAAc,SAAA,IAAa,IAAA;AAAA,UAC3B,iBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,GAAA,GAAM,iBAAA,GACF,EAAE,GAAG,iBAAA,EAAmB,GAAI,GAAA,IAAO,IAAI,GACvC,GAAA;AACJ,QAAA,QAAA,GAAW;AAAA,UACT,GAAI,yBAAyB,EAAC;AAAA,UAC9B,GAAI,YAAY;AAAC,SACnB;AACA,QAAA,QAAA,GAAW,IAAA,CAAK,sBAAA,CAAuB,QAAA,EAAU,GAAG,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AACpD,IAAA,MAAM,aAAa,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,UAAA,IAAc,MAAM,QAAQ,CAAA;AAE7E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA;AAAA,+CAAA,CAAA;AAAA,MAEA,EAAA;AAAA,MACA,MAAA,CAAO,UAAA;AAAA,MACP,OAAO,OAAA,IAAW,IAAA;AAAA,MAClB,OAAO,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAAA,MAC5C,YAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA,GAAI,IAAA;AAAA,MAC1C,OAAO,MAAA,IAAU,IAAA;AAAA,MACjB;AAAA,KACF;AAEA,IAAA,MAAM,MAAA,GAA8B;AAAA,MAClC,EAAA;AAAA,MACA,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAA,EAAS,OAAO,OAAA,IAAW,IAAA;AAAA,MAC3B,IAAA,EAAM,OAAO,IAAA,IAAQ,IAAA;AAAA,MACrB,GAAA;AAAA,MACA,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,GAAA;AAAA,MACP,UAAA;AAAA,MACA,MAAA,EAAQ,OAAO,MAAA,IAAU,IAAA;AAAA,MACzB,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA;AAG1D,IAAA,IAAA,CAAK,eAAe,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAA,EAAQ,aAAa,CAAA;AAEnE,IAAA,MAAM,IAAA,CAAK,0BAA0B,MAAM,CAAA;AAE3C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,0BAA0B,MAAA,EAA4C;AAClF,IAAA,IAAI,QAAA,GAAgB,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,QAAA,EAAU,KAAK,CAAA,GAAI,QAAA,CAAS,QAAQ,EAAC;AACnE,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,KAAK,KAAA,EAAM;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,OAAO,EAAE,CAAA;AACpE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,IAAI,SAAS,CAAA;AAC9D,IAAA,MAAM,EAAE,eAAA,EAAAM,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAClC,IAAA,MAAM,WAAA,GAAcA,gBAAAA,CAAgB,kBAAA,CAAmB,UAAA,EAAY;AAAA,MACjE,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,UAAU,MAAA,CAAO,UAAA;AAAA,MACjB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,YAAY,MAAA,CAAO;AAAA,KACpB,CAAA;AAED,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,MAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAW;AACjC,QAAA,IAAI,OAAA,EAAS,SAAS,sBAAA,EAAwB;AAC5C,UAAA,MAAM,OAAA,CAAQ,QAAQ,WAAW,CAAA;AAAA,QACnC;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wDAAA,EAAsD,MAAM,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,EAAA,EAAiD;AAC/D,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA,CAWvC,0HAA0H,EAAE,CAAA;AAE/H,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAI,GAAA,IAAO,GAAA,CAAI,SAAS,IAAI,CAAA;AACpE,IAAA,MAAM,aAAa,GAAA,CAAI,UAAA,GAAa,KAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,GAAI,IAAA;AACjE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,UAAA,EAAY,GAAG,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,MAAM,GAAA,CAAI,IAAA,GAAO,KAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAAA,MACxC,GAAA;AAAA,MACA,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,GAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,MAAA,EAS6C;AAC7D,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,OAAc,EAAC;AAErB,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,IAAI,OAAO,gBAAA,EAAkB;AAE3B,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,CAOhB,CAAA;AACF,QAAA,IAAA,CAAK,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,QAAA,IAAA,CAAK,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,UAAA,GAAa,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA,CAAA;AAClD,MAAA,YAAA,CAAa,KAAK,0CAA0C,CAAA;AAC5D,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,UAAU,CAAA;AAAA,IAClC;AAGA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,WAAA,GAAc,aAAa,MAAA,GAAS,CAAA,GACtC,SAAS,YAAA,CAAa,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GACnC,EAAA;AAGJ,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAC7C,yCAAyC,WAAW,CAAA,CAAA;AAAA,MACpD,GAAG;AAAA,KACL;AACA,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAI,CAAE,KAAA;AAGhC,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AAEjC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAUxC,CAAA;AAAA,OAAA,EACG,WAAW;AAAA;AAAA,uBAAA,CAAA;AAAA,MAGd,GAAG,IAAA;AAAA,MACH,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC7C,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,MAAM,GAAA,CAAI,IAAA,GAAO,KAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAAA,MACxC,GAAA,EAAK,IAAA;AAAA;AAAA,MACL,SAAA,EAAW,IAAA;AAAA;AAAA,MACX,KAAA,EAAO,IAAA;AAAA;AAAA,MACP,YAAY,GAAA,CAAI,UAAA,GAAa,KAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,GAAI,IAAA;AAAA,MAC1D,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB,CAAE,CAAA;AAEF,IAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,EAAA,EAA8B;AAC/C,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,oCAAoC,EAAE,CAAA;AAGtE,IAAA,IAAA,CAAK,eAAe,EAAE,IAAA,EAAM,gBAAA,EAAkB,QAAA,EAAU,IAAI,CAAA;AAE5D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,YAAA,EAAyC;AAC9D,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MACxC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAA,CAAA;AAAA,MAUA;AAAA,KACF;AAEA,IAAA,OAAO,OAAO,OAAA,EAAQ,CAAE,IAAI,CAAC,GAAA,KAAQ,IAAI,EAAE,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,EAAA,EAAY,UAAA,EAAsC;AACxE,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,8CAAA,CAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,EAAA,EACA,MAAA,EACqC;AACrC,IAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAgB,EAAC;AACvB,IAAA,IAAI,kBAAA,GAAqB,KAAA;AAEzB,IAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,KAAK,aAAa,CAAA;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,MAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,IAAA,GAAO,IAAA,CAAK,UAAU,MAAA,CAAO,IAAI,IAAI,IAAI,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,MAAA,CAAO,GAAA,KAAQ,MAAA,IAAa,MAAA,CAAO,UAAU,MAAA,EAAW;AAC1D,MAAA,MAAM,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,GAAA,IAAO,MAAA,CAAO,SAAS,IAAI,CAAA;AACtE,MAAA,MAAM,WAAW,IAAA,CAAK,sBAAA;AAAA,QACpB,MAAA,CAAO,SAAA,KAAc,MAAA,GAAY,MAAA,CAAO,YAAY,QAAA,CAAS,SAAA;AAAA,QAC7D;AAAA,OACF;AACA,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AACpD,MAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AACtB,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AAExB,MAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AACxB,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AACxB,MAAA,MAAM,aAAa,IAAA,CAAK,iBAAA;AAAA,QACtB,MAAA,CAAO,UAAA,KAAe,MAAA,GAAY,MAAA,CAAO,aAAa,QAAA,CAAS,UAAA;AAAA,QAC/D;AAAA,OACF;AACA,MAAA,MAAM,mBAAmB,IAAA,CAAK,sBAAA,CAAuB,QAAA,CAAS,SAAA,EAAW,SAAS,GAAG,CAAA;AACrF,MAAA,IACE,MAAA,CAAO,UAAA,KAAe,MAAA,IACtB,MAAA,CAAO,SAAA,KAAc,MAAA,IACrB,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA,KAAM,IAAA,CAAK,iBAAA,CAAkB,gBAAgB,CAAA,EAC5E;AACA,QAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,QAAA,MAAA,CAAO,KAAK,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,UAAU,IAAI,IAAI,CAAA;AAAA,MAC5D;AACA,MAAA,kBAAA,GAAqB,IAAA;AAAA,IACvB,CAAA,MAAA,IAAW,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,UAAA,GAAa,IAAA,CAAK,UAAU,MAAA,CAAO,UAAU,IAAI,IAAI,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAEd,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,mBAAA,EAAsB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,CAAA;AAAA,MACxC,GAAG;AAAA,KACL;AAEA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,MAAM,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,GAAA,IAAO,MAAA,CAAO,SAAS,IAAI,CAAA;AACtE,MAAA,MAAM,WAAW,IAAA,CAAK,sBAAA;AAAA,QACpB,MAAA,CAAO,SAAA,KAAc,MAAA,GAAY,MAAA,CAAO,YAAY,QAAA,CAAS,SAAA;AAAA,QAC7D;AAAA,OACF;AACA,MAAA,MAAM,IAAA,CAAK,+BAAA,CAAgC,EAAA,EAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AACvC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAC3D,MAAA,IAAA,CAAK,eAAe,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAA,EAAQ,aAAa,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,GAA2B;AACjC,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,cAAA;AAC/B,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,KAAA,EAAgC;AAC5D,IAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,IAAA,CAAK,kBAAkB,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAc,gBAAgB,SAAA,EAAoC;AAChE,IAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,kBAAkB,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAc,aAAA,CACZ,KAAA,EACA,MAAA,GAAiB,EAAA,EACgB;AACjC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,MAAM,CAAA;AAC7D,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,KAAA;AAAA,IAC1B;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAc,oBAAA,CACZ,KAAA,EACA,MAAA,GAAiB,EAAA,EACU;AAC3B,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAOxC,CAAA;AAAA;AAAA,sCAAA,CAAA;AAAA,MAGA,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,UAA4B,EAAC;AACnC,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,KAAA,EAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,KAAK,CAAA;AAAA,UAC3C,IAAA,EAAM,GAAA,CAAI,UAAA,KAAe,MAAA,GAAS,MAAA,GAAS,QAAA;AAAA,UAC3C,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,YAAY,GAAA,CAAI;AAAA,SACjB,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,sBAAA,CACZ,KAAA,EACA,MAAA,GAAiB,EAAA,EACsB;AACvC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,MAAM,CAAA;AAC7D,IAAA,MAAM,WAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AAAA,MACzB;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAA,CACZ,KAAA,EACA,MAAA,EACA,KACA,QAAA,EACe;AACf,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,gDAAA,CAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,qBAAqB,IAAA,CAAK,sBAAA,CAAuB,YAAY,IAAA,EAAM,GAAG,KAAK,EAAC;AAClF,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACzB,CAAA;AAAA,qCAAA,CAAA;AAAA,QAEA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAAA,QAChC,kBAAA,CAAmB,IAAI,CAAA,KAAM,MAAA,GAAS,MAAA,GAAS,QAAA;AAAA,QAC/C,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,CACZ,KAAA,EACA,MAAA,EACA,MAAA,EAKe;AACf,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,MAAM,CAAA;AACzD,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,MAAM,CAAA;AAEvE,IAAA,MAAM,OAAA,GAAkC,EAAE,GAAG,UAAA,EAAW;AACxD,IAAA,MAAM,YAAA,GAA6C,EAAE,GAAG,eAAA,EAAgB;AAExE,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3D,QAAA,MAAM,QAAA,GAAW,IAAI,IAAA,EAAK;AAC1B,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,QAC5D;AACA,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,QAAQ,CAAA,iBAAA,CAAmB,CAAA;AAAA,QAC1D;AACA,QAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,cAAc,CAAA,EAAG;AAChE,QAAA,MAAM,QAAA,GAAW,IAAI,IAAA,EAAK;AAC1B,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,QACjE;AACA,QAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,KAAM,MAAA,EAAW;AACnC,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,QAAQ,CAAA,0BAAA,CAA4B,CAAA;AAAA,QACxE;AACA,QAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,UAAA,YAAA,CAAa,QAAQ,CAAA,GAAI,MAAA;AAAA,QAC3B,CAAA,MAAO;AACL,UAAA,OAAO,aAAa,QAAQ,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,UAAA,IAAc,EAAC,EAAG;AACzC,MAAA,OAAO,QAAQ,GAAG,CAAA;AAClB,MAAA,OAAO,aAAa,GAAG,CAAA;AAAA,IACzB;AAEA,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,MAAA,EAAQ,SAAS,YAAY,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,cAAA,GAAkD;AACtD,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY,EAAE,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,mBAAA,GAA6D;AACjE,IAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,UAAA,EAAY,EAAE,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,qBAAA,GAAmD;AACvD,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,UAAA,EAAY,EAAE,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,cAAA,CACJ,GAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,GAAG,KAAK,EAAC;AACpD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,sBAAA,CAAuB,QAAA,IAAY,MAAM,UAAU,CAAA;AAChF,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,EAAA,EAAI,YAAY,eAAe,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,iBAAiB,MAAA,EAIL;AAChB,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,EAAA,EAAI,MAAM,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,WAAW,MAAA,EAAiD;AAChE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAAuD;AAC3E,IAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,kBAAkB,MAAA,EAA2C;AACjE,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,MAAM,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,GAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,GAAG,KAAK,EAAC;AACpD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,sBAAA,CAAuB,QAAA,IAAY,MAAM,UAAU,CAAA;AAChF,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,YAAY,eAAe,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,YAAA,CACJ,MAAA,EACA,MAAA,EAKe;AACf,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,oCAAoC,MAAA,EAIpB;AACpB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,sCAAA;AAAA,MAChC,MAAA,CAAO;AAAA,KACT;AACA,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,gBAAgB,CAAA;AACjE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,kBAAA,CAAmB,OAAO,YAAA,IAAgB,IAAI,KAAK,EAAC;AAC7E,IAAA,MAAM,OAAA,GAAU,aAAa,OAAA,GACzB,MAAM,KAAK,UAAA,CAAW,YAAA,CAAa,OAAO,CAAA,GAC1C,EAAC;AACL,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,EAAe;AAE9C,IAAA,IAAI,QAAA,GAAgB,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AACA,IAAA,MAAM,QAAA,GAAW,KAAK,kBAAA,CAAmB,QAAA,EAAU,OAAO,QAAA,EAAU,KAAA,IAAS,IAAI,CAAA,IAAK,EAAC;AAEvF,IAAA,MAAM,YAAoC,EAAC;AAC3C,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAU,KAAA,EAAO,WAAW,QAAA,GAAW,QAAA,CAAS,MAAM,MAAA,GAAS,IAAA;AAC1F,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAU,KAAA,EAAO,WAAW,QAAA,GAAW,QAAA,CAAS,MAAM,MAAA,GAAS,IAAA;AAC1F,IAAA,IAAI,WAAA,EAAa,WAAA,CAAY,IAAA,CAAK,WAAW,CAAA;AAC7C,IAAA,IAAI,WAAA,IAAe,WAAA,KAAgB,WAAA,EAAa,WAAA,CAAY,KAAK,WAAW,CAAA;AAC5E,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA;AAClD,QAAA,MAAM,MAAM,IAAA,CAAK,kBAAA,CAAmB,WAAW,GAAA,IAAO,SAAA,EAAW,SAAS,IAAI,CAAA;AAC9E,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC/C,UAAA,IAAI,SAAA,CAAU,IAAI,CAAA,KAAM,KAAA,CAAA,EAAW;AACjC,YAAA,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,UACpB;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,YAAY,cAAA,EAAgB;AACrC,MAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,KAAM,MAAA,EAAW;AACzC,MAAA,IAAI,QAAA,CAAS,QAAQ,CAAA,KAAM,MAAA,EAAW;AACtC,MAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,KAAM,MAAA,EAAW;AACvC,MAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,KAAM,MAAA,EAAW;AACrC,MAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,KAAM,MAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB;AAEA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACzC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,gCAAgC,MAAA,EAOC;AACrC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AACpC,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,2BAAA,CAA4B,MAAA,CAAO,kBAAkB,CAAA;AAC3E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,2BAAA,CAA4B,MAAA,CAAO,iBAAiB,CAAA;AACzE,IAAA,MAAM,OAAA,GAA4C;AAAA,MAChD,QAAA,EAAU,CAAC,CAAC,MAAA,CAAO,OAAA,CAAQ,QAAA;AAAA,MAC3B,SAAA,EAAW,CAAC,CAAC,MAAA,CAAO,OAAA,CAAQ,SAAA;AAAA,MAC5B,iBAAA,EACE,MAAA,CAAO,OAAA,CAAQ,iBAAA,KAAsB,WAAW,QAAA,GAAW,QAAA;AAAA,MAC7D,oBAAA,EACE,MAAA,CAAO,OAAA,CAAQ,oBAAA,KAAyB,aAAa,UAAA,GAAa,UAAA;AAAA,MACpE,uBAAA,EACE,OAAO,MAAA,CAAO,OAAA,CAAQ,4BAA4B,QAAA,GAC9C,MAAA,CAAO,QAAQ,uBAAA,GACf,EAAA;AAAA,MACN,6BAA6B,IAAA,CAAK,2BAAA;AAAA,QAChC,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACA,kBAAA,EACE,OAAO,MAAA,CAAO,OAAA,CAAQ,uBAAuB,QAAA,GACzC,MAAA,CAAO,QAAQ,kBAAA,GACf,IAAA;AAAA,MACN,WAAA,EACE,OAAO,MAAA,CAAO,OAAA,CAAQ,gBAAgB,QAAA,GAClC,MAAA,CAAO,QAAQ,WAAA,GACf,IAAA;AAAA,MACN,iBAAA,EACE,OAAO,MAAA,CAAO,OAAA,CAAQ,sBAAsB,QAAA,GACxC,MAAA,CAAO,QAAQ,iBAAA,GACf,IAAA;AAAA,MACN,cAAA,EACE,OAAO,MAAA,CAAO,OAAA,CAAQ,mBAAmB,QAAA,GACrC,MAAA,CAAO,QAAQ,cAAA,GACf;AAAA,KACR;AAEA,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA;AAAA;AAAA;AAAA,8CAAA,CAAA;AAAA,MAIA,SAAA;AAAA,MACA,MAAA,CAAO,gBAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP,MAAA,CAAO,mBAAA;AAAA,MACP,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,MACvB,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,MACtB,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,MACtB;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,SAAA;AAAA,MACZ,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,qBAAqB,MAAA,CAAO,mBAAA;AAAA,MAC5B,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA,EAEA,MAAM,4BAAA,CACJ,cAAA,EACA,SAAA,EAC2C;AAC3C,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAUxC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA;AAAA,MAMA,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,EAAQ,CAAE,CAAC,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,UAAA,GAAsB,IAAA;AAC1B,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AACN,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AACA,IAAA,MAAM,gBACJ,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,GAC/B,aACD,EAAC;AACP,IAAA,MAAM,OAAA,GAA4C;AAAA,MAChD,QAAA,EAAU,CAAC,CAAC,aAAA,CAAc,QAAA;AAAA,MAC1B,SAAA,EAAW,CAAC,CAAC,aAAA,CAAc,SAAA;AAAA,MAC3B,iBAAA,EACE,aAAA,CAAc,iBAAA,KAAsB,QAAA,GAAW,QAAA,GAAW,QAAA;AAAA,MAC5D,oBAAA,EACE,aAAA,CAAc,oBAAA,KAAyB,UAAA,GAAa,UAAA,GAAa,UAAA;AAAA,MACnE,yBACE,OAAO,aAAA,CAAc,uBAAA,KAA4B,QAAA,GAC7C,cAAc,uBAAA,GACd,EAAA;AAAA,MACN,6BAA6B,IAAA,CAAK,2BAAA;AAAA,QAChC,aAAA,CAAc;AAAA,OAChB;AAAA,MACA,oBACE,OAAO,aAAA,CAAc,kBAAA,KAAuB,QAAA,GACxC,cAAc,kBAAA,GACd,IAAA;AAAA,MACN,aACE,OAAO,aAAA,CAAc,WAAA,KAAgB,QAAA,GACjC,cAAc,WAAA,GACd,IAAA;AAAA,MACN,mBACE,OAAO,aAAA,CAAc,iBAAA,KAAsB,QAAA,GACvC,cAAc,iBAAA,GACd,IAAA;AAAA,MACN,gBACE,OAAO,aAAA,CAAc,cAAA,KAAmB,QAAA,GACpC,cAAc,cAAA,GACd;AAAA,KACR;AAEA,IAAA,IAAI,cAAuB,EAAC;AAC5B,IAAA,IAAI,aAAsB,EAAC;AAC3B,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,kBAAkB,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AACN,MAAA,WAAA,GAAc,EAAC;AAAA,IACjB;AACA,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,iBAAiB,CAAA;AAAA,IAC/C,CAAA,CAAA,MAAQ;AACN,MAAA,UAAA,GAAa,EAAC;AAAA,IAChB;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,GAAA,CAAI,EAAA;AAAA,MAChB,kBAAkB,GAAA,CAAI,gBAAA;AAAA,MACtB,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,qBAAqB,GAAA,CAAI,mBAAA;AAAA,MACzB,QAAA,EAAU,IAAA,CAAK,2BAAA,CAA4B,WAAW,CAAA;AAAA,MACtD,OAAA,EAAS,IAAA,CAAK,2BAAA,CAA4B,UAAU,CAAA;AAAA,MACpD,OAAA;AAAA,MACA,YAAY,GAAA,CAAI;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAc,8BAAA,CACZ,cAAA,EACA,SAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,+EAAA,CAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,kCAAkC,MAAA,EAIwC;AAC9E,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,4BAAA;AAAA,MACzB,MAAA,CAAO,gBAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,IAChF;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,GAAG,KAAK,EAAC;AAC5D,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,mCAAA,CAAoC;AAAA,MAClE,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,+CAAA,EAAkD,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAC3E;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GACJ,OAAO,OAAA,CAAQ,OAAA,CAAQ,uBAAuB,QAAA,GAC1C,OAAA,CAAQ,OAAA,CAAQ,kBAAA,CAAmB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,MAAK,GAC7D,EAAA;AAEN,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa;AAAA,MAC1C,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,QAAQ,MAAA,CAAO,gBAAA;AAAA,MACf,GAAA,EAAK,WAAA;AAAA,MACL,MAAM,gBAAA,GAAmB,CAAC,KAAK,kBAAA,CAAmB,gBAAgB,CAAC,CAAA,GAAI;AAAA,KACxE,CAAA;AAED,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,OAAO,gBAAgB,CAAA;AACjF,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,YAAY,EAAE,CAAA;AACvE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,IAAI,QAAQ,CAAA;AAiB/D,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAwBjE,IAAA,MAAM,yBAAA,GACJ,OAAO,YAAA,CAAa,QAAA,KAAa,UAAA,IACjC,OAAO,YAAA,CAAa,QAAA,KAAa,UAAA,IACjC,OAAO,eAAA,CAAgB,SAAA,KAAc,UAAA;AACvC,IAAA,MAAM,kBAAA,GAAqB,yBAAA,GACvB,MAAM,IAAA,CAAK,oCAAA;AAAA,MACT;AAAA,QACE,UAAU,YAAA,CAAa,QAAA;AAAA,QACvB,UAAU,YAAA,CAAa;AAAA,OACzB;AAAA,MACA;AAAA,QACE,WAAW,eAAA,CAAgB;AAAA,OAC7B;AAAA,MACA,QAAQ,OAAA,CAAQ;AAAA,QAElB,EAAC;AAEL,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,iBAAA,KAAsB,WAAW,WAAA,GAAc,MAAA;AAClF,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AACnC,IAAA,MAAM,kBAAkD,EAAC;AACzD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,kBAAA,CAAmB,QAAQ,CAAA,EAAA,EAAK;AAClD,MAAA,MAAM,UAAA,GAAa,mBAAmB,CAAC,CAAA;AACvC,MAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,QACnB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,CAAA,+BAAA,EAAkC,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,QAC1D,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,CAAC,UAAU,CAAC,CAAA;AAAA,QACxC,MAAA,EAAQ,IAAA;AAAA,QACR,YAAY,aAAA,GAAgB;AAAA,OAC7B,CAAA;AAAA,IACH;AACA,IAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,MACnB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,QAAQ,OAAA,CAAQ,uBAAA;AAAA,MACzB,WAAA,EAAa,MAAA;AAAA,MACb,UAAA,EAAY,gBAAgB,kBAAA,CAAmB;AAAA,KAChD,CAAA;AAED,IAAA,IAAI,OAAO,YAAA,CAAa,mBAAA,KAAwB,UAAA,EAAY;AAC1D,MAAA,MAAM,YAAA,CAAa,mBAAA,CAAoB,MAAA,CAAO,gBAAA,EAAkB;AAAA,QAC9D,WAAW,WAAA,CAAY,EAAA;AAAA,QACvB,MAAM,OAAA,CAAQ,mBAAA;AAAA,QACd,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,mBAAA;AAAA,QAC9C,WAAA,EACE,QAAQ,OAAA,CAAQ,iBAAA,IAChB,uBAAuB,OAAA,CAAQ,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,mBAAmB,CAAA,CAAA;AAAA,QACnF,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B,QAAA,EAAU,QAAQ,OAAA,CAAQ,QAAA;AAAA,QAC1B,MAAA,EAAQ,SAAA;AAAA,QACR,GAAI,gBAAA,GAAmB,EAAE,UAAA,EAAY,gBAAA,KAAqB,EAAC;AAAA,QAC3D,GAAI,OAAA,CAAQ,OAAA,CAAQ,cAAA,GAAiB,EAAE,cAAc,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAe,GAAI,EAAC;AAAA,QACzF,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,IAAI,OAAO,eAAA,CAAgB,eAAA,KAAoB,UAAA,EAAY;AACzD,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,QACpE;AAEA,QAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,eAAA;AAAA,UACxC,WAAA,CAAY,EAAA;AAAA,UACZ,OAAA,CAAQ,UAAA;AAAA,UACR,eAAA;AAAA,UACA;AAAC,SACH;AAEA,QAAA,MAAM,iBAAA,GACJ,MAAM,OAAA,CAAQ,WAAA,CAAY,WAAW,CAAA,IAAK,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAA,IAC3E,OAAO,gBAAgB,QAAA,KAAa,UAAA,IACpC,OAAO,eAAA,CAAgB,QAAA,KAAa,UAAA,IACpC,OAAO,YAAA,CAAa,SAAA,KAAc,UAAA,GAC9B,MAAM,IAAA,CAAK,oCAAA;AAAA,UACT;AAAA,YACE,UAAU,eAAA,CAAgB,QAAA;AAAA,YAC1B,UAAU,eAAA,CAAgB;AAAA,WAC5B;AAAA,UACA;AAAA,YACE,WAAW,YAAA,CAAa;AAAA,WAC1B;AAAA,UACA,IAAA,CAAK,2BAAA,CAA4B,WAAA,CAAY,WAAW;AAAA,YAE1D,EAAC;AAEP,QAAA,MAAM,iBAAiB,IAAA,CAAK,6BAAA;AAAA,UAC1B,WAAA,CAAY,EAAA;AAAA,UACZ,WAAA,CAAY,MAAA;AAAA,UACZ,WAAA,CAAY,MAAA;AAAA,UACZ,WAAA,CAAY,KAAA;AAAA,UACZ;AAAA,SACF;AACA,QAAA,IACE,QAAQ,OAAA,CAAQ,oBAAA,KAAyB,cACzC,OAAO,YAAA,CAAa,iBAAiB,UAAA,EACrC;AACA,UAAA,MAAM,YAAA,CAAa,YAAA,CAAa,MAAA,CAAO,gBAAA,EAAkB;AAAA,YACvD,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,cAAA;AAAA,YACT,WAAA,EAAa,iBAAA;AAAA,YACb,MAAA,EAAQ,IAAA;AAAA,YACR,QAAA,EAAU,EAAE,WAAA,EAAa,WAAA,CAAY,EAAA;AAAG,WACzC,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,OAAA,CAAQ,QAAQ,SAAA,EAAW;AAC7B,UAAA,IAAI,OAAO,YAAA,CAAa,yBAAA,KAA8B,UAAA,EAAY;AAChE,YAAA,MAAM,YAAA,CAAa,yBAAA;AAAA,cACjB,MAAA,CAAO,gBAAA;AAAA,cACP,WAAA,CAAY,EAAA;AAAA,cACZ,WAAA,CAAY,WAAW,YAAA,GAAe;AAAA,aACxC;AAAA,UACF;AACA,UAAA,IAAI,WAAA,CAAY,QAAA,IAAY,OAAO,eAAA,CAAgB,oBAAoB,UAAA,EAAY;AACjF,YAAA,MAAM,eAAA,CAAgB,eAAA,CAAgB,WAAA,CAAY,EAAE,CAAA;AAAA,UACtD;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,eAAA,CAAgB,eAAA,KAAoB,UAAA,EAAY;AAChE,UAAA,MAAM,eAAA,CAAgB,eAAA,CAAgB,WAAA,CAAY,EAAE,CAAA;AAAA,QACtD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,0EAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IACE,QAAQ,OAAA,CAAQ,SAAA,IAChB,OAAO,YAAA,CAAa,8BAA8B,UAAA,EAClD;AACA,UAAA,MAAM,YAAA,CAAa,yBAAA;AAAA,YACjB,MAAA,CAAO,gBAAA;AAAA,YACP,WAAA,CAAY,EAAA;AAAA,YACZ;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,MAAM,IAAA,CAAK,8BAAA;AAAA,MACT,MAAA,CAAO,gBAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,iBAAiB,WAAA,CAAY,EAAA;AAAA,MAC7B,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,MAAA,EAII;AACzB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AACnD,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,IAAI,OAAO,GAAA,IAAO,MAAA,CAAO,IAAI,MAAA,CAAO,QAAQ,MAAM,MAAA,EAAW;AAC3D,MAAA,OAAO,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AAAA,IACnC;AAEA,IAAA,IAAI,QAAA,GAAgB,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AACA,IAAA,MAAM,WAAW,IAAA,CAAK,kBAAA,CAAmB,UAAU,GAAA,IAAO,QAAA,EAAU,SAAS,IAAI,CAAA;AACjF,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,CAAO,QAAQ,MAAM,MAAA,EAAW;AACvD,MAAA,OAAO,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,kBAAA,GACJ,MAAA,CAAO,UAAA,KAAe,OAAO,QAAA,EAAU,OAAO,MAAA,KAAW,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,MAAA,CAAA;AAC9F,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,UAAA,CAAW,kBAAkB,CAAA;AAC1D,QAAA,MAAM,YAAY,IAAA,CAAK,kBAAA,CAAmB,WAAW,GAAA,IAAO,SAAA,EAAW,SAAS,IAAI,CAAA;AACpF,QAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,CAAO,QAAQ,MAAM,KAAA,CAAA,EAAW;AACzD,UAAA,OAAO,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,QAClC;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,OAAO,CAAA;AACpD,MAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,KAAM,MAAA,EAAW;AAC1C,QAAA,OAAO,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,EAAe;AAC9C,IAAA,IAAI,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA,KAAM,MAAA,EAAW;AAC9C,MAAA,OAAO,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,qBAAqB,MAAA,EAID;AACxB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AACnD,IAAA,IAAI,CAAC,QAAQ,OAAO,QAAA;AAEpB,IAAA,IAAI,OAAO,GAAA,IAAO,MAAA,CAAO,IAAI,MAAA,CAAO,QAAQ,MAAM,MAAA,EAAW;AAC3D,MAAA,OAAO,OAAO,SAAA,GAAY,MAAA,CAAO,QAAQ,CAAA,KAAM,SAAS,MAAA,GAAS,QAAA;AAAA,IACnE;AAEA,IAAA,IAAI,QAAA,GAAgB,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AACA,IAAA,MAAM,WAAW,IAAA,CAAK,kBAAA,CAAmB,UAAU,GAAA,IAAO,QAAA,EAAU,SAAS,IAAI,CAAA;AACjF,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,CAAO,QAAQ,MAAM,MAAA,EAAW;AACvD,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,kBAAA,GACJ,MAAA,CAAO,UAAA,KAAe,OAAO,QAAA,EAAU,OAAO,MAAA,KAAW,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,MAAA,CAAA;AAC9F,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,UAAA,CAAW,kBAAkB,CAAA;AAC1D,QAAA,MAAM,YAAY,IAAA,CAAK,kBAAA,CAAmB,WAAW,GAAA,IAAO,SAAA,EAAW,SAAS,IAAI,CAAA;AACpF,QAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,CAAO,QAAQ,MAAM,KAAA,CAAA,EAAW;AACzD,UAAA,OAAO,QAAA;AAAA,QACT;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,OAAO,CAAA;AACpD,MAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,KAAM,MAAA,EAAW;AAC1C,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,OAAO,CAAA;AAC9D,QAAA,OAAO,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAA,KAAM,SAAS,MAAA,GAAS,QAAA;AAAA,MAC7D;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,EAAe;AAC9C,IAAA,IAAI,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA,KAAM,MAAA,EAAW;AAC9C,MAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AACxD,MAAA,OAAO,gBAAA,CAAiB,MAAA,CAAO,QAAQ,CAAA,KAAM,SAAS,MAAA,GAAS,QAAA;AAAA,IACjE;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,qBACZ,MAAA,EAC6D;AAC7D,IAAA,MAAM,WAAA,GAAkE;AAAA,MACtE,GAAG;AAAA,KACL;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AACvD,MAAA,WAAA,CAAY,KAAA,GAAQ;AAAA,QAClB,MAAM,MAAA,CAAO,UAAA;AAAA,QACb,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,MAAA,CAAO,UAAA;AAAA,QAChC,IAAA,EAAM,SAAS,IAAA,IAAQ,SAAA;AAAA,QACvB,aAAa,QAAA,CAAS,WAAA;AAAA,QACtB,MAAM,QAAA,CAAS;AAAA,OACjB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAU,IAAA,EAA4B;AAC1C,IAAA,MAAM,QAAA,GAAW,KAAK,MAAA,EAAO;AAC7B,IAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA0B;AACxB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,IAAA,EAA4B;AAC3C,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,EAAQ;AAC9B,IAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA2B;AACzB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,UAAU,IAAA,EAA4B;AAE1C,IAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,MAAA,MAAM,CAAC,SAAA,EAAW,SAAS,CAAA,GAAI,mBAAmB,IAAI,CAAA;AACtD,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,MAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAA6B,IAAI,CAAA,aAAA,EAAgB,SAAS,gBAAgB,SAAS,CAAA,qBAAA,EAAwB,GAAA,EAAK,QAAA,GAAW,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,GAAI,WAAW,CAAA,CAAE,CAAA;AAEhL,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAAA,MAC7E;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,6BAAA,CAA+B,CAAA;AAAA,MACzE;AACA,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,cAAc,SAAS,CAAA,wBAAA,EAA2B,MAAA,CAAO,IAAA,CAAK,IAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAClI;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,MAAA,GAAS,SAAS,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,SAAA,EAAY,SAAS,2BAA2B,SAAS,CAAA,qBAAA,EAAwB,OAAO,IAAA,CAAK,GAAA,CAAI,UAAU,EAAE,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACrK;AACA,MAAA,OAAO,MAAM,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAE;AAAA,IACrC;AAGA,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,EAAO;AACjC,IAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAChC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA0B;AACxB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,IAAA,EAAwC;AACxD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA,CAIvC,2DAA2D,IAAI,CAAA;AAElE,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,QAAA,EAAmC;AACnD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,sEAAA,CAAA;AAAA,MACA,QAAA,CAAS,IAAA;AAAA,MACT,QAAA,CAAS,GAAA;AAAA,MACT,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAqC;AACzC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAI,KAIvC,CAAA,wCAAA,CAA0C,CAAA;AAE7C,IAAA,OAAO,OAAO,OAAA,EAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,IAAA,EAAgC;AACnD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,wCAAwC,IAAI,CAAA;AAC5E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kBAAkB,QAAA,EAAwC;AAC9D,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAQxC,CAAA;AAAA,oCAAA,CAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,eAAe,GAAA,CAAI,aAAA;AAAA,MACnB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,EAAA,EAAkC;AAClD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAQxC,CAAA;AAAA,8BAAA,CAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,eAAe,GAAA,CAAI,aAAA;AAAA,MACnB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAA,EAIC;AAChB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA;AAAA,gCAAA,CAAA;AAAA,MAEA,EAAA;AAAA,MACA,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,aAAA;AAAA,MACP,OAAO,IAAA,IAAQ,OAAA;AAAA,MACf,GAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,IAAA,EAAM,OAAO,IAAA,IAAQ,OAAA;AAAA,MACrB,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA6B;AACjC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MACxC,CAAA,mCAAA;AAAA,KACF;AAEA,IAAA,OAAO,MAAA,CAAO,GAAA,EAAI,CAAE,KAAA,GAAQ,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAQJ;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAI,KAMvC,CAAA,qFAAA,CAAuF,CAAA;AAE1F,IAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACpC,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,EAAA,EACA,MAAA,EAKsB;AACtB,IAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC1C,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,MAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAW;AACtC,MAAA,OAAA,CAAQ,KAAK,mBAAmB,CAAA;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,aAAa,CAAA;AAAA,IAClC;AACA,IAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,MAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,IAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAEd,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,iBAAA,EAAoB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,CAAA;AAAA,MACtC,GAAG;AAAA,KACL;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,EAAA,EAA8B;AAC7C,IAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,sCAAA,CAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,sCAAA,CAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,kCAAkC,EAAE,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAc,MAAA,EAIA;AAClB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA;AAAA,6BAAA,CAAA;AAAA,MAEA,EAAA;AAAA,MACA,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP;AAAA,KACF;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SAAA,EACyD;AACzD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAIxC,CAAA;AAAA,8CAAA,CAAA;AAAA,MAEA,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAmC;AACvC,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,0CAAA,CAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAAkC;AACpD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,yCAAA,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,MAAA,EAMC;AAClB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA;AAAA,mCAAA,CAAA;AAAA,MAEA,EAAA;AAAA,MACA,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP,MAAA,CAAO,SAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP;AAAA,KACF;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAAkE;AACrF,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA,CAGvC,uDAAuD,OAAO,CAAA;AAEjE,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,uDAAA,CAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,KAAK,CAAC,CAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,MAAA,EAUA;AACA,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAQxC,CAAA;AAAA,+DAAA,CAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,OAAO,OAAO,OAAA,EAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,EAAA,EAAY,MAAA,EAAkC;AAC/D,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,iDAAA,CAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,MAAA,EAKL;AAChB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA;AAAA,gCAAA,CAAA;AAAA,MAEA,EAAA;AAAA,MACA,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,gBAAA;AAAA,MACP,OAAO,iBAAA,IAAqB,IAAA;AAAA,MAC5B;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,QAAA,EACA,cAAA,EACsB;AACtB,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MACxC,CAAA,8EAAA,CAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,CAAC,EAAE,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAgB,MAAA,EAGD;AACnB,IAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAI,KAGvC,CAAA,iEAAA,CAAmE,CAAA;AAEtE,IAAA,MAAM,GAAA,GAAM,OAAO,GAAA,EAAI;AACvB,IAAA,IAAI,IAAI,SAAA,EAAW;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,yFAAA,CAAA;AAAA,MACA,MAAA,CAAO,SAAA;AAAA,MACP,GAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAA,EAAoC;AACxD,IAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MACxC,CAAA,sDAAA;AAAA,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,OAAO,GAAA,EAAI;AACvB,IAAA,IAAI,GAAA,CAAI,cAAc,QAAA,EAAU;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,0HAAA;AAAA,KACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAMH;AACD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA;AAAA,MAMxC,CAAA,+FAAA;AAAA,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,OAAO,GAAA,EAAI;AACvB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAC,CAAC,GAAA,CAAI,SAAA;AAAA,MACd,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,iBAAiB,GAAA,CAAI;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAA,EAAgC;AACtD,IAAA,MAAM,KAAK,cAAA,EAAe;AAE1B,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACzB,CAAA,+DAAA,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAc,QAAA,EAAqC;AACjD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,WAAW,QAAQ,CAAA;AAC9D,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAM,OAAA,EAAqC;AAC/C,IAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,IAAI,aAAA,EAAe,WAAA,EAAY,KAAM,WAAA,EAAa;AAChD,MAAA,OAAO,IAAA,CAAK,6BAA6B,OAAO,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,IAAI,QAAA,CAAS,kCAAA,EAAoC,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,6BACZ,OAAA,EACmB;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,aAAA,EAAc;AAC/B,IAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,MAAA,CAAO,OAAO,IAAI,CAAA;AAI3C,IAAA,IAAA,CAAK,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAI/B,IAAA,MAAA,CAAO,mBAAA,CAAoB,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AAGhD,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,MAAM,CAAA;AAE5B,IAAA,OAAO,IAAI,SAAS,IAAA,EAAM;AAAA,MACxB,MAAA,EAAQ,GAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAAgC;AACrD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACpC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA,EAAG;AAC9C,MAAA,IAAI;AACF,QAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AACpC,UAAA,EAAA,CAAG,KAAK,OAAO,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,EAAE,CAAA;AAAA,QAC7B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,YAAA,CAAa,OAAO,EAAE,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAA,CACJ,EAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI;AAEF,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,MAAA,EAAQ;AACrD,QAAA,EAAA,CAAG,KAAK,MAAM,CAAA;AACd,QAAA;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2DAA2D,KAAK,CAAA;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CACJ,EAAA,EACA,IAAA,EACA,QACA,QAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,GAAG,qBAAA,EAAsB;AAG5C,IAAA,IAAI,UAAA,EAAY,YAAY,QAAA,EAAU;AACpC,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,EAAE,CAAA;AAAA,IAC7B;AAGA,IAAA,EAAA,CAAG,KAAA,CAAM,MAAM,MAAM,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CAAe,EAAA,EAAe,KAAA,EAA+B;AACjE,IAAA,MAAM,UAAA,GAAa,GAAG,qBAAA,EAAsB;AAC5C,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,CAAA,gDAAA,EAAmD,YAAY,OAAO,CAAA,EAAA,CAAA;AAAA,MACtE;AAAA,KACF;AAGA,IAAA,IAAI,UAAA,EAAY,YAAY,QAAA,EAAU;AACpC,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,EAAE,CAAA;AAAA,IAC7B;AAAA,EACF;AACF;AC59FO,IAAM,mBAAA,GAAN,cAAkC,gBAAA,CAAsD;AAAA,EAC7F,MAAM,IAAA,CACJ,QAAA,EACA,KAAA,EACA,YACA,WAAA,EACkB;AAClB,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,KAAA,EAAO;AACvB,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,WAAW,QAAQ,CAAA;AACnE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,IAAI,SAAS,CAAA;AAC1D,IAAA,OAAO,MAAA,CAAO,uBAAA,CAAwB,KAAA,EAAO,UAAA,EAAY,WAAW,CAAA;AAAA,EACtE;AACF;;;ACyEA,cAAA,EAAA;;;ACtGA,UAAA,EAAA;AA6CO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBxB,OAAO,SAAA,CACL,IAAA,EACA,QAAA,EACA,IAAA,GAAgC,EAAC,EAC3B;AACN,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,OAChC;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AAAA,KAC1B;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACjC,IAAA,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqCA,aAAa,aAAA,CACX,IAAA,EACA,OAAA,EACkB;AAClB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,EAAA,IAAM,MAAA,CAAO,UAAA,EAAW;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AAIjC,IAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,KAAA;AAC/C,IAAA,MAAM,OAAA,GAAmB;AAAA,MACvB,EAAA,EAAI,SAAA;AAAA,MACJ,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,MACtB,YAAA,EAAc,QAAQ,UAAA,IAAc,IAAA;AAAA,MACpC,UAAA,EAAY,SAAA;AAAA,MACZ,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA;AAAA,MACA,SAAA,EAAW,aAAA,GAAgB,IAAA,GAAQ,IAAA,CAAK,eAAA,IAAmB,IAAA;AAAA,MAC3D,KAAA,EAAO,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK;AAAA,KAClC;AAEA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAG3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,QACpC,CAAA,4CAAA,CAAA;AAAA,QACA,OAAA,CAAQ;AAAA,OACV;AACA,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,MAAA,MAAM,aAAA,GAAgB,KAAK,CAAC,CAAA;AAE5B,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,gBAAA,EAAmB,QAAQ,eAAe,CAAA,UAAA;AAAA,SAC5C;AAAA,MACF;AAGA,MAAA,OAAA,CAAQ,UAAA,GAAc,cAAc,UAAA,GAAwB,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAGjG,IAAA,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAI,IAAA;AAAA,MACrB,CAAA,2JAAA,CAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,YAAA;AAAA,MACR,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,MAAA;AAAA,MACR,SAAS,CAAA,GAAI,CAAA;AAAA,MACb,OAAA,CAAQ,SAAA;AAAA,MACR,OAAA,CAAQ,KAAA;AAAA,MACR;AAAA,KACF;AAIA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,IAClC,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,cAAA,GAAiB,MAAM,aAAA,CAAa,aAAA,CAAc,IAAI,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,aAAA,CAAa,SAAA,CAAU,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,aAAa,YACX,IAAA,EACA,KAAA,GAAgB,KAChB,MAAA,GAAiB,CAAA,EACjB,QAAwB,KAAA,EACJ;AACpB,IAAA,MAAM,WAAA,GAAc,KAAA,KAAU,MAAA,GAAS,MAAA,GAAS,KAAA;AAEhD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACpC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAA,EAkBsB,WAAW,WAAW,WAAW;AAAA,sBAAA,CAAA;AAAA,MAEvD,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,WAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,EAAU;AACpC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACtC,UAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,YAAA,QAAA,GAAW,MAAA;AAAA,UACb;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,QAAA,GAAW,MAAA;AAAA,QACb;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,cAAc,GAAA,CAAI,YAAA;AAAA,QAClB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,iBAAiB,GAAA,CAAI,eAAA;AAAA,QACrB,uBAAuB,GAAA,CAAI,qBAAA;AAAA,QAC3B,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAA,EAAQ,IAAI,MAAA,KAAW,CAAA;AAAA,QACvB,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,QAAA;AAAA,QACA,aAAa,GAAA,CAAI;AAAA,OAClB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,aAAa,cAAc,KAAA,EAAsC;AAE/D,IAAA,MAAM,EAAE,UAAA,EAAAtB,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC7B,IAAA,KAAA,CAAM,cAAA,GAAiB,MAAMA,WAAAA,CAAW,kBAAA,CAAmB,KAAK,CAAA;AAChE,IAAA,OAAO,KAAA,CAAM,cAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,OAAO,SAAA,CAAU,IAAA,EAAiB,OAAA,EAAiC;AACjE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAA,CAAQ,KAAK,2CAA2C,CAAA;AACxD,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,IAAA,EAAM,QAAA;AAAA,MACN,YAAY,OAAA,CAAQ,IAAA;AAAA,MACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACxC,IAAA,KAAA,MAAW,EAAA,IAAO,IAAA,CAAK,MAAA,CAAe,aAAA,IAAiB,EAAC,EAAG;AACzD,MAAA,IAAI;AACF,QAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AACpC,UAAA,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,QACnB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,OAAO,SAAA,CAAU,IAAA,EAAiB,IAAA,EAAiC;AAGjE,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAAA,EACF;AACF;AA2CO,SAAS,iBAAiB,IAAA,EAAmC;AAClE,EAAA,MAAM,QAAA,GAAW,IAAA;AAEjB,EAAA,QAAA,CAAS,SAAA,GAAY,CAAC,QAAA,EAAuC,IAAA,KAAmC;AAC9F,IAAA,YAAA,CAAa,SAAA,CAAU,IAAA,EAAM,QAAA,EAAU,IAAI,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,QAAA,CAAS,aAAA,GAAgB,CAAC,OAAA,KAAkC;AAC1D,IAAA,OAAO,YAAA,CAAa,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAAA,EACjD,CAAA;AAEA,EAAA,QAAA,CAAS,WAAA,GAAc,CACrB,KAAA,EACA,MAAA,EACA,KAAA,KACG;AACH,IAAA,OAAO,YAAA,CAAa,WAAA,CAAY,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAK,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,QAAA,CAAS,gBAAgB,MAAM;AAC7B,IAAA,OAAO,YAAA,CAAa,cAAc,IAAI,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,QAAA,CAAS,SAAA,GAAY,CAAC,OAAA,KAA8B;AAClD,IAAA,YAAA,CAAa,SAAA,CAAU,MAAM,OAAO,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,QAAA,CAAS,SAAA,GAAY,CAAC,IAAA,KAA8B;AAClD,IAAA,YAAA,CAAa,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,OAAO,QAAA;AACT;;;AD1WA,YAAA,EAAA;AAWA,qBAAA,EAAA;AACAL,WAAAA,EAAAA","file":"runtime.js","sourcesContent":["import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\nimport type { StreamManager } from \"./StreamManager\";\nimport { type z, type ZodObject, type ZodRawShape } from \"zod\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport type {\n HookSignatures,\n HookName,\n HookMessage,\n HookToolCall,\n HookToolResult as SpecHookToolResult,\n ToolResult as SpecToolResult,\n ThreadState,\n CodeExecutionOptions,\n CodeExecutionResult,\n InjectMessageInput,\n QueueMessageInput,\n SubagentRegistryEntry,\n VariableDefinition,\n} from \"@standardagents/spec\";\n\n/**\n * Agent configuration from D1 agents table\n */\nexport interface Agent {\n id: string;\n title: string;\n type: \"dual_ai\" | \"ai_human\";\n created_at: number;\n\n // Global configuration\n max_session_turns: number | null; // Total back-and-forth exchanges allowed (dual_ai only)\n\n // Side A configuration\n side_a_label: string | null; // Optional custom label (e.g., \"ATC\", \"Pilot\")\n side_a_agent_prompt: string | null;\n side_a_stop_on_response: boolean;\n side_a_stop_tool: string | null;\n side_a_stop_tool_response_property: string | null;\n side_a_max_steps: number | null; // Per-side safety limit (LLM request/response cycles)\n side_a_session_stop_tool: string | null;\n side_a_session_stop_message_property: string | null;\n side_a_session_stop_attachments_property: string | null;\n side_a_session_fail_tool: string | null;\n side_a_session_fail_message_property: string | null;\n side_a_session_fail_attachments_property: string | null;\n side_a_session_status_tool: string | null;\n side_a_session_status_message_property: string | null;\n side_a_session_status_attachments_property: string | null;\n\n // Side B configuration (null for ai_human type)\n side_b_label: string | null; // Optional custom label (e.g., \"ATC\", \"Pilot\")\n side_b_agent_prompt: string | null;\n side_b_stop_on_response: boolean;\n side_b_stop_tool: string | null;\n side_b_stop_tool_response_property: string | null;\n side_b_max_steps: number | null; // Per-side safety limit (LLM request/response cycles)\n side_b_session_stop_tool: string | null;\n side_b_session_stop_message_property: string | null;\n side_b_session_stop_attachments_property: string | null;\n side_b_session_fail_tool: string | null;\n side_b_session_fail_message_property: string | null;\n side_b_session_fail_attachments_property: string | null;\n side_b_session_status_tool: string | null;\n side_b_session_status_message_property: string | null;\n side_b_session_status_attachments_property: string | null;\n\n // Hook IDs to run for this agent (fallback when prompts don't specify hooks)\n hooks?: string[];\n}\n\n/**\n * Message in OpenAI chat completion format\n */\nexport interface Message {\n id: string;\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | null;\n name?: string | null;\n tool_calls?: string | null; // JSON array of tool calls\n tool_call_id?: string | null;\n log_id?: string | null; // Log that produced this message\n created_at: number; // Microseconds since epoch\n\n // Request/Response timing\n request_sent_at?: number | null; // Microseconds - when LLM request was sent\n response_completed_at?: number | null; // Microseconds - when response was fully received\n status?: \"pending\" | \"completed\" | \"failed\" | null; // Message status\n silent?: boolean; // Whether this message is hidden from the LLM (UI-only)\n tool_status?: \"success\" | \"error\" | null; // Status of tool execution (for role='tool' messages only)\n\n // Reasoning content from models like o1 (stored for message history inclusion)\n reasoning_content?: string | null;\n\n // Reasoning details from OpenRouter (structured reasoning blocks)\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n // Contains array of reasoning detail objects (summary, encrypted, or text types)\n // Must be preserved exactly as returned for proper multi-turn reasoning continuity\n reasoning_details?: string | null; // JSON array of reasoning detail objects\n\n // Hierarchical tracking for sub-prompts\n parent_id?: string | null; // Parent message ID for sub-prompt messages (NULL for top-level)\n depth?: number; // Nesting depth: 0 for top-level, 1+ for sub-prompts\n\n // File attachments (JSON array of AttachmentRef objects)\n attachments?: string | null; // JSON array of AttachmentRef\n\n // Structured message metadata\n metadata?: Record<string, unknown>;\n\n // Subagent reference UUID associated with this message\n subagent_id?: string | null;\n subagent_name?: string | null;\n subagent_title?: string | null;\n subagent_description?: string | null;\n subagent_status?: string | null;\n subagent_resumable?: boolean | null;\n subagent_blocking?: boolean | null;\n subagent_thread_name?: string | null;\n subagent_spawn_group_id?: string | null;\n}\n\n/**\n * Tool call from OpenAI format\n */\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n /**\n * Provider-specific metadata persisted with the tool call.\n * This lets providers like Google round-trip required tool-call state such\n * as Gemini thought signatures through message history.\n */\n extra_content?: Record<string, unknown>;\n forceAllow?: boolean;\n queued_at?: number; // Timestamp when queued via queueTool()\n}\n\n/**\n * Tool call detail stored in tool_calls table\n */\nexport interface ToolCallDetail {\n id: string;\n message_id: string;\n type: string;\n function_name: string;\n function_arguments: string;\n created_at: number;\n}\n\n/**\n * Thread metadata from DurableAgentBuilder\n * Note: agent_id is now the agent name (not UUID) since agents are in TypeScript\n */\nexport interface ThreadMetadata {\n id: string;\n agent_id: string; // Agent name from TypeScript config\n user_id: string | null;\n env: Record<string, string> | null;\n env_types?: Record<string, 'text' | 'secret'> | null;\n /** @deprecated Use env */\n tenvs: Record<string, unknown> | null;\n properties: Record<string, unknown> | null;\n parent?: string | null;\n terminated?: number | null;\n created_at: number;\n}\n\n// ============================================================================\n// Hook Types\n// ============================================================================\n\n/**\n * A loaded hook definition with its metadata.\n * Generic K preserves the hook type for type-safe execution.\n *\n * @template K - Hook type from HookSignatures (e.g., 'filter_messages')\n */\nexport interface LoadedHook<K extends HookName = HookName> {\n /** The hook type name */\n hook: K;\n /** The unique hook ID */\n id: string;\n /** The typed execute function */\n execute: HookSignatures<ThreadState, HookMessage, HookToolCall, SpecHookToolResult>[K];\n}\n\n/**\n * Union type for any loaded hook (used when hook type isn't known statically).\n * This creates a discriminated union on the `hook` property.\n */\nexport type AnyLoadedHook = {\n [K in HookName]: LoadedHook<K>;\n}[HookName];\n\n/**\n * Type alias for extracting the execute function type for a specific hook.\n *\n * @template K - Hook type from HookSignatures\n */\nexport type HookExecutor<K extends HookName> = HookSignatures<\n ThreadState,\n HookMessage,\n HookToolCall,\n SpecHookToolResult\n>[K];\n\n/**\n * Hook registry type - maps hook IDs to async loaders returning typed hooks.\n * The new format uses hook IDs as keys (not hook type names).\n */\nexport type HookRegistry = Record<string, () => Promise<AnyLoadedHook | null>>;\n\n/**\n * Native tool module type - represents a loaded tool definition.\n * Tools can have args (with validation schema) or no args.\n * Uses local Zod types for compatibility with z.toJSONSchema().\n */\nexport interface NativeToolModule {\n /** Description of what the tool does (shown to the LLM). */\n description: string;\n /** Zod schema for validating tool arguments, or null for no args. */\n args: ZodObject<ZodRawShape> | null;\n /** The tool implementation function. */\n execute: ((state: any, args: Record<string, unknown>) => Promise<SpecToolResult>) | ((state: any) => Promise<SpecToolResult>);\n /** Declared variables for this tool. */\n variables?: VariableDefinition[] | null;\n /** Zod schema for thread environment variables, or null if none. */\n tenvs?: ZodObject<ZodRawShape> | null;\n /**\n * Where this tool is executed:\n * - 'local': Execute locally by the execution engine (default)\n * - 'provider': Executed by the LLM provider, results come in response\n */\n executionMode?: 'local' | 'provider';\n /**\n * Which provider executes this tool (when executionMode='provider').\n */\n executionProvider?: string;\n}\n\n/**\n * Thread instance (forward reference to avoid circular dependency)\n */\nexport interface ThreadInstance {\n ctx: DurableObjectState;\n env: ThreadEnv;\n getMessages(\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\",\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<{\n messages: Message[];\n total: number;\n hasMore: boolean;\n }>;\n getLogs(limit?: number, offset?: number, order?: \"asc\" | \"desc\"): Promise<LogData[]>;\n getThreadMeta(threadId: string): Promise<ThreadMetadata | null>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n shouldStop(): Promise<boolean>; // Check if execution should be stopped (async - reads from SQLite)\n tools(): Record<string, () => Promise<NativeToolModule>>;\n hooks(): HookRegistry;\n\n // Durable per-thread key-value store\n getValue<T = unknown>(key: string): Promise<T | null>;\n setValue(key: string, value: unknown): Promise<void>;\n\n // Sandboxed code execution bridge (implemented by DurableThread)\n registerCodeExecutionBridge?(\n runId: string,\n bridge: { call(functionId: string, encodedArgs: unknown[]): Promise<unknown> },\n ): void;\n unregisterCodeExecutionBridge?(runId: string): void;\n executeThreadStateRunCode?(\n threadId: string,\n source: string,\n options?: CodeExecutionOptions,\n wantsReport?: boolean,\n ): Promise<CodeExecutionResult>;\n executeThreadEndpointCode?(\n threadId: string,\n source: string,\n options: Pick<\n CodeExecutionOptions,\n \"language\" | \"filename\" | \"execute\" | \"modules\" | \"memoryLimitBytes\"\n >,\n ): Promise<CodeExecutionResult>;\n\n // Dynamic configuration loading from virtual modules\n loadModel(name: string): Promise<any>;\n loadPrompt(name: string): Promise<any>;\n loadAgent(name: string): Promise<any>;\n loadTool(name: string): Promise<any>;\n getPromptNames(): string[];\n getAgentNames(): string[];\n getModelNames?(): string[];\n\n // File system operations\n writeFile(path: string, data: string, mimeType: string, options?: Record<string, unknown>): Promise<any>;\n writeTextFile(path: string, content: string, mimeType: string, options?: Record<string, unknown>): Promise<any>;\n readFile(path: string): Promise<{ success: boolean; data?: string; error?: string }>;\n statFile(path: string): Promise<any>;\n readdirFile(path: string): Promise<any[]>;\n unlinkFile(path: string): Promise<void>;\n mkdirFile(path: string): Promise<any>;\n rmdirFile(path: string): Promise<void>;\n getFileStats(): Promise<any>;\n grepFiles(pattern: string): Promise<any[]>;\n findFiles(pattern: string): Promise<any>;\n getFileThumbnail(path: string): Promise<ArrayBuffer | null>;\n readFileChunk(path: string, chunkIndex: number): Promise<{\n success: boolean;\n data?: string; // base64 encoded\n error?: string;\n }>;\n\n // Agent execution\n runAgent(threadId: string, agentName: string): Promise<void>;\n\n // Subagent/message queue lifecycle\n injectMessage?(threadId: string, message: InjectMessageInput): Promise<Message>;\n queueMessage?(threadId: string, message: QueueMessageInput): Promise<void>;\n getChildrenRegistry?(threadId: string): Promise<SubagentRegistryEntry[]>;\n upsertChildRegistry?(threadId: string, entry: SubagentRegistryEntry): Promise<void>;\n updateChildRegistryStatus?(threadId: string, reference: string, status: string): Promise<void>;\n removeChildRegistry?(threadId: string, reference: string): Promise<void>;\n getTerminated?(threadId: string): Promise<number | null>;\n terminateThread?(threadId: string): Promise<{ success: boolean; terminated: number }>;\n\n // Effect scheduling\n scheduleEffect(\n threadId: string,\n effectName: string,\n effectArgs: Record<string, unknown>,\n delayMs?: number,\n options?: {\n sourceLogId?: string | null;\n }\n ): Promise<string>;\n getScheduledEffects(name?: string): Promise<Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n scheduledAt: number;\n createdAt: number;\n }>>;\n removeScheduledEffect(id: string, canceledBy?: \"agent\" | \"user\"): Promise<boolean>;\n\n // Testing utilities\n insertOrphanedToolCall(params: {\n content?: string;\n toolCallId: string;\n toolName: string;\n toolArgs: string;\n }): Promise<Response>;\n}\n\n/**\n * Tool call for internal flow management\n */\nexport type FlowToolCall = { tool: string; args: Record<string, unknown> };\n\n/**\n * Prompt call for internal flow management\n */\nexport type FlowPromptCall = { prompt: string; args: Record<string, unknown> };\n\n/**\n * Flow call (tool or prompt)\n */\nexport type FlowCall = FlowToolCall | FlowPromptCall;\n\n/**\n * Flow call with retry tracking\n */\nexport type FlowCallWithRetries = FlowCall & {\n retries: number;\n reasons: string[];\n};\n\n/**\n * Sub-prompt configuration - defines options for when a sub-prompt is called as a tool\n */\nexport interface SubpromptConfig {\n name: string;\n initUserMessageProperty?: string; // Property to use as initial user message when sub-prompt is called\n initAttachmentsProperty?: string; // Property containing attachment path(s) to include as multimodal content\n includeTextResponse?: boolean; // Include LLM text response in result string (default: true)\n includeToolCalls?: boolean; // Serialize tool call summaries into result string (default: true)\n includeErrors?: boolean; // Serialize error details into result string (default: true)\n}\n\n/**\n * Prompt tool configuration with static tenvs/options.\n */\nexport interface PromptToolConfig {\n name: string;\n env?: Record<string, string>;\n /** @deprecated Use env */\n tenvs?: Record<string, unknown>;\n options?: Record<string, unknown>;\n}\n\n/**\n * Subagent tool configuration for dual_ai agent invocation.\n */\nexport interface SubagentToolConfig {\n name: string;\n blocking?: boolean;\n initUserMessageProperty?: string;\n initAttachmentsProperty?: string;\n initAgentNameProperty?: string;\n immediate?:\n | boolean\n | {\n nameEnv?: string;\n descriptionEnv?: string;\n scopedEnv?: string[];\n };\n optional?: string;\n resumable?:\n | false\n | {\n receives_messages: \"side_a\" | \"side_b\";\n maxInstances?: number;\n parentCommunication?: \"implicit\" | \"explicit\";\n };\n}\n\n/** @deprecated Use SubpromptConfig instead */\nexport type ToolConfig = SubpromptConfig;\n\n/**\n * Prompt configuration - now loaded from TypeScript virtual modules\n */\nexport interface PromptData {\n id: string;\n name: string;\n prompt: string | any[]; // Plain text prompt OR structured array of prompt parts\n system_prompt?: string; // System prompt text (alias for prompt)\n model: string; // Model name (was model_id with UUID)\n model_id?: string; // Deprecated: legacy model UUID\n tool_description: string;\n required_schema: string; // JSON schema (legacy)\n include_chat: boolean;\n include_past_tools: boolean;\n prompts: string; // JSON array (legacy)\n created_at: number;\n /** @deprecated All prompts are now automatically exposed as tools */\n expose_as_tool?: boolean;\n parallel_tool_calls: boolean;\n tool_choice: \"auto\" | \"none\" | \"required\" | \"function\";\n reasoning_effort: \"low\" | \"medium\" | \"high\" | null;\n reasoning_max_tokens: number | null;\n reasoning_exclude: boolean;\n include_reasoning: boolean;\n recentImageThreshold: number | null; // Messages to keep images for\n\n // New fields from TypeScript config\n _tools?: (\n | string\n | SubpromptConfig\n | PromptToolConfig\n | SubagentToolConfig\n )[]; // Tool names or config objects from definePrompt\n _variables?: VariableDefinition[]; // Prompt-level variable declarations\n _env?: Record<string, string>; // Prompt-level env values\n _requiredSchema?: unknown; // Zod schema for validation (replaces JSON schema)\n _hooks?: string[]; // Hook IDs to run when this prompt is active\n}\n\n/**\n * Central state object that flows through execution\n */\nexport interface FlowState {\n // Identity\n threadId: string;\n flowId: string;\n\n // Thread reference\n thread: {\n instance: ThreadInstance; // Reference to the DurableThread instance\n metadata: ThreadMetadata; // Thread metadata from D1\n };\n\n // Configuration\n agentConfig: Agent;\n currentSide: \"a\" | \"b\";\n\n // Prompt configuration (loaded once per execution)\n prompts: {\n sideA: PromptData;\n sideB: PromptData | null; // null for ai_human agents\n };\n prompt: PromptData; // Current active prompt (switches with side)\n\n // Execution tracking\n stepCount: number;\n sideAStepCount: number; // Per-side step count for max_steps safety limit\n sideBStepCount: number; // Per-side step count for max_steps safety limit\n stopped: boolean;\n stoppedBy?: \"a\" | \"b\";\n stopReason?: string;\n stopReasonCode?: string;\n forcedNextSide?: \"side_a\" | \"side_b\"; // Force a specific side to play next turn\n pendingForceTurn?: \"side_a\" | \"side_b\"; // Deferred force turn (applied after tool queue completes)\n abortController?: AbortController; // For user-initiated stop\n\n // Message context\n messageHistory: Message[];\n /**\n * Appends these messages\n */\n extraMessages: Message[];\n\n // Tool execution queue\n sequence: {\n queue: ToolCall[];\n queuedTools: ToolCall[]; // Records all tools queued via queueTool() during this turn\n isHandling: boolean;\n };\n\n // Tool execution state (for individual tool calls)\n active: FlowCallWithRetries; // Current tool/prompt being executed\n queue: FlowCall[]; // Queue of pending tool/prompt calls\n\n // Agent handoff tracking\n pendingHandoff?: {\n agentId: string;\n args?: Record<string, unknown>; // Full arguments from the handoff tool call\n toolConfig?: {\n initUserMessageProperty?: string;\n initAttachmentsProperty?: string;\n };\n };\n\n // Streaming & telemetry\n stream: StreamManager;\n\n // Runtime context\n context: Record<string, unknown>;\n retryCount: number;\n retryReason?: string;\n\n // Storage\n storage: DurableObjectStorage;\n env: ThreadEnv;\n\n // Real-time broadcasting callbacks (for nested flows)\n emitLog?: (log: unknown) => void;\n emitMessage?: (message: unknown) => void;\n emitMessageChunk?: (messageId: string, chunk: string, depth?: number) => void;\n emitTelemetry?: (event: TelemetryEvent) => void;\n emitEvent?: (type: string, data: unknown) => void;\n\n // Hierarchical tracking\n rootState: FlowState // The root flow state object\n rootMessageId?: string | null; // Root message ID for FK relationships\n parentLogId?: string | null; // Parent log ID for nested prompts\n currentLogId?: string | null; // Current LLM request's log ID\n parentMessageId?: string; // Parent message ID for sub-prompts (used to determine one-shot behavior)\n depth: number; // Nesting depth: 0 for top-level, 1+ for sub-prompts\n /** Path from root prompt to current prompt (e.g., ['basic_prompt', 'generate_image']) */\n promptPath: string[];\n\n // Behavior flags\n pendingMessageId?: string; // Message currently being streamed\n\n // Tool restrictions\n allowedTools?: ToolDefinition[]; // Tools allowed for current prompt\n\n // Async metadata promises (for provider metadata fetching)\n pendingMetadataPromises?: Promise<void>[];\n\n // Namespace context for packing isolation\n /**\n * Current namespace context for execution.\n * Determines what tools, prompts, and agents are visible.\n * - { type: 'global' } for unpacked agents\n * - { type: 'packed', packageId: '...' } for packed agents\n */\n namespaceContext: {\n type: 'global';\n } | {\n type: 'packed';\n packageId: string;\n };\n\n /**\n * The `uses` list from the currently executing tool.\n * Used by queueTool/invokeTool to validate allowed calls.\n * Undefined means no restriction (global context or tool without uses).\n */\n currentToolUses?: string[];\n\n /**\n * Cached parent thread ID for this execution context.\n */\n parentThreadId?: string | null;\n\n /**\n * Prompt keys that have already executed immediate tools for this run.\n */\n immediatePromptRuns?: Set<string>;\n\n /**\n * Forces immediate tools on the next step after a handoff.\n */\n pendingImmediateAfterHandoff?: boolean;\n}\n\n/**\n * Text content part for multimodal messages\n */\nexport interface TextContentPart {\n type: \"text\";\n text: string;\n}\n\n/**\n * Image URL content part for multimodal messages (OpenAI/OpenRouter format)\n */\nexport interface ImageContentPart {\n type: \"image_url\";\n image_url: {\n url: string; // Can be data URL (data:image/...) or http(s) URL\n detail?: \"auto\" | \"low\" | \"high\"; // Image detail level\n };\n}\n\n/**\n * Multimodal content - array of text and image parts\n */\nexport type MultimodalContent = Array<TextContentPart | ImageContentPart>;\n\n/**\n * Message content - can be string (text only) or array (multimodal)\n */\nexport type MessageContent = string | MultimodalContent;\n\n/**\n * Request context for LLM calls\n */\nexport interface RequestContext {\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content?: MessageContent;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n name?: string;\n // Reasoning fields for multi-turn context (assistant messages)\n reasoning_content?: string;\n reasoning_details?: any[];\n // Attachments for tool messages (e.g., image_generation results)\n attachments?: any[];\n toolName?: string;\n }>;\n model: string;\n tools?: ToolDefinition[]; // Available tools for this request\n stream?: boolean;\n promptName?: string; // Name of the prompt being executed (if any)\n systemPrompt?: string; // The actual system prompt text\n parentLogId?: string | null; // Parent log ID if this is a nested prompt call\n parallel_tool_calls?: boolean; // Allow parallel tool execution\n tool_choice?: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } }; // Tool calling strategy\n reasoning?: {\n effort?: \"low\" | \"medium\" | \"high\"; // Reasoning effort level (for OpenAI o-series, Grok)\n max_tokens?: number; // Max reasoning tokens (for Anthropic, Gemini, Qwen)\n exclude?: boolean; // Use reasoning internally but don't return it\n };\n imagePathMap?: Map<string, string>; // Maps data URLs to attachment paths for log transformation\n}\n\n/**\n * Tool definition for LLM requests\n */\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters?: Record<string, any>; // JSON Schema format\n };\n /**\n * Where this tool is executed:\n * - 'local': Execute locally by the execution engine (default)\n * - 'provider': Executed by the LLM provider, results come in response\n */\n executionMode?: 'local' | 'provider';\n /**\n * Which provider executes this tool (when executionMode='provider')\n * e.g., 'openai', 'anthropic'\n */\n executionProvider?: string;\n}\n\n/**\n * Image returned by an LLM response (e.g., from image generation models)\n * Format follows OpenAI/OpenRouter chat completions API\n */\nexport interface LLMResponseImage {\n type: \"image_url\";\n /** Unique ID for this generated image (used to link to tool call) */\n id?: string;\n /** Name of the tool that generated this image (e.g., 'image_generation') */\n toolName?: string;\n /** The revised/actual prompt used to generate the image (from OpenAI's image_generation) */\n revisedPrompt?: string;\n image_url: {\n url: string; // data:image/png;base64,... or https://...\n };\n}\n\n/**\n * LLM response\n */\nexport interface LLMResponse {\n id: string;\n model: string;\n content: string | null;\n reasoning_content?: string | null; // Reasoning output from models like o1 (should not be displayed as regular content)\n reasoning_details?: any[]; // OpenRouter structured reasoning blocks (summary, encrypted, text types)\n tool_calls?: ToolCall[];\n images?: LLMResponseImage[]; // Generated images from image generation models\n finish_reason: string;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n // @ts-ignore - OpenRouter non-standard cost field\n cost?: number;\n // @ts-ignore - OpenRouter non-standard provider field (actual provider that handled request)\n provider?: string;\n };\n // Internal properties for async metadata fetching and logging\n /** @internal Provider instance reference for async metadata fetching */\n _provider?: unknown;\n /** @internal Provider response ID for async metadata fetching */\n _providerResponseId?: string;\n /** @internal Aggregate response for logging */\n _aggregate_response?: unknown;\n}\n\n/**\n * LLM response with associated log ID\n * The logId allows tracking which log entry corresponds to this LLM request\n * Useful for linking tool execution errors back to the parent LLM request\n */\nexport interface LLMResponseWithLog {\n response: LLMResponse;\n logId: string;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n retryPrompt?: string;\n}\n\n/**\n * Attachment returned by a tool (e.g., generated images)\n * Stored in thread filesystem and linked to the tool message\n */\nexport interface ToolAttachment {\n name: string;\n mimeType: string;\n data: string; // base64 encoded\n width?: number; // For images\n height?: number; // For images\n}\n\n/**\n * Tool result\n */\nexport interface ToolResult {\n status: \"success\" | \"error\";\n /**\n * Flattened text representation of the tool output.\n *\n * For tools that return structured MCP-style content (an array of\n * content parts), this will be derived by concatenating all text\n * parts. For legacy tools that returned a plain string `result`,\n * that value is used directly.\n */\n result?: string;\n error?: string;\n error_code?: string;\n error_data?: Record<string, unknown>;\n stack?: string; // Stack trace for errors\n /**\n * File attachments returned by the tool.\n *\n * Can contain either:\n * - ToolAttachment: New files with base64 data to be stored\n * - AttachmentRef: References to existing files in the thread filesystem\n *\n * New attachments are stored under /attachments/ directory.\n */\n attachments?: Array<ToolAttachment | AttachmentRef>;\n /**\n * Subagent reference to associate with the stored tool-result message.\n * Used for subagent stream grouping.\n */\n subagent_id?: string;\n}\n\n/**\n * Flow execution result\n */\nexport interface FlowResult {\n messages: Message[];\n stopped: boolean;\n stoppedBy?: \"a\" | \"b\";\n stopReason?: string;\n stopReasonCode?: string;\n stepCount: number;\n stream: ReadableStream<Uint8Array>; // HTTP stream for content\n}\n\n/**\n * Log emitter callback for DurableObject real-time updates\n */\nexport type EmitLog = (log: Partial<LogData> & { id: string }) => void;\n\n/**\n * Model fallback from D1\n */\nexport interface ModelFallback {\n parent_model_id: string;\n fallback_model_id: string;\n idx: number;\n}\n\n/**\n * Telemetry event types\n */\nexport type TelemetryEvent =\n | { type: \"step_started\"; step: number; side: \"a\" | \"b\"; timestamp: number }\n | { type: \"step_completed\"; step: number; stopped: boolean; timestamp: number }\n | { type: \"llm_request\"; model: string; attempt: number; timestamp: number }\n | {\n type: \"llm_response\";\n tokens: number;\n latency: number;\n timestamp: number;\n }\n | { type: \"validation_failed\"; error: string; timestamp: number }\n | {\n type: \"fallback_triggered\";\n from: string;\n to: string;\n timestamp: number;\n }\n | { type: \"tool_started\"; tool: string; timestamp: number }\n | {\n type: \"tool_completed\";\n tool: string;\n status: string;\n timestamp: number;\n }\n | {\n type: \"stopped\";\n reason: string;\n side: \"a\" | \"b\";\n timestamp: number;\n }\n | {\n type: \"stopped_by_user\";\n timestamp: number;\n };\n\n/**\n * Log data for telemetry table\n */\nexport interface LogData {\n id: string;\n message_id: string;\n\n // Request details\n provider: string;\n model: string;\n model_name?: string; // Human-readable model name\n endpoint?: string;\n request_body?: string;\n request_headers?: string;\n\n // Response details\n response_body?: string;\n response_headers?: string;\n status_code?: number;\n reasoning_content?: string | null; // Reasoning output from models like o1 (should not be displayed)\n\n // Token usage\n input_tokens?: number;\n cached_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n total_tokens?: number;\n\n // Performance metrics\n latency_ms?: number;\n time_to_first_token_ms?: number;\n\n // Result metadata\n finish_reason?: string;\n error?: string;\n error_type?: string;\n\n // Cost tracking\n cost_input?: number;\n cost_output?: number;\n cost_total?: number;\n\n // Context\n message_history_length?: number;\n tools_available?: number;\n prompt_name?: string;\n tools_called?: string;\n queued_tools?: string; // JSON array of tools queued via queueTool() during this turn\n\n // Provider tracking\n actual_provider?: string | null; // Actual provider from OpenRouter (e.g., \"Infermatic\")\n standard_agents_router_used?: boolean; // Whether the hosted Standard Agents router handled this request\n\n // Enhanced context (migration 003)\n parent_log_id?: string | null; // Parent log ID for prompt chains\n tools_schema?: string | null; // JSON schema of tools available\n message_history?: string | null; // Snapshot of message history\n system_prompt?: string | null; // System prompt sent with request\n is_complete?: boolean; // Whether log has all data\n\n // Error and retry tracking (migration 007)\n errors?: string | null; // JSON array of errors [{message, type, timestamp}]\n retry_of_log_id?: string | null; // Log ID this is a retry of\n\n created_at: number;\n}\n\n/**\n * Tool type identifier\n */\nexport type ToolType = \"native\" | \"prompt\" | \"agent\" | \"provider\";\n\n/**\n * Provider tool call - represents a tool executed by the LLM provider\n * (e.g., web_search, x_search, image_generation, code_interpreter, file_search)\n */\nexport interface ProviderToolCall {\n /** Provider-facing tool name. */\n name?: string;\n /** Legacy display/type alias for provider tool name. */\n type: 'web_search' | 'x_search' | 'image_generation' | 'code_interpreter' | 'code_execution' | 'file_search' | (string & {});\n /** Provider that executed the tool. */\n provider?: string;\n /** Unique identifier for this tool call */\n id: string;\n /** Execution status */\n status: 'completed' | 'failed' | 'in_progress';\n /** Type-specific result data */\n result?: {\n /** web_search: Array of search actions with queries and sources */\n actions?: Array<{ type: string; query?: string; url?: string; pattern?: string; sources?: any[] }>;\n /** Provider-specific argument summary */\n input?: Record<string, unknown>;\n /** image_generation: File path after storage */\n imagePath?: string;\n /** code_interpreter: Output from code execution */\n output?: string;\n /** file_search: Search results */\n results?: any[];\n /** Generated or referenced artifacts */\n artifacts?: Array<{\n type: string;\n id?: string;\n mediaType?: string;\n url?: string;\n path?: string;\n title?: string;\n metadata?: Record<string, unknown>;\n }>;\n };\n /** Provider-specific structured details */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Base environment interface for StandardAgents.\n * Extends ThreadEnv with optional provider API keys.\n *\n * User's Env interface should extend this or include these bindings.\n */\nexport interface Env extends ThreadEnv {\n // Provider API keys (optional - providers check for these)\n CLOUDFLARE_API_TOKEN?: string;\n CLOUDFLARE_ACCOUNT_ID?: string;\n CEREBRAS_API_KEY?: string;\n OPENAI_API_KEY?: string;\n ANTHROPIC_API_KEY?: string;\n OPENROUTER_API_KEY?: string;\n GOOGLE_API_KEY?: string;\n\n // Optional UI dev server for local development\n UI_DEV_SERVER?: string;\n\n // Optional assets binding (Cloudflare Workers Assets)\n ASSETS?: {\n fetch(request: Request | string): Promise<Response>;\n };\n\n // Optional Worker Loader binding for ThreadState.runCode sandboxed execution\n AGENT_BUILDER_CODE_LOADER?: WorkerLoader;\n AGENT_BUILDER_CODE_COMPATIBILITY_DATE?: string;\n\n // Auth (optional)\n SUPER_ADMIN_PASSWORD?: string;\n ENCRYPTION_KEY?: string;\n\n // Allow additional bindings from user\n [key: string]: unknown;\n}\n\n/**\n * Storage backend types for files\n */\nexport type StorageBackend = \"local\" | \"url\" | \"s3\" | \"r2\";\n\n/**\n * File record stored in the files table\n */\nexport interface FileRecord {\n path: string; // Primary key, e.g., \"/uploads/photo.jpg\"\n name: string; // Basename\n mimeType: string;\n storage: StorageBackend; // Where the data lives\n location?: string | null; // External reference (null for local)\n size: number;\n metadata?: Record<string, unknown> | null; // JSON parsed\n isDirectory: boolean;\n createdAt: number;\n // Image dimensions (populated for processed images)\n width?: number | null;\n height?: number | null;\n // Chunked storage (for files > 1.75MB)\n isChunked?: boolean; // true if stored in file_chunks table\n chunkCount?: number; // number of chunks (if chunked)\n}\n\n/**\n * Image-specific metadata stored in FileRecord.metadata\n */\nexport interface ImageMetadata {\n width: number;\n height: number;\n}\n\n/**\n * Attachment reference stored in messages.attachments (JSON array)\n */\nexport interface AttachmentRef {\n id: string; // Unique attachment ID\n type: \"file\";\n path: string; // FK to files.path\n name: string;\n mimeType: string;\n size: number; // File size in bytes\n // Image-specific (when mime starts with \"image/\")\n width?: number;\n height?: number;\n description?: string; // AI-generated for context management\n}\n\n/**\n * Grep search result\n */\nexport interface GrepResult {\n path: string;\n name: string;\n matches: string[]; // Matching lines/snippets\n lineNumbers?: number[]; // Line numbers of matches\n}\n\n/**\n * File stats for storage tracking\n */\nexport interface FileStats {\n totalSize: number;\n fileCount: number;\n}\n\n/**\n * Constants\n */\nexport const MAX_STEPS = 250;\nexport const MAX_RETRIES_PER_MODEL = 2;\nexport const TIMESTAMP_MULTIPLIER = 1000; // Convert ms to microseconds\nexport const STREAM_COOLDOWN = 200; // ms\nexport const BACKOFF_BASE = 1000; // ms\n","import { STREAM_COOLDOWN } from \"./types\";\n\n/**\n * Callback function to execute before stream closes\n */\nexport type BeforeClose = () => Promise<void> | void;\n\n/**\n * Stream channel\n */\ninterface Channel {\n id: number;\n label: string;\n active: boolean;\n}\n\n/**\n * Manages HTTP streaming of content chunks.\n * WebSocket telemetry is handled separately by DurableThread.\n * Inspired by bod.coach MultiplexedStream pattern.\n */\nexport class StreamManager {\n /**\n * HTTP ReadableStream controller for content\n */\n private httpController?: ReadableStreamDefaultController<Uint8Array>;\n\n /**\n * HTTP ReadableStream for content chunks\n */\n public httpStream: ReadableStream<Uint8Array>;\n\n /**\n * Active channels\n */\n public activeChannels: number = 0;\n\n /**\n * Before close hooks\n */\n private beforeCloseHooks: BeforeClose[] = [];\n\n /**\n * Prevent automatic close\n */\n public preventClose: boolean = false;\n\n /**\n * Text encoder for streams\n */\n private encoder: TextEncoder;\n\n /**\n * Promise that resolves when stream is completely finished\n */\n public then: Promise<void>;\n\n /**\n * Resolver for the then promise\n */\n private resolver: () => void = () => {};\n\n /**\n * Whether the stream has been closed\n */\n private closed: boolean = false;\n\n constructor(beforeClose: BeforeClose | BeforeClose[] = []) {\n this.encoder = new TextEncoder();\n\n // Create HTTP stream\n this.httpStream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n this.httpController = controller;\n },\n });\n\n // Setup before close hooks\n this.beforeCloseHooks = Array.isArray(beforeClose)\n ? beforeClose\n : [beforeClose];\n\n // Create promise for stream completion\n this.then = new Promise((resolve) => {\n this.resolver = resolve;\n });\n }\n\n /**\n * Send content chunk to HTTP stream\n */\n sendContent(chunk: string): void {\n if (!this.httpController || this.closed) {\n console.warn(\"Cannot send content: stream is closed or not initialized\");\n return;\n }\n\n try {\n this.httpController.enqueue(this.encoder.encode(chunk));\n } catch (error) {\n console.error(\"Error sending content chunk:\", error);\n }\n }\n\n /**\n * Add a before close hook\n */\n addBeforeClose(hook: BeforeClose | BeforeClose[]): void {\n this.beforeCloseHooks.push(...(Array.isArray(hook) ? hook : [hook]));\n }\n\n /**\n * Wait for a callback to complete before allowing stream to close\n */\n async waitFor(callback: () => Promise<void> | void): Promise<void> {\n this.activeChannels++;\n\n try {\n await callback();\n } catch (error) {\n console.error(\"Error in waitFor callback:\", error);\n throw error;\n } finally {\n this.closeChannel();\n }\n }\n\n /**\n * Close a channel (decrement active channel count)\n */\n closeChannel(): void {\n this.activeChannels--;\n\n if (this.activeChannels <= 0 && !this.preventClose && !this.closed) {\n // Small delay to allow any final operations\n setTimeout(async () => {\n if (this.activeChannels <= 0 && !this.closed) {\n await this.close();\n }\n }, STREAM_COOLDOWN);\n }\n }\n\n /**\n * Close all streams and connections\n */\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n\n try {\n // Run before close hooks\n await Promise.all(\n this.beforeCloseHooks.map(async (hook) => {\n try {\n await hook();\n } catch (error) {\n console.error(\"Error in beforeClose hook:\", error);\n }\n })\n );\n\n // Close HTTP stream\n if (this.httpController) {\n try {\n this.httpController.close();\n } catch (error) {\n console.error(\"Error closing HTTP stream:\", error);\n }\n }\n\n // Resolve the completion promise\n this.resolver();\n } catch (error) {\n console.error(\"Error during stream close:\", error);\n this.resolver();\n }\n }\n\n /**\n * Force close the stream immediately\n */\n forceClose(): void {\n this.preventClose = false;\n this.activeChannels = 0;\n this.close();\n }\n}\n","const TOKENS_PER_MILLION = 1_000_000;\n\ntype UsageLike = {\n prompt_tokens: number;\n completion_tokens: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n};\n\nexport interface ResolvedModelPricing {\n inputPrice: number;\n outputPrice: number;\n cachedPrice?: number;\n source: 'model' | 'cerebras-static' | 'google-static' | 'groq-static' | 'xai-static';\n}\n\nexport interface CalculatedUsageCost {\n costInput: number;\n costOutput: number;\n costTotal: number;\n}\n\ntype ModelPricingInput = {\n model: string;\n inputPrice?: number;\n outputPrice?: number;\n cachedPrice?: number;\n};\n\nconst CEREBRAS_MODEL_PRICING: Record<string, Omit<ResolvedModelPricing, 'source'>> = {\n 'zai-glm-4.7': {\n inputPrice: 2.25,\n outputPrice: 2.75,\n },\n 'gpt-oss-120b': {\n inputPrice: 0.35,\n outputPrice: 0.75,\n },\n 'llama3.1-8b': {\n inputPrice: 0.10,\n outputPrice: 0.10,\n },\n 'qwen-3-235b-a22b-instruct-2507': {\n inputPrice: 0.60,\n outputPrice: 1.20,\n },\n};\n\nconst GOOGLE_MODEL_PRICING: Record<string, Omit<ResolvedModelPricing, 'source'>> = {\n 'gemini-3-pro-preview': {\n inputPrice: 2,\n outputPrice: 12,\n cachedPrice: 0.2,\n },\n 'gemini-3.1-pro-preview': {\n inputPrice: 2,\n outputPrice: 12,\n cachedPrice: 0.2,\n },\n 'gemini-2.5-pro': {\n inputPrice: 1.25,\n outputPrice: 10,\n cachedPrice: 0.125,\n },\n 'gemini-2.5-flash': {\n inputPrice: 0.3,\n outputPrice: 2.5,\n cachedPrice: 0.03,\n },\n 'gemini-2.5-flash-lite': {\n inputPrice: 0.1,\n outputPrice: 0.4,\n cachedPrice: 0.01,\n },\n 'gemini-3-flash-preview': {\n inputPrice: 0.5,\n outputPrice: 3,\n cachedPrice: 0.05,\n },\n 'gemini-3.1-flash-lite-preview': {\n inputPrice: 0.25,\n outputPrice: 1.5,\n cachedPrice: 0.025,\n },\n 'deep-research-pro-preview-12-2025': {\n inputPrice: 2,\n outputPrice: 12,\n cachedPrice: 0.2,\n },\n 'gemini-2.0-flash': {\n inputPrice: 0.1,\n outputPrice: 0.4,\n cachedPrice: 0.025,\n },\n 'gemini-2.0-flash-001': {\n inputPrice: 0.1,\n outputPrice: 0.4,\n cachedPrice: 0.025,\n },\n 'gemini-2.0-flash-lite': {\n inputPrice: 0.075,\n outputPrice: 0.3,\n },\n 'gemini-2.0-flash-lite-001': {\n inputPrice: 0.075,\n outputPrice: 0.3,\n },\n 'gemini-2.5-computer-use-preview-10-2025': {\n inputPrice: 1.25,\n outputPrice: 10,\n },\n 'gemini-2.5-flash-image': {\n inputPrice: 0.3,\n outputPrice: 0,\n },\n 'gemini-3.1-flash-image-preview': {\n inputPrice: 0.5,\n outputPrice: 3,\n },\n 'gemini-3-pro-image-preview': {\n inputPrice: 2,\n outputPrice: 0,\n },\n 'nano-banana-pro-preview': {\n inputPrice: 2,\n outputPrice: 0,\n },\n 'gemma-4-31b-it': {\n inputPrice: 0,\n outputPrice: 0,\n cachedPrice: 0,\n },\n};\n\nconst GOOGLE_MODEL_PRICING_PREFIXES: Array<{\n prefix: string;\n pricing: Omit<ResolvedModelPricing, 'source'>;\n}> = [\n {\n prefix: 'gemini-3.1-pro-preview',\n pricing: GOOGLE_MODEL_PRICING['gemini-3.1-pro-preview'],\n },\n {\n prefix: 'gemini-3-pro-preview',\n pricing: GOOGLE_MODEL_PRICING['gemini-3-pro-preview'],\n },\n {\n prefix: 'gemini-3-flash-preview',\n pricing: GOOGLE_MODEL_PRICING['gemini-3-flash-preview'],\n },\n {\n prefix: 'gemini-3.1-flash-lite-preview',\n pricing: GOOGLE_MODEL_PRICING['gemini-3.1-flash-lite-preview'],\n },\n {\n prefix: 'gemini-2.5-flash-lite-preview-',\n pricing: GOOGLE_MODEL_PRICING['gemini-2.5-flash-lite'],\n },\n {\n prefix: 'gemini-flash-latest',\n pricing: GOOGLE_MODEL_PRICING['gemini-2.5-flash'],\n },\n {\n prefix: 'gemini-flash-lite-latest',\n pricing: GOOGLE_MODEL_PRICING['gemini-2.5-flash-lite'],\n },\n {\n prefix: 'gemini-pro-latest',\n pricing: GOOGLE_MODEL_PRICING['gemini-2.5-pro'],\n },\n {\n prefix: 'gemma-4-',\n pricing: {\n inputPrice: 0,\n outputPrice: 0,\n cachedPrice: 0,\n },\n },\n {\n prefix: 'gemma-3-',\n pricing: {\n inputPrice: 0,\n outputPrice: 0,\n cachedPrice: 0,\n },\n },\n {\n prefix: 'gemma-3n-',\n pricing: {\n inputPrice: 0,\n outputPrice: 0,\n cachedPrice: 0,\n },\n },\n];\n\nconst GROQ_MODEL_PRICING: Record<string, Omit<ResolvedModelPricing, 'source'>> = {\n 'llama-3.1-8b-instant': { inputPrice: 0.05, outputPrice: 0.08 },\n 'llama-3.3-70b-versatile': { inputPrice: 0.59, outputPrice: 0.79 },\n 'meta-llama/llama-4-scout-17b-16e-instruct': { inputPrice: 0.11, outputPrice: 0.34 },\n 'moonshotai/kimi-k2-instruct': { inputPrice: 1.0, outputPrice: 3.0 },\n 'openai/gpt-oss-120b': { inputPrice: 0.15, cachedPrice: 0.075, outputPrice: 0.6 },\n 'openai/gpt-oss-20b': { inputPrice: 0.075, cachedPrice: 0.037, outputPrice: 0.3 },\n 'qwen/qwen3-32b': { inputPrice: 0.29, outputPrice: 0.59 },\n};\n\nconst XAI_MODEL_PRICING: Record<string, Omit<ResolvedModelPricing, 'source'>> = {\n 'grok-4-0709': { inputPrice: 30, cachedPrice: 7.5, outputPrice: 150 },\n 'grok-4': { inputPrice: 30, cachedPrice: 7.5, outputPrice: 150 },\n 'grok-4-latest': { inputPrice: 30, cachedPrice: 7.5, outputPrice: 150 },\n 'grok-4-fast-reasoning': { inputPrice: 2, cachedPrice: 0.5, outputPrice: 5 },\n 'grok-4-fast-non-reasoning': { inputPrice: 2, cachedPrice: 0.5, outputPrice: 5 },\n 'grok-4-1-fast-reasoning': { inputPrice: 2, cachedPrice: 0.5, outputPrice: 5 },\n 'grok-4-1-fast-non-reasoning': { inputPrice: 2, cachedPrice: 0.5, outputPrice: 5 },\n 'grok-4.20-0309-reasoning': { inputPrice: 20, cachedPrice: 2, outputPrice: 60 },\n 'grok-4.20-0309-non-reasoning': { inputPrice: 20, cachedPrice: 2, outputPrice: 60 },\n 'grok-4.20-multi-agent-0309': { inputPrice: 20, cachedPrice: 2, outputPrice: 60 },\n 'grok-code-fast-1': { inputPrice: 2, cachedPrice: 0.2, outputPrice: 15 },\n 'grok-3': { inputPrice: 30, cachedPrice: 7.5, outputPrice: 150 },\n 'grok-3-latest': { inputPrice: 30, cachedPrice: 7.5, outputPrice: 150 },\n 'grok-3-mini': { inputPrice: 3, cachedPrice: 0.75, outputPrice: 5 },\n 'grok-3-mini-latest': { inputPrice: 3, cachedPrice: 0.75, outputPrice: 5 },\n};\n\nfunction getGoogleFallbackPricing(modelId?: string | null): ResolvedModelPricing | null {\n const normalized = normalizeGoogleModelId(modelId);\n const exact = GOOGLE_MODEL_PRICING[normalized];\n if (exact) return { ...exact, source: 'google-static' };\n const prefixMatch = GOOGLE_MODEL_PRICING_PREFIXES.find((entry) => normalized.startsWith(entry.prefix));\n if (prefixMatch) return { ...prefixMatch.pricing, source: 'google-static' };\n return null;\n}\n\nfunction getGroqFallbackPricing(modelId?: string | null): ResolvedModelPricing | null {\n const pricing = GROQ_MODEL_PRICING[normalizeModelId(modelId)];\n return pricing ? { ...pricing, source: 'groq-static' } : null;\n}\n\nfunction getXAIFallbackPricing(modelId?: string | null): ResolvedModelPricing | null {\n const pricing = XAI_MODEL_PRICING[normalizeModelId(modelId)];\n return pricing ? { ...pricing, source: 'xai-static' } : null;\n}\n\nfunction normalizeModelId(modelId?: string | null): string {\n return (modelId || '').trim().toLowerCase();\n}\n\nfunction normalizeGoogleModelId(modelId?: string | null): string {\n return normalizeModelId(modelId)\n .replace(/^google\\//, '')\n .replace(/^models\\//, '')\n .replace(/^publishers\\/google\\/models\\//, '');\n}\n\nfunction roundCost(value: number): number {\n return Number(value.toFixed(12));\n}\n\nexport function getCerebrasFallbackPricing(modelId?: string | null): ResolvedModelPricing | null {\n const pricing = CEREBRAS_MODEL_PRICING[normalizeModelId(modelId)];\n return pricing ? { ...pricing, source: 'cerebras-static' } : null;\n}\n\nexport function resolveModelPricing(\n modelDef: ModelPricingInput,\n providerName?: string\n): ResolvedModelPricing | null {\n if (typeof modelDef.inputPrice === 'number' && typeof modelDef.outputPrice === 'number') {\n return {\n inputPrice: modelDef.inputPrice,\n outputPrice: modelDef.outputPrice,\n cachedPrice: modelDef.cachedPrice,\n source: 'model',\n };\n }\n\n if (providerName === 'cerebras') {\n return getCerebrasFallbackPricing(modelDef.model);\n }\n\n if (providerName === 'google') {\n return getGoogleFallbackPricing(modelDef.model);\n }\n\n if (providerName === 'groq') {\n return getGroqFallbackPricing(modelDef.model);\n }\n\n if (providerName === 'xai') {\n return getXAIFallbackPricing(modelDef.model);\n }\n\n return null;\n}\n\nexport function calculateUsageCost(\n usage: UsageLike,\n pricing: ResolvedModelPricing | null\n): CalculatedUsageCost | null {\n if (!pricing) {\n return null;\n }\n\n const cachedTokens = Math.max(usage.prompt_tokens_details?.cached_tokens || 0, 0);\n const promptTokens = Math.max(usage.prompt_tokens || 0, 0);\n const completionTokens = Math.max(usage.completion_tokens || 0, 0);\n const reasoningTokens = pricing.source === 'google-static'\n ? Math.max(usage.completion_tokens_details?.reasoning_tokens || 0, 0)\n : 0;\n const billableOutputTokens = completionTokens + reasoningTokens;\n const uncachedPromptTokens = Math.max(promptTokens - cachedTokens, 0);\n const cachedTokenPrice = pricing.cachedPrice ?? pricing.inputPrice;\n\n const costInput = roundCost(\n ((uncachedPromptTokens * pricing.inputPrice) + (cachedTokens * cachedTokenPrice)) /\n TOKENS_PER_MILLION\n );\n const costOutput = roundCost((billableOutputTokens * pricing.outputPrice) / TOKENS_PER_MILLION);\n\n return {\n costInput,\n costOutput,\n costTotal: roundCost(costInput + costOutput),\n };\n}\n","/**\n * Provider types for Standard Agents\n *\n * Re-exports canonical types from @standardagents/spec and provides\n * internal types for the builder package.\n */\n\nimport type { FlowState, ToolDefinition, LLMResponse, RequestContext, Env } from \"../types\";\n\n// =============================================================================\n// Re-export from @standardagents/spec (canonical provider types)\n// =============================================================================\n\nexport {\n type LLMProviderInterface,\n type ProviderRequest,\n type ProviderResponse,\n type ProviderStreamChunk,\n type ProviderMessage,\n type ProviderSystemMessage,\n type ProviderUserMessage,\n type ProviderAssistantMessage,\n type ProviderToolMessage,\n type ProviderMessageContent,\n type ContentPart,\n type TextPart,\n type ImagePart,\n type FilePart,\n type ProviderTool,\n type ProviderToolCallPart,\n type ProviderToolResultContent,\n type ProviderFinishReason,\n type ProviderUsage,\n type ProviderGeneratedImage,\n type ProviderExecutedToolResult,\n type ProviderReasoningDetail,\n type ProviderErrorCode,\n type ProviderFactoryConfig,\n type ProviderFactory,\n type ModelCapabilities,\n ProviderError,\n mapReasoningLevel,\n} from '@standardagents/spec';\n\n// Type aliases for builder's public API (maintain consistent naming)\nimport type {\n LLMProviderInterface as _LLMProviderInterface,\n ContentPart as _ContentPart,\n TextPart as _TextPart,\n ImagePart as _ImagePart,\n FilePart as _FilePart,\n} from '@standardagents/spec';\n\n/** @public Alias for LLMProviderInterface */\nexport type Provider = _LLMProviderInterface;\n/** @public Alias for ContentPart */\nexport type ProviderContentPart = _ContentPart;\n/** @public Alias for TextPart */\nexport type ProviderTextPart = _TextPart;\n/** @public Alias for ImagePart */\nexport type ProviderImagePart = _ImagePart;\n/** @public Alias for FilePart */\nexport type ProviderFilePart = _FilePart;\n\n// =============================================================================\n// Internal Types (used by builder package only)\n// =============================================================================\n\n/**\n * Internal model configuration for provider registry\n * @internal\n */\nexport interface ModelConfig {\n id: string;\n name: string;\n provider_id: string;\n included_providers: string;\n input_price: number | null;\n output_price: number | null;\n cached_price: number | null;\n}\n\n/**\n * Internal provider configuration\n * @internal\n */\nexport interface ProviderConfig {\n name: string;\n sdk: string;\n api_key: string;\n}\n\n// =============================================================================\n// Legacy Types (kept for backwards compatibility during migration)\n// =============================================================================\n\n/**\n * @deprecated Use LLMProviderInterface from @standardagents/spec\n */\nexport interface LLMProvider {\n readonly name: string;\n chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: ModelConfig\n ): Promise<LLMResponse>;\n supportsModel(modelId: string): boolean;\n}\n\n/**\n * @deprecated Use ProviderFactory from @standardagents/spec\n */\nexport type LegacyProviderFactory = (config: ProviderConfig) => LLMProvider;\n\n/**\n * @deprecated Use new provider loading\n */\nexport interface ProviderRegistry {\n register(sdk: string, factory: LegacyProviderFactory): void;\n getProvider(\n modelName: string,\n env: Env,\n thread?: import(\"../types\").ThreadInstance\n ): Promise<{ provider: LLMProvider; modelName: string; modelConfig: ModelConfig }>;\n hasProvider(sdk: string): boolean;\n}\n","/**\n * TestScript - Fluent builder for defining deterministic LLM response sequences.\n *\n * Use this to script exact responses for tests, enabling deterministic testing\n * of agent behavior without calling real LLM APIs.\n *\n * @example\n * ```typescript\n * const script = TestScript.create()\n * .addTextResponse(\"Hello! How can I help?\")\n * .addToolCallResponse([\n * { name: \"search\", arguments: { query: \"test\" } }\n * ])\n * .addTextResponse(\"Based on the search, here's what I found...\");\n * ```\n */\n\nimport type { ToolCall } from \"../types\";\nimport type { ProviderExecutedToolResult } from \"./types\";\n\n/**\n * A single scripted response from the LLM\n */\nexport interface ScriptedResponse {\n /** Text content to return (null for pure tool calls) */\n content?: string | null;\n\n /** Tool calls to return (OpenAI format) */\n toolCalls?: ToolCall[];\n\n /** Provider-executed tool calls to surface through the provider-tool path */\n providerTools?: ProviderExecutedToolResult[];\n\n /** Reasoning content for o1-style models */\n reasoningContent?: string | null;\n\n /** Reasoning details for OpenRouter structured reasoning */\n reasoningDetails?: any[];\n\n /** Finish reason */\n finishReason?: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\";\n\n /** Token usage to report */\n usage?: {\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n };\n\n /** Simulate an error instead of a successful response */\n error?: {\n message: string;\n code?: string;\n status?: number;\n };\n\n /** Optional: Validate the input matches expectations */\n expectInput?: InputExpectation;\n\n /** Optional: Delay before responding (ms) - useful for streaming tests */\n delayMs?: number;\n}\n\n/**\n * Input validation expectations\n */\nexport interface InputExpectation {\n /** Check that a message contains this text (string or regex) */\n containsMessage?: string | RegExp;\n\n /** Check that a tool result for this tool exists */\n containsToolResult?: {\n toolName: string;\n resultContains?: string;\n };\n\n /** Exact message count expected */\n messageCount?: number;\n\n /** Check that the system prompt contains this text */\n systemPromptContains?: string | RegExp;\n}\n\n/**\n * Configuration for streaming simulation\n */\nexport interface StreamingConfig {\n /** Characters per chunk */\n chunkSize: number;\n\n /** Delay between chunks in milliseconds */\n chunkDelayMs: number;\n}\n\n/**\n * Shorthand for creating tool calls\n */\nexport interface ToolCallSpec {\n name: string;\n arguments: Record<string, any>;\n id?: string;\n}\n\n/**\n * Builder class for creating deterministic test scripts.\n *\n * Each call to addResponse/addTextResponse/etc adds a response to the sequence.\n * When the TestProvider is used, it returns these responses in order.\n */\nexport class TestScript {\n private responses: ScriptedResponse[] = [];\n private streamingConfig?: StreamingConfig;\n\n /**\n * Create a new TestScript instance\n */\n static create(): TestScript {\n return new TestScript();\n }\n\n /**\n * Add a response to the sequence\n */\n addResponse(response: ScriptedResponse): this {\n this.responses.push(response);\n return this;\n }\n\n /**\n * Add a simple text response (stops after response)\n */\n addTextResponse(content: string, options?: Partial<ScriptedResponse>): this {\n return this.addResponse({\n content,\n finishReason: \"stop\",\n ...options,\n });\n }\n\n /**\n * Add a response with tool calls\n */\n addToolCallResponse(\n toolCalls: ToolCallSpec[],\n content?: string,\n options?: Partial<ScriptedResponse>\n ): this {\n return this.addResponse({\n content: content ?? null,\n toolCalls: toolCalls.map((tc) => ({\n id: tc.id || `call_${crypto.randomUUID().substring(0, 8)}`,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n },\n })),\n finishReason: \"tool_calls\",\n ...options,\n });\n }\n\n /**\n * Add an error response (simulates provider error)\n */\n addErrorResponse(\n message: string,\n code?: string,\n status?: number,\n options?: Partial<ScriptedResponse>\n ): this {\n return this.addResponse({\n error: { message, code, status },\n ...options,\n });\n }\n\n /**\n * Add a response with reasoning content (for o1-style models)\n */\n addReasoningResponse(\n content: string,\n reasoningContent: string,\n options?: Partial<ScriptedResponse>\n ): this {\n return this.addResponse({\n content,\n reasoningContent,\n finishReason: \"stop\",\n ...options,\n });\n }\n\n /**\n * Enable streaming simulation for all responses\n */\n withStreamingSimulation(config: StreamingConfig): this {\n this.streamingConfig = config;\n return this;\n }\n\n /**\n * Get all scripted responses\n */\n getResponses(): ScriptedResponse[] {\n return [...this.responses];\n }\n\n /**\n * Get streaming configuration\n */\n getStreamingConfig(): StreamingConfig | undefined {\n return this.streamingConfig;\n }\n\n /**\n * Get total number of responses\n */\n get length(): number {\n return this.responses.length;\n }\n\n /**\n * Check if script is empty\n */\n isEmpty(): boolean {\n return this.responses.length === 0;\n }\n\n /**\n * Create a clone of this script\n */\n clone(): TestScript {\n const cloned = new TestScript();\n cloned.responses = [...this.responses];\n cloned.streamingConfig = this.streamingConfig\n ? { ...this.streamingConfig }\n : undefined;\n return cloned;\n }\n}\n","/**\n * TestProvider - Deterministic LLM provider for testing.\n *\n * Returns scripted responses in sequence, enabling deterministic testing\n * of agent execution without real API calls.\n *\n * Implements the new LLMProviderInterface with generate() and stream() methods.\n *\n * @example\n * ```typescript\n * const script = TestScript.create()\n * .addTextResponse(\"Hello!\")\n * .addToolCallResponse([{ name: \"search\", arguments: { q: \"test\" } }])\n * .addTextResponse(\"Found results.\");\n *\n * const provider = createTestProvider(script);\n * ```\n */\n\nimport type {\n LLMProviderInterface,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ProviderUsage,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderFactoryConfig,\n ProviderMessageContent,\n} from \"./types\";\nimport { ProviderError } from \"@standardagents/spec\";\nimport { TestScript } from \"./TestScript\";\nimport type { ScriptedResponse, InputExpectation } from \"./TestScript\";\n\n/**\n * Helper to extract text from ProviderMessageContent (string or multimodal array)\n */\nfunction contentToString(content: ProviderMessageContent | undefined | null): string {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n // Extract text from multimodal content\n return content\n .filter((part) => part.type === \"text\")\n .map((part) => (part as { type: \"text\"; text: string }).text)\n .join(\" \");\n}\n\n/**\n * Extended provider config for TestProvider\n */\nexport interface TestProviderConfig extends ProviderFactoryConfig {\n /** The test script defining response sequence. If not provided, uses a default that echoes responses. */\n script?: TestScript;\n\n /** Whether to validate inputs match expectations (default: false) */\n validateInputs?: boolean;\n\n /** Log all requests for debugging (default: false) */\n debugLog?: boolean;\n}\n\n/**\n * Deterministic test provider that returns scripted LLM responses.\n *\n * Key features:\n * - Returns responses in sequence as defined by TestScript\n * - Supports streaming simulation\n * - Optional input validation\n * - Request logging for assertions\n * - Clear error when script is exhausted\n */\nexport class TestProvider implements LLMProviderInterface {\n readonly name = \"test\";\n readonly specificationVersion = \"1\" as const;\n\n private script: TestScript;\n private responseIndex: number = 0;\n private validateInputs: boolean;\n private debugLog: boolean;\n private requestLog: ProviderRequest[] = [];\n private useDefaultResponse: boolean;\n\n constructor(config: TestProviderConfig) {\n // If no script provided, use a default that returns a simple acknowledgment\n this.useDefaultResponse = !config.script;\n this.script = config.script ?? TestScript.create().addTextResponse(\"Test response received.\");\n this.validateInputs = config.validateInputs ?? false;\n this.debugLog = config.debugLog ?? false;\n }\n\n /**\n * Test provider supports any model ID\n */\n supportsModel(_modelId: string): boolean {\n return true;\n }\n\n /**\n * Non-streaming generation - returns the next scripted response\n */\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n // Log request for debugging/assertions\n if (this.debugLog) {\n console.log(`[TestProvider] Request ${this.responseIndex + 1}:`, {\n messageCount: request.messages.length,\n lastMessage: request.messages.slice(-1)[0],\n });\n }\n this.requestLog.push({ ...request });\n\n // Check for abort\n if (request.signal?.aborted) {\n throw new ProviderError(\"Request aborted\", \"timeout\");\n }\n\n // Get next scripted response\n const responses = this.script.getResponses();\n let scripted: ScriptedResponse;\n\n if (this.responseIndex >= responses.length) {\n if (this.useDefaultResponse) {\n // When using default response mode, keep returning the same response\n scripted = responses[0];\n } else {\n const lastMessage = request.messages.slice(-1)[0];\n const lastContent =\n lastMessage?.role === \"user\"\n ? contentToString(lastMessage.content)\n : lastMessage?.role === \"assistant\"\n ? lastMessage.content ?? \"\"\n : \"\";\n throw new ProviderError(\n `TestProvider: Script exhausted after ${this.responseIndex} responses. ` +\n `Expected ${responses.length} total requests. ` +\n `Received request with ${request.messages.length} messages. ` +\n `Last message role: \"${lastMessage?.role}\", ` +\n `content: \"${String(lastContent).substring(0, 100)}...\"`,\n \"invalid_request\"\n );\n }\n } else {\n scripted = responses[this.responseIndex];\n }\n\n this.responseIndex++;\n\n // Validate input expectations if configured\n if (this.validateInputs && scripted.expectInput) {\n this.validateInput(request, scripted.expectInput);\n }\n\n // Simulate delay if configured\n if (scripted.delayMs) {\n await this.sleep(scripted.delayMs);\n }\n\n // Simulate error if scripted\n if (scripted.error) {\n throw new ProviderError(\n scripted.error.message,\n (scripted.error.code as ProviderError[\"code\"]) || \"unknown\",\n scripted.error.status\n );\n }\n\n // Build provider response\n const promptTokens = scripted.usage?.promptTokens ?? this.estimateTokens(request);\n const completionTokens =\n scripted.usage?.completionTokens ?? Math.ceil((scripted.content?.length ?? 0) / 4);\n const reasoningTokens = scripted.usage?.reasoningTokens ?? 0;\n\n // Convert tool calls from internal format to provider format\n const toolCalls: ProviderToolCallPart[] | undefined = scripted.toolCalls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n }));\n\n const finishReason: ProviderFinishReason =\n scripted.finishReason === \"tool_calls\" ? \"tool_calls\" : \"stop\";\n\n return {\n content: scripted.content ?? null,\n reasoning: scripted.reasoningContent ?? null,\n reasoningDetails: scripted.reasoningDetails,\n toolCalls,\n providerTools: scripted.providerTools,\n finishReason,\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n reasoningTokens: reasoningTokens || undefined,\n },\n };\n }\n\n /**\n * Streaming generation - yields chunks for the next scripted response\n */\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const response = await this.generate(request);\n const streamingConfig = this.script.getStreamingConfig();\n const self = this;\n\n return {\n async *[Symbol.asyncIterator]() {\n // Check for abort\n if (request.signal?.aborted) {\n yield { type: \"error\", error: \"Request aborted\", code: \"timeout\" };\n return;\n }\n\n // Stream content\n if (response.content) {\n if (streamingConfig) {\n // Chunk the content for streaming simulation\n for (let i = 0; i < response.content.length; i += streamingConfig.chunkSize) {\n const chunk = response.content.substring(i, i + streamingConfig.chunkSize);\n yield { type: \"content-delta\", delta: chunk };\n\n if (streamingConfig.chunkDelayMs > 0) {\n await self.sleep(streamingConfig.chunkDelayMs);\n }\n }\n } else {\n // Immediate mode - send full content as one chunk\n yield { type: \"content-delta\", delta: response.content };\n }\n yield { type: \"content-done\" };\n }\n\n // Stream reasoning\n if (response.reasoning) {\n yield { type: \"reasoning-delta\", delta: response.reasoning };\n yield { type: \"reasoning-done\" };\n }\n\n // Stream tool calls\n if (response.toolCalls) {\n for (const tc of response.toolCalls) {\n yield { type: \"tool-call-start\", id: tc.id, name: tc.name };\n yield { type: \"tool-call-done\", id: tc.id, arguments: tc.arguments };\n }\n }\n\n if (response.providerTools) {\n for (const tool of response.providerTools) {\n yield { type: \"provider-tool-done\", tool };\n }\n }\n\n // Final finish event\n yield {\n type: \"finish\",\n finishReason: response.finishReason,\n usage: response.usage,\n };\n },\n };\n }\n\n /**\n * Validate request matches expectations\n */\n private validateInput(request: ProviderRequest, expectations: InputExpectation): void {\n if (expectations.messageCount !== undefined) {\n if (request.messages.length !== expectations.messageCount) {\n throw new ProviderError(\n `TestProvider: Expected ${expectations.messageCount} messages, got ${request.messages.length}`,\n \"invalid_request\"\n );\n }\n }\n\n if (expectations.containsMessage) {\n const pattern = expectations.containsMessage;\n const found = request.messages.some((m) => {\n const content =\n m.role === \"user\" ? contentToString(m.content) : m.role === \"assistant\" ? m.content : \"\";\n if (!content) return false;\n return typeof pattern === \"string\" ? content.includes(pattern) : pattern.test(content);\n });\n\n if (!found) {\n throw new ProviderError(\n `TestProvider: Expected message containing \"${pattern}\" not found`,\n \"invalid_request\"\n );\n }\n }\n\n if (expectations.containsToolResult) {\n const { toolName, resultContains } = expectations.containsToolResult;\n const found = request.messages.some((m) => {\n if (m.role !== \"tool\") return false;\n const content = typeof m.content === \"string\" ? m.content : \"\";\n return !resultContains || content.includes(resultContains);\n });\n\n if (!found) {\n throw new ProviderError(\n `TestProvider: Expected tool result for \"${toolName}\" not found`,\n \"invalid_request\"\n );\n }\n }\n\n if (expectations.systemPromptContains) {\n const pattern = expectations.systemPromptContains;\n const systemMessage = request.messages.find((m) => m.role === \"system\");\n const systemContent = systemMessage?.role === \"system\" ? systemMessage.content : \"\";\n if (!systemContent) {\n throw new ProviderError(`TestProvider: No system message found`, \"invalid_request\");\n }\n const matches =\n typeof pattern === \"string\" ? systemContent.includes(pattern) : pattern.test(systemContent);\n if (!matches) {\n throw new ProviderError(\n `TestProvider: System prompt does not contain \"${pattern}\"`,\n \"invalid_request\"\n );\n }\n }\n }\n\n /**\n * Simple token estimation (for mock usage stats)\n */\n private estimateTokens(request: ProviderRequest): number {\n return request.messages.reduce((sum, m) => {\n let content = \"\";\n if (m.role === \"system\") {\n content = m.content;\n } else if (m.role === \"user\") {\n content = contentToString(m.content);\n } else if (m.role === \"assistant\") {\n content = m.content ?? \"\";\n } else if (m.role === \"tool\") {\n content = typeof m.content === \"string\" ? m.content : \"\";\n }\n // Rough approximation: ~4 chars per token\n return sum + Math.ceil(content.length / 4);\n }, 0);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // ============ Test Utility Methods ============\n\n /**\n * Get logged requests (for test assertions)\n */\n getRequestLog(): ProviderRequest[] {\n return [...this.requestLog];\n }\n\n /**\n * Get the last request made\n */\n getLastRequest(): ProviderRequest | undefined {\n return this.requestLog[this.requestLog.length - 1];\n }\n\n /**\n * Reset provider state for reuse across tests\n */\n reset(): void {\n this.responseIndex = 0;\n this.requestLog = [];\n }\n\n /**\n * Replace the script with a new one and reset\n */\n setScript(script: TestScript): void {\n this.script = script;\n this.reset();\n }\n\n /**\n * Check if all scripted responses were consumed\n */\n isScriptComplete(): boolean {\n return this.responseIndex === this.script.length;\n }\n\n /**\n * Get remaining unconsumed response count\n */\n remainingResponses(): number {\n return this.script.length - this.responseIndex;\n }\n\n /**\n * Get current response index\n */\n getCurrentIndex(): number {\n return this.responseIndex;\n }\n}\n\n/**\n * Factory function to create a TestProvider\n */\nexport function createTestProvider(script?: TestScript): TestProvider {\n return new TestProvider({\n apiKey: \"test\",\n script,\n });\n}\n\n/**\n * ProviderFactory-compatible factory for test provider\n */\nexport const test = (config: ProviderFactoryConfig): LLMProviderInterface => {\n return new TestProvider({\n ...config,\n script: (config as TestProviderConfig).script,\n validateInputs: (config as TestProviderConfig).validateInputs,\n debugLog: (config as TestProviderConfig).debugLog,\n });\n};\n","/**\n * Hosted Standard Agents provider routing.\n *\n * When a project is connected to the Standard Agents platform with\n * STANDARD_AGENTS_API_KEY and no provider-specific BYOK key is configured,\n * the model's own provider package handles the request exactly as it would\n * against the real provider — same payloads, same streaming, same parsing —\n * but its baseUrl points at the platform's passthrough proxy. The platform\n * validates the platform key, re-signs the request with its own provider\n * credentials, tees the stream to record usage against the account, and\n * forwards everything else untouched.\n */\n\nexport interface PlatformRouting {\n /** Platform API key used in place of the provider key */\n apiKey: string;\n /** Provider-scoped passthrough base URL on the platform */\n baseUrl: string;\n /** Platform origin the base URL was derived from */\n origin: string;\n}\n\nconst DEFAULT_PLATFORM_PROXY_ORIGIN = 'https://proxy.standardagents.ai';\n\nfunction stringEnv(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n/**\n * Resolve hosted routing for a provider from the Worker environment.\n *\n * Returns null when the project is not platform-connected. STANDARD_AGENTS_*\n * names are canonical; PLATFORM_* names are legacy fallbacks. The origin\n * falls back to PLATFORM_ENDPOINT / STANDARD_AGENTS_API_URL because the\n * platform Worker serves the passthrough proxy on its own origin, which is\n * how the CLI points local projects at a development platform.\n */\n/**\n * Provider-specific base path appended after the provider segment.\n *\n * Cloudflare's API mounts chat completions under /ai/v1 but model discovery\n * under /ai/models/search, so its passthrough upstream is the account root\n * and the OpenAI-compatible suffix lives on the client base URL instead.\n */\nconst PROVIDER_BASE_PATHS: Record<string, string> = {\n cloudflare: '/ai/v1',\n};\n\nexport function resolvePlatformRouting(\n providerName: string,\n env: Record<string, unknown>,\n): PlatformRouting | null {\n const apiKey = stringEnv(env.STANDARD_AGENTS_API_KEY) ?? stringEnv(env.PLATFORM_API_KEY);\n if (!apiKey) return null;\n\n const origin = (\n stringEnv(env.STANDARD_AGENTS_PROXY_URL) ??\n stringEnv(env.PLATFORM_ENDPOINT) ??\n stringEnv(env.STANDARD_AGENTS_API_URL) ??\n DEFAULT_PLATFORM_PROXY_ORIGIN\n ).replace(/\\/+$/, '');\n\n const provider = providerName.toLowerCase();\n const basePath = PROVIDER_BASE_PATHS[provider] ?? '';\n\n return {\n apiKey,\n origin,\n baseUrl: `${origin}/v1/proxy/${encodeURIComponent(provider)}${basePath}`,\n };\n}\n","import type {\n LLMProviderInterface,\n ProviderFactoryConfig,\n} from \"./types\";\nimport type { ThreadInstance, Env } from \"../types\";\nimport type { ModelDefinition, ProviderFactory } from \"@standardagents/spec\";\nimport { createTestProvider } from \"./TestProvider\";\nimport { resolvePlatformRouting } from \"./platform-routing\";\n\n/**\n * Function that can intercept provider creation.\n * Returns a provider to override the default, or null to fall through.\n */\ntype ProviderOverrideFn = (\n modelName: string,\n modelDef: ModelDefinition<string>,\n env: Env,\n) => LLMProviderInterface | null;\n\n/**\n * Provider registry implementation\n *\n * Models must use ProviderFactory functions imported from provider packages\n * (e.g., @standardagents/openai, @standardagents/openrouter).\n *\n * Loads model configs from TypeScript virtual modules and\n * provider API keys from environment variables.\n */\nclass ProviderRegistryImpl {\n private providerCache = new Map<string, { provider: LLMProviderInterface; fingerprint: string }>();\n private providerOverrideFn: ProviderOverrideFn | null = null;\n private providerOverrideRevision = 0;\n\n setProviderOverride(fn: ProviderOverrideFn | null): void {\n this.providerOverrideFn = fn;\n this.providerOverrideRevision += 1;\n }\n\n /**\n * Get provider for a model.\n *\n * Models must use ProviderFactory functions (imported from provider packages).\n *\n * @param modelName - The model name (from TypeScript config)\n * @param env - Environment bindings\n * @param thread - Thread instance for loading model from virtual modules\n * @returns Provider and model definition\n */\n async getProvider(\n modelName: string,\n env: Env,\n thread?: ThreadInstance\n ): Promise<{ provider: LLMProviderInterface; modelName: string; modelDef: ModelDefinition<string> }> {\n if (!thread) {\n throw new Error(\"Thread instance required for model lookup\");\n }\n\n // Always reload the model definition. Admin UI edits rewrite TypeScript model\n // files during dev, so caching modelDef here can make execution use stale\n // provider/model config until a worker restart.\n const modelDef = await thread.loadModel(modelName);\n if (!modelDef) {\n throw new Error(`Model not found: ${modelName}`);\n }\n\n if (typeof modelDef.provider !== 'function') {\n throw new Error(\n `Model '${modelName}' has invalid provider. Provider must be a ProviderFactory function imported from a provider package (e.g., @standardagents/openai).`\n );\n }\n\n const providerFactory = modelDef.provider as ProviderFactory;\n const providerName = providerFactory({ apiKey: '' }).name;\n\n if (providerName === 'test') {\n const fingerprint = this.getProviderFingerprint(providerName, modelDef);\n const cached = this.providerCache.get(modelName);\n if (cached?.fingerprint === fingerprint) {\n return this.buildResult(cached.provider, modelDef);\n }\n\n return this.cacheAndReturn(modelName, createTestProvider(), modelDef, fingerprint);\n }\n\n const apiKey = this.getApiKeyForProvider(providerName, env);\n if (apiKey) {\n const config: ProviderFactoryConfig = { apiKey };\n if (modelDef.providerOptions?.baseUrl) {\n config.baseUrl = modelDef.providerOptions.baseUrl as string;\n }\n if (providerName === 'cloudflare' && !config.baseUrl && env.CLOUDFLARE_ACCOUNT_ID) {\n config.baseUrl = `https://api.cloudflare.com/client/v4/accounts/${env.CLOUDFLARE_ACCOUNT_ID as string}/ai/v1`;\n }\n if (providerName === 'cloudflare' && env.CLOUDFLARE_ACCOUNT_ID) {\n (config as ProviderFactoryConfig & { accountId?: string }).accountId = env.CLOUDFLARE_ACCOUNT_ID as string;\n }\n\n const fingerprint = this.getProviderFingerprint(providerName, modelDef, config);\n const cached = this.providerCache.get(modelName);\n if (cached?.fingerprint === fingerprint) {\n return this.buildResult(cached.provider, modelDef);\n }\n\n return this.cacheAndReturn(modelName, providerFactory(config), modelDef, fingerprint);\n }\n\n // Try override only after direct provider credentials are absent. This\n // lets STANDARD_AGENTS_API_KEY unlock hosted routing without overriding BYOK.\n if (this.providerOverrideFn) {\n const overrideFingerprint = this.getProviderFingerprint(`override:${this.providerOverrideRevision}`, modelDef);\n const overrideCached = this.providerCache.get(modelName);\n if (overrideCached?.fingerprint === overrideFingerprint) {\n return this.buildResult(overrideCached.provider, modelDef);\n }\n\n const overrideProvider = this.providerOverrideFn(modelName, modelDef, env);\n if (overrideProvider) {\n return this.cacheAndReturn(modelName, overrideProvider, modelDef, overrideFingerprint);\n }\n }\n\n // Built-in hosted routing: platform-connected projects keep using the\n // model's own provider package for all request/stream handling, but point\n // it at the platform passthrough proxy, which re-signs with platform\n // provider keys and meters usage. No per-project registration code needed.\n const routing = resolvePlatformRouting(providerName, env as Record<string, unknown>);\n if (routing) {\n const config: ProviderFactoryConfig = {\n apiKey: routing.apiKey,\n baseUrl: routing.baseUrl,\n };\n\n const fingerprint = this.getProviderFingerprint(`platform:${providerName}`, modelDef, config);\n const cached = this.providerCache.get(modelName);\n if (cached?.fingerprint === fingerprint) {\n return this.buildResult(cached.provider, modelDef);\n }\n\n return this.cacheAndReturn(modelName, providerFactory(config), modelDef, fingerprint);\n }\n\n throw new Error(`No API key found for provider: ${providerName}. Set the provider key or STANDARD_AGENTS_API_KEY.`);\n }\n\n private buildResult(\n provider: LLMProviderInterface,\n modelDef: ModelDefinition<string>,\n ): { provider: LLMProviderInterface; modelName: string; modelDef: ModelDefinition<string> } {\n return { provider, modelName: modelDef.model, modelDef };\n }\n\n private cacheAndReturn(\n modelName: string,\n provider: LLMProviderInterface,\n modelDef: ModelDefinition<string>,\n fingerprint: string,\n ): { provider: LLMProviderInterface; modelName: string; modelDef: ModelDefinition<string> } {\n this.providerCache.set(modelName, { provider, fingerprint });\n return this.buildResult(provider, modelDef);\n }\n\n private getProviderFingerprint(\n providerName: string,\n modelDef: ModelDefinition<string>,\n config?: ProviderFactoryConfig & { accountId?: string },\n ): string {\n return JSON.stringify({\n providerName,\n baseUrl: config?.baseUrl ?? modelDef.providerOptions?.baseUrl ?? null,\n apiKey: config?.apiKey ?? null,\n accountId: config?.accountId ?? null,\n });\n }\n\n /**\n * Get API key for a provider from environment variables.\n */\n private getApiKeyForProvider(providerName: string, env: Env): string | null {\n const apiKeyEnvVarMap: Record<string, string> = {\n cloudflare: \"CLOUDFLARE_API_TOKEN\",\n cerebras: \"CEREBRAS_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n groq: \"GROQ_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n xai: \"XAI_API_KEY\",\n };\n\n const envVar = apiKeyEnvVarMap[providerName.toLowerCase()];\n if (envVar && (env as Record<string, unknown>)[envVar]) {\n return (env as Record<string, unknown>)[envVar] as string;\n }\n\n return null;\n }\n\n /**\n * Clear the provider cache\n * Useful for testing or when configurations change\n */\n clearCache(): void {\n this.providerCache.clear();\n }\n}\n\n/**\n * Singleton instance\n */\nexport const ProviderRegistry = new ProviderRegistryImpl();\n","/**\n * Provider system for LLM integrations\n *\n * Providers are now external packages that implement the LLMProviderInterface\n * from @standardagents/spec. This module exports:\n *\n * - Types re-exported from @standardagents/spec\n * - TestProvider for deterministic testing\n * - ProviderRegistry for loading model providers\n *\n * ## Usage\n *\n * ```typescript\n * // Get provider for a model (loads from model definition's provider factory)\n * const { provider, modelDef } = await ProviderRegistry.getProvider(modelId, env, thread);\n *\n * // Build request and stream response\n * const stream = await provider.stream(request);\n * for await (const chunk of stream) {\n * // Process chunks\n * }\n * ```\n *\n * ## Available Provider Packages\n *\n * - @standardagents/google - Google Gemini / Imagen provider\n * - @standardagents/groq - Groq provider\n * - @standardagents/openai - OpenAI provider (Responses API)\n * - @standardagents/openrouter - OpenRouter provider\n * - @standardagents/xai - xAI provider\n *\n * ## Adding a New Provider\n *\n * 1. Create a provider package implementing LLMProviderInterface\n * 2. Export a factory function conforming to ProviderFactory\n * 3. Use in model definitions: `provider: myProvider`\n */\n\nexport * from \"./types\";\nexport * from \"./TestScript\";\nexport * from \"./TestProvider\";\nexport { ProviderRegistry } from \"./ProviderRegistry\";\n","import type {\n RequestContext,\n LLMResponse,\n LLMResponseWithLog,\n FlowState,\n ModelFallback,\n LogData,\n MessageContent,\n ToolCall,\n ProviderToolCall,\n} from \"./types\";\nimport type {\n ProviderRequest,\n ProviderMessage,\n ProviderTool,\n ProviderStreamChunk,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderUsage,\n ProviderExecutedToolResult,\n ContentPart,\n ProviderMessageContent,\n} from \"./providers/types\";\nimport { ProviderError } from \"@standardagents/spec\";\nimport type { ModelDefinition, ResponseSummary, LLMProviderInterface } from \"@standardagents/spec\";\nimport { calculateUsageCost, resolveModelPricing } from \"./pricing\";\nimport { MAX_RETRIES_PER_MODEL, BACKOFF_BASE, TIMESTAMP_MULTIPLIER } from \"./types\";\n\ninterface VisionFilteringSummary {\n enabled: true;\n reason: \"model_no_vision\";\n removedUserImageParts: number;\n removedToolImageAttachments: number;\n}\n\ninterface BuildRequestBodyResult {\n requestBody: Omit<ProviderRequest, \"signal\">;\n visionFiltering?: VisionFilteringSummary;\n}\n\nconst NON_VISION_PLACEHOLDER_TEXT = \"[Image omitted: model does not support vision]\";\n\n/**\n * Returns true when model requests should include image inputs.\n * Defaults to true when capabilities are not configured.\n */\nexport function modelSupportsImageInput(modelDef: ModelDefinition<string>): boolean {\n const supportsImages = modelDef.capabilities?.supportsImages;\n if (typeof supportsImages === \"boolean\") {\n return supportsImages;\n }\n const legacyVision = modelDef.capabilities?.vision;\n if (typeof legacyVision === \"boolean\") {\n return legacyVision;\n }\n return true;\n}\n\n/**\n * Returns true when model requests should include tool definitions/tool choice.\n * Defaults to true when capabilities are not configured.\n */\nexport function modelSupportsToolCalls(modelDef: ModelDefinition<string>): boolean {\n const supportsToolCalls = modelDef.capabilities?.supportsToolCalls;\n if (typeof supportsToolCalls === \"boolean\") {\n return supportsToolCalls;\n }\n return true;\n}\n\n/**\n * Remove image payloads from provider messages for non-vision models.\n * Message history in storage remains untouched; filtering is request-only.\n */\nexport function filterImagesFromProviderMessages(messages: ProviderMessage[]): {\n messages: ProviderMessage[];\n removedUserImageParts: number;\n removedToolImageAttachments: number;\n} {\n let removedUserImageParts = 0;\n let removedToolImageAttachments = 0;\n\n const filteredMessages = messages.map((message): ProviderMessage => {\n if (message.role === \"user\" && Array.isArray(message.content)) {\n const filteredParts = message.content.filter((part) => {\n if (part.type === \"image\" || part.type === \"image_url\") {\n removedUserImageParts++;\n return false;\n }\n return true;\n });\n\n if (filteredParts.length === message.content.length) {\n return message;\n }\n\n if (filteredParts.length === 0) {\n return {\n ...message,\n content: [{ type: \"text\", text: NON_VISION_PLACEHOLDER_TEXT }],\n };\n }\n\n return {\n ...message,\n content: filteredParts,\n };\n }\n\n if (message.role === \"tool\" && message.attachments?.length) {\n const filteredAttachments = message.attachments.filter((attachment) => {\n const isImage =\n attachment.type === \"image\" ||\n attachment.mediaType.toLowerCase().startsWith(\"image/\");\n\n if (isImage) {\n removedToolImageAttachments++;\n return false;\n }\n return true;\n });\n\n if (filteredAttachments.length === message.attachments.length) {\n return message;\n }\n\n return {\n ...message,\n attachments: filteredAttachments.length ? filteredAttachments : undefined,\n };\n }\n\n return message;\n });\n\n return {\n messages: filteredMessages,\n removedUserImageParts,\n removedToolImageAttachments,\n };\n}\n\n/**\n * Drop blank assistant history entries that have no content, no tool calls, and no reasoning.\n * These can be created by failed/aborted turns and some providers reject them.\n */\nexport function filterEmptyAssistantProviderMessages(messages: ProviderMessage[]): ProviderMessage[] {\n return messages.filter((message) => {\n if (message.role !== \"assistant\") return true;\n\n const hasToolCalls = Array.isArray(message.toolCalls) && message.toolCalls.length > 0;\n const hasReasoning =\n typeof message.reasoning === \"string\"\n ? message.reasoning.trim().length > 0\n : Boolean(message.reasoningDetails);\n const hasContent =\n typeof message.content === \"string\"\n ? message.content.trim().length > 0\n : message.content !== null;\n\n return hasToolCalls || hasReasoning || hasContent;\n });\n}\n\nfunction buildSyntheticMissingToolResult(\n toolCall: ToolCall\n): RequestContext[\"messages\"][number] {\n return {\n role: \"tool\",\n tool_call_id: toolCall.id,\n name: toolCall.function.name,\n toolName: toolCall.function.name,\n content:\n `Tool result missing from conversation history for prior call \"${toolCall.function.name}\". ` +\n `Treat this as a failed tool call.`,\n };\n}\n\n/**\n * Preserve steering messages while ensuring every assistant tool-call block is immediately\n * followed by the matching tool results before any other message roles.\n */\nexport function normalizeToolCallMessageSequence(\n messages: RequestContext[\"messages\"]\n): RequestContext[\"messages\"] {\n const normalized: RequestContext[\"messages\"] = [];\n\n type PendingToolBlock = {\n assistantMessage: RequestContext[\"messages\"][number];\n expectedToolCalls: ToolCall[];\n matchedResults: Map<string, RequestContext[\"messages\"][number]>;\n deferredMessages: RequestContext[\"messages\"];\n };\n\n let pending: PendingToolBlock | null = null;\n\n const flushPending = () => {\n if (!pending) {\n return;\n }\n\n normalized.push(pending.assistantMessage);\n\n for (const toolCall of pending.expectedToolCalls) {\n const matchedResult = pending.matchedResults.get(toolCall.id);\n normalized.push(matchedResult ?? buildSyntheticMissingToolResult(toolCall));\n }\n\n if (pending.deferredMessages.length > 0) {\n normalized.push(...normalizeToolCallMessageSequence(pending.deferredMessages));\n }\n\n pending = null;\n };\n\n for (const message of messages) {\n const isAssistantToolCallMessage =\n message.role === \"assistant\" &&\n Array.isArray(message.tool_calls) &&\n message.tool_calls.length > 0;\n\n if (!pending) {\n if (!isAssistantToolCallMessage) {\n normalized.push(message);\n continue;\n }\n\n const toolCalls = message.tool_calls ?? [];\n const expectedToolCalls = toolCalls.filter(\n (toolCall): toolCall is ToolCall =>\n Boolean(toolCall && typeof toolCall.id === \"string\" && toolCall.function?.name)\n );\n\n if (expectedToolCalls.length === 0) {\n normalized.push(message);\n continue;\n }\n\n pending = {\n assistantMessage: message,\n expectedToolCalls,\n matchedResults: new Map(),\n deferredMessages: [],\n };\n continue;\n }\n\n const matchesPendingToolResult =\n message.role === \"tool\" &&\n typeof message.tool_call_id === \"string\" &&\n pending.expectedToolCalls.some((toolCall) => toolCall.id === message.tool_call_id) &&\n !pending.matchedResults.has(message.tool_call_id);\n\n if (matchesPendingToolResult) {\n pending.matchedResults.set(message.tool_call_id!, message);\n\n if (pending.matchedResults.size === pending.expectedToolCalls.length) {\n flushPending();\n }\n continue;\n }\n\n pending.deferredMessages.push(message);\n }\n\n flushPending();\n\n return normalized;\n}\n\n/**\n * Strip base64 data from already-transformed ProviderMessage[] for logging.\n * Reduces log size while preserving structure accuracy.\n */\nfunction stripBase64FromMessages(\n messages: ProviderMessage[],\n imagePathMap?: Map<string, string>\n): ProviderMessage[] {\n return messages.map((msg): ProviderMessage => {\n // Only user messages can have multimodal content with images\n if (msg.role === \"user\" && Array.isArray(msg.content)) {\n return {\n ...msg,\n content: msg.content.map((part) => {\n // Check for image parts with base64 data\n if (part.type === \"image\" && \"data\" in part) {\n const data = part.data;\n if (typeof data === \"string\") {\n // Check if it's a data URL or long base64 string\n if (data.startsWith(\"data:\") || data.length > 1000) {\n const path = imagePathMap?.get(data);\n return {\n ...part,\n data: \"[base64 omitted]\",\n ...(path ? { path } : {}),\n };\n }\n }\n }\n return part;\n }),\n };\n }\n // Tool messages can have attachments with base64 data\n if (msg.role === \"tool\" && msg.attachments) {\n return {\n ...msg,\n attachments: msg.attachments.map((att) => ({\n type: att.type,\n data: \"[base64 omitted]\", // Replace base64 data with placeholder\n mediaType: att.mediaType,\n name: att.name,\n path: att.path, // Keep path for logs\n })),\n };\n }\n return msg;\n });\n}\n\n/**\n * Map reasoning effort string to 0-100 level\n */\nfunction reasoningEffortToLevel(effort: string | undefined): number | undefined {\n if (!effort) return undefined;\n switch (effort) {\n case \"low\":\n return 33;\n case \"medium\":\n return 66;\n case \"high\":\n return 100;\n default:\n return undefined;\n }\n}\n\n/**\n * Transform RequestContext messages to ProviderMessage format\n */\nfunction transformMessages(messages: RequestContext[\"messages\"]): ProviderMessage[] {\n return messages.map((msg): ProviderMessage => {\n switch (msg.role) {\n case \"system\":\n return {\n role: \"system\",\n content: typeof msg.content === \"string\" ? msg.content : \"\",\n };\n\n case \"user\":\n return {\n role: \"user\",\n content: transformContent(msg.content),\n };\n\n case \"assistant\": {\n // Parse tool_calls if present (they're stored as ToolCall objects)\n const toolCalls: ProviderToolCallPart[] | undefined = msg.tool_calls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments:\n typeof tc.function.arguments === \"string\"\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments,\n extraContent:\n tc.extra_content && typeof tc.extra_content === \"object\"\n ? tc.extra_content\n : undefined,\n }));\n\n return {\n role: \"assistant\",\n content: typeof msg.content === \"string\" ? msg.content : null,\n toolCalls: toolCalls?.length ? toolCalls : undefined,\n // Pass reasoning for multi-turn context\n reasoning: (msg as any).reasoning_content || undefined,\n reasoningDetails: (msg as any).reasoning_details || undefined,\n };\n }\n\n case \"tool\":\n return {\n role: \"tool\",\n toolCallId: msg.tool_call_id ?? \"\",\n toolName: msg.name ?? \"\",\n content: typeof msg.content === \"string\" ? msg.content : \"\",\n attachments: msg.attachments, // Pass through image attachments for provider transformation\n };\n }\n });\n}\n\n/**\n * Transform MessageContent to ProviderMessageContent\n */\nfunction transformContent(content: MessageContent | undefined): ProviderMessageContent {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n\n // Transform multimodal content\n return content.map((part): ContentPart => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image_url\" && part.image_url) {\n // Convert image_url format to image format\n return {\n type: \"image\",\n data: part.image_url.url,\n mediaType: \"image/jpeg\", // Default; actual type is embedded in data URL\n detail: part.image_url.detail,\n };\n }\n // Fallback for unknown part types\n return { type: \"text\", text: \"\" };\n });\n}\n\n/**\n * Transform RequestContext tools to ProviderTool format\n */\nfunction transformTools(tools: RequestContext[\"tools\"]): ProviderTool[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n\n return tools.map((tool) => {\n const providerTool: ProviderTool = {\n type: \"function\" as const,\n function: {\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n },\n };\n\n // Preserve execution mode for provider-side tools (e.g., OpenAI's image_generation)\n if ((tool as any).executionMode) {\n providerTool.executionMode = (tool as any).executionMode;\n }\n if ((tool as any).executionProvider) {\n providerTool.executionProvider = (tool as any).executionProvider;\n }\n\n return providerTool;\n });\n}\n\n/**\n * Transform tool_choice from RequestContext format to ProviderRequest format\n */\nfunction transformToolChoice(\n toolChoice: RequestContext[\"tool_choice\"]\n): ProviderRequest[\"toolChoice\"] {\n if (!toolChoice) return undefined;\n if (typeof toolChoice === \"string\") {\n return toolChoice as \"auto\" | \"none\" | \"required\";\n }\n if (toolChoice.type === \"function\" && toolChoice.function?.name) {\n return { name: toolChoice.function.name };\n }\n return undefined;\n}\n\n/**\n * Build the request body that will be sent to the provider.\n * Used for both actual requests and logging to ensure consistency.\n */\nfunction buildRequestBody(\n context: RequestContext,\n modelDef: ModelDefinition<string>\n): BuildRequestBodyResult {\n const normalizedMessages = normalizeToolCallMessageSequence(context.messages);\n const transformedMessages = transformMessages(normalizedMessages);\n const supportsImageInput = modelSupportsImageInput(modelDef);\n const supportsToolCalls = modelSupportsToolCalls(modelDef);\n\n let requestMessages = transformedMessages;\n let visionFiltering: VisionFilteringSummary | undefined;\n\n if (!supportsImageInput) {\n const filtered = filterImagesFromProviderMessages(transformedMessages);\n requestMessages = filtered.messages;\n if (filtered.removedUserImageParts > 0 || filtered.removedToolImageAttachments > 0) {\n visionFiltering = {\n enabled: true,\n reason: \"model_no_vision\",\n removedUserImageParts: filtered.removedUserImageParts,\n removedToolImageAttachments: filtered.removedToolImageAttachments,\n };\n }\n }\n\n requestMessages = filterEmptyAssistantProviderMessages(requestMessages);\n\n const tools = supportsToolCalls ? transformTools(context.tools) : undefined;\n const toolChoice = supportsToolCalls ? transformToolChoice(context.tool_choice) : undefined;\n\n return {\n requestBody: {\n model: modelDef.model,\n messages: requestMessages,\n tools,\n toolChoice,\n parallelToolCalls: supportsToolCalls ? context.parallel_tool_calls : undefined,\n reasoning: context.reasoning\n ? {\n level: reasoningEffortToLevel(context.reasoning.effort),\n maxTokens: context.reasoning.max_tokens,\n exclude: context.reasoning.exclude,\n }\n : undefined,\n providerOptions: modelDef.providerOptions,\n },\n visionFiltering,\n };\n}\n\n/**\n * Build a ProviderRequest from RequestContext\n */\nfunction buildProviderRequest(\n context: RequestContext,\n modelDef: ModelDefinition<string>,\n signal?: AbortSignal\n): ProviderRequest {\n const { requestBody } = buildRequestBody(context, modelDef);\n return {\n ...requestBody,\n signal,\n };\n}\n\n/**\n * Convert ProviderToolCallPart to internal ToolCall format\n */\nfunction convertToolCalls(toolCalls: ProviderToolCallPart[]): ToolCall[] {\n return toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n },\n extra_content: tc.extraContent,\n }));\n}\n\nfunction normalizeProviderToolForLog(\n tool: {\n name?: unknown;\n type?: unknown;\n provider?: unknown;\n id?: unknown;\n status?: unknown;\n result?: ProviderToolCall[\"result\"];\n metadata?: Record<string, unknown>;\n }\n): ProviderToolCall | null {\n const name = typeof tool.name === \"string\"\n ? tool.name\n : typeof tool.type === \"string\"\n ? tool.type\n : null;\n if (!name || typeof tool.id !== \"string\") return null;\n\n const status: ProviderToolCall[\"status\"] =\n tool.status === \"failed\"\n ? \"failed\"\n : tool.status === \"in_progress\" || tool.status === \"searching\"\n ? \"in_progress\"\n : \"completed\";\n\n return {\n name,\n type: name,\n ...(typeof tool.provider === \"string\" ? { provider: tool.provider } : {}),\n id: tool.id,\n status,\n ...(tool.result ? { result: tool.result } : {}),\n ...(tool.metadata ? { metadata: tool.metadata } : {}),\n };\n}\n\nfunction pushProviderToolForLog(\n providerTools: ProviderToolCall[],\n seenProviderTools: Set<string>,\n tool: ProviderToolCall | null\n): void {\n if (!tool) return;\n const key = `${tool.name ?? tool.type}:${tool.id}`;\n if (seenProviderTools.has(key)) return;\n seenProviderTools.add(key);\n providerTools.push(tool);\n}\n\n/**\n * Convert ProviderUsage to internal usage format\n */\nfunction convertUsage(usage: ProviderUsage): LLMResponse[\"usage\"] {\n return {\n prompt_tokens: usage.promptTokens,\n completion_tokens: usage.completionTokens,\n total_tokens: usage.totalTokens,\n prompt_tokens_details: usage.cachedTokens\n ? { cached_tokens: usage.cachedTokens }\n : undefined,\n completion_tokens_details: usage.reasoningTokens\n ? { reasoning_tokens: usage.reasoningTokens }\n : undefined,\n cost: usage.cost,\n provider: usage.provider,\n };\n}\n\n/**\n * Executes LLM requests with smart retry and fallback logic\n */\nexport class LLMRequest {\n /**\n * Execute an LLM request with full retry/fallback logic\n *\n * Retry hierarchy:\n * 1. Try primary model (2x)\n * 2. Try each fallback model (2x each)\n * 3. If all fail, throw terminal error\n *\n * Error classification:\n * - Provider errors (from model call): Retriable with backoff + fallbacks\n * - Code errors (validation, setup): Thrown immediately without retry\n *\n * This applies to ALL prompts (top-level and sub-prompts)\n * Returns both the LLM response and the log ID for tracking\n */\n static async execute(\n context: RequestContext,\n state: FlowState\n ): Promise<LLMResponseWithLog> {\n const startTime = Date.now();\n let lastFailedLogId: string | undefined;\n\n // Try primary model\n try {\n return await this.tryModel(context, state, context.model, startTime, undefined);\n } catch (primaryError) {\n console.error(`Primary model ${context.model} failed:`, primaryError);\n\n // Get the log ID from the error (set by tryModel)\n lastFailedLogId = (primaryError as Record<string, unknown>)?._lastLogId as string | undefined;\n\n // Send fallback telemetry\n state.emitTelemetry?.({\n type: \"fallback_triggered\",\n from: context.model,\n to: \"fetching_fallbacks\",\n timestamp: Date.now(),\n });\n }\n\n // Try fallback models\n const fallbacks = await this.getFallbacks(context.model, state);\n\n for (const fallback of fallbacks) {\n try {\n state.emitTelemetry?.({\n type: \"fallback_triggered\",\n from: context.model,\n to: fallback.fallback_model_id,\n timestamp: Date.now(),\n });\n\n // Pass lastFailedLogId so fallback attempts are linked as retries\n return await this.tryModel(\n context,\n state,\n fallback.fallback_model_id,\n startTime,\n lastFailedLogId\n );\n } catch (fallbackError) {\n console.error(\n `Fallback model ${fallback.fallback_model_id} failed:`,\n fallbackError\n );\n\n // Get the log ID from this fallback attempt\n lastFailedLogId = (fallbackError as Record<string, unknown>)?._lastLogId as\n | string\n | undefined;\n\n continue;\n }\n }\n\n // All retries exhausted\n const exhaustionError = new Error(\n `All retry attempts exhausted for model ${context.model} and ${fallbacks.length} fallbacks`\n );\n\n if (lastFailedLogId) {\n Object.assign(exhaustionError, {\n _lastLogId: lastFailedLogId,\n _loggedId: lastFailedLogId,\n });\n } else {\n // No provider attempt log exists, so keep a standalone terminal log.\n await this.logError(\n state,\n exhaustionError,\n \"all_retries_exhausted\",\n context.model,\n startTime\n );\n }\n\n throw exhaustionError;\n }\n\n /**\n * Try a specific model with retries and validation\n * @param initialParentLogId - Log ID from previous attempt (for linking fallbacks as retries)\n */\n private static async tryModel(\n context: RequestContext,\n state: FlowState,\n modelId: string,\n startTime: number,\n initialParentLogId?: string\n ): Promise<LLMResponseWithLog> {\n // Resolve the actual model ID based on namespace context\n // In packed context, try qualified name first (packageId/modelId)\n let actualModelId = modelId;\n let modelDef: any;\n\n const packageId = state.namespaceContext.type === 'packed'\n ? state.namespaceContext.packageId\n : undefined;\n\n if (packageId && !modelId.includes('/')) {\n // Try qualified model name first for packed agents\n const qualifiedModelId = `${packageId}/${modelId}`;\n try {\n modelDef = await state.thread.instance.loadModel(qualifiedModelId);\n if (modelDef) {\n actualModelId = qualifiedModelId;\n console.log(`[LLMRequest] Loaded packed model: ${qualifiedModelId}`);\n }\n } catch {\n // Fall back to global model\n }\n }\n\n // If not found in packed namespace, try global\n if (!modelDef) {\n modelDef = await state.thread.instance.loadModel(modelId);\n }\n\n if (!modelDef) {\n throw new Error(`Model definition not found: ${modelId}`);\n }\n\n let attempts = 0;\n let logId: string | undefined;\n let previousLogId: string | undefined = initialParentLogId; // Track previous attempt for retry linking\n\n while (attempts < MAX_RETRIES_PER_MODEL) {\n attempts++;\n\n try {\n // Log request details (non-blocking) and get log ID\n // Pass previousLogId for retry tracking (includes fallback linking)\n logId = await this.logRequest(state, actualModelId, context, modelDef, previousLogId);\n\n // Send telemetry for this attempt\n state.emitTelemetry?.({\n type: \"llm_request\",\n model: actualModelId,\n attempt: attempts,\n timestamp: Date.now(),\n });\n\n // Make the actual LLM call (use actualModelId for proper resolution)\n const response = await this.callModel(actualModelId, context, state, logId);\n\n // Success! Update log with response data\n await this.logSuccess(response, state, actualModelId, startTime, context, logId, modelDef);\n\n state.emitTelemetry?.({\n type: \"llm_response\",\n tokens: response.usage.total_tokens,\n latency: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n // Fire async metadata fetch if provider supports it (non-blocking)\n this.fireAsyncMetadataFetch(response, state, logId);\n\n return { response, logId };\n } catch (error) {\n console.error(`Error calling ${actualModelId} (attempt ${attempts}):`, error);\n\n // Log API error - attach to existing log if available\n await this.logError(state, error, \"api_error\", actualModelId, startTime, logId);\n\n // Network or API error - retry with backoff\n if (attempts < MAX_RETRIES_PER_MODEL) {\n const backoffMs = BACKOFF_BASE * Math.pow(2, attempts - 1);\n await this.sleep(backoffMs);\n // Save current logId as previous for retry tracking\n previousLogId = logId;\n logId = undefined;\n } else {\n // Last attempt failed, attach log ID to error for execute() to retrieve\n if (error && typeof error === \"object\") {\n (error as Record<string, unknown>)._lastLogId = logId;\n }\n throw error;\n }\n }\n }\n\n const error = new Error(\n `Model ${actualModelId} failed validation after ${MAX_RETRIES_PER_MODEL} attempts`\n ) as Record<string, unknown> & Error;\n error._lastLogId = logId;\n throw error;\n }\n\n /**\n * Log the outbound request details with full context\n * Returns the log ID for later updating\n */\n private static async logRequest(\n state: FlowState,\n modelId: string,\n context: RequestContext,\n modelDef: ModelDefinition<string>,\n retryOfLogId?: string\n ): Promise<string> {\n try {\n const id = crypto.randomUUID();\n\n // Get provider name from model definition\n let providerName: string | null = null;\n try {\n if (typeof modelDef.provider === \"function\") {\n const tempProvider = modelDef.provider({ apiKey: \"\" });\n providerName = tempProvider.name;\n }\n } catch (err) {\n console.error(\"Failed to get provider name:\", err);\n }\n\n // Build the actual request body (same as what's sent to provider)\n const { requestBody, visionFiltering } = buildRequestBody(context, modelDef);\n\n // Transform for logging: strip base64 from messages, add metadata\n const requestBodyForLog: Record<string, unknown> = {\n ...requestBody,\n messages: stripBase64FromMessages(\n requestBody.messages,\n context.imagePathMap\n ),\n // Add logging metadata (not sent to provider)\n _metadata: {\n promptName: context.promptName,\n systemPrompt: context.systemPrompt,\n ...(visionFiltering ? { visionFiltering } : {}),\n },\n };\n\n const requestBodyStr = JSON.stringify(requestBodyForLog);\n\n const logData: Partial<LogData> & { id: string } = {\n id,\n message_id: state.rootMessageId || crypto.randomUUID(),\n provider: providerName || this.getProviderFromModel(modelId),\n model: modelId,\n model_name: modelDef.model,\n endpoint: \"chat.completions\",\n request_body: requestBodyStr,\n tools_available: context.tools ? context.tools.length : 0,\n message_history_length: context.messages.length,\n prompt_name: context.promptName ?? undefined,\n parent_log_id: context.parentLogId ?? undefined,\n retry_of_log_id: retryOfLogId ?? undefined,\n tools_schema: context.tools ? JSON.stringify(context.tools) : undefined,\n system_prompt: context.systemPrompt ?? undefined,\n is_complete: false, // Incomplete until response received\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n };\n\n await (state.stream as { waitFor: (fn: () => Promise<void>) => Promise<void> }).waitFor(\n async () => {\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model, model_name, endpoint,\n request_body, tools_available, message_history_length, prompt_name,\n parent_log_id, retry_of_log_id, tools_schema, system_prompt, is_complete, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16)\n `,\n logData.id,\n logData.message_id,\n logData.provider,\n logData.model,\n logData.model_name,\n logData.endpoint,\n logData.request_body,\n logData.tools_available,\n logData.message_history_length,\n logData.prompt_name,\n logData.parent_log_id,\n logData.retry_of_log_id,\n logData.tools_schema,\n logData.system_prompt,\n logData.is_complete ? 1 : 0,\n logData.created_at\n );\n }\n );\n\n // Broadcast partial log to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: \"log_data\",\n log_id: logData.id,\n data: logData,\n });\n }\n\n return id;\n } catch (err) {\n console.error(\"Failed to log request (non-fatal):\", err);\n return crypto.randomUUID(); // Return a dummy ID\n }\n }\n\n /**\n * Call the LLM model using the new provider interface\n */\n private static async callModel(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string\n ): Promise<LLMResponse> {\n // Import provider registry\n const { ProviderRegistry } = await import(\"./providers\");\n\n // Get provider and model definition\n const { provider, modelName, modelDef } = await ProviderRegistry.getProvider(\n modelId,\n state.env,\n state.thread.instance\n );\n\n // Build the provider request\n const request = buildProviderRequest(\n context,\n modelDef,\n state.abortController?.signal\n );\n\n // Stream response using new provider interface\n let response: LLMResponse | undefined;\n await (state.stream as { waitFor: (fn: () => Promise<void>) => Promise<void> }).waitFor(\n async () => {\n const stream = await provider.stream(request);\n\n let content = \"\";\n let reasoning = \"\";\n const toolCallsMap = new Map<\n string,\n {\n id: string;\n name: string;\n argumentsDelta: string;\n extraContent?: Record<string, unknown>;\n }\n >();\n const images: Array<{ id?: string; toolName?: string; data: string; mediaType: string; revisedPrompt?: string }> = [];\n const webSearches: Array<{ id: string; status: string; actions?: any[] }> = [];\n const providerToolCalls: ProviderExecutedToolResult[] = [];\n let finishReason: ProviderFinishReason = \"stop\";\n let usage: ProviderUsage | undefined;\n let reasoningDetails: any[] | undefined; // Track reasoning details for multi-turn context\n let actualProvider: string | undefined;\n let providerResponseId: string | undefined; // For async metadata fetching\n\n for await (const chunk of stream) {\n // Check abort\n if (state.abortController?.signal?.aborted) break;\n if (await state.thread.instance.shouldStop()) break;\n\n switch (chunk.type) {\n case \"content-delta\":\n content += chunk.delta;\n // Stream to HTTP response\n state.stream.sendContent(chunk.delta);\n // Emit to WebSocket for real-time UI updates\n this.emitContentChunk(chunk.delta, state);\n break;\n\n case \"reasoning-delta\":\n reasoning += chunk.delta;\n break;\n\n case \"tool-call-start\":\n toolCallsMap.set(chunk.id, {\n id: chunk.id,\n name: chunk.name,\n argumentsDelta: \"\",\n extraContent: chunk.extraContent,\n });\n break;\n\n case \"tool-call-delta\":\n {\n const tc = toolCallsMap.get(chunk.id);\n if (tc) {\n tc.argumentsDelta += chunk.argumentsDelta;\n }\n }\n break;\n\n case \"tool-call-done\":\n {\n // Update with final parsed arguments\n toolCallsMap.set(chunk.id, {\n id: chunk.id,\n name: toolCallsMap.get(chunk.id)?.name ?? \"\",\n argumentsDelta: JSON.stringify(chunk.arguments),\n extraContent:\n chunk.extraContent ?? toolCallsMap.get(chunk.id)?.extraContent,\n });\n }\n break;\n\n case \"finish\":\n finishReason = chunk.finishReason;\n usage = chunk.usage;\n reasoningDetails = chunk.reasoningDetails; // Capture reasoning details for multi-turn context\n providerResponseId = (chunk as any).responseId; // Capture for async metadata fetching\n break;\n\n case \"image-done\":\n images.push({\n id: chunk.image.id,\n toolName: chunk.image.toolName,\n data: chunk.image.data,\n mediaType: chunk.image.mediaType,\n revisedPrompt: chunk.image.revisedPrompt,\n });\n break;\n\n case \"web-search-done\":\n webSearches.push(chunk.result);\n break;\n\n case \"provider-tool-done\":\n providerToolCalls.push(chunk.tool);\n break;\n\n case \"error\":\n throw new ProviderError(\n chunk.error,\n (chunk.code as ProviderError[\"code\"]) || \"unknown\"\n );\n }\n }\n\n // Convert accumulated tool calls to final format\n const toolCalls: ProviderToolCallPart[] = [];\n for (const tc of toolCallsMap.values()) {\n try {\n toolCalls.push({\n id: tc.id,\n name: tc.name,\n arguments: JSON.parse(tc.argumentsDelta || \"{}\"),\n extraContent: tc.extraContent,\n });\n } catch {\n // If JSON parse fails, use empty object\n toolCalls.push({\n id: tc.id,\n name: tc.name,\n arguments: {},\n extraContent: tc.extraContent,\n });\n }\n }\n\n // Build LLMResponse\n const responseId = `res_${crypto.randomUUID().substring(0, 12)}`;\n\n // Convert images to LLMResponseImage format\n const responseImages = images.length > 0\n ? images.map((img) => ({\n type: \"image_url\" as const,\n id: img.id,\n toolName: img.toolName,\n image_url: {\n url: img.data.startsWith(\"data:\")\n ? img.data\n : `data:${img.mediaType};base64,${img.data}`,\n },\n }))\n : undefined;\n\n response = {\n id: responseId,\n model: modelName,\n content: content || null,\n reasoning_content: reasoning || null,\n reasoning_details: reasoningDetails, // Include reasoning details for multi-turn context\n tool_calls: toolCalls.length > 0 ? convertToolCalls(toolCalls) : undefined,\n images: responseImages,\n finish_reason: finishReason,\n usage: usage\n ? convertUsage(usage)\n : {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n };\n\n // Store provider reference and responseId for async metadata fetching\n response._provider = provider;\n response._providerResponseId = providerResponseId;\n\n // Store aggregate response for logging\n response._aggregate_response = {\n id: responseId,\n model: modelName,\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\",\n content: content || null,\n reasoning_content: reasoning || null,\n reasoning_details: reasoningDetails,\n tool_calls:\n toolCalls.length > 0 ? convertToolCalls(toolCalls) : undefined,\n // Include generated images in the aggregate response\n // Store ID for mapping to file paths later (don't store base64 data)\n images: images.length > 0 ? images.map(img => ({\n type: \"image_url\",\n _id: img.id, // For path lookup\n image_url: {\n url: `[image:${img.id}]` // Placeholder, will be replaced with path\n }\n })) : undefined,\n },\n finish_reason: finishReason,\n },\n ],\n usage: response.usage,\n // Also store image count for quick reference\n image_count: images.length,\n // Store web search results for logging\n web_searches: webSearches.length > 0 ? webSearches : undefined,\n // Store generic provider-executed tools for logging\n provider_tools: providerToolCalls.length > 0 ? providerToolCalls : undefined,\n };\n }\n );\n\n if (!response) {\n throw new Error(\"Provider stream returned no response\");\n }\n\n return response;\n }\n\n /**\n * Emit content chunk to WebSocket for real-time UI updates\n */\n private static emitContentChunk(chunk: string, state: FlowState): void {\n if (state.emitMessageChunk && state.pendingMessageId) {\n state.emitMessageChunk(state.pendingMessageId, chunk);\n }\n }\n\n /**\n * Get fallback models from TypeScript model definition\n */\n private static async getFallbacks(\n modelName: string,\n state: FlowState\n ): Promise<ModelFallback[]> {\n try {\n const modelDef = await state.thread.instance.loadModel(modelName);\n if (modelDef && modelDef.fallbacks && modelDef.fallbacks.length > 0) {\n // Convert fallbacks array to ModelFallback format\n return modelDef.fallbacks.map((fallbackName: string, idx: number) => ({\n parent_model_id: modelName,\n fallback_model_id: fallbackName,\n idx,\n }));\n }\n return [];\n } catch (error) {\n console.error(\"Error fetching fallbacks:\", error);\n return [];\n }\n }\n\n /**\n * Update log with successful response data (best-effort, non-blocking)\n */\n private static async logSuccess(\n response: LLMResponse,\n state: FlowState,\n modelId: string,\n startTime: number,\n context: RequestContext | undefined,\n logId: string,\n modelDef: ModelDefinition<string>\n ): Promise<void> {\n try {\n // Extract tools called from response\n const toolsCalled = response.tool_calls\n ? JSON.stringify(response.tool_calls.map((tc) => tc.function.name))\n : null;\n\n const providerName = (response._provider as LLMProviderInterface | undefined)?.name;\n const standardAgentsRouterUsed = providerName === \"platform\";\n const resolvedPricing = resolveModelPricing(modelDef, providerName);\n const calculatedCost = calculateUsageCost(response.usage, resolvedPricing);\n const providerReportedCost = typeof response.usage.cost === 'number'\n ? response.usage.cost\n : (typeof response.usage.cost === 'string'\n ? parseFloat(response.usage.cost)\n : null);\n\n // Get cost directly from provider (e.g., OpenRouter with usage accounting enabled)\n const cost_total: number | null = providerReportedCost != null && !Number.isNaN(providerReportedCost)\n ? providerReportedCost\n : calculatedCost?.costTotal ?? null;\n\n // Get actual provider from usage (e.g., OpenRouter returns the actual provider that handled the request)\n const actualProvider: string | null =\n (response.usage as Record<string, unknown>).provider as string | null;\n\n // Use aggregate response if available, otherwise use the standard response\n const aggregateResponse = response._aggregate_response as Record<string, unknown> | undefined;\n const responseBody = aggregateResponse\n ? JSON.stringify(aggregateResponse)\n : JSON.stringify(response);\n\n // Build provider_tools array from aggregate response\n const providerTools: ProviderToolCall[] = [];\n const seenProviderTools = new Set<string>();\n\n if (aggregateResponse) {\n // Add generic provider-executed tools surfaced by providers\n const streamedProviderTools = aggregateResponse.provider_tools as Array<{\n name?: unknown;\n type?: unknown;\n provider?: unknown;\n id?: unknown;\n status?: unknown;\n result?: ProviderToolCall[\"result\"];\n metadata?: Record<string, unknown>;\n }> | undefined;\n if (streamedProviderTools && streamedProviderTools.length > 0) {\n for (const tool of streamedProviderTools) {\n pushProviderToolForLog(\n providerTools,\n seenProviderTools,\n normalizeProviderToolForLog(tool)\n );\n }\n }\n\n // Add web searches\n const webSearches = aggregateResponse.web_searches as Array<{ id: string; status: string; actions?: any[] }> | undefined;\n if (webSearches && webSearches.length > 0) {\n for (const ws of webSearches) {\n pushProviderToolForLog(\n providerTools,\n seenProviderTools,\n normalizeProviderToolForLog({\n name: \"web_search\",\n type: \"web_search\",\n id: ws.id,\n status: ws.status,\n result: ws.actions ? { actions: ws.actions } : undefined,\n })\n );\n }\n }\n\n // Add image generations\n const imageCount = aggregateResponse.image_count as number | undefined;\n const images = (aggregateResponse.choices as Array<{ message?: { images?: Array<{ _id?: string }> } }> | undefined)?.[0]?.message?.images;\n if (images && images.length > 0) {\n for (const img of images) {\n if (img._id) {\n pushProviderToolForLog(\n providerTools,\n seenProviderTools,\n normalizeProviderToolForLog({\n name: \"image_generation\",\n type: \"image_generation\",\n id: img._id,\n status: \"completed\",\n // imagePath will be set later by updateResponseBodyInLog when we have the path\n })\n );\n }\n }\n }\n }\n\n const providerToolsJson = providerTools.length > 0 ? JSON.stringify(providerTools) : null;\n\n const logData: Partial<LogData> & { id: string; provider_tools?: string | null } = {\n id: logId,\n response_body: responseBody,\n input_tokens: response.usage.prompt_tokens,\n cached_tokens: response.usage.prompt_tokens_details?.cached_tokens || 0,\n output_tokens: response.usage.completion_tokens,\n reasoning_tokens:\n response.usage.completion_tokens_details?.reasoning_tokens || 0,\n total_tokens: response.usage.total_tokens,\n cost_input: calculatedCost?.costInput,\n cost_output: calculatedCost?.costOutput,\n latency_ms: Date.now() - startTime,\n finish_reason: response.finish_reason,\n tools_called: toolsCalled ?? undefined,\n cost_total: cost_total ?? undefined,\n actual_provider: actualProvider ?? undefined, // Store actual provider separately (e.g., from OpenRouter)\n standard_agents_router_used: standardAgentsRouterUsed,\n is_complete: true, // Now complete\n reasoning_content: response.reasoning_content ?? undefined, // Store reasoning separately\n provider_tools: providerToolsJson ?? undefined,\n };\n\n // Update the existing log record\n // Note: queued_tools is NOT saved here - it's saved after tool execution in FlowEngine\n await (state.stream as { waitFor: (fn: () => Promise<void>) => Promise<void> }).waitFor(\n async () => {\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n response_body = ?1,\n input_tokens = ?2,\n cached_tokens = ?3,\n output_tokens = ?4,\n reasoning_tokens = ?5,\n total_tokens = ?6,\n cost_input = ?7,\n cost_output = ?8,\n latency_ms = ?9,\n finish_reason = ?10,\n tools_called = ?11,\n cost_total = ?12,\n is_complete = ?13,\n reasoning_content = ?14,\n provider_tools = ?15,\n actual_provider = ?16,\n standard_agents_router_used = ?17\n WHERE id = ?18\n `,\n logData.response_body,\n logData.input_tokens,\n logData.cached_tokens,\n logData.output_tokens,\n logData.reasoning_tokens,\n logData.total_tokens,\n logData.cost_input ?? null,\n logData.cost_output ?? null,\n logData.latency_ms,\n logData.finish_reason,\n logData.tools_called,\n logData.cost_total,\n logData.is_complete ? 1 : 0,\n logData.reasoning_content,\n providerToolsJson,\n actualProvider,\n standardAgentsRouterUsed ? 1 : 0,\n logId\n );\n }\n );\n\n // Broadcast updated log to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: \"log_data\",\n log_id: logData.id,\n data: logData,\n });\n }\n } catch (error) {\n console.error(\"Failed to update log with response (non-fatal):\", error);\n }\n }\n\n /**\n * Extract provider name from model ID (fallback for logging)\n */\n private static getProviderFromModel(modelId: string): string {\n if (modelId.startsWith(\"gpt-\") || modelId.startsWith(\"o1-\")) {\n return \"openai\";\n }\n if (modelId.startsWith(\"claude-\")) {\n return \"anthropic\";\n }\n if (modelId.startsWith(\"gemini-\")) {\n return \"google\";\n }\n return \"unknown\";\n }\n\n /**\n * Sleep utility for backoff\n */\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Update the response_body in a log record to replace base64 image URLs with file paths\n * Called after processResponseImages() stores images and creates the path mapping\n */\n static async updateResponseBodyInLog(\n state: FlowState,\n logId: string,\n response: LLMResponse,\n imagePathMap: Map<string, string>\n ): Promise<void> {\n try {\n // Get the aggregate response (what was originally logged)\n const aggregateResponse = response._aggregate_response as Record<string, unknown> | undefined;\n if (!aggregateResponse) return;\n\n // Transform the response body to replace base64 with paths\n const transformedResponse = this.transformResponseBodyForLog(\n aggregateResponse,\n imagePathMap\n );\n\n // Update the log record\n await state.storage.sql.exec(\n `UPDATE logs SET response_body = ?1 WHERE id = ?2`,\n JSON.stringify(transformedResponse),\n logId\n );\n\n // Broadcast update to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: \"log_data\",\n log_id: logId,\n data: { id: logId, response_body: JSON.stringify(transformedResponse) },\n });\n }\n } catch (error) {\n console.error(\"Failed to update response body in log (non-fatal):\", error);\n }\n }\n\n /**\n * Transform response body to replace image placeholders with file paths\n */\n private static transformResponseBodyForLog(\n responseBody: Record<string, unknown>,\n imagePathMap: Map<string, string>\n ): Record<string, unknown> {\n const choices = responseBody?.choices as Array<{\n message?: { images?: Array<{ type?: string; _id?: string; image_url?: { url: string } }> };\n }>;\n if (!choices?.[0]?.message?.images) {\n return responseBody;\n }\n\n return {\n ...responseBody,\n choices: choices.map((choice) => ({\n ...choice,\n message: {\n ...choice.message,\n images: choice.message?.images?.map(\n (img: { type?: string; _id?: string; image_url?: { url: string } }) => {\n // Look up path by image ID\n const path = img._id ? imagePathMap.get(img._id) : undefined;\n if (path) {\n return {\n type: img.type,\n image_url: { url: path },\n };\n }\n return img;\n }\n ),\n },\n })),\n };\n }\n\n /**\n * Log an error to the logs table (best-effort)\n * Attaches log ID to error object to prevent duplicate logging\n */\n private static async logError(\n state: FlowState,\n error: Error | unknown,\n errorType: string,\n modelId: string,\n startTime: number,\n existingLogId?: string\n ): Promise<string | undefined> {\n try {\n const rawErrorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Provider SDKs (e.g. Google) often pack the API response body as a\n // JSON string inside Error.message. Detect that and prefer the inner\n // human message for display, while keeping the parsed object available\n // as structured metadata so we don't re-encode it later.\n let errorMessage = rawErrorMessage;\n let parsedProviderBody: unknown = null;\n const trimmedRaw = rawErrorMessage.trim();\n if (trimmedRaw.startsWith(\"{\") || trimmedRaw.startsWith(\"[\")) {\n try {\n const parsed: unknown = JSON.parse(trimmedRaw);\n if (parsed && typeof parsed === \"object\") {\n parsedProviderBody = parsed;\n const obj = parsed as Record<string, unknown>;\n const errField = obj.error;\n const inner =\n errField && typeof errField === \"object\"\n ? (errField as Record<string, unknown>).message\n : typeof errField === \"string\"\n ? errField\n : obj.message;\n if (typeof inner === \"string\" && inner.trim().length > 0) {\n errorMessage = inner.trim();\n }\n }\n } catch {\n // Not JSON; leave rawErrorMessage as-is.\n }\n }\n\n // Capture full error object including any metadata\n let errorDetails = \"\";\n const errorObj = error as Record<string, unknown> | null;\n\n // For OpenAI/OpenRouter errors, capture the complete error structure\n if (errorObj && typeof errorObj === \"object\") {\n // Check for common error structures\n const relevantFields = [\n \"error\", // OpenRouter wraps errors here\n \"code\", // Error code\n \"status\", // HTTP status\n \"metadata\", // OpenRouter metadata\n \"type\", // Error type\n \"param\", // Parameter that caused error\n \"user_id\", // User context\n \"response\", // Raw response\n ];\n\n const metadata: Record<string, unknown> = {};\n for (const field of relevantFields) {\n if (field in errorObj && errorObj[field] !== undefined) {\n metadata[field] = errorObj[field];\n }\n }\n\n // Prefer the parsed provider body over re-stringifying the raw\n // error.message (which would double-escape its inner JSON).\n if (parsedProviderBody && typeof parsedProviderBody === \"object\") {\n const body = parsedProviderBody as Record<string, unknown>;\n if (body.error !== undefined) metadata.error = body.error;\n if (body.code !== undefined && metadata.code === undefined) metadata.code = body.code;\n if (body.status !== undefined && metadata.status === undefined) metadata.status = body.status;\n }\n\n if (Object.keys(metadata).length > 0) {\n errorDetails = `\\n\\nError Details:\\n${JSON.stringify(metadata, null, 2)}`;\n }\n }\n\n const fullError = `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}${errorDetails}`;\n\n // Truncate excessively long error messages to prevent storage bloat\n const MAX_ERROR_LINES = 100;\n const errorLines = fullError.split('\\n');\n const truncatedError = errorLines.length > MAX_ERROR_LINES\n ? errorLines.slice(0, MAX_ERROR_LINES).join('\\n') + `\\n\\n[Truncated: ${errorLines.length - MAX_ERROR_LINES} additional lines]`\n : fullError;\n\n // Check if this error has already been logged\n const trackedLogId = existingLogId || (errorObj?._loggedId as string | undefined);\n\n if (trackedLogId) {\n // Update existing log entry - append error to errors array\n await (state.stream as { waitFor: (fn: () => Promise<void>) => Promise<void> }).waitFor(\n async () => {\n // First, get the current errors array\n const result = await state.storage.sql.exec<{ errors: string | null }>(\n `SELECT errors FROM logs WHERE id = ?1`,\n trackedLogId\n );\n const rows = result.toArray();\n const currentErrors = rows[0]?.errors;\n\n // Parse existing errors or create new array\n let errorsArray: Array<{\n message: string;\n type: string;\n timestamp: number;\n }> = [];\n if (currentErrors) {\n try {\n errorsArray = JSON.parse(currentErrors);\n } catch (e) {\n console.error(\"Failed to parse existing errors array:\", e);\n }\n }\n\n // Append new error\n errorsArray.push({\n message: truncatedError,\n type: errorType,\n timestamp: Date.now(),\n });\n\n // Update the log with appended error\n await state.storage.sql.exec(\n `\n UPDATE logs SET\n error = ?1,\n error_type = ?2,\n errors = ?3,\n latency_ms = ?4,\n is_complete = ?5\n WHERE id = ?6\n `,\n truncatedError, // Keep last error in error field for backwards compatibility\n errorType, // Keep last error type\n JSON.stringify(errorsArray), // All errors in array\n Date.now() - startTime,\n 1, // is_complete = true\n trackedLogId\n );\n }\n );\n\n if (state.emitLog) {\n state.emitLog({\n type: \"log_data\",\n log_id: trackedLogId,\n data: {\n id: trackedLogId,\n error: truncatedError,\n error_type: errorType,\n latency_ms: Date.now() - startTime,\n is_complete: true,\n },\n });\n }\n\n // Attach log ID to error object to prevent duplicate logging\n if (errorObj && !errorObj._loggedId) {\n errorObj._loggedId = trackedLogId;\n }\n\n return trackedLogId;\n } else {\n // Create new standalone error log (fallback for errors before request log was created)\n const id = crypto.randomUUID();\n const logData: Partial<LogData> & { id: string } = {\n id,\n message_id: state.rootMessageId || \"00000000-0000-0000-0000-000000000000\",\n provider: this.getProviderFromModel(modelId),\n model: modelId,\n error: truncatedError,\n error_type: errorType,\n latency_ms: Date.now() - startTime,\n is_complete: true,\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n };\n\n await (state.stream as { waitFor: (fn: () => Promise<void>) => Promise<void> }).waitFor(\n async () => {\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, latency_ms, is_complete, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)\n `,\n logData.id,\n logData.message_id,\n logData.provider,\n logData.model,\n logData.error,\n logData.error_type,\n logData.latency_ms,\n 1,\n logData.created_at\n );\n }\n );\n\n if (state.emitLog) {\n state.emitLog({\n type: \"log_data\",\n log_id: logData.id,\n data: logData,\n });\n }\n\n // Attach log ID to error object to prevent duplicate logging\n if (errorObj && !errorObj._loggedId) {\n errorObj._loggedId = id;\n }\n\n return id;\n }\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to log LLM error to database:\", logError);\n }\n\n return undefined;\n }\n\n /**\n * Fire async metadata fetch if provider supports getResponseMetadata.\n * This is non-blocking - the promise is tracked for later await.\n */\n private static fireAsyncMetadataFetch(\n response: LLMResponse,\n state: FlowState,\n logId: string\n ): void {\n const provider = response._provider as LLMProviderInterface | undefined;\n const responseId = response._providerResponseId;\n\n // Only fire if provider supports getResponseMetadata and we have a responseId\n if (!provider?.getResponseMetadata || !responseId) {\n return;\n }\n\n // Build the summary object\n const summary: ResponseSummary = {\n responseId,\n model: response.model,\n finishReason: response.finish_reason as ResponseSummary['finishReason'],\n usage: {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n },\n };\n\n // Fire async - don't await here\n const metadataPromise = provider.getResponseMetadata(summary)\n .then(async (metadata) => {\n if (metadata) {\n await this.updateLogWithMetadata(state, logId, metadata);\n }\n })\n .catch((err) => {\n console.error('Async metadata fetch failed (non-fatal):', err);\n });\n\n // Track for later await in FlowEngine\n state.rootState.pendingMetadataPromises = state.rootState.pendingMetadataPromises || [];\n state.rootState.pendingMetadataPromises.push(metadataPromise);\n }\n\n /**\n * Update log record with async metadata from provider.\n */\n private static async updateLogWithMetadata(\n state: FlowState,\n logId: string,\n metadata: Record<string, unknown>\n ): Promise<void> {\n try {\n // Update specific fields based on what's in metadata\n const updates: string[] = [];\n const values: unknown[] = [];\n let paramIndex = 1;\n\n if (metadata.actual_provider !== undefined) {\n updates.push(`actual_provider = ?${paramIndex++}`);\n values.push(metadata.actual_provider);\n }\n\n if (metadata.generation_cost !== undefined) {\n updates.push(`cost_total = ?${paramIndex++}`);\n values.push(metadata.generation_cost);\n }\n\n if (updates.length === 0) {\n return; // Nothing to update\n }\n\n // Add logId as the last parameter\n values.push(logId);\n\n const sql = `UPDATE logs SET ${updates.join(', ')} WHERE id = ?${paramIndex}`;\n await state.storage.sql.exec(sql, ...values);\n\n // Broadcast update to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: \"log_data\",\n log_id: logId,\n data: {\n id: logId,\n ...(metadata.actual_provider !== undefined && { actual_provider: metadata.actual_provider }),\n ...(metadata.generation_cost !== undefined && { cost_total: metadata.generation_cost }),\n },\n });\n }\n } catch (error) {\n console.error('Failed to update log with metadata (non-fatal):', error);\n }\n }\n}\n","import type { Agent } from \"./types\";\n\nexport type SessionKind = \"stop\" | \"fail\" | \"status\";\nexport type AgentSide = \"a\" | \"b\";\n\nexport interface ResolvedSessionToolBinding {\n toolName: string | null;\n messageProperty: string | null;\n attachmentsProperty: string | null;\n}\n\nfunction parseBindingObject(binding: Record<string, unknown>): ResolvedSessionToolBinding {\n return {\n toolName: typeof binding.name === \"string\" ? binding.name : null,\n messageProperty:\n typeof binding.messageProperty === \"string\" ? binding.messageProperty : null,\n attachmentsProperty:\n typeof binding.attachmentsProperty === \"string\" ? binding.attachmentsProperty : null,\n };\n}\n\nexport function resolveSessionToolBinding(\n binding: unknown\n): ResolvedSessionToolBinding {\n if (typeof binding === \"string\") {\n return {\n toolName: binding,\n messageProperty: null,\n attachmentsProperty: null,\n };\n }\n if (binding && typeof binding === \"object\" && !Array.isArray(binding)) {\n const parsed = parseBindingObject(binding as Record<string, unknown>);\n if (parsed.toolName) {\n return parsed;\n }\n }\n return {\n toolName: null,\n messageProperty: null,\n attachmentsProperty: null,\n };\n}\n\nexport function getResolvedSessionBindingsFromSide(side: unknown): {\n stop: ResolvedSessionToolBinding;\n fail: ResolvedSessionToolBinding;\n status: ResolvedSessionToolBinding;\n} {\n const config = (side ?? {}) as Record<string, unknown>;\n return {\n stop: resolveSessionToolBinding(config.sessionStop),\n fail: resolveSessionToolBinding(config.sessionFail),\n status: resolveSessionToolBinding(config.sessionStatus),\n };\n}\n\nexport function getAgentSessionBinding(\n agent: Agent,\n side: AgentSide,\n kind: SessionKind\n): ResolvedSessionToolBinding {\n if (side === \"a\") {\n if (kind === \"stop\") {\n return {\n toolName: agent.side_a_session_stop_tool,\n messageProperty: agent.side_a_session_stop_message_property,\n attachmentsProperty: agent.side_a_session_stop_attachments_property,\n };\n }\n if (kind === \"fail\") {\n return {\n toolName: agent.side_a_session_fail_tool,\n messageProperty: agent.side_a_session_fail_message_property,\n attachmentsProperty: agent.side_a_session_fail_attachments_property,\n };\n }\n return {\n toolName: agent.side_a_session_status_tool,\n messageProperty: agent.side_a_session_status_message_property,\n attachmentsProperty: agent.side_a_session_status_attachments_property,\n };\n }\n\n if (kind === \"stop\") {\n return {\n toolName: agent.side_b_session_stop_tool,\n messageProperty: agent.side_b_session_stop_message_property,\n attachmentsProperty: agent.side_b_session_stop_attachments_property,\n };\n }\n if (kind === \"fail\") {\n return {\n toolName: agent.side_b_session_fail_tool,\n messageProperty: agent.side_b_session_fail_message_property,\n attachmentsProperty: agent.side_b_session_fail_attachments_property,\n };\n }\n return {\n toolName: agent.side_b_session_status_tool,\n messageProperty: agent.side_b_session_status_message_property,\n attachmentsProperty: agent.side_b_session_status_attachments_property,\n };\n}\n","/**\n * File storage utilities for DurableThread\n *\n * This module provides filesystem-like operations for storing files within\n * a DurableThread's SQLite database. Files are stored in an S3-style flat\n * structure with path-based keys.\n */\n\nimport type { DurableObjectStorage } from \"@cloudflare/workers-types\";\nimport type { FileRecord, FileStats, StorageBackend } from \"../agents/types.js\";\n\n/**\n * Chunk size for large file storage.\n * Files > CHUNK_SIZE are split into chunks stored in file_chunks table.\n * 1.75MB provides 250KB safety margin under 2MB Durable Object row limit.\n */\nexport const CHUNK_SIZE = 1.75 * 1024 * 1024; // 1.75MB\n\n/**\n * Common text-based application MIME types (beyond text/*)\n * These are searchable via FTS5\n */\nconst TEXT_APPLICATION_TYPES = [\n // Data formats\n \"application/json\",\n \"application/ld+json\",\n \"application/json5\",\n \"application/jsonl\",\n \"application/x-ndjson\",\n \"application/xml\",\n \"application/xhtml+xml\",\n \"application/rss+xml\",\n \"application/atom+xml\",\n \"application/soap+xml\",\n \"application/yaml\",\n \"application/x-yaml\",\n \"application/toml\",\n \"application/x-toml\",\n\n // Programming languages\n \"application/javascript\",\n \"application/x-javascript\",\n \"application/ecmascript\",\n \"application/typescript\",\n \"application/x-typescript\",\n \"application/x-python\",\n \"application/x-ruby\",\n \"application/x-perl\",\n \"application/x-php\",\n \"application/x-sh\",\n \"application/x-bash\",\n \"application/x-csh\",\n \"application/x-zsh\",\n \"application/x-powershell\",\n \"application/x-lua\",\n \"application/x-tcl\",\n\n // Query/config languages\n \"application/sql\",\n \"application/x-sql\",\n \"application/graphql\",\n \"application/x-graphql\",\n \"application/sparql-query\",\n \"application/sparql-results+json\",\n \"application/sparql-results+xml\",\n\n // Markup/templates\n \"application/x-httpd-php\",\n \"application/x-latex\",\n \"application/x-tex\",\n \"application/rtf\",\n \"application/xslt+xml\",\n\n // Web\n \"application/x-www-form-urlencoded\",\n \"application/manifest+json\",\n \"application/webmanifest+json\",\n \"application/x-web-app-manifest+json\",\n\n // Config files\n \"application/x-ini\",\n \"application/x-properties\",\n \"application/plist\",\n \"application/x-plist\",\n];\n\n/**\n * Check if a MIME type should be stored as text\n */\nexport function isTextMimeType(mimeType: string): boolean {\n // All text/* types are text\n if (mimeType.startsWith(\"text/\")) return true;\n\n // Check application types (with optional charset suffix)\n return TEXT_APPLICATION_TYPES.some(\n (type) => mimeType === type || mimeType.startsWith(type + \";\")\n );\n}\n\n/**\n * Detect storage backend from location URL\n */\nexport function detectStorageBackend(location: string): StorageBackend {\n if (location.startsWith(\"s3://\")) return \"s3\";\n if (location.startsWith(\"r2://\")) return \"r2\";\n if (location.startsWith(\"http://\") || location.startsWith(\"https://\"))\n return \"url\";\n return \"local\";\n}\n\n/**\n * Extract basename from path\n */\nexport function basename(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n return parts[parts.length - 1] || \"\";\n}\n\n/**\n * Normalize path to ensure it starts with / and doesn't end with /\n */\nexport function normalizePath(path: string): string {\n let normalized = path.replace(/\\/+/g, \"/\"); // Replace multiple slashes with single\n if (!normalized.startsWith(\"/\")) normalized = \"/\" + normalized;\n if (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\n/**\n * Get parent directory path\n */\nexport function dirname(path: string): string {\n const normalized = normalizePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n if (lastSlash <= 0) return \"/\";\n return normalized.slice(0, lastSlash);\n}\n\n/**\n * Convert database row to FileRecord\n */\nexport function rowToFileRecord(row: any): FileRecord {\n return {\n path: row.path,\n name: row.name,\n mimeType: row.mime_type,\n storage: row.storage as StorageBackend,\n location: row.location,\n size: row.size,\n metadata: row.metadata ? JSON.parse(row.metadata) : null,\n isDirectory: row.is_directory === 1,\n createdAt: row.created_at,\n width: row.width ?? null,\n height: row.height ?? null,\n isChunked: row.is_chunked === 1,\n chunkCount: row.chunk_count ?? undefined,\n };\n}\n\n/**\n * File storage operations for DurableThread\n */\nexport class FileStorage {\n constructor(private sql: DurableObjectStorage[\"sql\"]) {}\n\n /**\n * Write a file to storage.\n * Files > CHUNK_SIZE are automatically chunked into file_chunks table.\n */\n async writeFile(\n path: string,\n data: ArrayBuffer | string,\n mimeType: string,\n options?: {\n metadata?: Record<string, unknown>;\n thumbnail?: ArrayBuffer;\n width?: number;\n height?: number;\n }\n ): Promise<FileRecord> {\n const normalizedPath = normalizePath(path);\n const name = basename(normalizedPath);\n const isText = isTextMimeType(mimeType);\n const now = Date.now();\n\n // Convert data to appropriate format\n let content: string | null = null;\n let blobData: Uint8Array | null = null;\n let size: number;\n\n if (isText) {\n content =\n typeof data === \"string\"\n ? data\n : new TextDecoder().decode(data as ArrayBuffer);\n size = new TextEncoder().encode(content).length;\n } else {\n blobData = typeof data === \"string\"\n ? new TextEncoder().encode(data)\n : new Uint8Array(data as ArrayBuffer);\n size = blobData.byteLength;\n }\n\n const metadataJson = options?.metadata\n ? JSON.stringify(options.metadata)\n : null;\n\n // Check if we need to chunk this file\n const needsChunking = !isText && blobData && size > CHUNK_SIZE;\n\n if (needsChunking) {\n // Large file: store chunks in file_chunks table\n return this.writeFileChunked(\n normalizedPath,\n name,\n blobData!,\n mimeType,\n size,\n now,\n metadataJson,\n options\n );\n }\n\n // Small file or text: store inline as before\n // Delete any existing chunks if overwriting a chunked file\n await this.sql.exec(`DELETE FROM file_chunks WHERE file_path = ?`, normalizedPath);\n\n // Use INSERT OR REPLACE for upsert behavior\n await this.sql.exec(\n `INSERT OR REPLACE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at, width, height, is_chunked, chunk_count)\n VALUES (?, ?, ?, 'local', NULL, ?, ?, ?, ?, ?, 0, ?, ?, ?, 0, NULL)`,\n normalizedPath,\n name,\n mimeType,\n blobData,\n content,\n size,\n metadataJson,\n options?.thumbnail || null,\n now,\n options?.width ?? null,\n options?.height ?? null\n );\n\n // Update file stats\n await this.updateStats();\n\n return {\n path: normalizedPath,\n name,\n mimeType,\n storage: \"local\",\n location: null,\n size,\n metadata: options?.metadata || null,\n isDirectory: false,\n createdAt: now,\n width: options?.width ?? null,\n height: options?.height ?? null,\n isChunked: false,\n };\n }\n\n /**\n * Write a large file in chunks.\n * Called internally by writeFile when data > CHUNK_SIZE.\n */\n private async writeFileChunked(\n normalizedPath: string,\n name: string,\n data: Uint8Array,\n mimeType: string,\n size: number,\n now: number,\n metadataJson: string | null,\n options?: {\n metadata?: Record<string, unknown>;\n thumbnail?: ArrayBuffer;\n width?: number;\n height?: number;\n }\n ): Promise<FileRecord> {\n // Delete any existing file data and chunks\n await this.sql.exec(`DELETE FROM file_chunks WHERE file_path = ?`, normalizedPath);\n\n // Calculate number of chunks\n const chunkCount = Math.ceil(size / CHUNK_SIZE);\n\n // Create file record (no inline data, is_chunked=1)\n await this.sql.exec(\n `INSERT OR REPLACE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at, width, height, is_chunked, chunk_count)\n VALUES (?, ?, ?, 'local', NULL, NULL, NULL, ?, ?, ?, 0, ?, ?, ?, 1, ?)`,\n normalizedPath,\n name,\n mimeType,\n size,\n metadataJson,\n options?.thumbnail || null,\n now,\n options?.width ?? null,\n options?.height ?? null,\n chunkCount\n );\n\n // Write chunks\n for (let i = 0; i < chunkCount; i++) {\n const start = i * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, size);\n const chunk = data.slice(start, end);\n\n await this.sql.exec(\n `INSERT INTO file_chunks (file_path, chunk_index, data) VALUES (?, ?, ?)`,\n normalizedPath,\n i,\n chunk\n );\n }\n\n // Update file stats\n await this.updateStats();\n\n return {\n path: normalizedPath,\n name,\n mimeType,\n storage: \"local\",\n location: null,\n size,\n metadata: options?.metadata || null,\n isDirectory: false,\n createdAt: now,\n width: options?.width ?? null,\n height: options?.height ?? null,\n isChunked: true,\n chunkCount,\n };\n }\n\n /**\n * Link to an external file (URL, S3, R2)\n */\n async linkFile(\n path: string,\n location: string,\n options?: {\n mimeType?: string;\n size?: number;\n metadata?: Record<string, unknown>;\n }\n ): Promise<FileRecord> {\n const normalizedPath = normalizePath(path);\n const name = basename(normalizedPath);\n const storage = detectStorageBackend(location);\n const now = Date.now();\n\n // Try to infer MIME type from extension if not provided\n const mimeType = options?.mimeType || inferMimeType(name);\n\n const metadataJson = options?.metadata\n ? JSON.stringify(options.metadata)\n : null;\n\n await this.sql.exec(\n `INSERT OR REPLACE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at)\n VALUES (?, ?, ?, ?, ?, NULL, NULL, ?, ?, NULL, 0, ?)`,\n normalizedPath,\n name,\n mimeType,\n storage,\n location,\n options?.size || 0,\n metadataJson,\n now\n );\n\n // Update file stats\n await this.updateStats();\n\n return {\n path: normalizedPath,\n name,\n mimeType,\n storage,\n location,\n size: options?.size || 0,\n metadata: options?.metadata || null,\n isDirectory: false,\n createdAt: now,\n };\n }\n\n /**\n * Read file data from storage.\n * Chunked files are automatically reassembled.\n * Returns null if file doesn't exist or is external.\n *\n * WARNING: For large chunked files, this loads the entire file into memory.\n * Use streamFile() for memory-efficient access to large files.\n */\n async readFile(path: string): Promise<ArrayBuffer | null> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{\n data: ArrayBuffer | null;\n content: string | null;\n storage: string;\n is_chunked: number;\n chunk_count: number | null;\n }>(\n `SELECT data, content, storage, is_chunked, chunk_count FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n\n // External files - return null (caller should fetch from location)\n if (row.storage !== \"local\") return null;\n\n // Chunked file - reassemble from chunks\n if (row.is_chunked === 1 && row.chunk_count) {\n return this.readFileChunked(normalizedPath, row.chunk_count);\n }\n\n // Text file stored in content column\n if (row.content !== null) {\n const encoded = new TextEncoder().encode(row.content);\n return encoded.buffer.slice(encoded.byteOffset, encoded.byteOffset + encoded.byteLength) as ArrayBuffer;\n }\n\n // Binary file stored in data column\n return row.data;\n }\n\n /**\n * Read a chunked file by reassembling all chunks.\n * WARNING: Loads entire file into memory. Use streamFile() for large files.\n */\n private async readFileChunked(\n normalizedPath: string,\n chunkCount: number\n ): Promise<ArrayBuffer> {\n const chunks: Uint8Array[] = [];\n let totalSize = 0;\n\n // Read chunks in order\n for (let i = 0; i < chunkCount; i++) {\n const cursor = await this.sql.exec<{ data: ArrayBuffer }>(\n `SELECT data FROM file_chunks WHERE file_path = ? AND chunk_index = ?`,\n normalizedPath,\n i\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n throw new Error(`Missing chunk ${i} for file ${normalizedPath}`);\n }\n\n const chunk = new Uint8Array(rows[0].data);\n chunks.push(chunk);\n totalSize += chunk.byteLength;\n }\n\n // Combine chunks into single buffer\n const result = new Uint8Array(totalSize);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return result.buffer as ArrayBuffer;\n }\n\n /**\n * Stream file data chunk by chunk.\n * Memory-efficient way to read large chunked files.\n * Yields one chunk at a time for streaming HTTP responses.\n */\n async *streamFile(path: string): AsyncGenerator<Uint8Array, void, undefined> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{\n data: ArrayBuffer | null;\n content: string | null;\n storage: string;\n is_chunked: number;\n chunk_count: number | null;\n }>(\n `SELECT data, content, storage, is_chunked, chunk_count FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return;\n\n const row = rows[0];\n\n // External files - can't stream\n if (row.storage !== \"local\") return;\n\n // Chunked file - yield chunks one at a time\n if (row.is_chunked === 1 && row.chunk_count) {\n for (let i = 0; i < row.chunk_count; i++) {\n const chunkCursor = await this.sql.exec<{ data: ArrayBuffer }>(\n `SELECT data FROM file_chunks WHERE file_path = ? AND chunk_index = ?`,\n normalizedPath,\n i\n );\n\n const chunkRows = chunkCursor.toArray();\n if (chunkRows.length > 0) {\n yield new Uint8Array(chunkRows[0].data);\n }\n }\n return;\n }\n\n // Text file - yield as single chunk\n if (row.content !== null) {\n yield new TextEncoder().encode(row.content);\n return;\n }\n\n // Binary file - yield as single chunk\n if (row.data !== null) {\n yield new Uint8Array(row.data);\n }\n }\n\n /**\n * Read text file content\n */\n async readTextFile(path: string): Promise<string | null> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{\n content: string | null;\n data: ArrayBuffer | null;\n storage: string;\n }>(\n `SELECT content, data, storage FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n\n // External files - return null\n if (row.storage !== \"local\") return null;\n\n // Text content\n if (row.content !== null) return row.content;\n\n // Try to decode binary as text\n if (row.data !== null) {\n return new TextDecoder().decode(row.data as ArrayBuffer);\n }\n\n return null;\n }\n\n /**\n * Get file metadata (stat)\n */\n async stat(path: string): Promise<FileRecord | null> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<any>(\n `SELECT path, name, mime_type, storage, location, size, metadata, is_directory, created_at, width, height, is_chunked, chunk_count\n FROM files WHERE path = ?`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n return rowToFileRecord(rows[0]);\n }\n\n /**\n * Check if file or directory exists\n */\n async exists(path: string): Promise<boolean> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM files WHERE path = ?`,\n normalizedPath\n );\n\n return cursor.one().count > 0;\n }\n\n /**\n * Delete a file\n */\n async unlink(path: string): Promise<void> {\n const normalizedPath = normalizePath(path);\n\n await this.sql.exec(\n `DELETE FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n await this.updateStats();\n }\n\n /**\n * Create a directory marker\n */\n async mkdir(path: string): Promise<FileRecord> {\n const normalizedPath = normalizePath(path);\n const name = basename(normalizedPath);\n const now = Date.now();\n\n await this.sql.exec(\n `INSERT OR IGNORE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at)\n VALUES (?, ?, 'inode/directory', 'local', NULL, NULL, NULL, 0, NULL, NULL, 1, ?)`,\n normalizedPath,\n name,\n now\n );\n\n return {\n path: normalizedPath,\n name,\n mimeType: \"inode/directory\",\n storage: \"local\",\n location: null,\n size: 0,\n metadata: null,\n isDirectory: true,\n createdAt: now,\n };\n }\n\n /**\n * List directory contents\n */\n async readdir(path: string): Promise<FileRecord[]> {\n const normalizedPath = normalizePath(path);\n const prefix = normalizedPath === \"/\" ? \"/\" : normalizedPath + \"/\";\n\n // Find immediate children (not nested subdirectories)\n const cursor = await this.sql.exec<any>(\n `SELECT path, name, mime_type, storage, location, size, metadata, is_directory, created_at\n FROM files\n WHERE path LIKE ? || '%'\n AND path != ?\n AND SUBSTR(path, LENGTH(?) + 1) NOT LIKE '%/%'\n ORDER BY is_directory DESC, name ASC`,\n prefix,\n normalizedPath,\n prefix\n );\n\n return cursor.toArray().map(rowToFileRecord);\n }\n\n /**\n * Remove empty directory\n */\n async rmdir(path: string): Promise<void> {\n const normalizedPath = normalizePath(path);\n const prefix = normalizedPath + \"/\";\n\n // Check if directory has children\n const cursor = await this.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM files WHERE path LIKE ? || '%'`,\n prefix\n );\n\n if (cursor.one().count > 0) {\n throw new Error(\"Directory not empty\");\n }\n\n await this.sql.exec(\n `DELETE FROM files WHERE path = ? AND is_directory = 1`,\n normalizedPath\n );\n }\n\n /**\n * Get storage statistics\n */\n async getFileStats(): Promise<FileStats> {\n const cursor = await this.sql.exec<{\n total_size: number;\n file_count: number;\n }>(`SELECT total_size, file_count FROM file_stats WHERE id = 1`);\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return { totalSize: 0, fileCount: 0 };\n }\n\n return {\n totalSize: rows[0].total_size,\n fileCount: rows[0].file_count,\n };\n }\n\n /**\n * Update file statistics (call after writes/deletes)\n */\n private async updateStats(): Promise<void> {\n await this.sql.exec(`\n UPDATE file_stats SET\n total_size = (SELECT COALESCE(SUM(size), 0) FROM files WHERE is_directory = 0),\n file_count = (SELECT COUNT(*) FROM files WHERE is_directory = 0)\n WHERE id = 1\n `);\n }\n\n /**\n * Get thumbnail for an image\n */\n async getThumbnail(path: string): Promise<ArrayBuffer | null> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{ thumbnail: ArrayBuffer | null }>(\n `SELECT thumbnail FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n return rows[0].thumbnail;\n }\n\n /**\n * Search file contents using FTS5\n */\n async grep(\n pattern: string,\n options?: {\n path?: string;\n limit?: number;\n }\n ): Promise<Array<{ path: string; name: string; snippet: string }>> {\n const limit = options?.limit || 100;\n\n let query = `\n SELECT files.path, files.name, snippet(files_fts, 2, '<mark>', '</mark>', '...', 32) as snippet\n FROM files_fts\n JOIN files ON files.rowid = files_fts.rowid\n WHERE files_fts MATCH ?\n `;\n\n const params: any[] = [pattern];\n\n if (options?.path) {\n query += ` AND files.path LIKE ? || '%'`;\n params.push(normalizePath(options.path));\n }\n\n query += ` LIMIT ?`;\n params.push(limit);\n\n const cursor = await this.sql.exec<{\n path: string;\n name: string;\n snippet: string;\n }>(query, ...params);\n\n return cursor.toArray();\n }\n\n /**\n * Find files by path pattern (glob-like)\n */\n async find(\n pattern: string,\n options?: {\n type?: \"file\" | \"directory\" | \"all\";\n limit?: number;\n }\n ): Promise<FileRecord[]> {\n const limit = options?.limit || 100;\n const type = options?.type || \"all\";\n\n // Convert glob pattern to SQL LIKE pattern\n let sqlPattern = pattern\n .replace(/\\*\\*/g, \"%\")\n .replace(/\\*/g, \"%\")\n .replace(/\\?/g, \"_\");\n\n // If pattern doesn't start with /, prefix with %\n if (!sqlPattern.startsWith(\"/\")) {\n sqlPattern = \"%\" + sqlPattern;\n }\n\n let typeClause = \"\";\n if (type === \"file\") typeClause = \" AND is_directory = 0\";\n if (type === \"directory\") typeClause = \" AND is_directory = 1\";\n\n const cursor = await this.sql.exec<any>(\n `SELECT path, name, mime_type, storage, location, size, metadata, is_directory, created_at\n FROM files\n WHERE path LIKE ?${typeClause}\n ORDER BY path\n LIMIT ?`,\n sqlPattern,\n limit\n );\n\n return cursor.toArray().map(rowToFileRecord);\n }\n}\n\n/**\n * Infer MIME type from filename extension\n */\nfunction inferMimeType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n\n const mimeTypes: Record<string, string> = {\n // Text\n txt: \"text/plain\",\n md: \"text/markdown\",\n html: \"text/html\",\n css: \"text/css\",\n csv: \"text/csv\",\n\n // Code\n js: \"application/javascript\",\n ts: \"application/typescript\",\n json: \"application/json\",\n xml: \"application/xml\",\n yaml: \"application/yaml\",\n yml: \"application/yaml\",\n\n // Images\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n ico: \"image/x-icon\",\n\n // Documents\n pdf: \"application/pdf\",\n\n // Archives\n zip: \"application/zip\",\n tar: \"application/x-tar\",\n gz: \"application/gzip\",\n };\n\n return mimeTypes[ext || \"\"] || \"application/octet-stream\";\n}\n","import { DurableThread } from \"../durable-objects/DurableThread\";\nimport type {\n FlowState,\n ToolCall,\n ToolResult,\n ToolType,\n Message,\n AttachmentRef,\n ToolAttachment,\n NativeToolModule,\n SubpromptConfig,\n SubagentToolConfig,\n} from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\nimport { ThreadStateImpl } from \"./ThreadStateImpl.js\";\nimport { getAgentSessionBinding } from \"./sessionTools\";\n\nconst SUBAGENT_CREATE_TOOL = \"subagent_create\";\nconst SUBAGENT_MESSAGE_TOOL = \"subagent_message\";\nconst LEGACY_SEND_TO_AGENT_TOOL = \"send_to_agent\";\nconst INTERNAL_SCOPED_ENV_ARGUMENT = \"__scoped_env\";\nconst INTERNAL_SCOPED_ENV_CONTEXT_KEY = \"__immediate_scoped_env_by_call_id\";\n\ntype InternalChildRegistryEntry = {\n reference: string;\n name: string;\n title?: string;\n description: string;\n resumable?: boolean;\n blocking?: boolean;\n threadName?: string;\n spawnGroupId?: string;\n createdAt?: number;\n status: string;\n};\n\ntype BlockingSubagentResult = {\n status: \"success\" | \"error\";\n result?: string;\n error?: string;\n attachments?: unknown[];\n terminal?: boolean;\n};\n\n/**\n * Get the package ID from the namespace context.\n * Returns undefined if in global context.\n */\nfunction getPackageId(state: FlowState): string | undefined {\n return state.namespaceContext.type === 'packed'\n ? state.namespaceContext.packageId\n : undefined;\n}\n\n/**\n * Executes tools, prompts, and agents sequentially\n * Inspired by bod.coach runSequence pattern\n */\nexport class ToolExecutor {\n /**\n * Execute a sequence of tool calls sequentially\n * No parallel execution - tools run one after another\n */\n static async executeSequence(\n state: FlowState,\n toolCalls: ToolCall[]\n ): Promise<void> {\n // Add all tool calls to the queue\n state.sequence.queue.push(...toolCalls);\n state.sequence.isHandling = true;\n\n while (state.sequence.queue.length > 0) {\n // Check if execution should be stopped before processing each tool call\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n // Clear the queue and exit\n state.sequence.queue = [];\n state.sequence.isHandling = false;\n throw new Error(\"aborted\");\n }\n\n const call = state.sequence.queue.shift()!\n // Generate tool message ID upfront so sub-prompts can use it as parent_id\n const toolMessageId = crypto.randomUUID();\n\n try {\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_started\",\n tool: call.function.name,\n timestamp: Date.now(),\n });\n\n // Validate that this tool is in the allowed tools list\n const validationError = this.validateToolCall(call, state);\n if (validationError) {\n // Tool not allowed - treat as error and continue\n const result: ToolResult = {\n status: \"error\",\n error: validationError,\n };\n\n await this.storeToolResult(call, result, state, toolMessageId);\n\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: \"error\",\n timestamp: Date.now(),\n });\n\n continue; // Skip to next tool\n }\n\n // Execute the tool (pass toolMessageId for sub-prompts to use as parent_id)\n const result = await this.executeToolCall(call, state, toolMessageId);\n\n // If tool returned an error, log it to database\n if (result.status === \"error\") {\n const error = new Error(result.error || \"Tool execution failed\");\n // Preserve the stack trace from the result if available\n if (result.stack) {\n error.stack = result.stack;\n }\n await this.logError(state, error, call.function.name);\n }\n\n // Run the appropriate hook based on result status\n // Import FlowEngine dynamically to access hook methods\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n\n const hookResult = result.status === \"success\"\n ? await FlowEngine.runAfterToolCallSuccessHook(state, call, result)\n : await FlowEngine.runAfterToolCallFailureHook(state, call, result);\n\n // If hook returned null, remove the tool call from history and database\n if (hookResult === null) {\n await this.removeToolCallFromHistory(call, state);\n continue; // Skip to next tool without storing anything\n }\n\n // If this tool is configured as a status tool for a subagent side,\n // propagate the returned text to the parent registry.\n await this.forwardStatusUpdateIfNeeded(\n state,\n call.function.name,\n hookResult,\n this.parseToolArguments(call.function.arguments)\n );\n\n // Store tool result as a message (including handoff confirmations)\n // Use the potentially modified result from the hook\n await this.storeToolResult(call, hookResult, state, toolMessageId);\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: hookResult.status,\n timestamp: Date.now(),\n });\n } catch (error) {\n console.error(`Error executing tool ${call.function.name}:`, error);\n\n // Log error to database\n await this.logError(state, error, call.function.name);\n\n // Create error result for hook processing\n const errorResult: ToolResult = {\n status: \"error\",\n error: (error as Error).message,\n };\n\n // Run after_tool_call_failure hook\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n const hookResult = await FlowEngine.runAfterToolCallFailureHook(state, call, errorResult);\n\n // If hook returned null, remove the tool call from history and database\n if (hookResult === null) {\n await this.removeToolCallFromHistory(call, state);\n continue; // Skip to next tool without storing anything\n }\n\n // Store error as tool result (use potentially modified result from hook)\n await this.storeToolResult(call, hookResult, state, toolMessageId);\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: \"error\",\n timestamp: Date.now(),\n });\n }\n }\n\n state.sequence.isHandling = false;\n\n // Apply any pending force turn that was deferred during tool execution\n // This allows queueTool + forceTurn to work together properly\n if (state.pendingForceTurn) {\n state.forcedNextSide = state.pendingForceTurn;\n state.pendingForceTurn = undefined;\n }\n }\n\n /**\n * Execute a single tool call\n */\n private static async executeToolCall(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n const toolType = await this.identifyToolType(call, state);\n\n switch (toolType) {\n case \"native\":\n return await this.executeNativeTool(call, state);\n case \"prompt\":\n return await this.executePromptTool(call, state, toolMessageId);\n case \"agent\":\n return await this.executeAgentTool(call, state);\n case \"provider\":\n // Provider-executed tools (e.g., OpenAI's image_generation, web_search)\n // These are executed by the LLM provider, not locally.\n // The results come back in the LLM response, not via tool execution.\n // If we get here, the provider didn't handle the tool correctly.\n console.warn(`[ToolExecutor] Provider tool \"${call.function.name}\" was called but should have been handled by the provider`);\n return {\n status: \"error\",\n error: `Tool \"${call.function.name}\" is a provider-executed tool and should be handled by the LLM provider, not executed locally. This may indicate a provider configuration issue.`,\n };\n default:\n throw new Error(`Unknown tool type for: ${call.function.name}`);\n }\n }\n\n /**\n * Validate that a tool call is allowed for the current prompt\n * Returns error message if invalid, null if valid\n */\n private static validateToolCall(\n call: ToolCall,\n state: FlowState\n ): string | null {\n // If no allowed tools list is set, allow all tools (backward compatibility)\n if (!state.allowedTools || call.forceAllow) {\n return null;\n }\n\n // Check if tool is in the allowed list\n const isAllowed = state.allowedTools.some(\n (tool) => tool.function.name === call.function.name\n );\n\n if (!isAllowed) {\n const subagentCreateTool = state.allowedTools.find(\n (tool) => tool.function.name === SUBAGENT_CREATE_TOOL\n );\n const parameters = subagentCreateTool?.function.parameters;\n const properties =\n parameters && typeof parameters === \"object\" && \"properties\" in parameters\n ? (parameters as Record<string, unknown>).properties\n : undefined;\n const agentProperty =\n properties && typeof properties === \"object\" && \"agent\" in properties\n ? (properties as Record<string, unknown>).agent\n : undefined;\n const availableSubagents =\n agentProperty &&\n typeof agentProperty === \"object\" &&\n \"enum\" in agentProperty\n ? (agentProperty as Record<string, unknown>).enum\n : undefined;\n if (\n Array.isArray(availableSubagents) &&\n availableSubagents.includes(call.function.name)\n ) {\n return `Tool \"${call.function.name}\" is not directly callable. Use ${SUBAGENT_CREATE_TOOL} with agent=\"${call.function.name}\" to create a subagent, or ${SUBAGENT_MESSAGE_TOOL} to message an existing reference.`;\n }\n\n return `Tool \"${call.function.name}\" is not available for this prompt. You can only use tools that were explicitly configured for this prompt.`;\n }\n\n return null;\n }\n\n /**\n * Identify the type of tool (native, prompt, agent, or provider)\n */\n private static async identifyToolType(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolType> {\n const toolName = call.function.name;\n\n if (\n toolName === SUBAGENT_CREATE_TOOL ||\n toolName === SUBAGENT_MESSAGE_TOOL ||\n toolName === LEGACY_SEND_TO_AGENT_TOOL\n ) {\n return \"agent\";\n }\n\n // Check if it's a provider-executed tool (e.g., OpenAI's image_generation, web_search)\n // These should not be executed locally - they're handled by the LLM provider\n if (state.allowedTools) {\n const providerTool = state.allowedTools.find(\n (tool) => tool.function.name === toolName && (tool as any).executionMode === 'provider'\n );\n if (providerTool) {\n return \"provider\";\n }\n }\n\n // Check if this is a packed context - tools should be looked up with package qualification\n const packageId = getPackageId(state);\n\n // Check if it's a native tool (global or packed)\n if (packageId) {\n // Try packed tool lookup first\n try {\n const qualifiedName = toolName.includes('/') ? toolName : `${packageId}/${toolName}`;\n const toolDef = await state.thread.instance.loadTool(qualifiedName);\n if (toolDef) {\n return \"native\";\n }\n } catch {\n // Fall through to global check\n }\n }\n\n // Check global tools\n const tools = state.thread.instance.tools();\n if (toolName in tools) {\n return \"native\";\n }\n\n // Check if it's a prompt (sub-prompt used as tool)\n // For packed context, try qualified name first\n if (packageId) {\n try {\n const qualifiedName = toolName.includes('/') ? toolName : `${packageId}/${toolName}`;\n const promptDef = await state.thread.instance.loadPrompt(qualifiedName);\n if (promptDef) {\n return \"prompt\";\n }\n } catch {\n // Not a packed prompt, continue checking\n }\n }\n\n // Try global prompt\n try {\n const promptDef = await state.thread.instance.loadPrompt(toolName);\n if (promptDef) {\n return \"prompt\";\n }\n } catch {\n // Prompt not found, continue checking\n }\n\n // Check if it's an agent (exposed or in tools array)\n // Helper to check if agent name is in prompt's tools array\n const isInToolsArray = (agentName: string): boolean => {\n const tools = state.prompt._tools || [];\n return tools.some(t => typeof t === 'string' ? t === agentName : t.name === agentName);\n };\n\n const isCallableAgent = (agentDef: any, agentNameForToolsCheck: string): boolean => {\n if (call.forceAllow) {\n // queueTool() and immediate tool execution set forceAllow=true to bypass\n // stale allow-lists. Keep ai_human behavior, and also allow dual_ai\n // agents when they are explicitly configured on the active prompt.\n return agentDef.type === 'ai_human' || isInToolsArray(agentNameForToolsCheck);\n }\n\n return !!(agentDef.exposeAsTool || isInToolsArray(agentNameForToolsCheck));\n };\n\n // For packed context, try qualified agent name first\n if (packageId) {\n try {\n const qualifiedName = toolName.includes('/') ? toolName : `${packageId}/${toolName}`;\n const agentDef = await state.thread.instance.loadAgent(qualifiedName);\n if (agentDef) {\n if (\n isCallableAgent(agentDef, toolName) ||\n isCallableAgent(agentDef, qualifiedName)\n ) {\n return \"agent\";\n }\n }\n } catch {\n // Not a packed agent, continue checking\n }\n }\n\n // Try global agent\n try {\n const agentDef = await state.thread.instance.loadAgent(toolName);\n // Check by title as well (agents are called by their title in tool calls)\n if (agentDef) {\n if (isCallableAgent(agentDef, toolName)) {\n return \"agent\";\n }\n }\n } catch {\n // Agent not found by name, try by title\n }\n\n // Try finding agent by title (agents are often called by title in tool calls)\n const agentNames = state.thread.instance.getAgentNames();\n for (const name of agentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(name);\n if (agentDef.title === toolName) {\n if (\n isCallableAgent(agentDef, name) ||\n isCallableAgent(agentDef, toolName)\n ) {\n return \"agent\";\n }\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n /**\n * Execute a native tool from server/tools/\n */\n private static async executeNativeTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n try {\n // Check if this is a packed context\n const packageId = getPackageId(state);\n let toolModule: NativeToolModule;\n\n if (packageId) {\n // Try packed tool lookup first\n const qualifiedName = call.function.name.includes('/') ? call.function.name : `${packageId}/${call.function.name}`;\n try {\n toolModule = await state.thread.instance.loadTool(qualifiedName);\n console.log(`[ToolExecutor] Executing packed tool: ${qualifiedName}`);\n } catch {\n // Fall back to global tools\n const tools = state.thread.instance.tools();\n const toolLoader = tools[call.function.name];\n if (!toolLoader) {\n throw new Error(`Native tool not found: ${call.function.name} (tried packed: ${qualifiedName})`);\n }\n toolModule = await toolLoader();\n }\n } else {\n // Get tools from thread instance (user's extended Thread class)\n const tools = state.thread.instance.tools();\n\n // Load the tool\n const toolLoader = tools[call.function.name];\n if (!toolLoader) {\n throw new Error(`Native tool not found: ${call.function.name}`);\n }\n\n toolModule = await toolLoader();\n }\n const { description, args: argsSchema, execute: toolFn } = toolModule;\n\n // Get uses list from tool module for namespace validation\n const toolUses = (toolModule as any).uses as string[] | undefined;\n\n // Parse arguments\n const args: Record<string, any> = JSON.parse(call.function.arguments);\n\n // Validate arguments against tool schema\n if (argsSchema) {\n const validation = argsSchema.safeParse(args);\n if (!validation.success) {\n const errorMessage = validation.error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.map(String).join(\".\") : \"root\";\n return `[${path}] ${issue.message}`;\n })\n .join(\"; \");\n\n return {\n status: \"error\",\n error: `Tool argument validation failed: ${errorMessage}`,\n };\n }\n }\n\n // Update state.active to track current tool execution\n state.active = {\n tool: call.function.name,\n args,\n retries: 0,\n reasons: [],\n };\n\n // Create ThreadState wrapper for the tool\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n // Set the current tool's uses list for queueTool/invokeTool validation\n // This enables namespace isolation: packed tools can only call items in their uses list\n const previousToolUses = state.currentToolUses;\n state.currentToolUses = toolUses;\n\n // Execute the tool with ThreadState\n // Type narrowing: if argsSchema exists, call with args; otherwise call without\n let result: ToolResult;\n try {\n result = argsSchema\n ? await (toolFn as (state: any, args: Record<string, unknown>) => Promise<ToolResult>)(threadState, args)\n : await (toolFn as (state: any) => Promise<ToolResult>)(threadState);\n } finally {\n // Restore the previous tool's uses list (important for nested execution)\n state.currentToolUses = previousToolUses;\n }\n\n // Normalize tool result into internal ToolResult shape\n const status = result.status === \"error\" ? \"error\" : \"success\";\n\n let textResult: string | undefined;\n let errorText: string | undefined;\n\n // Prefer MCP-style content array if present\n const content = (result as any).content;\n if (Array.isArray(content)) {\n const textParts = content\n .filter(\n (part: any) =>\n part &&\n part.type === \"text\" &&\n typeof part.text === \"string\"\n )\n .map((part: any) => part.text as string);\n\n if (textParts.length > 0) {\n textResult = textParts.join(\"\\n\");\n }\n }\n\n // Fallback to legacy `result` field\n if (!textResult && (result as any).result !== undefined) {\n const raw = (result as any).result;\n textResult =\n typeof raw === \"string\" ? raw : JSON.stringify(raw, null, 2);\n }\n\n // Normalize error text\n if (typeof (result as any).error === \"string\") {\n errorText = (result as any).error;\n }\n\n if (status === \"error\" && !errorText) {\n // If tool marked as error but didn't provide an explicit error string,\n // fall back to the textual result (if any).\n errorText = textResult;\n }\n\n return {\n status,\n result: textResult,\n error: status === \"error\" ? errorText : undefined,\n attachments: result.attachments,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n return {\n status: \"error\",\n error: errorMessage,\n stack: stackTrace,\n };\n }\n }\n\n /**\n * Execute a prompt tool (creates a sub-flow) with retry logic\n * This is essentially chaining another prompt\n * Creates an in-memory sub-flow that executes the prompt and returns the result\n * Note: LLM-level retries with model fallbacks are handled inside FlowEngine/LLMRequest\n */\n private static async executePromptTool(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n // Sub-prompts execute as one-shot calls - no retry logic\n // Errors are returned as tool results for the parent to handle\n return await this.executePromptToolInternal(call, state, toolMessageId);\n }\n\n /**\n * Internal method to execute a prompt tool\n */\n private static async executePromptToolInternal(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n try {\n // Check if this is a packed context\n const packageId = getPackageId(state);\n let promptDef: any;\n let qualifiedPromptName: string;\n\n // Try to load the prompt, qualifying with package if in packed context\n if (packageId) {\n qualifiedPromptName = call.function.name.includes('/') ? call.function.name : `${packageId}/${call.function.name}`;\n try {\n promptDef = await state.thread.instance.loadPrompt(qualifiedPromptName);\n console.log(`[ToolExecutor] Executing packed sub-prompt: ${qualifiedPromptName}`);\n } catch {\n // Fall back to global prompt\n qualifiedPromptName = call.function.name;\n promptDef = await state.thread.instance.loadPrompt(call.function.name);\n }\n } else {\n qualifiedPromptName = call.function.name;\n promptDef = await state.thread.instance.loadPrompt(call.function.name);\n }\n\n if (!promptDef) {\n throw new Error(`Prompt tool not found: ${call.function.name}`);\n }\n\n // Parse arguments\n const args = JSON.parse(call.function.arguments);\n\n // Validate arguments against required schema if present\n if (promptDef.requiredSchema) {\n const validation = promptDef.requiredSchema.safeParse(args);\n if (!validation.success) {\n const errorMessage = validation.error.issues\n .map((issue: any) => `[${issue.path.join('.')}] ${issue.message}`)\n .join('; ');\n return {\n status: \"error\",\n error: `Prompt tool argument validation failed: ${errorMessage}`,\n };\n }\n }\n\n // Get parent prompt's tool config for initialization options\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === call.function.name : t.name === call.function.name\n );\n const subpromptToolConfig = this.getSubpromptToolConfig(toolConfig);\n const initUserMessageProperty = subpromptToolConfig?.initUserMessageProperty ?? null;\n const initAttachmentsProperty = subpromptToolConfig?.initAttachmentsProperty ?? null;\n\n // Import FlowEngine dynamically to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine\");\n\n // Create a temporary agent configuration for the prompt\n // Store the prompt name in side_a_agent_prompt - FlowEngine will load and interpolate it\n // Use \"ai_human\" type to prevent side switching - prompts should only execute on side A\n const promptAgent: import(\"./types\").Agent = {\n id: promptDef.name,\n title: promptDef.name,\n type: \"ai_human\", // Prevent side switching - prompts execute only on side A\n created_at: Date.now(),\n\n // Global configuration\n max_session_turns: null,\n\n // Side A configuration (only side used for prompt tools)\n side_a_label: null,\n side_a_agent_prompt: qualifiedPromptName, // Pass qualified prompt name, FlowEngine will load it\n side_a_stop_on_response: true,\n side_a_stop_tool: null,\n side_a_stop_tool_response_property: null,\n side_a_max_steps: null,\n side_a_session_stop_tool: null,\n side_a_session_stop_message_property: null,\n side_a_session_stop_attachments_property: null,\n side_a_session_fail_tool: null,\n side_a_session_fail_message_property: null,\n side_a_session_fail_attachments_property: null,\n side_a_session_status_tool: null,\n side_a_session_status_message_property: null,\n side_a_session_status_attachments_property: null,\n\n // Side B configuration (unused for prompt tools)\n side_b_label: null,\n side_b_agent_prompt: null,\n side_b_stop_on_response: true,\n side_b_stop_tool: null,\n side_b_stop_tool_response_property: null,\n side_b_max_steps: null,\n side_b_session_stop_tool: null,\n side_b_session_stop_message_property: null,\n side_b_session_stop_attachments_property: null,\n side_b_session_fail_tool: null,\n side_b_session_fail_message_property: null,\n side_b_session_fail_attachments_property: null,\n side_b_session_status_tool: null,\n side_b_session_status_message_property: null,\n side_b_session_status_attachments_property: null,\n };\n\n // Build the user message content based on initialization options\n let userMessageContent: string | undefined;\n let userMessageAttachments: AttachmentRef[] | undefined;\n\n if (initUserMessageProperty && args[initUserMessageProperty] !== undefined) {\n // Use the specified property as the user message\n const propertyValue = args[initUserMessageProperty];\n userMessageContent = typeof propertyValue === 'string'\n ? propertyValue\n : JSON.stringify(propertyValue);\n }\n\n // Resolve attachments if initAttachmentsProperty is set\n // Supports both single path string or array of paths\n if (initAttachmentsProperty && args[initAttachmentsProperty] !== undefined) {\n const attachmentValue = args[initAttachmentsProperty];\n\n // Normalize to array\n const attachmentPaths: string[] = Array.isArray(attachmentValue)\n ? attachmentValue\n : [attachmentValue];\n\n userMessageAttachments = [];\n\n for (const attachmentPath of attachmentPaths) {\n if (typeof attachmentPath === 'string' && attachmentPath.startsWith('/attachments/')) {\n try {\n const statResult = await state.thread.instance.statFile(attachmentPath);\n if (statResult.success && statResult.file) {\n userMessageAttachments.push({\n id: crypto.randomUUID(),\n type: \"file\",\n path: attachmentPath,\n name: statResult.file.name,\n mimeType: statResult.file.mimeType,\n size: statResult.file.size,\n width: statResult.file.width ?? undefined,\n height: statResult.file.height ?? undefined,\n });\n } else {\n console.error(`[ToolExecutor] Could not stat attachment ${attachmentPath}:`, statResult.error);\n }\n } catch (e) {\n console.error(`[ToolExecutor] Failed to resolve attachment ${attachmentPath}:`, e);\n }\n }\n }\n\n // Clear if no valid attachments were resolved\n if (userMessageAttachments.length === 0) {\n userMessageAttachments = undefined;\n }\n }\n\n const extraMessages: Message[] = [...(state.extraMessages || [])];\n if (userMessageContent || userMessageAttachments) {\n extraMessages.push({\n id: crypto.randomUUID(),\n role: \"user\",\n content: userMessageContent || \"\",\n created_at: Date.now() * 1000,\n attachments: userMessageAttachments ? JSON.stringify(userMessageAttachments) : undefined,\n });\n }\n\n // Execute the prompt as a sub-flow\n // IMPORTANT: Child prompt messages should NOT be stored in parent thread\n // Only the tool result should appear in the parent's messages\n // However, we DO want child logs to be stored with parent_log_id\n const parentLogId = state.currentLogId || null;\n const rootMessageIdForChild = state.pendingMessageId || state.rootMessageId || null;\n\n const result = await FlowEngine.execute({\n agentConfig: promptAgent,\n storage: state.storage,\n env: state.env,\n // Use root thread ID - sub-prompts share the parent's thread\n // Messages are namespaced by depth and prompt, not by threadId\n threadId: state.rootState?.threadId || state.threadId,\n thread: state.thread, // Pass through parent thread instance and metadata\n // Propagate namespace context to sub-flows for packed agent isolation\n namespaceContext: state.namespaceContext,\n context: {\n ...args, // Pass tool arguments for template interpolation\n // Pass parent tool config for response options\n __parentToolConfig: toolConfig,\n __parentToolName: call.function.name,\n },\n // Mark this as a sub-flow by providing a different flowId\n flowId: `prompt-${call.id}`,\n // Pass emit callbacks so child messages/logs are broadcast\n // This allows tools running in sub-prompts to use injectMessage()\n emitLog: state.emitLog,\n emitMessage: state.emitMessage,\n emitMessageChunk: state.emitMessageChunk,\n // Pass parent log ID for hierarchical log tracking\n parentLogId,\n // Pass root message ID so child logs link to parent's message\n rootMessageId: rootMessageIdForChild,\n // The root state is FlowState object for the root prompt\n rootState: state.rootState,\n // Mark as sub-prompt by providing parent message ID (tool message from parent)\n parentMessageId: toolMessageId,\n // Set depth one level deeper than parent\n depth: state.depth + 1,\n // Extend promptPath with the sub-prompt name\n promptPath: [...state.promptPath, promptDef.name],\n // Additional messages to inject\n extraMessages,\n }, true); // awaitCompletion: true - ensures all sub-prompt DB writes complete before parent continues\n\n // Get tool response options from parent prompt's tool config\n // toolConfig is already loaded above from state.prompt._tools\n let toolResponseOptions = {\n include_text_response: true,\n include_tool_calls: true,\n include_errors: true,\n };\n\n if (subpromptToolConfig) {\n toolResponseOptions = {\n include_text_response: subpromptToolConfig.includeTextResponse ?? true,\n include_tool_calls: subpromptToolConfig.includeToolCalls ?? true,\n include_errors: subpromptToolConfig.includeErrors ?? true,\n };\n }\n\n // Consume the stream to get the final content\n const reader = result.stream.getReader();\n const decoder = new TextDecoder();\n let textContent = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n textContent += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n\n // Query child tool messages from database to determine aggregate status\n const childToolMessagesResult = await state.storage.sql.exec(\n `SELECT id, content, tool_status, tool_call_id, name FROM messages WHERE parent_id = ? AND role = 'tool'`,\n toolMessageId\n );\n const childToolRows = childToolMessagesResult.toArray();\n\n // Query for assistant messages with attachments from sub-prompt (e.g., generated images)\n const assistantAttachmentsResult = await state.storage.sql.exec(\n `SELECT attachments FROM messages WHERE parent_id = ? AND role = 'assistant' AND attachments IS NOT NULL`,\n toolMessageId\n );\n const assistantAttachmentRows = assistantAttachmentsResult.toArray();\n\n // Collect attachment refs from sub-prompt's assistant messages\n // These are already stored in the filesystem, so we just pass the refs through\n const collectedAttachments: AttachmentRef[] = [];\n for (const row of assistantAttachmentRows) {\n if (row.attachments) {\n try {\n const refs: AttachmentRef[] = JSON.parse(row.attachments as string);\n collectedAttachments.push(...refs);\n } catch (e) {\n console.error('[ToolExecutor] Failed to parse sub-prompt attachments:', e);\n }\n }\n }\n\n // Determine overall status based on child tool results\n let overallStatus: \"success\" | \"error\" = \"success\";\n if (childToolRows.length > 0) {\n const statuses = childToolRows.map(row => row.tool_status as string);\n const hasError = statuses.some(s => s === \"error\");\n\n // If any child tool failed, the overall status is error\n if (hasError) {\n overallStatus = \"error\";\n }\n }\n\n // Build response based on tool response options and overall status\n const responseParts: string[] = [];\n\n if (overallStatus === \"error\") {\n // ERROR CASE: Don't include textContent as it contains streaming output from successful tools\n // ERROR CASE: Build failure-focused summary\n // Separate child tools into failed and successful\n const failedTools: Array<{ name: string; content: string }> = [];\n const successfulToolNames: string[] = [];\n\n for (const row of childToolRows) {\n const toolName = (row.name as string) || 'unknown_tool';\n const isError = row.tool_status === 'error';\n\n if (isError) {\n failedTools.push({\n name: toolName,\n content: row.content as string,\n });\n } else {\n successfulToolNames.push(toolName);\n }\n }\n\n // Build failure summary if include_errors is true\n if (toolResponseOptions.include_errors && failedTools.length > 0) {\n const errorLines = failedTools.map(tool => {\n // Extract the actual error message, stripping common prefixes for cleaner output\n let errorMsg = tool.content;\n if (errorMsg.startsWith('Failed to execute tool: ')) {\n errorMsg = errorMsg.substring('Failed to execute tool: '.length);\n }\n return ` ${tool.name}: ${errorMsg}`;\n });\n\n responseParts.push(`Sub-prompt failed with ${failedTools.length} error(s):\\n${errorLines.join('\\n')}`);\n }\n\n // Add brief footnote for other tools that ran if include_tool_calls is true\n if (toolResponseOptions.include_tool_calls && successfulToolNames.length > 0) {\n responseParts.push(`Other tools run: ${successfulToolNames.join(', ')}`);\n }\n } else {\n // SUCCESS CASE: Include text response and full tool call details\n if (toolResponseOptions.include_text_response && textContent) {\n responseParts.push(textContent);\n }\n\n if (toolResponseOptions.include_tool_calls || toolResponseOptions.include_errors) {\n // Query for child assistant messages (containing tool calls)\n const childAssistantMessagesResult = await state.storage.sql.exec(\n `SELECT id, tool_calls FROM messages WHERE parent_id = ? AND role = 'assistant' AND tool_calls IS NOT NULL`,\n toolMessageId\n );\n const childAssistantRows = childAssistantMessagesResult.toArray();\n\n const toolCallsSummary: string[] = [];\n\n // Add assistant messages with tool calls if enabled\n if (toolResponseOptions.include_tool_calls && childAssistantRows.length > 0) {\n for (const row of childAssistantRows) {\n const toolCalls = JSON.parse(row.tool_calls as string);\n for (const tc of toolCalls) {\n toolCallsSummary.push(\n `Tool Call: ${tc.function.name}(${tc.function.arguments})`\n );\n }\n }\n }\n\n // Add tool responses based on options\n for (const row of childToolRows) {\n const isError = (row.content as string)?.startsWith(\"Error: \");\n\n // Include based on options: errors if include_errors, successes if include_tool_calls\n if ((isError && toolResponseOptions.include_errors) ||\n (!isError && toolResponseOptions.include_tool_calls)) {\n toolCallsSummary.push(`Tool Response: ${row.content}`);\n }\n }\n\n if (toolCallsSummary.length > 0) {\n responseParts.push(\n \"Tool Executions:\\n\" + toolCallsSummary.join(\"\\n\")\n );\n }\n }\n }\n\n const finalResponse = responseParts.length > 0\n ? responseParts.join(\"\\n\\n\")\n : \"Prompt executed successfully\";\n\n return {\n status: overallStatus,\n result: overallStatus === \"success\" ? finalResponse : undefined,\n error: overallStatus === \"error\" ? finalResponse : undefined,\n attachments: collectedAttachments.length > 0 ? collectedAttachments : undefined,\n };\n } catch (error) {\n // Get tool response options from parent prompt's tool config\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === call.function.name : t.name === call.function.name\n );\n const subpromptToolConfig = this.getSubpromptToolConfig(toolConfig);\n\n let includeErrors = true;\n if (subpromptToolConfig) {\n includeErrors = subpromptToolConfig.includeErrors ?? true;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n\n // Prefix error message with \"Error: \" when include_errors is true\n const formattedError = includeErrors\n ? `Error: ${errorMessage}`\n : \"Error: Tool execution failed\";\n\n return {\n status: \"error\",\n error: formattedError,\n stack: includeErrors ? stackTrace : undefined,\n };\n }\n }\n\n /**\n * Execute an agent tool:\n * - ai_human: buffered handoff\n * - dual_ai: subagent spawn/invocation\n * - subagent_create: built-in dual_ai subagent creation\n * - subagent_message: built-in message routing to resumable subagents\n */\n private static async executeAgentTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n try {\n const builtinSubagentAction = this.getBuiltinSubagentAction(call.function.name);\n if (builtinSubagentAction === \"message\") {\n return await this.executeSubagentMessageTool(call, state);\n }\n const createArgs =\n builtinSubagentAction === \"create\"\n ? this.parseSubagentCreateArgs(call.function.arguments)\n : null;\n if (createArgs?.error) {\n return { status: \"error\", error: createArgs.error };\n }\n const targetAgentForCreate = createArgs?.agent;\n const builtinCreateMessage = createArgs?.message;\n const builtinCreateAttachmentValue = createArgs?.attachments;\n const registryAgentName = targetAgentForCreate || call.function.name;\n\n // Check if this is a packed context\n const packageId = getPackageId(state);\n\n // Get agent configuration from TypeScript config\n // First try to find by name (qualified if packed), then by title\n let agentDef: any = null;\n let agentName = registryAgentName;\n\n if (builtinSubagentAction === \"create\" && targetAgentForCreate) {\n const availableSubagents = await this.getPromptSubagentNames(state);\n if (!availableSubagents.includes(targetAgentForCreate)) {\n return {\n status: \"error\",\n error: `Subagent \"${targetAgentForCreate}\" is not available for this prompt. Use one of: ${availableSubagents.join(\", \") || \"(none)\"}.`,\n };\n }\n }\n\n // Try qualified name first if in packed context\n if (packageId) {\n try {\n const qualifiedName = agentName.includes('/') ? agentName : `${packageId}/${agentName}`;\n agentDef = await state.thread.instance.loadAgent(qualifiedName);\n agentName = qualifiedName;\n console.log(`[ToolExecutor] Executing packed agent: ${qualifiedName}`);\n } catch {\n // Not a packed agent, fall through to global\n }\n }\n\n // Try global agent lookup\n if (!agentDef) {\n try {\n agentDef = await state.thread.instance.loadAgent(agentName);\n } catch {\n // Not found by name, try by title\n const agentNames = state.thread.instance.getAgentNames();\n for (const name of agentNames) {\n try {\n const def = await state.thread.instance.loadAgent(name);\n if (def.title === call.function.name) {\n agentDef = def;\n agentName = name;\n break;\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n }\n }\n\n if (!agentDef) {\n throw new Error(`Agent tool not found: ${call.function.name}`);\n }\n\n const agentType = agentDef.type as \"dual_ai\" | \"ai_human\";\n const rawArgs = this.parseToolArguments(call.function.arguments);\n const providedScopedEnv = this.extractProvidedScopedEnv(state, call, rawArgs);\n const args = this.sanitizeInternalToolArgs(rawArgs);\n\n // Handle AI + Human agent handoff (buffer for later execution)\n if (agentType === \"ai_human\") {\n // Get parent prompt's tool config for initialization options\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === agentName : t.name === agentName\n );\n const subpromptToolConfig = this.getSubpromptToolConfig(toolConfig);\n\n // Buffer the handoff on ROOT state - so it bubbles up from sub-prompts\n // When handoff is queued from a sub-prompt, it should execute at the root level\n // Use agent name (not title) as the identifier\n const targetState = state.rootState || state;\n targetState.pendingHandoff = {\n agentId: agentName,\n args,\n toolConfig: subpromptToolConfig\n ? {\n initUserMessageProperty: subpromptToolConfig.initUserMessageProperty,\n initAttachmentsProperty: subpromptToolConfig.initAttachmentsProperty,\n }\n : undefined,\n };\n const text = \"Handoff complete\";\n\n // Return handoff confirmation message - will be stored as tool result\n return {\n status: \"success\",\n result: text,\n };\n }\n\n if (agentType !== \"dual_ai\") {\n throw new Error(`Unsupported agent type: ${agentType}`);\n }\n\n const subagentConfig = this.resolveSubagentToolConfig(state, registryAgentName);\n const blocking = subagentConfig.blocking ?? true;\n const initUserMessageProperty = subagentConfig.initUserMessageProperty;\n const initAttachmentsProperty = subagentConfig.initAttachmentsProperty;\n const initAgentNameProperty = subagentConfig.initAgentNameProperty;\n const resumable =\n subagentConfig.resumable && typeof subagentConfig.resumable === \"object\"\n ? subagentConfig.resumable\n : null;\n const receivesMessages = resumable?.receives_messages ?? \"side_a\";\n const maxInstances = resumable?.maxInstances;\n const parentCommunication = this.getParentCommunicationMode(subagentConfig);\n const builtinRequestedName =\n builtinSubagentAction === \"create\" ? createArgs?.name : null;\n const initialAgentName =\n builtinSubagentAction === \"create\"\n ? this.normalizeThreadName(builtinRequestedName)\n : this.resolveInitialAgentName(\n args,\n initAgentNameProperty,\n providedScopedEnv\n );\n const initialMessageContent =\n builtinSubagentAction === \"create\"\n ? (builtinCreateMessage as string)\n : this.resolveInitialInvocationContent(\n args,\n initUserMessageProperty\n );\n const initialMessageAttachments =\n builtinSubagentAction === \"create\"\n ? await this.resolveAttachmentRefsFromValue(\n state,\n builtinCreateAttachmentValue\n )\n : await this.resolveInitialAttachmentRefs(\n state,\n args,\n initAttachmentsProperty\n );\n\n const existingChildren = await this.getChildrenRegistry(state);\n const activeInstances = existingChildren.filter(\n (entry) => entry.name === registryAgentName && entry.status !== \"terminated\"\n );\n\n if (\n typeof maxInstances === \"number\" &&\n maxInstances > 0 &&\n activeInstances.length >= maxInstances\n ) {\n if (!resumable) {\n return {\n status: \"error\",\n error: `Subagent instance limit reached for \"${registryAgentName}\" (${maxInstances}).`,\n };\n }\n\n if (activeInstances.length === 0) {\n return {\n status: \"error\",\n error: `No active resumable subagent instances available for \"${registryAgentName}\".`,\n };\n }\n\n const references = activeInstances.map((entry) => entry.reference).join(\", \");\n return {\n status: \"error\",\n error:\n `Subagent instance limit reached for \"${registryAgentName}\" (${maxInstances}). ` +\n `Use ${SUBAGENT_MESSAGE_TOOL} with an existing reference instead. ` +\n `Active references: ${references}.`,\n };\n }\n\n const agentBuilderId = state.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = state.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const missingScopedEnv =\n typeof agentBuilder.getMissingRequiredScopedSubagentEnv === \"function\"\n ? await agentBuilder.getMissingRequiredScopedSubagentEnv({\n parent_thread_id: state.threadId,\n agent_name: agentName,\n provided_env: providedScopedEnv,\n })\n : [];\n if (Array.isArray(missingScopedEnv) && missingScopedEnv.length > 0) {\n if (typeof agentBuilder.createPendingSubagentEnvRequest !== \"function\") {\n throw new Error(\"Pending scoped env requests are not supported by this runtime\");\n }\n\n const pending = await agentBuilder.createPendingSubagentEnvRequest({\n parent_thread_id: state.threadId,\n agent_name: agentName,\n registry_agent_name: registryAgentName,\n required_variables: missingScopedEnv,\n missing_variables: missingScopedEnv,\n payload: {\n blocking,\n resumable: !!resumable,\n receives_messages: receivesMessages,\n parent_communication: parentCommunication,\n initial_message_content: initialMessageContent,\n initial_message_attachments: initialMessageAttachments.map((attachment) => ({\n path: attachment.path,\n name: attachment.name,\n mimeType: attachment.mimeType,\n size: attachment.size,\n width: attachment.width,\n height: attachment.height,\n })),\n initial_agent_name: initialAgentName,\n agent_title: agentDef.title || registryAgentName,\n agent_description:\n agentDef.toolDescription ||\n `Autonomous subagent ${agentDef.title || registryAgentName}`,\n spawn_group_id: state.pendingMessageId ?? null,\n },\n });\n const requestId =\n pending && typeof pending.request_id === \"string\"\n ? pending.request_id\n : crypto.randomUUID();\n const endpoint = `/api/threads/${state.threadId}/variables/${requestId}`;\n\n return {\n status: \"error\",\n error:\n `Subagent \"${registryAgentName}\" requires scoped environment variables before it can be created. ` +\n `Provide the missing values via GET/POST ${endpoint}.`,\n error_code: \"subagent_env_required\",\n error_data: {\n request_id: requestId,\n endpoint,\n required:\n pending && Array.isArray(pending.required)\n ? pending.required\n : missingScopedEnv,\n missing:\n pending && Array.isArray(pending.missing)\n ? pending.missing\n : missingScopedEnv,\n agent: registryAgentName,\n },\n };\n }\n\n const childThread = await agentBuilder.createThread({\n agent_name: agentName,\n parent: state.threadId,\n env: providedScopedEnv ?? undefined,\n tags: initialAgentName\n ? [this.buildThreadNameTag(initialAgentName)]\n : undefined,\n });\n const childThreadId = childThread.id;\n\n const durableId = state.env.AGENT_BUILDER_THREAD.idFromName(childThreadId);\n const stub = state.env.AGENT_BUILDER_THREAD.get(durableId) as unknown as DurableThread;\n\n try {\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n const childState = ThreadStateImpl.fromThreadInstance(stub as any, {\n id: childThreadId,\n agent_id: agentName,\n user_id: childThread.user_id ?? null,\n env: (childThread.env ?? childThread.tenvs ?? null) as Record<string, string> | null,\n env_types: childThread.env_types ?? null,\n tenvs: childThread.tenvs ?? null,\n properties: childThread.properties ?? null,\n parent: childThread.parent ?? state.threadId,\n terminated: childThread.terminated ?? null,\n created_at: childThread.created_at ?? Math.floor(Date.now() / 1000),\n });\n await FlowEngine.runAfterSubagentCreatedHook(state, childState);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_subagent_created hook:', error);\n }\n\n const initialMessages = await this.buildChildInvocationMessages(\n state,\n stub as any,\n initialMessageContent,\n receivesMessages,\n initialMessageAttachments\n );\n\n await this.upsertChildRegistry(state, {\n reference: childThreadId,\n name: registryAgentName,\n title: agentDef.title || registryAgentName,\n description:\n agentDef.toolDescription ||\n `Autonomous subagent ${agentDef.title || registryAgentName}`,\n resumable: !!resumable,\n blocking,\n ...(resumable ? { parentCommunication } : {}),\n status: \"running\",\n ...(initialAgentName ? { threadName: initialAgentName } : {}),\n ...(state.pendingMessageId ? { spawnGroupId: state.pendingMessageId } : {}),\n createdAt: Date.now() * 1000,\n });\n\n if (blocking) {\n const childResult = await stub.executeBlocking(\n childThreadId,\n agentName,\n initialMessages,\n {}\n );\n\n const copiedAttachments = await this.copyAttachmentsBetweenThreads(\n stub as any,\n state.thread.instance as any,\n childResult.attachments as AttachmentRef[] | undefined,\n `from-subagent-${childThreadId}`\n );\n\n if (resumable) {\n await this.settleResumableChildAfterRun(\n state,\n stub as any,\n childThreadId,\n childResult\n );\n } else if (stub.terminateThread) {\n await stub.terminateThread(childThreadId);\n }\n\n const toolResult: ToolResult = {\n status: childResult.status,\n result: childResult.result,\n error: childResult.error,\n attachments: copiedAttachments,\n subagent_id: childThreadId,\n };\n\n return resumable && !this.isTerminalSubagentResult(childResult)\n ? this.withReferenceInToolResult(toolResult, childThreadId)\n : toolResult;\n }\n\n // Non-blocking: return immediately and complete in background.\n void (async () => {\n try {\n const childResult = await stub.executeBlocking(\n childThreadId,\n agentName,\n initialMessages,\n {}\n );\n\n const copiedAttachments = await this.copyAttachmentsBetweenThreads(\n stub as any,\n state.thread.instance as any,\n childResult.attachments as AttachmentRef[] | undefined,\n `from-subagent-${childThreadId}`\n );\n\n const messageContent = this.formatSubagentTerminalMessage(\n childThreadId,\n childResult.status,\n childResult.result,\n childResult.error,\n copiedAttachments\n );\n\n if (parentCommunication !== \"explicit\") {\n await this.enqueueParentResultMessage(\n state,\n childThreadId,\n messageContent,\n copiedAttachments\n );\n }\n\n if (resumable) {\n await this.settleResumableChildAfterRun(\n state,\n stub as any,\n childThreadId,\n childResult\n );\n } else if (stub.terminateThread) {\n await stub.terminateThread(childThreadId);\n }\n } catch (error) {\n console.error(\"[ToolExecutor] Background non-blocking subagent execution failed:\", error);\n if (resumable) {\n await this.updateChildStatus(state, childThreadId, \"idle\");\n }\n }\n })();\n\n return {\n status: \"success\",\n result: resumable\n ? `The subagent was initiated successfully. Reference: ${childThreadId}`\n : \"The subagent was initiated successfully. Results will be delivered when complete.\",\n subagent_id: childThreadId,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n return {\n status: \"error\",\n error: errorMessage,\n stack: stackTrace,\n };\n }\n }\n\n private static parseToolArguments(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw);\n return typeof parsed === \"object\" && parsed !== null ? parsed : {};\n } catch {\n return {};\n }\n }\n\n private static sanitizeInternalToolArgs(\n args: Record<string, unknown>\n ): Record<string, unknown> {\n if (!(INTERNAL_SCOPED_ENV_ARGUMENT in args)) {\n return args;\n }\n\n const next: Record<string, unknown> = { ...args };\n delete next[INTERNAL_SCOPED_ENV_ARGUMENT];\n return next;\n }\n\n private static takeScopedEnvFromContext(\n state: FlowState,\n callId: string\n ): Record<string, string> | null {\n if (!callId) {\n return null;\n }\n\n const raw = state.context[INTERNAL_SCOPED_ENV_CONTEXT_KEY];\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return null;\n }\n\n const registry = raw as Record<string, unknown>;\n const entry = registry[callId];\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n return null;\n }\n\n delete registry[callId];\n const normalized: Record<string, string> = {};\n for (const [name, value] of Object.entries(entry as Record<string, unknown>)) {\n const key = name.trim();\n if (!key) continue;\n if (value === null || value === undefined) continue;\n const text = String(value);\n if (!text.trim()) continue;\n normalized[key] = text;\n }\n\n return Object.keys(normalized).length > 0 ? normalized : null;\n }\n\n private static extractProvidedScopedEnv(\n state: FlowState,\n call: ToolCall,\n args: Record<string, unknown>\n ): Record<string, string> | null {\n const fromContext = this.takeScopedEnvFromContext(state, call.id);\n if (fromContext) {\n return fromContext;\n }\n\n const raw = args[INTERNAL_SCOPED_ENV_ARGUMENT];\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return null;\n }\n\n const normalized: Record<string, string> = {};\n for (const [name, value] of Object.entries(raw as Record<string, unknown>)) {\n const key = name.trim();\n if (!key) continue;\n if (value === null || value === undefined) continue;\n const text = String(value);\n if (!text.trim()) continue;\n normalized[key] = text;\n }\n\n return Object.keys(normalized).length > 0 ? normalized : null;\n }\n\n private static getBuiltinSubagentAction(\n toolName: string\n ): \"create\" | \"message\" | null {\n if (toolName === SUBAGENT_CREATE_TOOL) {\n return \"create\";\n }\n if (\n toolName === SUBAGENT_MESSAGE_TOOL ||\n toolName === LEGACY_SEND_TO_AGENT_TOOL\n ) {\n return \"message\";\n }\n return null;\n }\n\n private static parseSubagentCreateArgs(raw: string): {\n agent: string;\n message: string;\n attachments: unknown;\n name: string;\n error?: string;\n } {\n const args = this.parseToolArguments(raw);\n const agent = typeof args.agent === \"string\" ? args.agent.trim() : \"\";\n const message = typeof args.message === \"string\" ? args.message : \"\";\n const attachments = args.attachments;\n const name = typeof args.name === \"string\" ? args.name.trim() : \"\";\n\n if (!agent) {\n return {\n agent: \"\",\n message,\n attachments,\n name,\n error: `${SUBAGENT_CREATE_TOOL} requires agent.`,\n };\n }\n\n if (!message.trim()) {\n return {\n agent,\n message,\n attachments,\n name,\n error: `${SUBAGENT_CREATE_TOOL} requires message.`,\n };\n }\n\n if (!Array.isArray(attachments)) {\n return {\n agent,\n message,\n attachments,\n name,\n error: `${SUBAGENT_CREATE_TOOL} requires attachments (use [] when none).`,\n };\n }\n\n if (args.name !== undefined && typeof args.name !== \"string\") {\n return {\n agent,\n message,\n attachments,\n name,\n error: `${SUBAGENT_CREATE_TOOL} name must be a string when provided.`,\n };\n }\n\n if (!name) {\n return {\n agent,\n message,\n attachments,\n name,\n error: `${SUBAGENT_CREATE_TOOL} requires name.`,\n };\n }\n\n return { agent, message, attachments, name };\n }\n\n private static getSubpromptToolConfig(config: unknown): SubpromptConfig | null {\n if (!config || typeof config !== \"object\") {\n return null;\n }\n\n if (\n \"includeTextResponse\" in config ||\n \"includeToolCalls\" in config ||\n \"includeErrors\" in config ||\n \"initUserMessageProperty\" in config ||\n \"initAttachmentsProperty\" in config\n ) {\n return config as SubpromptConfig;\n }\n\n return null;\n }\n\n private static resolveSubagentToolConfig(\n state: FlowState,\n agentName: string\n ): SubagentToolConfig {\n const config = (state.prompt._tools || []).find((tool: any) =>\n typeof tool === \"string\" ? tool === agentName : tool.name === agentName\n );\n\n if (\n typeof config === \"object\" &&\n config !== null &&\n (\n \"blocking\" in config ||\n \"resumable\" in config ||\n \"immediate\" in config ||\n \"optional\" in config ||\n \"initUserMessageProperty\" in config ||\n \"initAttachmentsProperty\" in config ||\n \"initAgentNameProperty\" in config\n )\n ) {\n return config as SubagentToolConfig;\n }\n\n return { name: agentName };\n }\n\n private static getParentCommunicationMode(\n subagentConfig: SubagentToolConfig\n ): \"implicit\" | \"explicit\" {\n const resumable =\n subagentConfig.resumable && typeof subagentConfig.resumable === \"object\"\n ? subagentConfig.resumable\n : null;\n return resumable?.parentCommunication === \"explicit\" ? \"explicit\" : \"implicit\";\n }\n\n private static async getChildrenRegistry(\n state: FlowState\n ): Promise<InternalChildRegistryEntry[]> {\n if (state.thread.instance.getChildrenRegistry) {\n return state.thread.instance.getChildrenRegistry(state.threadId) as Promise<InternalChildRegistryEntry[]>;\n }\n\n const cursor = await state.storage.sql.exec<{ value: string }>(\n `SELECT value FROM execution_state WHERE key = 'children_registry' LIMIT 1`\n );\n const rows = cursor.toArray();\n const raw = rows[0]?.value ?? \"[]\";\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as InternalChildRegistryEntry[]) : [];\n } catch {\n return [];\n }\n }\n\n private static async upsertChildRegistry(\n state: FlowState,\n entry: InternalChildRegistryEntry\n ): Promise<void> {\n if (state.thread.instance.upsertChildRegistry) {\n await state.thread.instance.upsertChildRegistry(state.threadId, entry);\n return;\n }\n\n const existing = await this.getChildrenRegistry(state);\n const next = existing.filter((item) => item.reference !== entry.reference);\n next.push(entry);\n await state.storage.sql.exec(\n `UPDATE execution_state SET value = ? WHERE key = 'children_registry'`,\n JSON.stringify(next)\n );\n }\n\n private static async updateChildStatus(\n state: FlowState,\n reference: string,\n status: string\n ): Promise<void> {\n if (state.thread.instance.updateChildRegistryStatus) {\n await state.thread.instance.updateChildRegistryStatus(state.threadId, reference, status);\n return;\n }\n\n const existing = await this.getChildrenRegistry(state);\n const next = existing.map((entry) =>\n entry.reference === reference ? { ...entry, status } : entry\n );\n await state.storage.sql.exec(\n `UPDATE execution_state SET value = ? WHERE key = 'children_registry'`,\n JSON.stringify(next)\n );\n }\n\n private static isTerminalSubagentResult(result: BlockingSubagentResult): boolean {\n return result.terminal === true;\n }\n\n private static async settleResumableChildAfterRun(\n state: FlowState,\n childThread: { terminateThread?: (threadId: string) => Promise<unknown> },\n reference: string,\n result: BlockingSubagentResult\n ): Promise<void> {\n if (!this.isTerminalSubagentResult(result)) {\n await this.updateChildStatus(state, reference, \"idle\");\n return;\n }\n\n await this.updateChildStatus(state, reference, \"terminated\");\n if (typeof childThread.terminateThread === \"function\") {\n await childThread.terminateThread(reference);\n }\n }\n\n private static async buildChildInvocationMessages(\n state: FlowState,\n childThread: {\n readFile(path: string): Promise<{ success: boolean; data?: string; error?: string }>;\n statFile(path: string): Promise<{ success: boolean; file?: any; error?: string }>;\n writeFile(\n path: string,\n data: string,\n mimeType: string,\n options?: Record<string, unknown>\n ): Promise<{ success: boolean; file?: any; error?: string }>;\n },\n content: string,\n receivesMessages: \"side_a\" | \"side_b\",\n parentAttachments: AttachmentRef[]\n ): Promise<Message[]> {\n const copiedAttachments = await this.copyAttachmentsBetweenThreads(\n state.thread.instance as any,\n childThread,\n parentAttachments,\n `from-parent-${state.threadId}`\n );\n\n const targetRole = receivesMessages === \"side_a\" ? \"user\" : \"assistant\";\n const baseTimestamp = Date.now() * 1000;\n const messages: Message[] = [];\n\n // Seed explicit silent path messages so the child thread has stable, visible\n // attachment-path context before the main init message.\n for (let i = 0; i < copiedAttachments.length; i++) {\n const attachment = copiedAttachments[i];\n messages.push({\n id: crypto.randomUUID(),\n role: targetRole,\n content: `Initial asset attachment path: ${attachment.path}`,\n attachments: JSON.stringify([attachment]),\n silent: true,\n created_at: baseTimestamp + i,\n });\n }\n\n messages.push({\n id: crypto.randomUUID(),\n role: targetRole,\n content,\n // Keep binary refs on the silent path messages only to avoid rendering\n // duplicate attachments on the visible init message.\n attachments: undefined,\n created_at: baseTimestamp + copiedAttachments.length,\n });\n\n return messages;\n }\n\n private static withReferenceInToolResult(\n result: ToolResult,\n referenceId: string\n ): ToolResult {\n if (result.status === \"success\") {\n const withReference = result.result\n ? `${result.result}\\n\\nReference: ${referenceId}`\n : `Reference: ${referenceId}`;\n return { ...result, result: withReference };\n }\n\n const withReference = result.error\n ? `${result.error}\\n\\nReference: ${referenceId}`\n : `Reference: ${referenceId}`;\n return { ...result, error: withReference };\n }\n\n private static resolveInitialInvocationContent(\n args: Record<string, unknown>,\n initUserMessageProperty: string | undefined\n ): string {\n if (\n initUserMessageProperty &&\n args[initUserMessageProperty] !== undefined\n ) {\n const value = args[initUserMessageProperty];\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n\n if (Object.keys(args).length === 0) {\n return \"\";\n }\n\n return JSON.stringify(args, null, 2);\n }\n\n private static resolveInitialAgentName(\n args: Record<string, unknown>,\n initAgentNameProperty: string | undefined,\n providedScopedEnv: Record<string, string> | null = null\n ): string | null {\n if (!initAgentNameProperty) {\n return null;\n }\n\n const fromArgs = args[initAgentNameProperty];\n if (typeof fromArgs === \"string\") {\n const normalized = fromArgs.replace(/\\s+/g, \" \").trim();\n return normalized.length > 0 ? normalized : null;\n }\n\n const fromScopedEnv =\n providedScopedEnv && providedScopedEnv[initAgentNameProperty] !== undefined\n ? providedScopedEnv[initAgentNameProperty]\n : null;\n if (typeof fromScopedEnv !== \"string\") {\n return null;\n }\n\n const normalized = fromScopedEnv.replace(/\\s+/g, \" \").trim();\n return normalized.length > 0 ? normalized : null;\n }\n\n private static normalizeThreadName(name: string | null | undefined): string | null {\n if (typeof name !== \"string\") {\n return null;\n }\n\n const normalized = name.replace(/\\s+/g, \" \").trim();\n return normalized.length > 0 ? normalized : null;\n }\n\n private static buildThreadNameTag(name: string): string {\n const normalized = name.replace(/\\s+/g, \" \").trim();\n const trimmed = normalized.slice(0, 120);\n return `name:${trimmed}`;\n }\n\n private static async resolveInitialAttachmentRefs(\n state: FlowState,\n args: Record<string, unknown>,\n initAttachmentsProperty: string | undefined\n ): Promise<AttachmentRef[]> {\n if (!initAttachmentsProperty || args[initAttachmentsProperty] === undefined) {\n return [];\n }\n\n const rawValue = args[initAttachmentsProperty];\n const attachmentPaths = Array.isArray(rawValue) ? rawValue : [rawValue];\n const attachments: AttachmentRef[] = [];\n\n for (const candidatePath of attachmentPaths) {\n if (\n typeof candidatePath !== \"string\" ||\n !candidatePath.startsWith(\"/attachments/\")\n ) {\n continue;\n }\n\n try {\n const statResult = await state.thread.instance.statFile(candidatePath);\n if (!statResult?.success || !statResult.file) {\n continue;\n }\n\n attachments.push({\n id: crypto.randomUUID(),\n type: \"file\",\n path: candidatePath,\n name: statResult.file.name,\n mimeType: statResult.file.mimeType,\n size: statResult.file.size,\n width: statResult.file.width ?? undefined,\n height: statResult.file.height ?? undefined,\n });\n } catch {\n // Ignore unresolved paths and continue with valid attachments.\n }\n }\n\n return attachments;\n }\n\n private static async resolveAttachmentRefsFromValue(\n state: FlowState,\n rawValue: unknown\n ): Promise<AttachmentRef[]> {\n return await this.resolveInitialAttachmentRefs(\n state,\n { attachments: rawValue },\n \"attachments\"\n );\n }\n\n private static async getPromptSubagentNames(state: FlowState): Promise<string[]> {\n const names: string[] = [];\n const seen = new Set<string>();\n const tools = state.prompt._tools || [];\n const packageId = getPackageId(state);\n\n for (const toolConfig of tools) {\n const resumableConfig =\n typeof toolConfig === \"object\" &&\n toolConfig !== null &&\n \"resumable\" in toolConfig &&\n typeof (toolConfig as SubagentToolConfig).resumable === \"object\"\n ? (toolConfig as SubagentToolConfig)\n : null;\n if (!resumableConfig) {\n continue;\n }\n\n const optionalEnvName =\n typeof (toolConfig as SubagentToolConfig).optional === \"string\"\n ? (toolConfig as SubagentToolConfig).optional\n : undefined;\n const optionalEnabled = await this.isOptionalSubagentEnabled(\n state,\n optionalEnvName\n );\n if (!optionalEnabled) {\n continue;\n }\n\n const toolName =\n typeof toolConfig === \"string\"\n ? toolConfig\n : typeof toolConfig?.name === \"string\"\n ? toolConfig.name\n : null;\n if (!toolName || seen.has(toolName)) {\n continue;\n }\n\n const candidates: string[] = [];\n if (packageId) {\n candidates.push(toolName.includes(\"/\") ? toolName : `${packageId}/${toolName}`);\n }\n candidates.push(toolName);\n\n for (const candidate of candidates) {\n try {\n const loaded = await state.thread.instance.loadAgent(candidate);\n if (loaded?.type === \"dual_ai\") {\n seen.add(toolName);\n names.push(toolName);\n break;\n }\n } catch {\n // Try next candidate.\n }\n }\n }\n\n return names;\n }\n\n private static isEnabledOptionalEnvValue(value: string | undefined): boolean {\n if (value === undefined) return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\" || normalized === \"yes\";\n }\n\n private static async isOptionalSubagentEnabled(\n state: FlowState,\n optionalEnvName: string | undefined\n ): Promise<boolean> {\n if (!optionalEnvName) {\n return true;\n }\n\n const normalized = optionalEnvName.trim();\n if (!normalized) {\n return true;\n }\n\n try {\n const threadState = ThreadStateImpl.fromFlowState(state);\n const value = await threadState.env(normalized);\n return this.isEnabledOptionalEnvValue(value);\n } catch {\n return false;\n }\n }\n\n private static async getLatestMessageAttachmentRefs(state: FlowState): Promise<AttachmentRef[]> {\n for (let i = state.messageHistory.length - 1; i >= 0; i--) {\n const msg = state.messageHistory[i];\n if (msg.attachments) {\n try {\n const parsed = JSON.parse(msg.attachments);\n if (Array.isArray(parsed)) {\n return parsed as AttachmentRef[];\n }\n } catch {\n // Ignore malformed attachment payloads.\n }\n }\n }\n return [];\n }\n\n private static inferMimeTypeFromPath(path: string): string | null {\n const normalized = path.toLowerCase();\n if (normalized.endsWith(\".png\")) return \"image/png\";\n if (normalized.endsWith(\".jpg\") || normalized.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (normalized.endsWith(\".webp\")) return \"image/webp\";\n if (normalized.endsWith(\".gif\")) return \"image/gif\";\n if (normalized.endsWith(\".bmp\")) return \"image/bmp\";\n if (normalized.endsWith(\".svg\")) return \"image/svg+xml\";\n return null;\n }\n\n private static extensionForMimeType(mimeType: string | null | undefined): string | null {\n if (!mimeType) return null;\n const normalized = mimeType.toLowerCase();\n if (normalized === \"image/jpeg\") return \"jpg\";\n if (normalized === \"image/png\") return \"png\";\n if (normalized === \"image/webp\") return \"webp\";\n if (normalized === \"image/gif\") return \"gif\";\n if (normalized === \"image/bmp\") return \"bmp\";\n if (normalized === \"image/svg+xml\") return \"svg\";\n const slashIndex = normalized.indexOf(\"/\");\n if (slashIndex === -1 || slashIndex === normalized.length - 1) {\n return null;\n }\n return normalized.slice(slashIndex + 1);\n }\n\n private static sanitizeFilename(value: string): string {\n const withoutPath = value.split(\"/\").pop()?.split(\"\\\\\").pop() ?? \"asset\";\n const cleaned = withoutPath\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-zA-Z0-9._-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return cleaned || \"asset\";\n }\n\n private static splitFilename(value: string): { stem: string; ext: string | null } {\n const lastDot = value.lastIndexOf(\".\");\n if (lastDot <= 0 || lastDot === value.length - 1) {\n return { stem: value, ext: null };\n }\n return {\n stem: value.slice(0, lastDot),\n ext: value.slice(lastDot + 1).toLowerCase(),\n };\n }\n\n private static resolveAttachmentMimeType(\n sourceMimeType: string | null | undefined,\n fallbackMimeType: string | null | undefined,\n path: string\n ): string {\n const source = sourceMimeType?.trim();\n if (source && source !== \"application/octet-stream\") {\n return source;\n }\n const fallback = fallbackMimeType?.trim();\n if (fallback && fallback !== \"application/octet-stream\") {\n return fallback;\n }\n return this.inferMimeTypeFromPath(path) ?? source ?? fallback ?? \"application/octet-stream\";\n }\n\n private static buildAttachmentTargetPath(\n preferredName: string,\n mimeType: string,\n sourcePath: string\n ): string {\n const safeName = this.sanitizeFilename(preferredName);\n const { stem, ext } = this.splitFilename(safeName);\n const fallbackExt =\n this.extensionForMimeType(mimeType) ??\n this.extensionForMimeType(this.inferMimeTypeFromPath(sourcePath)) ??\n \"bin\";\n const finalExt = ext ?? fallbackExt;\n const normalizedStem = (stem || \"asset\").slice(0, 64);\n const shortId = crypto.randomUUID().slice(0, 8);\n return `/attachments/${normalizedStem}-${shortId}.${finalExt}`;\n }\n\n private static async copyAttachmentsBetweenThreads(\n sourceThread: {\n readFile(path: string): Promise<{ success: boolean; data?: string; error?: string }>;\n statFile(path: string): Promise<{ success: boolean; file?: any; error?: string }>;\n },\n targetThread: {\n writeFile(\n path: string,\n data: string,\n mimeType: string,\n options?: Record<string, unknown>\n ): Promise<{ success: boolean; file?: any; error?: string }>;\n },\n attachments: AttachmentRef[] | undefined,\n _pathPrefix: string\n ): Promise<AttachmentRef[]> {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n\n const copied: AttachmentRef[] = [];\n for (const attachment of attachments) {\n const sourceStat = await sourceThread.statFile(attachment.path);\n if (!sourceStat.success || !sourceStat.file) {\n continue;\n }\n\n const sourceFile = sourceStat.file;\n const preferredName =\n attachment.name ||\n sourceFile.name ||\n attachment.path.split(\"/\").pop() ||\n \"asset\";\n const displayName = this.sanitizeFilename(preferredName);\n const effectiveMimeType = this.resolveAttachmentMimeType(\n sourceFile.mimeType,\n attachment.mimeType,\n attachment.path\n );\n const targetPath = this.buildAttachmentTargetPath(\n displayName,\n effectiveMimeType,\n attachment.path\n );\n\n let targetFile: any = null;\n\n if (sourceFile.storage && sourceFile.storage !== \"local\") {\n const copiedData = await this.readAttachmentDataFromSource(\n sourceThread,\n attachment.path,\n sourceFile\n );\n if (!copiedData) {\n continue;\n }\n const writeResult = await targetThread.writeFile(\n targetPath,\n copiedData,\n effectiveMimeType,\n {\n width: sourceFile.width ?? attachment.width,\n height: sourceFile.height ?? attachment.height,\n metadata: sourceFile.metadata,\n }\n );\n if (writeResult.success && writeResult.file) {\n targetFile = writeResult.file;\n }\n } else {\n const sourceData = await sourceThread.readFile(attachment.path);\n if (!sourceData.success || !sourceData.data) {\n continue;\n }\n\n const writeResult = await targetThread.writeFile(\n targetPath,\n sourceData.data,\n effectiveMimeType,\n {\n width: sourceFile.width ?? attachment.width,\n height: sourceFile.height ?? attachment.height,\n metadata: sourceFile.metadata,\n }\n );\n if (writeResult.success && writeResult.file) {\n targetFile = writeResult.file;\n }\n }\n\n if (!targetFile) {\n continue;\n }\n\n copied.push({\n id: crypto.randomUUID(),\n type: \"file\",\n path: targetPath,\n name: displayName,\n mimeType: this.resolveAttachmentMimeType(\n targetFile.mimeType,\n effectiveMimeType,\n targetPath\n ),\n size: targetFile.size || attachment.size,\n width: targetFile.width ?? sourceFile.width ?? attachment.width,\n height: targetFile.height ?? sourceFile.height ?? attachment.height,\n });\n }\n\n return copied;\n }\n\n private static async readAttachmentDataFromSource(\n sourceThread: {\n readFile(path: string): Promise<{ success: boolean; data?: string; error?: string }>;\n },\n path: string,\n sourceFile: { storage?: string | null; location?: string | null }\n ): Promise<string | null> {\n // Always try thread FS read first. Some non-local backends still expose\n // file bytes through readFile while not providing a public location URL.\n const sourceData = await sourceThread.readFile(path);\n if (sourceData.success && sourceData.data) {\n return sourceData.data;\n }\n\n if (!sourceFile.storage || sourceFile.storage === \"local\") {\n return null;\n }\n\n const location = sourceFile.location;\n if (!location || !/^https?:\\/\\//i.test(location)) {\n return null;\n }\n\n try {\n const response = await fetch(location);\n if (!response.ok) {\n return null;\n }\n const buffer = await response.arrayBuffer();\n return this.arrayBufferToBase64(buffer);\n } catch {\n return null;\n }\n }\n\n private static arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n private static formatSubagentAttachmentPathSummary(\n attachments: AttachmentRef[] | undefined\n ): string {\n if (!attachments || attachments.length === 0) {\n return \"\";\n }\n const paths = attachments\n .map((attachment) => attachment.path)\n .filter((path) => typeof path === \"string\" && path.length > 0);\n if (paths.length === 0) {\n return \"\";\n }\n const label = paths.length === 1 ? \"attachment\" : \"attachments\";\n return `\\n\\nThe subagent also returned the following ${label}:\\n\\n${paths.join(\"\\n\")}`;\n }\n\n private static formatSubagentTerminalMessage(\n referenceId: string,\n status: \"success\" | \"error\",\n result?: string,\n error?: string,\n attachments?: AttachmentRef[]\n ): string {\n const attachmentSummary = this.formatSubagentAttachmentPathSummary(attachments);\n if (status === \"error\") {\n return `Subagent (reference: ${referenceId}) has reported a failure:\\n\\n${error ?? result ?? \"No failure details provided.\"}${attachmentSummary}`;\n }\n return `Subagent (reference: ${referenceId}) has returned the following result:\\n\\n${result ?? error ?? \"No result content.\"}${attachmentSummary}`;\n }\n\n private static extractSessionMappedMessage(\n args: Record<string, unknown>,\n messageProperty: string | null\n ): string | null {\n if (!messageProperty) {\n return null;\n }\n const value = args[messageProperty];\n if (value === undefined || value === null) {\n return null;\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n\n private static mergeAttachmentRefs(\n existing: AttachmentRef[] | undefined,\n additional: AttachmentRef[]\n ): AttachmentRef[] {\n const merged: AttachmentRef[] = [];\n const seen = new Set<string>();\n\n const push = (ref: AttachmentRef) => {\n const key = ref.path;\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n merged.push(ref);\n };\n\n for (const ref of existing ?? []) {\n push(ref);\n }\n for (const ref of additional) {\n push(ref);\n }\n\n return merged;\n }\n\n private static extractAttachmentPathCandidates(rawValue: unknown): string[] {\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n const seen = new Set<string>();\n const paths: string[] = [];\n\n for (const value of values) {\n let candidate: string | null = null;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n candidate = trimmed.length > 0 ? trimmed : null;\n } else if (value && typeof value === \"object\") {\n const maybePath = (value as { path?: unknown }).path;\n if (typeof maybePath === \"string\") {\n const trimmed = maybePath.trim();\n candidate = trimmed.length > 0 ? trimmed : null;\n }\n }\n\n if (!candidate || seen.has(candidate)) {\n continue;\n }\n seen.add(candidate);\n paths.push(candidate);\n }\n\n return paths;\n }\n\n private static buildMissingMappedAttachmentPathError(missingPaths: string[]): string {\n const label = missingPaths.length === 1 ? \"path\" : \"paths\";\n const list = missingPaths.join(\", \");\n return [\n `Provided attachment ${label} not found in this thread: ${list}`,\n \"Use an exact /attachments/... path that exists in this subagent thread, then try again.\",\n ].join(\" \");\n }\n\n private static async enqueueParentResultMessage(\n state: FlowState,\n referenceId: string,\n content: string,\n attachments: AttachmentRef[] | undefined\n ): Promise<void> {\n const metadata = { subagent_id: referenceId };\n if (state.thread.instance.queueMessage) {\n await state.thread.instance.queueMessage(state.threadId, {\n role: \"user\",\n content,\n attachments,\n silent: true,\n metadata,\n });\n return;\n }\n\n await state.storage.sql.exec(\n `INSERT INTO message_queue (id, role, content, attachments, silent, metadata, created_at)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,\n crypto.randomUUID(),\n \"user\",\n content,\n attachments && attachments.length > 0 ? JSON.stringify(attachments) : null,\n 1,\n JSON.stringify(metadata),\n Date.now() * 1000\n );\n }\n\n private static async forwardStatusUpdateIfNeeded(\n state: FlowState,\n toolName: string,\n result: ToolResult,\n args?: Record<string, unknown>\n ): Promise<void> {\n const statusBinding = getAgentSessionBinding(\n state.agentConfig,\n state.currentSide,\n \"status\"\n );\n const sessionStatusToolName = statusBinding.toolName;\n\n if (!sessionStatusToolName || sessionStatusToolName !== toolName) {\n return;\n }\n\n const mappedValue =\n statusBinding.messageProperty && args\n ? args[statusBinding.messageProperty]\n : undefined;\n const mappedText =\n typeof mappedValue === \"string\"\n ? mappedValue.trim()\n : mappedValue !== undefined && mappedValue !== null\n ? JSON.stringify(mappedValue)\n : \"\";\n\n const statusText = mappedText || result.result?.trim() || result.error?.trim();\n if (!statusText) {\n return;\n }\n\n const parentThreadId = await this.getParentThreadId(state);\n if (!parentThreadId) {\n return;\n }\n\n try {\n const parentId = state.env.AGENT_BUILDER_THREAD.idFromName(parentThreadId);\n const parentStub = state.env.AGENT_BUILDER_THREAD.get(parentId) as unknown as DurableThread;\n if (parentStub.updateChildRegistryStatus) {\n await parentStub.updateChildRegistryStatus(\n parentThreadId,\n state.threadId,\n statusText\n );\n }\n } catch (error) {\n console.error(\"[ToolExecutor] Failed to propagate subagent status update:\", error);\n }\n }\n\n private static async getParentThreadId(state: FlowState): Promise<string | null> {\n if (state.parentThreadId !== undefined) {\n return state.parentThreadId;\n }\n\n const fromMetadata = (state.thread.metadata as any)?.parent ?? null;\n if (fromMetadata) {\n state.parentThreadId = fromMetadata;\n return fromMetadata;\n }\n\n try {\n const agentBuilderId = state.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = state.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(state.threadId);\n const parent = thread?.parent ?? null;\n state.parentThreadId = parent;\n return parent;\n } catch {\n state.parentThreadId = null;\n return null;\n }\n }\n\n private static async executeSubagentMessageTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n const args = this.parseToolArguments(call.function.arguments);\n const referenceId = typeof args.referenceId === \"string\" ? args.referenceId : \"\";\n const message = typeof args.message === \"string\" ? args.message : \"\";\n const isLegacyTool = call.function.name === LEGACY_SEND_TO_AGENT_TOOL;\n const attachmentValue =\n args.attachments === undefined && isLegacyTool ? [] : args.attachments;\n\n if (!referenceId || !message) {\n return {\n status: \"error\",\n error: `${SUBAGENT_MESSAGE_TOOL} requires referenceId and message.`,\n };\n }\n if (!Array.isArray(attachmentValue)) {\n return {\n status: \"error\",\n error: `${SUBAGENT_MESSAGE_TOOL} requires attachments (use [] when none).`,\n };\n }\n\n const children = await this.getChildrenRegistry(state);\n const child = children.find((entry) => entry.reference === referenceId);\n if (!child || child.status === \"terminated\") {\n return {\n status: \"error\",\n error: `Subagent reference \"${referenceId}\" is not active.`,\n };\n }\n\n const childId = state.env.AGENT_BUILDER_THREAD.idFromName(referenceId);\n const childStub = state.env.AGENT_BUILDER_THREAD.get(childId) as unknown as DurableThread;\n if (typeof childStub.getTerminated === \"function\") {\n const terminated = await childStub.getTerminated(referenceId);\n if (terminated !== null) {\n await this.updateChildStatus(state, referenceId, \"terminated\");\n return {\n status: \"error\",\n error: `Subagent reference \"${referenceId}\" is not active.`,\n };\n }\n }\n\n const subagentConfig = this.resolveSubagentToolConfig(state, child.name);\n const receives =\n subagentConfig.resumable && typeof subagentConfig.resumable === \"object\"\n ? subagentConfig.resumable.receives_messages\n : \"side_a\";\n\n const routed = await this.routeMessageToChild(\n state,\n referenceId,\n message,\n receives,\n await this.resolveAttachmentRefsFromValue(state, attachmentValue)\n );\n if (routed.status === \"error\") {\n return routed;\n }\n\n await this.updateChildStatus(state, referenceId, \"running\");\n\n return {\n status: \"success\",\n result: `Message sent to subagent ${referenceId}.`,\n subagent_id: referenceId,\n };\n }\n\n private static async routeMessageToChild(\n state: FlowState,\n referenceId: string,\n messageContent: string,\n receivesMessages: \"side_a\" | \"side_b\",\n parentAttachments?: AttachmentRef[]\n ): Promise<ToolResult> {\n const childId = state.env.AGENT_BUILDER_THREAD.idFromName(referenceId);\n const childStub = state.env.AGENT_BUILDER_THREAD.get(childId) as unknown as DurableThread;\n\n const sourceAttachments = parentAttachments ?? await this.getLatestMessageAttachmentRefs(state);\n const copiedAttachments = await this.copyAttachmentsBetweenThreads(\n state.thread.instance as any,\n childStub as any,\n sourceAttachments,\n `from-parent-${state.threadId}`\n );\n\n await childStub.queueMessage(referenceId, {\n role: receivesMessages === \"side_a\" ? \"user\" : \"assistant\",\n content: messageContent,\n attachments: copiedAttachments,\n });\n\n return { status: \"success\", result: \"Routed message to existing instance.\" };\n }\n\n /**\n * Store tool result as a message in the database\n */\n private static async storeToolResult(\n call: ToolCall,\n result: ToolResult,\n state: FlowState,\n toolMessageId: string\n ): Promise<void> {\n try {\n // Import FlowEngine to access hook methods\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n\n // Run before_store_tool_result hook to allow modification of the result\n let processedResult = await FlowEngine.runBeforeStoreToolResultHook(\n state,\n call,\n result\n );\n\n // Use pre-generated message ID (generated before tool execution)\n const messageId = toolMessageId;\n\n // Handle attachments - separate new attachments (need storage) from existing refs\n let attachmentRefs: AttachmentRef[] | undefined;\n if (processedResult.attachments && processedResult.attachments.length > 0) {\n const newAttachments: ToolAttachment[] = [];\n const existingRefs: AttachmentRef[] = [];\n\n for (const item of processedResult.attachments) {\n if ('data' in item) {\n // ToolAttachment - has base64 data, needs to be stored\n newAttachments.push(item as ToolAttachment);\n } else {\n // AttachmentRef - already stored in filesystem\n existingRefs.push(item as AttachmentRef);\n }\n }\n\n attachmentRefs = existingRefs;\n if (newAttachments.length > 0) {\n const processedRefs = await this.processToolAttachments(newAttachments, state);\n attachmentRefs = [...attachmentRefs, ...processedRefs];\n }\n if (attachmentRefs.length === 0) {\n attachmentRefs = undefined;\n }\n }\n\n const side = state.currentSide;\n const stopBinding = getAgentSessionBinding(state.agentConfig, side, \"stop\");\n const failBinding = getAgentSessionBinding(state.agentConfig, side, \"fail\");\n const statusBinding = getAgentSessionBinding(state.agentConfig, side, \"status\");\n const matchedBinding =\n stopBinding.toolName === call.function.name\n ? stopBinding\n : failBinding.toolName === call.function.name\n ? failBinding\n : statusBinding.toolName === call.function.name\n ? statusBinding\n : null;\n const callArgs = this.sanitizeInternalToolArgs(\n this.parseToolArguments(call.function.arguments)\n );\n const mappedMessage = matchedBinding\n ? this.extractSessionMappedMessage(callArgs, matchedBinding.messageProperty)\n : null;\n\n if (processedResult.status === \"success\" && matchedBinding?.attachmentsProperty) {\n const mappedAttachmentValue = callArgs[matchedBinding.attachmentsProperty];\n if (mappedAttachmentValue !== undefined) {\n const explicitlyEmptyAttachmentArray =\n Array.isArray(mappedAttachmentValue) && mappedAttachmentValue.length === 0;\n if (!explicitlyEmptyAttachmentArray) {\n const candidatePaths = this.extractAttachmentPathCandidates(mappedAttachmentValue);\n const mappedRefs = await this.resolveAttachmentRefsFromValue(\n state,\n mappedAttachmentValue\n );\n const resolvedPaths = new Set(mappedRefs.map((ref) => ref.path));\n const missingPaths = candidatePaths.filter((path) => !resolvedPaths.has(path));\n\n if (candidatePaths.length === 0 || missingPaths.length > 0) {\n processedResult = {\n status: \"error\",\n error: this.buildMissingMappedAttachmentPathError(\n candidatePaths.length === 0 ? [\"(invalid attachment path value)\"] : missingPaths\n ),\n };\n attachmentRefs = undefined;\n } else {\n attachmentRefs = this.mergeAttachmentRefs(attachmentRefs, mappedRefs);\n }\n }\n }\n }\n\n // Normalize tool result into a string for storage in the messages table.\n // At this point, executeRuntimeTool has already flattened any structured\n // tool output (e.g. MCP content parts) into processedResult.result.\n let content: string;\n if (processedResult.status === \"success\") {\n content = mappedMessage || processedResult.result?.trim() || \"Tool executed successfully\";\n } else {\n const baseError =\n processedResult.error?.trim() ||\n \"Tool execution failed\";\n content = `Failed to execute tool: ${baseError}`;\n }\n\n const sessionStopToolName = stopBinding.toolName;\n const sessionFailToolName = failBinding.toolName;\n const shouldAppendAttachmentPaths =\n (!sessionStopToolName || call.function.name !== sessionStopToolName) &&\n (!sessionFailToolName || call.function.name !== sessionFailToolName);\n\n // Append attachment paths so the primary model can reference them.\n // End/fail session tools intentionally skip this so child-local paths do\n // not leak into parent-facing summaries.\n if (shouldAppendAttachmentPaths && attachmentRefs && attachmentRefs.length > 0) {\n const attachmentPaths = attachmentRefs\n .map(ref => `Attachment path for \"${ref.name}\": ${ref.path}`)\n .join('\\n');\n content += `\\n\\n${attachmentPaths}`;\n }\n\n // If this is a sub-prompt and the tool failed, check if parent wants errors prefixed\n if (state.parentMessageId !== undefined && processedResult.status === \"error\") {\n // Get parent tool config from context (passed when executing prompt tool)\n const parentToolConfig = state.context.__parentToolConfig as { includeErrors?: boolean } | undefined;\n\n // Check include_errors from parent tool config\n let includeErrors = true;\n if (parentToolConfig !== undefined && parentToolConfig !== null) {\n includeErrors = parentToolConfig.includeErrors ?? true;\n }\n\n // If include_errors is true and content doesn't already start with \"Error: \", prefix it\n if (includeErrors && !content.startsWith(\"Error: \")) {\n content = `Error: ${content}`;\n }\n }\n\n // Determine tool_status based on result status\n const toolStatus = processedResult.status === \"success\" ? \"success\" : \"error\";\n\n let message: Message = {\n id: messageId,\n role: \"tool\",\n content,\n name: call.function.name, // Tool name for provider-specific handling\n tool_call_id: call.id,\n created_at: 0, // Placeholder - will be set just before INSERT\n tool_status: toolStatus,\n parent_id: state.parentMessageId || null,\n depth: state.depth,\n attachments: attachmentRefs && attachmentRefs.length > 0\n ? JSON.stringify(attachmentRefs)\n : null,\n subagent_id:\n typeof processedResult.subagent_id === \"string\" &&\n processedResult.subagent_id.trim().length > 0\n ? processedResult.subagent_id.trim()\n : null,\n };\n\n // Run before_create_message hook\n message = await FlowEngine.runBeforeCreateMessageHook(state, message);\n\n // Set timestamp just before INSERT to ensure accurate ordering\n message.created_at = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Get current prompt name from promptPath\n const currentPrompt = state.promptPath.length > 0 ? state.promptPath[state.promptPath.length - 1] : null;\n\n // Insert message (now includes tool messages from sub-prompts)\n await state.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, name, tool_call_id, created_at, tool_status, parent_id, depth, attachments, subagent_id, prompt)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)\n `,\n message.id,\n message.role,\n message.content,\n message.name,\n message.tool_call_id,\n message.created_at,\n message.tool_status,\n message.parent_id,\n message.depth,\n message.attachments,\n message.subagent_id ?? null,\n currentPrompt\n );\n\n // Run after_create_message hook\n await FlowEngine.runAfterCreateMessageHook(state, message);\n\n // Update the parent log's tool_results field\n const parentLogId = state.currentLogId || null;\n if (parentLogId) {\n try {\n // Get current tool_results\n const result = await state.storage.sql.exec(\n `SELECT tool_results FROM logs WHERE id = ?1`,\n parentLogId\n );\n const rows = result.toArray();\n const currentToolResults = rows[0]?.tool_results;\n\n // Parse existing tool_results or create new array\n let toolResultsArray: Array<{\n tool_call_id: string;\n tool_name: string;\n content: string;\n status: string;\n timestamp: number;\n }> = [];\n\n if (currentToolResults) {\n try {\n toolResultsArray = JSON.parse(currentToolResults as string);\n } catch {\n // Ignore parse errors\n }\n }\n\n // Add new tool result\n toolResultsArray.push({\n tool_call_id: call.id,\n tool_name: call.function.name,\n content: String(message.content ?? \"\"),\n status: processedResult.status,\n timestamp: Date.now(),\n });\n\n // Update log with new tool_results\n await state.storage.sql.exec(\n `UPDATE logs SET tool_results = ?1 WHERE id = ?2`,\n JSON.stringify(toolResultsArray),\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n tool_results: JSON.stringify(toolResultsArray),\n },\n });\n }\n } catch (logError) {\n // Best-effort - don't fail if log update fails\n console.error(\"Failed to update log with tool result:\", logError);\n }\n }\n\n // Broadcast message via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n // Stream content if successful\n if (processedResult.status === \"success\" && processedResult.result) {\n state.stream.sendContent(`\\n[Tool: ${call.function.name}] ${processedResult.result}\\n`);\n }\n\n // Add to message history (always do this, even for child prompts - they need their own history)\n state.messageHistory.push(message);\n\n // Emit explicit silent path messages immediately for generated image outputs so\n // the opposite side can reliably reference exact attachment paths even if no\n // non-tool response follows this tool call sequence.\n await this.createSilentGeneratedAssetPathMessagesFromToolResult(\n state,\n message,\n attachmentRefs,\n shouldAppendAttachmentPaths\n );\n } catch (error) {\n console.error(\"Error storing tool result:\", error);\n // Log storage error to database\n await this.logError(state, error, `storeToolResult:${call.function.name}`);\n }\n }\n\n private static async createSilentGeneratedAssetPathMessagesFromToolResult(\n state: FlowState,\n sourceToolMessage: Message,\n refs: AttachmentRef[] | undefined,\n enabled: boolean\n ): Promise<void> {\n if (!enabled || !refs || refs.length === 0) {\n return;\n }\n\n const role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n const currentPrompt =\n state.promptPath.length > 0\n ? state.promptPath[state.promptPath.length - 1]\n : null;\n const parentId = sourceToolMessage.parent_id ?? state.parentMessageId ?? null;\n const depth = sourceToolMessage.depth ?? state.depth;\n\n const imageRefs = refs.filter((ref) => {\n const mimeType = ref.mimeType?.toLowerCase() ?? \"\";\n if (mimeType.startsWith(\"image/\")) {\n return true;\n }\n const path = ref.path.toLowerCase();\n return (\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".jpeg\") ||\n path.endsWith(\".webp\") ||\n path.endsWith(\".gif\") ||\n path.endsWith(\".bmp\") ||\n path.endsWith(\".svg\")\n );\n });\n\n if (imageRefs.length === 0) {\n return;\n }\n\n const seenPaths = new Set<string>();\n const existingPathMessages = new Set(\n state.messageHistory\n .filter(\n (message) =>\n message.silent === true &&\n message.role === role &&\n (message.parent_id ?? null) === parentId &&\n (message.depth ?? state.depth) === depth &&\n typeof message.content === \"string\" &&\n message.content.startsWith(\"Generated asset path: \")\n )\n .map((message) => message.content as string)\n );\n\n let sequenceOffset = 0;\n for (const ref of imageRefs) {\n if (!ref.path || seenPaths.has(ref.path)) {\n continue;\n }\n seenPaths.add(ref.path);\n\n const content = `Generated asset path: ${ref.path}`;\n if (existingPathMessages.has(content)) {\n continue;\n }\n existingPathMessages.add(content);\n\n const silentMessage: Message = {\n id: crypto.randomUUID(),\n role,\n content,\n attachments: JSON.stringify([ref]),\n silent: true,\n status: \"completed\",\n created_at: sourceToolMessage.created_at + sequenceOffset + 1,\n parent_id: parentId,\n depth,\n subagent_id: sourceToolMessage.subagent_id ?? null,\n };\n sequenceOffset += 1;\n\n await state.storage.sql.exec(\n `\n INSERT INTO messages (\n id, role, content, attachments, silent, created_at, status, parent_id, depth, subagent_id, prompt\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)\n `,\n silentMessage.id,\n silentMessage.role,\n silentMessage.content,\n silentMessage.attachments,\n 1,\n silentMessage.created_at,\n silentMessage.status,\n silentMessage.parent_id,\n silentMessage.depth,\n silentMessage.subagent_id ?? null,\n currentPrompt\n );\n\n state.messageHistory.push(silentMessage);\n if (state.emitMessage) {\n state.emitMessage(silentMessage);\n }\n }\n }\n\n /**\n * Process tool attachments and store them in the thread filesystem\n * Returns array of AttachmentRef objects for linking to the message\n */\n private static async processToolAttachments(\n attachments: ToolAttachment[],\n state: FlowState\n ): Promise<AttachmentRef[]> {\n // Lazy import to avoid circular dependencies\n const { FileStorage } = await import(\"../durable-objects/files.js\");\n const fs = new FileStorage(state.storage.sql);\n\n const refs: AttachmentRef[] = [];\n\n for (const attachment of attachments) {\n try {\n const attachmentId = crypto.randomUUID();\n const timestamp = Date.now();\n\n // Determine file extension from MIME type\n const ext = attachment.mimeType === \"image/png\" ? \"png\" :\n attachment.mimeType === \"image/jpeg\" ? \"jpg\" :\n attachment.mimeType === \"image/gif\" ? \"gif\" :\n attachment.mimeType === \"image/webp\" ? \"webp\" :\n attachment.name.split(\".\").pop() || \"bin\";\n\n const path = `/attachments/${timestamp}-${attachmentId}.${ext}`;\n\n // Decode base64 to binary\n const binaryString = atob(attachment.data);\n const dataBuffer = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n dataBuffer[i] = binaryString.charCodeAt(i);\n }\n\n // Write to filesystem (no processing - tool attachments bypass downsampling)\n // Convert Uint8Array to ArrayBuffer for writeFile\n await fs.writeFile(path, dataBuffer.buffer as ArrayBuffer, attachment.mimeType, {\n width: attachment.width,\n height: attachment.height,\n });\n\n // Create attachment reference\n const ref: AttachmentRef = {\n id: attachmentId,\n type: \"file\",\n path,\n name: attachment.name,\n mimeType: attachment.mimeType,\n size: dataBuffer.byteLength,\n };\n\n if (attachment.width) ref.width = attachment.width;\n if (attachment.height) ref.height = attachment.height;\n\n refs.push(ref);\n } catch (error) {\n console.error(`Failed to store tool attachment ${attachment.name}:`, error);\n // Continue with other attachments even if one fails\n }\n }\n\n return refs;\n }\n\n /**\n * Store tool error as a message in the database\n */\n private static async storeToolError(\n call: ToolCall,\n error: Error,\n state: FlowState\n ): Promise<void> {\n const toolMessageId = crypto.randomUUID();\n\n const result: ToolResult = {\n status: \"error\",\n error: error.message,\n };\n\n await this.storeToolResult(call, result, state, toolMessageId);\n }\n\n /**\n * Log tool execution error by updating the parent log (best-effort)\n * Instead of creating a new log entry, updates the parent LLM request log with the error\n */\n private static async logError(\n state: FlowState,\n error: unknown,\n toolName: string\n ): Promise<void> {\n try {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Get parent log ID from state if available\n const parentLogId = state.currentLogId || null;\n\n if (!parentLogId) {\n // No parent log to update, log to console only\n console.error(`Tool error (${toolName}):`, errorMessage);\n return;\n }\n\n // Format error with stack trace\n const fullError = `Tool \"${toolName}\" failed: ${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`;\n\n // Update the parent log with the error information\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n error = ?1,\n error_type = ?2\n WHERE id = ?3\n `,\n fullError,\n \"tool_execution_error\",\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n error: fullError,\n error_type: \"tool_execution_error\",\n },\n });\n }\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to update parent log with tool error:\", logError);\n }\n }\n\n /**\n * Validate arguments against a JSON Schema\n * Returns error message if invalid, null if valid\n */\n private static validateJsonSchema(\n data: any,\n schema: Record<string, any>\n ): string | null {\n // Basic JSON Schema validation\n // This is a simple implementation - for production, use a proper JSON Schema validator\n\n if (schema.type === \"object\" && schema.properties) {\n // Check required fields\n if (schema.required && Array.isArray(schema.required)) {\n for (const field of schema.required) {\n if (!(field in data)) {\n return `Missing required field: ${field}`;\n }\n }\n }\n\n // Validate each property\n for (const [key, propSchema] of Object.entries(\n schema.properties as Record<string, any>\n )) {\n if (key in data) {\n const value = data[key];\n const expectedType = propSchema.type;\n\n // Type checking\n if (expectedType === \"string\" && typeof value !== \"string\") {\n return `Field ${key} must be a string`;\n }\n if (expectedType === \"number\" && typeof value !== \"number\") {\n return `Field ${key} must be a number`;\n }\n if (expectedType === \"boolean\" && typeof value !== \"boolean\") {\n return `Field ${key} must be a boolean`;\n }\n if (expectedType === \"array\" && !Array.isArray(value)) {\n return `Field ${key} must be an array`;\n }\n if (\n expectedType === \"object\" &&\n (typeof value !== \"object\" || value === null)\n ) {\n return `Field ${key} must be an object`;\n }\n }\n }\n }\n\n return null; // Valid\n }\n\n /**\n * Interpolate prompt segments with arguments\n * Replaces variable segments with their values from args\n * Converts segments array to final string prompt\n */\n private static async interpolatePrompt(\n promptJson: string,\n args: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n try {\n const segments = JSON.parse(promptJson) as Array<{\n type: string;\n value?: string;\n id?: string;\n label?: string;\n }>;\n\n const results: string[] = [];\n\n for (const segment of segments) {\n if (segment.type === \"string\") {\n // Regular string segment - add as-is\n results.push(segment.value || \"\");\n } else if (segment.type === \"variable\") {\n // Variable segment - replace with value from args\n const variableValue = args[segment.value || \"\"];\n if (variableValue !== undefined) {\n results.push(\n typeof variableValue === \"string\"\n ? variableValue\n : JSON.stringify(variableValue)\n );\n } else {\n // Variable not provided in args - keep placeholder or skip\n results.push(`{{${segment.value}}}`);\n }\n } else if (segment.type === \"prompt\") {\n // Load and interpolate referenced prompt from TypeScript config\n try {\n const promptName = segment.id;\n const promptDef = await state.thread.instance.loadPrompt(promptName!);\n\n if (!promptDef) {\n console.warn(`Referenced prompt not found: ${promptName}`);\n results.push(`[Prompt not found: ${segment.label || promptName}]`);\n } else {\n // For TypeScript-defined prompts, the prompt is a plain string\n // (not JSON segments like the old D1 format)\n // Recursively interpolate variables in the prompt string\n let promptText = promptDef.prompt;\n\n // Replace {{variable}} patterns with args values\n promptText = promptText.replace(/\\{\\{(\\w+)\\}\\}/g, (match: string, varName: string) => {\n const value = args[varName];\n if (value !== undefined) {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n return match; // Keep placeholder if not in args\n });\n\n results.push(promptText);\n }\n } catch (error) {\n console.error(`Error loading prompt ${segment.id}:`, error);\n results.push(`[Error loading prompt: ${segment.label || segment.id}]`);\n }\n }\n }\n\n return results.join(\"\");\n } catch (error) {\n // If parsing fails, treat as plain string\n console.error(\"Error parsing prompt segments:\", error);\n return promptJson;\n }\n }\n\n /**\n * Remove a tool call from message history and database\n * This is called when a hook returns null to completely remove the tool call\n */\n private static async removeToolCallFromHistory(\n call: ToolCall,\n state: FlowState\n ): Promise<void> {\n try {\n // Find the message containing this tool call in the message history\n const messageIndex = state.messageHistory.findIndex(\n (msg) => {\n if (!msg.tool_calls) return false;\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n return toolCalls.some((tc: ToolCall) => tc.id === call.id);\n } catch {\n return false;\n }\n }\n );\n\n if (messageIndex === -1) {\n console.warn(`[ToolExecutor] Could not find message containing tool call ${call.id}`);\n return;\n }\n\n const message = state.messageHistory[messageIndex];\n const toolCalls = JSON.parse(message.tool_calls!);\n\n // If this message has only one tool call, delete the entire message\n if (toolCalls.length === 1) {\n // Remove from message history\n state.messageHistory.splice(messageIndex, 1);\n\n // Remove from database (now includes sub-prompts)\n await state.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n message.id\n );\n\n } else {\n // If multiple tool calls, just remove this one from the tool_calls array\n const updatedToolCalls = toolCalls.filter((tc: ToolCall) => tc.id !== call.id);\n message.tool_calls = JSON.stringify(updatedToolCalls);\n\n // Update in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `UPDATE messages SET tool_calls = ? WHERE id = ?`,\n message.tool_calls,\n message.id\n );\n\n }\n } catch (error) {\n console.error(`[ToolExecutor] Error removing tool call from history:`, error);\n }\n }\n}\n","/**\n * Context Management for Image Attachments\n *\n * Handles auto-summarization of old images to reduce context window usage\n * while preserving the semantic meaning of image content.\n */\n\nimport type { FlowState, Message, MessageContent, AttachmentRef } from \"./types\";\n\n/**\n * Configuration for image context management\n */\nexport interface ImageContextConfig {\n /** Number of recent messages to keep images for (default: 10) */\n recentMessageThreshold: number;\n /** System prompt for generating image descriptions */\n descriptionPrompt: string;\n}\n\nconst DEFAULT_CONFIG: ImageContextConfig = {\n recentMessageThreshold: 10,\n descriptionPrompt:\n \"Describe this image concisely in 1-2 sentences, focusing on the key visual elements and any text visible.\",\n};\n\n/**\n * Check if a message has image attachments that could be summarized\n */\nexport function hasImageAttachments(message: Message): boolean {\n if (!message.attachments) return false;\n\n try {\n const attachments: AttachmentRef[] =\n typeof message.attachments === \"string\"\n ? JSON.parse(message.attachments)\n : message.attachments;\n\n return attachments.some((att) => att.mimeType.startsWith(\"image/\"));\n } catch {\n return false;\n }\n}\n\n/**\n * Get image attachments from a message that don't have descriptions yet\n */\nexport function getUnsummarizedImageAttachments(\n message: Message\n): AttachmentRef[] {\n if (!message.attachments) return [];\n\n try {\n const attachments: AttachmentRef[] =\n typeof message.attachments === \"string\"\n ? JSON.parse(message.attachments)\n : message.attachments;\n\n return attachments.filter(\n (att) => att.mimeType.startsWith(\"image/\") && !att.description\n );\n } catch {\n return [];\n }\n}\n\n/**\n * Determine which messages should have their images replaced with descriptions.\n * Returns indices of messages that are old enough to be summarized.\n */\nexport function getMessagesToSummarize(\n messages: Message[],\n config: ImageContextConfig = DEFAULT_CONFIG\n): number[] {\n const indices: number[] = [];\n const threshold = messages.length - config.recentMessageThreshold;\n\n for (let i = 0; i < threshold; i++) {\n const msg = messages[i];\n if (msg.role === \"user\" && hasImageAttachments(msg)) {\n indices.push(i);\n }\n }\n\n return indices;\n}\n\n/**\n * Build text representation for an image attachment (used when image is too old)\n */\nexport function buildImageDescription(attachment: AttachmentRef): string {\n if (attachment.description) {\n return `[Image: ${attachment.name}] ${attachment.description}`;\n }\n\n // Fallback for images without descriptions\n const dimensions =\n attachment.width && attachment.height\n ? ` (${attachment.width}x${attachment.height})`\n : \"\";\n return `[Image: ${attachment.name}${dimensions}]`;\n}\n\n/**\n * Transform message content to replace old images with text descriptions.\n * This modifies the content array for LLM context building.\n */\nexport function replaceImagesWithDescriptions(\n content: MessageContent,\n attachments: AttachmentRef[]\n): MessageContent {\n // If content is a string, prepend image descriptions\n if (typeof content === \"string\") {\n const imageDescriptions = attachments\n .filter((att) => att.mimeType.startsWith(\"image/\"))\n .map(buildImageDescription)\n .join(\"\\n\");\n\n if (!imageDescriptions) return content;\n if (!content) return imageDescriptions;\n return `${imageDescriptions}\\n\\n${content}`;\n }\n\n // If content is multimodal array, filter out image parts and add descriptions\n const textParts = content.filter((part) => part.type === \"text\");\n const imageAttachments = attachments.filter((att) =>\n att.mimeType.startsWith(\"image/\")\n );\n\n if (imageAttachments.length === 0) {\n return content;\n }\n\n const imageDescriptions = imageAttachments.map(buildImageDescription).join(\"\\n\");\n\n // Combine descriptions with existing text\n if (textParts.length > 0) {\n const existingText = textParts.map((p) => p.text).join(\" \");\n return `${imageDescriptions}\\n\\n${existingText}`;\n }\n\n return imageDescriptions;\n}\n\n/**\n * Process message history to optimize context window usage.\n * Old images are replaced with their text descriptions.\n *\n * @param messages - Full message history\n * @param config - Context management configuration\n * @returns Processed messages with old images replaced by descriptions\n */\nexport function optimizeImageContext(\n messages: Message[],\n config: ImageContextConfig = DEFAULT_CONFIG\n): Message[] {\n const messagesToSummarize = getMessagesToSummarize(messages, config);\n\n if (messagesToSummarize.length === 0) {\n return messages;\n }\n\n return messages.map((msg, index) => {\n if (!messagesToSummarize.includes(index)) {\n return msg;\n }\n\n // Parse attachments\n let attachments: AttachmentRef[];\n try {\n attachments =\n typeof msg.attachments === \"string\"\n ? JSON.parse(msg.attachments)\n : msg.attachments || [];\n } catch {\n return msg;\n }\n\n // Replace images with descriptions in content\n const optimizedContent = replaceImagesWithDescriptions(\n msg.content || \"\",\n attachments\n );\n\n // Return modified message without image attachments for LLM context\n return {\n ...msg,\n content:\n typeof optimizedContent === \"string\"\n ? optimizedContent\n : JSON.stringify(optimizedContent),\n // Clear attachments since we've inlined descriptions\n attachments: JSON.stringify(\n attachments.filter((att) => !att.mimeType.startsWith(\"image/\"))\n ),\n };\n });\n}\n\n/**\n * Generate a description for an image using a vision model.\n * This should be called when storing new messages with images.\n *\n * Note: This function is a placeholder for the actual LLM call.\n * The actual implementation would need to make an API call to a vision model.\n *\n * @param imageBase64 - Base64-encoded image data\n * @param mimeType - MIME type of the image\n * @param state - Flow state for LLM access\n * @returns Generated description\n */\nexport async function generateImageDescription(\n _imageBase64: string,\n _mimeType: string,\n _state: FlowState\n): Promise<string | null> {\n // TODO: Implement actual vision model call\n // This would require:\n // 1. Getting a vision-capable model from the prompt/agent config\n // 2. Making a one-off LLM call with the image\n // 3. Returning the description\n //\n // For now, return null to indicate no description was generated.\n // Images will use their filename as a fallback description.\n return null;\n}\n","import type {\n Agent,\n FlowState,\n FlowResult,\n Message,\n RequestContext,\n ThreadInstance,\n ThreadMetadata,\n ToolCall,\n ToolResult,\n Env,\n AttachmentRef,\n MessageContent,\n MultimodalContent,\n LLMResponseImage,\n LLMResponse,\n AnyLoadedHook,\n HookExecutor,\n SubagentToolConfig,\n SubpromptConfig,\n PromptToolConfig,\n} from \"./types\";\nimport { MAX_STEPS, TIMESTAMP_MULTIPLIER } from \"./types\";\nimport type { HookName, SubagentRegistryEntry } from \"@standardagents/spec\";\nimport { StreamManager } from \"./StreamManager\";\nimport { LLMRequest } from \"./LLMRequest\";\nimport { ToolExecutor } from \"./ToolExecutor\";\nimport { buildImageDescription } from \"./context\";\nimport {\n getAgentSessionBinding,\n getResolvedSessionBindingsFromSide,\n} from \"./sessionTools\";\nimport { ThreadStateImpl } from \"./ThreadStateImpl.js\";\nimport type { DurableObjectStorage } from \"@cloudflare/workers-types\";\nimport type { ProviderAttachment } from \"@standardagents/spec\";\nimport { z } from \"zod\";\n\ntype PromptSubagentDescriptor = {\n name: string;\n title: string;\n description: string;\n blocking: boolean;\n resumable: boolean;\n maxInstances?: number;\n};\n\ntype ImmediateSubagentOptions = Exclude<\n SubagentToolConfig[\"immediate\"],\n boolean | undefined\n>;\n\ntype ImmediateScopedEnvInstance = {\n scopedEnv: Record<string, string>;\n unsafeName?: string;\n unsafeDescription?: string;\n};\n\nconst IMMEDIATE_BOOTSTRAP_TOOL_NAME = \"bootstrap_immediate_subagent\";\n\n/**\n * Core orchestration engine for agent execution\n * Manages the main agentic loop with step-based execution\n */\nexport class FlowEngine {\n private static readonly IMMEDIATE_SCOPED_ENV_CONTEXT_KEY =\n \"__immediate_scoped_env_by_call_id\";\n\n /**\n * Main execution entry point\n * Executes an agent conversation until stopped or max steps reached\n *\n * By default, returns immediately with the stream while execution continues in background.\n * Set awaitCompletion: true to wait for all steps and database writes to complete (required for sub-prompts).\n *\n * @param stateInput - Partial FlowState object with required fields\n * @param awaitCompletion - If true, awaits full execution completion before returning (default: false)\n */\n static async execute(\n stateInput: Partial<FlowState> & {\n agentConfig: Agent;\n storage: DurableObjectStorage;\n env: Env;\n threadId: string;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n },\n awaitCompletion: boolean = false\n ): Promise<FlowResult> {\n // Initialize state from partial input\n // All optional properties (emitLog, parentLogId, etc.) are now in FlowState interface\n const state = await this.initializeState(stateInput);\n\n if (awaitCompletion) {\n // Wait for execution to complete (for sub-prompts to ensure serial execution)\n try {\n await this.executeAsync(state, state.threadId);\n } catch (error) {\n console.error(\"Fatal error in executeAsync:\", error);\n await this.logError(state, error, \"fatal_execution_error\", \"FlowEngine.executeAsync\");\n throw error; // Re-throw for caller to handle\n }\n } else {\n // Start execution in background (default behavior for top-level execution)\n this.executeAsync(state, state.threadId).catch(async (error) => {\n console.error(\"Fatal error in executeAsync:\", error);\n await this.logError(state, error, \"fatal_execution_error\", \"FlowEngine.executeAsync\");\n });\n }\n\n // Return immediately with the stream\n return {\n messages: state.messageHistory,\n stopped: state.stopped,\n stoppedBy: state.stoppedBy,\n stopReason: state.stopReason,\n stopReasonCode: state.stopReasonCode,\n stepCount: state.stepCount,\n stream: state.stream.httpStream,\n };\n }\n\n /**\n * Execute the agentic loop asynchronously\n * This runs in the background while the stream is being consumed\n */\n private static async executeAsync(\n state: FlowState,\n threadId: string\n ): Promise<void> {\n // Main agentic loop\n while (state.stepCount < MAX_STEPS && !state.stopped && !state.abortController?.signal.aborted) {\n\n try {\n // Check if abort was requested\n if (state.abortController?.signal.aborted) {\n // Create a system message to indicate interruption\n const interruptionMessageId = crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Run before hook\n let interruptionMessage: Message = {\n id: interruptionMessageId,\n role: \"system\",\n content: \"Execution stopped by user\",\n created_at: timestamp,\n status: \"completed\",\n };\n\n interruptionMessage = await this.runBeforeCreateMessageHook(state, interruptionMessage);\n\n // Get current prompt name from promptPath\n const currentPromptName = state.promptPath.length > 0 ? state.promptPath[state.promptPath.length - 1] : null;\n\n await state.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, status, prompt) VALUES (?, ?, ?, ?, ?, ?)`,\n interruptionMessage.id,\n interruptionMessage.role,\n interruptionMessage.content,\n interruptionMessage.created_at,\n interruptionMessage.status,\n currentPromptName\n );\n\n // Run after hook\n await this.runAfterCreateMessageHook(state, interruptionMessage);\n\n // Broadcast the interruption message\n if (state.emitMessage) {\n state.emitMessage({\n id: interruptionMessage.id,\n role: interruptionMessage.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: interruptionMessage.content,\n created_at: interruptionMessage.created_at,\n status: interruptionMessage.status,\n });\n }\n\n state.emitTelemetry?.({\n type: \"stopped_by_user\",\n timestamp: Date.now(),\n });\n state.stopped = true;\n state.stopReason = \"Execution stopped by user\";\n state.stopReasonCode = \"aborted_by_user\";\n break;\n }\n\n await this.executeStep(state);\n state.stepCount++;\n\n\n // Sub-prompts execute as one-shot: make one LLM request, execute tools, return\n // Don't play multiple turns even if tools fail\n // Check if this is a sub-prompt by presence of parentMessageId\n if (state.parentMessageId !== undefined) {\n state.stopped = true;\n break;\n }\n } catch (error) {\n // Check if this is an abort error\n const isAbortError = error instanceof Error &&\n (error.name === \"AbortError\" || error.message.includes(\"aborted\"));\n\n if (isAbortError) {\n // Interruption message already created by stop() method\n state.stopped = true;\n state.stopReason = state.stopReason || \"Execution aborted\";\n state.stopReasonCode = state.stopReasonCode || \"aborted\";\n break;\n }\n\n // Handle other errors\n console.error(`Error in step ${state.stepCount}:`, error);\n\n // Log error to database\n await this.logError(\n state,\n error,\n \"step_execution_error\",\n `Step ${state.stepCount}, Side ${state.currentSide}`\n );\n\n // Send error message to HTTP stream\n const errorMessage = error instanceof Error ? error.message : String(error);\n state.stream.sendContent(`\\n\\n[ERROR] ${errorMessage}\\n`);\n\n // Send error telemetry\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Error: ${errorMessage}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n // Stop execution on fatal error\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n state.stopReason = `Error: ${errorMessage}`;\n state.stopReasonCode = \"step_error\";\n break;\n }\n }\n\n // Check if we hit max steps\n if (state.stepCount >= MAX_STEPS && !state.stopped) {\n console.warn(`Thread ${threadId} reached maximum steps (${MAX_STEPS})`);\n\n // Log to database\n await this.logError(\n state,\n new Error(`Thread reached maximum steps (${MAX_STEPS})`),\n \"max_steps_reached\",\n `Thread ${threadId}`\n );\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Maximum steps reached\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n state.stopReason = `Maximum steps reached (${MAX_STEPS})`;\n state.stopReasonCode = \"max_total_steps\";\n }\n\n // Wait for any pending async metadata fetches to complete\n // This ensures the DO stays alive until all background work is done\n if (state.pendingMetadataPromises && state.pendingMetadataPromises.length > 0) {\n await Promise.allSettled(state.pendingMetadataPromises);\n }\n\n // Close streams\n await state.stream.close();\n }\n\n /**\n * Convert a PromptDefinition (from definePrompt) to PromptData (runtime format).\n */\n static convertPromptDefinition(id: string, def: any): import(\"./types\").PromptData {\n return {\n id,\n name: def.name,\n tool_description: def.toolDescription,\n prompt: def.prompt,\n model: def.model,\n include_chat: def.includeChat ?? false,\n include_past_tools: def.includePastTools ?? false,\n parallel_tool_calls: def.parallelToolCalls ?? false,\n tool_choice: def.toolChoice ?? 'auto',\n reasoning_effort: def.reasoning?.effort ?? null,\n reasoning_max_tokens: def.reasoning?.maxTokens ?? null,\n reasoning_exclude: def.reasoning?.exclude ?? false,\n include_reasoning: def.reasoning?.include ?? false,\n recentImageThreshold: def.recentImageThreshold ?? null,\n _tools: def.tools ?? [],\n _variables: def.variables ?? [],\n _env: def.env ?? def.tenvs ?? {},\n _requiredSchema: def.requiredSchema ?? null,\n _hooks: def.hooks ?? [],\n } as import(\"./types\").PromptData;\n }\n\n /**\n * Load prompts from TypeScript configs via virtual modules.\n *\n * Agent config is already loaded by DurableThread, so we just need to\n * load the referenced prompts.\n */\n private static async loadAgentAndPrompts(\n agentConfig: Agent,\n thread: { instance: ThreadInstance; metadata: ThreadMetadata }\n ): Promise<{\n agentConfig: Agent;\n sideAPrompt: import(\"./types\").PromptData;\n sideBPrompt: import(\"./types\").PromptData | null;\n }> {\n // Load side A prompt (always required)\n const sideAPromptName = agentConfig.side_a_agent_prompt;\n if (!sideAPromptName) {\n throw new Error(`Agent ${agentConfig.title} missing side_a_agent_prompt`);\n }\n\n const sideAPromptDef = await thread.instance.loadPrompt(sideAPromptName);\n\n // Log prompt loading with package info\n const sideAPackageId = sideAPromptDef.__package?.packageId;\n console.log(`[FlowEngine] Loaded prompt: ${sideAPromptName}${sideAPackageId ? ` (package: ${sideAPackageId})` : ' (global)'}`);\n if (sideAPromptDef.tools?.length) {\n console.log(`[FlowEngine] Prompt tools: [${sideAPromptDef.tools.map((t: any) => typeof t === 'string' ? t : t.name).join(', ')}]`);\n }\n\n // Convert PromptDefinition to PromptData format expected by runtime\n const sideAPrompt = FlowEngine.convertPromptDefinition(sideAPromptName, sideAPromptDef);\n\n // Load side B prompt (only for dual_ai agents)\n let sideBPrompt: import(\"./types\").PromptData | null = null;\n const sideBPromptName = agentConfig.side_b_agent_prompt;\n if (sideBPromptName) {\n const sideBPromptDef = await thread.instance.loadPrompt(sideBPromptName);\n\n // Log prompt loading with package info\n const sideBPackageId = sideBPromptDef.__package?.packageId;\n console.log(`[FlowEngine] Loaded prompt: ${sideBPromptName}${sideBPackageId ? ` (package: ${sideBPackageId})` : ' (global)'}`);\n if (sideBPromptDef.tools?.length) {\n console.log(`[FlowEngine] Prompt tools: [${sideBPromptDef.tools.map((t: any) => typeof t === 'string' ? t : t.name).join(', ')}]`);\n }\n\n sideBPrompt = FlowEngine.convertPromptDefinition(sideBPromptName, sideBPromptDef);\n }\n\n return { agentConfig, sideAPrompt, sideBPrompt };\n }\n\n /**\n * Initialize the flow state from partial input\n * Merges provided fields with defaults and loaded data\n */\n private static async initializeState(\n stateInput: Partial<FlowState> & {\n agentConfig: Agent;\n storage: DurableObjectStorage;\n env: Env;\n threadId: string;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n }\n ): Promise<FlowState> {\n // Load prompts for the provided agent config via virtual modules\n const { sideAPrompt, sideBPrompt } = await this.loadAgentAndPrompts(\n stateInput.agentConfig,\n stateInput.thread\n );\n\n // Create stream manager if not provided\n const stream = stateInput.stream || new StreamManager();\n\n // Build complete state with defaults\n const state: Omit<FlowState, 'rootState'> & { rootState?: FlowState } = {\n threadId: stateInput.threadId,\n flowId: stateInput.flowId || crypto.randomUUID(),\n thread: stateInput.thread,\n agentConfig: stateInput.agentConfig,\n currentSide: stateInput.currentSide || \"a\",\n prompts: {\n sideA: sideAPrompt,\n sideB: sideBPrompt,\n },\n prompt: (stateInput.currentSide || \"a\") === \"a\" ? sideAPrompt : (sideBPrompt || sideAPrompt),\n stepCount: stateInput.stepCount || 0,\n sideAStepCount: stateInput.sideAStepCount || 0,\n sideBStepCount: stateInput.sideBStepCount || 0,\n stopped: stateInput.stopped || false,\n stoppedBy: stateInput.stoppedBy,\n stopReason: stateInput.stopReason,\n stopReasonCode: stateInput.stopReasonCode,\n messageHistory: [],\n sequence: stateInput.sequence || {\n queue: [],\n queuedTools: [],\n isHandling: false,\n },\n active: stateInput.active || {\n tool: \"\",\n args: {},\n retries: 0,\n reasons: [],\n },\n queue: stateInput.queue || [],\n stream,\n context: stateInput.context || {},\n retryCount: stateInput.retryCount || 0,\n retryReason: stateInput.retryReason,\n storage: stateInput.storage,\n env: stateInput.env,\n // Preserve runtime properties for nested execution and telemetry\n emitLog: stateInput.emitLog,\n emitMessage: stateInput.emitMessage,\n emitMessageChunk: stateInput.emitMessageChunk,\n emitTelemetry: stateInput.emitTelemetry,\n emitEvent: stateInput.emitEvent,\n rootMessageId: stateInput.rootMessageId,\n parentLogId: stateInput.parentLogId,\n currentLogId: stateInput.currentLogId,\n parentMessageId: stateInput.parentMessageId,\n depth: stateInput.depth ?? 0, // Default to 0 for top-level prompts\n // Initialize promptPath from input or create new path with current prompt name\n promptPath: stateInput.promptPath ?? [sideAPrompt.name],\n pendingMessageId: stateInput.pendingMessageId,\n abortController: stateInput.abortController,\n allowedTools: stateInput.allowedTools,\n extraMessages: stateInput.extraMessages || [],\n // Namespace context for packing isolation\n // Inherit from stateInput or default to global\n namespaceContext: stateInput.namespaceContext ?? { type: 'global' },\n // Tool uses restriction (set during tool execution)\n currentToolUses: stateInput.currentToolUses,\n immediatePromptRuns: stateInput.immediatePromptRuns ?? new Set<string>(),\n pendingImmediateAfterHandoff: stateInput.pendingImmediateAfterHandoff ?? false,\n };\n if (stateInput.rootState) {\n state.rootState = stateInput.rootState;\n } else {\n state.rootState = state as unknown as FlowState;\n }\n return state as FlowState;\n }\n\n /**\n * Execute a single step\n */\n private static async executeStep(state: FlowState): Promise<void> {\n // Check the persistent stop flag from DurableThread (most reliable)\n if (await state.thread.instance.shouldStop()) {\n throw new Error(\"aborted\");\n }\n\n // Check abort signal before starting turn\n if (state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // Inject queued messages before each LLM step.\n // If queued messages force a side, apply it before step-budget checks.\n const queuedMessages = await this.processQueuedMessages(state);\n if (queuedMessages) {\n state.rootMessageId = queuedMessages.rootMessageId;\n state.currentSide = queuedMessages.forcedSide;\n state.prompt =\n queuedMessages.forcedSide === \"b\" && state.prompts.sideB\n ? state.prompts.sideB\n : state.prompts.sideA;\n state.stopped = false;\n state.stoppedBy = undefined;\n state.stopReason = undefined;\n state.stopReasonCode = undefined;\n }\n\n const ranImmediateTools = await this.runImmediateToolsIfNeeded(state);\n if (ranImmediateTools) {\n return;\n }\n\n // Check per-side max steps before executing\n const maxSteps = state.currentSide === \"a\"\n ? state.agentConfig.side_a_max_steps\n : state.agentConfig.side_b_max_steps;\n\n const currentSideStepCount = state.currentSide === \"a\"\n ? state.sideAStepCount\n : state.sideBStepCount;\n\n if (typeof maxSteps === 'number' && currentSideStepCount >= maxSteps) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n state.stopReason = `Side ${state.currentSide} reached max steps (${maxSteps})`;\n state.stopReasonCode = \"max_side_steps\";\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Side ${state.currentSide} reached max steps (${maxSteps})`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n\n // Check max_session_turns for dual_ai agents (global exchange limit)\n if (\n state.agentConfig.type === \"dual_ai\" &&\n typeof state.agentConfig.max_session_turns === 'number'\n ) {\n // Calculate completed exchanges (both sides must have spoken for a complete exchange)\n const completedExchanges = Math.min(state.sideAStepCount, state.sideBStepCount);\n\n if (completedExchanges >= state.agentConfig.max_session_turns) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n state.stopReason = `Reached max session turns (${state.agentConfig.max_session_turns} exchanges)`;\n state.stopReasonCode = \"max_session_turns\";\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: state.stopReason,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n }\n\n // Increment per-side step count\n if (state.currentSide === \"a\") {\n state.sideAStepCount++;\n } else {\n state.sideBStepCount++;\n }\n\n // Send step started telemetry\n state.emitTelemetry?.({\n type: \"step_started\",\n step: state.stepCount,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n state.messageHistory = await this.loadMessageHistory(state);\n\n // 1. Assemble context for this turn\n const context = await this.assembleContext(state);\n\n // Store allowed tools in state for validation during tool execution\n state.allowedTools = context.tools;\n\n // 1.25. Run prefilter hook on messages (if it exists)\n // This allows developers to modify the message history before sending to LLM\n // The filtered messages will be logged, so devs can see what was actually sent\n context.messages = await this.runPrefilterLLMHistoryHook(state, context.messages);\n\n // 1.5. Create pending message BEFORE LLM request\n const pendingMessageId = await this.createPendingMessage(state);\n\n // Store pending message ID for streaming chunk broadcasts\n state.pendingMessageId = pendingMessageId;\n\n // 2. Execute LLM request with retry/fallback logic\n let responseStatus: \"completed\" | \"failed\" = \"completed\";\n let response: LLMResponse;\n let logId: string;\n\n try {\n const result = await LLMRequest.execute(context, state);\n response = result.response;\n logId = result.logId;\n } catch (error) {\n // LLM request failed - update pending message to failed status\n responseStatus = \"failed\";\n await this.updateMessageStatus(pendingMessageId, \"failed\", state);\n throw error; // Re-throw to be handled by executeAsync\n }\n\n // Check stop flag BEFORE storing response - discard if stopped\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n\n // Delete the pending message - don't store the response\n await state.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n pendingMessageId\n );\n\n // Mark log as interrupted\n await state.storage.sql.exec(\n `UPDATE logs SET error = ?, error_type = ? WHERE id = ?`,\n \"Interrupted by user\",\n \"user_interrupted\",\n logId\n );\n\n throw new Error(\"aborted\");\n }\n\n // Store the log ID for tool error tracking\n state.currentLogId = logId;\n\n // 2.5. Check for stop-tool with response parameter and extract it as content\n this.extractStopToolResponse(state, response);\n\n // 2.75. Process provider-executed tool results (e.g., OpenAI's image_generation)\n // This creates synthetic tool calls and stores results as tool messages BEFORE updateMessage\n // so that the assistant message includes the tool_calls reference\n await this.processProviderToolResults(response, state, pendingMessageId);\n await this.injectEmptyAssistantResponseError(\n response,\n state,\n pendingMessageId\n );\n\n // 3. Update pending message with response\n await this.updateMessage(pendingMessageId, response, responseStatus, state);\n\n // 4. Execute tools if present (excludes provider-executed tools which are already handled)\n // Filter out provider-executed tools - they were already handled in processProviderToolResults\n const toolsToExecute = response.tool_calls?.filter(tc => {\n // Check if this tool call was already handled as a provider tool result\n // Provider tool results have their tool messages already created\n const hasExistingResult = state.messageHistory.some(\n msg => msg.role === \"tool\" && msg.tool_call_id === tc.id\n );\n return !hasExistingResult;\n });\n\n // Execute tools from LLM response AND any tools queued via queueTool()\n // The queue may have tools added by hooks or native tools that need processing\n if ((toolsToExecute && toolsToExecute.length > 0) || state.sequence.queue.length > 0) {\n await ToolExecutor.executeSequence(state, toolsToExecute || []);\n }\n\n // Save queued_tools to log AFTER tool execution completes\n // This captures tools queued via state.queueTool() during native tool execution\n if (state.sequence.queuedTools.length > 0 && state.currentLogId) {\n const queuedToolsJson = JSON.stringify(state.sequence.queuedTools);\n await state.storage.sql.exec(\n `UPDATE logs SET queued_tools = ?1 WHERE id = ?2`,\n queuedToolsJson,\n state.currentLogId\n );\n\n // Broadcast the queued_tools update via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: \"log_queued_tools\",\n log_id: state.currentLogId,\n queued_tools: queuedToolsJson,\n });\n }\n\n state.sequence.queuedTools = []; // Reset after saving\n }\n\n // Check stop flag and abort signal after tool execution\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // 5. Check stop condition\n const stopCondition = this.checkStopCondition(state, response);\n\n // Clear the log ID and pending message ID after turn is complete\n state.currentLogId = null;\n state.pendingMessageId = undefined;\n\n // 5.25. Handle pending agent handoff (if any)\n // IMPORTANT: Check handoff BEFORE forcedNextSide because:\n // - Agent handoffs change the entire agent context\n // - forceTurn after a handoff should apply to the NEW agent\n // - If we check forcedNextSide first, the handoff is skipped due to early return\n if (state.pendingHandoff) {\n // If there's also a pending force turn, preserve it for after the handoff\n // The forcedNextSide will be applied in the next iteration after the new agent loads\n await this.executeHandoff(state);\n // After handoff, continue loop - new agent will execute immediately\n // Do NOT switch sides or increment turn count - handoff doesn't count as a turn\n return;\n }\n\n // 5.5. Handle forced turn if set\n if (state.forcedNextSide) {\n const forcedSide = state.forcedNextSide.substring(5) as 'a' | 'b';\n\n // Special case: forcing side_b in ai_human agent means wait for human input\n if (state.agentConfig.type === \"ai_human\" && forcedSide === \"b\") {\n state.stopped = true;\n state.stoppedBy = \"a\"; // AI stopped to let human respond\n state.stopReason = \"Forced turn to human (side_b)\";\n state.stopReasonCode = \"forced_human_turn\";\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: state.stopReason,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n // Force current side to continue (override stop condition)\n else if (forcedSide === state.currentSide) {\n state.stopped = false; // Clear any stop flag\n state.stoppedBy = undefined;\n }\n // Force switch to other side\n else {\n state.currentSide = forcedSide; // Override normal switching\n state.stopped = false; // Ensure we continue execution\n\n // Update prompt reference to match forced side\n if (state.currentSide === \"b\" && state.prompts.sideB) {\n state.prompt = state.prompts.sideB;\n } else {\n state.prompt = state.prompts.sideA;\n }\n }\n\n // Clear the forced turn flag after applying it\n state.forcedNextSide = undefined;\n\n // Return early to skip normal side switching logic\n return;\n }\n\n // Check abort signal before switching sides (critical to prevent next turn)\n if (state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // 6. Switch sides if dual_ai and not stopped.\n // For dual_ai, a side can keep executing until its configured stop condition\n // is satisfied. If no side stop conditions are configured, preserve legacy\n // behavior by switching after each step.\n if (state.agentConfig.type === \"dual_ai\" && !state.stopped) {\n const hasTurnStopCondition = this.hasTurnStopConditionConfigured(state);\n const shouldSwitchSides =\n !hasTurnStopCondition || stopCondition.sideTurnCompleted;\n\n if (shouldSwitchSides) {\n this.switchSides(state);\n }\n }\n\n // Send step completed telemetry\n state.emitTelemetry?.({\n type: \"step_completed\",\n step: state.stepCount,\n stopped: state.stopped,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Execute agent handoff - switch to a new AI + Human agent\n * Updates the thread's agent_name and loads the new agent config\n */\n private static async executeHandoff(state: FlowState): Promise<void> {\n if (!state.pendingHandoff) {\n return;\n }\n\n const newAgentName = state.pendingHandoff.agentId; // Now contains agent name\n\n try {\n // Load new agent definition from TypeScript config\n const newAgentDef = await state.thread.instance.loadAgent(newAgentName);\n\n // Convert AgentDefinition to Agent type expected by runtime\n const sideASession = getResolvedSessionBindingsFromSide(newAgentDef.sideA);\n const sideBSession = getResolvedSessionBindingsFromSide(newAgentDef.sideB);\n const agentConfig: Agent = {\n id: newAgentName,\n title: newAgentDef.title || newAgentName,\n type: newAgentDef.type,\n created_at: Date.now(),\n max_session_turns: newAgentDef.maxSessionTurns ?? null,\n side_a_label: newAgentDef.sideA?.label ?? null,\n side_a_agent_prompt: newAgentDef.sideA?.prompt ?? null,\n side_a_stop_on_response: newAgentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: newAgentDef.sideA?.stopTool ?? null,\n side_a_stop_tool_response_property: newAgentDef.sideA?.stopToolResponseProperty ?? null,\n side_a_max_steps: newAgentDef.sideA?.maxSteps ?? null,\n side_a_session_stop_tool: sideASession.stop.toolName,\n side_a_session_stop_message_property: sideASession.stop.messageProperty,\n side_a_session_stop_attachments_property: sideASession.stop.attachmentsProperty,\n side_a_session_fail_tool: sideASession.fail.toolName,\n side_a_session_fail_message_property: sideASession.fail.messageProperty,\n side_a_session_fail_attachments_property: sideASession.fail.attachmentsProperty,\n side_a_session_status_tool: sideASession.status.toolName,\n side_a_session_status_message_property: sideASession.status.messageProperty,\n side_a_session_status_attachments_property: sideASession.status.attachmentsProperty,\n side_b_label: newAgentDef.sideB?.label ?? null,\n side_b_agent_prompt: newAgentDef.sideB?.prompt ?? null,\n side_b_stop_on_response: newAgentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: newAgentDef.sideB?.stopTool ?? null,\n side_b_stop_tool_response_property: newAgentDef.sideB?.stopToolResponseProperty ?? null,\n side_b_max_steps: newAgentDef.sideB?.maxSteps ?? null,\n side_b_session_stop_tool: sideBSession.stop.toolName,\n side_b_session_stop_message_property: sideBSession.stop.messageProperty,\n side_b_session_stop_attachments_property: sideBSession.stop.attachmentsProperty,\n side_b_session_fail_tool: sideBSession.fail.toolName,\n side_b_session_fail_message_property: sideBSession.fail.messageProperty,\n side_b_session_fail_attachments_property: sideBSession.fail.attachmentsProperty,\n side_b_session_status_tool: sideBSession.status.toolName,\n side_b_session_status_message_property: sideBSession.status.messageProperty,\n side_b_session_status_attachments_property: sideBSession.status.attachmentsProperty,\n };\n\n // Load prompts for new agent\n const { sideAPrompt, sideBPrompt } = await this.loadAgentAndPrompts(\n agentConfig,\n state.thread\n );\n\n // Persist the agent change to the threads table in DurableAgentBuilder\n try {\n const agentBuilderStub = state.env.AGENT_BUILDER.get(\n state.env.AGENT_BUILDER.idFromName(\"singleton\")\n ) as unknown as { updateThreadAgent(threadId: string, agentId: string): Promise<void> };\n await agentBuilderStub.updateThreadAgent(state.threadId, newAgentName);\n } catch (persistError) {\n console.error(\"Error persisting handoff to threads table:\", persistError);\n // Continue with handoff even if persistence fails - the in-memory state is correct\n }\n\n // Update state with new agent config and prompts\n state.agentConfig = agentConfig;\n state.prompts.sideA = sideAPrompt;\n state.prompts.sideB = sideBPrompt;\n\n // Get handoff args and tool config\n const args = state.pendingHandoff?.args || {};\n const toolConfig = state.pendingHandoff?.toolConfig;\n const initUserMessageProperty = toolConfig?.initUserMessageProperty;\n const initAttachmentsProperty = toolConfig?.initAttachmentsProperty;\n\n // Add args to context for template interpolation\n state.context = { ...state.context, ...args };\n\n // Build user message based on initUserMessageProperty and initAttachmentsProperty\n let userMessageContent: string | undefined;\n let userMessageAttachments: string | undefined;\n\n if (initUserMessageProperty && args[initUserMessageProperty] !== undefined) {\n const propertyValue = args[initUserMessageProperty];\n userMessageContent = typeof propertyValue === 'string'\n ? propertyValue\n : JSON.stringify(propertyValue);\n }\n\n // Resolve attachments if initAttachmentsProperty is set\n if (initAttachmentsProperty && args[initAttachmentsProperty] !== undefined) {\n const attachmentValue = args[initAttachmentsProperty];\n const attachmentPaths: string[] = Array.isArray(attachmentValue)\n ? attachmentValue\n : [attachmentValue as string];\n\n const resolvedAttachments: any[] = [];\n for (const attachmentPath of attachmentPaths) {\n if (typeof attachmentPath === 'string' && attachmentPath.startsWith('/attachments/')) {\n try {\n const statResult = await state.thread.instance.statFile(attachmentPath);\n if (statResult.success && statResult.file) {\n resolvedAttachments.push({\n id: crypto.randomUUID(),\n type: \"file\",\n path: attachmentPath,\n name: statResult.file.name,\n mimeType: statResult.file.mimeType,\n width: statResult.file.width ?? undefined,\n height: statResult.file.height ?? undefined,\n });\n }\n } catch (e) {\n console.error(`[FlowEngine] Failed to resolve attachment ${attachmentPath}:`, e);\n }\n }\n }\n if (resolvedAttachments.length > 0) {\n userMessageAttachments = JSON.stringify(resolvedAttachments);\n }\n }\n\n // Reset to Side A and update current prompt reference\n state.currentSide = \"a\";\n state.prompt = state.prompts.sideA;\n\n // Reset promptPath to the new agent's root prompt\n state.promptPath = [sideAPrompt.name];\n state.pendingImmediateAfterHandoff = true;\n\n // Store user message in database if we have user content or attachments\n // This is different from sub-prompts which use extraMessages - handoff messages should persist\n if (userMessageContent || userMessageAttachments) {\n const handoffMessageId = crypto.randomUUID();\n const handoffTimestamp = Date.now() * 1000;\n const handoffMessage: Message = {\n id: handoffMessageId,\n role: \"user\",\n content: userMessageContent || \"\",\n created_at: handoffTimestamp,\n attachments: userMessageAttachments,\n };\n\n // Insert the handoff user message into the database\n await state.storage.sql.exec(\n `INSERT INTO messages (id, role, content, attachments, created_at, prompt) VALUES (?, ?, ?, ?, ?, ?)`,\n handoffMessage.id,\n handoffMessage.role,\n handoffMessage.content,\n handoffMessage.attachments || null,\n handoffMessage.created_at,\n sideAPrompt.name\n );\n\n // Add to message history so it's included in LLM context\n state.messageHistory.push(handoffMessage);\n\n // Broadcast the message via WebSocket\n if (state.emitMessage) {\n state.emitMessage(handoffMessage);\n }\n }\n\n // Clear pending handoff\n state.pendingHandoff = undefined;\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"agent_handoff\",\n new_agent_id: newAgentName,\n new_agent_title: state.agentConfig.title,\n timestamp: Date.now(),\n } as any); // Cast to any since agent_handoff is not in TelemetryEvent type yet\n } catch (error) {\n console.error(\"Error executing handoff:\", error);\n await this.logError(state, error, \"handoff_execution_error\", `Handoff to agent ${newAgentName}`);\n throw error;\n }\n }\n\n private static isEnabledEnvFlag(value: string | null | undefined): boolean {\n if (value === null || value === undefined) return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"1\" || normalized === \"yes\";\n }\n\n private static async resolveThreadEnvFromBindings(\n state: FlowState,\n property: string,\n bindings: FlowState[\"env\"] | undefined | null\n ): Promise<string | null> {\n if (!bindings || !(\"AGENT_BUILDER\" in bindings)) {\n return null;\n }\n\n try {\n const namespace = bindings.AGENT_BUILDER as {\n idFromName?: (name: string) => unknown;\n get?: (id: unknown) => unknown;\n };\n if (\n typeof namespace?.idFromName !== \"function\" ||\n typeof namespace?.get !== \"function\"\n ) {\n return null;\n }\n\n const stub = namespace.get(namespace.idFromName(\"singleton\")) as\n | {\n resolveThreadEnv?: (params: {\n threadId: string;\n property: string;\n promptName?: string;\n }) => Promise<string | null>;\n }\n | null\n | undefined;\n if (!stub || typeof stub.resolveThreadEnv !== \"function\") {\n return null;\n }\n\n return await stub.resolveThreadEnv({\n threadId: state.threadId,\n property,\n promptName: state.prompt?.name,\n });\n } catch {\n return null;\n }\n }\n\n private static async isOptionalToolEnabled(\n state: FlowState,\n optionalEnvName: string | undefined\n ): Promise<boolean> {\n if (!optionalEnvName) {\n return true;\n }\n\n const normalized = optionalEnvName.trim();\n if (!normalized) {\n return true;\n }\n\n // Prefer flow-level env bindings, then fall back to the thread-instance bindings.\n // In production these are usually equivalent; tests often stub only one.\n const valueFromStateEnv = await this.resolveThreadEnvFromBindings(\n state,\n normalized,\n state.env\n );\n if (valueFromStateEnv !== null && valueFromStateEnv !== undefined) {\n return this.isEnabledEnvFlag(valueFromStateEnv);\n }\n\n const valueFromThreadEnv = await this.resolveThreadEnvFromBindings(\n state,\n normalized,\n state.thread?.instance?.env\n );\n if (valueFromThreadEnv !== null && valueFromThreadEnv !== undefined) {\n return this.isEnabledEnvFlag(valueFromThreadEnv);\n }\n\n return false;\n }\n\n private static normalizeEnvRecord(value: unknown): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n const normalized: Record<string, string> = {};\n for (const [rawName, rawValue] of Object.entries(\n value as Record<string, unknown>\n )) {\n const name = rawName.trim();\n if (!name) {\n continue;\n }\n if (rawValue === null || rawValue === undefined) {\n continue;\n }\n normalized[name] = String(rawValue);\n }\n return normalized;\n }\n\n private static extractScopedVariablesFromDefinition(\n value: unknown\n ): Array<{ name: string; required: boolean }> {\n if (!value || typeof value !== \"object\") {\n return [];\n }\n\n const def = value as { variables?: unknown };\n if (!Array.isArray(def.variables)) {\n return [];\n }\n\n const scoped: Array<{ name: string; required: boolean }> = [];\n for (const entry of def.variables) {\n if (!entry || typeof entry !== \"object\") continue;\n const variable = entry as {\n scoped?: unknown;\n name?: unknown;\n required?: unknown;\n };\n if (!variable.scoped) continue;\n const name =\n typeof variable.name === \"string\" ? variable.name.trim() : \"\";\n if (!name) continue;\n scoped.push({ name, required: !!variable.required });\n }\n return scoped;\n }\n\n private static async isDualAiAgentTool(\n state: FlowState,\n toolName: string\n ): Promise<boolean> {\n try {\n const agentDef = await state.thread.instance.loadAgent(toolName);\n return agentDef?.type === \"dual_ai\";\n } catch {\n return false;\n }\n }\n\n private static async collectScopedVariablesForAgent(\n state: FlowState,\n agentName: string\n ): Promise<{ all: string[]; required: string[] }> {\n const all = new Set<string>();\n const required = new Set<string>();\n\n const queue: Array<{ type: \"agent\" | \"prompt\" | \"tool\"; name: string }> = [\n { type: \"agent\", name: agentName },\n ];\n const visited = new Set<string>();\n\n const toolsRegistry = state.thread.instance.tools();\n const promptNames = new Set<string>(state.thread.instance.getPromptNames?.() ?? []);\n const agentNames = new Set<string>(state.thread.instance.getAgentNames?.() ?? []);\n const toolNames = new Set<string>(Object.keys(toolsRegistry));\n const refTypeCache = new Map<string, \"prompt\" | \"agent\" | \"tool\" | null>();\n\n const addScopedVariables = (\n scopedVariables: Array<{ name: string; required: boolean }>\n ) => {\n for (const variable of scopedVariables) {\n all.add(variable.name);\n if (variable.required) {\n required.add(variable.name);\n }\n }\n };\n\n const classifyReference = async (\n name: string\n ): Promise<\"prompt\" | \"agent\" | \"tool\" | null> => {\n if (refTypeCache.has(name)) {\n return refTypeCache.get(name) ?? null;\n }\n if (promptNames.has(name)) {\n refTypeCache.set(name, \"prompt\");\n return \"prompt\";\n }\n if (agentNames.has(name)) {\n refTypeCache.set(name, \"agent\");\n return \"agent\";\n }\n if (toolNames.has(name)) {\n refTypeCache.set(name, \"tool\");\n return \"tool\";\n }\n\n try {\n await state.thread.instance.loadPrompt(name);\n promptNames.add(name);\n refTypeCache.set(name, \"prompt\");\n return \"prompt\";\n } catch {\n // Not a prompt.\n }\n\n try {\n const loadedAgent = await state.thread.instance.loadAgent(name);\n if (loadedAgent) {\n agentNames.add(name);\n refTypeCache.set(name, \"agent\");\n return \"agent\";\n }\n } catch {\n // Not an agent.\n }\n\n if (toolNames.has(name)) {\n refTypeCache.set(name, \"tool\");\n return \"tool\";\n }\n\n refTypeCache.set(name, null);\n return null;\n };\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const visitKey = `${current.type}:${current.name}`;\n if (visited.has(visitKey)) {\n continue;\n }\n visited.add(visitKey);\n\n if (current.type === \"agent\") {\n let agentDef: unknown = null;\n try {\n agentDef = await state.thread.instance.loadAgent(current.name);\n } catch {\n agentDef = null;\n }\n if (!agentDef || typeof agentDef !== \"object\") {\n continue;\n }\n\n addScopedVariables(this.extractScopedVariablesFromDefinition(agentDef));\n\n const sideA =\n typeof (agentDef as { sideA?: { prompt?: unknown } }).sideA?.prompt ===\n \"string\"\n ? ((agentDef as { sideA: { prompt: string } }).sideA.prompt as string)\n : \"\";\n const sideB =\n typeof (agentDef as { sideB?: { prompt?: unknown } }).sideB?.prompt ===\n \"string\"\n ? ((agentDef as { sideB: { prompt: string } }).sideB.prompt as string)\n : \"\";\n\n if (sideA.trim()) {\n queue.push({ type: \"prompt\", name: sideA.trim() });\n }\n if (sideB.trim()) {\n queue.push({ type: \"prompt\", name: sideB.trim() });\n }\n continue;\n }\n\n if (current.type === \"prompt\") {\n let promptDef: unknown = null;\n try {\n promptDef = await state.thread.instance.loadPrompt(current.name);\n } catch {\n promptDef = null;\n }\n if (!promptDef || typeof promptDef !== \"object\") {\n continue;\n }\n\n addScopedVariables(this.extractScopedVariablesFromDefinition(promptDef));\n\n const tools = Array.isArray((promptDef as { tools?: unknown }).tools)\n ? ((promptDef as { tools: unknown[] }).tools as unknown[])\n : [];\n for (const toolEntry of tools) {\n const toolName =\n typeof toolEntry === \"string\"\n ? toolEntry.trim()\n : typeof (toolEntry as { name?: unknown })?.name === \"string\"\n ? String((toolEntry as { name: string }).name).trim()\n : \"\";\n if (!toolName) {\n continue;\n }\n if (toolName.startsWith(\"provider:\") || toolName.startsWith(\"mcp:\")) {\n continue;\n }\n\n const refType = await classifyReference(toolName);\n if (refType) {\n queue.push({ type: refType, name: toolName });\n }\n }\n continue;\n }\n\n const loader = toolsRegistry[current.name];\n if (!loader) {\n continue;\n }\n\n let toolDef: unknown = null;\n try {\n toolDef = await loader();\n } catch {\n toolDef = null;\n }\n if (!toolDef || typeof toolDef !== \"object\") {\n continue;\n }\n\n addScopedVariables(this.extractScopedVariablesFromDefinition(toolDef));\n\n const uses = Array.isArray((toolDef as { uses?: unknown }).uses)\n ? ((toolDef as { uses: unknown[] }).uses as unknown[])\n : [];\n for (const useEntry of uses) {\n if (typeof useEntry !== \"string\") {\n continue;\n }\n const useName = useEntry.trim();\n if (!useName) {\n continue;\n }\n\n const refType = await classifyReference(useName);\n if (refType) {\n queue.push({ type: refType, name: useName });\n }\n }\n }\n\n return {\n all: Array.from(all).sort((a, b) => a.localeCompare(b)),\n required: Array.from(required).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n private static hasNonEmptyValue(value: string | null | undefined): boolean {\n return typeof value === \"string\" && value.trim().length > 0;\n }\n\n private static normalizeEnvName(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n }\n\n private static normalizeEnvNameList(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n const names = new Set<string>();\n for (const entry of value) {\n const normalized = this.normalizeEnvName(entry);\n if (normalized) {\n names.add(normalized);\n }\n }\n return Array.from(names);\n }\n\n private static getImmediateOptions(\n immediate: SubagentToolConfig[\"immediate\"]\n ): ImmediateSubagentOptions | null {\n if (!immediate) {\n return null;\n }\n if (immediate === true) {\n return {};\n }\n if (typeof immediate !== \"object\" || Array.isArray(immediate)) {\n return {};\n }\n return immediate as ImmediateSubagentOptions;\n }\n\n private static parseScopedIndexKey(\n key: string\n ): { base: string; index: number } | null {\n const match = key.match(/^(.*?)(?:__(\\d+))?$/);\n if (!match) {\n return null;\n }\n const base = match[1]?.trim() ?? \"\";\n if (!base) {\n return null;\n }\n const index = match[2] ? Number.parseInt(match[2], 10) : 1;\n if (!Number.isFinite(index) || index < 1) {\n return null;\n }\n return { base, index };\n }\n\n private static buildImmediateScopedEnvInstances(params: {\n parentEnv: Record<string, string>;\n scopedVariableNames: string[];\n unsafeNameEnv?: string;\n unsafeDescriptionEnv?: string;\n maxInstances?: number;\n activeInstances?: number;\n }): {\n instances: ImmediateScopedEnvInstance[];\n consumedKeys: Set<string>;\n } {\n const groupedEnvNames = new Set(params.scopedVariableNames);\n const unsafeNameEnv = this.normalizeEnvName(params.unsafeNameEnv);\n const unsafeDescriptionEnv = this.normalizeEnvName(params.unsafeDescriptionEnv);\n\n if (unsafeNameEnv) {\n groupedEnvNames.add(unsafeNameEnv);\n }\n if (unsafeDescriptionEnv) {\n groupedEnvNames.add(unsafeDescriptionEnv);\n }\n\n if (groupedEnvNames.size === 0) {\n return {\n instances: [{ scopedEnv: {} }],\n consumedKeys: new Set<string>(),\n };\n }\n\n const maxInstances =\n typeof params.maxInstances === \"number\" && params.maxInstances > 0\n ? params.maxInstances\n : undefined;\n const activeInstances =\n typeof params.activeInstances === \"number\" && params.activeInstances > 0\n ? params.activeInstances\n : 0;\n const remainingSlots =\n typeof maxInstances === \"number\"\n ? Math.max(maxInstances - activeInstances, 0)\n : undefined;\n if (remainingSlots === 0) {\n return { instances: [], consumedKeys: new Set<string>() };\n }\n\n const valuesByIndex = new Map<number, Record<string, string>>();\n const discoveredIndexes = new Set<number>();\n for (const [envKey, envValue] of Object.entries(params.parentEnv)) {\n if (!this.hasNonEmptyValue(envValue)) {\n continue;\n }\n const parsed = this.parseScopedIndexKey(envKey);\n if (!parsed || !groupedEnvNames.has(parsed.base)) {\n continue;\n }\n discoveredIndexes.add(parsed.index);\n let target = valuesByIndex.get(parsed.index);\n if (!target) {\n target = {};\n valuesByIndex.set(parsed.index, target);\n }\n target[parsed.base] = envValue;\n }\n\n const sortedIndexes = Array.from(discoveredIndexes).sort((a, b) => a - b);\n const selectedIndexes =\n sortedIndexes.length > 0\n ? sortedIndexes.slice(0, remainingSlots)\n : [1];\n\n const instances: ImmediateScopedEnvInstance[] = [];\n const consumedKeys = new Set<string>();\n for (const index of selectedIndexes) {\n const values = valuesByIndex.get(index) ?? {};\n const scopedEnv: Record<string, string> = {};\n for (const variableName of params.scopedVariableNames) {\n if (this.hasNonEmptyValue(values[variableName])) {\n scopedEnv[variableName] = values[variableName];\n }\n }\n instances.push({\n scopedEnv,\n ...(unsafeNameEnv && this.hasNonEmptyValue(values[unsafeNameEnv])\n ? { unsafeName: values[unsafeNameEnv] }\n : {}),\n ...(unsafeDescriptionEnv && this.hasNonEmptyValue(values[unsafeDescriptionEnv])\n ? { unsafeDescription: values[unsafeDescriptionEnv] }\n : {}),\n });\n\n for (const variableName of groupedEnvNames) {\n const envKey = index === 1 ? variableName : `${variableName}__${index}`;\n if (Object.prototype.hasOwnProperty.call(params.parentEnv, envKey)) {\n consumedKeys.add(envKey);\n }\n }\n }\n\n return { instances, consumedKeys };\n }\n\n private static async updateThreadEnvFromBindings(\n state: FlowState,\n bindings: FlowState[\"env\"] | ThreadInstance[\"env\"] | null | undefined,\n env: Record<string, string> | null\n ): Promise<boolean> {\n if (!bindings || !(\"AGENT_BUILDER\" in bindings)) {\n return false;\n }\n\n try {\n const namespace = bindings.AGENT_BUILDER as {\n idFromName?: (name: string) => unknown;\n get?: (id: unknown) => unknown;\n };\n if (\n typeof namespace?.idFromName !== \"function\" ||\n typeof namespace?.get !== \"function\"\n ) {\n return false;\n }\n\n const stub = namespace.get(namespace.idFromName(\"singleton\")) as\n | {\n updateThread?: (\n id: string,\n params: { env?: Record<string, string> | null; tenvs?: Record<string, string> | null }\n ) => Promise<unknown>;\n }\n | null\n | undefined;\n if (!stub || typeof stub.updateThread !== \"function\") {\n return false;\n }\n\n await stub.updateThread(state.threadId, {\n env,\n tenvs: env,\n });\n return true;\n } catch {\n return false;\n }\n }\n\n private static async persistImmediateScopedEnvCleanup(\n state: FlowState,\n env: Record<string, string>\n ): Promise<void> {\n const normalized = this.normalizeEnvRecord(env);\n const nextEnv = Object.keys(normalized).length > 0 ? normalized : null;\n\n const updatedViaState = await this.updateThreadEnvFromBindings(\n state,\n state.env,\n nextEnv\n );\n const updatedViaThread = updatedViaState\n ? false\n : await this.updateThreadEnvFromBindings(state, state.thread?.instance?.env, nextEnv);\n\n if (!updatedViaState && !updatedViaThread) {\n return;\n }\n\n if (state.thread?.metadata) {\n state.thread.metadata.env = nextEnv;\n state.thread.metadata.tenvs = nextEnv;\n }\n }\n\n private static buildImmediateBootstrapFallbackArgs(\n subagentConfig: SubagentToolConfig,\n unsafeInstance: Pick<ImmediateScopedEnvInstance, \"unsafeName\" | \"unsafeDescription\">\n ): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n\n if (\n subagentConfig.initAgentNameProperty &&\n this.hasNonEmptyValue(unsafeInstance.unsafeName)\n ) {\n args[subagentConfig.initAgentNameProperty] = unsafeInstance.unsafeName!.trim();\n }\n\n if (\n subagentConfig.initUserMessageProperty &&\n this.hasNonEmptyValue(unsafeInstance.unsafeDescription)\n ) {\n args[subagentConfig.initUserMessageProperty] =\n unsafeInstance.unsafeDescription!.trim();\n }\n\n return args;\n }\n\n private static parseImmediateBootstrapArgs(\n response: LLMResponse\n ): Record<string, unknown> | null {\n const bootstrapCall = Array.isArray(response.tool_calls)\n ? response.tool_calls.find(\n (call) => call.function?.name === IMMEDIATE_BOOTSTRAP_TOOL_NAME\n )\n : null;\n\n if (!bootstrapCall) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(bootstrapCall.function.arguments);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n return null;\n }\n\n return null;\n }\n\n private static buildImmediateBootstrapTool(\n subagentConfig: SubagentToolConfig\n ): import(\"./types\").ToolDefinition | null {\n const properties: Record<string, unknown> = {};\n\n if (subagentConfig.initAgentNameProperty) {\n properties[subagentConfig.initAgentNameProperty] = {\n type: \"string\",\n description: \"Human-readable child thread name for this immediate subagent instance.\",\n };\n }\n\n if (subagentConfig.initUserMessageProperty) {\n properties[subagentConfig.initUserMessageProperty] = {\n type: \"string\",\n description: \"Initial instruction message sent to the child subagent.\",\n };\n }\n\n if (Object.keys(properties).length === 0) {\n return null;\n }\n\n return {\n type: \"function\",\n function: {\n name: IMMEDIATE_BOOTSTRAP_TOOL_NAME,\n description:\n \"Return initialization arguments for an immediate subagent instance.\",\n parameters: {\n type: \"object\",\n properties,\n required: [],\n },\n },\n };\n }\n\n private static async synthesizeImmediateBootstrapArgs(\n state: FlowState,\n toolName: string,\n subagentConfig: SubagentToolConfig,\n unsafeInstance: Pick<ImmediateScopedEnvInstance, \"unsafeName\" | \"unsafeDescription\">\n ): Promise<Record<string, unknown>> {\n const fallbackArgs = this.buildImmediateBootstrapFallbackArgs(\n subagentConfig,\n unsafeInstance\n );\n const bootstrapTool = this.buildImmediateBootstrapTool(subagentConfig);\n\n if (\n !bootstrapTool ||\n (!this.hasNonEmptyValue(unsafeInstance.unsafeName) &&\n !this.hasNonEmptyValue(unsafeInstance.unsafeDescription))\n ) {\n return fallbackArgs;\n }\n\n let agentTitle = toolName;\n let agentDescription = `Immediate subagent ${toolName}`;\n try {\n const agentDef = await state.thread.instance.loadAgent(toolName);\n if (agentDef && typeof agentDef === \"object\") {\n agentTitle =\n typeof (agentDef as { title?: unknown }).title === \"string\" &&\n (agentDef as { title: string }).title.trim().length > 0\n ? (agentDef as { title: string }).title.trim()\n : agentTitle;\n agentDescription =\n typeof (agentDef as { toolDescription?: unknown }).toolDescription === \"string\" &&\n (agentDef as { toolDescription: string }).toolDescription.trim().length > 0\n ? (agentDef as { toolDescription: string }).toolDescription.trim()\n : agentDescription;\n }\n } catch {\n // Best-effort metadata only.\n }\n\n const systemPrompt = [\n \"You prepare initialization arguments for an immediate subagent bootstrap.\",\n `Return exactly one call to ${IMMEDIATE_BOOTSTRAP_TOOL_NAME}.`,\n \"Use only the safe hint values supplied below.\",\n \"Do not reveal or infer any other environment values.\",\n \"Keep names concise and keep messages operational.\",\n ].join(\"\\n\");\n\n const context: RequestContext = {\n messages: [\n { role: \"system\", content: systemPrompt },\n {\n role: \"user\",\n content: JSON.stringify(\n {\n agent: {\n name: toolName,\n title: agentTitle,\n description: agentDescription,\n },\n initAgentNameProperty: subagentConfig.initAgentNameProperty ?? null,\n initUserMessageProperty: subagentConfig.initUserMessageProperty ?? null,\n nameHint: unsafeInstance.unsafeName ?? null,\n descriptionHint: unsafeInstance.unsafeDescription ?? null,\n },\n null,\n 2\n ),\n },\n ],\n model: state.prompt.model,\n tools: [bootstrapTool],\n stream: false,\n promptName: `__immediate_bootstrap:${toolName}`,\n systemPrompt,\n parentLogId: state.parentLogId ?? null,\n parallel_tool_calls: false,\n tool_choice: {\n type: \"function\",\n function: { name: IMMEDIATE_BOOTSTRAP_TOOL_NAME },\n },\n };\n\n try {\n const { response } = await LLMRequest.execute(context, state);\n return this.parseImmediateBootstrapArgs(response) ?? fallbackArgs;\n } catch (error) {\n console.error(\n `[FlowEngine] Failed to synthesize immediate bootstrap args for ${toolName}:`,\n error\n );\n return fallbackArgs;\n }\n }\n\n private static attachImmediateScopedEnvToCall(\n state: FlowState,\n callId: string,\n scopedEnv: Record<string, string>\n ): void {\n if (!callId || Object.keys(scopedEnv).length === 0) {\n return;\n }\n\n const key = this.IMMEDIATE_SCOPED_ENV_CONTEXT_KEY;\n const existingRaw = state.context[key];\n const existing =\n existingRaw && typeof existingRaw === \"object\" && !Array.isArray(existingRaw)\n ? (existingRaw as Record<string, unknown>)\n : {};\n existing[callId] = scopedEnv;\n state.context[key] = existing;\n }\n\n private static async runImmediateToolsIfNeeded(\n state: FlowState\n ): Promise<boolean> {\n const promptTools = Array.isArray(state.prompt._tools) ? state.prompt._tools : [];\n if (promptTools.length === 0) {\n return false;\n }\n\n if (!state.immediatePromptRuns) {\n state.immediatePromptRuns = new Set<string>();\n }\n\n const runKey = `${state.agentConfig.id}:${state.currentSide}:${state.prompt.name}`;\n if (state.pendingImmediateAfterHandoff) {\n state.immediatePromptRuns.delete(runKey);\n } else if (state.immediatePromptRuns.has(runKey)) {\n return false;\n }\n\n const messageHistory = await this.loadMessageHistory(state);\n const hasStartedConversation = messageHistory.some((message) => {\n if (message.role === \"system\") return false;\n if (message.silent) return false;\n return true;\n });\n\n if (!state.pendingImmediateAfterHandoff && hasStartedConversation) {\n state.immediatePromptRuns.add(runKey);\n return false;\n }\n\n const immediateToolCalls: ToolCall[] = [];\n const parentThreadEnv = this.normalizeEnvRecord(state.thread?.metadata?.env);\n const consumedScopedEnvKeys = new Set<string>();\n const subagentRegistry = await this.getSubagentRegistry(state);\n const activeInstanceCounts = new Map<string, number>();\n for (const child of subagentRegistry) {\n if (child.status === \"terminated\") {\n continue;\n }\n activeInstanceCounts.set(\n child.name,\n (activeInstanceCounts.get(child.name) ?? 0) + 1\n );\n }\n\n for (const toolConfig of promptTools) {\n if (!toolConfig || typeof toolConfig !== \"object\") {\n continue;\n }\n\n const subagentConfig = toolConfig as SubagentToolConfig;\n const immediateOptions = this.getImmediateOptions(subagentConfig.immediate);\n if (!immediateOptions) {\n continue;\n }\n\n const toolName =\n typeof (toolConfig as any).name === \"string\"\n ? ((toolConfig as any).name as string).trim()\n : \"\";\n if (!toolName || toolName.startsWith(\"provider:\") || toolName.startsWith(\"mcp:\")) {\n continue;\n }\n\n const optionalEnvName =\n typeof subagentConfig.optional === \"string\"\n ? subagentConfig.optional\n : undefined;\n const optionalEnabled = await this.isOptionalToolEnabled(state, optionalEnvName);\n if (!optionalEnabled) {\n continue;\n }\n\n let immediateInstances: ImmediateScopedEnvInstance[] = [];\n if (await this.isDualAiAgentTool(state, toolName)) {\n const scoped = await this.collectScopedVariablesForAgent(state, toolName);\n const transferScopedEnvNames =\n immediateOptions.scopedEnv && immediateOptions.scopedEnv.length > 0\n ? this.normalizeEnvNameList(immediateOptions.scopedEnv)\n : scoped.all;\n if (\n transferScopedEnvNames.length > 0 ||\n this.normalizeEnvName(immediateOptions.nameEnv) ||\n this.normalizeEnvName(immediateOptions.descriptionEnv)\n ) {\n const resumableConfig = subagentConfig.resumable;\n const maxInstances =\n typeof resumableConfig === \"object\" &&\n resumableConfig &&\n typeof resumableConfig.maxInstances === \"number\"\n ? resumableConfig.maxInstances\n : undefined;\n const activeInstances = activeInstanceCounts.get(toolName) ?? 0;\n const scopedPayloadResult = this.buildImmediateScopedEnvInstances({\n parentEnv: parentThreadEnv,\n scopedVariableNames: transferScopedEnvNames,\n unsafeNameEnv: immediateOptions.nameEnv,\n unsafeDescriptionEnv: immediateOptions.descriptionEnv,\n maxInstances,\n activeInstances,\n });\n immediateInstances = scopedPayloadResult.instances;\n for (const key of scopedPayloadResult.consumedKeys) {\n consumedScopedEnvKeys.add(key);\n delete parentThreadEnv[key];\n }\n activeInstanceCounts.set(toolName, activeInstances + immediateInstances.length);\n }\n }\n\n const instancesToEmit =\n immediateInstances.length > 0 ? immediateInstances : [{ scopedEnv: {} }];\n for (const immediateInstance of instancesToEmit) {\n const bootstrapArgs =\n subagentConfig.immediate && typeof subagentConfig.immediate === \"object\"\n ? await this.synthesizeImmediateBootstrapArgs(\n state,\n toolName,\n subagentConfig,\n immediateInstance\n )\n : {};\n const callId = crypto.randomUUID();\n immediateToolCalls.push({\n id: callId,\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify(bootstrapArgs),\n },\n forceAllow: true,\n });\n this.attachImmediateScopedEnvToCall(state, callId, immediateInstance.scopedEnv);\n }\n }\n\n if (consumedScopedEnvKeys.size > 0) {\n await this.persistImmediateScopedEnvCleanup(state, parentThreadEnv);\n }\n\n state.pendingImmediateAfterHandoff = false;\n state.immediatePromptRuns.add(runKey);\n if (immediateToolCalls.length === 0) {\n return false;\n }\n\n await ToolExecutor.executeSequence(state, immediateToolCalls);\n if (state.pendingHandoff) {\n await this.executeHandoff(state);\n }\n return true;\n }\n\n /**\n * Drain queued messages from persistent storage and inject them into the thread.\n *\n * Returns the side that should respond next based on the first queued message,\n * or null when no queued messages were available.\n */\n private static async processQueuedMessages(\n state: FlowState\n ): Promise<{ forcedSide: \"a\" | \"b\"; rootMessageId: string } | null> {\n try {\n const cursor = await state.storage.sql.exec<{\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n attachments: string | null;\n silent: number;\n metadata: string | null;\n created_at: number;\n }>(\n `\n SELECT id, role, content, attachments, silent, metadata, created_at\n FROM message_queue\n ORDER BY created_at ASC, rowid ASC\n `\n );\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n const firstRole = rows[0].role;\n const forcedSide: \"a\" | \"b\" = firstRole === \"user\" ? \"a\" : \"b\";\n const currentPrompt =\n state.promptPath.length > 0\n ? state.promptPath[state.promptPath.length - 1]\n : null;\n\n for (const row of rows) {\n let parsedMetadata: Record<string, unknown> | undefined;\n if (row.metadata) {\n try {\n const parsed = JSON.parse(row.metadata);\n if (parsed && typeof parsed === \"object\") {\n parsedMetadata = parsed as Record<string, unknown>;\n }\n } catch {\n parsedMetadata = undefined;\n }\n }\n\n const message: Message = {\n id: row.id,\n role: row.role,\n content: row.content,\n created_at: row.created_at,\n silent: this.isSilentMessageRow(row.silent),\n attachments: row.attachments,\n metadata: parsedMetadata,\n subagent_id: this.extractSubagentIdFromMetadata(row.metadata),\n };\n\n await state.storage.sql.exec(\n `INSERT INTO messages (id, role, content, attachments, silent, metadata, subagent_id, created_at, prompt)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)`,\n message.id,\n message.role,\n message.content,\n message.attachments ?? null,\n message.silent ? 1 : 0,\n message.metadata ? JSON.stringify(message.metadata) : null,\n message.subagent_id ?? null,\n message.created_at,\n currentPrompt\n );\n\n if (state.emitMessage) {\n const attachments = row.attachments ? JSON.parse(row.attachments) : null;\n state.emitMessage({\n id: message.id,\n role: message.role,\n content: message.content,\n attachments,\n silent: message.silent,\n created_at: message.created_at,\n metadata: parsedMetadata,\n subagent_id: message.subagent_id ?? null,\n });\n }\n }\n\n await state.storage.sql.exec(`DELETE FROM message_queue`);\n return {\n forcedSide,\n rootMessageId: rows[0].id,\n };\n } catch (error) {\n // message_queue may not exist on older schemas until migrated.\n console.error(\"[FlowEngine] Failed to process queued messages:\", error);\n return null;\n }\n }\n\n private static async getSubagentRegistry(\n state: FlowState\n ): Promise<SubagentRegistryEntry[]> {\n if (typeof state.thread.instance.getChildrenRegistry === \"function\") {\n try {\n return await state.thread.instance.getChildrenRegistry(state.threadId);\n } catch (error) {\n console.error(\"[FlowEngine] Failed to read children registry via runtime API:\", error);\n }\n }\n\n try {\n const cursor = await state.storage.sql.exec<{ value: string }>(\n `SELECT value FROM execution_state WHERE key = 'children_registry' LIMIT 1`\n );\n const rows = cursor.toArray();\n const raw = rows[0]?.value ?? \"[]\";\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as SubagentRegistryEntry[]) : [];\n } catch (error) {\n console.error(\"[FlowEngine] Failed to read children registry from execution_state:\", error);\n return [];\n }\n }\n\n private static getRegistryThreadName(\n entry: SubagentRegistryEntry\n ): string | null {\n const value = (entry as SubagentRegistryEntry & { threadName?: unknown }).threadName;\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.replace(/\\s+/g, \" \").trim();\n return normalized.length > 0 ? normalized : null;\n }\n\n private static extractSubagentIdFromMetadata(\n metadata: string | null\n ): string | null {\n if (!metadata) {\n return null;\n }\n try {\n const parsed = JSON.parse(metadata) as { subagent_id?: unknown; subagentId?: unknown };\n const value =\n typeof parsed.subagent_id === \"string\"\n ? parsed.subagent_id\n : typeof parsed.subagentId === \"string\"\n ? parsed.subagentId\n : null;\n return value && value.trim().length > 0 ? value.trim() : null;\n } catch {\n return null;\n }\n }\n\n private static getThreadNameFromTags(tags: unknown): string | null {\n if (!Array.isArray(tags)) {\n return null;\n }\n const nameTag = tags.find(\n (tag): tag is string => typeof tag === \"string\" && tag.startsWith(\"name:\")\n );\n if (!nameTag) {\n return null;\n }\n const value = nameTag.slice(\"name:\".length).replace(/\\s+/g, \" \").trim();\n return value.length > 0 ? value : null;\n }\n\n private static async resolveRegistryThreadNameMap(\n state: FlowState,\n entries: SubagentRegistryEntry[]\n ): Promise<Map<string, string>> {\n const unresolvedReferences = entries\n .filter((entry) => !this.getRegistryThreadName(entry))\n .map((entry) => entry.reference);\n\n if (unresolvedReferences.length === 0) {\n return new Map();\n }\n\n const nameMap = new Map<string, string>();\n try {\n const builderNamespace = state.env?.AGENT_BUILDER;\n if (!builderNamespace) {\n return nameMap;\n }\n const builderId = builderNamespace.idFromName(\"singleton\");\n const builderStub = builderNamespace.get(builderId) as {\n getThread?: (id: string) => Promise<{ tags?: string[] | null } | null>;\n };\n\n if (typeof builderStub.getThread !== \"function\") {\n return nameMap;\n }\n\n await Promise.all(\n unresolvedReferences.map(async (reference) => {\n try {\n const thread = await builderStub.getThread!(reference);\n const threadName = this.getThreadNameFromTags(thread?.tags);\n if (threadName) {\n nameMap.set(reference, threadName);\n }\n } catch {\n // Best-effort fallback only.\n }\n })\n );\n } catch {\n // Best-effort fallback only.\n }\n\n return nameMap;\n }\n\n /**\n * Assemble context for LLM request\n */\n private static async assembleContext(\n state: FlowState\n ): Promise<RequestContext> {\n const messages: RequestContext[\"messages\"] = [];\n // Track data URL -> attachment path mappings for log transformation\n const imagePathMap = new Map<string, string>();\n\n // Use pre-loaded prompt configuration from state\n const model = state.prompt.model;\n const promptName = state.prompt.name;\n const parallelToolCalls = state.prompt.parallel_tool_calls;\n const toolChoice = state.prompt.tool_choice;\n const reasoningEffort = state.prompt.reasoning_effort;\n const reasoningMaxTokens = state.prompt.reasoning_max_tokens;\n const reasoningExclude = state.prompt.reasoning_exclude;\n const includeReasoning = state.prompt.include_reasoning;\n const includePastTools = state.prompt.include_past_tools ?? true;\n\n // Add agent prompt content to messages\n const promptContent = await this.interpolatePrompt(\n state.prompt.prompt,\n state.context || {},\n state\n );\n\n const systemPromptText = await this.runAfterSystemMessageHook(\n state,\n promptContent\n ); // Store for logging\n\n messages.push({\n role: \"system\",\n content: systemPromptText,\n });\n\n // Filter out pending messages - they should NEVER be sent to the LLM\n const completedMessages = state.messageHistory.filter(\n (msg) => msg.status !== \"pending\"\n );\n\n // Context management: determine threshold for replacing old images with descriptions\n // Messages beyond this threshold will have their images replaced with text descriptions\n // to save context window space\n const recentMessageThreshold = state.prompt.recentImageThreshold ?? 10;\n const oldMessageThreshold = completedMessages.length - recentMessageThreshold;\n\n // Second pass: add messages and inject error responses for missing tool results\n // For dual_ai agents: Transform roles based on perspective\n // - Current side's messages should be labeled \"assistant\"\n // - Opposing side's messages should be labeled \"user\"\n // - System messages remain unchanged\n // - Tool messages are filtered by side (only show current side's tool calls)\n let messageIndex = 0;\n for (const msg of completedMessages) {\n // IMPORTANT: Roles encode side information\n // - role=\"assistant\" = Side A messages\n // - role=\"user\" = Side B messages\n // This allows us to filter tool calls without a separate \"side\" column\n\n // Skip ALL tool messages when includePastTools is false\n if (!includePastTools && msg.role === \"tool\") {\n continue;\n }\n\n // Filter tool messages by side - each AI should only see its own tool calls\n if (state.agentConfig.type === \"dual_ai\" && msg.role === \"tool\" && msg.tool_call_id) {\n // Find the parent message that made this tool call\n const parentMsg = completedMessages.find(m => {\n if (!m.tool_calls) return false;\n try {\n const toolCalls = JSON.parse(m.tool_calls);\n return toolCalls.some((tc: any) => tc.id === msg.tool_call_id);\n } catch {\n return false;\n }\n });\n\n if (parentMsg) {\n // Determine which side made this tool call based on parent message role\n // role=\"assistant\" means Side A made the call\n // role=\"user\" means Side B made the call\n const toolCallSide = parentMsg.role === \"assistant\" ? \"a\" : \"b\";\n\n // Skip tool calls from the opposing side\n if (toolCallSide !== state.currentSide) {\n continue; // Don't include this tool message\n }\n }\n }\n\n let role = msg.role;\n\n // Transform role based on perspective for dual_ai agents\n if (state.agentConfig.type === \"dual_ai\") {\n if (msg.role === \"assistant\") {\n // Message is from side A - keep as \"assistant\" if current side is A, else \"user\"\n role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n } else if (msg.role === \"user\") {\n // Message is from side B - keep as \"user\" if current side is A, else \"assistant\"\n role = state.currentSide === \"a\" ? \"user\" : \"assistant\";\n }\n // system and tool roles remain unchanged\n }\n\n // Prepare message content - resolve attachments for messages that are\n // presented to the current side as user messages (after role transform).\n // Only resolve attachments if the model supports vision\n // For old messages (beyond recentImageThreshold), replace images with text descriptions\n let messageContent: MessageContent;\n const hasAttachments = msg.attachments && msg.attachments !== \"[]\";\n const isOldMessage = messageIndex < oldMessageThreshold;\n\n if (hasAttachments && role === \"user\") {\n const attachments: AttachmentRef[] = JSON.parse(msg.attachments!);\n const imageAttachments = attachments.filter((a) =>\n a.mimeType.startsWith(\"image/\")\n );\n\n if (isOldMessage && imageAttachments.length > 0) {\n // Old message with images - use text descriptions instead of actual images\n const imageDescriptions = imageAttachments\n .map(buildImageDescription)\n .join(\"\\n\");\n const nonImageFiles = attachments\n .filter((a) => !a.mimeType.startsWith(\"image/\"))\n .map((a) => a.name);\n const nonImageList =\n nonImageFiles.length > 0\n ? `\\n[Other files: ${nonImageFiles.join(\", \")}]`\n : \"\";\n\n messageContent = msg.content\n ? `${imageDescriptions}${nonImageList}\\n\\n${msg.content}`\n : `${imageDescriptions}${nonImageList}`;\n } else {\n // Recent message - always send images as multimodal content\n // Let the provider error if it doesn't support vision\n if (imageAttachments.length > 0) {\n messageContent = await this.resolveAttachmentsToContent(msg, state, imagePathMap);\n } else {\n // Non-image attachments only - append file list\n const fileList = attachments.map((a) => a.name).join(\", \");\n messageContent = msg.content\n ? `${msg.content}\\n\\n[Attached files: ${fileList}]`\n : `[Attached files: ${fileList}]`;\n }\n }\n } else {\n messageContent = msg.content || \"\";\n }\n messageIndex++;\n\n const shouldIncludeAssistantToolCalls =\n includePastTools && role === \"assistant\" && Boolean(msg.tool_calls);\n\n // When includePastTools is false, strip tool_calls from messages\n const messageToAdd: any = {\n role,\n content: messageContent,\n tool_calls: shouldIncludeAssistantToolCalls ? JSON.parse(msg.tool_calls!) : undefined,\n tool_call_id:\n includePastTools && msg.role === \"tool\" && msg.tool_call_id\n ? msg.tool_call_id\n : undefined,\n name: msg.name || undefined,\n // For tool messages, also set toolName for provider transformers (e.g., OpenAI image_generation)\n toolName: msg.role === \"tool\" ? msg.name : undefined,\n };\n\n // For tool messages with attachments, load attachment data for provider transformation\n // This enables provider-specific handling (e.g., OpenAI's image_generation_call format)\n if (msg.role === \"tool\" && msg.attachments && msg.attachments !== \"[]\") {\n const attachmentRefs: AttachmentRef[] = JSON.parse(msg.attachments);\n const providerAttachments: ProviderAttachment[] = [];\n\n for (const ref of attachmentRefs) {\n if (ref.mimeType?.startsWith(\"image/\")) {\n try {\n // readFile returns { success: boolean, data?: string (base64), error?: string }\n const result = await state.thread.instance.readFile(ref.path);\n if (result?.success && result.data) {\n // Data is already base64 encoded from readFile\n providerAttachments.push({\n type: \"image\",\n data: result.data,\n mediaType: ref.mimeType,\n name: ref.name,\n path: ref.path,\n });\n }\n } catch (e) {\n console.error(`[FlowEngine] Failed to load attachment ${ref.path}:`, e);\n }\n }\n }\n\n if (providerAttachments.length > 0) {\n messageToAdd.attachments = providerAttachments;\n }\n }\n\n // Add reasoning if present and includeReasoning is enabled\n // Convert reasoning_content to synthetic detail, combine with structured reasoning\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if (includeReasoning) {\n const reasoningDetailsArray: any[] = [];\n\n // If we have reasoning_content (accumulated text), add it as a single text detail\n if (msg.reasoning_content) {\n reasoningDetailsArray.push({\n type: \"reasoning.text\",\n text: msg.reasoning_content\n });\n }\n\n // Add any non-text reasoning_details (summaries, encrypted, etc.)\n if (msg.reasoning_details) {\n try {\n const parsedDetails = JSON.parse(msg.reasoning_details);\n reasoningDetailsArray.push(...parsedDetails);\n } catch (e) {\n console.error(`[FlowEngine] Failed to parse reasoning_details for message ${msg.id}:`, e);\n }\n }\n\n // Only add reasoning_details if we have any\n if (reasoningDetailsArray.length > 0) {\n messageToAdd.reasoning_details = reasoningDetailsArray;\n }\n }\n\n // Preserve steering/tool-call history here.\n // Provider-bound normalization will enforce contiguous tool-result ordering.\n messages.push(messageToAdd);\n }\n\n // Inject step budget awareness system message at the bottom to preserve prompt cache\n const maxSteps = state.currentSide === \"a\"\n ? state.agentConfig.side_a_max_steps\n : state.agentConfig.side_b_max_steps;\n\n // Only inject budget message if maxSteps is a valid number\n if (typeof maxSteps === \"number\" && !isNaN(maxSteps)) {\n const currentSideStepCount = state.currentSide === \"a\"\n ? state.sideAStepCount\n : state.sideBStepCount;\n\n const stepsRemaining = maxSteps - currentSideStepCount;\n\n // Note: currentSideStepCount has already been incremented in executeStep(), so we don't add 1\n let budgetMessage: string;\n\n if (stepsRemaining === 0) {\n budgetMessage = '[STEP BUDGET] ⚠️ CRITICAL: You must complete your task NOW or an error will be thrown. This is your final step.';\n } else if (stepsRemaining === 1) {\n budgetMessage = '[STEP BUDGET] ⚠️ CRITICAL: Only 1 step available after this before an error will be thrown. Reach completion immediately.';\n } else if (stepsRemaining <= 3) {\n budgetMessage = `[STEP BUDGET] ⚠️ WARNING: Only ${stepsRemaining} steps available before an error will be thrown. Reach completion as soon as possible.`;\n } else {\n budgetMessage = `[STEP BUDGET] ${stepsRemaining} steps available before an error will be thrown. Work efficiently toward completion.`;\n }\n\n messages.push({\n role: \"system\",\n content: budgetMessage,\n });\n }\n\n // Inject active resumable subagent registry at the very bottom.\n const subagentRegistry = await this.getSubagentRegistry(state);\n if (subagentRegistry.length > 0) {\n const fallbackNameMap = await this.resolveRegistryThreadNameMap(state, subagentRegistry);\n const lines = subagentRegistry.map((entry) => {\n const threadName =\n this.getRegistryThreadName(entry) ??\n fallbackNameMap.get(entry.reference) ??\n null;\n const displayName = threadName ? `${entry.name} (${threadName})` : entry.name;\n return `- Reference: ${entry.reference}\\n Name: ${displayName}\\n Description: ${entry.description}\\n Status: ${entry.status}`;\n });\n messages.push({\n role: \"system\",\n content: `Active subagent instances:\\n\\n${lines.join(\"\\n\\n\")}`,\n });\n }\n\n // Get tools attached to this specific prompt (not all available tools)\n const tools = await this.getToolsForPrompt(state, state.prompt);\n\n // Handle tool_choice: convert \"function\" to object format if needed\n let finalToolChoice: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } } | undefined;\n if (toolChoice === \"function\" && tools.length === 1) {\n // Convert \"function\" to object format with the single tool's name\n finalToolChoice = {\n type: \"function\",\n function: {\n name: tools[0].function.name\n }\n };\n } else if (toolChoice && toolChoice !== \"function\") {\n // Use string value for auto/none/required\n finalToolChoice = toolChoice;\n }\n\n // Build reasoning configuration if either field is set (implicit enable)\n let reasoning: RequestContext[\"reasoning\"] | undefined;\n if (reasoningEffort || reasoningMaxTokens) {\n reasoning = {\n effort: reasoningEffort ?? undefined, // Convert null to undefined\n max_tokens: reasoningMaxTokens ?? undefined,\n exclude: reasoningExclude,\n };\n }\n\n return {\n messages,\n model,\n tools,\n stream: true,\n systemPrompt: systemPromptText,\n promptName: promptName,\n // Use parentLogId from state if this is a chained prompt, otherwise use currentLogId for nested tool calls\n parentLogId: state.parentLogId || state.currentLogId || null,\n // Retries now apply to all prompts (top-level and sub-prompts), only for provider errors\n parallel_tool_calls: parallelToolCalls,\n tool_choice: finalToolChoice,\n reasoning: reasoning,\n imagePathMap: imagePathMap.size > 0 ? imagePathMap : undefined,\n };\n }\n\n /**\n * Interpolate prompt template with context data\n * Prompts can be:\n * 1. Plain strings - returned as-is (with legacy {{var}} interpolation)\n * 2. StructuredPrompt arrays - array of {type, value/id} objects\n * 3. JSON string of a StructuredPrompt array - legacy format, parsed first\n */\n private static async interpolatePrompt(\n promptTemplate: string | any[],\n context: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n // If already an array (StructuredPrompt), process it directly\n if (Array.isArray(promptTemplate)) {\n return this.processPromptParts(promptTemplate, context, state);\n }\n\n // If it's a string, check if it's JSON (legacy format) or plain text\n if (typeof promptTemplate === \"string\") {\n // Try to parse as JSON array (legacy format)\n try {\n const parsed = JSON.parse(promptTemplate);\n if (Array.isArray(parsed)) {\n return this.processPromptParts(parsed, context, state);\n }\n // If parsed but not an array, treat as plain string\n return promptTemplate;\n } catch {\n // Not JSON, return as plain string\n return promptTemplate;\n }\n }\n\n // Fallback for unexpected types\n return String(promptTemplate);\n }\n\n /**\n * Process an array of prompt parts into a final string.\n * Supports both new format (type: 'text'/'include') and legacy format (type: 'string'/'prompt'/'variable')\n */\n private static async processPromptParts(\n parts: any[],\n context: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n const results = await Promise.all(\n parts.map(async (part: any) => {\n // New format: { type: 'text', content: '...' }\n if (part.type === \"text\") {\n return part.content || \"\";\n }\n // New format: { type: 'include', prompt: '...' }\n else if (part.type === \"include\") {\n const promptName = part.prompt;\n return await this.loadAndInterpolatePrompt(promptName, context, state);\n }\n // New format: { type: 'env', property: '...' }\n else if (part.type === \"env\") {\n const property = part.property;\n if (!property) return \"\";\n try {\n const threadState = ThreadStateImpl.fromFlowState(state);\n return await threadState.env(property);\n } catch {\n return \"\";\n }\n }\n // Legacy format: { type: 'string', value: '...' }\n else if (part.type === \"string\") {\n return part.value || \"\";\n }\n // Legacy format: { type: 'variable', value: '...' }\n else if (part.type === \"variable\") {\n const value = context[part.value];\n if (value === undefined) {\n console.warn(`Missing variable in context: ${part.value}`);\n return `{{${part.value}}}`;\n }\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n // Legacy format: { type: 'prompt', id: '...' }\n else if (part.type === \"prompt\") {\n const promptName = part.id;\n return await this.loadAndInterpolatePrompt(promptName, context, state, part.label);\n }\n return \"\";\n })\n );\n\n return results.join(\"\");\n }\n\n /**\n * Load a referenced prompt and interpolate it\n */\n private static async loadAndInterpolatePrompt(\n promptName: string,\n context: Record<string, any>,\n state: FlowState,\n label?: string\n ): Promise<string> {\n try {\n const promptDef = await state.thread.instance.loadPrompt(promptName);\n\n if (!promptDef) {\n console.warn(`Referenced prompt not found: ${promptName}`);\n return `[Prompt not found: ${label || promptName}]`;\n }\n\n // Recursively interpolate the referenced prompt\n return await this.interpolatePrompt(\n promptDef.prompt,\n context,\n state\n );\n } catch (error) {\n console.error(`Error loading prompt ${promptName}:`, error);\n return `[Error loading prompt: ${label || promptName}]`;\n }\n }\n\n /**\n * Get tools attached to a specific prompt from PromptData._tools\n * Returns only the tools that are actually configured for this prompt.\n * Agents (ai_human) in the tools array are included as handoff tools.\n * Provider tools (prefixed with \"provider:\") are loaded from the model's provider.\n */\n private static async getToolsForPrompt(\n state: FlowState,\n promptData: import(\"./types\").PromptData\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n // Check if this is a packed context (use namespaceContext from state)\n const packageId = state.namespaceContext.type === 'packed'\n ? state.namespaceContext.packageId\n : undefined;\n\n try {\n // Get tool names from the prompt definition\n const toolConfigs = promptData._tools || [];\n const enabledToolConfigs: Array<\n string | SubpromptConfig | PromptToolConfig | SubagentToolConfig\n > = [];\n for (const entry of toolConfigs) {\n if (entry && typeof entry === \"object\") {\n const optionalEnvName =\n typeof (entry as SubagentToolConfig).optional === \"string\"\n ? (entry as SubagentToolConfig).optional\n : undefined;\n const optionalEnabled = await this.isOptionalToolEnabled(\n state,\n optionalEnvName\n );\n if (!optionalEnabled) {\n continue;\n }\n }\n enabledToolConfigs.push(entry);\n }\n\n const toolNames = enabledToolConfigs.map((t: any) =>\n typeof t === 'string' ? t : t.name\n );\n const promptSubagents = await this.resolvePromptSubagents(\n state,\n enabledToolConfigs,\n packageId\n );\n const resumablePromptSubagents = promptSubagents.filter(\n (entry) => entry.resumable\n );\n const subagentNameSet = new Set(\n resumablePromptSubagents.map((entry) => entry.name)\n );\n\n const subagentToolConfigs = new Map<string, SubagentToolConfig>();\n for (const config of enabledToolConfigs) {\n if (\n typeof config === \"object\" &&\n config !== null &&\n \"name\" in config &&\n (\"blocking\" in config || \"resumable\" in config)\n ) {\n subagentToolConfigs.set(config.name as string, config as SubagentToolConfig);\n }\n }\n\n const childrenRegistry = await this.getSubagentRegistry(state);\n const activeInstanceCounts = new Map<string, number>();\n for (const child of childrenRegistry) {\n if (child.status !== \"terminated\") {\n activeInstanceCounts.set(\n child.name,\n (activeInstanceCounts.get(child.name) ?? 0) + 1\n );\n }\n }\n\n if (toolNames.length > 0) {\n // Separate provider tools from regular tools\n const providerToolNames: string[] = [];\n const regularToolNames: string[] = [];\n\n for (const toolName of toolNames) {\n if (toolName.startsWith('provider:')) {\n providerToolNames.push(toolName);\n } else if (!subagentNameSet.has(toolName)) {\n regularToolNames.push(toolName);\n }\n }\n\n // Load regular tools\n if (regularToolNames.length > 0) {\n // For packed prompts, load tools from the packed namespace\n if (packageId) {\n console.log(`[FlowEngine] Loading tools for packed prompt (package: ${packageId}): [${regularToolNames.join(', ')}]`);\n\n for (const toolName of regularToolNames) {\n const subagentConfig = subagentToolConfigs.get(toolName);\n const maxInstances =\n subagentConfig &&\n subagentConfig.resumable &&\n typeof subagentConfig.resumable === \"object\"\n ? subagentConfig.resumable.maxInstances\n : undefined;\n if (\n typeof maxInstances === \"number\" &&\n maxInstances > 0 &&\n (activeInstanceCounts.get(toolName) ?? 0) >= maxInstances\n ) {\n continue;\n }\n\n // Qualify name with package ID for lookup\n const qualifiedName = toolName.includes('/') ? toolName : `${packageId}/${toolName}`;\n let loaded = false;\n\n // 1. Try to load as a native tool\n try {\n const toolDef = await state.thread.instance.loadTool(qualifiedName);\n\n if (toolDef) {\n // Convert Zod schema to JSON Schema if present\n let parameters: Record<string, any> | undefined;\n if (toolDef.args) {\n parameters = this.zodToJsonSchema(toolDef.args);\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName, // Use the unqualified name for the LLM\n description: toolDef.description,\n parameters,\n },\n });\n console.log(`[FlowEngine] Loaded packed tool: ${qualifiedName} -> ${toolName}`);\n loaded = true;\n }\n } catch {\n // Not a native tool, try sub-prompt\n }\n\n // 2. Try to load as a sub-prompt (prompt used as tool)\n if (!loaded) {\n try {\n const promptDef = await state.thread.instance.loadPrompt(qualifiedName);\n\n if (promptDef) {\n // Build parameters from requiredSchema if present\n let parameters: Record<string, any> | undefined;\n if (promptDef.requiredSchema) {\n parameters = this.zodToJsonSchema(promptDef.requiredSchema);\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName, // Use the unqualified name for the LLM\n description: promptDef.toolDescription || `Execute the ${promptDef.name} prompt`,\n parameters,\n },\n });\n console.log(`[FlowEngine] Loaded packed sub-prompt: ${qualifiedName} -> ${toolName}`);\n loaded = true;\n }\n } catch {\n // Not a sub-prompt, try agent\n }\n }\n\n // 3. Try to load as an agent (agent used as tool)\n if (!loaded) {\n try {\n const agentDef = await state.thread.instance.loadAgent(qualifiedName);\n\n if (agentDef && (agentDef.type === 'ai_human' || agentDef.type === 'dual_ai')) {\n // Get the agent's side_a prompt to use its requiredSchema\n let parameters: Record<string, any> | undefined;\n const sideAPromptName = agentDef.sideA?.prompt;\n if (sideAPromptName) {\n try {\n // Qualify prompt name if needed\n const qualifiedPromptName = sideAPromptName.includes('/') ? sideAPromptName : `${packageId}/${sideAPromptName}`;\n const agentPromptDef = await state.thread.instance.loadPrompt(qualifiedPromptName);\n if (agentPromptDef.requiredSchema) {\n parameters = this.zodToJsonSchema(agentPromptDef.requiredSchema);\n }\n } catch (promptError) {\n console.error(`[FlowEngine] Error loading prompt schema for packed agent ${toolName}:`, promptError);\n }\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName,\n description:\n agentDef.toolDescription ||\n (agentDef.type === \"dual_ai\"\n ? `Run ${agentDef.title || toolName} subagent`\n : `Hand off conversation to ${agentDef.title || toolName} agent`),\n parameters,\n },\n });\n console.log(`[FlowEngine] Loaded packed agent as tool: ${qualifiedName} -> ${toolName}`);\n loaded = true;\n }\n } catch {\n // Not an agent either\n }\n }\n\n if (!loaded) {\n console.warn(`[FlowEngine] Could not load packed tool/prompt/agent: ${toolName} (tried ${qualifiedName})`);\n }\n }\n } else {\n // Global prompt - use getAvailableTools for global tools\n // Load all available tools (native + prompts + agents with exposeAsTool)\n const allTools = await this.getAvailableTools(state);\n\n // Filter to only include tools that are in the tools list\n const selectedTools = allTools.filter((tool) => {\n if (!regularToolNames.includes(tool.function.name)) {\n return false;\n }\n\n const subagentConfig = subagentToolConfigs.get(tool.function.name);\n const maxInstances =\n subagentConfig &&\n subagentConfig.resumable &&\n typeof subagentConfig.resumable === \"object\"\n ? subagentConfig.resumable.maxInstances\n : undefined;\n\n if (\n typeof maxInstances === \"number\" &&\n maxInstances > 0 &&\n (activeInstanceCounts.get(tool.function.name) ?? 0) >= maxInstances\n ) {\n return false;\n }\n\n return true;\n });\n tools.push(...selectedTools);\n\n // Track which tool names were found\n const foundToolNames = new Set(selectedTools.map(t => t.function.name));\n\n // Check for agents in tools array that weren't in allTools (i.e., don't have exposeAsTool)\n for (const toolName of regularToolNames) {\n const subagentConfig = subagentToolConfigs.get(toolName);\n const maxInstances =\n subagentConfig &&\n subagentConfig.resumable &&\n typeof subagentConfig.resumable === \"object\"\n ? subagentConfig.resumable.maxInstances\n : undefined;\n if (\n typeof maxInstances === \"number\" &&\n maxInstances > 0 &&\n (activeInstanceCounts.get(toolName) ?? 0) >= maxInstances\n ) {\n continue;\n }\n\n if (foundToolNames.has(toolName)) continue;\n\n try {\n const agentDef = await state.thread.instance.loadAgent(toolName);\n if (agentDef && (agentDef.type === 'ai_human' || agentDef.type === 'dual_ai')) {\n // Get the agent's side_a prompt to use its requiredSchema\n let parameters: Record<string, any> | undefined;\n const sideAPromptName = agentDef.sideA?.prompt;\n if (sideAPromptName) {\n try {\n const agentPromptDef = await state.thread.instance.loadPrompt(sideAPromptName);\n if (agentPromptDef.requiredSchema) {\n parameters = this.zodToJsonSchema(agentPromptDef.requiredSchema);\n }\n } catch (promptError) {\n console.error(`Error loading prompt schema for agent ${toolName}:`, promptError);\n }\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName,\n description:\n agentDef.toolDescription ||\n (agentDef.type === \"dual_ai\"\n ? `Run ${agentDef.title || toolName} subagent`\n : `Hand off conversation to ${agentDef.title || toolName} agent`),\n parameters,\n },\n });\n }\n } catch {\n // Not an agent, tool might be missing - will error at call time\n }\n }\n }\n }\n\n // Load provider tools\n if (providerToolNames.length > 0) {\n const providerTools = await this.loadProviderTools(state, providerToolNames);\n tools.push(...providerTools);\n }\n }\n\n if (\n resumablePromptSubagents.length > 0 &&\n !tools.some((tool) => tool.function.name === \"subagent_create\")\n ) {\n tools.push(this.buildSubagentCreateTool(resumablePromptSubagents));\n }\n\n // Auto-inject subagent_message when resumable children are still active.\n const hasActiveResumable = childrenRegistry.some(\n (entry) => entry.status !== \"terminated\"\n );\n if (\n hasActiveResumable &&\n !tools.some((tool) => tool.function.name === \"subagent_message\")\n ) {\n tools.push({\n type: \"function\",\n function: {\n name: \"subagent_message\",\n description:\n \"Send a message to an existing resumable subagent instance by reference ID.\",\n parameters: {\n type: \"object\",\n properties: {\n referenceId: {\n type: \"string\",\n description: \"The subagent reference UUID\",\n },\n message: {\n type: \"string\",\n description: \"The message content to send\",\n },\n attachments: {\n type: \"array\",\n description:\n \"Attachment paths from this thread to copy into the subagent thread. Pass [] when none.\",\n items: {\n type: \"string\",\n },\n },\n },\n required: [\"referenceId\", \"message\", \"attachments\"],\n },\n },\n });\n }\n\n console.log(`[FlowEngine] getToolsForPrompt result: ${tools.length} tools loaded for prompt ${promptData.name}`);\n return tools;\n } catch (error) {\n console.error(\"Error loading tools for prompt:\", error);\n await this.logError(\n state,\n error,\n \"tool_loading_error\",\n `FlowEngine.getToolsForPrompt (prompt: ${promptData.name})`\n );\n return tools;\n }\n }\n\n /**\n * Load provider tools based on the current model's provider.\n * Provider tools are stored with \"provider:\" prefix in prompts.\n * The actual tool name sent to the LLM has the prefix stripped.\n */\n private static async loadProviderTools(\n state: FlowState,\n providerToolNames: string[]\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get the model definition to find the provider\n const modelName = state.prompt.model;\n const modelDef = await state.thread.instance.loadModel(modelName);\n if (!modelDef) {\n console.warn(`[FlowEngine] Cannot load provider tools: model \"${modelName}\" not found`);\n return tools;\n }\n\n const providerInstance = typeof modelDef.provider === 'function'\n ? modelDef.provider({ apiKey: '' })\n : null;\n const providerName = providerInstance?.name ||\n (typeof modelDef.provider === 'string' ? modelDef.provider : null);\n\n if (!providerName) {\n console.warn(`[FlowEngine] Cannot load provider tools: no provider for model \"${modelName}\"`);\n return tools;\n }\n\n // Get the provider's tools\n const providerTools = providerInstance?.getTools\n ? await providerInstance.getTools(modelDef.model)\n : {};\n\n // Filter to requested tools and map to tool definitions\n for (const prefixedName of providerToolNames) {\n const toolName = prefixedName.slice('provider:'.length);\n const providerTool = providerTools[toolName];\n\n if (providerTool) {\n const { description, args: argsSchema, executionMode, executionProvider } = providerTool;\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName, // Strip prefix for LLM\n description: description || `Provider tool: ${toolName}`,\n parameters: argsSchema ? this.zodToJsonSchema(argsSchema) : { type: \"object\", properties: {} },\n },\n // Use spec-standard execution mode fields\n executionMode: executionMode || 'provider',\n executionProvider: executionProvider || providerName,\n } as import(\"./types\").ToolDefinition);\n } else {\n console.warn(`[FlowEngine] Provider tool \"${toolName}\" not found for provider \"${providerName}\"`);\n }\n }\n } catch (error) {\n console.error(\"Error loading provider tools:\", error);\n }\n\n return tools;\n }\n\n private static async resolvePromptSubagents(\n state: FlowState,\n toolConfigs: Array<\n string | SubpromptConfig | PromptToolConfig | SubagentToolConfig\n >,\n packageId?: string\n ): Promise<PromptSubagentDescriptor[]> {\n const descriptors: PromptSubagentDescriptor[] = [];\n const seen = new Set<string>();\n\n for (const configEntry of toolConfigs) {\n const toolName =\n typeof configEntry === \"string\"\n ? configEntry\n : typeof configEntry?.name === \"string\"\n ? configEntry.name\n : null;\n\n if (!toolName || toolName.startsWith(\"provider:\") || seen.has(toolName)) {\n continue;\n }\n\n const agentDef = await this.tryLoadPromptToolAgent(state, toolName, packageId);\n if (!agentDef || agentDef.type !== \"dual_ai\") {\n continue;\n }\n\n seen.add(toolName);\n const subagentConfig = this.isSubagentToolConfig(configEntry)\n ? configEntry\n : undefined;\n const blocking = subagentConfig?.blocking ?? true;\n const resumable =\n !!subagentConfig?.resumable && typeof subagentConfig.resumable === \"object\";\n\n descriptors.push({\n name: toolName,\n title: agentDef.title || toolName,\n description:\n agentDef.toolDescription ||\n `Run ${agentDef.title || toolName} subagent`,\n blocking,\n resumable,\n maxInstances:\n subagentConfig?.resumable && typeof subagentConfig.resumable === \"object\"\n ? subagentConfig.resumable.maxInstances\n : undefined,\n });\n }\n\n return descriptors;\n }\n\n private static async tryLoadPromptToolAgent(\n state: FlowState,\n toolName: string,\n packageId?: string\n ): Promise<any | null> {\n if (packageId) {\n try {\n const qualifiedName = toolName.includes(\"/\")\n ? toolName\n : `${packageId}/${toolName}`;\n const loaded = await state.thread.instance.loadAgent(qualifiedName);\n if (loaded) {\n return loaded;\n }\n } catch {\n // Fall through to global lookup.\n }\n }\n\n try {\n return await state.thread.instance.loadAgent(toolName);\n } catch {\n return null;\n }\n }\n\n private static isSubagentToolConfig(\n configEntry: string | SubpromptConfig | PromptToolConfig | SubagentToolConfig\n ): configEntry is SubagentToolConfig {\n if (typeof configEntry !== \"object\" || configEntry === null) {\n return false;\n }\n\n return (\n \"blocking\" in configEntry ||\n \"resumable\" in configEntry ||\n \"immediate\" in configEntry ||\n \"optional\" in configEntry ||\n \"initUserMessageProperty\" in configEntry ||\n \"initAttachmentsProperty\" in configEntry ||\n \"initAgentNameProperty\" in configEntry\n );\n }\n\n private static buildSubagentCreateTool(\n promptSubagents: PromptSubagentDescriptor[]\n ): import(\"./types\").ToolDefinition {\n const agentNames = promptSubagents.map((entry) => entry.name);\n const descriptionLines = promptSubagents.map((entry) => {\n const mode = `${entry.blocking ? \"blocking\" : \"non-blocking\"}, ${\n entry.resumable ? \"resumable\" : \"non-resumable\"\n }`;\n const maxInstances =\n typeof entry.maxInstances === \"number\" && entry.maxInstances > 0\n ? `, max instances: ${entry.maxInstances}`\n : \"\";\n return `- ${entry.name}: ${entry.description} (mode: ${mode}${maxInstances})`;\n });\n\n return {\n type: \"function\",\n function: {\n name: \"subagent_create\",\n description: [\n \"Create and run a configured resumable dual_ai subagent.\",\n \"Available resumable subagents:\",\n ...descriptionLines,\n \"Use subagent_message for follow-up communication with resumable instances.\",\n ].join(\"\\n\"),\n parameters: {\n type: \"object\",\n properties: {\n agent: {\n type: \"string\",\n enum: agentNames,\n description: \"Subagent name to create.\",\n },\n message: {\n type: \"string\",\n description: \"Initial instruction message for the subagent.\",\n },\n attachments: {\n type: \"array\",\n description:\n \"Attachment paths from this thread to copy into the subagent thread. Pass [] when none.\",\n items: {\n type: \"string\",\n },\n },\n name: {\n type: \"string\",\n description:\n \"Required human-readable instance name for the spawned subagent thread. Use a concise stable label that identifies this child instance.\",\n },\n },\n required: [\"agent\", \"message\", \"attachments\", \"name\"],\n },\n },\n };\n }\n\n /**\n * Convert a Zod schema to JSON Schema format for tool parameters.\n * Uses Zod's built-in toJSONSchema for reliable conversion.\n */\n private static sanitizeToolJsonSchema(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => this.sanitizeToolJsonSchema(item));\n }\n if (!value || typeof value !== 'object') {\n return value;\n }\n\n const sanitized: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n if (key === '$schema' || key === 'propertyNames') {\n continue;\n }\n sanitized[key] = this.sanitizeToolJsonSchema(child);\n }\n\n const type = sanitized.type;\n const isObjectSchema =\n type === 'object' ||\n (Array.isArray(type) && type.includes('object'));\n if (isObjectSchema) {\n sanitized.additionalProperties = false;\n }\n\n return sanitized;\n }\n\n private static zodToJsonSchema(zodSchema: any): any {\n try {\n // Use Zod's built-in toJSONSchema for reliable conversion\n const jsonSchema = z.toJSONSchema(zodSchema);\n return this.sanitizeToolJsonSchema({\n type: \"object\",\n properties: (jsonSchema as any).properties || {},\n required: (jsonSchema as any).required || [],\n additionalProperties: false,\n });\n } catch (error) {\n console.error('[FlowEngine.zodToJsonSchema] Failed to convert schema:', error);\n // Fallback to empty object schema\n return { type: 'object', properties: {} };\n }\n }\n\n /**\n * Get available tools for the current agent\n * Returns tool definitions in OpenAI format\n */\n private static async getAvailableTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // 1. Load native tools from toolsDir\n const nativeTools = await this.loadNativeTools(state);\n tools.push(...nativeTools);\n\n // 2. Load exposed prompts from D1\n const promptTools = await this.loadPromptTools(state);\n tools.push(...promptTools);\n\n // 3. Load exposed agents from D1\n const agentTools = await this.loadAgentTools(state);\n tools.push(...agentTools);\n\n // 4. Check for duplicate tool names and warn\n const toolNameSources = new Map<string, Set<string>>();\n\n // Track sources for each tool name\n for (const tool of nativeTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('native tool');\n toolNameSources.set(tool.function.name, sources);\n }\n for (const tool of promptTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('prompt');\n toolNameSources.set(tool.function.name, sources);\n }\n for (const tool of agentTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('agent');\n toolNameSources.set(tool.function.name, sources);\n }\n\n // Warn about duplicates\n for (const [name, sources] of toolNameSources) {\n if (sources.size > 1) {\n console.warn(\n `[AgentBuilder] Duplicate tool name \"${name}\" detected (sources: ${[...sources].join(', ')}). ` +\n `This may cause unexpected behavior. Consider renaming one of them.`\n );\n }\n }\n } catch (error) {\n console.error(\"Error loading tools:\", error);\n await this.logError(\n state,\n error,\n \"tool_discovery_error\",\n \"FlowEngine.getAvailableTools\"\n );\n }\n\n return tools;\n }\n\n /**\n * Load native tools from toolsDir directory\n */\n private static async loadNativeTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get tools from thread instance (user's extended Thread class)\n const toolRegistry = state.thread.instance.tools();\n\n for (const [toolName, toolLoader] of Object.entries(toolRegistry)) {\n try {\n const { description, args: argsSchema } = await toolLoader();\n\n // Convert Zod schema to JSON Schema if present using Zod 4's native toJSONSchema\n let parameters: Record<string, any> | undefined;\n\n if (argsSchema) {\n parameters = this.zodToJsonSchema(argsSchema);\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName,\n description,\n parameters,\n },\n });\n } catch (toolError) {\n console.error(`Error loading native tool ${toolName}:`, toolError);\n }\n }\n } catch (error) {\n console.error(\"Error loading native tools registry:\", error);\n }\n\n return tools;\n }\n\n /**\n * Load exposed prompts as tools from TypeScript configs\n */\n private static async loadPromptTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get all prompt names - all prompts are exposed as tools\n const promptNames = state.thread.instance.getPromptNames();\n\n for (const name of promptNames) {\n try {\n const promptDef = await state.thread.instance.loadPrompt(name);\n\n // Build parameters from requiredSchema if present\n let parameters: Record<string, any> | undefined;\n\n if (promptDef.requiredSchema) {\n try {\n parameters = this.zodToJsonSchema(promptDef.requiredSchema);\n } catch (parseError) {\n console.error(\n `Error converting schema for prompt ${name}:`,\n parseError\n );\n }\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: promptDef.name,\n description: promptDef.toolDescription,\n parameters,\n },\n });\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n }\n }\n } catch (error) {\n console.error(\"Error loading prompt tools:\", error);\n }\n\n return tools;\n }\n\n /**\n * Load exposed agents as tools from TypeScript configs\n */\n private static async loadAgentTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get all agent names and check which have exposeAsTool\n const agentNames = state.thread.instance.getAgentNames();\n\n for (const name of agentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(name);\n\n if (agentDef.exposeAsTool) {\n // Get the agent's side_a prompt to use its requiredSchema\n let parameters: Record<string, any> | undefined;\n const sideAPromptName = agentDef.sideA?.prompt;\n if (sideAPromptName) {\n try {\n const promptDef = await state.thread.instance.loadPrompt(sideAPromptName);\n if (promptDef.requiredSchema) {\n parameters = this.zodToJsonSchema(promptDef.requiredSchema);\n }\n } catch (promptError) {\n console.error(`Error loading prompt schema for agent ${name}:`, promptError);\n }\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: name,\n description: agentDef.toolDescription || `Execute the ${agentDef.title || name} agent`,\n parameters,\n },\n });\n }\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n }\n }\n } catch (error) {\n console.error(\"Error loading agent tools:\", error);\n }\n\n return tools;\n }\n\n // ==========================================================================\n // Hook Resolution Helpers\n // ==========================================================================\n\n /**\n * Get the list of hook IDs that should run for the current context.\n * Resolution: prompt hooks > agent hooks > empty array\n *\n * @param state - Flow state with prompt and agent configuration\n * @returns Array of hook IDs to execute\n */\n private static getActiveHookIds(state: FlowState): string[] {\n // Check prompt-level hooks first\n if (state.prompt?._hooks !== undefined && state.prompt._hooks.length > 0) {\n return state.prompt._hooks;\n }\n\n // Fall back to agent-level hooks\n if (state.agentConfig.hooks !== undefined && state.agentConfig.hooks.length > 0) {\n return state.agentConfig.hooks;\n }\n\n // Neither defines hooks\n return [];\n }\n\n /**\n * Get hooks of a specific type from the active hook IDs.\n * Returns typed hook executors in the order they appear in the hooks array.\n *\n * @template K - The hook type name (ensures type-safe executors)\n * @param state - Flow state with hook configuration\n * @param hookType - The hook type to filter for\n * @returns Array of typed hook executor functions\n */\n private static async getHooksForType<K extends HookName>(\n state: FlowState,\n hookType: K\n ): Promise<Array<HookExecutor<K>>> {\n const hookIds = this.getActiveHookIds(state);\n if (hookIds.length === 0) return [];\n\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry) return [];\n\n const executors: Array<HookExecutor<K>> = [];\n\n for (const hookId of hookIds) {\n const hookLoader = hooksRegistry[hookId];\n if (!hookLoader) continue;\n\n try {\n const hookDef: AnyLoadedHook | null = await hookLoader();\n // Type guard: only include hooks of the requested type\n if (hookDef && hookDef.hook === hookType) {\n // Safe cast: we've verified hookDef.hook === hookType\n executors.push(hookDef.execute as HookExecutor<K>);\n }\n } catch (error) {\n console.error(`[Hooks] Failed to load hook '${hookId}':`, error);\n }\n }\n\n return executors;\n }\n\n // ==========================================================================\n // Hook Runner Methods\n // ==========================================================================\n\n /**\n * Run the prefilter_llm_history hook if it exists\n * This hook allows developers to modify the message history before sending to LLM\n *\n * @param state - Flow state with execution context\n * @param messages - Messages to prefilter before sending to LLM\n * @returns Processed messages (or original if hook doesn't exist/fails)\n */\n private static async runPrefilterLLMHistoryHook(\n state: FlowState,\n messages: RequestContext['messages']\n ): Promise<RequestContext['messages']> {\n const executors = await this.getHooksForType(state, 'prefilter_llm_history');\n if (executors.length === 0) return messages;\n\n // RequestContext messages satisfy the LLMMessage interface structurally.\n // Hooks filter/modify these messages but don't change their structure,\n // so the return retains the original RequestContext message shape at runtime.\n let result: import(\"@standardagents/spec\").LLMMessage[] = messages;\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n result = await executor(threadState, result);\n } catch (error) {\n console.error('[Hooks] ✗ Error running prefilter_llm_history hook:', error);\n }\n }\n\n return result as RequestContext['messages'];\n }\n\n /**\n * Run after_system_message hooks after the system prompt has been rendered.\n */\n public static async runAfterSystemMessageHook(\n state: FlowState,\n systemMessage: string\n ): Promise<string> {\n const executors = await this.getHooksForType(state, 'after_system_message');\n if (executors.length === 0) return systemMessage;\n\n let result = systemMessage;\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n const next = await executor(threadState, result);\n if (next !== null && next !== undefined) {\n result = next;\n }\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_system_message hook:', error);\n }\n }\n\n return result;\n }\n\n /**\n * Run after_subagent_created hooks on the parent thread.\n */\n public static async runAfterSubagentCreatedHook(\n state: FlowState,\n childState: import(\"@standardagents/spec\").ThreadState\n ): Promise<void> {\n const executors = await this.getHooksForType(state, 'after_subagent_created');\n if (executors.length === 0) return;\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n await executor(threadState, childState);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_subagent_created hook:', error);\n }\n }\n }\n\n /**\n * Run the before_create_message hook if it exists\n * This hook allows developers to modify a message before it's created\n *\n * @param state - Flow state with execution context\n * @param message - Message object to be created\n * @returns Processed message (or original if hook doesn't exist/fails)\n */\n public static async runBeforeCreateMessageHook(\n state: FlowState,\n message: Message\n ): Promise<Message> {\n const executors = await this.getHooksForType(state, 'before_create_message');\n if (executors.length === 0) return message;\n\n let result = message;\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n result = await executor(threadState, result);\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_create_message hook:', error);\n }\n }\n\n return result;\n }\n\n /**\n * Run the after_create_message hook if it exists\n * This hook runs after a message is created in the database\n *\n * @param state - Flow state with execution context\n * @param message - The created message object\n */\n public static async runAfterCreateMessageHook(\n state: FlowState,\n message: Message\n ): Promise<void> {\n const executors = await this.getHooksForType(state, 'after_create_message');\n if (executors.length === 0) return;\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n await executor(threadState, message);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_create_message hook:', error);\n }\n }\n }\n\n /**\n * Run the before_update_message hook if it exists\n * This hook allows developers to modify a message before it's updated\n *\n * Generic type preserves the exact shape of the updates object for type safety\n *\n * @param state - Flow state with execution context\n * @param messageId - ID of the message being updated\n * @param updates - Object with fields to update\n * @returns Processed updates (or original if hook doesn't exist/fails)\n */\n public static async runBeforeUpdateMessageHook<T extends Record<string, unknown>>(\n state: FlowState,\n messageId: string,\n updates: T\n ): Promise<T> {\n const executors = await this.getHooksForType(state, 'before_update_message');\n if (executors.length === 0) return updates;\n\n let result: Record<string, unknown> = updates;\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n result = await executor(threadState, messageId, result);\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_update_message hook:', error);\n }\n }\n\n return result as T;\n }\n\n /**\n * Run the after_update_message hook if it exists\n * This hook runs after a message is updated in the database\n *\n * @param state - Flow state with execution context\n * @param message - Full message object with updated fields\n */\n public static async runAfterUpdateMessageHook(\n state: FlowState,\n message: Message\n ): Promise<void> {\n const executors = await this.getHooksForType(state, 'after_update_message');\n if (executors.length === 0) return;\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n await executor(threadState, message);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_update_message hook:', error);\n }\n }\n }\n\n /**\n * Run the before_store_tool_result hook if it exists\n * This hook allows developers to modify tool results before they're stored\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The tool result object to be stored\n * @returns Processed tool result (or original if hook doesn't exist/fails)\n */\n public static async runBeforeStoreToolResultHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult> {\n const executors = await this.getHooksForType(state, 'before_store_tool_result');\n if (executors.length === 0) return toolResult;\n\n let result: ToolResult = toolResult;\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n result = await executor(threadState, toolCall, result);\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_store_tool_result hook:', error);\n }\n }\n\n return result;\n }\n\n /**\n * Run after_tool_call_success hook\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The successful tool result\n * @returns Modified tool result, or null to skip storing this tool call\n */\n public static async runAfterToolCallSuccessHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult | null> {\n const executors = await this.getHooksForType(state, 'after_tool_call_success');\n if (executors.length === 0) return toolResult;\n\n let result: ToolResult | null = toolResult;\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n if (result === null) break; // Stop if a hook returned null\n try {\n result = await executor(threadState, toolCall, result);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_tool_call_success hook:', error);\n }\n }\n\n return result;\n }\n\n /**\n * Run after_tool_call_failure hook\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The failed tool result\n * @returns Modified tool result, or null to skip storing this tool call\n */\n public static async runAfterToolCallFailureHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult | null> {\n const executors = await this.getHooksForType(state, 'after_tool_call_failure');\n if (executors.length === 0) return toolResult;\n\n let result: ToolResult | null = toolResult;\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n if (result === null) break; // Stop if a hook returned null\n try {\n result = await executor(threadState, toolCall, result);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_tool_call_failure hook:', error);\n }\n }\n\n return result;\n }\n\n /**\n * Create a pending message before LLM request\n * Returns the message ID for later updates\n */\n private static async createPendingMessage(state: FlowState): Promise<string> {\n const messageId = crypto.randomUUID();\n\n // Determine role based on current side\n const role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n\n let message: Message = {\n id: messageId,\n role,\n content: null, // No content yet\n tool_calls: null,\n log_id: null,\n created_at: 0, // Placeholder - will be set just before INSERT\n request_sent_at: 0, // Placeholder - will be set just before INSERT\n response_completed_at: null,\n status: \"pending\",\n };\n\n // Run before_create_message hook\n message = await this.runBeforeCreateMessageHook(state, message);\n\n // Add hierarchical tracking fields\n message.parent_id = state.parentMessageId || null;\n message.depth = state.depth;\n\n // Set timestamps just before INSERT to ensure accurate ordering\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n message.created_at = now;\n message.request_sent_at = now;\n\n // Get current prompt name from promptPath\n const currentPrompt = state.promptPath.length > 0 ? state.promptPath[state.promptPath.length - 1] : null;\n\n // Insert pending message into database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n INSERT INTO messages (\n id, role, content, tool_calls, log_id, created_at,\n request_sent_at, response_completed_at, status, parent_id, depth, reasoning_content, prompt\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13)\n `,\n message.id,\n message.role,\n message.content,\n message.tool_calls,\n message.log_id,\n message.created_at,\n message.request_sent_at,\n message.response_completed_at,\n message.status,\n message.parent_id,\n message.depth,\n null, // reasoning_content - will be set when message is updated with LLM response\n currentPrompt\n );\n\n // Run after_create_message hook\n await this.runAfterCreateMessageHook(state, message);\n\n // Add to message history\n state.messageHistory.push(message);\n\n // Broadcast pending message via WebSocket (already skipped for child prompts via emitMessage not being passed)\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n return messageId;\n }\n\n /**\n * Update pending message status (for failures)\n */\n private static async updateMessageStatus(\n messageId: string,\n status: \"completed\" | \"failed\",\n state: FlowState\n ): Promise<void> {\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Prepare updates object with explicit type\n let updates: {\n status: \"completed\" | \"failed\";\n response_completed_at: number;\n } = {\n status,\n response_completed_at: now,\n };\n\n // Run before_update_message hook (generic preserves type)\n updates = await this.runBeforeUpdateMessageHook(state, messageId, updates);\n\n // Update message in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n UPDATE messages\n SET status = ?1, response_completed_at = ?2\n WHERE id = ?3\n `,\n updates.status,\n updates.response_completed_at,\n messageId\n );\n\n // Update in message history\n const message = state.messageHistory.find((m) => m.id === messageId);\n if (message) {\n message.status = updates.status;\n message.response_completed_at = updates.response_completed_at;\n\n // Run after_update_message hook with full message object\n await this.runAfterUpdateMessageHook(state, message);\n\n // Broadcast update via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n }\n }\n\n /**\n * Update pending message with LLM response\n */\n private static async updateMessage(\n messageId: string,\n response: LLMResponse,\n status: \"completed\" | \"failed\",\n state: FlowState\n ): Promise<void> {\n // Get the log_id from state (set by LLMRequest.execute)\n const logId = state.currentLogId || null;\n\n // Prepare message data\n let content = response.content;\n const toolCallsJson = response.tool_calls ? JSON.stringify(response.tool_calls) : null;\n const reasoningContent = response.reasoning_content || null;\n const reasoningDetailsJson = response.reasoning_details ? JSON.stringify(response.reasoning_details) : null;\n\n // Process images into attachments if present\n let attachmentRefs: AttachmentRef[] | undefined;\n let responseImagePathMap: Map<string, string> | undefined;\n if (response.images && response.images.length > 0) {\n const result = await this.processResponseImages(response.images, state);\n attachmentRefs = result.refs;\n responseImagePathMap = result.imagePathMap;\n }\n\n // If this response has no tool calls, collect artifacts generated by prior\n // same-side tool-call steps in this turn. We will emit them as silent\n // follow-up messages with explicit paths, rather than attaching them to\n // this conversational message.\n const toolResultAttachmentRefs = this.collectTurnToolResultAttachments(\n messageId,\n response,\n state\n );\n\n const attachmentsJson = attachmentRefs && attachmentRefs.length > 0 ? JSON.stringify(attachmentRefs) : null;\n\n // Run post-process hook if available (trims whitespace, applies custom logic)\n let messageForHook: Message = {\n id: messageId,\n role: state.currentSide === \"a\" ? \"assistant\" : \"user\",\n content,\n tool_calls: toolCallsJson,\n log_id: logId,\n created_at: 0, // Will be preserved from original\n request_sent_at: 0, // Will be preserved from original\n response_completed_at: 0, // Placeholder - will be set just before UPDATE\n status,\n reasoning_content: reasoningContent,\n attachments: attachmentsJson,\n };\n\n // Run before_create_message hook (again, now with actual content)\n // This allows hooks to modify the content before it's stored\n messageForHook = await this.runBeforeCreateMessageHook(state, messageForHook);\n content = messageForHook.content;\n\n // Prepare updates object with explicit type\n let updates: {\n content: string | null;\n tool_calls: string | null;\n log_id: string | null;\n response_completed_at: number;\n status: \"completed\" | \"failed\";\n reasoning_content: string | null;\n reasoning_details: string | null;\n attachments: string | null;\n } = {\n content,\n tool_calls: toolCallsJson,\n log_id: logId,\n response_completed_at: 0, // Placeholder - will be set just before UPDATE\n status,\n reasoning_content: reasoningContent,\n reasoning_details: reasoningDetailsJson,\n attachments: attachmentsJson,\n };\n\n // Run before_update_message hook (generic preserves type)\n updates = await this.runBeforeUpdateMessageHook(state, messageId, updates);\n\n // Set timestamp just before UPDATE to ensure accurate ordering\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n updates.response_completed_at = now;\n\n // Update message in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n UPDATE messages\n SET content = ?1, tool_calls = ?2, log_id = ?3,\n response_completed_at = ?4, status = ?5, reasoning_content = ?6,\n reasoning_details = ?7, attachments = ?8\n WHERE id = ?9\n `,\n updates.content,\n updates.tool_calls,\n updates.log_id,\n updates.response_completed_at,\n updates.status,\n updates.reasoning_content,\n updates.reasoning_details,\n updates.attachments,\n messageId\n );\n\n // Store tool calls in detail table\n if (response.tool_calls) {\n for (const toolCall of response.tool_calls) {\n await state.storage.sql.exec(\n `\n INSERT INTO tool_calls (\n id, message_id, type, function_name, function_arguments, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6)\n `,\n toolCall.id,\n messageId,\n toolCall.type || \"function\",\n toolCall.function.name,\n toolCall.function.arguments,\n now\n );\n }\n }\n\n // Update in message history\n const message = state.messageHistory.find((m) => m.id === messageId);\n if (message) {\n message.content = content;\n message.tool_calls = toolCallsJson;\n message.log_id = logId;\n message.response_completed_at = now;\n message.status = status;\n message.reasoning_content = reasoningContent;\n message.attachments = attachmentsJson;\n\n // Run after_update_message hook with full message object\n await this.runAfterUpdateMessageHook(state, message);\n\n // Broadcast update via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n // Emit per-asset silent path messages for prior tool-generated artifacts.\n await this.createSilentGeneratedAssetPathMessages(\n message,\n toolResultAttachmentRefs,\n state,\n now\n );\n }\n\n // After image processing, update log to replace base64 with file paths\n if (responseImagePathMap && responseImagePathMap.size > 0 && logId) {\n await LLMRequest.updateResponseBodyInLog(\n state,\n logId,\n response,\n responseImagePathMap\n );\n }\n\n // Note: Content was already streamed during provider execution (OpenAIProvider.chat, etc.)\n // No need to send it again here - that causes duplicate stream writes and \"stream is closed\" warnings\n }\n\n private static collectTurnToolResultAttachments(\n messageId: string,\n response: Pick<LLMResponse, \"tool_calls\">,\n state: FlowState\n ): AttachmentRef[] {\n const hasToolCalls =\n Array.isArray(response.tool_calls) && response.tool_calls.length > 0;\n if (hasToolCalls) {\n return [];\n }\n\n const currentMessageIndex = state.messageHistory.findIndex(\n (message) => message.id === messageId\n );\n if (currentMessageIndex <= 0) {\n return [];\n }\n\n const currentMessage = state.messageHistory[currentMessageIndex];\n if (currentMessage.role !== \"assistant\" && currentMessage.role !== \"user\") {\n return [];\n }\n\n const toolCallIds = new Set<string>();\n let foundPriorSameSideToolCallMessage = false;\n\n for (let i = currentMessageIndex - 1; i >= 0; i--) {\n const message = state.messageHistory[i];\n\n // Tool results belong to the prior same-side messages.\n if (message.role === \"tool\") {\n continue;\n }\n\n // Stop once we hit another side or system message.\n if (message.role !== currentMessage.role) {\n break;\n }\n\n if (!message.tool_calls) {\n break;\n }\n\n try {\n const parsedToolCalls = JSON.parse(message.tool_calls);\n if (!Array.isArray(parsedToolCalls) || parsedToolCalls.length === 0) {\n break;\n }\n\n foundPriorSameSideToolCallMessage = true;\n\n for (const toolCall of parsedToolCalls) {\n if (toolCall && typeof toolCall.id === \"string\") {\n toolCallIds.add(toolCall.id);\n }\n }\n } catch {\n break;\n }\n }\n\n if (!foundPriorSameSideToolCallMessage || toolCallIds.size === 0) {\n return [];\n }\n\n const refs: AttachmentRef[] = [];\n\n for (const message of state.messageHistory) {\n if (\n message.role !== \"tool\" ||\n !message.tool_call_id ||\n !toolCallIds.has(message.tool_call_id) ||\n !message.attachments ||\n message.attachments === \"[]\"\n ) {\n continue;\n }\n\n try {\n const parsed = JSON.parse(message.attachments);\n if (Array.isArray(parsed)) {\n refs.push(...(parsed as AttachmentRef[]));\n }\n } catch {\n // Ignore malformed attachment payloads.\n }\n }\n\n return refs;\n }\n\n private static async createSilentGeneratedAssetPathMessages(\n sourceMessage: Message,\n refs: AttachmentRef[],\n state: FlowState,\n baseTimestamp: number\n ): Promise<void> {\n if (refs.length === 0) {\n return;\n }\n\n // Deduplicate by path while preserving original order.\n const dedupedRefs: AttachmentRef[] = [];\n const seenPaths = new Set<string>();\n for (const ref of refs) {\n if (!ref.path || seenPaths.has(ref.path)) {\n continue;\n }\n seenPaths.add(ref.path);\n dedupedRefs.push(ref);\n }\n\n if (dedupedRefs.length === 0) {\n return;\n }\n\n const currentPrompt =\n state.promptPath.length > 0\n ? state.promptPath[state.promptPath.length - 1]\n : null;\n const parentId = sourceMessage.parent_id ?? state.parentMessageId ?? null;\n const depth = sourceMessage.depth ?? state.depth;\n const existingPathMessages = new Set(\n state.messageHistory\n .filter(\n (message) =>\n message.silent === true &&\n message.role === sourceMessage.role &&\n (message.parent_id ?? null) === parentId &&\n (message.depth ?? state.depth) === depth &&\n typeof message.content === \"string\" &&\n message.content.startsWith(\"Generated asset path: \")\n )\n .map((message) => message.content as string)\n );\n\n for (let i = 0; i < dedupedRefs.length; i++) {\n const ref = dedupedRefs[i];\n const content = `Generated asset path: ${ref.path}`;\n if (existingPathMessages.has(content)) {\n continue;\n }\n existingPathMessages.add(content);\n\n const attachmentsJson = JSON.stringify([ref]);\n const silentMessage: Message = {\n id: crypto.randomUUID(),\n role: sourceMessage.role,\n content,\n attachments: attachmentsJson,\n created_at: baseTimestamp + i + 1,\n status: \"completed\",\n silent: true,\n parent_id: parentId,\n depth,\n };\n\n await state.storage.sql.exec(\n `\n INSERT INTO messages (\n id, role, content, attachments, silent, created_at, status, parent_id, depth, prompt\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)\n `,\n silentMessage.id,\n silentMessage.role,\n silentMessage.content,\n attachmentsJson,\n 1,\n silentMessage.created_at,\n silentMessage.status,\n silentMessage.parent_id,\n silentMessage.depth,\n currentPrompt\n );\n\n state.messageHistory.push(silentMessage);\n\n if (state.emitMessage) {\n state.emitMessage(silentMessage);\n }\n }\n }\n\n /**\n * Process images from LLM response into stored attachments\n * Similar to ToolExecutor.processToolAttachments but for LLM-generated images\n * Returns both attachment refs and a map of original URLs to file paths (for log transformation)\n */\n private static async processResponseImages(\n images: LLMResponseImage[],\n state: FlowState\n ): Promise<{ refs: AttachmentRef[], imagePathMap: Map<string, string> }> {\n const refs: AttachmentRef[] = [];\n const imagePathMap = new Map<string, string>();\n\n for (const image of images) {\n const originalUrl = image.image_url.url;\n\n // Parse data URL: data:image/png;base64,xxxxx\n const match = originalUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n console.error('[FlowEngine] Invalid image data URL format, skipping');\n continue;\n }\n\n const mimeType = match[1];\n const base64Data = match[2];\n const ext = mimeType.split('/')[1] || 'png';\n\n const attachmentId = crypto.randomUUID();\n const path = `/attachments/${Date.now()}-${attachmentId}.${ext}`;\n\n try {\n // Write file to thread filesystem (handles chunking automatically for large files)\n // Pass base64 data directly - RPC method expects base64 encoded string\n await state.thread.instance.writeFile(path, base64Data, mimeType);\n\n // Track mapping: image ID → stored path (for log transformation)\n // Use ID instead of URL since URLs are too large to store\n if (image.id) {\n imagePathMap.set(image.id, path);\n }\n\n refs.push({\n id: attachmentId,\n type: \"file\",\n path,\n name: `generated-${attachmentId}.${ext}`,\n mimeType,\n size: Math.ceil(base64Data.length * 3 / 4),\n });\n } catch (error) {\n console.error('[FlowEngine] Failed to process image:', error);\n }\n }\n\n return { refs, imagePathMap };\n }\n\n /**\n * Process provider-executed tool results (e.g., images from OpenAI's image_generation)\n * Creates synthetic tool calls and stores results as tool messages.\n * This ensures proper message history reconstruction for subsequent turns.\n *\n * @returns The images that were processed (to be cleared from response.images)\n */\n private static async processProviderToolResults(\n response: LLMResponse,\n state: FlowState,\n assistantMessageId: string\n ): Promise<void> {\n if (!response.images || response.images.length === 0) {\n return;\n }\n\n // Filter to only images that have both id and toolName (provider-executed tools)\n const providerImages = response.images.filter(img => img.id && img.toolName);\n\n if (providerImages.length === 0) {\n return;\n }\n\n // Initialize tool_calls array if needed\n if (!response.tool_calls) {\n response.tool_calls = [];\n }\n\n // Track image ID -> path mappings for updating response_body\n const imagePathMap = new Map<string, string>();\n\n for (const image of providerImages) {\n // Generate a standard function call ID instead of using provider's native ID (e.g., ig_xxx)\n // OpenAI function calls use 'call_' prefix - using native IDs causes the model\n // to not recognize the function_call_output in history, leading to retry loops\n const toolCallId = `call_${crypto.randomUUID().replace(/-/g, '')}`;\n const toolName = image.toolName!;\n\n // 1. Create synthetic tool call and add to response.tool_calls\n // This will be stored on the assistant message\n const syntheticToolCall: ToolCall = {\n id: toolCallId,\n type: \"function\",\n function: {\n name: toolName,\n // We don't have the original arguments since OpenAI executed this internally\n // Store empty object - the result is what matters\n arguments: \"{}\",\n },\n };\n response.tool_calls.push(syntheticToolCall);\n\n // 2. Store tool result message with image as attachment\n const toolMessageId = crypto.randomUUID();\n\n // Parse the image data URL to get the mime type and data\n // Use string operations instead of regex to avoid blocking on large strings\n const imageUrl = image.image_url.url;\n const dataPrefix = 'data:';\n const base64Marker = ';base64,';\n\n if (!imageUrl.startsWith(dataPrefix)) {\n console.error(`[FlowEngine] Invalid image data URL format for ${toolName}, skipping`);\n continue;\n }\n\n const base64Index = imageUrl.indexOf(base64Marker);\n if (base64Index === -1) {\n console.error(`[FlowEngine] Invalid image data URL format for ${toolName}, skipping`);\n continue;\n }\n\n const mimeType = imageUrl.slice(dataPrefix.length, base64Index);\n const base64Data = imageUrl.slice(base64Index + base64Marker.length);\n const ext = mimeType.split('/')[1] || 'png';\n\n // Store the image file\n const attachmentId = crypto.randomUUID();\n const path = `/attachments/${Date.now()}-${attachmentId}.${ext}`;\n\n try {\n await state.thread.instance.writeFile(path, base64Data, mimeType);\n\n const attachmentRef: AttachmentRef = {\n id: attachmentId,\n type: \"file\",\n path,\n name: `generated-${attachmentId}.${ext}`,\n mimeType,\n size: Math.ceil(base64Data.length * 3 / 4),\n };\n\n // Create tool result message\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n const toolMessage: Message = {\n id: toolMessageId,\n role: \"tool\",\n name: toolName, // Tool name for provider-specific handling\n content: `Image generated successfully`,\n tool_call_id: toolCallId,\n created_at: timestamp,\n tool_status: \"success\",\n parent_id: state.parentMessageId || null,\n depth: state.depth,\n attachments: JSON.stringify([attachmentRef]),\n };\n\n // Get current prompt name from promptPath\n const currentPromptForAttachment = state.promptPath.length > 0 ? state.promptPath[state.promptPath.length - 1] : null;\n\n // Insert tool result message\n await state.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, name, tool_call_id, created_at, tool_status, parent_id, depth, attachments, prompt)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)\n `,\n toolMessage.id,\n toolMessage.role,\n toolMessage.content,\n toolMessage.name,\n toolMessage.tool_call_id,\n toolMessage.created_at,\n toolMessage.tool_status,\n toolMessage.parent_id,\n toolMessage.depth,\n toolMessage.attachments,\n currentPromptForAttachment\n );\n\n // Add to message history\n state.messageHistory.push(toolMessage);\n\n // Broadcast message via WebSocket\n if (state.emitMessage) {\n state.emitMessage(toolMessage);\n }\n\n // Update the parent log's tool_results field\n const parentLogId = state.currentLogId || null;\n if (parentLogId) {\n try {\n const result = await state.storage.sql.exec(\n `SELECT tool_results FROM logs WHERE id = ?1`,\n parentLogId\n );\n const rows = result.toArray();\n const currentToolResults = rows[0]?.tool_results;\n\n let toolResultsArray: Array<{\n tool_call_id: string;\n tool_name: string;\n content: string;\n status: string;\n timestamp: number;\n attachment_path?: string;\n }> = [];\n\n if (currentToolResults) {\n try {\n toolResultsArray = JSON.parse(currentToolResults as string);\n } catch {\n // Ignore parse errors\n }\n }\n\n // Add new tool result with attachment path (not base64!)\n toolResultsArray.push({\n tool_call_id: toolCallId,\n tool_name: toolName,\n content: \"Image generated successfully\",\n status: \"success\",\n timestamp: Date.now(),\n attachment_path: path,\n });\n\n await state.storage.sql.exec(\n `UPDATE logs SET tool_results = ?1 WHERE id = ?2`,\n JSON.stringify(toolResultsArray),\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n tool_results: JSON.stringify(toolResultsArray),\n },\n });\n }\n } catch (logError) {\n console.error(\"Failed to update log with tool result:\", logError);\n }\n }\n\n // Track this mapping for response_body update\n // Use the ORIGINAL provider ID (e.g., ig_xxx) since that's what's in the placeholder\n if (image.id) {\n imagePathMap.set(image.id, path);\n }\n\n } catch (error) {\n console.error(`[FlowEngine] Failed to store provider tool result for ${toolName}:`, error);\n }\n }\n\n // Update the response_body in the log to replace [image:id] placeholders with actual paths\n if (imagePathMap.size > 0 && state.currentLogId) {\n try {\n const logResult = await state.storage.sql.exec(\n `SELECT response_body FROM logs WHERE id = ?1`,\n state.currentLogId\n );\n const logRows = logResult.toArray();\n if (logRows.length > 0 && logRows[0].response_body) {\n let responseBody = logRows[0].response_body as string;\n\n // Replace each [image:id] placeholder with the actual path\n for (const [imageId, imagePath] of imagePathMap) {\n responseBody = responseBody.split(`[image:${imageId}]`).join(imagePath);\n }\n\n await state.storage.sql.exec(\n `UPDATE logs SET response_body = ?1 WHERE id = ?2`,\n responseBody,\n state.currentLogId\n );\n }\n } catch (updateError) {\n console.error(`[FlowEngine] Failed to update response_body with image paths:`, updateError);\n }\n }\n\n // Clear provider-executed images from response.images so they aren't also stored as attachments\n // Keep any images that don't have id/toolName (unlikely but safe)\n response.images = response.images.filter(img => !img.id || !img.toolName);\n if (response.images.length === 0) {\n response.images = undefined;\n }\n }\n\n /**\n * Guard against pathological empty assistant responses.\n *\n * If a model returns no content, no tool calls, and no images, we inject a\n * synthetic failed tool call so the next turn sees an actionable error\n * instead of silently looping on blank messages.\n */\n private static async injectEmptyAssistantResponseError(\n response: LLMResponse,\n state: FlowState,\n assistantMessageId: string\n ): Promise<void> {\n const hasToolCalls =\n Array.isArray(response.tool_calls) && response.tool_calls.length > 0;\n const hasImages = Array.isArray(response.images) && response.images.length > 0;\n const normalizedContent = response.content?.trim() ?? \"\";\n const hasContent = normalizedContent.length > 0;\n\n if (hasToolCalls || hasImages || hasContent) {\n return;\n }\n\n if (!response.tool_calls) {\n response.tool_calls = [];\n }\n\n const toolCallId = `call_${crypto.randomUUID().replace(/-/g, \"\")}`;\n const toolName = \"invalid_assistant_response\";\n const errorContent =\n \"You must reply. Empty response was rejected. Return non-empty content, call a tool, or include attachments.\";\n\n response.tool_calls.push({\n id: toolCallId,\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify({\n reason: \"empty_response\",\n assistantMessageId,\n }),\n },\n });\n\n const toolMessage: Message = {\n id: crypto.randomUUID(),\n role: \"tool\",\n name: toolName,\n content: errorContent,\n tool_call_id: toolCallId,\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n tool_status: \"error\",\n parent_id: state.parentMessageId || null,\n depth: state.depth,\n };\n\n const currentPromptName =\n state.promptPath.length > 0\n ? state.promptPath[state.promptPath.length - 1]\n : null;\n\n await state.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, name, tool_call_id, created_at, tool_status, parent_id, depth, prompt)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)\n `,\n toolMessage.id,\n toolMessage.role,\n toolMessage.content,\n toolMessage.name,\n toolMessage.tool_call_id,\n toolMessage.created_at,\n toolMessage.tool_status,\n toolMessage.parent_id,\n toolMessage.depth,\n currentPromptName\n );\n\n state.messageHistory.push(toolMessage);\n\n if (state.emitMessage) {\n state.emitMessage(toolMessage);\n }\n }\n\n /**\n * Extract stop-tool response parameter and use as message content\n * This handles the special case where a stop-tool includes a response parameter\n * that should be treated as the message content\n */\n private static extractStopToolResponse(\n state: FlowState,\n response: { content: string | null; tool_calls?: any[] }\n ): void {\n if (!response.tool_calls || response.tool_calls.length === 0) {\n return;\n }\n\n // Check if any tool call is a stop-tool with response parameter\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n const stopToolResponseProperty =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool_response_property\n : state.agentConfig.side_b_stop_tool_response_property;\n\n // Only process if both stop-tool and response property are configured\n if (!stopTool || !stopToolResponseProperty) {\n return;\n }\n\n // Find the stop-tool call\n const stopToolCall = response.tool_calls.find(\n (call) => call.function.name === stopTool\n );\n\n if (!stopToolCall) {\n return;\n }\n\n // Extract the response parameter value\n try {\n const args = JSON.parse(stopToolCall.function.arguments);\n const extractedResponse = args[stopToolResponseProperty];\n\n if (extractedResponse && typeof extractedResponse === \"string\") {\n // Replace the response content with the extracted value\n response.content = extractedResponse;\n\n // Broadcast as chunks for real-time UI update\n if (state.emitMessageChunk && state.pendingMessageId) {\n // Broadcast the extracted response as a single chunk\n // (it's already complete at this point, not streaming from provider)\n state.emitMessageChunk(state.pendingMessageId, extractedResponse);\n }\n\n // Store for potential later use\n // Store final response for stop tool extraction\n (state as any).finalResponse = extractedResponse; // Note: finalResponse not in FlowState type yet\n }\n } catch (error) {\n console.error(\n `Failed to extract response property '${stopToolResponseProperty}' from stop-tool '${stopTool}':`,\n error\n );\n }\n }\n\n /**\n * Check if stop condition is met\n */\n private static checkStopCondition(\n state: FlowState,\n response: { content: string | null; tool_calls?: any[] }\n ): {\n endSession: boolean;\n sideTurnCompleted: boolean;\n } {\n const sessionFailToolName = getAgentSessionBinding(\n state.agentConfig,\n state.currentSide,\n \"fail\"\n ).toolName;\n\n if (sessionFailToolName) {\n const matchingFailSessionCalls =\n response.tool_calls?.filter(\n (call) => call.function.name === sessionFailToolName\n ) ?? [];\n\n if (matchingFailSessionCalls.length > 0) {\n const hasSuccessfulFailSessionCall = matchingFailSessionCalls.some(\n (call) => this.didToolCallSucceed(state, call.id)\n );\n\n if (hasSuccessfulFailSessionCall) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n state.stopReason = `sessionFail tool called: ${sessionFailToolName}`;\n state.stopReasonCode = \"session_fail\";\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `sessionFail tool called: ${sessionFailToolName}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return {\n endSession: true,\n sideTurnCompleted: false,\n };\n }\n\n // Failed fail-session tool calls should not terminate execution.\n return {\n endSession: false,\n sideTurnCompleted: false,\n };\n }\n }\n\n // Check end session tool first (ends entire session)\n const sessionStopToolName = getAgentSessionBinding(\n state.agentConfig,\n state.currentSide,\n \"stop\"\n ).toolName;\n\n if (sessionStopToolName) {\n const matchingEndSessionCalls =\n response.tool_calls?.filter(\n (call) => call.function.name === sessionStopToolName\n ) ?? [];\n\n if (matchingEndSessionCalls.length > 0) {\n const hasSuccessfulEndSessionCall = matchingEndSessionCalls.some(\n (call) => this.didToolCallSucceed(state, call.id)\n );\n\n if (hasSuccessfulEndSessionCall) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n state.stopReason = `sessionStop tool called: ${sessionStopToolName}`;\n state.stopReasonCode = \"session_stop\";\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `sessionStop tool called: ${sessionStopToolName}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return {\n endSession: true,\n sideTurnCompleted: false,\n };\n }\n\n // End-session tool calls that fail should not terminate execution.\n return {\n endSession: false,\n sideTurnCompleted: false,\n };\n }\n }\n\n // Check stop conditions (OR logic - stop on either condition)\n const stopOnResponse =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_on_response\n : state.agentConfig.side_b_stop_on_response;\n\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n const hasToolCalls =\n Array.isArray(response.tool_calls) && response.tool_calls.length > 0;\n const normalizedContent = response.content?.trim() ?? \"\";\n\n const stopOnResponseMatched =\n Boolean(stopOnResponse && normalizedContent.length > 0 && !hasToolCalls);\n const stopToolMatched = Boolean(\n stopTool &&\n response.tool_calls?.some((call) => call.function.name === stopTool)\n );\n const sideTurnCompleted = stopOnResponseMatched || stopToolMatched;\n\n if (!sideTurnCompleted) {\n return {\n endSession: false,\n sideTurnCompleted: false,\n };\n }\n\n // In dual_ai mode, stop conditions end the CURRENT side's turn.\n // They do not terminate the whole thread unless end session is called.\n if (state.agentConfig.type === \"dual_ai\") {\n return {\n endSession: false,\n sideTurnCompleted: true,\n };\n }\n\n // Stop on response condition\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n state.stopReason = stopToolMatched\n ? `Stop tool called: ${stopTool}`\n : \"Returns content (no tool calls)\";\n state.stopReasonCode = stopToolMatched ? \"stop_tool\" : \"stop_on_response\";\n\n // Note: Response parameter extraction is handled earlier in extractStopToolResponse()\n // which is called before updateMessage to ensure the content is set correctly\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: state.stopReason,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n return {\n endSession: false,\n sideTurnCompleted: true,\n };\n }\n\n private static hasTurnStopConditionConfigured(state: FlowState): boolean {\n const stopOnResponse =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_on_response\n : state.agentConfig.side_b_stop_on_response;\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n return Boolean(stopOnResponse || stopTool);\n }\n\n private static didToolCallSucceed(\n state: FlowState,\n toolCallId: string\n ): boolean {\n for (let i = state.messageHistory.length - 1; i >= 0; i--) {\n const message = state.messageHistory[i];\n if (message.role !== \"tool\" || message.tool_call_id !== toolCallId) {\n continue;\n }\n\n return message.tool_status === \"success\";\n }\n\n return false;\n }\n\n /**\n * Switch to the other side (for dual_ai agents)\n */\n static switchSides(state: FlowState): void {\n state.currentSide = state.currentSide === \"a\" ? \"b\" : \"a\";\n\n // Update current prompt reference to match new side\n // For ai_human agents, keep using sideA prompt even when switching to side B (human)\n if (state.currentSide === \"b\" && state.prompts.sideB) {\n state.prompt = state.prompts.sideB;\n } else {\n state.prompt = state.prompts.sideA;\n }\n }\n\n /**\n * Filter out orphaned tool calls and tool results\n * Removes:\n * 1. Assistant messages with tool_calls that have no matching tool result messages\n * 2. Tool result messages that have no matching tool_call in assistant messages\n *\n * This prevents API errors from OpenAI when tool_calls and results don't match\n */\n private static isRuntimeImmediateSubagentBootstrapResult(msg: Message): boolean {\n const content = typeof msg.content === \"string\" ? msg.content.trim() : \"\";\n const referencedSubagentId = content.match(\n /^The subagent was initiated successfully\\. Reference:\\s+([a-zA-Z0-9-]+)$/\n )?.[1];\n\n return (\n msg.role === \"tool\" &&\n referencedSubagentId !== undefined &&\n (\n (typeof msg.subagent_id === \"string\" && msg.subagent_id.trim().length > 0) ||\n typeof msg.name === \"string\"\n )\n );\n }\n\n private static isSilentMessageRow(value: unknown): boolean {\n return value === 1 || value === true;\n }\n\n private static filterOrphanedToolCalls(messages: Message[]): Message[] {\n // Collect all tool_call_ids from conversation messages with tool_calls.\n // In dual_ai mode, one side is stored as role=\"user\" but still legally carries tool_calls\n // once that side becomes the acting assistant in provider context.\n const assistantToolCallIds = new Set<string>();\n for (const msg of messages) {\n if ((msg.role === \"assistant\" || msg.role === \"user\") && msg.tool_calls) {\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n for (const call of toolCalls) {\n if (call.id) {\n assistantToolCallIds.add(call.id);\n }\n }\n } catch (error) {\n console.error(`Failed to parse tool_calls for message ${msg.id}:`, error);\n }\n }\n }\n\n // Filter only orphaned tool-result messages.\n // Keep tool-calling conversation messages intact so provider-bound normalization can\n // synthesize explicit error tool results when a response is truly missing.\n const filtered: Message[] = [];\n let warnedRemovedCount = 0;\n for (const msg of messages) {\n // Filter tool result messages - only keep if their tool_call_id has a matching assistant message\n if (msg.role === \"tool\" && msg.tool_call_id) {\n if (!assistantToolCallIds.has(msg.tool_call_id)) {\n if (this.isRuntimeImmediateSubagentBootstrapResult(msg)) {\n continue; // Internal runtime artifact - exclude from provider history quietly\n }\n console.warn(`[FlowEngine] Filtering orphaned tool result message ${msg.id} - no matching tool_call_id ${msg.tool_call_id}`);\n warnedRemovedCount += 1;\n continue; // Skip this message\n }\n }\n\n // Keep all other messages as-is\n filtered.push(msg);\n }\n\n const removedCount = messages.length - filtered.length;\n if (removedCount > 0 && warnedRemovedCount > 0) {\n console.warn(`[FlowEngine] Filtered ${removedCount} orphaned tool call/result messages`);\n }\n\n return filtered;\n }\n\n /**\n * Load message history from DurableObject storage\n * Public to allow FlowStateSdk to reload history when needed\n *\n * @param storage - DurableObject storage instance\n * @param thread - Thread instance and metadata\n * @param stateInput - Partial state containing extraMessages and other context\n * @param includeParentHistory - Whether to load messages from DB (default: true). If false, only extraMessages are returned\n */\n public static async loadMessageHistory(\n state: FlowState,\n ): Promise<Message[]> {\n const storage = state.storage;\n const thread = state.thread;\n const includeParentHistory = state.prompt.include_chat ?? true;\n const includeToolCalls = state.prompt.include_past_tools ?? true;\n\n try {\n let rows: any[] = [];\n\n // Only load parent message history from DB if includeParentHistory is true\n if (includeParentHistory) {\n // IMPORTANT: DurableObject SQL returns an iterator/cursor, NOT a result with .rows!\n // Options: 1) Use for...of loop, OR 2) Call .toArray() for array methods\n // DO NOT try to access cursor.rows - it doesn't exist!\n // CRITICAL: Only load top-level messages (parent_id IS NULL) for LLM context\n // Sub-prompt messages are stored for observability but never sent to parent's LLM\n\n // Select columns conditionally based on includeToolCalls\n const columns = [\n \"id\", \"role\", \"content\", \"name\", \"attachments\",\n ...(includeToolCalls ? [\"tool_calls\", \"tool_call_id\", \"tool_status\"] : []),\n \"log_id\", \"created_at\", \"request_sent_at\", \"response_completed_at\",\n \"status\", \"silent\", \"parent_id\", \"depth\",\n \"reasoning_content\", \"reasoning_details\"\n ];\n\n const query = `\n SELECT\n ${columns.join(\", \")}\n FROM messages\n WHERE parent_id IS NULL\n ORDER BY created_at ASC, rowid ASC\n `;\n\n const cursor = await storage.sql.exec<Message & Record<string, any>>(query);\n\n rows = cursor.toArray(); // Convert iterator to array for .map()\n }\n\n // Always append extraMessages if provided, regardless of includeParentHistory setting\n if (state.extraMessages && state.extraMessages.length > 0) {\n rows.push(...state.extraMessages);\n // Sort by created_at with id as tiebreaker (extraMessages don't have rowid)\n rows.sort((a, b) => a.created_at - b.created_at || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n }\n\n // Rows are objects with column names as properties, NOT arrays!\n const messages = rows.map((row: any) => ({\n id: row.id as string,\n role: row.role as Message[\"role\"],\n content: row.content as string | null,\n name: row.name as string | null,\n attachments: row.attachments as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: this.isSilentMessageRow(row.silent),\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n reasoning_content: row.reasoning_content as string | null,\n reasoning_details: row.reasoning_details as string | null,\n }));\n\n // Filter out orphaned tool calls and tool results BEFORE running hooks\n // This prevents API errors from mismatched tool_call/result pairs\n return this.runFilterMessagesHook(\n thread.instance,\n state,\n this.filterOrphanedToolCalls(messages)\n );\n } catch (error) {\n console.error(\"Error loading message history:\", error);\n return [];\n }\n }\n\n /**\n * Run the filter_messages hook if it exists\n * This hook allows developers to modify SQL row data before transformation\n *\n * @param thread - Thread instance with hooks registry\n * @param state - Flow state for hook context\n * @param rows - SQL rows from messages table\n * @returns Processed rows (or original if hook doesn't exist/fails)\n */\n private static async runFilterMessagesHook(\n thread: ThreadInstance,\n state: FlowState,\n messages: Message[]\n ): Promise<Message[]> {\n const executors = await this.getHooksForType(state, 'filter_messages');\n if (executors.length === 0) return messages;\n\n let result = messages;\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n for (const executor of executors) {\n try {\n result = await executor(threadState, result);\n } catch (error) {\n console.error('[Hooks] ✗ Error running filter_messages hook:', error);\n }\n }\n\n return result;\n }\n\n /**\n * Log an error to the logs table (best-effort)\n * Creates a log entry with error details but no associated message_id\n */\n private static async logError(\n state: FlowState,\n error: Error | unknown,\n errorType: string,\n context?: string\n ): Promise<void> {\n try {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)\n `,\n crypto.randomUUID(),\n \"00000000-0000-0000-0000-000000000000\", // Placeholder for errors without message\n \"system\",\n context || \"unknown\",\n `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`,\n errorType,\n Date.now() * TIMESTAMP_MULTIPLIER\n );\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to log error to database:\", logError);\n }\n }\n\n /**\n * Check if a MIME type is an image\n */\n private static isImageMimeType(mimeType: string): boolean {\n return mimeType.startsWith(\"image/\");\n }\n\n /**\n * Resolve attachments from a message and build multimodal content\n * Returns the message content (string or multimodal array)\n *\n * @param msg - Message with potential attachments\n * @param state - Flow state with storage access\n * @returns MessageContent - either string or multimodal array\n */\n private static async resolveAttachmentsToContent(\n msg: Message,\n state: FlowState,\n imagePathMap?: Map<string, string>\n ): Promise<MessageContent> {\n const textContent = msg.content || \"\";\n\n // Parse attachments from JSON\n if (!msg.attachments) {\n return textContent;\n }\n\n let attachments: AttachmentRef[];\n try {\n attachments = JSON.parse(msg.attachments);\n } catch (e) {\n console.error(`Failed to parse attachments for message ${msg.id}:`, e);\n return textContent;\n }\n\n if (!attachments || attachments.length === 0) {\n return textContent;\n }\n\n // Filter to only image attachments\n const imageAttachments = attachments.filter((a) =>\n this.isImageMimeType(a.mimeType)\n );\n\n if (imageAttachments.length === 0) {\n // No images, just return text with non-image file mentions\n const nonImageFiles = attachments.filter(\n (a) => !this.isImageMimeType(a.mimeType)\n );\n if (nonImageFiles.length > 0) {\n const fileList = nonImageFiles.map((a) => a.name).join(\", \");\n return `${textContent}\\n\\n[Attached files: ${fileList}]`;\n }\n return textContent;\n }\n\n // Load image data from storage\n const multimodalParts: MultimodalContent = [];\n\n // Add text content first (if any)\n if (textContent) {\n multimodalParts.push({\n type: \"text\",\n text: textContent,\n });\n }\n\n // Add image attachments\n for (const attachment of imageAttachments) {\n try {\n // Load image data from thread's file storage\n const result = await (state.thread.instance as any).readFile(\n attachment.path\n );\n\n if (result.success && result.data) {\n // Create data URL from base64\n const dataUrl = `data:${attachment.mimeType};base64,${result.data}`;\n // Track mapping for log transformation (data URL -> attachment path)\n if (imagePathMap) {\n imagePathMap.set(dataUrl, attachment.path);\n }\n multimodalParts.push({\n type: \"image_url\",\n image_url: {\n url: dataUrl,\n detail: \"auto\",\n },\n });\n } else {\n // If image couldn't be loaded, mention it in text\n console.warn(\n `Failed to load image attachment ${attachment.path}:`,\n result.error\n );\n multimodalParts.push({\n type: \"text\",\n text: `[Image not available: ${attachment.name}]`,\n });\n }\n } catch (error) {\n console.error(`Error loading image attachment ${attachment.path}:`, error);\n multimodalParts.push({\n type: \"text\",\n text: `[Error loading image: ${attachment.name}]`,\n });\n }\n }\n\n // Add non-image file mentions\n const nonImageFiles = attachments.filter(\n (a) => !this.isImageMimeType(a.mimeType)\n );\n if (nonImageFiles.length > 0) {\n const fileList = nonImageFiles.map((a) => a.name).join(\", \");\n multimodalParts.push({\n type: \"text\",\n text: `\\n\\n[Attached files: ${fileList}]`,\n });\n }\n\n return multimodalParts;\n }\n\n}\n","import type { FlowState, Message, ToolCall, FileRecord, FileStats, GrepResult } from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Options for injecting a message\n */\nexport interface InjectMessageOptions {\n /** The message content */\n content: string;\n /** The message role */\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n /** Optional message ID. If not provided, a UUID will be generated */\n id?: string;\n /** Optional message to insert before. If not provided, message is appended to the end */\n beforeMessageId?: string;\n /** Optional tool call ID (for role=\"tool\" only) */\n toolCallId?: string;\n /** Optional name field */\n name?: string;\n /** Whether this message is silent (hidden from LLM, visible in UI only). Default: false */\n silent?: boolean;\n /** Optional structured metadata */\n metadata?: Record<string, unknown>;\n /** Force message to be top-level (depth 0) even when called from sub-prompts. Default: false */\n forceTopLevel?: boolean;\n /** Force a specific side to play the next turn after injecting the message */\n forceTurn?: \"side_a\" | \"side_b\";\n}\n\n/**\n * Queue a new tool call to be executed in the current flow\n *\n * This adds a tool call to the execution queue without immediately executing it.\n * The tool will be executed as part of the normal flow processing.\n *\n * If the current tool has a `uses` list defined, the toolName must be in that list.\n * This enforces namespace isolation for packed agents.\n *\n * @param flow - The current FlowState\n * @param toolName - The name of the tool to call\n * @param args - The arguments to pass to the tool\n * @throws Error if toolName is not in the current tool's uses list (when defined)\n *\n * @example\n * ```typescript\n * import { queueTool } from '@standardagents/builder';\n *\n * queueTool(flow, \"search_user\", { email: \"user@example.com\" });\n * ```\n */\nexport function queueTool(\n flow: FlowState,\n toolName: string,\n args: Record<string, unknown> = {}\n): void {\n // Validate against uses list if the current tool has one defined\n if (flow.currentToolUses !== undefined) {\n if (!flow.currentToolUses.includes(toolName)) {\n throw new Error(\n `Tool \"${toolName}\" is not declared in the current tool's uses list. ` +\n `Allowed tools: ${flow.currentToolUses.length > 0 ? flow.currentToolUses.join(', ') : '(none)'}. ` +\n `Add \"${toolName}\" to the uses array in defineTool() to enable this call.`\n );\n }\n }\n\n const toolCall: ToolCall = {\n id: crypto.randomUUID(),\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n forceAllow: true,\n queued_at: Date.now() * 1000 // Microseconds to match other timestamps\n };\n\n flow.sequence.queue.push(toolCall);\n flow.sequence.queuedTools.push(toolCall);\n}\n\n/**\n * Inject a message into the thread without triggering execution\n *\n * This allows you to add messages to the conversation history programmatically.\n * The message is persisted to storage but does not cause the agent to execute.\n *\n * By default, messages are appended to the end of the conversation.\n * You can optionally insert a message before another message by providing beforeMessageId.\n *\n * @param flow - The current FlowState\n * @param options - Message options\n *\n * @example\n * ```typescript\n * import { injectMessage } from '@standardagents/builder';\n *\n * // Append a system message\n * await injectMessage(flow, {\n * role: \"system\",\n * content: \"Context has been updated\"\n * });\n *\n * // Insert a user message before a specific message\n * await injectMessage(flow, {\n * role: \"user\",\n * content: \"Additional context\",\n * beforeMessageId: \"msg-123\"\n * });\n *\n * // Inject a message and force a specific side to play next\n * await injectMessage(flow, {\n * role: \"system\",\n * content: \"New instructions for the AI\",\n * forceTurn: \"side_a\" // Force side_a to respond to this message\n * });\n * ```\n */\nexport async function injectMessage(\n flow: FlowState,\n options: InjectMessageOptions\n): Promise<Message> {\n const messageId = options.id ?? crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n const silent = options.silent ?? false;\n\n // Build the message object with hierarchical tracking\n // If forceTopLevel is true, inject at depth 0 regardless of current flow depth\n const forceTopLevel = options.forceTopLevel ?? false;\n const message: Message = {\n id: messageId,\n role: options.role,\n content: options.content,\n name: options.name ?? null,\n tool_call_id: options.toolCallId ?? null,\n created_at: timestamp,\n status: \"completed\",\n silent,\n parent_id: forceTopLevel ? null : (flow.parentMessageId ?? null),\n depth: forceTopLevel ? 0 : flow.depth,\n metadata: options.metadata,\n };\n\n if (options.beforeMessageId) {\n // Insert before a specific message\n // First, get the target message's timestamp\n const cursor = await flow.storage.sql.exec(\n `SELECT created_at FROM messages WHERE id = ?`,\n options.beforeMessageId\n );\n const rows = cursor.toArray();\n const targetMessage = rows[0];\n\n if (!targetMessage) {\n throw new Error(\n `Message with id ${options.beforeMessageId} not found`\n );\n }\n\n // Use a timestamp slightly before the target message\n message.created_at = (targetMessage.created_at as number) - 1;\n }\n\n // Get current prompt name from promptPath\n const currentPrompt = flow.promptPath.length > 0 ? flow.promptPath[flow.promptPath.length - 1] : null;\n\n // Insert the message with hierarchical tracking columns\n const metadataJson = options.metadata ? JSON.stringify(options.metadata) : null;\n await flow.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_call_id, created_at, status, silent, parent_id, depth, metadata, prompt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n messageId,\n message.role,\n message.content,\n message.name,\n message.tool_call_id,\n message.created_at,\n message.status,\n silent ? 1 : 0,\n message.parent_id,\n message.depth,\n metadataJson,\n currentPrompt\n );\n\n // Add the message to messageHistory if it's not silent (silent messages are filtered from LLM context)\n // If it is silent, we need to reload messageHistory to ensure proper filtering\n if (!silent) {\n flow.messageHistory.push(message);\n } else {\n // Reload messageHistory to ensure silent messages are properly excluded from LLM context\n flow.messageHistory = await reloadHistory(flow);\n }\n\n // Broadcast the message if emitMessage callback is available\n if (flow.emitMessage) {\n flow.emitMessage(message);\n }\n\n // Force a turn if requested\n if (options.forceTurn) {\n forceTurn(flow, options.forceTurn);\n }\n\n return message;\n}\n\n/**\n * Get messages from the thread history\n *\n * Retrieves message history from the thread's SQLite storage.\n * Messages are ordered by creation time (oldest first by default).\n *\n * @param flow - The current FlowState\n * @param limit - Maximum number of messages to retrieve (default: 100)\n * @param offset - Number of messages to skip (default: 0)\n * @param order - Sort order: \"asc\" (oldest first) or \"desc\" (newest first) (default: \"asc\")\n * @returns Array of messages\n *\n * @example\n * ```typescript\n * import { getMessages } from '@standardagents/builder';\n *\n * // Get last 10 messages\n * const messages = await getMessages(flow, 10);\n *\n * // Get 10 messages, skipping the first 20\n * const messages = await getMessages(flow, 10, 20);\n *\n * // Get newest 10 messages\n * const messages = await getMessages(flow, 10, 0, \"desc\");\n * ```\n */\nexport async function getMessages(\n flow: FlowState,\n limit: number = 100,\n offset: number = 0,\n order: \"asc\" | \"desc\" = \"asc\"\n): Promise<Message[]> {\n const orderClause = order === \"desc\" ? \"DESC\" : \"ASC\";\n\n const cursor = await flow.storage.sql.exec(\n `SELECT\n id,\n role,\n content,\n name,\n tool_calls,\n tool_call_id,\n log_id,\n created_at,\n request_sent_at,\n response_completed_at,\n status,\n silent,\n parent_id,\n depth,\n metadata,\n subagent_id\n FROM messages\n ORDER BY created_at ${orderClause}, rowid ${orderClause}\n LIMIT ? OFFSET ?`,\n limit,\n offset\n );\n\n const messages: Message[] = [];\n for (const row of cursor) {\n let metadata: Record<string, unknown> | undefined;\n if (typeof row.metadata === \"string\") {\n try {\n const parsed = JSON.parse(row.metadata);\n if (parsed && typeof parsed === \"object\") {\n metadata = parsed as Record<string, unknown>;\n }\n } catch {\n metadata = undefined;\n }\n }\n\n messages.push({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n metadata,\n subagent_id: row.subagent_id as string | null,\n });\n }\n\n return messages;\n}\n\n/**\n * Reload message history from storage\n *\n * Re-loads the complete message history from the thread's SQLite storage,\n * applying any filter_messages hooks. This is useful when you need to refresh\n * the message history after making changes (e.g., injecting silent messages).\n *\n * @param flow - The current FlowState\n * @returns Array of messages (reloaded from storage)\n *\n * @example\n * ```typescript\n * import { injectMessage, reloadHistory } from '@standardagents/builder';\n *\n * // Reload history after injecting a silent message\n * await injectMessage(flow, { role: \"system\", content: \"...\", silent: true });\n * flow.messageHistory = await reloadHistory(flow);\n * ```\n */\nexport async function reloadHistory(state: FlowState): Promise<Message[]> {\n // Dynamic import to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n state.messageHistory = await FlowEngine.loadMessageHistory(state);\n return state.messageHistory;\n}\n\n/**\n * Emit a custom event to WebSocket clients via the stream\n *\n * Sends a custom event to all connected WebSocket clients on the stream channel.\n * This allows backend code to push arbitrary data to the frontend\n * outside of the standard message events.\n *\n * @param flow - The current FlowState\n * @param type - The event type name (e.g., \"progress\", \"notification\")\n * @param data - The event payload (any serializable data)\n *\n * @example\n * ```typescript\n * import { emitThreadEvent } from '@standardagents/builder';\n *\n * // Emit a progress update\n * emitThreadEvent(flow, \"progress\", { step: 3, total: 10, message: \"Processing data...\" });\n *\n * // Emit a custom notification\n * emitThreadEvent(flow, \"notification\", { level: \"info\", message: \"User authenticated\" });\n *\n * // Emit metadata\n * emitThreadEvent(flow, \"metadata\", { userId: \"123\", sessionId: \"abc\" });\n * ```\n */\nexport function emitThreadEvent(\n flow: FlowState,\n type: string,\n data: unknown\n): void {\n if (!flow.emitEvent) {\n console.warn(\"Cannot emit event: emitEvent callback is not available\");\n return;\n }\n\n // Send event via the callback to DurableThread\n flow.emitEvent(type, data);\n}\n\n/**\n * Force a specific side to play the next turn\n *\n * This queues the specified side to play next without interrupting the current turn.\n * The forced turn only takes effect at the END of the current turn execution.\n *\n * If the tool queue is currently being processed (sequence.isHandling is true),\n * the forced turn is deferred until all queued tools complete. This allows patterns like:\n *\n * ```typescript\n * import { queueTool, forceTurn } from '@standardagents/builder';\n *\n * queueTool(flow, 'myTool', {});\n * forceTurn(flow, 'side_a');\n * // myTool executes first, THEN the turn switches to side_a\n * ```\n *\n * @param flow - The current FlowState\n * @param side - Which side should play next ('side_a' or 'side_b')\n *\n * @example\n * ```typescript\n * import { forceTurn } from '@standardagents/builder';\n *\n * // Force current side to continue (override stop condition)\n * // If side_a is playing and would stop, this forces it to play at least 1 more turn\n * forceTurn(flow, 'side_a');\n *\n * // Force switch to other side\n * // If side_a is playing, this forces side_b to play next turn\n * forceTurn(flow, 'side_b');\n *\n * // Force human turn in ai_human agent (execution stops and waits for user input)\n * if (flow.agentConfig.type === 'ai_human') {\n * forceTurn(flow, 'side_b'); // Stops execution, awaits user input\n * }\n * ```\n */\nexport function forceTurn(flow: FlowState, side: 'side_a' | 'side_b'): void {\n // If the tool queue is currently being processed, defer the force turn\n // until all queued tools complete. This allows queueTool + forceTurn to work together.\n if (flow.sequence.isHandling) {\n flow.pendingForceTurn = side;\n } else {\n flow.forcedNextSide = side;\n }\n}\n\n/**\n * Thread context from defineThreadEndpoint\n */\ninterface ThreadContext {\n instance: {\n updateThreadMeta: (\n threadId: string,\n params: { agent_name?: string; user_id?: string | null; tags?: string[] | null }\n ) => Promise<{\n success: boolean;\n error?: string;\n thread?: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n }>;\n };\n metadata: {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n };\n}\n\n/**\n * Update a thread's metadata in the DurableAgentBuilder registry\n *\n * This allows updating the agent_name, user_id, and tags for an existing thread.\n * Uses the thread instance from defineThreadEndpoint context.\n *\n * @param thread - The thread context from defineThreadEndpoint ({ instance, metadata })\n * @param params - The fields to update (agent_name, user_id, tags)\n * @returns The updated thread info, or null if update failed\n *\n * @example\n * ```typescript\n * import { defineThreadEndpoint, updateThread } from '@standardagents/builder';\n *\n * export default defineThreadEndpoint(async (req, thread) => {\n * // Update thread's user_id\n * await updateThread(thread, { user_id: 'user-123' });\n *\n * // Update thread's tags\n * await updateThread(thread, { tags: ['support', 'urgent'] });\n *\n * // Update multiple fields\n * const result = await updateThread(thread, {\n * agent_name: 'new-agent',\n * user_id: 'user-456',\n * tags: ['sales']\n * });\n *\n * return Response.json(result);\n * });\n * ```\n */\nexport async function updateThread(\n thread: ThreadContext,\n params: {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n): Promise<{\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n} | null> {\n const result = await thread.instance.updateThreadMeta(thread.metadata.id, params);\n if (!result.success || !result.thread) {\n return null;\n }\n return result.thread;\n}\n\n// ============================================================\n// File System Utilities\n// ============================================================\n\n/**\n * Write a file to thread storage\n *\n * @param flow - The current FlowState\n * @param path - File path (e.g., \"/images/photo.jpg\")\n * @param data - File data as ArrayBuffer or string\n * @param mimeType - MIME type of the file\n * @param options - Optional metadata and thumbnail\n * @returns The created file record\n *\n * @example\n * ```typescript\n * import { writeFile } from '@standardagents/builder';\n *\n * // Write binary file\n * const imageData = new Uint8Array([...]);\n * await writeFile(flow, \"/images/photo.jpg\", imageData.buffer, \"image/jpeg\");\n *\n * // Write text file\n * await writeFile(flow, \"/docs/readme.md\", \"# Hello\", \"text/markdown\");\n * ```\n */\nexport async function writeFile(\n flow: FlowState,\n path: string,\n data: ArrayBuffer | string,\n mimeType: string,\n options?: {\n metadata?: Record<string, unknown>;\n thumbnail?: ArrayBuffer;\n }\n): Promise<FileRecord> {\n const instance = flow.thread.instance as any;\n\n // Convert data to base64\n let base64Data: string;\n if (typeof data === \"string\") {\n base64Data = btoa(data);\n } else {\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n base64Data = btoa(binary);\n }\n\n // Convert thumbnail to base64 if present\n let base64Thumbnail: string | undefined;\n if (options?.thumbnail) {\n const bytes = new Uint8Array(options.thumbnail);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n base64Thumbnail = btoa(binary);\n }\n\n const result = await instance.writeFile(path, base64Data, mimeType, {\n metadata: options?.metadata,\n thumbnail: base64Thumbnail,\n });\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to write file\");\n }\n\n return result.file;\n}\n\n/**\n * Write an image file with optional thumbnail\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @param data - Image data as ArrayBuffer\n * @param mimeType - Image MIME type\n * @param options - Image metadata (width, height) and optional thumbnail\n * @returns The created file record\n *\n * @example\n * ```typescript\n * import { writeImage } from '@standardagents/builder';\n *\n * await writeImage(flow, \"/images/photo.jpg\", imageBuffer, \"image/jpeg\", {\n * metadata: { width: 1024, height: 768 },\n * thumbnail: thumbnailBuffer\n * });\n * ```\n */\nexport async function writeImage(\n flow: FlowState,\n path: string,\n data: ArrayBuffer,\n mimeType: string,\n options?: {\n metadata?: { width: number; height: number; [key: string]: unknown };\n thumbnail?: ArrayBuffer;\n }\n): Promise<FileRecord> {\n return writeFile(flow, path, data, mimeType, options);\n}\n\n/**\n * Link to an external file (URL, S3, R2)\n *\n * Creates a file entry pointing to an external location without storing the data locally.\n *\n * @param flow - The current FlowState\n * @param path - File path in thread storage\n * @param location - External location (https://, s3://, r2://)\n * @param options - Optional MIME type, size, and metadata\n * @returns The created file record\n *\n * @example\n * ```typescript\n * import { linkFile } from '@standardagents/builder';\n *\n * // Link to a URL\n * await linkFile(flow, \"/images/hero.jpg\", \"https://cdn.example.com/hero.jpg\");\n *\n * // Link to S3\n * await linkFile(flow, \"/data/large.csv\", \"s3://mybucket/data/large.csv\", {\n * mimeType: \"text/csv\",\n * size: 10 * 1024 * 1024 * 1024 // 10GB\n * });\n * ```\n */\nexport async function linkFile(\n flow: FlowState,\n path: string,\n location: string,\n options?: {\n mimeType?: string;\n size?: number;\n metadata?: Record<string, unknown>;\n }\n): Promise<FileRecord> {\n const instance = flow.thread.instance as any;\n const result = await instance.linkFile(path, location, options);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to link file\");\n }\n\n return result.file;\n}\n\n/**\n * Read a file from thread storage\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @returns File data as ArrayBuffer, or null if not found/external\n *\n * @example\n * ```typescript\n * import { readFile } from '@standardagents/builder';\n *\n * const data = await readFile(flow, \"/images/photo.jpg\");\n * if (data) {\n * // Process binary data\n * }\n * ```\n */\nexport async function readFile(\n flow: FlowState,\n path: string\n): Promise<ArrayBuffer | null> {\n const instance = flow.thread.instance as any;\n const result = await instance.readFile(path);\n\n if (!result.success) {\n return null;\n }\n\n // Convert base64 to ArrayBuffer\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Get file metadata\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @returns File record or null if not found\n *\n * @example\n * ```typescript\n * import { stat } from '@standardagents/builder';\n *\n * const file = await stat(flow, \"/images/photo.jpg\");\n * if (file) {\n * console.log(`Size: ${file.size}, Type: ${file.mimeType}`);\n * }\n * ```\n */\nexport async function stat(\n flow: FlowState,\n path: string\n): Promise<FileRecord | null> {\n const instance = flow.thread.instance as any;\n const result = await instance.statFile(path);\n\n if (!result.success) {\n return null;\n }\n\n return result.file;\n}\n\n/**\n * Check if file or directory exists\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @returns true if exists, false otherwise\n *\n * @example\n * ```typescript\n * import { exists } from '@standardagents/builder';\n *\n * if (await exists(flow, \"/config.json\")) {\n * // File exists\n * }\n * ```\n */\nexport async function exists(flow: FlowState, path: string): Promise<boolean> {\n const instance = flow.thread.instance as any;\n const result = await instance.fileExists(path);\n return result.success && result.exists;\n}\n\n/**\n * Delete a file\n *\n * @param flow - The current FlowState\n * @param path - File path\n *\n * @example\n * ```typescript\n * import { unlink } from '@standardagents/builder';\n *\n * await unlink(flow, \"/temp/draft.txt\");\n * ```\n */\nexport async function unlink(flow: FlowState, path: string): Promise<void> {\n const instance = flow.thread.instance as any;\n const result = await instance.unlinkFile(path);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to delete file\");\n }\n}\n\n/**\n * Create a directory\n *\n * @param flow - The current FlowState\n * @param path - Directory path\n * @returns The created directory record\n *\n * @example\n * ```typescript\n * import { mkdir } from '@standardagents/builder';\n *\n * await mkdir(flow, \"/uploads/2024\");\n * ```\n */\nexport async function mkdir(flow: FlowState, path: string): Promise<FileRecord> {\n const instance = flow.thread.instance as any;\n const result = await instance.mkdirFile(path);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to create directory\");\n }\n\n return result.directory;\n}\n\n/**\n * List directory contents\n *\n * @param flow - The current FlowState\n * @param path - Directory path\n * @returns Array of file records in the directory\n *\n * @example\n * ```typescript\n * import { readdir } from '@standardagents/builder';\n *\n * const files = await readdir(flow, \"/images\");\n * for (const file of files) {\n * console.log(file.name, file.size);\n * }\n * ```\n */\nexport async function readdir(\n flow: FlowState,\n path: string\n): Promise<FileRecord[]> {\n const instance = flow.thread.instance as any;\n const result = await instance.readdirFile(path);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to read directory\");\n }\n\n return result.files;\n}\n\n/**\n * Remove an empty directory\n *\n * @param flow - The current FlowState\n * @param path - Directory path\n *\n * @example\n * ```typescript\n * import { rmdir } from '@standardagents/builder';\n *\n * await rmdir(flow, \"/temp\");\n * ```\n */\nexport async function rmdir(flow: FlowState, path: string): Promise<void> {\n const instance = flow.thread.instance as any;\n const result = await instance.rmdirFile(path);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to remove directory\");\n }\n}\n\n/**\n * Get file storage statistics\n *\n * @param flow - The current FlowState\n * @returns Storage statistics (total size and file count)\n *\n * @example\n * ```typescript\n * import { getFileStats } from '@standardagents/builder';\n *\n * const stats = await getFileStats(flow);\n * console.log(`Total: ${stats.totalSize} bytes, Files: ${stats.fileCount}`);\n * ```\n */\nexport async function getFileStats(flow: FlowState): Promise<FileStats> {\n const instance = flow.thread.instance as any;\n const result = await instance.getFileStats();\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to get file stats\");\n }\n\n return result.stats;\n}\n\n/**\n * Get thumbnail for an image file\n *\n * @param flow - The current FlowState\n * @param path - Image file path\n * @returns Thumbnail data as ArrayBuffer, or null if not found\n *\n * @example\n * ```typescript\n * import { getThumbnail } from '@standardagents/builder';\n *\n * const thumb = await getThumbnail(flow, \"/images/photo.jpg\");\n * ```\n */\nexport async function getThumbnail(\n flow: FlowState,\n path: string\n): Promise<ArrayBuffer | null> {\n const instance = flow.thread.instance as any;\n const result = await instance.getFileThumbnail(path);\n\n if (!result.success) {\n return null;\n }\n\n // Convert base64 to ArrayBuffer\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Read a text file as string\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @returns File content as string, or null if not found\n *\n * @example\n * ```typescript\n * import { cat } from '@standardagents/builder';\n *\n * const content = await cat(flow, \"/docs/readme.md\");\n * ```\n */\nexport async function cat(flow: FlowState, path: string): Promise<string | null> {\n const instance = flow.thread.instance as any;\n const result = await instance.readTextFile(path);\n\n if (!result.success) {\n return null;\n }\n\n return result.content;\n}\n\n/**\n * Read first N lines of a text file\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @param lines - Number of lines to read (default: 10)\n * @returns First N lines as string, or null if not found\n *\n * @example\n * ```typescript\n * import { head } from '@standardagents/builder';\n *\n * const firstLines = await head(flow, \"/logs/app.log\", 20);\n * ```\n */\nexport async function head(\n flow: FlowState,\n path: string,\n lines: number = 10\n): Promise<string | null> {\n const content = await cat(flow, path);\n if (content === null) return null;\n\n const allLines = content.split(\"\\n\");\n return allLines.slice(0, lines).join(\"\\n\");\n}\n\n/**\n * Read last N lines of a text file\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @param lines - Number of lines to read (default: 10)\n * @returns Last N lines as string, or null if not found\n *\n * @example\n * ```typescript\n * import { tail } from '@standardagents/builder';\n *\n * const lastLines = await tail(flow, \"/logs/app.log\", 50);\n * ```\n */\nexport async function tail(\n flow: FlowState,\n path: string,\n lines: number = 10\n): Promise<string | null> {\n const content = await cat(flow, path);\n if (content === null) return null;\n\n const allLines = content.split(\"\\n\");\n return allLines.slice(-lines).join(\"\\n\");\n}\n\n/**\n * Search text file contents using FTS5 full-text search\n *\n * @param flow - The current FlowState\n * @param pattern - Search pattern (FTS5 syntax)\n * @param options - Search options\n * @returns Array of matching results with snippets\n *\n * @example\n * ```typescript\n * import { grep } from '@standardagents/builder';\n *\n * // Search all files\n * const results = await grep(flow, \"error\");\n *\n * // Search in specific directory\n * const results = await grep(flow, \"TODO\", { path: \"/src\" });\n * ```\n */\nexport async function grep(\n flow: FlowState,\n pattern: string,\n options?: {\n path?: string;\n limit?: number;\n }\n): Promise<GrepResult[]> {\n const instance = flow.thread.instance as any;\n const result = await instance.grepFiles(pattern, options);\n\n if (!result.success) {\n throw new Error(result.error || \"Search failed\");\n }\n\n // Map to GrepResult format\n return result.results.map((r: any) => ({\n path: r.path,\n name: r.name,\n matches: [r.snippet],\n }));\n}\n\n/**\n * Find files by path pattern\n *\n * @param flow - The current FlowState\n * @param pattern - Glob-like pattern (e.g., \"*.md\", \"/docs/subdir/*.txt\")\n * @param options - Find options\n * @returns Array of matching file records\n *\n * @example\n * ```typescript\n * import { find } from '@standardagents/builder';\n *\n * // Find all markdown files\n * const mdFiles = await find(flow, \"*.md\");\n *\n * // Find all files in docs\n * const docFiles = await find(flow, \"/docs/*\", { type: \"file\" });\n * ```\n */\nexport async function find(\n flow: FlowState,\n pattern: string,\n options?: {\n type?: \"file\" | \"directory\" | \"all\";\n limit?: number;\n }\n): Promise<FileRecord[]> {\n const instance = flow.thread.instance as any;\n const result = await instance.findFiles(pattern, options);\n\n if (!result.success) {\n throw new Error(result.error || \"Find failed\");\n }\n\n return result.files;\n}\n","import type {\n CodeExecution,\n CodeExecutionError,\n CodeExecutionLog,\n CodeExecutionOptions,\n CodeExecutionResult,\n} from \"@standardagents/spec\";\nimport type { ThreadInstance } from \"./types.js\";\n\nconst WORKER_LOADER_BINDING = \"AGENT_BUILDER_CODE_LOADER\";\nconst MAIN_MODULE = \"__agentbuilder_main.js\";\nconst BRIDGE_ROUTE_PREFIX = \"/__agentbuilder/run-code\";\nconst DEFAULT_FILENAME = \"<runCode>\";\nconst DEFAULT_COMPATIBILITY_DATE = \"2025-12-02\";\nconst CODE_EXECUTION_RUNTIME_VERSION = \"2026-04-22-source-line-map-v1\";\nconst FORBIDDEN_GLOBAL_IDENTIFIERS = [\n \"process\",\n \"global\",\n \"window\",\n \"self\",\n \"document\",\n \"require\",\n \"Deno\",\n \"Bun\",\n \"fetch\",\n \"Request\",\n \"Response\",\n \"URL\",\n \"URLSearchParams\",\n \"WebSocket\",\n \"WebAssembly\",\n \"crypto\",\n \"setTimeout\",\n \"setInterval\",\n \"setImmediate\",\n \"performance\",\n \"atob\",\n \"btoa\",\n \"TextEncoder\",\n \"TextDecoder\",\n \"Atomics\",\n \"SharedArrayBuffer\",\n];\n\nconst OPTION_KEYS = new Set([\n \"execute\",\n \"imports\",\n \"globals\",\n \"modules\",\n \"language\",\n \"memoryLimitBytes\",\n \"filename\",\n \"report\",\n]);\n\ntype EncodedValue =\n | null\n | string\n | number\n | boolean\n | { __agentbuilderType: string; [key: string]: unknown }\n | EncodedValue[]\n | { [key: string]: EncodedValue };\n\ntype BridgeFunction = (...args: unknown[]) => unknown | Promise<unknown>;\n\nexport interface CodeExecutionBridgeRegistration {\n call(functionId: string, encodedArgs: unknown[]): Promise<unknown>;\n}\n\ninterface WorkerLoaderWorkerCode {\n compatibilityDate: string;\n compatibilityFlags?: string[];\n allowExperimental?: boolean;\n mainModule: string;\n modules: Record<string, { js: string } | string>;\n env?: Record<string, unknown>;\n globalOutbound?: unknown | null;\n}\n\ninterface WorkerStub {\n getEntrypoint(name?: string): Fetcher;\n}\n\ninterface WorkerLoader {\n load?(code: WorkerLoaderWorkerCode): WorkerStub;\n get?(\n id: string,\n getCode: () => WorkerLoaderWorkerCode | Promise<WorkerLoaderWorkerCode>,\n ): WorkerStub;\n}\n\nexport interface CodeExecutionBridgeHost {\n registerCodeExecutionBridge?(runId: string, bridge: CodeExecutionBridgeRegistration): void;\n unregisterCodeExecutionBridge?(runId: string): void;\n}\n\ninterface CodeExecutionBridgeBinding {\n call(threadId: string, runId: string, functionId: string, encodedArgs: unknown[]): Promise<unknown>;\n}\n\ninterface DurableObjectStateWithExports {\n exports?: {\n CodeExecutionBridge?: (options?: {\n props?: Record<string, unknown>;\n }) => CodeExecutionBridgeBinding;\n };\n}\n\ninterface PreparedBridge {\n values: {\n imports: Record<string, Record<string, EncodedValue>>;\n globals: Record<string, EncodedValue>;\n };\n functions: Map<string, BridgeFunction>;\n globalNames: string[];\n importModules: Record<string, { js: string }>;\n reports: unknown[];\n logs: CodeExecutionLog[];\n}\n\ninterface PreparedExecutionTarget {\n fn: string;\n args: EncodedValue[];\n}\n\ninterface DynamicWorkerSuccess {\n ok: true;\n result: EncodedValue;\n reports: EncodedValue[];\n logs: CodeExecutionLog[];\n durationMs?: number;\n}\n\ninterface DynamicWorkerFailure {\n ok: false;\n status: CodeExecutionResult[\"status\"];\n error: CodeExecutionError;\n reports: EncodedValue[];\n logs: CodeExecutionLog[];\n durationMs?: number;\n}\n\ntype DynamicWorkerResponse = DynamicWorkerSuccess | DynamicWorkerFailure;\n\ninterface SourceLineMap {\n filename: string;\n lineOffset: number;\n}\n\ntype TypeScriptModule = typeof import(\"typescript\");\n\nlet typescriptCompilerPromise: Promise<TypeScriptModule | null> | null = null;\n\nexport function runCodeInDynamicWorker(params: {\n source: string;\n options?: CodeExecutionOptions;\n threadId: string;\n threadInstance: ThreadInstance;\n abortSignal?: AbortSignal;\n}): CodeExecution {\n const startedAt = Date.now();\n const validationError = validateOptions(params.options);\n if (validationError) {\n return settledCodeExecution({\n status: \"link_error\",\n reports: [],\n logs: [],\n durationMs: Date.now() - startedAt,\n error: validationError,\n });\n }\n\n const options = params.options ?? {};\n const reports: unknown[] = [];\n const logs: CodeExecutionLog[] = [];\n const runId = crypto.randomUUID();\n const abortController = new AbortController();\n let terminated = false;\n let terminateReason = \"Code execution terminated\";\n let settleTermination: ((result: CodeExecutionResult) => void) | null = null;\n\n const termination = new Promise<CodeExecutionResult>((resolve) => {\n settleTermination = resolve;\n });\n\n const execute = async (): Promise<CodeExecutionResult> => {\n const loader = params.threadInstance.env[WORKER_LOADER_BINDING] as\n | WorkerLoader\n | undefined;\n\n if (!loader || (typeof loader.load !== \"function\" && typeof loader.get !== \"function\")) {\n return {\n status: \"link_error\",\n reports,\n logs,\n durationMs: Date.now() - startedAt,\n error: {\n name: \"MissingWorkerLoader\",\n message:\n `ThreadState.runCode requires the ${WORKER_LOADER_BINDING} Worker Loader binding. ` +\n \"Run the AgentBuilder scaffold/init step or use builder(), which injects the worker_loaders binding.\",\n },\n };\n }\n\n const language = options.language ?? \"typescript\";\n const filename = options.filename ?? DEFAULT_FILENAME;\n const graphSources = prepareModuleGraphSources(\n params.source,\n options.modules,\n filename,\n );\n const executableSource = await prepareExecutableSource(\n graphSources.source,\n language,\n filename,\n );\n const executableModules = await prepareExecutableModules(\n graphSources.modules,\n language,\n );\n const executionTarget = prepareExecutionTarget(options.execute);\n\n const prepared = prepareBridge(options, reports, logs);\n const bridgeHost = params.threadInstance as ThreadInstance & CodeExecutionBridgeHost;\n if (typeof bridgeHost.registerCodeExecutionBridge !== \"function\") {\n return {\n status: \"link_error\",\n reports,\n logs,\n durationMs: Date.now() - startedAt,\n error: {\n name: \"MissingBridgeHost\",\n message: \"ThreadState.runCode requires a DurableThread runtime with code bridge support.\",\n },\n };\n }\n\n const bridge: CodeExecutionBridgeRegistration = {\n call: async (functionId, encodedArgs) => {\n const fn = prepared.functions.get(functionId);\n if (!fn) {\n throw new Error(`Unknown bridged function: ${functionId}`);\n }\n const args = (encodedArgs as EncodedValue[]).map((arg) => decodeValue(arg));\n try {\n const value = await fn(...args);\n return encodeValue(value);\n } catch (error) {\n throw toBridgeError(error);\n }\n },\n };\n\n bridgeHost.registerCodeExecutionBridge(runId, bridge);\n let sourceLineMaps: Record<string, SourceLineMap> = {};\n\n try {\n const bridgeBinding = getCodeExecutionBridgeBinding(params.threadInstance);\n if (!bridgeBinding) {\n return {\n status: \"link_error\",\n reports,\n logs,\n durationMs: Date.now() - startedAt,\n error: {\n name: \"MissingCodeExecutionBridge\",\n message:\n \"ThreadState.runCode requires the CodeExecutionBridge WorkerEntrypoint export and the \" +\n \"enable_ctx_exports compatibility flag. Run the AgentBuilder scaffold/init step or \" +\n \"export CodeExecutionBridge from your Worker entrypoint.\",\n },\n };\n }\n\n const compatibilityDate =\n (params.threadInstance.env.AGENT_BUILDER_CODE_COMPATIBILITY_DATE as string | undefined) ??\n DEFAULT_COMPATIBILITY_DATE;\n const workerId = createWorkerId({\n source: executableSource,\n filename,\n modules: executableModules,\n prepared,\n compatibilityDate,\n memoryLimitBytes: options.memoryLimitBytes,\n });\n\n const workerCode = buildWorkerCode({\n source: executableSource,\n filename,\n modules: executableModules,\n prepared,\n compatibilityDate,\n memoryLimitBytes: options.memoryLimitBytes,\n bridgeBinding,\n });\n sourceLineMaps = createSourceLineMaps(workerCode);\n\n const worker =\n typeof loader.get === \"function\"\n ? loader.get(workerId, () => workerCode)\n : loader.load!(workerCode);\n\n const requestBody = JSON.stringify({\n threadId: params.threadId,\n runId,\n execute: executionTarget,\n values: prepared.values,\n memoryLimitBytes: options.memoryLimitBytes ?? null,\n });\n\n const signal = combineAbortSignals(abortController.signal, params.abortSignal);\n const response = await worker\n .getEntrypoint()\n .fetch(\"https://agentbuilder-code-runner/run\", {\n method: \"POST\",\n body: requestBody,\n signal,\n });\n\n const payload = (await response.json()) as DynamicWorkerResponse;\n const durationMs = Date.now() - startedAt;\n if (!payload.ok) {\n mergeLogs(logs, payload.logs);\n mergeReports(reports, payload.reports.map((report) => decodeValue(report)));\n const mappedError = mapCodeExecutionError(payload.error, sourceLineMaps);\n return {\n status: payload.status,\n error: mappedError,\n reports,\n logs,\n durationMs,\n };\n }\n\n mergeLogs(logs, payload.logs);\n mergeReports(reports, payload.reports.map((report) => decodeValue(report)));\n return {\n status: \"success\",\n result: decodeValue(payload.result),\n reports,\n logs,\n durationMs,\n };\n } catch (error) {\n if (terminated || isAbortError(error)) {\n return terminatedResult(terminateReason, reports, logs, startedAt);\n }\n\n const executionError = mapCodeExecutionError(toCodeExecutionError(error), sourceLineMaps);\n const status = isMemoryError(executionError)\n ? \"memory\"\n : isLikelyLinkError(executionError)\n ? \"link_error\"\n : \"error\";\n return {\n status,\n error: executionError,\n reports,\n logs,\n durationMs: Date.now() - startedAt,\n };\n } finally {\n bridgeHost.unregisterCodeExecutionBridge?.(runId);\n }\n };\n\n let running = true;\n const promise = Promise.race([execute(), termination]).finally(() => {\n running = false;\n abortController.abort();\n });\n\n return {\n then: promise.then.bind(promise) as CodeExecution[\"then\"],\n terminate(reason?: string): void {\n if (!running || terminated) {\n return;\n }\n terminated = true;\n terminateReason = reason || terminateReason;\n abortController.abort(terminateReason);\n settleTermination?.(terminatedResult(terminateReason, reports, logs, startedAt));\n },\n get running() {\n return running;\n },\n get reports() {\n return reports;\n },\n };\n}\n\nexport async function handleCodeExecutionBridgeRequest(\n bridges: Map<string, CodeExecutionBridgeRegistration>,\n request: Request,\n): Promise<Response> {\n const url = new URL(request.url);\n if (!url.pathname.startsWith(`${BRIDGE_ROUTE_PREFIX}/`)) {\n return new Response(\"Not found\", { status: 404 });\n }\n\n const [, , , runId, action] = url.pathname.split(\"/\");\n if (!runId || action !== \"call\") {\n return new Response(\"Invalid code bridge route\", { status: 400 });\n }\n\n const bridge = bridges.get(runId);\n if (!bridge) {\n return Response.json(\n {\n ok: false,\n error: {\n name: \"BridgeUnavailable\",\n message: \"Code execution bridge is no longer available\",\n },\n },\n { status: 410 },\n );\n }\n\n try {\n const body = (await request.json()) as {\n functionId: string;\n args: EncodedValue[];\n };\n const value = await bridge.call(body.functionId, body.args ?? []);\n return Response.json({ ok: true, value });\n } catch (error) {\n return Response.json(\n {\n ok: false,\n error: toCodeExecutionError(error),\n },\n { status: 200 },\n );\n }\n}\n\nexport function isCodeExecutionBridgeRequest(request: Request): boolean {\n return new URL(request.url).pathname.startsWith(`${BRIDGE_ROUTE_PREFIX}/`);\n}\n\nfunction settledCodeExecution(result: CodeExecutionResult): CodeExecution {\n const promise = Promise.resolve(result);\n return {\n then: promise.then.bind(promise) as CodeExecution[\"then\"],\n terminate() {\n // Already settled.\n },\n running: false,\n reports: result.reports,\n };\n}\n\nfunction validateOptions(options?: CodeExecutionOptions): CodeExecutionError | null {\n if (!options) {\n return null;\n }\n for (const key of Object.keys(options)) {\n if (!OPTION_KEYS.has(key)) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: `Unknown runCode option: ${key}`,\n };\n }\n }\n if (options.language && options.language !== \"javascript\" && options.language !== \"typescript\") {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: `Unsupported runCode language: ${options.language}`,\n };\n }\n if (options.execute !== undefined) {\n if (!options.execute || typeof options.execute !== \"object\" || Array.isArray(options.execute)) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: \"runCode execute must be an object\",\n };\n }\n if (\n options.execute.fn !== undefined &&\n (typeof options.execute.fn !== \"string\" || options.execute.fn.length === 0)\n ) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: \"runCode execute.fn must be a non-empty string\",\n };\n }\n if (options.execute.args !== undefined && !Array.isArray(options.execute.args)) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: \"runCode execute.args must be an array\",\n };\n }\n try {\n for (const arg of options.execute.args ?? []) {\n encodeValue(arg);\n }\n } catch (error) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: error instanceof Error ? error.message : \"runCode execute.args must be transferable\",\n };\n }\n }\n if (\n options.memoryLimitBytes !== undefined &&\n (!Number.isFinite(options.memoryLimitBytes) || options.memoryLimitBytes <= 0)\n ) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: \"memoryLimitBytes must be a positive finite number\",\n };\n }\n if (options.imports) {\n for (const [specifier, namespace] of Object.entries(options.imports)) {\n if (!isBareSpecifier(specifier)) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: `runCode imports only accept bare specifiers: ${specifier}`,\n specifier,\n };\n }\n if (!namespace || typeof namespace !== \"object\" || Array.isArray(namespace)) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: `runCode import namespace must be an object: ${specifier}`,\n specifier,\n };\n }\n }\n }\n if (options.modules) {\n if (typeof options.modules !== \"object\" || Array.isArray(options.modules)) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: \"runCode modules must be an object\",\n };\n }\n for (const [specifier, source] of Object.entries(options.modules)) {\n if (!isRelativeSpecifier(specifier)) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: `runCode modules only accept relative specifiers: ${specifier}`,\n specifier,\n };\n }\n if (typeof source !== \"string\") {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: `runCode module source must be a string: ${specifier}`,\n specifier,\n };\n }\n }\n }\n if (options.globals && (typeof options.globals !== \"object\" || Array.isArray(options.globals))) {\n return {\n name: \"InvalidCodeExecutionOptions\",\n message: \"runCode globals must be an object\",\n };\n }\n return null;\n}\n\nasync function prepareExecutableSource(\n source: string,\n language: CodeExecutionOptions[\"language\"],\n filename = DEFAULT_FILENAME,\n): Promise<string> {\n if (language !== \"typescript\") {\n return source;\n }\n\n const ts = await loadTypeScriptCompiler();\n if (!ts) {\n return stripTypeScriptTypes(source);\n }\n\n const output = ts.transpileModule(source, {\n fileName: filename,\n reportDiagnostics: true,\n compilerOptions: createTranspileCompilerOptions(ts),\n });\n\n const diagnostics = output.diagnostics ?? [];\n const blocking = diagnostics.find(\n (diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error,\n );\n if (blocking) {\n throw diagnosticToCodeExecutionError(ts, blocking, filename);\n }\n\n return output.outputText;\n}\n\nasync function prepareExecutableModules(\n modules: Record<string, string> | undefined,\n language: CodeExecutionOptions[\"language\"],\n): Promise<Record<string, string>> {\n const out: Record<string, string> = {};\n for (const [specifier, source] of Object.entries(modules ?? {})) {\n out[normalizeRelativeModuleSpecifier(specifier)] = await prepareExecutableSource(\n source,\n language,\n specifier,\n );\n }\n return out;\n}\n\nfunction prepareModuleGraphSources(\n source: string,\n modules: CodeExecutionOptions[\"modules\"] | undefined,\n filename: string,\n): { source: string; modules: Record<string, string> | undefined } {\n if (!modules || Object.keys(modules).length === 0) {\n return { source, modules };\n }\n\n const moduleSources = new Map<string, string>();\n for (const [specifier, moduleSource] of Object.entries(modules)) {\n const modulePath = normalizeVirtualModulePath(\"\", specifier);\n moduleSources.set(modulePath, moduleSource);\n }\n\n const modulePaths = new Set(moduleSources.keys());\n const entryPath = normalizeEntryModulePath(filename);\n const rewrittenSource = rewriteGraphRelativeSpecifiers(source, entryPath, \"\", modulePaths);\n const rewrittenModules: Record<string, string> = {};\n\n for (const [modulePath, moduleSource] of moduleSources) {\n rewrittenModules[`./${modulePath}`] = rewriteGraphRelativeSpecifiers(\n moduleSource,\n modulePath,\n modulePath,\n modulePaths,\n );\n }\n\n return { source: rewrittenSource, modules: rewrittenModules };\n}\n\nfunction loadTypeScriptCompiler(): Promise<TypeScriptModule | null> {\n typescriptCompilerPromise ??= import(\"typescript\")\n .then((module) => normalizeTypeScriptCompiler(module))\n .catch(() => null);\n return typescriptCompilerPromise;\n}\n\nfunction normalizeTypeScriptCompiler(module: unknown): TypeScriptModule | null {\n const candidates = [\n module,\n module && typeof module === \"object\" && \"default\" in module\n ? (module as { default?: unknown }).default\n : null,\n ];\n\n for (const candidate of candidates) {\n if (\n candidate &&\n typeof candidate === \"object\" &&\n typeof (candidate as TypeScriptModule).transpileModule === \"function\"\n ) {\n return candidate as TypeScriptModule;\n }\n }\n\n return null;\n}\n\nfunction createTranspileCompilerOptions(\n ts: TypeScriptModule,\n): import(\"typescript\").CompilerOptions {\n const options: import(\"typescript\").CompilerOptions = {\n isolatedModules: true,\n preserveValueImports: false,\n sourceMap: false,\n inlineSourceMap: false,\n inlineSources: false,\n };\n\n const target =\n ts.ScriptTarget?.ES2022 ?? ts.ScriptTarget?.ES2021 ?? ts.ScriptTarget?.ES2020;\n if (target !== undefined) {\n options.target = target;\n }\n\n const moduleKind = ts.ModuleKind?.ESNext ?? ts.ModuleKind?.ES2022 ?? ts.ModuleKind?.ES2020;\n if (moduleKind !== undefined) {\n options.module = moduleKind;\n }\n\n const moduleResolution =\n ts.ModuleResolutionKind?.Bundler ??\n ts.ModuleResolutionKind?.NodeNext ??\n ts.ModuleResolutionKind?.Node16 ??\n ts.ModuleResolutionKind?.NodeJs;\n if (moduleResolution !== undefined) {\n options.moduleResolution = moduleResolution;\n }\n\n const jsx = ts.JsxEmit?.ReactJSX ?? ts.JsxEmit?.Preserve;\n if (jsx !== undefined) {\n options.jsx = jsx;\n }\n\n const importsNotUsedAsValues = ts.ImportsNotUsedAsValues?.Remove;\n if (importsNotUsedAsValues !== undefined) {\n options.importsNotUsedAsValues = importsNotUsedAsValues;\n }\n\n return options;\n}\n\nfunction diagnosticToCodeExecutionError(\n ts: TypeScriptModule,\n diagnostic: import(\"typescript\").Diagnostic,\n fallbackFilename: string,\n): CodeExecutionError {\n const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, \"\\n\");\n const file = diagnostic.file;\n if (file && typeof diagnostic.start === \"number\") {\n const position = file.getLineAndCharacterOfPosition(diagnostic.start);\n const filename = displayFilename(file.fileName || fallbackFilename);\n return {\n name: \"TypeScriptTranspileError\",\n message: `Line ${position.line + 1} of ${filename}: ${message}`,\n line: position.line + 1,\n column: position.character + 1,\n filename,\n };\n }\n return {\n name: \"TypeScriptTranspileError\",\n message,\n filename: displayFilename(fallbackFilename),\n };\n}\n\nfunction prepareExecutionTarget(execute: CodeExecutionOptions[\"execute\"]): PreparedExecutionTarget {\n return {\n fn: execute?.fn ?? \"default\",\n args: (execute?.args ?? []).map((arg) => encodeValue(arg)),\n };\n}\n\nfunction prepareBridge(\n options: CodeExecutionOptions,\n reports: unknown[],\n logs: CodeExecutionLog[],\n): PreparedBridge {\n const functions = new Map<string, BridgeFunction>();\n const globals: Record<string, unknown> = { ...(options.globals ?? {}) };\n\n if (!Object.prototype.hasOwnProperty.call(globals, \"console\")) {\n globals.console = createCapturingConsole(logs);\n }\n\n if (options.report) {\n globals.report = (value: unknown) => {\n reports.push(value);\n return options.report?.(value);\n };\n }\n\n const imports = options.imports ?? {};\n const values = {\n imports: prepareNamespaceRecord(imports, \"imports\", functions),\n globals: prepareValueRecord(globals, \"globals\", functions),\n };\n\n const importModules: Record<string, { js: string }> = {};\n for (const [specifier, namespace] of Object.entries(imports)) {\n importModules[specifier] = { js: buildImportModule(specifier, namespace, RUNTIME_MODULE_PLACEHOLDER) };\n }\n\n return {\n values,\n functions,\n globalNames: Object.keys(globals),\n importModules,\n reports,\n logs,\n };\n}\n\nfunction prepareNamespaceRecord(\n value: Record<string, Record<string, unknown>>,\n path: string,\n functions: Map<string, BridgeFunction>,\n): Record<string, Record<string, EncodedValue>> {\n const out: Record<string, Record<string, EncodedValue>> = {};\n for (const [key, namespace] of Object.entries(value)) {\n out[key] = prepareValueRecord(namespace, `${path}.${key}`, functions);\n }\n return out;\n}\n\nfunction prepareValueRecord(\n value: Record<string, unknown>,\n path: string,\n functions: Map<string, BridgeFunction>,\n): Record<string, EncodedValue> {\n const out: Record<string, EncodedValue> = {};\n for (const [key, item] of Object.entries(value)) {\n out[key] = prepareBridgeValue(item, `${path}.${key}`, functions);\n }\n return out;\n}\n\nfunction prepareBridgeValue(\n value: unknown,\n path: string,\n functions: Map<string, BridgeFunction>,\n): EncodedValue {\n if (typeof value === \"function\") {\n functions.set(path, value as BridgeFunction);\n return { __agentbuilderType: \"function\", id: path };\n }\n if (isThenable(value)) {\n const promiseId = `${path}.__promise`;\n functions.set(promiseId, async () => value);\n return { __agentbuilderType: \"promise\", id: promiseId };\n }\n if (Array.isArray(value)) {\n return value.map((item, index) => prepareBridgeValue(item, `${path}.${index}`, functions));\n }\n if (value && typeof value === \"object\") {\n if (value instanceof Date || value instanceof Map || value instanceof Set || ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n return encodeValue(value);\n }\n if (!isPlainObject(value)) {\n throw new TypeError(\"SerializationError: value is not transferable\");\n }\n const out: Record<string, EncodedValue> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n out[key] = prepareBridgeValue(item, `${path}.${key}`, functions);\n }\n return out;\n }\n return encodeValue(value);\n}\n\nfunction buildWorkerCode(params: {\n source: string;\n filename: string;\n modules: Record<string, string>;\n prepared: PreparedBridge;\n compatibilityDate: string;\n memoryLimitBytes?: number;\n bridgeBinding: CodeExecutionBridgeBinding;\n}): WorkerLoaderWorkerCode {\n const runtimeModule = \"__agentbuilder_runtime.js\";\n const userModule = \"__agentbuilder_user.js\";\n const entryModule = buildUserModule(params.source, params.prepared.globalNames, params.filename, `./${runtimeModule}`);\n const modules: Record<string, { js: string }> = {\n [MAIN_MODULE]: { js: buildMainModule(runtimeModule, userModule) },\n [runtimeModule]: { js: buildRuntimeModule() },\n [userModule]: entryModule,\n };\n for (const [specifier, source] of Object.entries(params.modules)) {\n modules[specifier] = {\n ...buildUserModule(\n source,\n params.prepared.globalNames,\n specifier,\n relativeModuleSpecifier(specifier, runtimeModule),\n ),\n };\n }\n for (const [specifier, module] of Object.entries(params.prepared.importModules)) {\n modules[specifier] = { js: module.js.replaceAll(RUNTIME_MODULE_PLACEHOLDER, runtimeModule) };\n }\n\n return {\n compatibilityDate: params.compatibilityDate,\n mainModule: MAIN_MODULE,\n modules,\n env: {\n __AGENTBUILDER_BRIDGE: params.bridgeBinding,\n },\n globalOutbound: null,\n };\n}\n\nfunction createSourceLineMaps(workerCode: WorkerLoaderWorkerCode): Record<string, SourceLineMap> {\n const maps: Record<string, SourceLineMap> = {};\n for (const [moduleName, module] of Object.entries(workerCode.modules)) {\n const js = typeof module === \"string\" ? module : module.js;\n const metadata = parseSourceLineMapMetadata(js);\n if (!metadata) continue;\n maps[moduleName] = metadata;\n maps[moduleName.replace(/^\\.\\//, \"\")] = metadata;\n maps[metadata.filename] = metadata;\n maps[metadata.filename.replace(/^\\//, \"\")] = metadata;\n }\n return maps;\n}\n\nfunction parseSourceLineMapMetadata(js: string): SourceLineMap | null {\n const match = js.match(/^\\/\\/# agentbuilderSourceMap=(.+)$/m);\n if (!match) return null;\n try {\n const metadata = JSON.parse(match[1]) as Partial<SourceLineMap>;\n if (typeof metadata.filename !== \"string\" || typeof metadata.lineOffset !== \"number\") {\n return null;\n }\n return {\n filename: metadata.filename,\n lineOffset: metadata.lineOffset,\n };\n } catch {\n return null;\n }\n}\n\nconst RUNTIME_MODULE_PLACEHOLDER = \"__AGENTBUILDER_RUNTIME_MODULE__\";\n\nfunction buildMainModule(runtimeModule: string, userModule: string): string {\n return `\nexport default {\n async fetch(request, env) {\n const startedAt = Date.now();\n const payload = await request.json().catch(() => ({}));\n globalThis.__AGENTBUILDER_BRIDGE = env.__AGENTBUILDER_BRIDGE;\n globalThis.__AGENTBUILDER_RUN_CODE = {\n threadId: payload.threadId,\n runId: payload.runId,\n values: payload.values,\n memoryLimitBytes: payload.memoryLimitBytes ?? null,\n };\n const execute = payload.execute ?? { fn: \"default\", args: [] };\n\n try {\n const userModule = await import(\"./${userModule}\");\n const { __encode, __decode, __getReports, __getLogs } = await import(\"./${runtimeModule}\");\n const fn = typeof execute.fn === \"string\" && execute.fn.length > 0 ? execute.fn : \"default\";\n const args = Array.isArray(execute.args) ? execute.args.map((arg) => __decode(arg)) : [];\n if (!Object.prototype.hasOwnProperty.call(userModule, fn)) {\n throw new Error('Sandboxed code entry module does not provide an export named \"' + fn + '\".');\n }\n let value = userModule[fn];\n if (typeof value === \"function\") {\n value = value(...args);\n } else if (args.length > 0) {\n throw new Error('Sandboxed code export \"' + fn + '\" is not a function and cannot receive arguments.');\n }\n while (value && typeof value.then === \"function\") {\n value = await value;\n }\n return Response.json({\n ok: true,\n result: __encode(value),\n reports: __getReports(),\n logs: __getLogs(),\n durationMs: Date.now() - startedAt,\n });\n } catch (error) {\n const { __toError, __getReports, __getLogs, __isLikelyLinkError, __isMemoryError } = await import(\"./${runtimeModule}\");\n const serialized = __toError(error);\n return Response.json({\n ok: false,\n status: __isMemoryError(serialized) ? \"memory\" : (__isLikelyLinkError(serialized) ? \"link_error\" : \"error\"),\n error: serialized,\n reports: __getReports(),\n logs: __getLogs(),\n durationMs: Date.now() - startedAt,\n });\n }\n },\n};\n`;\n}\n\nfunction buildRuntimeModule(): string {\n return `\nconst forbiddenNames = [\n \"process\", \"global\", \"window\", \"self\", \"document\", \"require\", \"Deno\", \"Bun\",\n \"fetch\", \"Request\", \"Response\", \"URL\", \"URLSearchParams\", \"WebSocket\",\n \"WebAssembly\", \"crypto\", \"setTimeout\", \"setInterval\", \"setImmediate\",\n \"performance\", \"atob\", \"btoa\", \"TextEncoder\", \"TextDecoder\", \"Atomics\",\n \"SharedArrayBuffer\"\n];\n\nconst intrinsicNames = [\n \"Object\", \"Array\", \"Promise\", \"Math\", \"JSON\", \"Map\", \"Set\", \"Date\", \"RegExp\",\n \"Error\", \"TypeError\", \"SyntaxError\", \"RangeError\", \"ReferenceError\", \"BigInt\",\n \"Symbol\", \"Reflect\", \"Proxy\", \"ArrayBuffer\", \"DataView\", \"Int8Array\",\n \"Uint8Array\", \"Uint8ClampedArray\", \"Int16Array\", \"Uint16Array\", \"Int32Array\",\n \"Uint32Array\", \"Float32Array\", \"Float64Array\", \"BigInt64Array\", \"BigUint64Array\",\n \"structuredClone\", \"undefined\", \"NaN\", \"Infinity\"\n];\n\nconst localReports = [];\nconst localLogs = [];\n\nexport function __getGlobal(name) {\n const value = globalThis.__AGENTBUILDER_RUN_CODE?.values?.globals?.[name];\n return __decode(value);\n}\n\nexport function __getImport(specifier, name) {\n const value = globalThis.__AGENTBUILDER_RUN_CODE?.values?.imports?.[specifier]?.[name];\n return __decode(value);\n}\n\nexport function __sandboxGlobalThis() {\n const sandbox = Object.create(null);\n for (const name of intrinsicNames) {\n if (name === \"undefined\") {\n Object.defineProperty(sandbox, name, { value: undefined, enumerable: false });\n } else if (name in globalThis && !forbiddenNames.includes(name)) {\n Object.defineProperty(sandbox, name, {\n value: globalThis[name],\n enumerable: false,\n configurable: false,\n writable: false,\n });\n }\n }\n Object.defineProperty(sandbox, \"globalThis\", {\n value: sandbox,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n for (const name of forbiddenNames) {\n Object.defineProperty(sandbox, name, {\n value: undefined,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n }\n return sandbox;\n}\n\nexport function __blockedFunction() {\n throw new EvalError(\"Dynamic code loading is disabled in runCode\");\n}\n\nexport function __getReports() {\n return localReports.slice();\n}\n\nexport function __getLogs() {\n return localLogs.slice();\n}\n\nasync function __callBridge(functionId, args) {\n const payload = await globalThis.__AGENTBUILDER_BRIDGE.call(\n globalThis.__AGENTBUILDER_RUN_CODE?.threadId,\n globalThis.__AGENTBUILDER_RUN_CODE?.runId,\n functionId,\n args.map((arg) => __encode(arg)),\n );\n if (!payload.ok) {\n const error = new Error(payload.error?.message || \"Bridged function failed\");\n error.name = payload.error?.name || \"BridgeError\";\n throw error;\n }\n return __decode(payload.value);\n}\n\nfunction __makeFunction(id) {\n return (...args) => __callBridge(id, args);\n}\n\nexport function __decode(value) {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n switch (value.__agentbuilderType) {\n case \"undefined\":\n return undefined;\n case \"bigint\":\n return BigInt(value.value);\n case \"date\":\n return new Date(value.value);\n case \"map\":\n return new Map(value.entries.map(([k, v]) => [__decode(k), __decode(v)]));\n case \"set\":\n return new Set(value.values.map((item) => __decode(item)));\n case \"arrayBuffer\":\n return __base64ToBytes(value.data).buffer;\n case \"typedArray\": {\n const bytes = __base64ToBytes(value.data);\n const ctor = globalThis[value.ctor] || Uint8Array;\n return new ctor(bytes.buffer);\n }\n case \"function\":\n return __makeFunction(value.id);\n case \"promise\":\n return __callBridge(value.id, []);\n case \"object\": {\n const out = {};\n for (const [key, item] of value.entries) {\n out[key] = __decode(item);\n }\n return out;\n }\n default:\n if (!Object.prototype.hasOwnProperty.call(value, \"__agentbuilderType\")) {\n const out = {};\n for (const [key, item] of Object.entries(value)) {\n out[key] = __decode(item);\n }\n return out;\n }\n break;\n }\n }\n if (Array.isArray(value)) {\n return value.map((item) => __decode(item));\n }\n return value;\n}\n\nexport function __encode(value) {\n if (value === undefined) {\n return { __agentbuilderType: \"undefined\" };\n }\n if (typeof value === \"function\" || typeof value === \"symbol\") {\n throw new TypeError(\"SerializationError: value is not transferable\");\n }\n if (typeof value === \"bigint\") {\n return { __agentbuilderType: \"bigint\", value: value.toString() };\n }\n if (value instanceof Date) {\n return { __agentbuilderType: \"date\", value: value.toISOString() };\n }\n if (value instanceof Map) {\n return { __agentbuilderType: \"map\", entries: Array.from(value.entries()).map(([k, v]) => [__encode(k), __encode(v)]) };\n }\n if (value instanceof Set) {\n return { __agentbuilderType: \"set\", values: Array.from(value.values()).map((item) => __encode(item)) };\n }\n if (value instanceof ArrayBuffer) {\n return { __agentbuilderType: \"arrayBuffer\", data: __bytesToBase64(new Uint8Array(value)) };\n }\n if (ArrayBuffer.isView(value)) {\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n return { __agentbuilderType: \"typedArray\", ctor: value.constructor.name, data: __bytesToBase64(bytes) };\n }\n if (Array.isArray(value)) {\n return value.map((item) => __encode(item));\n }\n if (value && typeof value === \"object\") {\n if (!__isPlainObject(value)) {\n throw new TypeError(\"SerializationError: value is not transferable\");\n }\n return { __agentbuilderType: \"object\", entries: Object.entries(value).map(([key, item]) => [key, __encode(item)]) };\n }\n return value;\n}\n\nexport function __toError(error) {\n if (!error || typeof error !== \"object\") {\n return { name: \"Error\", message: String(error) };\n }\n return {\n name: typeof error.name === \"string\" ? error.name : \"Error\",\n message: typeof error.message === \"string\" ? error.message : String(error),\n stack: typeof error.stack === \"string\" ? __sanitizeStack(error.stack) : undefined,\n line: typeof error.lineNumber === \"number\" ? error.lineNumber : undefined,\n column: typeof error.columnNumber === \"number\" ? error.columnNumber : undefined,\n };\n}\n\nexport function __isLikelyLinkError(error) {\n return error.name === \"SyntaxError\" ||\n /Failed to resolve module specifier|Module not found|does not provide an export|Cannot find module|Unexpected token/.test(error.message || \"\");\n}\n\nexport function __isMemoryError(error) {\n return /memory|heap|allocation/i.test((error && error.message) || \"\");\n}\n\nfunction __sanitizeStack(stack) {\n return stack\n .split(\"\\\\n\")\n .filter((line) => !line.includes(\"__agentbuilder_main\") && !line.includes(\"__agentbuilder_runtime\"))\n .join(\"\\\\n\");\n}\n\nfunction __bytesToBase64(bytes) {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary);\n}\n\nfunction __base64ToBytes(data) {\n const binary = atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\nfunction __isPlainObject(value) {\n if (!value || typeof value !== \"object\") return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n`;\n}\n\nfunction buildUserModule(\n source: string,\n globalNames: string[],\n filename: string,\n runtimeSpecifier: string,\n): { js: string } {\n const globalNameSet = new Set(globalNames);\n const localBindingNameSet = extractLocalBindingNames(source);\n const declarations = globalNames\n .filter(\n (name) =>\n isValidIdentifier(name) &&\n name !== \"globalThis\" &&\n name !== \"Function\" &&\n name !== \"AsyncFunction\" &&\n name !== \"GeneratorFunction\",\n )\n .map((name) => `const ${name} = __getGlobal(${JSON.stringify(name)});`)\n .join(\"\\n\");\n const forbiddenDeclarations = FORBIDDEN_GLOBAL_IDENTIFIERS\n .filter((name) => !globalNameSet.has(name) && !localBindingNameSet.has(name) && isValidIdentifier(name))\n .map((name) => `const ${name} = undefined;`)\n .join(\"\\n\");\n const sandboxUrl = `sandbox:${filename}`;\n const rewrittenSource = source.replace(/\\bimport\\.meta\\.url\\b/g, JSON.stringify(sandboxUrl));\n const prefix = [\n `import { __getGlobal, __sandboxGlobalThis, __blockedFunction } from ${JSON.stringify(runtimeSpecifier)};`,\n \"const globalThis = __sandboxGlobalThis();\",\n \"const Function = __blockedFunction;\",\n \"const AsyncFunction = __blockedFunction;\",\n \"const GeneratorFunction = __blockedFunction;\",\n declarations,\n forbiddenDeclarations,\n ].filter(Boolean).join(\"\\n\");\n const lineOffset = countLines(prefix);\n const metadata = JSON.stringify({ filename, lineOffset });\n\n return {\n js: `${prefix}\n${rewrittenSource}\n//# agentbuilderSourceMap=${metadata}\n//# sourceURL=sandbox:${filename.replace(/\\s+/g, \"_\")}\n`,\n };\n}\n\nfunction buildImportModule(\n specifier: string,\n namespace: Record<string, unknown>,\n runtimeModule: string,\n): string {\n if (specifier === \"fetch\" && Object.prototype.hasOwnProperty.call(namespace, \"__fetch\")) {\n return buildFetchImportModule(runtimeModule);\n }\n\n const lines = [`import { __getImport } from \"./${runtimeModule}\";`];\n for (const key of Object.keys(namespace)) {\n if (key === \"default\") {\n continue;\n }\n if (isValidIdentifier(key)) {\n lines.push(`export const ${key} = __getImport(${JSON.stringify(specifier)}, ${JSON.stringify(key)});`);\n }\n }\n if (Object.prototype.hasOwnProperty.call(namespace, \"default\")) {\n lines.push(`export default __getImport(${JSON.stringify(specifier)}, \"default\");`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildFetchImportModule(runtimeModule: string): string {\n return `\nimport { __getImport } from \"./${runtimeModule}\";\n\nconst __fetchBridge = __getImport(\"fetch\", \"__fetch\");\n\nclass HeadersBridge {\n constructor(headers = {}) {\n this._entries = [];\n if (Array.isArray(headers)) {\n for (const entry of headers) {\n if (Array.isArray(entry) && entry.length >= 2) this.append(entry[0], entry[1]);\n }\n } else if (headers && typeof headers === \"object\") {\n for (const [name, value] of Object.entries(headers)) this.append(name, value);\n }\n }\n\n append(name, value) {\n this._entries.push([String(name).toLowerCase(), String(value)]);\n }\n\n get(name) {\n const needle = String(name).toLowerCase();\n const values = this._entries.filter(([key]) => key === needle).map(([, value]) => value);\n return values.length ? values.join(\", \") : null;\n }\n\n has(name) {\n const needle = String(name).toLowerCase();\n return this._entries.some(([key]) => key === needle);\n }\n\n entries() {\n return this._entries[Symbol.iterator]();\n }\n\n keys() {\n return this._entries.map(([key]) => key)[Symbol.iterator]();\n }\n\n values() {\n return this._entries.map(([, value]) => value)[Symbol.iterator]();\n }\n\n forEach(callback, thisArg) {\n for (const [key, value] of this._entries) callback.call(thisArg, value, key, this);\n }\n\n [Symbol.iterator]() {\n return this.entries();\n }\n\n toJSON() {\n return Object.fromEntries(this._entries);\n }\n}\n\nclass FetchResponseBridge {\n constructor(payload) {\n this.ok = Boolean(payload?.ok);\n this.status = Number(payload?.status ?? 0);\n this.statusText = String(payload?.statusText ?? \"\");\n this.url = String(payload?.url ?? \"\");\n this.redirected = Boolean(payload?.redirected);\n this.type = String(payload?.type ?? \"basic\");\n this.headers = new HeadersBridge(payload?.headers ?? {});\n this.bodyUsed = false;\n const body = payload?.body;\n this._body = body instanceof ArrayBuffer ? body.slice(0) : new ArrayBuffer(0);\n }\n\n async arrayBuffer() {\n this.bodyUsed = true;\n return this._body.slice(0);\n }\n\n async text() {\n const decoder = new TextDecoder();\n return decoder.decode(await this.arrayBuffer());\n }\n\n async json() {\n return JSON.parse(await this.text());\n }\n\n clone() {\n return new FetchResponseBridge({\n ok: this.ok,\n status: this.status,\n statusText: this.statusText,\n url: this.url,\n redirected: this.redirected,\n type: this.type,\n headers: this.headers.toJSON(),\n body: this._body.slice(0),\n });\n }\n}\n\nfunction normalizeRequestInput(input) {\n if (typeof input === \"string\") return input;\n if (input && typeof input === \"object\" && typeof input.url === \"string\") return input.url;\n return String(input);\n}\n\nexport async function fetch(input, init) {\n return new FetchResponseBridge(await __fetchBridge(normalizeRequestInput(input), init ?? {}));\n}\n\nexport default fetch;\n`;\n}\n\nfunction extractLocalBindingNames(source: string): Set<string> {\n const names = new Set<string>();\n const importPattern = /\\bimport\\s+(?!\\s*[\"'])([^'\";]+?)\\s+from\\s+[\"'][^\"']+[\"']/g;\n let match: RegExpExecArray | null;\n while ((match = importPattern.exec(source))) {\n addImportedBindingNames(match[1].trim(), names);\n }\n\n const declarationPattern = /\\b(?:class|function|const|let|var)\\s+([$A-Z_a-z][$\\w]*)/g;\n while ((match = declarationPattern.exec(source))) {\n names.add(match[1]);\n }\n\n return names;\n}\n\nfunction addImportedBindingNames(clause: string, names: Set<string>): void {\n const normalized = clause.replace(/^type\\s+/, \"\").trim();\n const namespaceMatch = normalized.match(/^\\*\\s+as\\s+([$A-Z_a-z][$\\w]*)$/);\n if (namespaceMatch) {\n names.add(namespaceMatch[1]);\n return;\n }\n\n const namedStart = normalized.indexOf(\"{\");\n if (namedStart > 0) {\n const defaultName = normalized.slice(0, namedStart).replace(/,$/, \"\").trim();\n if (isValidIdentifier(defaultName)) names.add(defaultName);\n } else if (namedStart !== 0) {\n const defaultMatch = normalized.match(/^([$A-Z_a-z][$\\w]*)/);\n if (defaultMatch) names.add(defaultMatch[1]);\n }\n\n const namedMatch = normalized.match(/\\{([^}]*)\\}/);\n if (!namedMatch) return;\n\n for (const part of namedMatch[1].split(\",\")) {\n const item = part.trim().replace(/^type\\s+/, \"\");\n if (!item) continue;\n const aliasMatch = item.match(/\\bas\\s+([$A-Z_a-z][$\\w]*)$/);\n const localName = aliasMatch?.[1] ?? item.split(/\\s+/)[0];\n if (isValidIdentifier(localName)) names.add(localName);\n }\n}\n\nfunction getCodeExecutionBridgeBinding(threadInstance: ThreadInstance): CodeExecutionBridgeBinding | null {\n const ctx = (threadInstance as unknown as { ctx?: DurableObjectStateWithExports }).ctx;\n const factory = ctx?.exports?.CodeExecutionBridge;\n if (typeof factory !== \"function\") {\n return null;\n }\n return factory({ props: {} });\n}\n\nfunction createCapturingConsole(logs: CodeExecutionLog[]): Record<string, BridgeFunction> {\n const capture = (level: CodeExecutionLog[\"level\"]) => (...args: unknown[]) => {\n logs.push({ level, args: structuredCloneSafe(args), timestamp: Date.now() });\n };\n return {\n log: capture(\"log\"),\n info: capture(\"info\"),\n warn: capture(\"warn\"),\n error: capture(\"error\"),\n debug: capture(\"debug\"),\n };\n}\n\nfunction terminatedResult(\n reason: string,\n reports: unknown[],\n logs: CodeExecutionLog[],\n startedAt: number,\n): CodeExecutionResult {\n return {\n status: \"terminated\",\n reports,\n logs,\n durationMs: Date.now() - startedAt,\n error: {\n name: \"Terminated\",\n message: reason,\n },\n };\n}\n\nfunction encodeValue(value: unknown): EncodedValue {\n if (value === undefined) {\n return { __agentbuilderType: \"undefined\" };\n }\n if (typeof value === \"function\" || typeof value === \"symbol\") {\n throw new TypeError(\"SerializationError: value is not transferable\");\n }\n if (typeof value === \"bigint\") {\n return { __agentbuilderType: \"bigint\", value: value.toString() };\n }\n if (value instanceof Date) {\n return { __agentbuilderType: \"date\", value: value.toISOString() };\n }\n if (value instanceof Map) {\n return {\n __agentbuilderType: \"map\",\n entries: Array.from(value.entries()).map(([key, item]) => [encodeValue(key), encodeValue(item)]),\n };\n }\n if (value instanceof Set) {\n return {\n __agentbuilderType: \"set\",\n values: Array.from(value.values()).map((item) => encodeValue(item)),\n };\n }\n if (value instanceof ArrayBuffer) {\n return {\n __agentbuilderType: \"arrayBuffer\",\n data: bytesToBase64(new Uint8Array(value)),\n };\n }\n if (ArrayBuffer.isView(value)) {\n return {\n __agentbuilderType: \"typedArray\",\n ctor: value.constructor.name,\n data: bytesToBase64(new Uint8Array(value.buffer, value.byteOffset, value.byteLength)),\n };\n }\n if (Array.isArray(value)) {\n return value.map((item) => encodeValue(item));\n }\n if (value && typeof value === \"object\") {\n if (!isPlainObject(value)) {\n throw new TypeError(\"SerializationError: value is not transferable\");\n }\n const out: Record<string, EncodedValue> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n out[key] = encodeValue(item);\n }\n return { __agentbuilderType: \"object\", entries: Object.entries(out) };\n }\n return value as EncodedValue;\n}\n\nfunction decodeValue(value: EncodedValue): unknown {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const marker = (value as { __agentbuilderType?: string }).__agentbuilderType;\n switch (marker) {\n case \"undefined\":\n return undefined;\n case \"bigint\":\n return BigInt((value as { value: string }).value);\n case \"date\":\n return new Date((value as { value: string }).value);\n case \"map\":\n return new Map(\n ((value as { entries: [EncodedValue, EncodedValue][] }).entries ?? []).map(([key, item]) => [\n decodeValue(key),\n decodeValue(item),\n ]),\n );\n case \"set\":\n return new Set(((value as { values: EncodedValue[] }).values ?? []).map((item) => decodeValue(item)));\n case \"arrayBuffer\":\n return base64ToBytes((value as { data: string }).data).buffer;\n case \"typedArray\": {\n const bytes = base64ToBytes((value as { data: string }).data);\n const ctorName = (value as { ctor?: string }).ctor ?? \"Uint8Array\";\n const ctor = (globalThis as unknown as Record<string, typeof Uint8Array>)[ctorName] ?? Uint8Array;\n return new ctor(bytes.buffer);\n }\n case \"object\": {\n const out: Record<string, unknown> = {};\n for (const [key, item] of (value as { entries: [string, EncodedValue][] }).entries ?? []) {\n out[key] = decodeValue(item);\n }\n return out;\n }\n default:\n if (!Object.prototype.hasOwnProperty.call(value, \"__agentbuilderType\")) {\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, EncodedValue>)) {\n out[key] = decodeValue(item);\n }\n return out;\n }\n break;\n }\n }\n if (Array.isArray(value)) {\n return value.map((item) => decodeValue(item));\n }\n return value;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(data: string): Uint8Array {\n const binary = atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction toBridgeError(error: unknown): Error {\n const normalized = toCodeExecutionError(error);\n const bridgeError = new Error(normalized.message);\n bridgeError.name = normalized.name;\n return bridgeError;\n}\n\nfunction toCodeExecutionError(error: unknown): CodeExecutionError {\n if (!error || typeof error !== \"object\") {\n return { name: \"Error\", message: String(error) };\n }\n const maybe = error as {\n name?: unknown;\n message?: unknown;\n stack?: unknown;\n lineNumber?: unknown;\n columnNumber?: unknown;\n line?: unknown;\n column?: unknown;\n };\n return {\n name: typeof maybe.name === \"string\" ? maybe.name : \"Error\",\n message: typeof maybe.message === \"string\" ? maybe.message : String(error),\n stack: typeof maybe.stack === \"string\" ? sanitizeStack(maybe.stack) : undefined,\n line: typeof maybe.line === \"number\" ? maybe.line : typeof maybe.lineNumber === \"number\" ? maybe.lineNumber : undefined,\n column:\n typeof maybe.column === \"number\"\n ? maybe.column\n : typeof maybe.columnNumber === \"number\"\n ? maybe.columnNumber\n : undefined,\n };\n}\n\nfunction mapCodeExecutionError(\n error: CodeExecutionError,\n sourceLineMaps: Record<string, SourceLineMap>,\n): CodeExecutionError {\n const generatedLocation = findGeneratedLocation(error);\n if (!generatedLocation) return error;\n\n const sourceMap = sourceLineMaps[generatedLocation.moduleName] ??\n sourceLineMaps[generatedLocation.moduleName.replace(/^\\.\\//, \"\")];\n if (!sourceMap) return error;\n\n const sourceLine = generatedLocation.line - sourceMap.lineOffset;\n if (sourceLine < 1) return error;\n\n const filename = displayFilename(sourceMap.filename);\n const location = `Line ${sourceLine} of ${filename}`;\n return {\n ...error,\n message: prefixErrorLocation(error.message, location),\n stack: error.stack ? rewriteGeneratedStack(error.stack, sourceLineMaps) : error.stack,\n line: sourceLine,\n column: generatedLocation.column,\n filename,\n };\n}\n\nfunction findGeneratedLocation(error: CodeExecutionError): {\n moduleName: string;\n line: number;\n column: number;\n} | null {\n const text = [error.message, error.stack].filter(Boolean).join(\"\\n\");\n const pattern = /(?:^|[\\s(])(?:sandbox:)?((?:\\.\\/|\\/)?[^\\s():]+):(\\d+):(\\d+)/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(text))) {\n const moduleName = match[1];\n if (moduleName.includes(\"__agentbuilder_main\") || moduleName.includes(\"__agentbuilder_runtime\")) {\n continue;\n }\n return {\n moduleName,\n line: Number(match[2]),\n column: Number(match[3]),\n };\n }\n return null;\n}\n\nfunction prefixErrorLocation(message: string, location: string): string {\n const compactMessage = message.replace(/\\s+at\\s+(?:sandbox:)?[^\\s():]+:\\d+:\\d+.*$/s, \"\").trim();\n if (compactMessage.startsWith(location)) return compactMessage;\n return `${location}: ${compactMessage || message}`;\n}\n\nfunction rewriteGeneratedStack(\n stack: string,\n sourceLineMaps: Record<string, SourceLineMap>,\n): string {\n return stack.replace(\n /(?:sandbox:)?((?:\\.\\/|\\/)?[^\\s():]+):(\\d+):(\\d+)/g,\n (match, moduleName: string, line: string, column: string) => {\n const sourceMap = sourceLineMaps[moduleName] ?? sourceLineMaps[moduleName.replace(/^\\.\\//, \"\")];\n if (!sourceMap) return match;\n const sourceLine = Number(line) - sourceMap.lineOffset;\n if (sourceLine < 1) return match;\n return `${displayFilename(sourceMap.filename)}:${sourceLine}:${column}`;\n },\n );\n}\n\nfunction displayFilename(filename: string): string {\n return filename.replace(/^\\//, \"\");\n}\n\nfunction countLines(value: string): number {\n return value ? value.split(\"\\n\").length : 0;\n}\n\nfunction sanitizeStack(stack: string): string {\n return stack\n .split(\"\\n\")\n .filter((line) => !line.includes(\"__agentbuilder_main\") && !line.includes(\"__agentbuilder_runtime\"))\n .join(\"\\n\");\n}\n\nfunction isLikelyLinkError(error: CodeExecutionError): boolean {\n return (\n error.name === \"SyntaxError\" ||\n error.name === \"TypeScriptTranspileError\" ||\n /Failed to resolve module specifier|Module not found|does not provide an export|Cannot find module|Unexpected token/.test(\n error.message,\n )\n );\n}\n\nfunction isMemoryError(error: CodeExecutionError): boolean {\n return /memory|heap|allocation/i.test(error.message);\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n (((error as { name?: unknown }).name === \"AbortError\") ||\n /aborted|abort/i.test(String((error as { message?: unknown }).message ?? \"\")))\n );\n}\n\nfunction mergeReports(target: unknown[], incoming: unknown[]): void {\n for (const item of incoming) {\n if (!target.includes(item)) {\n target.push(item);\n }\n }\n}\n\nfunction mergeLogs(target: CodeExecutionLog[], incoming: CodeExecutionLog[]): void {\n for (const item of incoming) {\n if (!target.includes(item)) {\n target.push(item);\n }\n }\n}\n\nfunction combineAbortSignals(...signals: Array<AbortSignal | undefined>): AbortSignal {\n const controller = new AbortController();\n for (const signal of signals) {\n if (!signal) {\n continue;\n }\n if (signal.aborted) {\n controller.abort(signal.reason);\n break;\n }\n signal.addEventListener(\"abort\", () => controller.abort(signal.reason), { once: true });\n }\n return controller.signal;\n}\n\nfunction structuredCloneSafe<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return JSON.parse(JSON.stringify(value)) as T;\n }\n}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return !!value && (typeof value === \"object\" || typeof value === \"function\") && typeof (value as { then?: unknown }).then === \"function\";\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isValidIdentifier(value: string): boolean {\n return /^[$A-Z_a-z][$\\w]*$/.test(value) && value !== \"eval\" && value !== \"arguments\";\n}\n\nfunction isBareSpecifier(value: string): boolean {\n return (\n !!value &&\n !value.startsWith(\"./\") &&\n !value.startsWith(\"../\") &&\n !value.startsWith(\"/\") &&\n !/^[A-Z_a-z][A-Z_a-z\\d+\\-.]*:/.test(value)\n );\n}\n\nfunction isRelativeSpecifier(value: string): boolean {\n return value.startsWith(\"./\") || value.startsWith(\"../\");\n}\n\nfunction normalizeRelativeModuleSpecifier(specifier: string): string {\n return specifier.replace(/^\\.\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction normalizeEntryModulePath(filename: string): string {\n if (!filename || filename === DEFAULT_FILENAME || filename.startsWith(\"<\")) {\n return \"\";\n }\n try {\n return normalizeVirtualModulePath(\"\", `./${filename.replace(/^\\/+/, \"\")}`);\n } catch {\n return \"\";\n }\n}\n\nfunction normalizeVirtualModulePath(basePath: string, specifier: string): string {\n const parts = basePath ? basePath.split(\"/\").filter(Boolean) : [];\n for (const part of specifier.replace(/\\\\/g, \"/\").split(\"/\")) {\n if (!part || part === \".\") continue;\n if (part === \"..\") {\n if (parts.length === 0) {\n throw new Error(`runCode module path cannot escape the module graph: ${specifier}`);\n }\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n const normalized = parts.join(\"/\");\n if (!normalized) {\n throw new Error(`runCode module path cannot resolve to the module graph root: ${specifier}`);\n }\n return normalized;\n}\n\nfunction dirnameModulePath(path: string): string {\n const index = path.lastIndexOf(\"/\");\n return index <= 0 ? \"\" : path.slice(0, index);\n}\n\nfunction hasModuleExtension(path: string): boolean {\n return /\\.[A-Za-z0-9]+$/.test(path);\n}\n\nfunction resolveGraphModuleSpecifier(\n fromPath: string,\n specifier: string,\n modulePaths: Set<string>,\n): string | null {\n const base = normalizeVirtualModulePath(dirnameModulePath(fromPath), specifier);\n const candidates = hasModuleExtension(base)\n ? [base]\n : [\n base,\n `${base}.ts`,\n `${base}.tsx`,\n `${base}.js`,\n `${base}.mjs`,\n `${base}.json`,\n `${base}/index.ts`,\n `${base}/index.tsx`,\n `${base}/index.js`,\n ];\n return candidates.find((candidate) => modulePaths.has(candidate)) ?? null;\n}\n\nfunction rewriteGraphRelativeSpecifiers(\n source: string,\n resolveFromPath: string,\n emitFromPath: string,\n modulePaths: Set<string>,\n): string {\n const rewrite = (specifier: string) => {\n try {\n const targetPath = resolveGraphModuleSpecifier(resolveFromPath, specifier, modulePaths);\n return targetPath ? relativeModuleSpecifier(emitFromPath, targetPath) : specifier;\n } catch {\n return specifier;\n }\n };\n\n return source\n .replace(\n /(\\b(?:import|export)\\s+(?:[^'\"]*?\\s+from\\s*)?[\"'])(\\.{1,2}\\/[^\"']+)([\"'])/g,\n (_match, prefix, specifier, suffix) => `${prefix}${rewrite(specifier)}${suffix}`,\n )\n .replace(\n /(\\bimport\\s*\\(\\s*[\"'])(\\.{1,2}\\/[^\"']+)([\"']\\s*\\))/g,\n (_match, prefix, specifier, suffix) => `${prefix}${rewrite(specifier)}${suffix}`,\n );\n}\n\nfunction relativeModuleSpecifier(fromModuleName: string, targetModuleName: string): string {\n const fromParts = fromModuleName ? fromModuleName.split(\"/\").slice(0, -1) : [];\n const targetParts = targetModuleName.split(\"/\");\n while (fromParts.length && targetParts.length && fromParts[0] === targetParts[0]) {\n fromParts.shift();\n targetParts.shift();\n }\n const parts = [...fromParts.map(() => \"..\"), ...targetParts];\n const specifier = parts.join(\"/\");\n return specifier.startsWith(\".\") ? specifier : `./${specifier}`;\n}\n\nfunction createWorkerId(params: {\n source: string;\n filename: string;\n modules: Record<string, string>;\n prepared: PreparedBridge;\n compatibilityDate: string;\n memoryLimitBytes?: number;\n}): string {\n const importShape = Object.fromEntries(\n Object.entries(params.prepared.values.imports)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([specifier, namespace]) => [\n specifier,\n Object.keys(namespace).sort(),\n ]),\n );\n const hashInput = JSON.stringify({\n runtimeVersion: CODE_EXECUTION_RUNTIME_VERSION,\n source: params.source,\n filename: params.filename,\n modules: Object.fromEntries(Object.entries(params.modules).sort(([a], [b]) => a.localeCompare(b))),\n importShape,\n globalNames: params.prepared.globalNames.slice().sort(),\n compatibilityDate: params.compatibilityDate,\n memoryLimitBytes: params.memoryLimitBytes ?? null,\n });\n return `agentbuilder-run-code:${simpleHash(hashInput)}`;\n}\n\nfunction simpleHash(input: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(36);\n}\n\nfunction stripTypeScriptTypes(source: string): string {\n let output = source;\n\n output = output.replace(/^\\s*import\\s+type\\s+[^;]+;?\\s*$/gm, \"\");\n output = removeTypeBlocks(output, \"interface\");\n output = removeTypeBlocks(output, \"type\");\n\n output = output.replace(/\\s+as\\s+const\\b/g, \"\");\n output = output.replace(/\\s+as\\s+[$A-Z_a-z][^,;\\)\\]\\}\\n]*/g, \"\");\n output = output.replace(/\\s+satisfies\\s+[$A-Z_a-z][^,;\\)\\]\\}\\n]*/g, \"\");\n\n output = stripParameterTypeAnnotations(output);\n output = output.replace(/(\\b(?:const|let|var)\\s+[$A-Z_a-z][\\w$]*\\??)\\s*:\\s*[^=;\\n]+(?=\\s*=|\\s*;|\\s*\\n)/g, \"$1\");\n output = output.replace(/(\\)\\s*):\\s*[^=\\{;\\n]+(?=\\s*\\{|\\s*=>)/g, \"$1\");\n output = output.replace(/(<[A-Z_a-z][^>]*>)(?=\\s*\\()/g, \"\");\n\n return output;\n}\n\nfunction stripParameterTypeAnnotations(source: string): string {\n let output = \"\";\n let cursor = 0;\n\n while (cursor < source.length) {\n const open = source.indexOf(\"(\", cursor);\n if (open < 0) {\n output += source.slice(cursor);\n break;\n }\n\n const close = findMatchingParen(source, open);\n if (close < 0) {\n output += source.slice(cursor);\n break;\n }\n\n output += source.slice(cursor, open + 1);\n const params = source.slice(open + 1, close);\n output += isLikelyParameterList(source, open, close)\n ? stripParameterListTypes(params)\n : params;\n cursor = close;\n }\n\n return output;\n}\n\nfunction isLikelyParameterList(source: string, open: number, close: number): boolean {\n const before = source.slice(Math.max(0, open - 100), open);\n if (/\\bfunction(?:\\s+[$A-Z_a-z][$\\w]*)?\\s*$/.test(before)) {\n return true;\n }\n\n const after = source.slice(close + 1, close + 20);\n return /^\\s*=>/.test(after);\n}\n\nfunction stripParameterListTypes(params: string): string {\n const segments = splitTopLevel(params, \",\");\n return segments.map(stripParameterSegmentType).join(\",\");\n}\n\nfunction stripParameterSegmentType(segment: string): string {\n const equals = findTopLevelChar(segment, \"=\");\n const head = equals >= 0 ? segment.slice(0, equals) : segment;\n const tail = equals >= 0 ? segment.slice(equals) : \"\";\n const colon = findTopLevelChar(head, \":\");\n const withoutType = colon >= 0 ? head.slice(0, colon) : head;\n return withoutType.replace(/(\\.\\.\\.\\s*)?([$A-Z_a-z][\\w$]*)\\?\\s*$/u, \"$1$2\") + tail;\n}\n\nfunction findTopLevelChar(source: string, needle: string): number {\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < source.length; index++) {\n const char = source[index];\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quote) {\n quote = null;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n continue;\n }\n if (char === \"{\") braceDepth++;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (char === \"[\") bracketDepth++;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"(\") parenDepth++;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === needle && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction splitTopLevel(source: string, delimiter: string): string[] {\n const segments: string[] = [];\n let start = 0;\n let braceDepth = 0;\n let bracketDepth = 0;\n let parenDepth = 0;\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = 0; index < source.length; index++) {\n const char = source[index];\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quote) {\n quote = null;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n continue;\n }\n if (char === \"{\") braceDepth++;\n else if (char === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n else if (char === \"[\") bracketDepth++;\n else if (char === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (char === \"(\") parenDepth++;\n else if (char === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (char === delimiter && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {\n segments.push(source.slice(start, index));\n start = index + 1;\n }\n }\n\n segments.push(source.slice(start));\n return segments;\n}\n\nfunction findMatchingParen(source: string, open: number): number {\n let depth = 0;\n let quote: string | null = null;\n let escaped = false;\n\n for (let index = open; index < source.length; index++) {\n const char = source[index];\n if (quote) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quote) {\n quote = null;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n continue;\n }\n if (char === \"(\") depth++;\n if (char === \")\") {\n depth--;\n if (depth === 0) return index;\n }\n }\n\n return -1;\n}\n\nfunction removeTypeBlocks(source: string, keyword: \"interface\" | \"type\"): string {\n const pattern = new RegExp(`(^|\\\\n)\\\\s*(export\\\\s+)?${keyword}\\\\s+[$A-Z_a-z][\\\\w$]*`, \"g\");\n let result = \"\";\n let cursor = 0;\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(source))) {\n const start = match.index + (match[1] ? 1 : 0);\n result += source.slice(cursor, start);\n\n let index = pattern.lastIndex;\n if (keyword === \"type\") {\n const semicolon = source.indexOf(\";\", index);\n const newline = source.indexOf(\"\\n\", index);\n const end = semicolon >= 0 ? semicolon + 1 : newline >= 0 ? newline : source.length;\n cursor = end;\n pattern.lastIndex = end;\n continue;\n }\n\n const brace = source.indexOf(\"{\", index);\n if (brace < 0) {\n cursor = index;\n continue;\n }\n let depth = 0;\n let end = brace;\n for (; end < source.length; end++) {\n if (source[end] === \"{\") depth++;\n if (source[end] === \"}\") depth--;\n if (depth === 0) {\n end++;\n break;\n }\n }\n cursor = end;\n pattern.lastIndex = end;\n }\n\n result += source.slice(cursor);\n return result;\n}\n","/**\n * ThreadState implementation for the builder runtime.\n *\n * This class wraps the internal FlowState and ThreadInstance to provide\n * the public ThreadState interface defined in @standardagents/spec.\n *\n * @module\n */\n\nimport type {\n ThreadState,\n ExecutionState,\n GetMessagesOptions,\n MessagesResult,\n Message,\n InjectMessageInput,\n MessageUpdates,\n QueueMessageInput,\n SubagentRegistryEntry,\n FileRecord,\n WriteFileOptions,\n ReaddirResult,\n FileStats,\n GrepResult,\n FindResult,\n ReadFileStreamOptions,\n FileChunk,\n ScheduledEffect,\n CodeExecution,\n CodeExecutionOptions,\n CodeExecutionResult,\n} from '@standardagents/spec';\n\n// Local types for internal logging (not part of spec)\ninterface GetLogsOptions {\n limit?: number;\n offset?: number;\n order?: 'asc' | 'desc';\n}\n\ninterface Log {\n id: string;\n type: string;\n data: Record<string, unknown>;\n created_at: number;\n parent_id?: string | null;\n}\nimport type { ToolResult } from '@standardagents/spec';\nimport type { FlowState, ThreadInstance, ThreadMetadata, Message as BuilderMessage, Agent } from './types.js';\nimport { injectMessage as injectMessageUtil, queueTool as queueToolUtil } from './utilities.js';\nimport { runCodeInDynamicWorker } from './code-execution.js';\n\ntype EnvValueType = 'text' | 'secret';\n\ntype RemoteRunCodeThreadInstance = ThreadInstance & {\n executeThreadStateRunCode?: (\n threadId: string,\n source: string,\n options?: CodeExecutionOptions,\n wantsReport?: boolean,\n ) => Promise<CodeExecutionResult>;\n};\n\ntype AgentBuilderThreadRecord = {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n env?: Record<string, string> | null;\n env_types?: Record<string, EnvValueType> | null;\n tenvs?: Record<string, unknown> | null;\n properties?: Record<string, unknown> | null;\n parent?: string | null;\n terminated?: number | null;\n created_at: number;\n};\n\ntype ThreadStateRuntimeContext = {\n scheduledEffect?: {\n id?: string | null;\n name: string;\n };\n};\n\nfunction hasLocalCodeExecutionRuntime(threadInstance: ThreadInstance): boolean {\n const candidate = threadInstance as Partial<ThreadInstance>;\n return Boolean(candidate.env && candidate.ctx);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction findUntransferableOption(value: unknown, path: string, seen = new WeakSet<object>()): string | null {\n if (typeof value === 'function' || typeof value === 'symbol') {\n return path;\n }\n if (!value || typeof value !== 'object') {\n return null;\n }\n if (value instanceof Date || value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return null;\n }\n if (seen.has(value)) {\n return null;\n }\n seen.add(value);\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n const found = findUntransferableOption(item, `${path}.${index}`, seen);\n if (found) return found;\n }\n return null;\n }\n if (value instanceof Map) {\n let index = 0;\n for (const [key, item] of value.entries()) {\n const foundKey = findUntransferableOption(key, `${path}.mapKey${index}`, seen);\n if (foundKey) return foundKey;\n const foundValue = findUntransferableOption(item, `${path}.mapValue${index}`, seen);\n if (foundValue) return foundValue;\n index += 1;\n }\n return null;\n }\n if (value instanceof Set) {\n let index = 0;\n for (const item of value.values()) {\n const found = findUntransferableOption(item, `${path}.setValue${index}`, seen);\n if (found) return found;\n index += 1;\n }\n return null;\n }\n if (!isPlainObject(value)) {\n return path;\n }\n for (const [key, item] of Object.entries(value)) {\n const found = findUntransferableOption(item, `${path}.${key}`, seen);\n if (found) return found;\n }\n return null;\n}\n\nfunction createCodeExecutionHandle(\n execute: () => Promise<CodeExecutionResult>,\n reports: unknown[] = [],\n onTerminate?: () => void,\n): CodeExecution {\n const startedAt = Date.now();\n let running = true;\n let terminated = false;\n let settleTermination: ((result: CodeExecutionResult) => void) | null = null;\n const termination = new Promise<CodeExecutionResult>((resolve) => {\n settleTermination = resolve;\n });\n const promise = Promise.race([execute(), termination]).finally(() => {\n running = false;\n });\n\n return {\n then: promise.then.bind(promise) as CodeExecution['then'],\n terminate(reason?: string): void {\n if (!running || terminated) return;\n terminated = true;\n onTerminate?.();\n settleTermination?.({\n status: 'terminated',\n reports,\n logs: [],\n durationMs: Date.now() - startedAt,\n error: {\n name: 'CodeExecutionTerminated',\n message: reason || 'Code execution terminated',\n },\n });\n },\n get running() {\n return running;\n },\n get reports() {\n return reports;\n },\n };\n}\n\nfunction settledCodeExecution(result: CodeExecutionResult): CodeExecution {\n const reports = result.reports ?? [];\n return createCodeExecutionHandle(async () => result, reports);\n}\n\nfunction runCodeViaThreadRpc(\n threadInstance: RemoteRunCodeThreadInstance,\n threadId: string,\n source: string,\n options?: CodeExecutionOptions,\n): CodeExecution {\n const startedAt = Date.now();\n const unsupported = findUntransferableOption(\n {\n execute: options?.execute,\n imports: options?.imports,\n globals: options?.globals,\n modules: options?.modules,\n language: options?.language,\n memoryLimitBytes: options?.memoryLimitBytes,\n filename: options?.filename,\n },\n 'options',\n );\n if (unsupported) {\n return settledCodeExecution({\n status: 'link_error',\n reports: [],\n logs: [],\n durationMs: Date.now() - startedAt,\n error: {\n name: 'InvalidCodeExecutionOptions',\n message: `ThreadState.runCode in an endpoint cannot transfer function or host object values through ${unsupported}. Run code from a tool, or pass only plain data in endpoint runCode options.`,\n },\n });\n }\n\n const report = options?.report;\n const remoteOptions = options ? { ...options } : undefined;\n if (remoteOptions) {\n delete remoteOptions.report;\n }\n const reports: unknown[] = [];\n let terminated = false;\n\n return createCodeExecutionHandle(async () => {\n if (typeof threadInstance.executeThreadStateRunCode !== 'function') {\n return {\n status: 'link_error',\n reports,\n logs: [],\n durationMs: Date.now() - startedAt,\n error: {\n name: 'MissingThreadRunCodeReceiver',\n message: 'The thread runtime does not implement executeThreadStateRunCode.',\n },\n };\n }\n\n try {\n const result = await threadInstance.executeThreadStateRunCode(\n threadId,\n source,\n remoteOptions,\n typeof report === 'function',\n );\n if (!terminated) {\n reports.splice(0, reports.length, ...(result.reports ?? []));\n if (typeof report === 'function') {\n for (const value of reports) {\n report(value);\n }\n }\n }\n return result;\n } catch (error) {\n return {\n status: 'link_error',\n reports,\n logs: [],\n durationMs: Date.now() - startedAt,\n error: {\n name: error instanceof Error ? error.name : 'RemoteCodeExecutionError',\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }, reports, () => {\n terminated = true;\n });\n}\n\n/**\n * Implementation of ThreadState for the builder runtime.\n *\n * This class provides the bridge between the internal FlowState (used by\n * FlowEngine) and the public ThreadState interface (exposed to tools,\n * hooks, and endpoints).\n */\nexport class ThreadStateImpl implements ThreadState {\n private _flowState: FlowState | null;\n private _threadInstance: ThreadInstance;\n private _metadata: ThreadMetadata;\n private _runtimeContext: ThreadStateRuntimeContext;\n private _executionState: ExecutionStateImpl | null = null;\n private _childrenCache: SubagentRegistryEntry[] = [];\n private _terminatedCache: number | null = null;\n\n constructor(\n flowState: FlowState | null,\n threadInstance: ThreadInstance,\n metadata: ThreadMetadata,\n runtimeContext: ThreadStateRuntimeContext = {}\n ) {\n this._flowState = flowState;\n this._threadInstance = threadInstance;\n this._metadata = metadata;\n this._runtimeContext = runtimeContext;\n this._terminatedCache = metadata.terminated ?? null;\n\n // Create execution state wrapper if we have a flow state\n if (flowState) {\n this._executionState = new ExecutionStateImpl(flowState);\n }\n\n // Best-effort async refresh for children registry snapshot.\n if (typeof this._threadInstance.getChildrenRegistry === 'function') {\n this._threadInstance\n .getChildrenRegistry(this._metadata.id)\n .then((entries) => {\n this._childrenCache = entries;\n })\n .catch(() => {\n // Ignore read failures; consumers still have a safe empty snapshot.\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Identity (readonly)\n // ─────────────────────────────────────────────────────────────────────────\n\n get threadId(): string {\n return this._metadata.id;\n }\n\n get agentId(): string {\n return this._metadata.agent_id;\n }\n\n get userId(): string | null {\n return this._metadata.user_id;\n }\n\n get createdAt(): number {\n return this._metadata.created_at;\n }\n\n get children(): SubagentRegistryEntry[] {\n return this._childrenCache;\n }\n\n get terminated(): number | null {\n return this._terminatedCache;\n }\n\n /**\n * Get the agent configuration from the underlying FlowState.\n * This is for backward compatibility with hooks that access state.agentConfig.\n * Returns null if no flow state is available.\n */\n get agentConfig(): Agent | null {\n return this._flowState?.agentConfig ?? null;\n }\n\n /**\n * Runtime-specific context that cannot be packed or shared.\n * Contains Cloudflare env bindings and thread instance for internal use.\n *\n * Shape:\n * - `env`: Cloudflare Workers environment bindings (only during execution)\n * - `threadInstance`: The underlying DurableObject instance (always present)\n */\n get _notPackableRuntimeContext(): Record<string, unknown> {\n const context: Record<string, unknown> = {\n threadInstance: this._threadInstance,\n };\n\n if (this._flowState?.env) {\n context.env = this._flowState.env;\n }\n\n return context;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Messages\n // ─────────────────────────────────────────────────────────────────────────\n\n async getMessages(options?: GetMessagesOptions): Promise<MessagesResult> {\n const result = await this._threadInstance.getMessages(\n options?.limit,\n options?.offset,\n options?.order,\n options?.includeSilent,\n options?.maxDepth\n );\n\n // Map builder messages to spec messages\n return {\n messages: result.messages.map(this._mapMessage),\n total: result.total,\n hasMore: result.hasMore,\n };\n }\n\n async getMessage(messageId: string): Promise<Message | null> {\n // Get messages and find the one with matching ID\n // This could be optimized with a direct query in the future\n const { messages } = await this._threadInstance.getMessages(\n undefined,\n undefined,\n 'desc',\n true,\n undefined\n );\n const msg = messages.find((m) => m.id === messageId);\n return msg ? this._mapMessage(msg) : null;\n }\n\n async injectMessage(input: InjectMessageInput): Promise<Message> {\n let message: BuilderMessage;\n const messageInput = this.withRuntimeMessageMetadata(input);\n\n if (this._flowState) {\n // Use the utility function from utilities.ts\n message = await injectMessageUtil(this._flowState, {\n role: messageInput.role,\n content: messageInput.content,\n silent: messageInput.silent,\n metadata: messageInput.metadata,\n });\n } else if (typeof this._threadInstance.injectMessage === 'function') {\n message = await this._threadInstance.injectMessage(this.threadId, messageInput);\n } else {\n throw new Error('This thread runtime does not support injectMessage outside an execution context');\n }\n\n return this._mapMessage(message);\n }\n\n private withRuntimeMessageMetadata<T extends { metadata?: Record<string, unknown> }>(input: T): T {\n const scheduledEffect = this._runtimeContext.scheduledEffect;\n if (!scheduledEffect) {\n return input;\n }\n\n return {\n ...input,\n metadata: {\n ...(input.metadata ?? {}),\n scheduledEffect,\n },\n } as T;\n }\n\n async updateMessage(messageId: string, updates: MessageUpdates): Promise<Message> {\n // This requires direct storage access - for now, throw\n // TODO: Implement via thread instance method\n throw new Error('updateMessage not yet implemented');\n }\n\n async deleteMessage(messageId: string): Promise<boolean> {\n const result = await this._threadInstance.deleteMessage(messageId);\n return result.success;\n }\n\n async queueMessage(message: QueueMessageInput): Promise<void> {\n if (this.terminated !== null) {\n throw new Error(`Thread ${this.threadId} is terminated`);\n }\n\n if (!this._threadInstance.queueMessage) {\n throw new Error('queueMessage is not supported by this thread runtime');\n }\n\n await this._threadInstance.queueMessage(\n this.threadId,\n this.withRuntimeMessageMetadata(message)\n );\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Logs\n // ─────────────────────────────────────────────────────────────────────────\n\n async getLogs(options?: GetLogsOptions): Promise<Log[]> {\n const logs = await this._threadInstance.getLogs(\n options?.limit,\n options?.offset,\n options?.order\n );\n\n // Map to spec Log type\n return logs.map((log: any) => ({\n id: log.id,\n type: log.type,\n data: typeof log.data === 'string' ? JSON.parse(log.data) : log.data,\n created_at: log.created_at,\n parent_id: log.parent_id,\n }));\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Resource Loading\n // ─────────────────────────────────────────────────────────────────────────\n\n async loadModel<T = unknown>(name: string): Promise<T> {\n return this._threadInstance.loadModel(name) as Promise<T>;\n }\n\n async loadPrompt<T = unknown>(name: string): Promise<T> {\n return this._threadInstance.loadPrompt(name) as Promise<T>;\n }\n\n async loadAgent<T = unknown>(name: string): Promise<T> {\n return this._threadInstance.loadAgent(name) as Promise<T>;\n }\n\n getPromptNames(): string[] {\n return this._threadInstance.getPromptNames();\n }\n\n getAgentNames(): string[] {\n return this._threadInstance.getAgentNames();\n }\n\n getModelNames(): string[] {\n if (typeof this._threadInstance.getModelNames === 'function') {\n return this._threadInstance.getModelNames();\n }\n return [];\n }\n\n async env(propertyName: string): Promise<string> {\n const agentBuilder = this._getAgentBuilderStub();\n if (typeof agentBuilder.resolveThreadEnv !== 'function') {\n throw new Error('resolveThreadEnv is not supported by this runtime');\n }\n\n const value = await agentBuilder.resolveThreadEnv({\n threadId: this.threadId,\n property: propertyName,\n promptName: this._flowState?.prompt?.name,\n });\n\n if (value === null || value === undefined) {\n throw new Error(`Environment variable not found: ${propertyName}`);\n }\n\n return value;\n }\n\n async envType(propertyName: string): Promise<EnvValueType> {\n const agentBuilder = this._getAgentBuilderStub();\n if (typeof agentBuilder.resolveThreadEnvType === 'function') {\n const value = await agentBuilder.resolveThreadEnvType({\n threadId: this.threadId,\n property: propertyName,\n promptName: this._flowState?.prompt?.name,\n });\n return value === 'text' ? 'text' : 'secret';\n }\n\n const thread = typeof agentBuilder.getThread === 'function'\n ? await agentBuilder.getThread(this.threadId)\n : null;\n const envTypes = thread?.env_types;\n if (envTypes && envTypes[propertyName] === 'text') {\n return 'text';\n }\n return 'secret';\n }\n\n async setEnv(\n propertyName: string,\n value: string,\n options?: { type?: EnvValueType }\n ): Promise<void> {\n const agentBuilder = this._getAgentBuilderStub();\n if (typeof agentBuilder.updateThread !== 'function') {\n throw new Error('setEnv is not supported by this runtime');\n }\n\n const thread = await agentBuilder.getThread(this.threadId);\n if (!thread) {\n throw new Error(`Thread not found: ${this.threadId}`);\n }\n\n const nextEnv = this._normalizeEnvRecord(thread.env ?? thread.tenvs ?? null) ?? {};\n nextEnv[propertyName] = value;\n\n const updateParams: {\n env: Record<string, string>;\n env_types?: Record<string, EnvValueType>;\n } = { env: nextEnv };\n\n if (options?.type !== undefined) {\n const nextEnvTypes: Record<string, EnvValueType> = {};\n for (const [key, type] of Object.entries(thread.env_types ?? {})) {\n if (nextEnv[key] !== undefined && type === 'text') {\n nextEnvTypes[key] = 'text';\n }\n }\n if (options.type === 'text') {\n nextEnvTypes[propertyName] = 'text';\n } else {\n delete nextEnvTypes[propertyName];\n }\n updateParams.env_types = nextEnvTypes;\n }\n\n const updated = await agentBuilder.updateThread(this.threadId, updateParams);\n if (!updated) {\n throw new Error(`Failed to set environment variable for thread: ${this.threadId}`);\n }\n\n this._metadata.env = nextEnv;\n (this._metadata as any).env_types = (updated as any).env_types ?? null;\n this._metadata.tenvs = nextEnv;\n }\n\n async notifyParent(content: string): Promise<void> {\n if (!content || !content.trim()) {\n throw new Error(\"notifyParent requires non-empty content\");\n }\n\n const { parentThreadId, parentStub } = await this._getParentThreadStub();\n if (typeof parentStub.queueMessage !== \"function\") {\n throw new Error(\"notifyParent is not supported by this thread runtime\");\n }\n\n await parentStub.queueMessage(parentThreadId, {\n role: \"user\",\n content: content.trim(),\n silent: true,\n metadata: { subagent_id: this.threadId },\n });\n }\n\n async setStatus(status: string): Promise<void> {\n if (!status || !status.trim()) {\n throw new Error(\"setStatus requires non-empty status\");\n }\n\n const { parentThreadId, parentStub } = await this._getParentThreadStub();\n if (typeof parentStub.updateChildRegistryStatus !== \"function\") {\n throw new Error(\"setStatus is not supported by this thread runtime\");\n }\n\n await parentStub.updateChildRegistryStatus(\n parentThreadId,\n this.threadId,\n status.trim()\n );\n }\n\n async getChildThread(referenceId: string): Promise<ThreadState | null> {\n const agentBuilder = this._getAgentBuilderStub();\n const child = await agentBuilder.getThread(referenceId);\n if (!child || child.parent !== this.threadId) {\n return null;\n }\n\n const durableId = this._threadInstance.env.AGENT_BUILDER_THREAD.idFromName(referenceId);\n const childStub = this._threadInstance.env.AGENT_BUILDER_THREAD.get(durableId) as unknown as ThreadInstance;\n\n return ThreadStateImpl.fromThreadInstance(childStub, {\n id: child.id,\n agent_id: child.agent_name,\n user_id: child.user_id,\n env: this._normalizeEnvRecord(child.env ?? child.tenvs ?? null),\n env_types: child.env_types ?? null,\n tenvs: child.tenvs ?? null,\n properties: child.properties ?? null,\n parent: child.parent ?? null,\n terminated: child.terminated ?? null,\n created_at: child.created_at,\n });\n }\n\n async getParentThread(): Promise<ThreadState | null> {\n const agentBuilder = this._getAgentBuilderStub();\n const current = await agentBuilder.getThread(this.threadId);\n const parentId = current?.parent ?? null;\n if (!parentId) {\n return null;\n }\n\n const parent = await agentBuilder.getThread(parentId);\n if (!parent) {\n return null;\n }\n\n const durableId = this._threadInstance.env.AGENT_BUILDER_THREAD.idFromName(parentId);\n const parentStub = this._threadInstance.env.AGENT_BUILDER_THREAD.get(durableId) as unknown as ThreadInstance;\n\n return ThreadStateImpl.fromThreadInstance(parentStub, {\n id: parent.id,\n agent_id: parent.agent_name,\n user_id: parent.user_id,\n env: this._normalizeEnvRecord(parent.env ?? parent.tenvs ?? null),\n env_types: parent.env_types ?? null,\n tenvs: parent.tenvs ?? null,\n properties: parent.properties ?? null,\n parent: parent.parent ?? null,\n terminated: parent.terminated ?? null,\n created_at: parent.created_at,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Tool Invocation\n // ─────────────────────────────────────────────────────────────────────────\n\n queueTool(toolName: string, args: Record<string, unknown>): void {\n if (!this._flowState) {\n // TODO: Start execution if not running\n throw new Error('Cannot queue tools without an execution context');\n }\n\n queueToolUtil(this._flowState, toolName, args);\n }\n\n async invokeTool(toolName: string, args: Record<string, unknown>): Promise<ToolResult> {\n // TODO: Implement direct tool invocation\n throw new Error('invokeTool not yet implemented');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Events / Streaming\n // ─────────────────────────────────────────────────────────────────────────\n\n emit(event: string, data: unknown): void {\n if (this._flowState?.emitEvent) {\n this._flowState.emitEvent(event, data);\n }\n // No-op if no flow state or emitter\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Context Storage\n // ─────────────────────────────────────────────────────────────────────────\n\n get context(): Record<string, unknown> {\n if (this._flowState) {\n return this._flowState.context;\n }\n // Return empty object for non-executing contexts\n // TODO: Could persist this per-thread\n return {};\n }\n\n set context(value: Record<string, unknown>) {\n if (this._flowState) {\n this._flowState.context = value;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Durable Key-Value Store\n // ─────────────────────────────────────────────────────────────────────────\n\n async getValue<T = unknown>(key: string): Promise<T | null> {\n if (typeof this._threadInstance.getValue !== 'function') {\n throw new Error('getValue is not supported by this thread runtime');\n }\n\n return this._threadInstance.getValue<T>(key);\n }\n\n async setValue(key: string, value: unknown): Promise<void> {\n if (typeof this._threadInstance.setValue !== 'function') {\n throw new Error('setValue is not supported by this thread runtime');\n }\n\n await this._threadInstance.setValue(key, value);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // File System\n // ─────────────────────────────────────────────────────────────────────────\n\n async writeFile(\n path: string,\n data: ArrayBuffer | string,\n mimeType: string,\n options?: WriteFileOptions\n ): Promise<FileRecord> {\n // Detect if this is a text-based file type\n const isText = this._isTextMimeType(mimeType);\n\n if (isText) {\n // For text files, pass content as plain string (enables grep/find)\n let textContent: string;\n if (typeof data === 'string') {\n textContent = data;\n } else {\n // Decode ArrayBuffer as UTF-8 text\n textContent = new TextDecoder().decode(data);\n }\n const result = await this._threadInstance.writeTextFile(path, textContent, mimeType, options as Record<string, unknown>);\n return this._mapFileRecord(result.file);\n } else {\n // For binary files, base64-encode the data\n let base64Data: string;\n if (typeof data === 'string') {\n // Assume string data for binary is already base64, or encode it\n // Since this is binary context, encode string as UTF-8 bytes then base64\n const encoder = new TextEncoder();\n const bytes = encoder.encode(data);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n base64Data = btoa(binary);\n } else {\n // Convert ArrayBuffer to base64\n const bytes = new Uint8Array(data);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n base64Data = btoa(binary);\n }\n const result = await this._threadInstance.writeFile(path, base64Data, mimeType, options as Record<string, unknown>);\n return this._mapFileRecord(result.file);\n }\n }\n\n /**\n * Check if a MIME type should be stored as searchable text.\n * Matches the logic in FileStorage for consistency.\n */\n private _isTextMimeType(mimeType: string): boolean {\n // All text/* types are text\n if (mimeType.startsWith('text/')) return true;\n\n // Common text-based application types\n const TEXT_APPLICATION_TYPES = [\n // Data formats\n 'application/json',\n 'application/ld+json',\n 'application/json5',\n 'application/jsonl',\n 'application/x-ndjson',\n 'application/xml',\n 'application/xhtml+xml',\n 'application/rss+xml',\n 'application/atom+xml',\n 'application/soap+xml',\n 'application/yaml',\n 'application/x-yaml',\n 'application/toml',\n 'application/x-toml',\n\n // Programming languages\n 'application/javascript',\n 'application/x-javascript',\n 'application/ecmascript',\n 'application/typescript',\n 'application/x-typescript',\n 'application/x-python',\n 'application/x-ruby',\n 'application/x-perl',\n 'application/x-php',\n 'application/x-sh',\n 'application/x-bash',\n 'application/x-csh',\n 'application/x-zsh',\n 'application/x-powershell',\n 'application/x-lua',\n 'application/x-tcl',\n\n // Query/config languages\n 'application/sql',\n 'application/x-sql',\n 'application/graphql',\n 'application/x-graphql',\n 'application/sparql-query',\n 'application/sparql-results+json',\n 'application/sparql-results+xml',\n\n // Markup/templates\n 'application/x-httpd-php',\n 'application/x-latex',\n 'application/x-tex',\n 'application/rtf',\n 'application/xslt+xml',\n\n // Web\n 'application/x-www-form-urlencoded',\n 'application/manifest+json',\n 'application/webmanifest+json',\n 'application/x-web-app-manifest+json',\n\n // Config files\n 'application/x-ini',\n 'application/x-properties',\n 'application/plist',\n 'application/x-plist',\n ];\n\n return TEXT_APPLICATION_TYPES.some(type =>\n mimeType === type || mimeType.startsWith(type + ';')\n );\n }\n\n async readFile(path: string): Promise<ArrayBuffer | null> {\n const result = await this._threadInstance.readFile(path);\n if (!result.success || !result.data) {\n return null;\n }\n // Decode base64 string to ArrayBuffer\n const binaryString = atob(result.data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n\n async readFileStream(\n path: string,\n options?: ReadFileStreamOptions\n ): Promise<AsyncIterable<FileChunk> | null> {\n // Get file info to determine if chunked\n const fileInfo = await this._threadInstance.statFile(path);\n\n if (!fileInfo) {\n return null;\n }\n\n // External files cannot be streamed via this method\n if (fileInfo.storage !== 'local') {\n return null;\n }\n\n const isChunked = fileInfo.isChunked ?? fileInfo.is_chunked ?? false;\n const chunkCount = fileInfo.chunkCount ?? fileInfo.chunk_count ?? 1;\n const totalChunks = isChunked ? chunkCount : 1;\n\n const threadInstance = this._threadInstance;\n const signal = options?.signal;\n\n // Return an async generator wrapped as AsyncIterable\n return {\n [Symbol.asyncIterator]: async function* (): AsyncGenerator<FileChunk> {\n // For non-chunked files, use regular readFile and yield as single chunk\n if (!isChunked) {\n const result = await threadInstance.readFile(path);\n if (!result.success || !result.data) {\n return; // File disappeared or error\n }\n // Decode base64 string to Uint8Array\n const binaryString = atob(result.data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n yield {\n data: bytes,\n index: 0,\n totalChunks: 1,\n isLast: true,\n };\n return;\n }\n\n // For chunked files, iterate through chunks\n for (let i = 0; i < totalChunks; i++) {\n // Check abort signal before each chunk\n if (signal?.aborted) {\n return;\n }\n\n const result = await threadInstance.readFileChunk(path, i);\n\n if (!result.success || !result.data) {\n throw new Error(result.error || `Failed to read chunk ${i}`);\n }\n\n // Decode base64 to Uint8Array\n const binary = atob(result.data);\n const data = new Uint8Array(binary.length);\n for (let j = 0; j < binary.length; j++) {\n data[j] = binary.charCodeAt(j);\n }\n\n yield {\n data,\n index: i,\n totalChunks,\n isLast: i === totalChunks - 1,\n };\n }\n },\n };\n }\n\n async statFile(path: string): Promise<FileRecord | null> {\n const result = await this._threadInstance.statFile(path);\n return result ? this._mapFileRecord(result) : null;\n }\n\n async readdirFile(path: string): Promise<ReaddirResult> {\n const entries = await this._threadInstance.readdirFile(path);\n return {\n entries: entries.map((e: any) => this._mapFileRecord(e)),\n };\n }\n\n async unlinkFile(path: string): Promise<void> {\n await this._threadInstance.unlinkFile(path);\n }\n\n async mkdirFile(path: string): Promise<FileRecord> {\n const result = await this._threadInstance.mkdirFile(path);\n return this._mapFileRecord(result);\n }\n\n async rmdirFile(path: string): Promise<void> {\n await this._threadInstance.rmdirFile(path);\n }\n\n async getFileStats(): Promise<FileStats> {\n const stats = await this._threadInstance.getFileStats();\n return {\n fileCount: stats.fileCount ?? stats.file_count ?? 0,\n directoryCount: stats.directoryCount ?? stats.directory_count ?? 0,\n totalSize: stats.totalSize ?? stats.total_size ?? 0,\n };\n }\n\n async grepFiles(pattern: string): Promise<GrepResult[]> {\n const results = await this._threadInstance.grepFiles(pattern);\n return results.map((r: any) => ({\n path: r.path,\n matches: r.matches || [],\n }));\n }\n\n async findFiles(pattern: string): Promise<FindResult> {\n const results = await this._threadInstance.findFiles(pattern);\n return {\n paths: Array.isArray(results) ? results : results.paths || [],\n };\n }\n\n async getFileThumbnail(path: string): Promise<ArrayBuffer | null> {\n return this._threadInstance.getFileThumbnail(path);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Execution State\n // ─────────────────────────────────────────────────────────────────────────\n\n get execution(): ExecutionState | null {\n return this._executionState;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Agent Execution\n // ─────────────────────────────────────────────────────────────────────────\n\n async runAgent(agentName: string): Promise<void> {\n await this._threadInstance.runAgent(this._metadata.id, agentName);\n }\n\n async terminate(): Promise<void> {\n if (this.terminated !== null) {\n return;\n }\n\n if (!this._threadInstance.terminateThread) {\n throw new Error('terminate is not supported by this thread runtime');\n }\n\n const result = await this._threadInstance.terminateThread(this.threadId);\n this._terminatedCache = result.terminated;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Effect Scheduling\n // ─────────────────────────────────────────────────────────────────────────\n\n async scheduleEffect(name: string, args: Record<string, unknown>, delay: number = 0): Promise<string> {\n const sourceLogId = this._flowState?.currentLogId ?? null;\n return this._threadInstance.scheduleEffect(this._metadata.id, name, args, delay, {\n sourceLogId,\n });\n }\n\n async getScheduledEffects(name?: string): Promise<ScheduledEffect[]> {\n return this._threadInstance.getScheduledEffects(name);\n }\n\n async removeScheduledEffect(id: string): Promise<boolean> {\n return this._threadInstance.removeScheduledEffect(id);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Code Execution\n // ─────────────────────────────────────────────────────────────────────────\n\n runCode(source: string, options?: CodeExecutionOptions): CodeExecution {\n if (!hasLocalCodeExecutionRuntime(this._threadInstance)) {\n return runCodeViaThreadRpc(\n this._threadInstance as RemoteRunCodeThreadInstance,\n this.threadId,\n source,\n options,\n );\n }\n\n return runCodeInDynamicWorker({\n source,\n options,\n threadId: this.threadId,\n threadInstance: this._threadInstance,\n abortSignal: this._flowState?.abortController?.signal,\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n private _mapMessage = (msg: BuilderMessage): Message => {\n return {\n id: msg.id,\n role: msg.role,\n content: msg.content,\n name: msg.name,\n tool_calls: msg.tool_calls,\n tool_call_id: msg.tool_call_id,\n created_at: msg.created_at,\n parent_id: msg.parent_id,\n depth: msg.depth,\n silent: msg.silent,\n metadata: msg.metadata,\n };\n };\n\n private _mapFileRecord = (record: any): FileRecord => {\n return {\n path: record.path,\n name: record.name,\n mimeType: record.mimeType ?? record.mime_type ?? 'application/octet-stream',\n storage: record.storage ?? 'local',\n size: record.size ?? 0,\n isDirectory: record.isDirectory ?? record.is_directory ?? false,\n metadata: record.metadata,\n width: record.width,\n height: record.height,\n createdAt: record.createdAt ?? record.created_at,\n updatedAt: record.updatedAt ?? record.updated_at,\n };\n };\n\n private _normalizeEnvRecord(\n value: Record<string, string> | Record<string, unknown> | null | undefined\n ): Record<string, string> | null {\n if (!value || typeof value !== 'object') return null;\n const normalized: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (entry === undefined || entry === null) continue;\n normalized[key] = String(entry);\n }\n return Object.keys(normalized).length > 0 ? normalized : null;\n }\n\n private async _getParentThreadId(): Promise<string> {\n const metadataParent =\n typeof (this._metadata as any).parent === \"string\" &&\n (this._metadata as any).parent.trim().length > 0\n ? (this._metadata as any).parent.trim()\n : null;\n if (metadataParent) {\n return metadataParent;\n }\n\n const agentBuilder = this._getAgentBuilderStub();\n const thread = await agentBuilder.getThread(this.threadId);\n const parent =\n thread && typeof thread.parent === \"string\" && thread.parent.trim().length > 0\n ? thread.parent.trim()\n : null;\n if (!parent) {\n throw new Error(`Thread ${this.threadId} has no parent thread`);\n }\n\n (this._metadata as any).parent = parent;\n return parent;\n }\n\n private async _getParentThreadStub(): Promise<{\n parentThreadId: string;\n parentStub: ThreadInstance;\n }> {\n const parentThreadId = await this._getParentThreadId();\n const durableId = this._threadInstance.env.AGENT_BUILDER_THREAD.idFromName(parentThreadId);\n const parentStub = this._threadInstance.env.AGENT_BUILDER_THREAD.get(durableId) as unknown as ThreadInstance;\n return { parentThreadId, parentStub };\n }\n\n private _getAgentBuilderStub(): {\n getThread(threadId: string): Promise<AgentBuilderThreadRecord | null>;\n resolveThreadEnv?(params: {\n threadId: string;\n property: string;\n promptName?: string;\n }): Promise<string | null>;\n resolveThreadEnvType?(params: {\n threadId: string;\n property: string;\n promptName?: string;\n }): Promise<EnvValueType>;\n updateThread?(threadId: string, params: {\n env?: Record<string, string> | null;\n env_types?: Record<string, EnvValueType> | null;\n tenvs?: Record<string, unknown> | null;\n }): Promise<AgentBuilderThreadRecord | null>;\n } {\n const env = this._threadInstance.env;\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n return env.AGENT_BUILDER.get(agentBuilderId) as any;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static Factory\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a ThreadState from a FlowState (during execution).\n */\n static fromFlowState(flowState: FlowState): ThreadState {\n return new ThreadStateImpl(\n flowState,\n flowState.thread.instance,\n flowState.thread.metadata\n );\n }\n\n /**\n * Create a ThreadState without execution context (for endpoints).\n */\n static fromThreadInstance(\n threadInstance: ThreadInstance,\n metadata: ThreadMetadata,\n runtimeContext: ThreadStateRuntimeContext = {}\n ): ThreadState {\n return new ThreadStateImpl(null, threadInstance, metadata, runtimeContext);\n }\n}\n\n/**\n * Implementation of ExecutionState.\n */\nclass ExecutionStateImpl implements ExecutionState {\n private _flowState: FlowState;\n\n constructor(flowState: FlowState) {\n this._flowState = flowState;\n }\n\n get flowId(): string {\n return this._flowState.flowId;\n }\n\n get currentSide(): 'a' | 'b' {\n return this._flowState.currentSide;\n }\n\n get stepCount(): number {\n return this._flowState.stepCount;\n }\n\n get sideAStepCount(): number {\n return this._flowState.sideAStepCount;\n }\n\n get sideBStepCount(): number {\n return this._flowState.sideBStepCount;\n }\n\n get stopped(): boolean {\n return this._flowState.stopped;\n }\n\n get stoppedBy(): 'a' | 'b' | undefined {\n return this._flowState.stoppedBy;\n }\n\n get messageHistory(): Message[] {\n // Map builder messages to spec messages\n return this._flowState.messageHistory.map((msg) => ({\n id: msg.id,\n role: msg.role,\n content: msg.content,\n name: msg.name,\n tool_calls: msg.tool_calls,\n tool_call_id: msg.tool_call_id,\n created_at: msg.created_at,\n parent_id: msg.parent_id,\n depth: msg.depth,\n silent: msg.silent,\n metadata: undefined,\n }));\n }\n\n get promptPath(): string[] {\n return this._flowState.promptPath;\n }\n\n forceTurn(side: 'a' | 'b'): void {\n this._flowState.forcedNextSide = side === 'a' ? 'side_a' : 'side_b';\n }\n\n stop(): void {\n this._flowState.stopped = true;\n this._flowState.stoppedBy = this._flowState.currentSide;\n }\n\n get abortSignal(): AbortSignal {\n if (!this._flowState.abortController) {\n this._flowState.abortController = new AbortController();\n }\n return this._flowState.abortController.signal;\n }\n}\n","/**\n * Server-side image processing for Cloudflare Workers\n *\n * Uses @standardagents/sip for memory-efficient processing with scanline-based\n * resize and streaming output. All images are converted to JPEG.\n *\n * Features:\n * - Compress/resize images to fit under 1.5MB target\n * - Convert AVIF/WebP/PNG/JPEG to JPEG\n * - Memory-efficient scanline processing\n * - Smart quality optimization: quality first, dimensions last\n */\n\nimport { collect, transform } from \"@standardagents/sip\";\n\n// Target 1.5MB binary → ~2MB base64 for RPC transfer\n// SQLite limit is 2MB per row, but base64 overhead means we need headroom\nconst MAX_SIZE = 1.5 * 1024 * 1024;\n\n// Memory safety limit\nconst MAX_DIMENSION = 4096;\n\n// Reject images that would consume too much memory before decoding\nconst MAX_INPUT_SIZE = 20 * 1024 * 1024; // 20MB\nconst MIN_QUALITY = 45;\n\nexport interface ProcessedImage {\n data: ArrayBuffer;\n mimeType: \"image/jpeg\";\n width: number;\n height: number;\n}\n\nfunction clampQuality(quality: number): number {\n return Math.max(1, Math.min(100, Math.round(quality)));\n}\n\nasync function collectTransformedImage(\n input: ArrayBuffer,\n width: number,\n height: number,\n quality: number\n): Promise<ProcessedImage> {\n const image = transform(input, { width, height, quality: clampQuality(quality) });\n const { data, info } = await collect(image);\n\n return {\n data,\n mimeType: \"image/jpeg\",\n width: info.width,\n height: info.height,\n };\n}\n\nasync function transformToTargetSize(\n input: ArrayBuffer,\n maxWidth: number,\n maxHeight: number,\n maxBytes: number,\n quality: number\n): Promise<ProcessedImage> {\n let currentQuality = clampQuality(quality);\n let result = await collectTransformedImage(input, maxWidth, maxHeight, currentQuality);\n\n while (result.data.byteLength > maxBytes && currentQuality > MIN_QUALITY) {\n currentQuality -= 10;\n result = await collectTransformedImage(input, maxWidth, maxHeight, currentQuality);\n }\n\n while (result.data.byteLength > maxBytes) {\n const scaleFactor = Math.sqrt(maxBytes / result.data.byteLength) * 0.9;\n const nextWidth = Math.max(1, Math.min(result.width - 1, Math.round(result.width * scaleFactor)));\n const nextHeight = Math.max(1, Math.min(result.height - 1, Math.round(result.height * scaleFactor)));\n\n if (nextWidth >= result.width && nextHeight >= result.height) {\n break;\n }\n\n result = await collectTransformedImage(input, nextWidth, nextHeight, currentQuality);\n }\n\n return result;\n}\n\n/**\n * Process an image to ensure it's under 1.5MB and in JPEG format.\n *\n * All images (including transparent PNGs) are converted to JPEG.\n * This trades transparency for reliability - SIP's WASM works correctly\n * in Cloudflare Workers while @jsquash's WASM loading fails.\n *\n * @param input - Raw image data as ArrayBuffer\n * @param inputMimeType - MIME type hint (unused, kept for API compatibility)\n * @returns Processed image data as JPEG with dimensions\n */\nexport async function processImage(\n input: ArrayBuffer,\n inputMimeType: string\n): Promise<ProcessedImage> {\n // Memory safety: reject very large images\n if (input.byteLength > MAX_INPUT_SIZE) {\n throw new Error(`Image too large: ${input.byteLength} bytes exceeds ${MAX_INPUT_SIZE} byte limit`);\n }\n\n return await transformToTargetSize(input, MAX_DIMENSION, MAX_DIMENSION, MAX_SIZE, 85);\n}\n\n/**\n * Detect image format from magic bytes (fallback)\n */\nfunction detectFormat(data: ArrayBuffer, mimeType: string): string {\n const bytes = new Uint8Array(data.slice(0, 12));\n\n if (bytes[4] === 0x66 && bytes[5] === 0x74 && bytes[6] === 0x79 && bytes[7] === 0x70) {\n const brand = String.fromCharCode(...bytes.slice(8, 12));\n if (brand === \"avif\" || brand === \"avis\") return \"avif\";\n }\n\n if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4E && bytes[3] === 0x47) {\n return \"png\";\n }\n\n if (bytes[0] === 0xFF && bytes[1] === 0xD8 && bytes[2] === 0xFF) {\n return \"jpeg\";\n }\n\n if (bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46 &&\n bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50) {\n return \"webp\";\n }\n\n if (mimeType.includes(\"png\")) return \"png\";\n if (mimeType.includes(\"webp\")) return \"webp\";\n if (mimeType.includes(\"avif\")) return \"avif\";\n return \"jpeg\";\n}\n\n/**\n * Check if an image needs processing based on size and format.\n *\n * @param data - Base64-encoded image data\n * @param mimeType - MIME type of the image\n * @returns true if processing is needed\n */\nexport function needsProcessing(data: string, mimeType: string): boolean {\n // Decode base64 to get actual size\n const binaryLength = Math.ceil(data.length * 3 / 4);\n\n // Process if >2MB or unsupported format\n return (\n binaryLength > MAX_SIZE ||\n mimeType.includes(\"avif\") ||\n mimeType.includes(\"webp\")\n );\n}\n\n/**\n * Convert base64 string to ArrayBuffer\n */\nexport function base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Convert ArrayBuffer to base64 string\n */\nexport function arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n","/**\n * Router and endpoint definition module for AgentBuilder.\n *\n * This module re-exports endpoint types from @standardagents/spec and provides\n * the runtime router implementation for handling HTTP requests.\n *\n * @module\n */\n\nimport { createRouter, findRoute } from \"rou3\";\nimport type { ThreadInstance, ThreadMetadata } from \"../agents/types.js\";\nimport { ThreadStateImpl } from \"../agents/ThreadStateImpl.js\";\nimport type { NamespacedRegistry } from \"../packing/types.js\";\n\n// Re-export types from spec package (for external users)\nexport {\n type VirtualModuleLoader,\n type VirtualModuleRegistry,\n type ControllerReturn,\n type AgentDefinition,\n} from '@standardagents/spec';\n\n// Note: defineThreadEndpoint should be imported directly from @standardagents/spec\n// The builder's createThreadEndpointHandler wraps these at runtime to provide ThreadState\n// We intentionally do NOT re-export it here to encourage importing from spec\n\n// Re-export spec's defineController for external users who want the abstract version\nexport { defineController as specDefineController } from '@standardagents/spec';\n\n// Import types for use in this module\nimport type {\n ControllerContext as SpecControllerContext,\n Controller as SpecController,\n AgentDefinition,\n ThreadState,\n ThreadEndpointHandler,\n QueueMessageInput,\n SubagentRegistryEntry,\n} from '@standardagents/spec';\n\n// ============================================================================\n// Cloudflare-Specific Types (Builder Implementation)\n// ============================================================================\n\n/**\n * Durable Object namespace interface.\n * This is Cloudflare-specific and used by the builder runtime.\n */\nexport interface DurableObjectNamespace<T = unknown> {\n idFromName(name: string): DurableObjectId;\n idFromString(id: string): DurableObjectId;\n newUniqueId(): DurableObjectId;\n get(id: DurableObjectId): DurableObjectStub<T>;\n}\n\n/**\n * Durable Object ID interface.\n */\nexport interface DurableObjectId {\n toString(): string;\n equals(other: DurableObjectId): boolean;\n}\n\n/**\n * Durable Object stub interface.\n * The generic type T represents the RPC methods available on the stub.\n */\nexport type DurableObjectStub<T = unknown> = {\n id: DurableObjectId;\n name?: string;\n fetch(request: Request | string, requestInitr?: RequestInit): Promise<Response>;\n} & T;\n\n/**\n * Log entry from DurableThread.getLogs()\n */\nexport interface LogEntry {\n id: string;\n message_id: string;\n provider: string;\n actual_provider: string | null;\n standard_agents_router_used: boolean;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: number;\n created_at: number;\n request_body: string | null;\n}\n\n// AgentDefinition is imported from @standardagents/spec above\n\n/**\n * Response from getThreadMeta()\n */\nexport interface ThreadMetaResponse {\n thread: ThreadRegistryEntry;\n agent: AgentDefinition | null;\n stats: {\n messageCount: number;\n logCount: number;\n lastActivity: number | null;\n };\n}\n\n/**\n * Log details returned by getLogDetails\n */\nexport interface LogDetails {\n id: string;\n message_id: string;\n provider: string;\n actual_provider: string | null;\n standard_agents_router_used: boolean;\n model: string;\n model_name: string | null;\n endpoint: string | null;\n request_body: string | null;\n request_headers: string | null;\n response_body: string | null;\n response_headers: string | null;\n status_code: number | null;\n reasoning_content: string | null;\n input_tokens: number | null;\n cached_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n total_tokens: number | null;\n latency_ms: number | null;\n time_to_first_token_ms: number | null;\n finish_reason: string | null;\n error: string | null;\n error_type: string | null;\n cost_input: number | null;\n cost_output: number | null;\n cost_total: number | null;\n message_history_length: number | null;\n tools_available: number | null;\n prompt_name: string | null;\n tools_called: string | null;\n provider_tools: string | null;\n parent_log_id: string | null;\n tools_schema: string | null;\n system_prompt: string | null;\n errors: string | null;\n retry_of_log_id: string | null;\n tool_results: string | null;\n scheduled_effects: string | null;\n is_complete: number;\n created_at: number;\n}\n\n/**\n * RPC methods exposed by DurableThread for external callers.\n */\nexport interface DurableThreadRpc {\n stop(): Promise<Response>;\n executeBlocking?(\n threadId: string,\n agentId: string,\n initial_messages?: unknown[],\n data?: unknown\n ): Promise<{\n status: \"success\" | \"error\";\n result?: string;\n error?: string;\n attachments?: unknown[];\n terminal?: boolean;\n }>;\n terminateThread?(threadId: string): Promise<{ success: boolean; terminated: number }>;\n getTerminated?(threadId: string): Promise<number | null>;\n queueMessage?(threadId: string, message: QueueMessageInput): Promise<void>;\n getChildrenRegistry?(threadId: string): Promise<SubagentRegistryEntry[]>;\n upsertChildRegistry?(threadId: string, entry: SubagentRegistryEntry): Promise<void>;\n updateChildRegistryStatus?(threadId: string, reference: string, status: string): Promise<void>;\n removeChildRegistry?(threadId: string, reference: string): Promise<void>;\n getMessages(\n limit?: number,\n offset?: number,\n order?: \"ASC\" | \"DESC\",\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<{ messages: unknown[]; total: number; hasMore: boolean }>;\n getMessagesByIds?(\n ids: string[],\n includeSilent?: boolean,\n maxDepth?: number,\n includeWorkblocks?: boolean\n ): Promise<{ messages: unknown[]; total: number; hasMore: boolean }>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n updateMessageContent(messageId: string, content: string): Promise<{ success: boolean; error?: string }>;\n getLogs(\n limit?: number,\n offset?: number,\n order?: \"ASC\" | \"DESC\"\n ): Promise<{ logs: LogEntry[]; total: number; hasMore: boolean }>;\n getLogsByIds?(\n ids: string[],\n includeDescendants?: boolean,\n order?: \"ASC\" | \"DESC\"\n ): Promise<{ logs: LogEntry[]; total: number; hasMore: boolean }>;\n getLogsByMessageIds?(\n messageIds: string[],\n includeWorkblocks?: boolean,\n includeDescendants?: boolean,\n order?: \"ASC\" | \"DESC\"\n ): Promise<{ logs: LogEntry[]; total: number; hasMore: boolean }>;\n getLogDetails(logId: string): Promise<LogDetails | null>;\n getThreadMeta(threadId: string): Promise<ThreadMetaResponse | null>;\n deleteThread(): Promise<void>;\n readFile(path: string): Promise<{ success: boolean; data?: string; error?: string }>;\n getValue<T = unknown>(key: string): Promise<T | null>;\n setValue(key: string, value: unknown): Promise<void>;\n listValues(options?: {\n search?: string | null;\n limit?: number;\n offset?: number;\n }): Promise<{\n values: Array<{\n key: string;\n value: unknown;\n serialized: string;\n size: number;\n updatedAt: number;\n parseError?: string;\n }>;\n total: number;\n limit: number;\n offset: number;\n search: string | null;\n }>;\n}\n\n/**\n * Thread registry entry from DurableAgentBuilder.\n */\nexport interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n env?: Record<string, string> | null;\n env_types?: Record<string, 'text' | 'secret'> | null;\n /** @deprecated Use env */\n tenvs?: Record<string, unknown> | null;\n properties?: Record<string, unknown> | null;\n parent: string | null;\n terminated: number | null;\n created_at: number;\n}\n\n/**\n * RPC methods exposed by DurableAgentBuilder for external callers.\n */\nexport interface DurableAgentBuilderRpc {\n createThread(params: {\n agent_name: string;\n user_id?: string;\n tags?: string[];\n env?: Record<string, string>;\n env_types?: Record<string, 'text' | 'secret'>;\n /** @deprecated Use env */\n tenvs?: Record<string, unknown>;\n properties?: Record<string, unknown>;\n parent?: string;\n }): Promise<ThreadRegistryEntry>;\n getThread(threadId: string): Promise<ThreadRegistryEntry | null>;\n resolveThreadEnv?(params: {\n threadId: string;\n property: string;\n promptName?: string;\n }): Promise<string | null>;\n resolveThreadEnvType?(params: {\n threadId: string;\n property: string;\n promptName?: string;\n }): Promise<'text' | 'secret'>;\n getInstanceEnv?(): Promise<Record<string, string>>;\n getInstanceEnvTypes?(): Promise<Record<string, 'text' | 'secret'>>;\n getInstanceEnvEntries?(): Promise<Array<{\n name: string;\n value: string;\n type: 'text' | 'secret';\n created_at: number;\n updated_at: number;\n }>>;\n patchInstanceEnv?(params: {\n env_patch?: Record<string, unknown> | null;\n env_type_patch?: Record<string, unknown> | null;\n env_delete?: string[] | null;\n }): Promise<void>;\n getUserEnv?(userId: string): Promise<Record<string, string>>;\n getUserEnvTypes?(userId: string): Promise<Record<string, 'text' | 'secret'>>;\n getUserEnvEntries?(userId: string): Promise<Array<{\n name: string;\n value: string;\n type: 'text' | 'secret';\n created_at: number;\n updated_at: number;\n }>>;\n patchUserEnv?(userId: string, params: {\n env_patch?: Record<string, unknown> | null;\n env_type_patch?: Record<string, unknown> | null;\n env_delete?: string[] | null;\n }): Promise<void>;\n getMissingRequiredScopedSubagentEnv?(params: {\n parent_thread_id: string;\n agent_name: string;\n provided_env?: Record<string, string> | null;\n }): Promise<string[]>;\n createPendingSubagentEnvRequest?(params: {\n parent_thread_id: string;\n agent_name: string;\n registry_agent_name: string;\n required_variables: string[];\n missing_variables: string[];\n payload: {\n blocking: boolean;\n resumable: boolean;\n receives_messages: \"side_a\" | \"side_b\";\n initial_message_content: string;\n initial_message_attachments: Array<{\n path: string;\n name?: string;\n mimeType?: string;\n size?: number;\n width?: number;\n height?: number;\n }>;\n initial_agent_name?: string | null;\n agent_title?: string | null;\n agent_description?: string | null;\n spawn_group_id?: string | null;\n };\n }): Promise<{\n request_id: string;\n parent_thread_id: string;\n agent_name: string;\n registry_agent_name: string;\n required: string[];\n missing: string[];\n payload: {\n blocking: boolean;\n resumable: boolean;\n receives_messages: \"side_a\" | \"side_b\";\n initial_message_content: string;\n initial_message_attachments: Array<{\n path: string;\n name?: string;\n mimeType?: string;\n size?: number;\n width?: number;\n height?: number;\n }>;\n initial_agent_name?: string | null;\n agent_title?: string | null;\n agent_description?: string | null;\n spawn_group_id?: string | null;\n };\n created_at: number;\n }>;\n getPendingSubagentEnvRequest?(\n parentThreadId: string,\n requestId: string\n ): Promise<{\n request_id: string;\n parent_thread_id: string;\n agent_name: string;\n registry_agent_name: string;\n required: string[];\n missing: string[];\n payload: {\n blocking: boolean;\n resumable: boolean;\n receives_messages: \"side_a\" | \"side_b\";\n initial_message_content: string;\n initial_message_attachments: Array<{\n path: string;\n name?: string;\n mimeType?: string;\n size?: number;\n width?: number;\n height?: number;\n }>;\n initial_agent_name?: string | null;\n agent_title?: string | null;\n agent_description?: string | null;\n spawn_group_id?: string | null;\n };\n created_at: number;\n } | null>;\n completePendingSubagentEnvRequest?(params: {\n parent_thread_id: string;\n request_id: string;\n env: Record<string, string>;\n }): Promise<{\n request_id: string;\n child_thread_id: string;\n status: \"success\";\n }>;\n getInstanceEnv?(): Promise<Record<string, string>>;\n getUserEnv?(userId: string): Promise<Record<string, string>>;\n listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n search?: string;\n startDate?: number;\n endDate?: number;\n limit?: number;\n offset?: number;\n include_children?: boolean;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }>;\n getThreadTreeIds?(threadId: string): Promise<string[]>;\n deleteThread(threadId: string): Promise<void>;\n getUserByUsername(username: string): Promise<unknown>;\n createSession(session: { user_id: string; token_hash: string; expires_at: number }): Promise<void>;\n loadAgent(name: string): Promise<AgentDefinition>;\n}\n\n/**\n * Minimum required environment bindings for thread endpoints.\n * User's Env interface should extend this.\n *\n * This is Cloudflare-specific and used by the builder runtime.\n */\nexport interface ThreadEnv {\n AGENT_BUILDER_THREAD: DurableObjectNamespace<DurableThreadRpc>;\n AGENT_BUILDER: DurableObjectNamespace<DurableAgentBuilderRpc>;\n [key: string]: unknown;\n}\n\n/**\n * Builder-specific controller context with typed env.\n *\n * This extends the spec's ControllerContext with proper typing for\n * Cloudflare environment bindings.\n */\nexport interface BuilderControllerContext<Env extends ThreadEnv = ThreadEnv>\n extends Omit<SpecControllerContext, 'env'> {\n env: Env;\n /** Namespaced registry for packed agent support */\n registry?: NamespacedRegistry;\n}\n\n/**\n * Builder-specific controller type with typed env.\n */\nexport type BuilderController<Env extends ThreadEnv = ThreadEnv> = (\n context: BuilderControllerContext<Env>\n) => ReturnType<SpecController>;\n\n/**\n * Thread endpoint context with access to thread instance and metadata.\n * @deprecated Use ThreadState instead\n */\nexport interface ThreadEndpointContext {\n req: Request;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n}\n\n/**\n * Handler function for builder thread endpoints.\n *\n * Receives the request and a ThreadState object per the Standard Agents spec.\n * The ThreadState provides access to thread identity, messages, logs,\n * resource loading, tool invocation, and more.\n *\n * Note: `state.execution` is always null in endpoints since the thread\n * is not actively executing.\n */\nexport type BuilderThreadEndpointHandler = ThreadEndpointHandler;\n\n// Note: defineThreadEndpoint is re-exported from @standardagents/spec above.\n// Users should import from spec. The builder wraps these at runtime via\n// createThreadEndpointHandler to provide the actual ThreadState.\n\n// Export builder-specific types as the default types for internal use\n// (these are what internal API files use when they import from this module)\nexport type { BuilderControllerContext as ControllerContext };\nexport type { BuilderController as Controller };\n\n// ============================================================================\n// Builder Controller Helpers\n// ============================================================================\n\n/**\n * Define a controller with typed Cloudflare environment bindings.\n *\n * This is the builder's version of defineController that provides\n * proper typing for AGENT_BUILDER_THREAD and other CF bindings.\n *\n * @example\n * ```typescript\n * import { defineController } from '../router/index.js';\n *\n * export default defineController(async ({ req, env }) => {\n * const stub = env.AGENT_BUILDER.get(env.AGENT_BUILDER.idFromName('singleton'));\n * // ...\n * });\n * ```\n */\nexport function defineController<Env extends ThreadEnv = ThreadEnv>(\n controller: BuilderController<Env>\n): BuilderController<Env> {\n return controller;\n}\n\n// ============================================================================\n// Router Implementation\n// ============================================================================\n\n// CORS headers for all responses\nconst CORS_HEADERS: Record<string, string> = {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, PATCH, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Authorization, X-Requested-With\",\n \"Access-Control-Max-Age\": \"86400\",\n};\n\n// Helper to create headers with CORS\nfunction corsHeaders(contentType: string): Record<string, string> {\n return {\n \"Content-Type\": contentType,\n ...CORS_HEADERS,\n };\n}\n\n// Helper to add CORS headers to any Response without touching the body\nfunction addCorsHeaders(response: Response): Response {\n // Skip WebSocket upgrade responses - they can't be wrapped\n if (response.status === 101) {\n return response;\n }\n\n // Skip if already has CORS headers\n if (response.headers.has(\"Access-Control-Allow-Origin\")) {\n return response;\n }\n\n // Create new headers with CORS added\n const newHeaders = new Headers(response.headers);\n for (const [key, value] of Object.entries(CORS_HEADERS)) {\n newHeaders.set(key, value);\n }\n\n // Return new Response with same body stream (not cloned, just transferred)\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: newHeaders,\n });\n}\n\nexport async function route<Env extends ThreadEnv = ThreadEnv>(\n url: URL,\n request: Request,\n env: Env\n): Promise<Response | null> {\n // Handle CORS preflight requests\n if (request.method === \"OPTIONS\") {\n return new Response(null, {\n status: 204,\n headers: CORS_HEADERS,\n });\n }\n\n const router = createRouter<() => Promise<SpecController>>();\n // @ts-ignore-next-line\n const routesLoader = await import(\"virtual:@standardagents-routes\");\n routesLoader.default(router);\n\n // Check for API routes first\n const route = findRoute<() => Promise<SpecController>>(\n router,\n request.method.toUpperCase(),\n url.pathname\n );\n\n if (route) {\n const controller = await route.data();\n const context: BuilderControllerContext<Env> = {\n req: request,\n params: route.params || {},\n env: env,\n url: url,\n };\n const result = await controller(context as SpecControllerContext);\n\n if (result instanceof Response) {\n return addCorsHeaders(result);\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: corsHeaders(\"text/plain\"),\n });\n }\n // JSON responses get CORS headers\n return new Response(JSON.stringify(result), {\n headers: corsHeaders(\"application/json\"),\n });\n }\n\n // No API route found - not handled by this router\n // Static assets and SPA routing are handled by the Cloudflare Workers Assets\n // binding that builder() injects through the generated Vite config.\n return null;\n}\n\n// ============================================================================\n// Thread Endpoint Runtime\n// ============================================================================\n\n/**\n * Runtime implementation for defineThreadEndpoint.\n *\n * This wraps the spec's defineThreadEndpoint to provide the actual\n * thread lookup and ThreadState creation at runtime.\n *\n * @param handler - Function that receives the request, ThreadState, and route params\n * @returns A Controller that can be used with the router\n *\n * @example\n * // agentbuilder/api/threads/[id]/status.get.ts\n * import { defineThreadEndpoint } from '@standardagents/spec';\n *\n * export default defineThreadEndpoint(async (req, state, params) => {\n * const { messages } = await state.getMessages({ limit: 1 });\n * return Response.json({ status: \"ok\", messageCount: messages.length, params });\n * });\n */\nexport function createThreadEndpointHandler<Env extends ThreadEnv = ThreadEnv>(\n handler: ThreadEndpointHandler\n): BuilderController<Env> {\n return (async ({ req, params, env }: BuilderControllerContext<Env>) => {\n const threadId = params.threadId ?? params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const metadata = await agentBuilder.getThread(threadId) as ThreadMetadata | null;\n\n if (!metadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Create ThreadInstance reference\n // Note: We can't access ctx and env directly, but we can call RPC methods\n const instance = stub as unknown as ThreadInstance;\n\n // Create ThreadState using the factory method (execution is null for endpoints)\n const threadState = ThreadStateImpl.fromThreadInstance(instance, metadata);\n\n const endpointParams: Record<string, string> = {};\n for (const [key, value] of Object.entries(params)) {\n if (key === \"threadId\" || (key === \"id\" && !params.threadId)) {\n continue;\n }\n endpointParams[key === \"_\" ? \"*\" : key] = value;\n }\n\n // Call handler with ThreadState per the spec\n return await handler(req, threadState, endpointParams);\n } catch (error: any) {\n console.error(`Error in thread endpoint for ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Internal server error\" },\n { status: 500 }\n );\n }\n }) as BuilderController<Env>;\n}\n","/**\n * Authentication utilities for user sessions, API keys, and password hashing\n */\n\n/**\n * Generate a cryptographically secure random string\n */\nexport function generateSecureToken(length: number = 32): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Generate a user session token with prefix\n */\nexport function generateUserToken(): string {\n return `agtuser_${generateSecureToken(32)}`;\n}\n\n/**\n * Generate an API key with prefix\n */\nexport function generateApiKey(): string {\n return `agtbldr_${generateSecureToken(32)}`;\n}\n\n/**\n * Hash a password using PBKDF2\n */\nexport async function hashPassword(password: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Generate a random salt\n const salt = crypto.getRandomValues(new Uint8Array(16));\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using PBKDF2\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n // Combine salt and hash\n const hashArray = new Uint8Array(derivedBits);\n const combined = new Uint8Array(salt.length + hashArray.length);\n combined.set(salt);\n combined.set(hashArray, salt.length);\n\n // Return as base64\n return bufferToBase64(combined);\n}\n\n/**\n * Verify a password against its hash\n */\nexport async function verifyPassword(password: string, hash: string): Promise<boolean> {\n try {\n const combined = base64ToBuffer(hash);\n\n // Extract salt and hash\n const salt = combined.slice(0, 16);\n const storedHash = combined.slice(16);\n\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using the same salt\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n const derivedHash = new Uint8Array(derivedBits);\n\n // Compare hashes\n if (derivedHash.length !== storedHash.length) {\n return false;\n }\n\n let matches = true;\n for (let i = 0; i < derivedHash.length; i++) {\n if (derivedHash[i] !== storedHash[i]) {\n matches = false;\n }\n }\n\n return matches;\n } catch (error) {\n console.error('Error verifying password:', error);\n return false;\n }\n}\n\n/**\n * Hash a token or API key using SHA-256\n */\nexport async function hashToken(token: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(token);\n\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n\n return Array.from(hashArray, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Extract the last N characters from a string\n */\nexport function getLastChars(str: string, count: number = 5): string {\n return str.slice(-count);\n}\n\n/**\n * Extract the prefix from a token (e.g., \"agtuser_\" or \"agtbldr_\")\n */\nexport function getTokenPrefix(token: string): string {\n const match = token.match(/^([^_]+_)/);\n return match ? match[1] : '';\n}\n\n/**\n * Validate token format\n */\nexport function isValidUserToken(token: string): boolean {\n return token.startsWith('agtuser_') && token.length > 10;\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: string): boolean {\n return key.startsWith('agtbldr_') && key.length > 10;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Sign a token payload using HMAC-SHA256 with the encryption key\n * Returns a signed token in the format: base64(payload).base64(signature)\n */\nexport async function signToken(payload: string, encryptionKey: string): Promise<string> {\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n // Sign the payload\n const payloadData = encoder.encode(payload);\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, payloadData);\n\n // Convert to base64\n const payloadB64 = bufferToBase64(new Uint8Array(payloadData));\n const signatureB64 = bufferToBase64(new Uint8Array(signature));\n\n return `${payloadB64}.${signatureB64}`;\n}\n\n/**\n * Verify a signed token and extract its payload\n * Returns the payload if valid, null if invalid\n */\nexport async function verifySignedToken(signedToken: string, encryptionKey: string): Promise<string | null> {\n try {\n const parts = signedToken.split('.');\n if (parts.length !== 2) {\n return null;\n }\n\n const [payloadB64, signatureB64] = parts;\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n );\n\n // Decode the payload and signature\n const payloadData = base64ToBuffer(payloadB64);\n const signature = base64ToBuffer(signatureB64);\n\n // Verify the signature\n const isValid = await crypto.subtle.verify('HMAC', cryptoKey, signature, payloadData);\n\n if (!isValid) {\n return null;\n }\n\n // Decode payload to string\n const decoder = new TextDecoder();\n return decoder.decode(payloadData);\n } catch (error) {\n console.error('Error verifying signed token:', error);\n return null;\n }\n}\n\n/**\n * Generate a signed super admin token\n * Payload format: super_admin:timestamp:nonce\n */\nexport async function generateSuperAdminToken(encryptionKey: string): Promise<string> {\n const timestamp = Date.now();\n const nonce = generateSecureToken(16);\n const payload = `super_admin:${timestamp}:${nonce}`;\n return await signToken(payload, encryptionKey);\n}\n\n/**\n * Verify a super admin token\n * Returns true if valid, false otherwise\n */\nexport async function verifySuperAdminToken(token: string, encryptionKey: string): Promise<boolean> {\n const payload = await verifySignedToken(token, encryptionKey);\n if (!payload) {\n return false;\n }\n\n // Check payload format\n const parts = payload.split(':');\n if (parts.length !== 3 || parts[0] !== 'super_admin') {\n return false;\n }\n\n // Optionally check timestamp for expiration (30 days)\n const timestamp = parseInt(parts[1], 10);\n const age = Date.now() - timestamp;\n const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n if (age > maxAge) {\n return false;\n }\n\n return true;\n}\n\n// Helper functions\nfunction bufferToBase64(buffer: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < buffer.byteLength; i++) {\n binary += String.fromCharCode(buffer[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBuffer(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Authentication middleware for protecting API routes\n *\n * Supports multiple authentication types:\n * - Super admin token (signed with ENCRYPTION_KEY)\n * - User session token (validated against DurableAgentBuilder)\n * - API key (validated against DurableAgentBuilder)\n */\n\nimport {\n verifySuperAdminToken,\n hashToken,\n isValidUserToken,\n isValidApiKey,\n} from '../utils/auth.js';\n\n// CORS headers for error responses\nconst CORS_HEADERS = {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, PATCH, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Authorization, X-Requested-With\",\n \"Access-Control-Max-Age\": \"86400\",\n};\n\nexport interface AuthUser {\n id: string;\n username: string;\n role: string;\n}\n\nexport interface AuthContext {\n user: AuthUser;\n authType: 'super_admin' | 'session' | 'api_key';\n}\n\n/**\n * Extract bearer token from Authorization header or query parameter (for WebSockets)\n */\nfunction extractBearerToken(request: Request): string | null {\n // First try Authorization header\n const authHeader = request.headers.get('Authorization');\n if (authHeader && authHeader.startsWith('Bearer ')) {\n return authHeader.substring(7);\n }\n\n // For WebSocket upgrade requests, check query parameter\n const isWebSocket =\n request.headers.get('upgrade')?.toLowerCase() === 'websocket';\n if (isWebSocket) {\n try {\n const url = new URL(request.url);\n const token = url.searchParams.get('token');\n if (token) {\n return token;\n }\n } catch (err) {\n // Invalid URL, continue\n }\n }\n\n return null;\n}\n\n/**\n * Get DurableAgentBuilder singleton stub\n */\nfunction getAgentBuilder(env: any): any {\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n return env.AGENT_BUILDER.get(agentBuilderId);\n}\n\n/**\n * Authenticate a request using various token types\n */\nexport async function authenticate(\n request: Request,\n env: any\n): Promise<AuthContext | null> {\n const token = extractBearerToken(request);\n\n if (!token) {\n return null;\n }\n\n // Check if it's a signed super admin token (if super admin is configured)\n if (env.SUPER_ADMIN_PASSWORD && env.ENCRYPTION_KEY) {\n // Token contains a dot, might be a signed token\n if (token.includes('.')) {\n const isValidSuperAdmin = await verifySuperAdminToken(\n token,\n env.ENCRYPTION_KEY\n );\n if (isValidSuperAdmin) {\n return {\n user: {\n id: 'super_admin',\n username: 'admin',\n role: 'admin',\n },\n authType: 'super_admin',\n };\n }\n }\n }\n\n // Check if it's a user session token\n if (isValidUserToken(token)) {\n const tokenHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const session = await agentBuilder.validateSession(tokenHash);\n if (session) {\n // Get user details\n const user = await agentBuilder.getUserById(session.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'session',\n };\n }\n }\n }\n\n // Check if it's an API key\n if (isValidApiKey(token)) {\n const keyHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const apiKey = await agentBuilder.validateApiKey(keyHash);\n if (apiKey) {\n // Get user details\n const user = await agentBuilder.getUserById(apiKey.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'api_key',\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Middleware to require authentication\n * Returns 401 if not authenticated\n */\nexport async function requireAuth(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const authContext = await authenticate(request, env);\n\n if (!authContext) {\n return new Response(JSON.stringify({ error: 'Unauthorized' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json', ...CORS_HEADERS },\n });\n }\n\n return authContext;\n}\n\n/**\n * Middleware to require admin role\n * Returns 401 if not authenticated, 403 if not admin\n */\nexport async function requireAdmin(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const result = await requireAuth(request, env);\n\n if (result instanceof Response) {\n return result;\n }\n\n if (result.user.role !== 'admin') {\n return new Response(\n JSON.stringify({ error: 'Forbidden: Admin access required' }),\n {\n status: 403,\n headers: { 'Content-Type': 'application/json', ...CORS_HEADERS },\n }\n );\n }\n\n return result;\n}\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 1,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Metadata table for tracking schema version\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS _metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )\n `);\n\n await sql.exec(`\n INSERT OR IGNORE INTO _metadata (key, value) VALUES ('schema_version', '1')\n `);\n\n // Messages table - OpenAI chat completion format\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS messages (\n id TEXT PRIMARY KEY,\n role TEXT NOT NULL CHECK(role IN ('system', 'user', 'assistant', 'tool')),\n content TEXT,\n name TEXT,\n tool_calls TEXT,\n tool_call_id TEXT,\n created_at INTEGER NOT NULL\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_created_at ON messages(created_at)\n `);\n\n // Tool calls table - detailed breakdown of function calls\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS tool_calls (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n type TEXT NOT NULL DEFAULT 'function',\n function_name TEXT NOT NULL,\n function_arguments TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_tool_calls_message_id ON tool_calls(message_id)\n `);\n\n // Logs table - pure telemetry, ephemeral, can be truncated anytime\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS logs (\n id TEXT PRIMARY KEY,\n message_id TEXT NOT NULL,\n\n -- Request details\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n endpoint TEXT,\n request_body TEXT,\n request_headers TEXT,\n\n -- Response details\n response_body TEXT,\n response_headers TEXT,\n status_code INTEGER,\n\n -- Token usage\n input_tokens INTEGER,\n cached_tokens INTEGER,\n output_tokens INTEGER,\n total_tokens INTEGER,\n\n -- Performance metrics\n latency_ms INTEGER,\n time_to_first_token_ms INTEGER,\n\n -- Result metadata\n finish_reason TEXT,\n error TEXT,\n error_type TEXT,\n\n -- Cost tracking\n cost_input REAL,\n cost_output REAL,\n cost_total REAL,\n\n -- Context\n message_history_length INTEGER,\n tools_available INTEGER,\n\n created_at INTEGER NOT NULL,\n\n FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_message_id ON logs(message_id)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_created_at ON logs(created_at)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_provider ON logs(provider)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_model ON logs(model)\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_error ON logs(error) WHERE error IS NOT NULL\n `);\n\n // Execution state table - stores runtime state for thread execution\n // Used to track turn count, current side, stopped status, etc.\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS execution_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )\n `);\n\n // Initialize execution state with default values\n await sql.exec(`\n INSERT OR IGNORE INTO execution_state (key, value) VALUES\n ('turn_count', '0'),\n ('current_side', 'a'),\n ('stopped', 'false'),\n ('stopped_by', '')\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 2,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add prompt_name and tools_called columns to logs table\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN prompt_name TEXT\n `);\n\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tools_called TEXT\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '2' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 3,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add parent_log_id for tracking prompt call chains\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN parent_log_id TEXT\n `);\n\n // Add index for parent_log_id lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_parent_log_id ON logs(parent_log_id)\n `);\n\n // Add model_name (human-readable name from models table)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN model_name TEXT\n `);\n\n // Add tools_schema (JSON of tools available during request)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tools_schema TEXT\n `);\n\n // Add message_history (snapshot of history sent with request)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN message_history TEXT\n `);\n\n // Add system_prompt (actual system prompt sent)\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN system_prompt TEXT\n `);\n\n // Add is_complete flag for incremental loading\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN is_complete INTEGER DEFAULT 0\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '3' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 4,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_tokens for tracking GPT-5 and other model reasoning tokens\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN reasoning_tokens INTEGER DEFAULT 0\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '4' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 5,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_content column to store reasoning output separately from regular content\n // This is for models like o1 that generate reasoning that should not be displayed\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN reasoning_content TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '5' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 6,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add log_id column to messages table to track which log produced the message\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN log_id TEXT\n `);\n\n // Create index for efficient lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_log_id ON messages(log_id) WHERE log_id IS NOT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '6' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 7,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add errors column to track multiple errors on a single log\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN errors TEXT\n `);\n\n // Add retry_of_log_id to track retry relationships\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN retry_of_log_id TEXT\n `);\n\n // Add index for retry lookups\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_retry_of ON logs(retry_of_log_id) WHERE retry_of_log_id IS NOT NULL\n `);\n\n // Migrate existing error data to new errors array format\n await sql.exec(`\n UPDATE logs\n SET errors = json_array(json_object(\n 'message', error,\n 'type', error_type,\n 'timestamp', created_at\n ))\n WHERE error IS NOT NULL AND errors IS NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '7' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 8,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add tool_results column to track tool execution results\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN tool_results TEXT\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '8' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 8,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add request_sent_at: When the LLM request was initiated\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN request_sent_at INTEGER\n `);\n\n // Add response_completed_at: When the response was fully received\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN response_completed_at INTEGER\n `);\n\n // Add status to track message state (pending, completed, failed)\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN status TEXT DEFAULT 'completed'\n CHECK(status IN ('pending', 'completed', 'failed'))\n `);\n\n // Backfill existing messages with completed status and set timestamps equal to created_at\n await sql.exec(`\n UPDATE messages\n SET\n status = 'completed',\n request_sent_at = created_at,\n response_completed_at = created_at\n WHERE status IS NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '8' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 10,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Alarm queue table - manages scheduled method invocations\n // Only one alarm can be active per Durable Object, so this queue\n // ensures sequential processing of all pending invocations\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS alarm_queue (\n id TEXT PRIMARY KEY,\n method TEXT NOT NULL,\n args TEXT NOT NULL,\n scheduled_at INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'processing', 'completed', 'failed')),\n attempts INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n completed_at INTEGER\n )\n `);\n\n // Index for finding the next item to process\n // Partial index only on pending items for better performance\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_next\n ON alarm_queue(scheduled_at, status)\n WHERE status = 'pending'\n `);\n\n // Index for cleanup of old failed items\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_cleanup\n ON alarm_queue(completed_at)\n WHERE status = 'failed'\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '10' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 11,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add silent column to messages table\n // Silent messages are not sent to the LLM but are visible in the UI\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN silent INTEGER NOT NULL DEFAULT 0\n CHECK(silent IN (0, 1))\n `);\n\n // Backfill existing messages as non-silent\n await sql.exec(`\n UPDATE messages SET silent = 0 WHERE silent IS NULL\n `);\n\n // Create index for filtering silent messages\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_silent ON messages(silent)\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '11' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 12,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Drop message_history column - it's redundant with request_body.messages\n // This reduces row size and prevents SQLITE_TOOBIG errors\n await sql.exec(`\n ALTER TABLE logs DROP COLUMN message_history\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '12' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 13,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add tool_status column to messages table\n // tool_status indicates success or error for tool execution results (role='tool' messages only)\n // Defaults to 'success' for new tool messages\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN tool_status TEXT\n CHECK(tool_status IS NULL OR tool_status IN ('success', 'error'))\n `);\n\n // Backfill existing tool messages:\n // - Messages with content starting with \"Error: \" are marked as 'error'\n // - All other tool messages are marked as 'success'\n // - Non-tool messages remain NULL\n await sql.exec(`\n UPDATE messages\n SET tool_status = CASE\n WHEN role = 'tool' AND content LIKE 'Error: %' THEN 'error'\n WHEN role = 'tool' THEN 'success'\n ELSE NULL\n END\n WHERE role = 'tool'\n `);\n\n // Create index for filtering by tool_status\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_tool_status ON messages(tool_status)\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '13' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 14,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add parent_id column to messages table\n // parent_id links sub-prompt messages to their parent tool execution message\n // NULL for top-level messages, set to message.id for sub-messages\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN parent_id TEXT\n `);\n\n // Add depth column to messages table\n // depth indicates nesting level: 0 for top-level, 1 for first-level sub-prompts, etc.\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN depth INTEGER NOT NULL DEFAULT 0\n `);\n\n // Create index for querying message hierarchies\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_parent_id ON messages(parent_id)\n `);\n\n // Create index for depth-based filtering (WebSocket and API queries)\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_depth ON messages(depth)\n `);\n\n // Backfill existing messages:\n // All existing messages are top-level (no parent), so depth=0 and parent_id=NULL\n // The DEFAULT 0 on depth handles this automatically\n // parent_id defaults to NULL (no ALTER needed)\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '14' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 15,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_content column to messages table to store reasoning output\n // This allows us to include reasoning in message history when needed\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN reasoning_content TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '15' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 16,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add reasoning_details column to messages table to store structured reasoning\n // This is the OpenRouter reasoning_details array format (not just text content)\n // Contains objects with type: \"reasoning.summary\" | \"reasoning.encrypted\" | \"reasoning.text\"\n // Required for proper reasoning preservation in multi-turn conversations\n // See: https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN reasoning_details TEXT NULL\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '16' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 17,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // S3-style file storage (path as key, no chunking needed - 2MB fits in single row)\n // Supports any file type via MIME type, with special handling for:\n // - Text files: stored in `content` column for FTS searchability\n // - Binary files: stored in `data` column as BLOB\n // - External files: referenced via storage + location columns\n await sql.exec(`\n CREATE TABLE files (\n path TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n mime_type TEXT NOT NULL,\n\n -- Storage backend: 'local' | 'url' | 's3' | 'r2'\n storage TEXT NOT NULL DEFAULT 'local',\n -- External reference: URL, s3://bucket/key, r2://bucket/key\n location TEXT,\n\n -- Local storage (NULL if external)\n data BLOB,\n content TEXT,\n\n size INTEGER NOT NULL DEFAULT 0,\n metadata TEXT,\n thumbnail BLOB,\n is_directory INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL\n )\n `);\n\n // Full-text search for text files (SQLite FTS5)\n // Enables grep-like searching across text file contents\n await sql.exec(`\n CREATE VIRTUAL TABLE files_fts USING fts5(\n path,\n name,\n content,\n content='files',\n content_rowid='rowid'\n )\n `);\n\n // Triggers to keep FTS index in sync with files table\n await sql.exec(`\n CREATE TRIGGER files_ai AFTER INSERT ON files BEGIN\n INSERT INTO files_fts(rowid, path, name, content)\n VALUES (new.rowid, new.path, new.name, new.content);\n END\n `);\n\n await sql.exec(`\n CREATE TRIGGER files_ad AFTER DELETE ON files BEGIN\n INSERT INTO files_fts(files_fts, rowid, path, name, content)\n VALUES('delete', old.rowid, old.path, old.name, old.content);\n END\n `);\n\n await sql.exec(`\n CREATE TRIGGER files_au AFTER UPDATE ON files BEGIN\n INSERT INTO files_fts(files_fts, rowid, path, name, content)\n VALUES('delete', old.rowid, old.path, old.name, old.content);\n INSERT INTO files_fts(rowid, path, name, content)\n VALUES (new.rowid, new.path, new.name, new.content);\n END\n `);\n\n // Space tracking (inspired by DOFS)\n await sql.exec(`\n CREATE TABLE file_stats (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n total_size INTEGER DEFAULT 0,\n file_count INTEGER DEFAULT 0\n )\n `);\n\n await sql.exec(`\n INSERT INTO file_stats (id, total_size, file_count) VALUES (1, 0, 0)\n `);\n\n // Add attachments column to messages for file references\n // JSON array of AttachmentRef objects\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN attachments TEXT\n `);\n\n // Indexes for listing and prefix queries\n await sql.exec(`\n CREATE INDEX idx_files_created_at ON files(created_at)\n `);\n\n await sql.exec(`\n CREATE INDEX idx_files_mime_type ON files(mime_type)\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '17' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 18,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add width/height columns for images\n // These are populated when storing processed images\n await sql.exec(`ALTER TABLE files ADD COLUMN width INTEGER`);\n await sql.exec(`ALTER TABLE files ADD COLUMN height INTEGER`);\n\n // Update schema version\n await sql.exec(`UPDATE _metadata SET value = '18' WHERE key = 'schema_version'`);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 19,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add chunked storage support for large files (> 1.75MB)\n // Chunks are stored separately to stay under 2MB row limit\n\n // Create file_chunks table for storing large file data\n await sql.exec(`\n CREATE TABLE file_chunks (\n file_path TEXT NOT NULL,\n chunk_index INTEGER NOT NULL,\n data BLOB NOT NULL,\n PRIMARY KEY (file_path, chunk_index),\n FOREIGN KEY (file_path) REFERENCES files(path) ON DELETE CASCADE\n )\n `);\n\n // Index for efficient chunk retrieval\n await sql.exec(`CREATE INDEX idx_file_chunks_path ON file_chunks(file_path)`);\n\n // Add chunking columns to files table\n await sql.exec(`ALTER TABLE files ADD COLUMN is_chunked INTEGER DEFAULT 0`);\n await sql.exec(`ALTER TABLE files ADD COLUMN chunk_count INTEGER`);\n\n // Update schema version\n await sql.exec(`UPDATE _metadata SET value = '19' WHERE key = 'schema_version'`);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\n/**\n * Migration 020: Add provider_tools column to logs table\n *\n * Adds a JSON column to track provider-executed tool calls (web_search, image_generation, etc.)\n * These are tools executed by the LLM provider rather than locally.\n */\nexport const migration = {\n version: 20,\n name: \"add_provider_tools\",\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Check if column already exists before adding\n const tableInfo = sql.exec(`PRAGMA table_info(logs)`).toArray();\n const hasProviderTools = tableInfo.some((col: any) => col.name === 'provider_tools');\n\n if (!hasProviderTools) {\n // Add provider_tools column - TEXT to store JSON array of provider tool calls\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN provider_tools TEXT;\n `);\n }\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\n/**\n * Migration 021: Add actual_provider column to logs table\n *\n * Tracks the actual provider that handled an OpenRouter request (e.g., \"Infermatic\", \"Together\")\n * separate from the SDK provider name (e.g., \"openrouter\").\n */\nexport const migration = {\n version: 21,\n name: \"add_actual_provider\",\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Check if column already exists before adding\n const tableInfo = sql.exec(`PRAGMA table_info(logs)`).toArray();\n const hasActualProvider = tableInfo.some((col: any) => col.name === 'actual_provider');\n\n if (!hasActualProvider) {\n // Add actual_provider column - TEXT to store the actual provider name from OpenRouter\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN actual_provider TEXT;\n `);\n\n // Add index for filtering by actual_provider\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_actual_provider ON logs(actual_provider) WHERE actual_provider IS NOT NULL;\n `);\n }\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 22,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add prompt column to messages table\n // This tracks which prompt was active when the message was created\n // Uses the last prompt in promptPath (e.g., \"kids_buddy\", \"customer_service\")\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN prompt TEXT\n `);\n\n // Create index for filtering by prompt\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_prompt ON messages(prompt)\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '22' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 23,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Add queued_tools column to messages table\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN queued_tools TEXT\n `);\n\n // Add queued_tools column to logs table\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN queued_tools TEXT\n `);\n\n // Update schema version\n await sql.exec(`\n UPDATE _metadata SET value = '23' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 24,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // Queue for deferred message delivery across turns and object hibernation.\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS message_queue (\n id TEXT PRIMARY KEY,\n role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),\n content TEXT NOT NULL,\n attachments TEXT,\n silent INTEGER NOT NULL DEFAULT 0,\n metadata TEXT,\n created_at INTEGER NOT NULL\n )\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_message_queue_created_at\n ON message_queue(created_at)\n `);\n\n // Thread lifecycle/subagent registry state.\n await sql.exec(`\n INSERT OR IGNORE INTO execution_state (key, value) VALUES\n ('terminated', ''),\n ('children_registry', '[]')\n `);\n\n // Keep metadata version in sync.\n await sql.exec(`\n UPDATE _metadata SET value = '24' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 25,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN metadata TEXT\n `);\n\n await sql.exec(`\n ALTER TABLE messages ADD COLUMN subagent_id TEXT\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_messages_subagent_id_created_at\n ON messages(subagent_id, created_at)\n `);\n\n await sql.exec(`\n UPDATE _metadata SET value = '25' WHERE key = 'schema_version'\n `);\n },\n};\n\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 26,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n await sql.exec(`\n CREATE TABLE IF NOT EXISTS thread_values (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `);\n\n await sql.exec(`\n UPDATE _metadata SET value = '26' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 27,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n await sql.exec(`\n ALTER TABLE alarm_queue ADD COLUMN manual_run INTEGER NOT NULL DEFAULT 0\n `);\n\n await sql.exec(`\n ALTER TABLE alarm_queue ADD COLUMN manual_run_at INTEGER\n `);\n\n await sql.exec(`\n ALTER TABLE alarm_queue ADD COLUMN replayed_from TEXT\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_replayed_from\n ON alarm_queue(replayed_from)\n WHERE replayed_from IS NOT NULL\n `);\n\n await sql.exec(`\n UPDATE _metadata SET value = '27' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 28,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n // SQLite CHECK constraints cannot be altered in place. Rebuild the alarm\n // queue so canceled effect runs can be retained as historical rows.\n await sql.exec(`\n ALTER TABLE alarm_queue RENAME TO alarm_queue_old_status\n `);\n\n await sql.exec(`\n CREATE TABLE alarm_queue (\n id TEXT PRIMARY KEY,\n method TEXT NOT NULL,\n args TEXT NOT NULL,\n scheduled_at INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending'\n CHECK(status IN ('pending', 'processing', 'completed', 'failed', 'agent_canceled', 'user_canceled')),\n attempts INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n completed_at INTEGER,\n manual_run INTEGER NOT NULL DEFAULT 0,\n manual_run_at INTEGER,\n replayed_from TEXT\n )\n `);\n\n await sql.exec(`\n INSERT INTO alarm_queue (\n id,\n method,\n args,\n scheduled_at,\n created_at,\n status,\n attempts,\n error,\n completed_at,\n manual_run,\n manual_run_at,\n replayed_from\n )\n SELECT\n id,\n method,\n args,\n scheduled_at,\n created_at,\n status,\n attempts,\n error,\n completed_at,\n manual_run,\n manual_run_at,\n replayed_from\n FROM alarm_queue_old_status\n `);\n\n await sql.exec(`DROP TABLE alarm_queue_old_status`);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_next\n ON alarm_queue(scheduled_at, status)\n WHERE status = 'pending'\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_cleanup\n ON alarm_queue(completed_at)\n WHERE status = 'failed'\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_replayed_from\n ON alarm_queue(replayed_from)\n WHERE replayed_from IS NOT NULL\n `);\n\n await sql.exec(`\n UPDATE _metadata SET value = '28' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\nexport const migration = {\n version: 29,\n async up(sql: DurableObjectStorage[\"sql\"]) {\n await sql.exec(`\n ALTER TABLE alarm_queue ADD COLUMN source_log_id TEXT\n `);\n\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_alarm_queue_source_log\n ON alarm_queue(source_log_id)\n WHERE source_log_id IS NOT NULL\n `);\n\n await sql.exec(`\n UPDATE _metadata SET value = '29' WHERE key = 'schema_version'\n `);\n },\n};\n","import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\n/**\n * Migration 030: Add explicit Standard Agents router attribution to LLM logs.\n */\nexport const migration = {\n version: 30,\n name: \"add_standard_agents_router_used\",\n async up(sql: DurableObjectStorage[\"sql\"]) {\n const tableInfo = sql.exec(`PRAGMA table_info(logs)`).toArray();\n const hasRouterUsed = tableInfo.some((col: any) => col.name === \"standard_agents_router_used\");\n\n if (!hasRouterUsed) {\n await sql.exec(`\n ALTER TABLE logs ADD COLUMN standard_agents_router_used INTEGER NOT NULL DEFAULT 0;\n `);\n await sql.exec(`\n CREATE INDEX IF NOT EXISTS idx_logs_standard_agents_router_used\n ON logs(standard_agents_router_used);\n `);\n }\n },\n};\n","import { migration as m001 } from \"./001_initial\";\nimport { migration as m002 } from \"./002_add_prompt_and_tools_to_logs\";\nimport { migration as m003 } from \"./003_add_log_context_and_parent\";\nimport { migration as m004 } from \"./004_add_reasoning_tokens\";\nimport { migration as m005 } from \"./005_add_reasoning_content\";\nimport { migration as m006 } from \"./006_add_log_id_to_messages\";\nimport { migration as m007 } from \"./007_add_errors_and_retry_tracking\";\nimport { migration as m008 } from \"./008_add_tool_results\";\nimport { migration as m009 } from \"./009_add_request_response_timestamps\";\nimport { migration as m010 } from \"./010_add_alarm_queue\";\nimport { migration as m011 } from \"./011_add_silent_messages\";\nimport { migration as m012 } from \"./012_remove_message_history\";\nimport { migration as m013 } from \"./013_add_tool_status\";\nimport { migration as m014 } from \"./014_add_parent_id_and_depth\";\nimport { migration as m015 } from \"./015_add_reasoning_to_messages\";\nimport { migration as m016 } from \"./016_add_reasoning_details\";\nimport { migration as m017 } from \"./017_add_files\";\nimport { migration as m018 } from \"./018_add_image_dimensions\";\nimport { migration as m019 } from \"./019_add_file_chunks\";\nimport { migration as m020 } from \"./020_add_provider_tools\";\nimport { migration as m021 } from \"./021_add_actual_provider\";\nimport { migration as m022 } from \"./022_add_prompt_to_messages\";\nimport { migration as m023 } from \"./023_add_queued_tools\";\nimport { migration as m024 } from \"./024_add_message_queue_and_termination\";\nimport { migration as m025 } from \"./025_add_message_metadata_and_subagent_id\";\nimport { migration as m026 } from \"./026_add_thread_values\";\nimport { migration as m027 } from \"./027_add_effect_run_metadata\";\nimport { migration as m028 } from \"./028_add_effect_canceled_statuses\";\nimport { migration as m029 } from \"./029_add_effect_source_log\";\nimport { migration as m030 } from \"./030_add_standard_agents_router_used\";\n\nexport const migrations = [m001, m002, m003, m004, m005, m006, m007, m008, m009, m010, m011, m012, m013, m014, m015, m016, m017, m018, m019, m020, m021, m022, m023, m024, m025, m026, m027, m028, m029, m030];\n\nexport const LATEST_SCHEMA_VERSION = migrations.length;\n","import { DurableObject } from \"cloudflare:workers\";\nimport { migrations, LATEST_SCHEMA_VERSION } from \"./migrations/index.js\";\nimport type {\n Agent,\n FlowResult,\n Message,\n TelemetryEvent,\n ThreadMetadata,\n} from \"../agents/types.js\";\nimport { TIMESTAMP_MULTIPLIER } from \"../agents/types.js\";\nimport {\n AlarmQueue,\n type EffectCancelSource,\n type EffectRunActionResult,\n type EffectRunListOptions,\n type EffectRunListResult,\n} from \"./utils/AlarmQueue.js\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport { StreamManager } from \"../agents/StreamManager.js\";\nimport { createNamespaceContext, parseQualifiedName, isQualifiedName } from \"../packing/resolver.js\";\nimport type {\n AttachmentRef,\n CodeExecutionOptions,\n CodeExecutionResult,\n InjectMessageInput,\n QueueMessageInput,\n SubagentRegistryEntry,\n} from \"@standardagents/spec\";\nimport { getResolvedSessionBindingsFromSide } from \"../agents/sessionTools.js\";\nimport {\n handleCodeExecutionBridgeRequest,\n isCodeExecutionBridgeRequest,\n type CodeExecutionBridgeRegistration,\n} from \"../agents/code-execution.js\";\n\ntype SubagentMessageProjection = {\n subagent_name: string | null;\n subagent_title: string | null;\n subagent_description: string | null;\n subagent_status: string | null;\n subagent_resumable: boolean | null;\n subagent_blocking: boolean | null;\n subagent_thread_name: string | null;\n subagent_spawn_group_id: string | null;\n};\n\ntype ThreadEndpointCodeOptions = Pick<\n CodeExecutionOptions,\n \"language\" | \"filename\" | \"execute\" | \"modules\" | \"memoryLimitBytes\"\n>;\n\nconst RUNTIME_STORAGE_PREFIX = \"__agentbuilder_runtime_storage__:\";\n\nfunction normalizeEndpointThreadPath(path: string): string {\n if (!path || /^[A-Za-z][A-Za-z\\d+\\-.]*:/.test(path)) {\n throw new Error(\"Use a relative thread filesystem path\");\n }\n const parts: string[] = [];\n for (const part of path.replace(/\\\\/g, \"/\").split(\"/\")) {\n if (!part || part === \".\") continue;\n if (part === \"..\") {\n if (parts.length === 0) throw new Error(\"Path cannot escape the thread filesystem root\");\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return `/${parts.join(\"/\")}`;\n}\n\nfunction normalizeEndpointFetchBody(body: unknown): BodyInit | undefined {\n if (body === undefined || body === null) return undefined;\n if (typeof body === \"string\") return body;\n if (body instanceof ArrayBuffer) return body;\n if (ArrayBuffer.isView(body)) {\n const bytes = new Uint8Array(body.buffer, body.byteOffset, body.byteLength);\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n }\n throw new Error(\"fetch body must be a string, ArrayBuffer, or typed array\");\n}\n\nfunction createEndpointFetchBridge() {\n const bridgedFetch = async (input: string, init?: Omit<RequestInit, \"body\"> & { body?: unknown }) => {\n const parsed = new URL(input);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Only http and https URLs are allowed\");\n }\n\n const { body: rawBody, ...restInit } = init ?? {};\n const requestInit: RequestInit = { ...restInit };\n const body = normalizeEndpointFetchBody(rawBody);\n if (body !== undefined) {\n (requestInit as { body?: BodyInit }).body = body;\n }\n\n const response = await fetch(parsed.toString(), requestInit);\n return {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers: Object.fromEntries(response.headers.entries()),\n body: await response.arrayBuffer(),\n };\n };\n\n return { __fetch: bridgedFetch };\n}\n\nfunction createEndpointFsBridge(state: any) {\n const decoder = new TextDecoder();\n return {\n readFile: async (path: string) => {\n const data = await state.readFile(normalizeEndpointThreadPath(path));\n return data ? decoder.decode(data) : null;\n },\n writeFile: async (path: string, content: string, mimeType = \"text/plain\") => {\n return state.writeFile(normalizeEndpointThreadPath(path), content, mimeType);\n },\n };\n}\n\nfunction normalizeRuntimeStorageKey(key: string): string {\n if (typeof key !== \"string\" || key.length === 0) {\n throw new Error(\"storage key must be a non-empty string\");\n }\n if (/[\\u0000-\\u001f]/.test(key)) {\n throw new Error(\"storage key cannot contain control characters\");\n }\n return `${RUNTIME_STORAGE_PREFIX}${key}`;\n}\n\nfunction createEndpointStorageBridge(state: any) {\n return {\n storage: {\n get: async (key: string) => state.getValue(normalizeRuntimeStorageKey(key)),\n set: async (key: string, value: unknown) => {\n await state.setValue(normalizeRuntimeStorageKey(key), value);\n return true;\n },\n delete: async (key: string) => {\n await state.setValue(normalizeRuntimeStorageKey(key), null);\n return true;\n },\n has: async (key: string) => (await state.getValue(normalizeRuntimeStorageKey(key))) !== null,\n },\n };\n}\n\nfunction createEndpointThreadStateBridge(state: any) {\n return {\n threadId: state.threadId,\n agentId: state.agentId,\n userId: state.userId ?? null,\n createdAt: state.createdAt ?? null,\n terminated: state.terminated ?? null,\n getMessages: (options?: any) => state.getMessages(options),\n getMessage: (messageId: string) => state.getMessage(messageId),\n injectMessage: (message: any) => state.injectMessage(message),\n updateMessage: (messageId: string, updates: any) => state.updateMessage(messageId, updates),\n deleteMessage: (messageId: string) => state.deleteMessage(messageId),\n queueMessage: (message: any) => state.queueMessage(message),\n env: (propertyName: string) => state.env(propertyName),\n envType: (propertyName: string) => state.envType(propertyName),\n setEnv: (propertyName: string, value: string, options?: any) => state.setEnv(propertyName, value, options),\n notifyParent: (content: string) => state.notifyParent(content),\n setStatus: (status: string) => state.setStatus(status),\n queueTool: (toolName: string, args: Record<string, unknown>) => state.queueTool(toolName, args),\n invokeTool: (toolName: string, args: Record<string, unknown>) => state.invokeTool(toolName, args),\n scheduleEffect: (name: string, args: Record<string, unknown>, delay?: number) => state.scheduleEffect(name, args, delay),\n getScheduledEffects: (name?: string) => state.getScheduledEffects(name),\n removeScheduledEffect: (id: string) => state.removeScheduledEffect(id),\n runCode: async (source: string, options?: CodeExecutionOptions) => {\n const run = state.runCode(source, options);\n const timeout = setTimeout(() => {\n run.terminate(\"Endpoint nested code exceeded the 10s execution budget\");\n }, 10_000);\n try {\n return await run;\n } finally {\n clearTimeout(timeout);\n }\n },\n runAgent: (agentName: string) => state.runAgent(agentName),\n terminate: () => state.terminate(),\n emit: (event: string, data: unknown) => state.emit(event, data),\n getValue: (key: string) => state.getValue(key),\n setValue: (key: string, value: unknown) => state.setValue(key, value),\n readFile: (path: string) => state.readFile(normalizeEndpointThreadPath(path)),\n writeFile: (path: string, data: ArrayBuffer | string, mimeType = \"application/octet-stream\", options?: any) => {\n return state.writeFile(normalizeEndpointThreadPath(path), data, mimeType, options);\n },\n statFile: (path: string) => state.statFile(normalizeEndpointThreadPath(path)),\n readdirFile: (path: string) => state.readdirFile(normalizeEndpointThreadPath(path)),\n unlinkFile: (path: string) => state.unlinkFile(normalizeEndpointThreadPath(path)),\n mkdirFile: (path: string) => state.mkdirFile(normalizeEndpointThreadPath(path)),\n rmdirFile: (path: string) => state.rmdirFile(normalizeEndpointThreadPath(path)),\n getFileStats: () => state.getFileStats(),\n grepFiles: (pattern: string) => state.grepFiles(pattern),\n findFiles: (pattern: string) => state.findFiles(pattern),\n getFileThumbnail: (path: string) => state.getFileThumbnail(normalizeEndpointThreadPath(path)),\n };\n}\n\nexport class DurableThread<Env extends ThreadEnv = ThreadEnv> extends DurableObject<Env> {\n private migratedToVersion: number | null = null;\n private logSockets: Set<WebSocket> = new Set();\n private messageSockets: Set<WebSocket> = new Set();\n private alarmQueue: AlarmQueue;\n private alarmQueueRearmed = false;\n private currentAbortController: AbortController | null = null;\n private isExecuting = false;\n private codeExecutionBridges: Map<string, CodeExecutionBridgeRegistration> = new Map();\n\n constructor(ctx: DurableObjectState, env: Env) {\n super(ctx, env);\n\n // Initialize alarm queue\n this.alarmQueue = new AlarmQueue(ctx);\n\n // Set up the executor to dispatch queued methods\n this.alarmQueue.setExecutor(\n async (method: string, args: Record<string, any>, itemId?: string) => {\n switch (method) {\n case \"executeFlow\":\n await this.executeFlow(\n args.threadId,\n args.agentId,\n args.initial_messages,\n args.data,\n args.awaitCompletion ?? true\n );\n break;\n case \"processMessage\":\n await this.processMessage(\n args.threadId,\n args.content,\n args.role,\n args.attachments,\n args.messageId,\n args.queuedAt\n );\n break;\n case \"testOperation\":\n await this.testOperation(args.id, args.label, args.expectedOrder);\n break;\n case \"runEffect\":\n await this.executeEffect(args.effectName, args.effectArgs, args.threadId, itemId);\n break;\n case \"continueExecution\":\n await this.doContinueExecution(args.threadId, args.side);\n break;\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n }\n );\n\n // Restore WebSocket connections after hibernation\n // This is called whenever the Durable Object wakes up from hibernation\n const sockets = ctx.getWebSockets();\n for (const ws of sockets) {\n const attachment = ws.deserializeAttachment();\n if (attachment?.type === \"log\") {\n this.logSockets.add(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.add(ws);\n }\n }\n }\n\n /**\n * Returns the tools registry for this thread.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of tool name to tool loader function\n *\n * @example\n * ```typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * ```\n */\n tools(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.tools() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the hooks registry for this thread.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of hook name to hook loader function\n *\n * @example\n * ```typescript\n * import { DurableThread } from 'virtual:@standardagents/builder'\n *\n * export class Thread extends DurableThread {}\n * ```\n */\n hooks(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.hooks() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the models registry for lazy-loading model definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of model name to model loader function\n */\n models(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.models() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the prompts registry for lazy-loading prompt definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of prompt name to prompt loader function\n */\n prompts(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.prompts() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the agents registry for lazy-loading agent definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of agent name to agent loader function\n */\n agents(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.agents() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the effects registry for lazy-loading effect definitions.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * Effects are scheduled operations that run outside the tool execution context,\n * ideal for delayed notifications, webhooks, and cleanup tasks.\n *\n * @throws Error if not implemented in a subclass\n * @returns Record of effect name to effect loader function\n */\n effects(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableThread.effects() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n /**\n * Returns the namespaced registry for packed agent support.\n * This method is implemented when you import DurableThread from 'virtual:@standardagents/builder'.\n *\n * @throws Error if not implemented in a subclass\n * @returns The namespaced registry with global and packages namespaces\n */\n registry(): any {\n throw new Error(\n 'DurableThread.registry() must be implemented. ' +\n 'Import DurableThread from \\'virtual:@standardagents/builder\\' instead of \\'@standardagents/builder/runtime\\':\\n\\n' +\n 'import { DurableThread } from \\'virtual:@standardagents/builder\\'\\n\\n' +\n 'export class Thread extends DurableThread {}\\n'\n );\n }\n\n // ============================================================\n // Lookup Methods (for use by FlowEngine/ToolExecutor)\n // ============================================================\n\n /**\n * Load a model definition by name.\n * Supports both global models and packed models (e.g., \"packageId/modelName\").\n * For scoped packages, use \"@scope/pkg/modelName\".\n * For packed context, tries package first then falls back to global.\n */\n async loadModel(name: string): Promise<any> {\n // Check if this is a properly qualified name (scoped packages need 2+ slashes)\n if (isQualifiedName(name)) {\n const [packageId, modelName] = parseQualifiedName(name);\n const reg = this.registry();\n\n if (reg?.packages && packageId) {\n const pkg = reg.packages[packageId];\n if (pkg) {\n // Try package first\n if (pkg.models?.[modelName]) {\n return await pkg.models[modelName]();\n }\n\n // Fall back to global for packed models (using short name)\n const globalRegistry = this.models();\n const globalLoader = globalRegistry[modelName];\n if (globalLoader) {\n console.log(`[loadModel] Packed model \"${modelName}\" not in package, using global fallback`);\n return await globalLoader();\n }\n\n throw new Error(`Model not found: ${name}. Model \"${modelName}\" not found in package \"${packageId}\" or global namespace.`);\n }\n }\n\n // Package not found — name contains a slash but isn't a packed reference\n // (e.g., \"google/gemini-2.5-flash\" is a global model with a slash in its name)\n const globalRegistry = this.models();\n const globalLoader = globalRegistry[name];\n if (globalLoader) {\n return await globalLoader();\n }\n\n throw new Error(`Model not found: ${name}`);\n }\n\n // Global model lookup\n const registry = this.models();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Model not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available model names.\n */\n getModelNames(): string[] {\n return Object.keys(this.models());\n }\n\n /**\n * Load a prompt definition by name.\n * Supports both global prompts (e.g., \"my-prompt\") and packed prompts (e.g., \"packageId/promptName\").\n */\n async loadPrompt(name: string): Promise<any> {\n // Check if this is a qualified name (packed prompt)\n // For scoped packages, use \"@scope/pkg/promptName\"\n if (isQualifiedName(name)) {\n const [packageId, promptName] = parseQualifiedName(name);\n const reg = this.registry();\n console.log(`[loadPrompt] Packed prompt: ${name}, packageId: ${packageId}, promptName: ${promptName}`);\n\n if (!reg?.packages) {\n throw new Error(`Prompt not found: ${name}. Registry packages is undefined.`);\n }\n if (!packageId) {\n throw new Error(`Prompt not found: ${name}. Could not parse package ID.`);\n }\n const pkg = reg.packages[packageId];\n if (!pkg) {\n throw new Error(`Prompt not found: ${name}. Package \"${packageId}\" not found. Available: ${Object.keys(reg.packages).join(', ')}`);\n }\n if (!pkg.prompts?.[promptName]) {\n throw new Error(`Prompt not found: ${name}. Prompt \"${promptName}\" not found in package \"${packageId}\". Available prompts: ${Object.keys(pkg.prompts || {}).join(', ')}`);\n }\n return await pkg.prompts[promptName]();\n }\n\n // Global prompt lookup\n const registry = this.prompts();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Prompt not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available prompt names.\n */\n getPromptNames(): string[] {\n return Object.keys(this.prompts());\n }\n\n /**\n * Load an agent definition by name.\n * Supports both global agents (e.g., \"my-agent\") and packed agents (e.g., \"packageId/agentName\").\n * For scoped packages, use \"@scope/pkg/agentName\".\n */\n async loadAgent(name: string): Promise<any> {\n // Check if this is a qualified name (packed agent)\n if (isQualifiedName(name)) {\n const [packageId, agentName] = parseQualifiedName(name);\n const reg = this.registry();\n console.log(`[loadAgent] Packed agent: ${name}, packageId: ${packageId}, agentName: ${agentName}, registry packages: ${reg?.packages ? Object.keys(reg.packages) : 'undefined'}`);\n\n if (!reg?.packages) {\n throw new Error(`Agent not found: ${name}. Registry packages is undefined.`);\n }\n if (!packageId) {\n throw new Error(`Agent not found: ${name}. Could not parse package ID.`);\n }\n const pkg = reg.packages[packageId];\n if (!pkg) {\n throw new Error(`Agent not found: ${name}. Package \"${packageId}\" not found. Available: ${Object.keys(reg.packages).join(', ')}`);\n }\n if (!pkg.agents?.[agentName]) {\n throw new Error(`Agent not found: ${name}. Agent \"${agentName}\" not found in package \"${packageId}\". Available agents: ${Object.keys(pkg.agents || {}).join(', ')}`);\n }\n return await pkg.agents[agentName]();\n }\n\n // Global agent lookup\n const globalAgents = this.agents();\n const loader = globalAgents[name];\n if (!loader) {\n throw new Error(`Agent not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available agent names.\n */\n getAgentNames(): string[] {\n return Object.keys(this.agents());\n }\n\n /**\n * Load an effect definition by name.\n */\n async loadEffect(name: string): Promise<any> {\n // Check if this is a qualified name (packed effect)\n // For scoped packages, use \"@scope/pkg/effectName\"\n if (isQualifiedName(name)) {\n const [packageId, effectName] = parseQualifiedName(name);\n const reg = this.registry();\n\n if (reg?.packages && packageId) {\n const pkg = reg.packages[packageId];\n if (pkg?.effects?.[effectName]) {\n return await pkg.effects[effectName]();\n }\n\n // Fallback: allow explicitly-qualified global effects if present\n const globalLoader = this.effects()[name];\n if (globalLoader) {\n return await globalLoader();\n }\n\n throw new Error(`Effect not found: ${name}. Effect \"${effectName}\" not found in package \"${packageId}\" or global namespace.`);\n }\n\n // Package not found - may be a global effect with a slash in the name\n const globalLoader = this.effects()[name];\n if (globalLoader) {\n return await globalLoader();\n }\n\n throw new Error(`Effect not found: ${name}`);\n }\n\n const globalLoader = this.effects()[name];\n if (!globalLoader) {\n throw new Error(`Effect not found: ${name}`);\n }\n return await globalLoader();\n }\n\n /**\n * List available effect names.\n */\n getEffectNames(): string[] {\n const names = new Set<string>(Object.keys(this.effects()));\n const reg = this.registry();\n const packages = reg?.packages as Record<string, { effects?: Record<string, () => Promise<any>> }> | undefined;\n\n if (packages) {\n for (const [packageId, pkg] of Object.entries(packages)) {\n for (const effectName of Object.keys(pkg.effects || {})) {\n names.add(`${packageId}/${effectName}`);\n }\n }\n }\n\n return [...names];\n }\n\n /**\n * Load a tool definition by name.\n * Supports both global tools (e.g., \"my_tool\") and packed tools (e.g., \"packageId/toolName\").\n */\n async loadTool(name: string): Promise<any> {\n // Check if this is a qualified name (packed tool)\n // For scoped packages, use \"@scope/pkg/toolName\"\n if (isQualifiedName(name)) {\n const [packageId, toolName] = parseQualifiedName(name);\n const reg = this.registry();\n console.log(`[loadTool] Packed tool: ${name}, packageId: ${packageId}, toolName: ${toolName}`);\n\n if (!reg?.packages) {\n throw new Error(`Tool not found: ${name}. Registry packages is undefined.`);\n }\n if (!packageId) {\n throw new Error(`Tool not found: ${name}. Could not parse package ID.`);\n }\n const pkg = reg.packages[packageId];\n if (!pkg) {\n throw new Error(`Tool not found: ${name}. Package \"${packageId}\" not found. Available: ${Object.keys(reg.packages).join(', ')}`);\n }\n if (!pkg.tools?.[toolName]) {\n throw new Error(`Tool not found: ${name}. Tool \"${toolName}\" not found in package \"${packageId}\". Available tools: ${Object.keys(pkg.tools || {}).join(', ')}`);\n }\n return await pkg.tools[toolName]();\n }\n\n // Global tool lookup\n const globalTools = this.tools();\n const loader = globalTools[name];\n if (!loader) {\n throw new Error(`Tool not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * Get thread metadata from DurableAgentBuilder.\n * Used for creating ThreadState outside of flow execution.\n */\n async getThreadMetadata(threadId: string): Promise<ThreadMetadata> {\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n\n // Adapt thread metadata to expected format\n return {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map agent_name to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n env: threadMetadata.env ?? threadMetadata.tenvs ?? null,\n env_types: threadMetadata.env_types ?? null,\n tenvs: threadMetadata.tenvs,\n properties: threadMetadata.properties,\n parent: threadMetadata.parent ?? null,\n terminated: threadMetadata.terminated ?? null,\n created_at: threadMetadata.created_at,\n };\n }\n\n /**\n * Execute sandboxed code for a thread endpoint from inside the thread DO.\n *\n * Thread endpoint handlers often start in the top-level Worker with only a\n * Durable Object stub. Code execution must originate here so the dynamic\n * worker can use this DO's env, ctx exports, and bridge registration map.\n */\n async executeThreadEndpointCode(\n threadId: string,\n source: string,\n options: ThreadEndpointCodeOptions,\n ): Promise<CodeExecutionResult> {\n const metadata = await this.getThreadMetadata(threadId);\n const { ThreadStateImpl } = await import(\"../agents/ThreadStateImpl.js\");\n const state = ThreadStateImpl.fromThreadInstance(this as any, metadata);\n\n const run = state.runCode(source, {\n ...options,\n imports: {\n fs: createEndpointFsBridge(state),\n fetch: createEndpointFetchBridge(),\n storage: createEndpointStorageBridge(state),\n },\n globals: {\n __agentbuilderThreadState: createEndpointThreadStateBridge(state),\n },\n });\n\n const timeout = setTimeout(() => {\n run.terminate(\"Endpoint code exceeded the 10s execution budget\");\n }, 10_000);\n\n const result = await run;\n clearTimeout(timeout);\n return result;\n }\n\n /**\n * Execute ThreadState.runCode for endpoint handlers that only have a\n * Durable Object stub. The actual Dynamic Worker must be started inside this\n * DurableThread so it has access to env, ctx exports, and bridge callbacks.\n */\n async executeThreadStateRunCode(\n threadId: string,\n source: string,\n options?: CodeExecutionOptions,\n wantsReport = false,\n ): Promise<CodeExecutionResult> {\n const metadata = await this.getThreadMetadata(threadId);\n const { ThreadStateImpl } = await import(\"../agents/ThreadStateImpl.js\");\n const state = ThreadStateImpl.fromThreadInstance(this as any, metadata);\n\n const run = state.runCode(source, wantsReport ? {\n ...(options ?? {}),\n report: () => undefined,\n } : options);\n\n return await run;\n }\n\n // ============================================================\n // Durable Key-Value Store Methods (for use by ThreadStateImpl)\n // ============================================================\n\n /**\n * Read a JSON value from this thread's durable key-value store.\n */\n async getValue<T = unknown>(key: string): Promise<T | null> {\n await this.ensureMigrated();\n this.assertValidThreadValueKey(key);\n\n const cursor = await this.ctx.storage.sql.exec<{ value: string }>(\n `SELECT value FROM thread_values WHERE key = ? LIMIT 1`,\n key\n );\n const rows = cursor.toArray();\n const raw = rows[0]?.value;\n if (raw === undefined) {\n return null;\n }\n\n try {\n return JSON.parse(raw) as T;\n } catch (error) {\n throw new Error(\n `Stored thread value for key \"${key}\" is not valid JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Write a JSON value to this thread's durable key-value store.\n *\n * Per the Standard Agents spec, null and undefined delete the key.\n */\n async setValue(key: string, value: unknown): Promise<void> {\n await this.ensureMigrated();\n this.assertValidThreadValueKey(key);\n\n if (value === null || value === undefined) {\n await this.ctx.storage.sql.exec(`DELETE FROM thread_values WHERE key = ?`, key);\n return;\n }\n\n const serialized = this.serializeThreadValue(value);\n await this.ctx.storage.sql.exec(\n `\n INSERT INTO thread_values (key, value, updated_at)\n VALUES (?1, ?2, ?3)\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n updated_at = excluded.updated_at\n `,\n key,\n serialized,\n Date.now() * 1000\n );\n }\n\n async listValues(options: {\n search?: string | null;\n limit?: number;\n offset?: number;\n } = {}): Promise<{\n values: Array<{\n key: string;\n value: unknown;\n serialized: string;\n size: number;\n updatedAt: number;\n parseError?: string;\n }>;\n total: number;\n limit: number;\n offset: number;\n search: string | null;\n }> {\n await this.ensureMigrated();\n\n const limit = Math.min(\n Math.max(\n Number.isFinite(options.limit ?? Number.NaN)\n ? Math.trunc(options.limit ?? 100)\n : 100,\n 1\n ),\n 200\n );\n const offset = Math.max(\n Number.isFinite(options.offset ?? Number.NaN)\n ? Math.trunc(options.offset ?? 0)\n : 0,\n 0\n );\n const search = typeof options.search === \"string\" && options.search.trim()\n ? options.search.trim()\n : null;\n const where = search ? `WHERE key LIKE ? ESCAPE '\\\\' OR value LIKE ? ESCAPE '\\\\'` : \"\";\n const searchParam = search ? `%${this.escapeThreadValueLike(search)}%` : null;\n const countArgs = searchParam ? [searchParam, searchParam] : [];\n const countCursor = await this.ctx.storage.sql.exec<{ total: number }>(\n `SELECT COUNT(*) AS total FROM thread_values ${where}`,\n ...countArgs\n );\n const total = countCursor.toArray()[0]?.total ?? 0;\n\n const rowArgs = searchParam\n ? [searchParam, searchParam, limit, offset]\n : [limit, offset];\n const rowsCursor = await this.ctx.storage.sql.exec<{\n key: string;\n value: string;\n updated_at: number;\n }>(\n `\n SELECT key, value, updated_at\n FROM thread_values\n ${where}\n ORDER BY key COLLATE NOCASE ASC\n LIMIT ? OFFSET ?\n `,\n ...rowArgs\n );\n\n const values = rowsCursor.toArray().map((row) => {\n try {\n return {\n key: row.key,\n value: JSON.parse(row.value) as unknown,\n serialized: row.value,\n size: row.value.length,\n updatedAt: row.updated_at,\n };\n } catch (error) {\n return {\n key: row.key,\n value: null,\n serialized: row.value,\n size: row.value.length,\n updatedAt: row.updated_at,\n parseError: error instanceof Error ? error.message : String(error),\n };\n }\n });\n\n return { values, total, limit, offset, search };\n }\n\n private assertValidThreadValueKey(key: string): void {\n if (typeof key !== \"string\") {\n throw new Error(\"Thread value key must be a string\");\n }\n }\n\n private escapeThreadValueLike(value: string): string {\n return value.replace(/[\\\\%_]/g, (match) => `\\\\${match}`);\n }\n\n private serializeThreadValue(value: unknown): string {\n this.assertJsonSerializableThreadValue(value, \"$\", new WeakSet<object>());\n return JSON.stringify(value) as string;\n }\n\n private assertJsonSerializableThreadValue(\n value: unknown,\n path: string,\n seen: WeakSet<object>\n ): void {\n if (value === null) {\n return;\n }\n\n switch (typeof value) {\n case \"string\":\n case \"boolean\":\n return;\n case \"number\":\n if (!Number.isFinite(value)) {\n throw new Error(`Thread value at ${path} must be a finite number`);\n }\n return;\n case \"object\": {\n if (seen.has(value)) {\n throw new Error(`Thread value at ${path} cannot contain circular references`);\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i += 1) {\n this.assertJsonSerializableThreadValue(value[i], `${path}[${i}]`, seen);\n }\n seen.delete(value);\n return;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(`Thread value at ${path} must be a JSON object, array, or primitive`);\n }\n\n if (Object.getOwnPropertySymbols(value).length > 0) {\n throw new Error(`Thread value at ${path} cannot contain symbol keys`);\n }\n\n for (const [entryKey, entryValue] of Object.entries(value as Record<string, unknown>)) {\n this.assertJsonSerializableThreadValue(entryValue, `${path}.${entryKey}`, seen);\n }\n seen.delete(value);\n return;\n }\n default:\n throw new Error(`Thread value at ${path} must be JSON-serializable`);\n }\n }\n\n // ============================================================\n // Agent Execution Methods (for use by ThreadStateImpl)\n // ============================================================\n\n /**\n * Trigger an agent to run on this thread.\n *\n * Queues an agent execution via the alarm queue. The execution\n * runs asynchronously in the background.\n *\n * @param threadId - Thread ID for the execution\n * @param agentName - Name of the agent to run\n */\n async runAgent(threadId: string, agentName: string): Promise<void> {\n await this.assertNotTerminated();\n\n // Validate agent exists\n const agents = this.agents();\n if (!agents[agentName]) {\n throw new Error(`Agent not found: ${agentName}`);\n }\n\n // Queue execution via alarm queue (runs asynchronously)\n await this.alarmQueue.enqueue(\n \"executeFlow\",\n {\n threadId,\n agentId: agentName,\n },\n 0 // Execute immediately\n );\n }\n\n /**\n * Get the persisted resumable-subagent registry for this thread.\n */\n async getChildrenRegistry(_threadId: string): Promise<SubagentRegistryEntry[]> {\n await this.ensureMigrated();\n const cursor = await this.ctx.storage.sql.exec<{ value: string }>(\n `SELECT value FROM execution_state WHERE key = 'children_registry' LIMIT 1`\n );\n const rows = cursor.toArray();\n const raw = rows[0]?.value ?? '[]';\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as SubagentRegistryEntry[]) : [];\n } catch {\n return [];\n }\n }\n\n private async setChildrenRegistry(entries: SubagentRegistryEntry[]): Promise<void> {\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = ? WHERE key = 'children_registry'`,\n JSON.stringify(entries)\n );\n }\n\n async upsertChildRegistry(_threadId: string, entry: SubagentRegistryEntry): Promise<void> {\n const entries = await this.getChildrenRegistry(\"\");\n const next = entries.filter((existing) => existing.reference !== entry.reference);\n next.push(entry);\n await this.setChildrenRegistry(next);\n }\n\n async updateChildRegistryStatus(\n _threadId: string,\n reference: string,\n status: string\n ): Promise<void> {\n const entries = await this.getChildrenRegistry(\"\");\n let changed = false;\n const next = entries.map((entry) => {\n if (entry.reference !== reference) {\n return entry;\n }\n changed = true;\n return { ...entry, status };\n });\n if (changed) {\n await this.setChildrenRegistry(next);\n }\n }\n\n async removeChildRegistry(_threadId: string, reference: string): Promise<void> {\n const entries = await this.getChildrenRegistry(\"\");\n const next = entries.filter((entry) => entry.reference !== reference);\n if (next.length !== entries.length) {\n await this.setChildrenRegistry(next);\n }\n }\n\n private asOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n }\n\n private asOptionalBoolean(value: unknown): boolean | null {\n return typeof value === \"boolean\" ? value : null;\n }\n\n private getThreadNameFromTags(tags: unknown): string | null {\n if (!Array.isArray(tags)) {\n return null;\n }\n const nameTag = tags.find(\n (tag): tag is string => typeof tag === \"string\" && tag.startsWith(\"name:\")\n );\n if (!nameTag) {\n return null;\n }\n const value = nameTag.slice(\"name:\".length).replace(/\\s+/g, \" \").trim();\n return value.length > 0 ? value : null;\n }\n\n private toSubagentProjection(entry: SubagentRegistryEntry): SubagentMessageProjection {\n const entryWithExtras = entry as SubagentRegistryEntry & {\n threadName?: unknown;\n spawnGroupId?: unknown;\n resumable?: unknown;\n blocking?: unknown;\n title?: unknown;\n };\n\n return {\n subagent_name: this.asOptionalString(entry.name) ?? entry.name ?? null,\n subagent_title: this.asOptionalString(entryWithExtras.title),\n subagent_description: this.asOptionalString(entry.description) ?? entry.description ?? null,\n subagent_status: this.asOptionalString(entry.status) ?? entry.status ?? null,\n subagent_resumable: this.asOptionalBoolean(entryWithExtras.resumable),\n subagent_blocking: this.asOptionalBoolean(entryWithExtras.blocking),\n subagent_thread_name: this.asOptionalString(entryWithExtras.threadName),\n subagent_spawn_group_id: this.asOptionalString(entryWithExtras.spawnGroupId),\n };\n }\n\n private async resolveSubagentMessageProjections(\n subagentIds: string[]\n ): Promise<Map<string, SubagentMessageProjection>> {\n const projections = new Map<string, SubagentMessageProjection>();\n if (subagentIds.length === 0) {\n return projections;\n }\n\n const uniqueIds = Array.from(new Set(subagentIds));\n const uniqueSet = new Set(uniqueIds);\n\n // Primary source: this thread's subagent registry.\n const registry = await this.getChildrenRegistry(\"\");\n for (const entry of registry) {\n if (uniqueSet.has(entry.reference)) {\n projections.set(entry.reference, this.toSubagentProjection(entry));\n }\n }\n\n const unresolved = uniqueIds.filter((id) => !projections.has(id));\n if (unresolved.length === 0) {\n return projections;\n }\n\n // Fallback source: DurableAgentBuilder thread rows + agent definition lookup.\n try {\n const builderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const builder = this.env.AGENT_BUILDER.get(builderId) as {\n getThread?: (id: string) => Promise<{\n id: string;\n agent_name?: string | null;\n tags?: string[] | null;\n terminated?: number | null;\n } | null>;\n };\n\n if (typeof builder.getThread !== \"function\") {\n return projections;\n }\n\n await Promise.all(\n unresolved.map(async (subagentId) => {\n try {\n const thread = await builder.getThread!(subagentId);\n if (!thread) {\n return;\n }\n\n const agentName = this.asOptionalString(thread.agent_name);\n let agentTitle: string | null = null;\n let description: string | null = null;\n\n if (agentName) {\n try {\n const agentDef = await this.loadAgent(agentName);\n agentTitle = this.asOptionalString(agentDef?.title);\n description = this.asOptionalString(agentDef?.toolDescription);\n } catch {\n // Ignore load errors; fallback values below.\n }\n }\n\n projections.set(subagentId, {\n subagent_name: agentName,\n subagent_title: agentTitle,\n subagent_description: description,\n subagent_status:\n typeof thread.terminated === \"number\" ? \"terminated\" : null,\n subagent_resumable: null,\n subagent_blocking: null,\n subagent_thread_name: this.getThreadNameFromTags(thread.tags),\n subagent_spawn_group_id: null,\n });\n } catch {\n // Best-effort fallback only.\n }\n })\n );\n } catch {\n // Best-effort fallback only.\n }\n\n return projections;\n }\n\n /**\n * Inject a top-level message without starting a new execution.\n *\n * This path is used by effects and thread endpoints, which run without a\n * FlowState but still need to write visible messages to the thread.\n */\n async injectMessage(threadId: string, message: InjectMessageInput): Promise<Message> {\n await this.ensureMigrated();\n await this.assertNotTerminated();\n\n const id = crypto.randomUUID();\n const createdAt = Date.now() * TIMESTAMP_MULTIPLIER;\n const silent = message.silent === true;\n const metadataJson = message.metadata ? JSON.stringify(message.metadata) : null;\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, status, silent, parent_id, depth, metadata, prompt)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)`,\n id,\n message.role,\n message.content,\n createdAt,\n \"completed\",\n silent ? 1 : 0,\n null,\n 0,\n metadataJson,\n null\n );\n\n const inserted: Message = {\n id,\n role: message.role,\n content: message.content,\n created_at: createdAt,\n status: \"completed\",\n silent,\n parent_id: null,\n depth: 0,\n metadata: message.metadata,\n };\n\n this.broadcastMessage(inserted);\n\n return inserted;\n }\n\n /**\n * Queue a message for deferred delivery.\n */\n async queueMessage(threadId: string, message: QueueMessageInput): Promise<void> {\n await this.ensureMigrated();\n await this.assertNotTerminated();\n\n const id = crypto.randomUUID();\n const now = Date.now() * 1000;\n const attachmentsJson = message.attachments ? JSON.stringify(message.attachments) : null;\n const metadataJson = message.metadata ? JSON.stringify(message.metadata) : null;\n await this.ctx.storage.sql.exec(\n `INSERT INTO message_queue (id, role, content, attachments, silent, metadata, created_at)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,\n id,\n message.role,\n message.content,\n attachmentsJson,\n message.silent ? 1 : 0,\n metadataJson,\n now\n );\n\n if (this.messageSockets?.size > 0) {\n await this.broadcastMessageWithSubagentProjection({\n id,\n role: message.role,\n content: message.content,\n attachments: message.attachments ?? null,\n silent: !!message.silent,\n created_at: now,\n status: \"pending\",\n depth: 0,\n metadata: {\n ...(message.metadata ?? {}),\n queued: true,\n queue_status: \"queued\",\n },\n subagent_id: this.extractSubagentIdFromMetadata(metadataJson),\n });\n }\n\n const side = message.role === \"user\" ? \"a\" : \"b\";\n await this.ensureQueuedMessageExecution(threadId, side);\n }\n\n private async hasPendingTurnAlarm(): Promise<boolean> {\n try {\n const cursor = await this.ctx.storage.sql.exec<{ id: string }>(\n `\n SELECT id\n FROM alarm_queue\n WHERE status = 'pending'\n AND method IN ('continueExecution', 'executeFlow', 'processMessage')\n LIMIT 1\n `\n );\n return cursor.toArray().length > 0;\n } catch (error) {\n console.error(\"[DurableThread] Failed to inspect pending turn alarms:\", error);\n return false;\n }\n }\n\n private async ensureQueuedMessageExecution(\n threadId: string,\n side: \"a\" | \"b\"\n ): Promise<void> {\n if (await this.hasPendingTurnAlarm()) {\n return;\n }\n\n await this.alarmQueue.enqueue(\"continueExecution\", { threadId, side }, 1);\n }\n\n private async ensureRootMessageId(\n existingRootMessageId?: string | null\n ): Promise<string> {\n if (typeof existingRootMessageId === \"string\" && existingRootMessageId.length > 0) {\n return existingRootMessageId;\n }\n\n const cursor = await this.ctx.storage.sql.exec<{ id: string }>(\n `SELECT id FROM messages WHERE depth IS NULL OR depth = 0 ORDER BY created_at DESC LIMIT 1`\n );\n const rows = cursor.toArray();\n const persistedId = rows[0]?.id;\n if (typeof persistedId === \"string\" && persistedId.length > 0) {\n return persistedId;\n }\n\n const rootMessageId = crypto.randomUUID();\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, prompt) VALUES (?1, ?2, ?3, ?4, ?5)`,\n rootMessageId,\n \"system\",\n null,\n Date.now() * 1000,\n null\n );\n return rootMessageId;\n }\n\n /**\n * Soft-terminate this thread.\n */\n async terminateThread(threadId: string): Promise<{ success: boolean; terminated: number }> {\n await this.ensureMigrated();\n const terminatedAt = Date.now() * 1000;\n\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = ? WHERE key = 'terminated'`,\n String(terminatedAt)\n );\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = 'true' WHERE key = 'stopped'`\n );\n\n if (this.currentAbortController) {\n this.currentAbortController.abort();\n }\n\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n await agentBuilder.updateThread(threadId, { terminated: terminatedAt });\n\n const threadMeta = await agentBuilder.getThread(threadId);\n if (threadMeta?.parent) {\n try {\n const parentId = this.env.AGENT_BUILDER_THREAD.idFromName(threadMeta.parent);\n const parentStub = this.env.AGENT_BUILDER_THREAD.get(parentId) as unknown as DurableThread;\n await parentStub.updateChildRegistryStatus(threadMeta.parent, threadId, 'terminated');\n } catch (error) {\n console.error('[DurableThread.terminateThread] Failed to update parent registry status:', error);\n }\n }\n\n return { success: true, terminated: terminatedAt };\n }\n\n // ============================================================\n // Effect Scheduling Methods (for use by ThreadStateImpl)\n // ============================================================\n\n /**\n * Schedule an effect for future execution.\n *\n * @param threadId - Thread ID for the effect execution context\n * @param effectName - Name of the effect to schedule\n * @param effectArgs - Arguments to pass to the effect handler\n * @param delayMs - Delay in milliseconds before execution (default: 0)\n * @returns UUID of the scheduled effect\n */\n async scheduleEffect(\n threadId: string,\n effectName: string,\n effectArgs: Record<string, unknown>,\n delayMs: number = 0,\n options: { sourceLogId?: string | null } = {}\n ): Promise<string> {\n await this.ensureMigrated();\n\n // Validate effect exists\n if (!this.effectExists(effectName)) {\n throw new Error(`Effect not found: ${effectName}`);\n }\n\n // Enqueue via AlarmQueue\n return this.alarmQueue.enqueue(\n \"runEffect\",\n { effectName, effectArgs, threadId },\n delayMs,\n { sourceLogId: options.sourceLogId ?? null }\n );\n }\n\n /**\n * Check whether an effect loader exists in either global or packed registries.\n */\n private effectExists(name: string): boolean {\n const globalRegistry = this.effects();\n if (globalRegistry[name]) {\n return true;\n }\n\n if (isQualifiedName(name)) {\n const [packageId, effectName] = parseQualifiedName(name);\n if (packageId) {\n const reg = this.registry();\n return Boolean(reg?.packages?.[packageId]?.effects?.[effectName]);\n }\n }\n\n return false;\n }\n\n /**\n * Get scheduled effects for this thread.\n *\n * @param name - Optional effect name to filter by\n * @returns Array of scheduled effect records\n */\n async getScheduledEffects(name?: string): Promise<Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n scheduledAt: number;\n createdAt: number;\n }>> {\n await this.ensureMigrated();\n return this.alarmQueue.getScheduledEffects(name);\n }\n\n /**\n * List pending and historical effect runs for the AgentBuilder UI.\n */\n async listEffectRuns(options?: EffectRunListOptions): Promise<EffectRunListResult> {\n await this.ensureMigrated();\n return this.alarmQueue.listEffectRuns(options);\n }\n\n /**\n * Run a pending effect now, or replay a historical effect immediately.\n */\n async runEffectNow(effectRunId: string): Promise<EffectRunActionResult> {\n await this.ensureMigrated();\n await this.assertNotTerminated();\n return this.alarmQueue.runEffectNow(effectRunId);\n }\n\n /**\n * Cancel a scheduled effect and keep it in history.\n *\n * @param id - The effect ID returned by scheduleEffect\n * @returns true if the effect was found and canceled, false otherwise\n */\n async removeScheduledEffect(id: string, canceledBy: EffectCancelSource = \"agent\"): Promise<boolean> {\n await this.ensureMigrated();\n return this.alarmQueue.removeScheduledEffect(id, canceledBy);\n }\n\n /**\n * Ensures the database schema is up to date.\n * This method is called on the first request to the Durable Object.\n * It checks the schema version and runs any pending migrations.\n *\n * Performance:\n * - Already migrated to latest: ~0.1ms (single SELECT + integer comparison)\n * - Needs migration: Runs once per Durable Object lifetime per schema version\n * - Detects new migrations after code deployment\n */\n private async ensureMigrated(): Promise<void> {\n // Check if we've already migrated to the latest version in this instance\n if (this.migratedToVersion === LATEST_SCHEMA_VERSION) {\n return;\n }\n\n const currentVersion = await this.getCurrentVersion();\n\n if (currentVersion < LATEST_SCHEMA_VERSION) {\n await this.runMigrations(currentVersion);\n }\n\n // Cache the version we've migrated to\n this.migratedToVersion = LATEST_SCHEMA_VERSION;\n\n if (\n !this.alarmQueueRearmed &&\n typeof this.alarmQueue.ensureAlarmScheduled === \"function\"\n ) {\n await this.alarmQueue.ensureAlarmScheduled();\n this.alarmQueueRearmed = true;\n }\n }\n\n /**\n * Gets the current schema version from the database.\n * Returns 0 if the metadata table doesn't exist (brand new database).\n */\n private async getCurrentVersion(): Promise<number> {\n try {\n // IMPORTANT: DurableObject SQL returns an iterator/cursor, NOT a result with .rows!\n // Options: Use for...of loop OR call .toArray() - but NEVER access .rows property!\n const cursor = await this.ctx.storage.sql.exec<{\n value: number | string;\n }>(`SELECT value FROM _metadata WHERE key = 'schema_version' LIMIT 1`);\n\n const rows = cursor.toArray(); // Convert iterator to array\n\n if (rows.length > 0) {\n const value = rows[0].value;\n const parsed =\n typeof value === \"number\" ? value : parseInt(value as string, 10);\n return Number.isFinite(parsed) ? (parsed as number) : 0;\n }\n\n return 0;\n } catch (error) {\n // Table doesn't exist yet\n return 0;\n }\n }\n\n /**\n * Runs all pending migrations sequentially.\n * Each migration is run in order, starting from the current version + 1.\n */\n private async runMigrations(fromVersion: number): Promise<void> {\n for (const migration of migrations) {\n if (migration.version > fromVersion) {\n await migration.up(this.ctx.storage.sql);\n }\n }\n }\n\n /**\n * Legacy fetch handler for WebSocket upgrades only\n */\n async fetch(request: Request): Promise<Response> {\n await this.ensureMigrated();\n\n if (isCodeExecutionBridgeRequest(request)) {\n return handleCodeExecutionBridgeRequest(this.codeExecutionBridges, request);\n }\n\n // Handle WebSocket upgrade\n const upgradeHeader = request.headers.get(\"Upgrade\");\n if (upgradeHeader?.toLowerCase() === \"websocket\") {\n // Determine connection type from URL path\n const url = new URL(request.url);\n if (url.pathname.includes(\"/stream\")) {\n return this.handleMessagesWebSocketUpgrade(request);\n } else {\n // Default to logs WebSocket for backwards compatibility\n return this.handleLogsWebSocketUpgrade(request);\n }\n }\n\n return new Response(\"Use RPC methods instead of fetch\", { status: 400 });\n }\n\n registerCodeExecutionBridge(\n runId: string,\n bridge: CodeExecutionBridgeRegistration,\n ): void {\n this.codeExecutionBridges.set(runId, bridge);\n }\n\n unregisterCodeExecutionBridge(runId: string): void {\n this.codeExecutionBridges.delete(runId);\n }\n\n async callCodeExecutionBridge(\n runId: string,\n functionId: string,\n encodedArgs: unknown[],\n ): Promise<unknown> {\n const bridge = this.codeExecutionBridges.get(runId);\n if (!bridge) {\n return {\n ok: false,\n error: {\n name: \"BridgeUnavailable\",\n message: \"Code execution bridge is no longer available\",\n },\n };\n }\n try {\n const value = await bridge.call(functionId, encodedArgs);\n return { ok: true, value };\n } catch (error) {\n const maybe = error as { name?: unknown; message?: unknown; stack?: unknown };\n return {\n ok: false,\n error: {\n name: typeof maybe?.name === \"string\" ? maybe.name : \"Error\",\n message: typeof maybe?.message === \"string\" ? maybe.message : String(error),\n stack: typeof maybe?.stack === \"string\" ? maybe.stack : undefined,\n },\n };\n }\n }\n\n /**\n * Execute thread with initial messages (RPC method)\n * Enqueues the execution to be processed by the alarm handler\n */\n async execute(\n threadId: string,\n agentId: string,\n initial_messages?: any[],\n data?: any\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n await this.assertNotTerminated();\n\n // Enqueue the execution with a 1ms delay (essentially immediate)\n const queueId = await this.alarmQueue.enqueue(\n \"executeFlow\",\n {\n threadId,\n agentId,\n initial_messages,\n data,\n awaitCompletion: true,\n },\n 1 // Execute almost immediately (1ms)\n );\n\n // Return 202 Accepted - execution will happen via alarm\n // Clients should connect via WebSocket to receive real-time updates\n return Response.json(\n {\n status: \"queued\",\n queueId,\n message:\n \"Execution queued. Connect via WebSocket for real-time updates.\",\n },\n { status: 202 }\n );\n } catch (error: any) {\n console.error(\"Error in execute:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue execution\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Execute a flow synchronously and return the final top-level message content.\n * Used by blocking subagent tool calls.\n */\n async executeBlocking(\n threadId: string,\n agentId: string,\n initial_messages?: any[],\n data?: any\n ): Promise<{\n status: \"success\" | \"error\";\n result?: string;\n error?: string;\n attachments?: unknown[];\n terminal?: boolean;\n }> {\n await this.ensureMigrated();\n await this.assertNotTerminated();\n\n let parentThreadId: string | null = null;\n const maybeGetThreadMetadata = (this as any).getThreadMetadata;\n if (typeof maybeGetThreadMetadata === \"function\") {\n try {\n const metadata = await maybeGetThreadMetadata.call(this, threadId);\n parentThreadId = metadata?.parent ?? null;\n } catch {\n parentThreadId = null;\n }\n }\n\n const emitParentHandoffStatus = async (kind: \"result\" | \"failure\"): Promise<void> => {\n if (!parentThreadId) {\n return;\n }\n const maybePersistParentHandoffStatusMessage = (this as any)\n .persistParentHandoffStatusMessage;\n if (typeof maybePersistParentHandoffStatusMessage !== \"function\") {\n return;\n }\n try {\n await maybePersistParentHandoffStatusMessage.call(\n this,\n parentThreadId,\n kind\n );\n } catch {\n // Non-blocking observability signal only; do not fail parent tool return.\n }\n };\n\n const executionStartedAt = Date.now() * TIMESTAMP_MULTIPLIER;\n const flowResult = await this.executeFlow(\n threadId,\n agentId,\n initial_messages,\n data,\n true\n );\n\n const terminalToolNames = await this.getTerminalSessionToolNames(agentId);\n const sessionFailToolNames = terminalToolNames.fail;\n const hasTerminalSessionTools = terminalToolNames.all.size > 0;\n\n const latestInRunCursor = await this.ctx.storage.sql.exec<{\n role: string;\n name: string | null;\n content: string | null;\n tool_status: string | null;\n attachments: string | null;\n }>(\n `\n SELECT role, name, content, tool_status, attachments\n FROM messages\n WHERE (depth IS NULL OR depth = 0)\n AND created_at >= ?\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `,\n executionStartedAt\n );\n let row = latestInRunCursor.toArray()[0] ?? null;\n\n const terminalNameList = Array.from(terminalToolNames.all);\n let selectedTerminalRow = false;\n if (terminalNameList.length > 0) {\n const placeholders = terminalNameList.map(() => \"?\").join(\", \");\n const terminalCursor = await this.ctx.storage.sql.exec<{\n role: string;\n name: string | null;\n content: string | null;\n tool_status: string | null;\n attachments: string | null;\n }>(\n `\n SELECT role, name, content, tool_status, attachments\n FROM messages\n WHERE (depth IS NULL OR depth = 0)\n AND created_at >= ?\n AND role = 'tool'\n AND name IN (${placeholders})\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `,\n executionStartedAt,\n ...terminalNameList\n );\n const terminalRow = terminalCursor.toArray()[0];\n if (terminalRow) {\n row = terminalRow;\n selectedTerminalRow = true;\n }\n }\n\n if (!row) {\n const latestOverallCursor = await this.ctx.storage.sql.exec<{\n role: string;\n name: string | null;\n content: string | null;\n tool_status: string | null;\n attachments: string | null;\n }>(\n `\n SELECT role, name, content, tool_status, attachments\n FROM messages\n WHERE depth IS NULL OR depth = 0\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `\n );\n row = latestOverallCursor.toArray()[0] ?? null;\n }\n\n if (!row) {\n if (hasTerminalSessionTools) {\n await emitParentHandoffStatus(\"failure\");\n return {\n status: \"error\",\n error: this.buildMissingTerminalSessionFailure(flowResult),\n terminal: true,\n };\n }\n\n await emitParentHandoffStatus(\"result\");\n return {\n status: \"success\",\n result: \"Subagent completed.\",\n terminal: false,\n };\n }\n\n const attachments =\n hasTerminalSessionTools && !selectedTerminalRow\n ? undefined\n : this.parseAttachmentRefsJson(row.attachments);\n\n const isFailSessionTerminal =\n row.role === \"tool\" &&\n !!row.name &&\n sessionFailToolNames.has(row.name);\n const isSuccessfulTerminalSessionCall =\n selectedTerminalRow &&\n row.role === \"tool\" &&\n !!row.name &&\n terminalToolNames.all.has(row.name) &&\n row.tool_status !== \"error\";\n\n if (isFailSessionTerminal) {\n await emitParentHandoffStatus(\"failure\");\n return {\n status: \"error\",\n error: row.content ?? \"Subagent reported terminal failure\",\n attachments,\n terminal: hasTerminalSessionTools,\n };\n }\n\n if (row.role === \"tool\" && row.tool_status === \"error\") {\n await emitParentHandoffStatus(\"failure\");\n return {\n status: \"error\",\n error: row.content ?? \"Subagent execution failed\",\n attachments,\n terminal: hasTerminalSessionTools,\n };\n }\n\n if (hasTerminalSessionTools && !isSuccessfulTerminalSessionCall) {\n await emitParentHandoffStatus(\"failure\");\n return {\n status: \"error\",\n error: this.buildMissingTerminalSessionFailure(flowResult),\n attachments: undefined,\n terminal: true,\n };\n }\n\n await emitParentHandoffStatus(\"result\");\n return {\n status: \"success\",\n result: row.content ?? \"Subagent completed.\",\n attachments,\n terminal: hasTerminalSessionTools,\n };\n }\n\n /**\n * Send a new message to the thread (RPC method)\n * Enqueues the message processing to be handled by the alarm handler\n */\n async sendMessage(\n threadId: string,\n content: string,\n role: string = \"user\",\n attachments?: string // JSON array of AttachmentRef\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n await this.assertNotTerminated();\n\n const messageId = crypto.randomUUID();\n const queuedAt = Date.now() * 1000;\n\n // Enqueue the message processing with a 1ms delay (essentially immediate)\n const queueId = await this.alarmQueue.enqueue(\n \"processMessage\",\n {\n threadId,\n content,\n role,\n attachments,\n messageId,\n queuedAt,\n },\n 1 // Execute almost immediately (1ms)\n );\n\n this.broadcastMessage({\n id: messageId,\n role,\n content,\n attachments: this.parseAttachmentRefsJson(attachments ?? null) ?? null,\n created_at: queuedAt,\n status: \"pending\",\n depth: 0,\n silent: false,\n metadata: {\n queued: true,\n queue_status: \"queued\",\n queue_source: \"alarm_queue\",\n alarm_queue_id: queueId,\n },\n });\n\n // Return 202 Accepted - processing will happen via alarm\n // Clients should connect via WebSocket to receive real-time updates\n return Response.json(\n {\n status: \"queued\",\n queueId,\n messageId,\n message:\n \"Message queued for processing. Connect via WebSocket for real-time updates.\",\n },\n { status: 202 }\n );\n } catch (error: any) {\n console.error(\"Error in sendMessage:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue message\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Check if execution should be stopped (called by FlowEngine)\n * Reads from SQLite for persistence across hibernation\n */\n async shouldStop(): Promise<boolean> {\n try {\n const cursor = await this.ctx.storage.sql.exec<{ value: string }>(\n `SELECT value FROM execution_state WHERE key = 'stopped'`\n );\n const rows = cursor.toArray();\n return rows.length > 0 && rows[0].value === 'true';\n } catch (error) {\n console.error('[DurableThread.shouldStop] Error reading stopped flag:', error);\n return false;\n }\n }\n\n /**\n * Returns the termination timestamp (microseconds) or null when active.\n */\n async getTerminated(_threadId: string): Promise<number | null> {\n await this.ensureMigrated();\n\n try {\n const cursor = await this.ctx.storage.sql.exec<{ value: string }>(\n `SELECT value FROM execution_state WHERE key = 'terminated' LIMIT 1`\n );\n const rows = cursor.toArray();\n if (rows.length === 0 || !rows[0].value) {\n return null;\n }\n\n const parsed = Number(rows[0].value);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\n } catch (error) {\n console.error('[DurableThread.getTerminated] Error reading terminated flag:', error);\n return null;\n }\n }\n\n private async assertNotTerminated(): Promise<void> {\n const terminated = await this.getTerminated(\"\");\n if (terminated !== null) {\n throw new Error(`Thread is terminated (terminated_at=${terminated})`);\n }\n }\n\n private async getLatestTopLevelMessage(): Promise<{\n id: string;\n role: string;\n name: string | null;\n content: string | null;\n tool_status: string | null;\n attachments: string | null;\n metadata: string | null;\n } | null> {\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n role: string;\n name: string | null;\n content: string | null;\n tool_status: string | null;\n attachments: string | null;\n metadata: string | null;\n }>(\n `\n SELECT id, role, name, content, tool_status, attachments, metadata\n FROM messages\n WHERE depth IS NULL OR depth = 0\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `\n );\n const rows = cursor.toArray();\n return rows.length > 0 ? rows[0] : null;\n }\n\n private async getTerminalSessionToolNames(agentName: string): Promise<{\n stop: Set<string>;\n fail: Set<string>;\n all: Set<string>;\n }> {\n try {\n const agentDef = await this.loadAgent(agentName);\n const sideASession = getResolvedSessionBindingsFromSide(agentDef.sideA);\n const sideBSession = getResolvedSessionBindingsFromSide(agentDef.sideB);\n const stop = new Set<string>();\n const fail = new Set<string>();\n if (sideASession.fail.toolName) {\n fail.add(sideASession.fail.toolName);\n }\n if (sideBSession.fail.toolName) {\n fail.add(sideBSession.fail.toolName);\n }\n if (sideASession.stop.toolName) {\n stop.add(sideASession.stop.toolName);\n }\n if (sideBSession.stop.toolName) {\n stop.add(sideBSession.stop.toolName);\n }\n\n const all = new Set<string>([...stop, ...fail]);\n return { stop, fail, all };\n } catch {\n return { stop: new Set<string>(), fail: new Set<string>(), all: new Set<string>() };\n }\n }\n\n private parseAttachmentRefsJson(raw: string | null): AttachmentRef[] | undefined {\n if (!raw) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as AttachmentRef[]) : undefined;\n } catch {\n return undefined;\n }\n }\n\n private async deleteAttachmentRefsFromJson(raw: string | null): Promise<void> {\n const refs = this.parseAttachmentRefsJson(raw);\n if (!refs) {\n return;\n }\n\n for (const ref of refs) {\n if (ref.path) {\n await this.unlinkFile(ref.path);\n }\n }\n }\n\n private async cancelQueuedMessage(messageId: string): Promise<boolean> {\n let cancelled = false;\n\n const queuedRows = await this.ctx.storage.sql\n .exec<{ id: string; attachments: string | null }>(\n `SELECT id, attachments FROM message_queue WHERE id = ?`,\n messageId\n )\n .toArray();\n\n for (const row of queuedRows) {\n await this.deleteAttachmentRefsFromJson(row.attachments);\n await this.ctx.storage.sql.exec(\n `DELETE FROM message_queue WHERE id = ?`,\n row.id\n );\n cancelled = true;\n }\n\n const alarmRows = await this.ctx.storage.sql\n .exec<{ id: string; args: string }>(\n `\n SELECT id, args\n FROM alarm_queue\n WHERE method = 'processMessage'\n AND status = 'pending'\n AND (\n id = ?\n OR json_extract(args, '$.messageId') = ?\n )\n `,\n messageId,\n messageId\n )\n .toArray();\n\n for (const row of alarmRows) {\n try {\n const args = JSON.parse(row.args) as { attachments?: unknown };\n if (typeof args.attachments === \"string\") {\n await this.deleteAttachmentRefsFromJson(args.attachments);\n }\n } catch (error) {\n console.error(\"[DurableThread] Failed to parse queued message args:\", error);\n }\n await this.ctx.storage.sql.exec(\n `DELETE FROM alarm_queue WHERE id = ? AND status = 'pending'`,\n row.id\n );\n cancelled = true;\n }\n\n return cancelled;\n }\n\n private parseMessageMetadata(raw: string | null): Record<string, unknown> | undefined {\n if (typeof raw !== \"string\") {\n return undefined;\n }\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n private extractSubagentIdFromMetadata(raw: string | null): string | null {\n const metadata = this.parseMessageMetadata(raw);\n const value =\n typeof metadata?.subagent_id === \"string\"\n ? metadata.subagent_id\n : typeof metadata?.subagentId === \"string\"\n ? metadata.subagentId\n : null;\n return value && value.trim().length > 0 ? value.trim() : null;\n }\n\n private async getLatestTerminalSessionMessageAfter(\n messageId: string | null,\n terminalToolNames: Set<string>\n ): Promise<{\n id: string;\n role: string;\n name: string | null;\n content: string | null;\n tool_status: string | null;\n attachments: string | null;\n metadata: string | null;\n } | null> {\n const toolNames = Array.from(terminalToolNames);\n if (toolNames.length === 0) {\n return null;\n }\n\n let boundaryRowId = 0;\n if (messageId) {\n const boundaryCursor = await this.ctx.storage.sql.exec<{ rowid: number }>(\n `SELECT rowid FROM messages WHERE id = ? LIMIT 1`,\n messageId\n );\n boundaryRowId = boundaryCursor.toArray()[0]?.rowid ?? 0;\n }\n\n const placeholders = toolNames.map(() => \"?\").join(\", \");\n const terminalCursor = await this.ctx.storage.sql.exec<{\n id: string;\n role: string;\n name: string | null;\n content: string | null;\n tool_status: string | null;\n attachments: string | null;\n metadata: string | null;\n }>(\n `\n SELECT id, role, name, content, tool_status, attachments, metadata\n FROM messages\n WHERE (depth IS NULL OR depth = 0)\n AND rowid > ?\n AND role = 'tool'\n AND name IN (${placeholders})\n ORDER BY rowid DESC\n LIMIT 1\n `,\n boundaryRowId,\n ...toolNames\n );\n\n return terminalCursor.toArray()[0] ?? null;\n }\n\n private inferMimeTypeFromPath(path: string): string | null {\n const normalized = path.toLowerCase();\n if (normalized.endsWith(\".png\")) return \"image/png\";\n if (normalized.endsWith(\".jpg\") || normalized.endsWith(\".jpeg\")) return \"image/jpeg\";\n if (normalized.endsWith(\".webp\")) return \"image/webp\";\n if (normalized.endsWith(\".gif\")) return \"image/gif\";\n if (normalized.endsWith(\".bmp\")) return \"image/bmp\";\n if (normalized.endsWith(\".svg\")) return \"image/svg+xml\";\n return null;\n }\n\n private extensionForMimeType(mimeType: string | null | undefined): string | null {\n if (!mimeType) return null;\n const normalized = mimeType.toLowerCase();\n if (normalized === \"image/jpeg\") return \"jpg\";\n if (normalized === \"image/png\") return \"png\";\n if (normalized === \"image/webp\") return \"webp\";\n if (normalized === \"image/gif\") return \"gif\";\n if (normalized === \"image/bmp\") return \"bmp\";\n if (normalized === \"image/svg+xml\") return \"svg\";\n const slashIndex = normalized.indexOf(\"/\");\n if (slashIndex === -1 || slashIndex === normalized.length - 1) {\n return null;\n }\n return normalized.slice(slashIndex + 1);\n }\n\n private sanitizeFilename(value: string): string {\n const withoutPath = value.split(\"/\").pop()?.split(\"\\\\\").pop() ?? \"asset\";\n const cleaned = withoutPath\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-zA-Z0-9._-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return cleaned || \"asset\";\n }\n\n private splitFilename(value: string): { stem: string; ext: string | null } {\n const lastDot = value.lastIndexOf(\".\");\n if (lastDot <= 0 || lastDot === value.length - 1) {\n return { stem: value, ext: null };\n }\n return {\n stem: value.slice(0, lastDot),\n ext: value.slice(lastDot + 1).toLowerCase(),\n };\n }\n\n private resolveAttachmentMimeType(\n sourceMimeType: string | null | undefined,\n fallbackMimeType: string | null | undefined,\n path: string\n ): string {\n const source = sourceMimeType?.trim();\n if (source && source !== \"application/octet-stream\") {\n return source;\n }\n const fallback = fallbackMimeType?.trim();\n if (fallback && fallback !== \"application/octet-stream\") {\n return fallback;\n }\n return this.inferMimeTypeFromPath(path) ?? source ?? fallback ?? \"application/octet-stream\";\n }\n\n private buildAttachmentTargetPath(\n preferredName: string,\n mimeType: string,\n sourcePath: string\n ): string {\n const safeName = this.sanitizeFilename(preferredName);\n const { stem, ext } = this.splitFilename(safeName);\n const fallbackExt =\n this.extensionForMimeType(mimeType) ??\n this.extensionForMimeType(this.inferMimeTypeFromPath(sourcePath)) ??\n \"bin\";\n const finalExt = ext ?? fallbackExt;\n const normalizedStem = (stem || \"asset\").slice(0, 64);\n const shortId = crypto.randomUUID().slice(0, 8);\n return `/attachments/${normalizedStem}-${shortId}.${finalExt}`;\n }\n\n private async copyAttachmentRefsToThread(\n refs: AttachmentRef[] | undefined,\n targetThread: {\n writeFile(\n path: string,\n data: string,\n mimeType: string,\n options?: Record<string, unknown>\n ): Promise<{ success: boolean; file?: any; error?: string }>;\n },\n _pathPrefix: string\n ): Promise<AttachmentRef[]> {\n if (!refs || refs.length === 0) {\n return [];\n }\n\n const copied: AttachmentRef[] = [];\n for (const ref of refs) {\n const sourceStat = await this.statFile(ref.path);\n if (!sourceStat.success || !sourceStat.file) {\n continue;\n }\n\n const sourceFile = sourceStat.file;\n const preferredName =\n ref.name || sourceFile.name || ref.path.split(\"/\").pop() || \"asset\";\n const displayName = this.sanitizeFilename(preferredName);\n const effectiveMimeType = this.resolveAttachmentMimeType(\n sourceFile.mimeType,\n ref.mimeType,\n ref.path\n );\n const targetPath = this.buildAttachmentTargetPath(\n displayName,\n effectiveMimeType,\n ref.path\n );\n\n let targetFile: any = null;\n\n if (\n sourceFile.storage &&\n sourceFile.storage !== \"local\"\n ) {\n const copiedData = await this.readAttachmentDataFromSource(\n ref.path,\n sourceFile\n );\n if (!copiedData) {\n continue;\n }\n const writeResult = await targetThread.writeFile(\n targetPath,\n copiedData,\n effectiveMimeType,\n {\n width: sourceFile.width ?? ref.width,\n height: sourceFile.height ?? ref.height,\n metadata: sourceFile.metadata,\n }\n );\n if (writeResult.success && writeResult.file) {\n targetFile = writeResult.file;\n }\n } else {\n const sourceData = await this.readFile(ref.path);\n if (!sourceData.success || !sourceData.data) {\n continue;\n }\n\n const writeResult = await targetThread.writeFile(\n targetPath,\n sourceData.data,\n effectiveMimeType,\n {\n width: sourceFile.width ?? ref.width,\n height: sourceFile.height ?? ref.height,\n metadata: sourceFile.metadata,\n }\n );\n if (writeResult.success && writeResult.file) {\n targetFile = writeResult.file;\n }\n }\n\n if (!targetFile) {\n continue;\n }\n\n copied.push({\n id: crypto.randomUUID(),\n type: \"file\",\n path: targetPath,\n name: displayName,\n mimeType: this.resolveAttachmentMimeType(\n targetFile.mimeType,\n effectiveMimeType,\n targetPath\n ),\n size: targetFile.size || ref.size,\n width: targetFile.width ?? sourceFile.width ?? ref.width,\n height: targetFile.height ?? sourceFile.height ?? ref.height,\n });\n }\n\n return copied;\n }\n\n private async readAttachmentDataFromSource(\n path: string,\n sourceFile: { storage?: string | null; location?: string | null }\n ): Promise<string | null> {\n // Always try thread FS read first. Some non-local backends still expose\n // file bytes through readFile while not providing a public location URL.\n const sourceData = await this.readFile(path);\n if (sourceData.success && sourceData.data) {\n return sourceData.data;\n }\n\n if (!sourceFile.storage || sourceFile.storage === \"local\") {\n return null;\n }\n\n const location = sourceFile.location;\n if (!location || !/^https?:\\/\\//i.test(location)) {\n return null;\n }\n\n try {\n const response = await fetch(location);\n if (!response.ok) {\n return null;\n }\n const buffer = await response.arrayBuffer();\n return this.arrayBufferToBase64(buffer);\n } catch {\n return null;\n }\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n private formatSubagentAttachmentPathSummary(\n attachments: AttachmentRef[] | undefined\n ): string {\n if (!attachments || attachments.length === 0) {\n return \"\";\n }\n const paths = attachments\n .map((attachment) => attachment.path)\n .filter((path) => typeof path === \"string\" && path.length > 0);\n if (paths.length === 0) {\n return \"\";\n }\n const label = paths.length === 1 ? \"attachment\" : \"attachments\";\n return `\\n\\nThe subagent also returned the following ${label}:\\n\\n${paths.join(\"\\n\")}`;\n }\n\n private async persistParentHandoffStatusMessage(\n parentThreadId: string,\n kind: \"result\" | \"failure\"\n ): Promise<void> {\n const id = crypto.randomUUID();\n const createdAt = Date.now() * TIMESTAMP_MULTIPLIER;\n const content =\n kind === \"failure\"\n ? \"Subagent forwarded failure details to parent thread.\"\n : \"Subagent forwarded results to parent thread.\";\n const metadata = {\n status_kind: \"subagent_event\",\n subagent_event: \"parent_handoff\",\n handoff_kind: kind,\n parent_thread_id: parentThreadId,\n };\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, silent, metadata, prompt) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,\n id,\n \"system\",\n content,\n createdAt,\n 1,\n JSON.stringify(metadata),\n null\n );\n\n this.broadcastMessage({\n id,\n role: \"system\",\n content,\n created_at: createdAt,\n silent: true,\n metadata,\n depth: 0,\n });\n }\n\n private buildMissingTerminalSessionFailure(\n flowResult: Pick<FlowResult, \"stopReason\" | \"stopReasonCode\">\n ): string {\n const reason =\n flowResult.stopReason?.trim() ||\n \"subagent execution stopped unexpectedly\";\n return (\n `Subagent execution stopped before completion (${reason}). ` +\n `It did not call a terminal session tool (sessionStop/sessionFail).`\n );\n }\n\n private async deliverCompletionToParentIfNeeded(\n threadId: string,\n agentName: string,\n parentThreadId: string | null,\n previousTopLevelMessageId: string | null,\n flowResult: Pick<FlowResult, \"stopped\" | \"stopReason\" | \"stopReasonCode\">\n ): Promise<void> {\n if (!parentThreadId || !flowResult.stopped) {\n return;\n }\n\n const terminalToolNames = await this.getTerminalSessionToolNames(agentName);\n const sessionFailToolNames = terminalToolNames.fail;\n const hasTerminalSessionTools = terminalToolNames.all.size > 0;\n\n const latestTerminalMessage = hasTerminalSessionTools\n ? await this.getLatestTerminalSessionMessageAfter(\n previousTopLevelMessageId,\n terminalToolNames.all\n )\n : null;\n const latest = latestTerminalMessage ?? await this.getLatestTopLevelMessage();\n if (!latest && !hasTerminalSessionTools) {\n return;\n }\n\n if (latest && latest.id === previousTopLevelMessageId && !hasTerminalSessionTools) {\n return;\n }\n const isTerminalSessionMessage =\n !!latest &&\n latest.role === \"tool\" &&\n !!latest.name &&\n terminalToolNames.all.has(latest.name);\n const isFailSessionTerminal =\n isTerminalSessionMessage && !!latest.name && sessionFailToolNames.has(latest.name);\n const isSuccessfulTerminalSessionMessage =\n isTerminalSessionMessage && latest?.tool_status !== \"error\";\n const isFailureWithoutTerminalMessage =\n hasTerminalSessionTools && !isSuccessfulTerminalSessionMessage;\n const isErrorTerminal =\n latest?.tool_status === \"error\" ||\n isFailSessionTerminal ||\n isFailureWithoutTerminalMessage;\n\n let refs: AttachmentRef[] = [];\n if (hasTerminalSessionTools) {\n refs = this.parseAttachmentRefsJson(latestTerminalMessage?.attachments ?? null) ?? [];\n } else if (latest?.attachments) {\n refs = this.parseAttachmentRefsJson(latest.attachments) ?? [];\n }\n\n try {\n const parentId = this.env.AGENT_BUILDER_THREAD.idFromName(parentThreadId);\n const parentStub = this.env.AGENT_BUILDER_THREAD.get(parentId) as unknown as DurableThread;\n const parentCommunication = await this.getParentCommunicationModeForChild(\n parentStub,\n parentThreadId,\n threadId\n );\n const copiedRefs = await this.copyAttachmentRefsToThread(\n refs,\n parentStub as any,\n `from-subagent-${threadId}`\n );\n\n const resultContent =\n isFailureWithoutTerminalMessage\n ? this.buildMissingTerminalSessionFailure(flowResult)\n : (latest?.content ||\n (isErrorTerminal\n ? \"Subagent execution failed.\"\n : \"Subagent completed.\"));\n const attachmentSummary = this.formatSubagentAttachmentPathSummary(copiedRefs);\n const messageContent = isErrorTerminal\n ? `Subagent (reference: ${threadId}) has reported a failure:\\n\\n${resultContent}${attachmentSummary}`\n : `Subagent (reference: ${threadId}) has returned the following result:\\n\\n${resultContent}${attachmentSummary}`;\n\n if (parentCommunication !== \"explicit\") {\n await parentStub.queueMessage(parentThreadId, {\n role: \"user\",\n content: messageContent,\n attachments: copiedRefs,\n silent: true,\n metadata: { subagent_id: threadId },\n });\n }\n\n const terminalChildRun = hasTerminalSessionTools;\n await parentStub.updateChildRegistryStatus(\n parentThreadId,\n threadId,\n terminalChildRun ? \"terminated\" : \"idle\"\n );\n if (parentCommunication !== \"explicit\") {\n await this.persistParentHandoffStatusMessage(\n parentThreadId,\n isErrorTerminal ? \"failure\" : \"result\"\n );\n }\n if (terminalChildRun) {\n await this.terminateThread(threadId);\n }\n } catch (error) {\n console.error(\"[DurableThread] Failed to deliver subagent completion to parent:\", error);\n }\n }\n\n private async getParentCommunicationModeForChild(\n parentStub: DurableThread,\n parentThreadId: string,\n childThreadId: string\n ): Promise<\"implicit\" | \"explicit\"> {\n if (typeof parentStub.getChildrenRegistry !== \"function\") {\n return \"implicit\";\n }\n\n try {\n const entries = await parentStub.getChildrenRegistry(parentThreadId);\n const childEntry = entries.find((entry) => entry.reference === childThreadId) as\n | (SubagentRegistryEntry & { parentCommunication?: unknown })\n | undefined;\n return childEntry?.parentCommunication === \"explicit\" ? \"explicit\" : \"implicit\";\n } catch {\n return \"implicit\";\n }\n }\n\n /**\n * Stop the currently executing thread (RPC method)\n * Simple \"off\" switch - stops turns, only cleared by user messages\n */\n async stop(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Set the persistent stop flag in SQLite (prevents new turns from starting)\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = 'true' WHERE key = 'stopped'`\n );\n\n // Abort any in-flight request\n if (this.currentAbortController) {\n this.currentAbortController.abort();\n }\n\n // Mark all pending messages as failed\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n const updateCursor = await this.ctx.storage.sql.exec(\n `UPDATE messages SET status = 'failed', response_completed_at = ? WHERE status = 'pending'`,\n now\n );\n \n // Broadcast updates for all pending messages\n const cursor = await this.ctx.storage.sql.exec(\n `SELECT id, role, content, tool_calls, tool_call_id, tool_status, created_at, log_id, status, request_sent_at, response_completed_at FROM messages WHERE response_completed_at = ?`,\n now\n );\n for (const row of cursor) {\n this.broadcastMessage({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n created_at: row.created_at as number,\n log_id: row.log_id as string | null,\n status: \"failed\",\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n });\n }\n\n // Find all tool calls that don't have responses yet and create error responses\n const messagesWithToolsCursor = await this.ctx.storage.sql.exec(\n `SELECT id, tool_calls, depth FROM messages WHERE tool_calls IS NOT NULL AND tool_calls != 'null' AND (depth IS NULL OR depth = 0)`\n );\n\n for (const msgRow of messagesWithToolsCursor) {\n try {\n const toolCalls = JSON.parse(msgRow.tool_calls as string);\n if (Array.isArray(toolCalls)) {\n for (const tc of toolCalls) {\n // Check if this tool call already has a response\n const responseExists = await this.ctx.storage.sql.exec(\n `SELECT id FROM messages WHERE tool_call_id = ? AND role = 'tool'`,\n tc.id\n );\n const responses = responseExists.toArray();\n\n if (responses.length === 0) {\n // Create error response for this tool call\n const toolResponseId = crypto.randomUUID();\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, tool_call_id, tool_status, created_at, status, prompt) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n toolResponseId,\n 'tool',\n 'Execution stopped by user',\n tc.id,\n 'error',\n now,\n 'completed',\n null\n );\n\n // Broadcast the error tool response\n this.broadcastMessage({\n id: toolResponseId,\n role: 'tool',\n content: 'Execution stopped by user',\n tool_call_id: tc.id,\n tool_status: 'error',\n created_at: now,\n status: 'completed',\n });\n\n }\n }\n }\n } catch (e) {\n console.error('[DurableThread.stop] Error processing tool calls:', e);\n }\n }\n\n // Create and broadcast interruption message immediately\n const interruptionMessageId = crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, status, prompt) VALUES (?, ?, ?, ?, ?, ?)`,\n interruptionMessageId,\n \"system\",\n \"Execution stopped by user\",\n timestamp,\n \"completed\",\n null\n );\n\n // Broadcast the interruption message to WebSocket clients\n this.broadcastMessage({\n id: interruptionMessageId,\n role: \"system\",\n content: \"Execution stopped by user\",\n created_at: timestamp,\n status: \"completed\",\n });\n\n // Mark all incomplete logs as complete\n await this.ctx.storage.sql.exec(\n `UPDATE logs SET is_complete = 1 WHERE is_complete = 0`\n );\n \n // Query and broadcast all logs that were just marked complete\n // Include all fields required by LogListItem interface in UI\n const logsCursor = await this.ctx.storage.sql.exec(\n `SELECT id, message_id, provider, model, model_name, prompt_name, tools_called,\n queued_tools, provider_tools, parent_log_id, retry_of_log_id, error, cost_total, is_complete, created_at\n FROM logs WHERE is_complete = 1 ORDER BY created_at DESC LIMIT 50`\n );\n for (const logRow of logsCursor) {\n this.broadcastLog({\n type: 'log_data',\n log_id: logRow.id as string,\n data: {\n id: logRow.id as string,\n message_id: logRow.message_id as string,\n provider: logRow.provider as string,\n model: logRow.model as string,\n model_name: logRow.model_name as string | null,\n prompt_name: logRow.prompt_name as string | null,\n tools_called: logRow.tools_called as string | null,\n queued_tools: logRow.queued_tools as string | null,\n provider_tools: logRow.provider_tools as string | null,\n parent_log_id: logRow.parent_log_id as string | null,\n retry_of_log_id: logRow.retry_of_log_id as string | null,\n error: logRow.error as string | null,\n cost_total: logRow.cost_total as number | null,\n is_complete: true,\n created_at: logRow.created_at as number,\n }\n });\n }\n\n // Broadcast stop event to WebSocket clients\n this.broadcastLog({\n type: \"stopped_by_user\",\n timestamp: Date.now(),\n });\n\n return Response.json(\n { status: \"stopped\", message: \"Thread execution stopped\" },\n { status: 200 }\n );\n } catch (error: any) {\n console.error(\"Error in stop:\", error);\n return Response.json(\n { error: error.message || \"Failed to stop thread\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Continue execution from where it stopped (RPC method)\n * Useful for debugging - continues the FlowEngine with additional steps\n * without adding a new message.\n *\n * @param threadId The thread ID\n * @param side Which side to start from ('a' or 'b'), defaults to 'a'\n */\n async continueExecution(\n threadId: string,\n side: 'a' | 'b' = 'a'\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n await this.assertNotTerminated();\n\n // Clear the stop flag\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = 'false' WHERE key = 'stopped'`\n );\n\n // Enqueue the continue operation\n const queueId = await this.alarmQueue.enqueue(\n \"continueExecution\",\n { threadId, side },\n 1 // Execute almost immediately\n );\n\n return Response.json(\n {\n status: \"queued\",\n queueId,\n message: \"Continuing execution. Connect via WebSocket for real-time updates.\",\n },\n { status: 202 }\n );\n } catch (error: any) {\n console.error(\"Error in continueExecution:\", error);\n return Response.json(\n { error: error.message || \"Failed to continue execution\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * Get message history (RPC method)\n *\n * By default, returns the newest messages (when truncating), but in chronological\n * order (oldest first in the array). This is ideal for chat UIs where messages\n * should be appended and scrolled to the bottom.\n *\n * The offset parameter allows \"scrolling up\" to view older messages.\n *\n * Example:\n * - getMessages(10, 0) -> newest 10 messages, oldest first in array\n * - getMessages(10, 10) -> next 10 older messages, oldest first in array\n *\n * @param limit Number of messages to return (default: 100)\n * @param offset Number of newest messages to skip (default: 0)\n * @param order Internal query order - \"DESC\" (default) fetches newest first then reverses\n * @param includeSilent Include silent messages (UI-only messages)\n * @param maxDepth Maximum depth to include (default: 0 for top-level only)\n */\n async getMessages(\n limit: number = 100,\n offset: number = 0,\n order: \"ASC\" | \"DESC\" = \"DESC\",\n includeSilent: boolean = false,\n maxDepth: number = 0\n ) {\n await this.ensureMigrated();\n try {\n // Build WHERE clause for silent messages and depth\n const whereClauses = [];\n if (!includeSilent) {\n whereClauses.push(\"silent = 0\");\n }\n whereClauses.push(`(depth <= ${maxDepth} OR depth IS NULL)`);\n const whereClause =\n whereClauses.length > 0 ? `WHERE ${whereClauses.join(\" AND \")}` : \"\";\n const orderDirection = order === \"ASC\" ? \"ASC\" : \"DESC\";\n const combinedMessagesSql = `\n WITH combined_messages AS (\n SELECT\n rowid AS source_rowid,\n 0 AS source_order,\n 'message' AS source,\n id, role, content, name, tool_calls, tool_call_id, tool_status,\n log_id, created_at, silent, parent_id, depth, status,\n reasoning_content, reasoning_details, attachments, metadata,\n subagent_id\n FROM messages\n UNION ALL\n SELECT\n rowid AS source_rowid,\n 1 AS source_order,\n 'queue' AS source,\n id, role, content, NULL AS name, NULL AS tool_calls,\n NULL AS tool_call_id, NULL AS tool_status, NULL AS log_id,\n created_at, silent, NULL AS parent_id, 0 AS depth,\n 'pending' AS status, NULL AS reasoning_content,\n NULL AS reasoning_details, attachments, metadata,\n NULL AS subagent_id\n FROM message_queue\n UNION ALL\n SELECT\n rowid AS source_rowid,\n 2 AS source_order,\n 'send_queue' AS source,\n COALESCE(json_extract(args, '$.messageId'), id) AS id,\n COALESCE(json_extract(args, '$.role'), 'user') AS role,\n json_extract(args, '$.content') AS content,\n NULL AS name, NULL AS tool_calls,\n NULL AS tool_call_id, NULL AS tool_status, NULL AS log_id,\n created_at, 0 AS silent, NULL AS parent_id, 0 AS depth,\n 'pending' AS status, NULL AS reasoning_content,\n NULL AS reasoning_details,\n json_extract(args, '$.attachments') AS attachments,\n NULL AS metadata,\n NULL AS subagent_id\n FROM alarm_queue\n WHERE method = 'processMessage'\n AND status IN ('pending', 'processing')\n AND (\n status = 'pending'\n OR json_extract(args, '$.messageId') IS NOT NULL\n )\n AND NOT EXISTS (\n SELECT 1\n FROM messages persisted\n WHERE persisted.id = COALESCE(json_extract(alarm_queue.args, '$.messageId'), alarm_queue.id)\n )\n )\n `;\n\n // Get total count\n const countResult = await this.ctx.storage.sql.exec<{ total: number }>(\n `\n ${combinedMessagesSql}\n SELECT COUNT(*) as total FROM combined_messages ${whereClause}\n `\n );\n const total = countResult.one().total;\n\n // Fetch messages in DESC order (newest first) to handle truncation correctly\n // Then reverse the array to return chronological order (oldest first)\n const result = await this.ctx.storage.sql.exec<{\n source: string;\n id: string;\n role: string;\n content: string | null;\n name: string | null;\n tool_calls: string | null;\n tool_call_id: string | null;\n tool_status: string | null;\n log_id: string | null;\n created_at: number;\n silent: number;\n parent_id: string | null;\n depth: number;\n status: string | null;\n reasoning_content: string | null;\n reasoning_details: string | null;\n attachments: string | null;\n metadata: string | null;\n subagent_id: string | null;\n }>(\n `\n ${combinedMessagesSql}\n SELECT source, id, role, content, name, tool_calls, tool_call_id,\n tool_status, log_id, created_at, silent, parent_id, depth, status,\n reasoning_content, reasoning_details, attachments, metadata,\n subagent_id\n FROM combined_messages\n ${whereClause}\n ORDER BY created_at ${orderDirection}, source_order ${orderDirection}, source_rowid ${orderDirection}\n LIMIT ? OFFSET ?\n `,\n limit,\n offset\n );\n\n let messages = result.toArray().map((row) => {\n const metadata = this.parseMessageMetadata(row.metadata);\n const isQueuedSource = row.source === \"queue\" || row.source === \"send_queue\";\n const messageMetadata = isQueuedSource\n ? {\n ...(metadata ?? {}),\n queued: true,\n queue_status: \"queued\",\n queue_source: row.source === \"send_queue\" ? \"alarm_queue\" : \"message_queue\",\n }\n : metadata;\n\n return {\n id: row.id,\n role: row.role,\n content: row.content,\n name: row.name,\n tool_calls: row.tool_calls,\n tool_call_id: row.tool_call_id,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n log_id: row.log_id,\n created_at: row.created_at,\n silent: row.silent === 1,\n parent_id: row.parent_id,\n depth: row.depth,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | null,\n reasoning_content: row.reasoning_content,\n reasoning_details: row.reasoning_details,\n attachments: row.attachments ? JSON.parse(row.attachments) : null,\n metadata: messageMetadata,\n subagent_id:\n row.subagent_id ?? (\n row.source === \"queue\"\n ? this.extractSubagentIdFromMetadata(row.metadata)\n : null\n ),\n };\n });\n\n const subagentIds = Array.from(\n new Set(\n messages\n .map((message) =>\n typeof message.subagent_id === \"string\"\n ? message.subagent_id.trim()\n : \"\"\n )\n .filter((id) => id.length > 0)\n )\n );\n if (subagentIds.length > 0) {\n const projectionMap = await this.resolveSubagentMessageProjections(\n subagentIds\n );\n messages = messages.map((message) => {\n const subagentId =\n typeof message.subagent_id === \"string\"\n ? message.subagent_id.trim()\n : \"\";\n if (!subagentId) {\n return message;\n }\n const projection = projectionMap.get(subagentId);\n return projection ? { ...message, ...projection } : message;\n });\n }\n\n // Reverse to chronological order (oldest first) when using DESC\n // This ensures newest messages are at the end of the array (natural chat order)\n if (order === \"DESC\") {\n messages = messages.reverse();\n }\n\n const hasMore = offset + messages.length < total;\n\n return { messages, total, hasMore };\n } catch (error: any) {\n console.error(\"Error in getMessages:\", error);\n throw error;\n }\n }\n\n /**\n * Get specific messages, optionally expanding any requested tool-call message\n * to the full contiguous workblock it belongs to.\n */\n async getMessagesByIds(\n ids: string[],\n includeSilent: boolean = false,\n maxDepth: number = 0,\n includeWorkblocks: boolean = false\n ) {\n await this.ensureMigrated();\n\n const uniqueIds = Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)));\n if (uniqueIds.length === 0) {\n return { messages: [], total: 0, hasMore: false };\n }\n\n if (uniqueIds.length > 200) {\n throw new Error(\"Too many message IDs requested\");\n }\n\n const whereClauses = [];\n if (!includeSilent) {\n whereClauses.push(\"silent = 0\");\n }\n whereClauses.push(`(depth <= ${maxDepth} OR depth IS NULL)`);\n const baseWhereClause =\n whereClauses.length > 0 ? whereClauses.join(\" AND \") : \"1 = 1\";\n\n type MessageRow = {\n id: string;\n role: string;\n content: string | null;\n name: string | null;\n tool_calls: string | null;\n tool_call_id: string | null;\n tool_status: string | null;\n log_id: string | null;\n created_at: number;\n silent: number;\n parent_id: string | null;\n depth: number;\n status: string | null;\n reasoning_content: string | null;\n reasoning_details: string | null;\n attachments: string | null;\n metadata: string | null;\n subagent_id: string | null;\n };\n\n const mapRows = async (rows: MessageRow[]) => {\n let messages = rows.map((row) => {\n let metadata: Record<string, unknown> | undefined;\n if (typeof row.metadata === \"string\") {\n try {\n const parsed = JSON.parse(row.metadata);\n if (parsed && typeof parsed === \"object\") {\n metadata = parsed as Record<string, unknown>;\n }\n } catch {\n metadata = undefined;\n }\n }\n\n return {\n id: row.id,\n role: row.role,\n content: row.content,\n name: row.name,\n tool_calls: row.tool_calls,\n tool_call_id: row.tool_call_id,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n log_id: row.log_id,\n created_at: row.created_at,\n silent: row.silent === 1,\n parent_id: row.parent_id,\n depth: row.depth,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | null,\n reasoning_content: row.reasoning_content,\n reasoning_details: row.reasoning_details,\n attachments: row.attachments ? JSON.parse(row.attachments) : null,\n metadata,\n subagent_id: row.subagent_id,\n };\n });\n\n const subagentIds = Array.from(\n new Set(\n messages\n .map((message) =>\n typeof message.subagent_id === \"string\"\n ? message.subagent_id.trim()\n : \"\"\n )\n .filter((id) => id.length > 0)\n )\n );\n if (subagentIds.length > 0) {\n const projectionMap = await this.resolveSubagentMessageProjections(\n subagentIds\n );\n messages = messages.map((message) => {\n const subagentId =\n typeof message.subagent_id === \"string\"\n ? message.subagent_id.trim()\n : \"\";\n if (!subagentId) {\n return message;\n }\n const projection = projectionMap.get(subagentId);\n return projection ? { ...message, ...projection } : message;\n });\n }\n\n return messages;\n };\n\n const selectColumns = `\n id, role, content, name, tool_calls, tool_call_id, tool_status, log_id,\n created_at, silent, parent_id, depth, status, reasoning_content,\n reasoning_details, attachments, metadata, subagent_id\n `;\n\n if (!includeWorkblocks) {\n const placeholders = uniqueIds.map(() => \"?\").join(\", \");\n const rows = await this.ctx.storage.sql\n .exec<MessageRow>(\n `\n SELECT ${selectColumns}\n FROM messages\n WHERE ${baseWhereClause} AND id IN (${placeholders})\n ORDER BY created_at ASC, rowid ASC\n `,\n ...uniqueIds\n )\n .toArray();\n const messages = await mapRows(rows);\n return { messages, total: messages.length, hasMore: false };\n }\n\n const allRows = await this.ctx.storage.sql\n .exec<MessageRow>(\n `\n SELECT ${selectColumns}\n FROM messages\n WHERE ${baseWhereClause}\n ORDER BY created_at ASC, rowid ASC\n `\n )\n .toArray();\n\n const requestedIds = new Set(uniqueIds);\n const selectedIds = new Set<string>();\n const isWorkblockRow = (row: MessageRow) =>\n row.role === \"tool\" ||\n (row.role === \"assistant\" && typeof row.tool_calls === \"string\" && row.tool_calls.length > 0);\n\n for (let index = 0; index < allRows.length; index++) {\n const row = allRows[index];\n if (!requestedIds.has(row.id)) continue;\n\n if (!isWorkblockRow(row)) {\n selectedIds.add(row.id);\n continue;\n }\n\n let start = index;\n while (start > 0 && isWorkblockRow(allRows[start - 1])) {\n start--;\n }\n\n let end = index;\n while (end + 1 < allRows.length && isWorkblockRow(allRows[end + 1])) {\n end++;\n }\n\n for (let i = start; i <= end; i++) {\n selectedIds.add(allRows[i].id);\n }\n }\n\n const messages = await mapRows(\n allRows.filter((row) => selectedIds.has(row.id))\n );\n\n return { messages, total: messages.length, hasMore: false };\n }\n\n /**\n * Delete a message (RPC method)\n * Also cleans up any attachment files stored on the thread filesystem\n */\n async deleteMessage(messageId: string) {\n await this.ensureMigrated();\n\n try {\n if (await this.cancelQueuedMessage(messageId)) {\n return { success: true };\n }\n\n // Get message with attachments before deleting\n const rows = await this.ctx.storage.sql\n .exec<{ id: string; attachments: string | null }>(\n `SELECT id, attachments FROM messages WHERE id = ?`,\n messageId\n )\n .toArray();\n\n if (rows.length === 0) {\n return { success: false, error: \"Message not found\" };\n }\n\n // Clean up attachment files\n const attachmentsJson = rows[0].attachments;\n if (attachmentsJson) {\n try {\n // unlinkFile handles chunked files automatically via cascade\n await this.deleteAttachmentRefsFromJson(attachmentsJson);\n } catch (e) {\n console.error(\"Failed to cleanup attachments:\", e);\n // Continue with delete even if cleanup fails\n }\n }\n\n // Delete the message (tool_calls should cascade delete due to foreign key)\n await this.ctx.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n messageId\n );\n\n return { success: true };\n } catch (error: any) {\n console.error(\"Error in deleteMessage:\", error);\n return {\n success: false,\n error: error.message || \"Failed to delete message\",\n };\n }\n }\n\n /**\n * Update a message's content (RPC method)\n */\n async updateMessageContent(messageId: string, content: string) {\n await this.ensureMigrated();\n\n try {\n // Check if message exists\n const checkResult = await this.ctx.storage.sql.exec(\n `SELECT id FROM messages WHERE id = ?`,\n messageId\n );\n\n const messageExists = checkResult.toArray().length > 0;\n\n if (!messageExists) {\n return { success: false, error: \"Message not found\" };\n }\n\n // Update the message content\n await this.ctx.storage.sql.exec(\n `UPDATE messages SET content = ? WHERE id = ?`,\n content,\n messageId\n );\n\n return { success: true };\n } catch (error: any) {\n console.error(\"Error in updateMessageContent:\", error);\n return {\n success: false,\n error: error.message || \"Failed to update message\",\n };\n }\n }\n\n /**\n * Seed messages directly into the database (RPC method - for testing)\n * This bypasses the normal message processing flow\n */\n async seedMessages(args: {\n messages: Array<{\n id: string;\n role: string;\n content: string;\n created_at: number;\n log_id?: string | null;\n }>;\n }) {\n await this.ensureMigrated();\n\n try {\n for (const msg of args.messages) {\n await this.ctx.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, created_at, log_id, prompt)\n VALUES (?, ?, ?, ?, ?, ?)\n `,\n msg.id,\n msg.role,\n msg.content,\n msg.created_at,\n msg.log_id ?? null,\n null\n );\n }\n\n return {\n success: true,\n count: args.messages.length,\n };\n } catch (error: any) {\n console.error(\"Error in seedMessages:\", error);\n return {\n success: false,\n error: error.message || \"Failed to seed messages\",\n };\n }\n }\n\n /**\n * Seed a log directly into the database (RPC method - for testing)\n * This bypasses the normal log creation flow\n */\n async seedLog(args: {\n id: string;\n message_id: string;\n provider: string;\n model: string;\n created_at: number;\n is_complete?: boolean;\n prompt_name?: string;\n }) {\n await this.ensureMigrated();\n\n try {\n await this.ctx.storage.sql.exec(\n `\n INSERT INTO logs (id, message_id, provider, model, is_complete, prompt_name, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `,\n args.id,\n args.message_id,\n args.provider,\n args.model,\n args.is_complete ? 1 : 0,\n args.prompt_name ?? null,\n args.created_at\n );\n\n return {\n success: true,\n id: args.id,\n };\n } catch (error: any) {\n console.error(\"Error in seedLog:\", error);\n return {\n success: false,\n error: error.message || \"Failed to seed log\",\n };\n }\n }\n\n /**\n * Get logs (RPC method)\n */\n async getLogs(\n limit: number = 100,\n offset: number = 0,\n order: \"ASC\" | \"DESC\" = \"ASC\"\n ) {\n await this.ensureMigrated();\n\n try {\n // Get total count\n const countResult = await this.ctx.storage.sql.exec<{ total: number }>(\n `SELECT COUNT(*) as total FROM logs`\n );\n const total = countResult.one().total || 0;\n\n // Get logs - only fields needed for list view\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n message_id: string;\n provider: string;\n actual_provider: string | null;\n standard_agents_router_used: number;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n queued_tools: string | null;\n provider_tools: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: number;\n created_at: number;\n request_body: string | null;\n }>(\n `\n SELECT\n id, message_id, provider, actual_provider, standard_agents_router_used, model, model_name, prompt_name,\n tools_called, queued_tools, provider_tools, parent_log_id, retry_of_log_id, error, cost_total,\n is_complete, created_at, request_body\n FROM logs\n ORDER BY created_at ${order}\n LIMIT ? OFFSET ?\n `,\n limit,\n offset\n );\n\n const logs = result.toArray().map((row) => ({\n id: row.id,\n message_id: row.message_id,\n provider: row.provider,\n actual_provider: row.actual_provider,\n standard_agents_router_used: row.standard_agents_router_used === 1,\n model: row.model,\n model_name: row.model_name,\n prompt_name: row.prompt_name,\n tools_called: row.tools_called,\n queued_tools: row.queued_tools,\n provider_tools: row.provider_tools,\n parent_log_id: row.parent_log_id,\n retry_of_log_id: row.retry_of_log_id,\n error: row.error,\n cost_total: row.cost_total,\n is_complete: row.is_complete === 1,\n created_at: row.created_at,\n request_body: row.request_body,\n }));\n\n const hasMore = offset + logs.length < total;\n\n return { logs, total, hasMore };\n } catch (error: any) {\n console.error(\"Error in getLogs:\", error);\n throw error;\n }\n }\n\n /**\n * Get specific logs, optionally including all descendant logs.\n */\n async getLogsByIds(\n ids: string[],\n includeDescendants: boolean = false,\n order: \"ASC\" | \"DESC\" = \"ASC\"\n ) {\n await this.ensureMigrated();\n\n const uniqueIds = Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)));\n if (uniqueIds.length === 0) {\n return { logs: [], total: 0, hasMore: false };\n }\n\n if (uniqueIds.length > 200) {\n throw new Error(\"Too many log IDs requested\");\n }\n\n const placeholders = uniqueIds.map(() => \"?\").join(\", \");\n const sourceQuery = includeDescendants\n ? `\n WITH RECURSIVE\n seed_logs(id) AS (\n SELECT id FROM logs WHERE id IN (${placeholders})\n ),\n descendant_logs(id) AS (\n SELECT id FROM seed_logs\n UNION\n SELECT logs.id\n FROM logs\n JOIN descendant_logs ON logs.parent_log_id = descendant_logs.id\n ),\n selected_logs(id) AS (\n SELECT id FROM descendant_logs\n UNION\n SELECT logs.parent_log_id\n FROM logs\n JOIN selected_logs ON logs.id = selected_logs.id\n WHERE logs.parent_log_id IS NOT NULL\n )\n SELECT\n id, message_id, provider, actual_provider, model, model_name, prompt_name,\n tools_called, queued_tools, provider_tools, parent_log_id, retry_of_log_id, error, cost_total,\n is_complete, created_at, request_body\n FROM logs\n WHERE id IN (SELECT id FROM selected_logs)\n ORDER BY created_at ${order}, rowid ${order}\n `\n : `\n SELECT\n id, message_id, provider, actual_provider, model, model_name, prompt_name,\n tools_called, queued_tools, provider_tools, parent_log_id, retry_of_log_id, error, cost_total,\n is_complete, created_at, request_body\n FROM logs\n WHERE id IN (${placeholders})\n ORDER BY created_at ${order}, rowid ${order}\n `;\n\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n message_id: string;\n provider: string;\n actual_provider: string | null;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n queued_tools: string | null;\n provider_tools: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: number;\n created_at: number;\n request_body: string | null;\n }>(sourceQuery, ...uniqueIds);\n\n const logs = result.toArray().map((row) => ({\n id: row.id,\n message_id: row.message_id,\n provider: row.provider,\n actual_provider: row.actual_provider,\n model: row.model,\n model_name: row.model_name,\n prompt_name: row.prompt_name,\n tools_called: row.tools_called,\n queued_tools: row.queued_tools,\n provider_tools: row.provider_tools,\n parent_log_id: row.parent_log_id,\n retry_of_log_id: row.retry_of_log_id,\n error: row.error,\n cost_total: row.cost_total,\n is_complete: row.is_complete === 1,\n created_at: row.created_at,\n request_body: row.request_body,\n }));\n\n return { logs, total: logs.length, hasMore: false };\n }\n\n /**\n * Get logs for specific messages, optionally expanding requested messages to\n * the full contiguous workblock they belong to and including descendant logs.\n */\n async getLogsByMessageIds(\n messageIds: string[],\n includeWorkblocks: boolean = false,\n includeDescendants: boolean = false,\n order: \"ASC\" | \"DESC\" = \"ASC\"\n ) {\n await this.ensureMigrated();\n\n const uniqueMessageIds = Array.from(\n new Set(messageIds.map((id) => id.trim()).filter(Boolean))\n );\n if (uniqueMessageIds.length === 0) {\n return { logs: [], total: 0, hasMore: false };\n }\n\n if (uniqueMessageIds.length > 200) {\n throw new Error(\"Too many message IDs requested\");\n }\n\n type MessageWorkblockRow = {\n id: string;\n role: string;\n tool_calls: string | null;\n };\n\n const selectedMessageIds = new Set<string>();\n\n if (includeWorkblocks) {\n const allRows = await this.ctx.storage.sql\n .exec<MessageWorkblockRow>(\n `\n SELECT id, role, tool_calls\n FROM messages\n ORDER BY created_at ASC, rowid ASC\n `\n )\n .toArray();\n\n const requestedIds = new Set(uniqueMessageIds);\n const isWorkblockRow = (row: MessageWorkblockRow) =>\n row.role === \"tool\" ||\n (row.role === \"assistant\" &&\n typeof row.tool_calls === \"string\" &&\n row.tool_calls.length > 0);\n\n for (let index = 0; index < allRows.length; index++) {\n const row = allRows[index];\n if (!requestedIds.has(row.id)) continue;\n\n if (!isWorkblockRow(row)) {\n selectedMessageIds.add(row.id);\n continue;\n }\n\n let start = index;\n while (start > 0 && isWorkblockRow(allRows[start - 1])) {\n start--;\n }\n\n let end = index;\n while (end + 1 < allRows.length && isWorkblockRow(allRows[end + 1])) {\n end++;\n }\n\n for (let i = start; i <= end; i++) {\n selectedMessageIds.add(allRows[i].id);\n }\n }\n } else {\n uniqueMessageIds.forEach((id) => selectedMessageIds.add(id));\n }\n\n const selectedMessageIdList = Array.from(selectedMessageIds);\n if (selectedMessageIdList.length === 0) {\n return { logs: [], total: 0, hasMore: false };\n }\n\n type LogListRow = {\n row_index: number;\n id: string;\n message_id: string;\n provider: string;\n actual_provider: string | null;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n queued_tools: string | null;\n provider_tools: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: number;\n created_at: number;\n request_body: string | null;\n };\n\n const rowsById = new Map<string, LogListRow>();\n const MESSAGE_ID_CHUNK_SIZE = 80;\n\n for (let index = 0; index < selectedMessageIdList.length; index += MESSAGE_ID_CHUNK_SIZE) {\n const chunk = selectedMessageIdList.slice(index, index + MESSAGE_ID_CHUNK_SIZE);\n const placeholders = chunk.map(() => \"?\").join(\", \");\n const sourceQuery = includeDescendants\n ? `\n WITH RECURSIVE\n seed_logs(id) AS (\n SELECT id FROM logs WHERE message_id IN (${placeholders})\n ),\n descendant_logs(id) AS (\n SELECT id FROM seed_logs\n UNION\n SELECT logs.id\n FROM logs\n JOIN descendant_logs ON logs.parent_log_id = descendant_logs.id\n ),\n selected_logs(id) AS (\n SELECT id FROM descendant_logs\n UNION\n SELECT logs.parent_log_id\n FROM logs\n JOIN selected_logs ON logs.id = selected_logs.id\n WHERE logs.parent_log_id IS NOT NULL\n )\n SELECT\n rowid AS row_index,\n id, message_id, provider, actual_provider, model, model_name, prompt_name,\n tools_called, queued_tools, provider_tools, parent_log_id, retry_of_log_id, error, cost_total,\n is_complete, created_at, request_body\n FROM logs\n WHERE id IN (SELECT id FROM selected_logs)\n ORDER BY created_at ${order}, rowid ${order}\n `\n : `\n SELECT\n rowid AS row_index,\n id, message_id, provider, actual_provider, model, model_name, prompt_name,\n tools_called, queued_tools, provider_tools, parent_log_id, retry_of_log_id, error, cost_total,\n is_complete, created_at, request_body\n FROM logs\n WHERE message_id IN (${placeholders})\n ORDER BY created_at ${order}, rowid ${order}\n `;\n\n const result = await this.ctx.storage.sql.exec<LogListRow>(sourceQuery, ...chunk);\n for (const row of result.toArray()) {\n rowsById.set(row.id, row);\n }\n }\n\n const rows = Array.from(rowsById.values()).sort((left, right) => {\n const createdAtDelta = left.created_at - right.created_at;\n const rowDelta = left.row_index - right.row_index;\n return order === \"ASC\"\n ? createdAtDelta || rowDelta\n : -createdAtDelta || -rowDelta;\n });\n\n const logs = rows.map((row) => ({\n id: row.id,\n message_id: row.message_id,\n provider: row.provider,\n actual_provider: row.actual_provider,\n model: row.model,\n model_name: row.model_name,\n prompt_name: row.prompt_name,\n tools_called: row.tools_called,\n queued_tools: row.queued_tools,\n provider_tools: row.provider_tools,\n parent_log_id: row.parent_log_id,\n retry_of_log_id: row.retry_of_log_id,\n error: row.error,\n cost_total: row.cost_total,\n is_complete: row.is_complete === 1,\n created_at: row.created_at,\n request_body: row.request_body,\n }));\n\n return { logs, total: logs.length, hasMore: false };\n }\n\n /**\n * Get detailed information for a single log (RPC method)\n * This includes all fields including large ones like request/response bodies\n */\n async getLogDetails(logId: string) {\n await this.ensureMigrated();\n\n try {\n const result = await this.ctx.storage.sql.exec<{\n id: string;\n message_id: string;\n provider: string;\n actual_provider: string | null;\n standard_agents_router_used: number;\n model: string;\n model_name: string | null;\n endpoint: string | null;\n request_body: string | null;\n request_headers: string | null;\n response_body: string | null;\n response_headers: string | null;\n status_code: number | null;\n reasoning_content: string | null;\n input_tokens: number | null;\n cached_tokens: number | null;\n output_tokens: number | null;\n reasoning_tokens: number | null;\n total_tokens: number | null;\n latency_ms: number | null;\n time_to_first_token_ms: number | null;\n finish_reason: string | null;\n error: string | null;\n error_type: string | null;\n cost_input: number | null;\n cost_output: number | null;\n cost_total: number | null;\n message_history_length: number | null;\n tools_available: number | null;\n prompt_name: string | null;\n tools_called: string | null;\n queued_tools: string | null;\n provider_tools: string | null;\n parent_log_id: string | null;\n tools_schema: string | null;\n system_prompt: string | null;\n errors: string | null;\n retry_of_log_id: string | null;\n tool_results: string | null;\n is_complete: number;\n created_at: number;\n source_message_role: string | null;\n source_message_content: string | null;\n source_message_created_at: number | null;\n source_message_metadata: string | null;\n }>(\n `\n SELECT\n l.id, l.message_id, l.provider, l.actual_provider, l.standard_agents_router_used, l.model, l.model_name, l.endpoint,\n l.request_body, l.request_headers, l.response_body, l.response_headers,\n l.status_code, l.reasoning_content, l.input_tokens, l.cached_tokens, l.output_tokens,\n l.reasoning_tokens, l.total_tokens, l.latency_ms, l.time_to_first_token_ms,\n l.finish_reason, l.error, l.error_type, l.cost_input, l.cost_output, l.cost_total,\n l.message_history_length, l.tools_available, l.prompt_name, l.tools_called,\n l.queued_tools, l.provider_tools, l.parent_log_id, l.tools_schema, l.system_prompt,\n l.errors, l.retry_of_log_id, l.tool_results, l.is_complete, l.created_at,\n m.role as source_message_role,\n m.content as source_message_content,\n m.created_at as source_message_created_at,\n m.metadata as source_message_metadata\n FROM logs l\n LEFT JOIN messages m ON m.id = l.message_id\n WHERE l.id = ?\n `,\n logId\n );\n\n const row = result.toArray()[0] ?? null;\n if (!row) {\n return null;\n }\n\n const scheduledEffectsResult = await this.ctx.storage.sql.exec<{\n id: string;\n args: string;\n scheduled_at: number;\n created_at: number;\n status: string;\n attempts: number;\n error: string | null;\n completed_at: number | null;\n manual_run: number | null;\n manual_run_at: number | null;\n replayed_from: string | null;\n }>(\n `\n SELECT\n id, args, scheduled_at, created_at, status, attempts, error,\n completed_at, manual_run, manual_run_at, replayed_from\n FROM alarm_queue\n WHERE method = 'runEffect' AND source_log_id = ?\n ORDER BY created_at ASC, scheduled_at ASC, id ASC\n `,\n logId\n );\n\n const scheduledEffects = scheduledEffectsResult.toArray().map((effectRow) => {\n let effectName = \"unknown_effect\";\n try {\n const payload = JSON.parse(effectRow.args) as {\n effectName?: unknown;\n };\n if (typeof payload.effectName === \"string\") {\n effectName = payload.effectName;\n }\n } catch {\n // Keep unknown_effect for malformed historical payloads.\n }\n\n return {\n id: effectRow.id,\n name: effectName,\n scheduledAt: effectRow.scheduled_at,\n createdAt: effectRow.created_at,\n status: effectRow.status,\n attempts: effectRow.attempts,\n error: effectRow.error,\n completedAt: effectRow.completed_at,\n manualRun: effectRow.manual_run === 1,\n manualRunAt: effectRow.manual_run_at,\n replayedFrom: effectRow.replayed_from,\n };\n });\n\n // Extract message_history from request_body for backward compatibility\n let messageHistory: string | null = null;\n if (row.request_body) {\n try {\n const requestBody = JSON.parse(row.request_body);\n if (requestBody.messages) {\n messageHistory = JSON.stringify(requestBody.messages);\n }\n } catch (e) {\n console.error(\"Failed to parse request_body to extract message_history:\", e);\n }\n }\n\n return {\n id: row.id,\n message_id: row.message_id,\n provider: row.provider,\n actual_provider: row.actual_provider,\n standard_agents_router_used: row.standard_agents_router_used === 1,\n model: row.model,\n model_name: row.model_name,\n endpoint: row.endpoint,\n request_body: row.request_body,\n request_headers: row.request_headers,\n response_body: row.response_body,\n response_headers: row.response_headers,\n status_code: row.status_code,\n reasoning_content: row.reasoning_content,\n input_tokens: row.input_tokens,\n cached_tokens: row.cached_tokens,\n output_tokens: row.output_tokens,\n reasoning_tokens: row.reasoning_tokens,\n total_tokens: row.total_tokens,\n latency_ms: row.latency_ms,\n time_to_first_token_ms: row.time_to_first_token_ms,\n finish_reason: row.finish_reason,\n error: row.error,\n error_type: row.error_type,\n cost_input: row.cost_input,\n cost_output: row.cost_output,\n cost_total: row.cost_total,\n message_history_length: row.message_history_length,\n tools_available: row.tools_available,\n prompt_name: row.prompt_name,\n tools_called: row.tools_called,\n queued_tools: row.queued_tools,\n provider_tools: row.provider_tools,\n parent_log_id: row.parent_log_id,\n tools_schema: row.tools_schema,\n message_history: messageHistory, // Extracted from request_body\n system_prompt: row.system_prompt,\n errors: row.errors,\n retry_of_log_id: row.retry_of_log_id,\n tool_results: row.tool_results,\n is_complete: row.is_complete === 1,\n created_at: row.created_at,\n source_message_role: row.source_message_role,\n source_message_content: row.source_message_content,\n source_message_created_at: row.source_message_created_at,\n source_message_metadata: row.source_message_metadata,\n scheduled_effects: JSON.stringify(scheduledEffects),\n };\n } catch (error: any) {\n console.error(\"Error in getLogDetails:\", error);\n throw error;\n }\n }\n\n /**\n * Get thread metadata (RPC method)\n */\n async getThreadMeta(threadId: string) {\n await this.ensureMigrated();\n\n try {\n // Get thread info from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Load agent info from TypeScript config\n let agentInfo = null;\n try {\n const agentDef = await this.loadAgent(threadMetadata.agent_name);\n const packageId = agentDef.__package?.packageId;\n const qualifyPromptName = (name: string | undefined): string | null => {\n if (!name) return null;\n if (name.includes('/')) return name;\n return packageId ? `${packageId}/${name}` : name;\n };\n agentInfo = {\n id: threadMetadata.agent_name,\n title: agentDef.title || threadMetadata.agent_name,\n type: agentDef.type,\n description: agentDef.description,\n icon: agentDef.icon,\n side_a_label: agentDef.sideA?.label,\n side_b_label: agentDef.sideB?.label,\n side_a_agent_prompt: qualifyPromptName(agentDef.sideA?.prompt),\n side_b_agent_prompt: qualifyPromptName(agentDef.sideB?.prompt),\n };\n } catch (e) {\n // Agent might not exist in config anymore\n console.warn(`Agent ${threadMetadata.agent_name} not found in config`);\n }\n\n // Get message count from Durable Object\n const messageCount = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM messages`\n );\n\n // Get log count from Durable Object\n const logCount = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM logs`\n );\n\n return {\n thread: {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n tags: threadMetadata.tags || [],\n parent: threadMetadata.parent ?? null,\n terminated: threadMetadata.terminated ?? null,\n created_at: threadMetadata.created_at,\n },\n agent: agentInfo,\n stats: {\n message_count: messageCount.one().count || 0,\n log_count: logCount.one().count || 0,\n },\n };\n } catch (error: any) {\n console.error(\"Error in getThreadMeta:\", error);\n throw error;\n }\n }\n\n /**\n * Update thread metadata (RPC method)\n * Calls the DurableAgentBuilder to update the thread registry\n */\n async updateThreadMeta(\n threadId: string,\n params: {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n env?: Record<string, string> | null;\n tenvs?: Record<string, unknown> | null;\n }\n ) {\n await this.ensureMigrated();\n\n try {\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const updated = await agentBuilder.updateThread(threadId, params);\n\n if (!updated) {\n return { success: false, error: `Thread not found: ${threadId}` };\n }\n\n return {\n success: true,\n thread: {\n id: updated.id,\n agent_id: updated.agent_name,\n user_id: updated.user_id,\n tags: updated.tags || [],\n created_at: updated.created_at,\n },\n };\n } catch (error: any) {\n console.error(\"Error in updateThreadMeta:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Delete thread data completely (RPC method)\n * This will permanently delete the Durable Object instance\n */\n async deleteThread() {\n await this.ensureMigrated();\n\n try {\n // Close all WebSocket connections before deletion\n for (const ws of this.logSockets) {\n try {\n ws.close(1000, \"Thread deleted\");\n } catch (e) {\n // Ignore errors closing sockets\n }\n }\n for (const ws of this.messageSockets) {\n try {\n ws.close(1000, \"Thread deleted\");\n } catch (e) {\n // Ignore errors closing sockets\n }\n }\n this.logSockets.clear();\n this.messageSockets.clear();\n\n // Delete alarm if configured (currently not used, but safe to call)\n await this.ctx.storage.deleteAlarm();\n\n // Delete all storage - this will permanently delete the Durable Object\n // and ensure no billing for storage\n await this.ctx.storage.deleteAll();\n\n // Reset migration version for next instantiation\n this.migratedToVersion = null;\n\n return { success: true, message: \"Thread completely deleted\" };\n } catch (error: any) {\n console.error(\"Error in deleteThread:\", error);\n throw error;\n }\n }\n\n /**\n * Handle WebSocket upgrade for real-time log streaming\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleLogsWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n server.serializeAttachment({ type: \"log\" });\n\n // Track this socket for broadcasting log updates\n this.logSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Handle WebSocket upgrade for real-time message streaming\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleMessagesWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Parse parameters from URL\n const url = new URL(request.url);\n const includeSilent = url.searchParams.get(\"includeSilent\") === \"true\";\n const depthParam = url.searchParams.get(\"depth\");\n const maxDepth = depthParam !== null ? parseInt(depthParam, 10) : 0; // Default to 0 (top-level only)\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n // Store includeSilent and maxDepth preferences in attachment\n server.serializeAttachment({ type: \"message\", includeSilent, maxDepth });\n\n // Track this socket for broadcasting message updates\n this.messageSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Broadcast a log record to all connected WebSocket clients\n */\n private broadcastLog(log: Record<string, any>): void {\n const payload = JSON.stringify(log);\n for (const ws of Array.from(this.logSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.logSockets.delete(ws);\n }\n } catch (err) {\n this.logSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a message record to all connected message WebSocket clients\n * Filters silent messages based on each socket's includeSilent preference\n */\n private broadcastMessage(message: Record<string, any>): void {\n // Get message depth (default to 0 for backward compatibility)\n const messageDepth = message.depth ?? 0;\n\n const payload = JSON.stringify({\n type: \"message_data\",\n message_id: message.id,\n depth: messageDepth,\n data: message,\n });\n\n // Check if message is silent\n const isSilent = message.silent === true || message.silent === 1;\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n // Get socket's preferences from attachment\n const attachment = ws.deserializeAttachment() as {\n type: string;\n includeSilent?: boolean;\n maxDepth?: number;\n };\n const includeSilent = attachment?.includeSilent ?? false;\n const maxDepth = attachment?.maxDepth ?? 0;\n\n // Filter by silent preference\n if (isSilent && !includeSilent) {\n continue;\n }\n\n // Filter by depth preference\n if (messageDepth > maxDepth) {\n continue;\n }\n\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send message to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n private async broadcastMessageWithSubagentProjection(\n message: Record<string, any>\n ): Promise<void> {\n const subagentId = this.asOptionalString(message.subagent_id);\n if (!subagentId) {\n this.broadcastMessage(message);\n return;\n }\n\n try {\n const projectionMap = await this.resolveSubagentMessageProjections([\n subagentId,\n ]);\n const projection = projectionMap.get(subagentId);\n if (projection) {\n this.broadcastMessage({ ...message, ...projection });\n return;\n }\n } catch {\n // Fall through to raw broadcast below.\n }\n\n this.broadcastMessage(message);\n }\n\n /**\n * Broadcast a content chunk for real-time streaming\n * Does NOT update database - only broadcasts to connected clients\n */\n private broadcastMessageChunk(messageId: string, chunk: string, depth: number = 0): void {\n const payload = JSON.stringify({\n type: \"message_chunk\",\n message_id: messageId,\n depth: depth,\n chunk: chunk,\n });\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n // Get socket's maxDepth preference\n const attachment = ws.deserializeAttachment() as {\n type: string;\n maxDepth?: number;\n };\n const maxDepth = attachment?.maxDepth ?? 0;\n\n // Filter by depth preference\n if (depth > maxDepth) {\n continue;\n }\n\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send message chunk to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a telemetry event to all connected message WebSocket clients\n * Used for execution status updates (step_started, tool_started, etc.)\n */\n private broadcastTelemetry(event: TelemetryEvent): void {\n const payload = JSON.stringify(event);\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send telemetry to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * Broadcast a custom event to all connected message WebSocket clients\n * Used by tools via emitThreadEvent() to send user-defined events\n */\n private broadcastEvent(type: string, data: unknown): void {\n const payload = JSON.stringify({\n type: \"event\",\n eventType: type,\n data,\n timestamp: Date.now(),\n });\n\n for (const ws of Array.from(this.messageSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.messageSockets.delete(ws);\n }\n } catch (err) {\n console.error(\n \"[DurableThread] Failed to send event to WebSocket:\",\n err\n );\n this.messageSockets.delete(ws);\n }\n }\n }\n\n /**\n * WebSocket Hibernation API handler for incoming messages\n * Called when a message is received on a hibernated WebSocket\n */\n async webSocketMessage(\n ws: WebSocket,\n message: string | ArrayBuffer\n ): Promise<void> {\n try {\n // Handle ping/pong for connection health checks\n if (typeof message === \"string\" && message === \"ping\") {\n ws.send(\"pong\");\n return;\n }\n } catch (error) {\n console.error(\"[DurableThread] Error handling WebSocket message:\", error);\n }\n }\n\n /**\n * WebSocket Hibernation API handler for connection close\n * Called when a WebSocket connection is closed\n * Note: Do NOT call ws.close() here - the connection is already closed\n */\n async webSocketClose(\n ws: WebSocket,\n _code: number,\n _reason: string,\n _wasClean: boolean\n ): Promise<void> {\n const attachment = ws.deserializeAttachment();\n\n // Remove from tracking sets\n if (attachment?.type === \"log\") {\n this.logSockets.delete(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.delete(ws);\n }\n }\n\n /**\n * WebSocket Hibernation API handler for errors\n * Called when a WebSocket encounters an error\n */\n async webSocketError(ws: WebSocket, error: unknown): Promise<void> {\n const attachment = ws.deserializeAttachment();\n console.error(\n `[DurableThread] WebSocket error (type: ${attachment?.type}):`,\n error\n );\n\n // Remove from tracking sets\n if (attachment?.type === \"log\") {\n this.logSockets.delete(ws);\n } else if (attachment?.type === \"message\") {\n this.messageSockets.delete(ws);\n }\n }\n\n /**\n * Alarm handler - called by Cloudflare when a scheduled alarm fires\n * Processes the next item in the alarm queue\n *\n * Important: This method must NEVER throw an exception, as that would break\n * the alarm chain. All errors are caught and logged.\n */\n async alarm(): Promise<void> {\n await this.ensureMigrated();\n\n try {\n await this.alarmQueue.processNext();\n } catch (error) {\n // Log but don't throw - Cloudflare will retry automatically\n // We've already logged the error in AlarmQueue, but log again for visibility\n console.error(\"[DurableThread] Alarm handler failed:\", error);\n }\n }\n\n /**\n * Internal method: Execute a flow (called by alarm queue)\n * This is the actual execution logic, separate from the public execute() RPC method\n */\n private async executeFlow(\n threadId: string,\n agentName: string,\n initial_messages?: any[],\n data?: any,\n awaitCompletion: boolean = true\n ): Promise<FlowResult> {\n await this.assertNotTerminated();\n\n // NOTE: We do NOT clear the stop flag here - it should only be cleared by user messages\n // This ensures that if execution was stopped, it stays stopped until the user explicitly\n // sends a new message\n\n // Set execution state\n this.isExecuting = true;\n this.currentAbortController = new AbortController();\n\n try {\n // Load agent configuration from TypeScript config via virtual module\n const agentDef = await this.loadAgent(agentName);\n\n // For packed agents, qualify prompt names with the package ID\n const packageId = agentDef.__package?.packageId;\n const qualifyPromptName = (name: string | undefined): string | null => {\n if (!name) return null;\n // If already qualified, return as-is\n if (name.includes('/')) return name;\n // If from a packed agent, qualify with package ID\n if (packageId) return `${packageId}/${name}`;\n return name;\n };\n const sideASession = getResolvedSessionBindingsFromSide(agentDef.sideA);\n const sideBSession = getResolvedSessionBindingsFromSide(agentDef.sideB);\n\n // Convert agent definition to Agent type expected by FlowEngine\n const agent: Agent = {\n id: agentName,\n title: agentDef.title || agentName,\n type: agentDef.type,\n created_at: Date.now(),\n max_session_turns: agentDef.maxSessionTurns,\n side_a_label: agentDef.sideA?.label,\n side_a_agent_prompt: qualifyPromptName(agentDef.sideA?.prompt),\n side_a_stop_on_response: agentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: agentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: agentDef.sideA?.stopToolResponseProperty,\n side_a_max_steps: agentDef.sideA?.maxSteps,\n side_a_session_stop_tool: sideASession.stop.toolName,\n side_a_session_stop_message_property: sideASession.stop.messageProperty,\n side_a_session_stop_attachments_property: sideASession.stop.attachmentsProperty,\n side_a_session_fail_tool: sideASession.fail.toolName,\n side_a_session_fail_message_property: sideASession.fail.messageProperty,\n side_a_session_fail_attachments_property: sideASession.fail.attachmentsProperty,\n side_a_session_status_tool: sideASession.status.toolName,\n side_a_session_status_message_property: sideASession.status.messageProperty,\n side_a_session_status_attachments_property: sideASession.status.attachmentsProperty,\n side_b_label: agentDef.sideB?.label,\n side_b_agent_prompt: qualifyPromptName(agentDef.sideB?.prompt),\n side_b_stop_on_response: agentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: agentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: agentDef.sideB?.stopToolResponseProperty,\n side_b_max_steps: agentDef.sideB?.maxSteps,\n side_b_session_stop_tool: sideBSession.stop.toolName,\n side_b_session_stop_message_property: sideBSession.stop.messageProperty,\n side_b_session_stop_attachments_property: sideBSession.stop.attachmentsProperty,\n side_b_session_fail_tool: sideBSession.fail.toolName,\n side_b_session_fail_message_property: sideBSession.fail.messageProperty,\n side_b_session_fail_attachments_property: sideBSession.fail.attachmentsProperty,\n side_b_session_status_tool: sideBSession.status.toolName,\n side_b_session_status_message_property: sideBSession.status.messageProperty,\n side_b_session_status_attachments_property: sideBSession.status.attachmentsProperty,\n };\n\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n\n // Adapt thread metadata to expected format\n const thread = {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map agent_name to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n env: threadMetadata.env ?? threadMetadata.tenvs ?? null,\n env_types: threadMetadata.env_types ?? null,\n tenvs: threadMetadata.tenvs,\n properties: threadMetadata.properties,\n parent: threadMetadata.parent ?? null,\n terminated: threadMetadata.terminated ?? null,\n created_at: threadMetadata.created_at,\n };\n\n // Import FlowEngine dynamically\n const { FlowEngine } = await import(\"../agents/FlowEngine.js\");\n\n // Store initial messages with proper timestamps (if provided)\n let rootMessageId: string | undefined;\n if (\n initial_messages &&\n Array.isArray(initial_messages) &&\n initial_messages.length > 0\n ) {\n const messagesToStore = initial_messages.map((msg: any) => ({\n ...msg,\n id: msg.id || crypto.randomUUID(),\n created_at: msg.created_at || Date.now() * 1000,\n }));\n\n for (const msg of messagesToStore) {\n const attachmentsJson =\n msg.attachments === undefined || msg.attachments === null\n ? null\n : typeof msg.attachments === \"string\"\n ? msg.attachments\n : JSON.stringify(msg.attachments);\n const toolCallsJson =\n msg.tool_calls === undefined || msg.tool_calls === null\n ? null\n : typeof msg.tool_calls === \"string\"\n ? msg.tool_calls\n : JSON.stringify(msg.tool_calls);\n const metadataJson =\n msg.metadata === undefined || msg.metadata === null\n ? null\n : typeof msg.metadata === \"string\"\n ? msg.metadata\n : JSON.stringify(msg.metadata);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_calls, tool_call_id, attachments, silent, metadata, subagent_id, created_at, prompt) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)`,\n msg.id,\n msg.role,\n msg.content || null,\n msg.name || null,\n toolCallsJson,\n msg.tool_call_id || null,\n attachmentsJson,\n msg.silent ? 1 : 0,\n metadataJson,\n typeof msg.subagent_id === \"string\" ? msg.subagent_id : null,\n msg.created_at,\n null\n );\n if (msg.role === \"user\" && !msg.silent) {\n rootMessageId = msg.id;\n }\n }\n }\n\n rootMessageId = await this.ensureRootMessageId(rootMessageId);\n\n // Execute the flow\n // Derive namespace context from agent definition for packed agent isolation\n const namespaceContext = createNamespaceContext(agentDef);\n\n const flowResult = await FlowEngine.execute({\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n threadId,\n thread: {\n instance: this as any, // Cast to avoid circular reference issues\n metadata: thread,\n },\n namespaceContext,\n emitLog: (log: unknown) => this.broadcastLog(log as Record<string, any>),\n emitMessage: (message: unknown) => {\n void this.broadcastMessageWithSubagentProjection(\n message as Record<string, any>\n );\n },\n emitMessageChunk: (messageId: string, chunk: string, depth?: number) =>\n this.broadcastMessageChunk(messageId, chunk, depth),\n emitTelemetry: (event) => this.broadcastTelemetry(event),\n emitEvent: (type, data) => this.broadcastEvent(type, data),\n rootMessageId,\n abortController: this.currentAbortController,\n }, awaitCompletion);\n return flowResult;\n } finally {\n // Clear execution state\n this.isExecuting = false;\n this.currentAbortController = null;\n }\n }\n\n /**\n * Internal method: Execute an effect (called by alarm queue)\n * Effects run outside the tool execution context.\n */\n private async executeEffect(\n effectName: string,\n effectArgs: Record<string, unknown>,\n threadId: string,\n effectRunId?: string\n ): Promise<void> {\n console.log(`[DurableThread] Executing effect: ${effectName}`);\n\n try {\n // Load effect definition\n const [description, schema, handler] = await this.loadEffect(effectName);\n\n // Validate args if schema exists\n let validatedArgs = effectArgs;\n if (schema) {\n const parsed = schema.safeParse(effectArgs);\n if (!parsed.success) {\n throw new Error(`Effect ${effectName} args validation failed: ${parsed.error.message}`);\n }\n validatedArgs = parsed.data;\n }\n\n // Get thread metadata for ThreadState\n const metadata = await this.getThreadMetadata(threadId);\n\n // Create ThreadState for effect execution (no FlowState, not in execution)\n const { ThreadStateImpl } = await import(\"../agents/ThreadStateImpl.js\");\n const state = ThreadStateImpl.fromThreadInstance(this as any, metadata, {\n scheduledEffect: {\n id: effectRunId ?? null,\n name: effectName,\n },\n });\n\n // Execute the effect\n await handler(state, validatedArgs);\n\n console.log(`[DurableThread] Effect ${effectName} completed successfully`);\n } catch (error) {\n console.error(`[DurableThread] Effect ${effectName} failed:`, error);\n throw error;\n }\n }\n\n /**\n * Internal method: Process a message (called by alarm queue)\n * This is the actual message processing logic, separate from the public sendMessage() RPC method\n */\n private async processMessage(\n threadId: string,\n content: string,\n role: string = \"user\",\n attachments?: string, // JSON array of AttachmentRef\n queuedMessageId?: string,\n queuedAt?: number\n ): Promise<void> {\n await this.assertNotTerminated();\n\n // ONLY clear the stop flag when a USER message is sent\n if (role === \"user\") {\n await this.ctx.storage.sql.exec(\n `UPDATE execution_state SET value = 'false' WHERE key = 'stopped'`\n );\n }\n\n // Set execution state\n this.isExecuting = true;\n this.currentAbortController = new AbortController();\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n\n // Adapt thread metadata to expected format\n const thread = {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name, // Map agent_name to agent_id for backwards compat\n user_id: threadMetadata.user_id,\n env: threadMetadata.env ?? threadMetadata.tenvs ?? null,\n env_types: threadMetadata.env_types ?? null,\n tenvs: threadMetadata.tenvs,\n properties: threadMetadata.properties,\n parent: threadMetadata.parent ?? null,\n terminated: threadMetadata.terminated ?? null,\n created_at: threadMetadata.created_at,\n };\n\n // Load agent configuration from TypeScript config via virtual module\n const agentDef = await this.loadAgent(threadMetadata.agent_name);\n\n // For packed agents, qualify prompt names with the package ID\n const packageId = agentDef.__package?.packageId;\n const qualifyPromptName = (name: string | undefined): string | null => {\n if (!name) return null;\n // If already qualified, return as-is\n if (name.includes('/')) return name;\n // If from a packed agent, qualify with package ID\n if (packageId) return `${packageId}/${name}`;\n return name;\n };\n const sideASession = getResolvedSessionBindingsFromSide(agentDef.sideA);\n const sideBSession = getResolvedSessionBindingsFromSide(agentDef.sideB);\n\n // Convert agent definition to Agent type expected by FlowEngine\n const agent: Agent = {\n id: threadMetadata.agent_name,\n title: agentDef.title || threadMetadata.agent_name,\n type: agentDef.type,\n created_at: Date.now(),\n max_session_turns: agentDef.maxSessionTurns,\n side_a_label: agentDef.sideA?.label,\n side_a_agent_prompt: qualifyPromptName(agentDef.sideA?.prompt),\n side_a_stop_on_response: agentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: agentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: agentDef.sideA?.stopToolResponseProperty,\n side_a_max_steps: agentDef.sideA?.maxSteps,\n side_a_session_stop_tool: sideASession.stop.toolName,\n side_a_session_stop_message_property: sideASession.stop.messageProperty,\n side_a_session_stop_attachments_property: sideASession.stop.attachmentsProperty,\n side_a_session_fail_tool: sideASession.fail.toolName,\n side_a_session_fail_message_property: sideASession.fail.messageProperty,\n side_a_session_fail_attachments_property: sideASession.fail.attachmentsProperty,\n side_a_session_status_tool: sideASession.status.toolName,\n side_a_session_status_message_property: sideASession.status.messageProperty,\n side_a_session_status_attachments_property: sideASession.status.attachmentsProperty,\n side_b_label: agentDef.sideB?.label,\n side_b_agent_prompt: qualifyPromptName(agentDef.sideB?.prompt),\n side_b_stop_on_response: agentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: agentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: agentDef.sideB?.stopToolResponseProperty,\n side_b_max_steps: agentDef.sideB?.maxSteps,\n side_b_session_stop_tool: sideBSession.stop.toolName,\n side_b_session_stop_message_property: sideBSession.stop.messageProperty,\n side_b_session_stop_attachments_property: sideBSession.stop.attachmentsProperty,\n side_b_session_fail_tool: sideBSession.fail.toolName,\n side_b_session_fail_message_property: sideBSession.fail.messageProperty,\n side_b_session_fail_attachments_property: sideBSession.fail.attachmentsProperty,\n side_b_session_status_tool: sideBSession.status.toolName,\n side_b_session_status_message_property: sideBSession.status.messageProperty,\n side_b_session_status_attachments_property: sideBSession.status.attachmentsProperty,\n };\n\n // Prepare the message object\n const messageId = this.asOptionalString(queuedMessageId) ?? crypto.randomUUID();\n const timestamp =\n typeof queuedAt === \"number\" && Number.isFinite(queuedAt) && queuedAt > 0\n ? queuedAt\n : Date.now() * 1000;\n\n let message: any = {\n id: messageId,\n role,\n content,\n attachments: attachments || null,\n created_at: timestamp,\n };\n\n // Create minimal state for hook execution\n const state = {\n threadId,\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n thread: {\n instance: this as any,\n metadata: thread,\n },\n };\n\n // Run before_create_message hook\n const { FlowEngine } = await import(\"../agents/FlowEngine.js\");\n message = await FlowEngine.runBeforeCreateMessageHook(state as any, message);\n\n // Get the current prompt from agent definition (side A is the default)\n const currentPrompt = agentDef.sideA?.prompt || null;\n\n // Store the message (possibly modified by hook)\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, attachments, created_at, prompt) VALUES (?, ?, ?, ?, ?, ?)`,\n message.id,\n message.role,\n message.content,\n message.attachments,\n message.created_at,\n currentPrompt\n );\n\n // Run after_create_message hook\n await FlowEngine.runAfterCreateMessageHook(state as any, message);\n\n // Broadcast the newly created message to WebSocket clients immediately\n // Parse attachments from JSON string to array for WebSocket clients\n this.broadcastMessage({\n id: message.id,\n role: message.role,\n content: message.content,\n attachments: message.attachments ? JSON.parse(message.attachments) : null,\n created_at: message.created_at,\n });\n\n // Execute the flow (continuing from existing messages)\n // FlowEngine already imported above for hook call\n\n // Determine which side should execute next based on the message that was just sent\n // If message is from side A (assistant), next execution should be side B\n // If message is from side B (user), next execution should be side A\n const nextSide = role === \"assistant\" ? \"b\" : \"a\";\n\n // Create StreamManager for HTTP streaming (WebSocket telemetry is handled separately)\n const stream = new StreamManager();\n\n // Derive namespace context from agent definition for packed agent isolation\n const namespaceContext = createNamespaceContext(agentDef);\n\n await FlowEngine.execute({\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n threadId,\n thread: {\n instance: this as any, // Cast to avoid circular reference issues\n metadata: thread,\n },\n namespaceContext,\n rootMessageId: message.id,\n currentSide: nextSide,\n stream,\n emitLog: (log: unknown) => this.broadcastLog(log as Record<string, any>),\n emitMessage: (message: unknown) => {\n void this.broadcastMessageWithSubagentProjection(\n message as Record<string, any>\n );\n },\n emitMessageChunk: (messageId: string, chunk: string, depth?: number) =>\n this.broadcastMessageChunk(messageId, chunk, depth),\n emitTelemetry: (event) => this.broadcastTelemetry(event),\n emitEvent: (type, data) => this.broadcastEvent(type, data),\n abortController: this.currentAbortController,\n }, true);\n } finally {\n // Clear execution state\n this.isExecuting = false;\n this.currentAbortController = null;\n }\n }\n\n /**\n * Internal method: Continue execution without adding a message (called by alarm queue)\n * This allows resuming FlowEngine execution from where it stopped.\n */\n private async doContinueExecution(\n threadId: string,\n side: 'a' | 'b' = 'a'\n ): Promise<void> {\n await this.assertNotTerminated();\n\n // Set execution state\n this.isExecuting = true;\n this.currentAbortController = new AbortController();\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = this.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = this.env.AGENT_BUILDER.get(agentBuilderId) as any;\n const threadMetadata = await agentBuilder.getThread(threadId);\n\n if (!threadMetadata) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n\n // Adapt thread metadata to expected format\n const thread = {\n id: threadMetadata.id,\n agent_id: threadMetadata.agent_name,\n user_id: threadMetadata.user_id,\n env: threadMetadata.env ?? threadMetadata.tenvs ?? null,\n env_types: threadMetadata.env_types ?? null,\n tenvs: threadMetadata.tenvs,\n properties: threadMetadata.properties,\n parent: threadMetadata.parent ?? null,\n terminated: threadMetadata.terminated ?? null,\n created_at: threadMetadata.created_at,\n };\n\n // Load agent configuration from TypeScript config via virtual module\n const agentDef = await this.loadAgent(threadMetadata.agent_name);\n\n // For packed agents, qualify prompt names with the package ID\n const packageId = agentDef.__package?.packageId;\n const qualifyPromptName = (name: string | undefined): string | null => {\n if (!name) return null;\n // If already qualified, return as-is\n if (name.includes('/')) return name;\n // If from a packed agent, qualify with package ID\n if (packageId) return `${packageId}/${name}`;\n return name;\n };\n const sideASession = getResolvedSessionBindingsFromSide(agentDef.sideA);\n const sideBSession = getResolvedSessionBindingsFromSide(agentDef.sideB);\n\n // Convert agent definition to Agent type expected by FlowEngine\n const agent: Agent = {\n id: threadMetadata.agent_name,\n title: agentDef.title || threadMetadata.agent_name,\n type: agentDef.type,\n created_at: Date.now(),\n max_session_turns: agentDef.maxSessionTurns,\n side_a_label: agentDef.sideA?.label,\n side_a_agent_prompt: qualifyPromptName(agentDef.sideA?.prompt),\n side_a_stop_on_response: agentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: agentDef.sideA?.stopTool,\n side_a_stop_tool_response_property: agentDef.sideA?.stopToolResponseProperty,\n side_a_max_steps: agentDef.sideA?.maxSteps,\n side_a_session_stop_tool: sideASession.stop.toolName,\n side_a_session_stop_message_property: sideASession.stop.messageProperty,\n side_a_session_stop_attachments_property: sideASession.stop.attachmentsProperty,\n side_a_session_fail_tool: sideASession.fail.toolName,\n side_a_session_fail_message_property: sideASession.fail.messageProperty,\n side_a_session_fail_attachments_property: sideASession.fail.attachmentsProperty,\n side_a_session_status_tool: sideASession.status.toolName,\n side_a_session_status_message_property: sideASession.status.messageProperty,\n side_a_session_status_attachments_property: sideASession.status.attachmentsProperty,\n side_b_label: agentDef.sideB?.label,\n side_b_agent_prompt: qualifyPromptName(agentDef.sideB?.prompt),\n side_b_stop_on_response: agentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: agentDef.sideB?.stopTool,\n side_b_stop_tool_response_property: agentDef.sideB?.stopToolResponseProperty,\n side_b_max_steps: agentDef.sideB?.maxSteps,\n side_b_session_stop_tool: sideBSession.stop.toolName,\n side_b_session_stop_message_property: sideBSession.stop.messageProperty,\n side_b_session_stop_attachments_property: sideBSession.stop.attachmentsProperty,\n side_b_session_fail_tool: sideBSession.fail.toolName,\n side_b_session_fail_message_property: sideBSession.fail.messageProperty,\n side_b_session_fail_attachments_property: sideBSession.fail.attachmentsProperty,\n side_b_session_status_tool: sideBSession.status.toolName,\n side_b_session_status_message_property: sideBSession.status.messageProperty,\n side_b_session_status_attachments_property: sideBSession.status.attachmentsProperty,\n };\n\n // Create StreamManager for HTTP streaming\n const { StreamManager } = await import(\"../agents/StreamManager.js\");\n const stream = new StreamManager();\n\n // Get the most recent message ID to use as root\n const rootMessageId = await this.ensureRootMessageId();\n\n // Execute the flow continuing from existing messages\n const { FlowEngine } = await import(\"../agents/FlowEngine.js\");\n\n // Derive namespace context from agent definition for packed agent isolation\n const namespaceContext = createNamespaceContext(agentDef);\n\n console.log(`[DurableThread] Continuing execution on side ${side}, rootMessageId=${rootMessageId}`);\n\n const previousTopLevelMessage = await this.getLatestTopLevelMessage();\n const flowResult = await FlowEngine.execute({\n agentConfig: agent,\n storage: this.ctx.storage,\n env: this.env,\n threadId,\n thread: {\n instance: this as any,\n metadata: thread,\n },\n namespaceContext,\n rootMessageId,\n currentSide: side,\n stream,\n emitLog: (log: unknown) => this.broadcastLog(log as Record<string, any>),\n emitMessage: (message: unknown) => {\n void this.broadcastMessageWithSubagentProjection(\n message as Record<string, any>\n );\n },\n emitMessageChunk: (messageId: string, chunk: string, depth?: number) =>\n this.broadcastMessageChunk(messageId, chunk, depth),\n emitTelemetry: (event) => this.broadcastTelemetry(event),\n emitEvent: (type, data) => this.broadcastEvent(type, data),\n abortController: this.currentAbortController,\n }, true);\n\n await this.deliverCompletionToParentIfNeeded(\n threadId,\n threadMetadata.agent_name,\n thread.parent,\n previousTopLevelMessage?.id ?? null,\n flowResult\n );\n } finally {\n // Clear execution state\n this.isExecuting = false;\n this.currentAbortController = null;\n\n const latestQueuedSide = await this.getLatestQueuedMessageSide();\n if (latestQueuedSide) {\n await this.ensureQueuedMessageExecution(threadId, latestQueuedSide);\n }\n }\n }\n\n private async getLatestQueuedMessageSide(): Promise<\"a\" | \"b\" | null> {\n try {\n const cursor = await this.ctx.storage.sql.exec<{ role: \"user\" | \"assistant\" }>(\n `\n SELECT role\n FROM message_queue\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `\n );\n const role = cursor.toArray()[0]?.role;\n if (role === \"user\") {\n return \"a\";\n }\n if (role === \"assistant\") {\n return \"b\";\n }\n return null;\n } catch (error) {\n console.error(\"[DurableThread] Failed to inspect queued messages:\", error);\n return null;\n }\n }\n\n /**\n * TEST METHOD: Queue a test operation\n * Used for testing alarm queue ordering and timing\n */\n async queueTestOperation(\n id: string,\n label: string,\n expectedOrder: number,\n delayMs: number\n ): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const queueId = await this.alarmQueue.enqueue(\n \"testOperation\",\n { id, label, expectedOrder },\n delayMs\n );\n\n return Response.json({ status: \"queued\", queueId });\n } catch (error: any) {\n console.error(\"Error queuing test operation:\", error);\n return Response.json(\n { error: error.message || \"Failed to queue test operation\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Get queue state\n */\n async getQueueState(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const state = await this.alarmQueue.getQueueState();\n return Response.json(state);\n } catch (error: any) {\n console.error(\"Error getting queue state:\", error);\n return Response.json(\n { error: error.message || \"Failed to get queue state\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Get test execution logs\n */\n async getTestLogs(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n label: string;\n expected_order: number;\n executed_at: number;\n }>(`\n SELECT id, label, expected_order, executed_at\n FROM test_operations\n ORDER BY executed_at ASC\n `);\n\n const logs = cursor.toArray();\n return Response.json({ logs });\n } catch (error: any) {\n // Table might not exist yet\n return Response.json({ logs: [] });\n }\n }\n\n /**\n * TEST METHOD: Clear test logs\n */\n async clearTestLogs(): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n // Create table if it doesn't exist\n await this.ctx.storage.sql.exec(`\n CREATE TABLE IF NOT EXISTS test_operations (\n id TEXT PRIMARY KEY,\n label TEXT NOT NULL,\n expected_order INTEGER NOT NULL,\n executed_at INTEGER NOT NULL\n )\n `);\n\n // Clear existing logs\n await this.ctx.storage.sql.exec(`DELETE FROM test_operations`);\n\n return Response.json({ status: \"cleared\" });\n } catch (error: any) {\n console.error(\"Error clearing test logs:\", error);\n return Response.json(\n { error: error.message || \"Failed to clear test logs\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Insert a malformed message with orphaned tool calls\n * This allows testing the tool call filtering logic\n */\n async insertOrphanedToolCall(params: {\n content?: string;\n toolCallId: string;\n toolName: string;\n toolArgs: string;\n }): Promise<Response> {\n await this.ensureMigrated();\n\n try {\n const messageId = crypto.randomUUID();\n const toolCalls = JSON.stringify([\n {\n id: params.toolCallId,\n type: \"function\",\n function: {\n name: params.toolName,\n arguments: params.toolArgs,\n },\n },\n ]);\n\n // Insert assistant message with tool_calls but no corresponding tool result\n await this.ctx.storage.sql.exec(\n `INSERT INTO messages (id, role, content, tool_calls, created_at, prompt)\n VALUES (?, 'assistant', ?, ?, ?, ?)`,\n messageId,\n params.content || null,\n toolCalls,\n Date.now() * 1000,\n null\n );\n\n return Response.json({\n status: \"inserted\",\n messageId,\n toolCallId: params.toolCallId,\n });\n } catch (error: any) {\n console.error(\"Error inserting orphaned tool call:\", error);\n return Response.json(\n { error: error.message || \"Failed to insert orphaned tool call\" },\n { status: 500 }\n );\n }\n }\n\n /**\n * TEST METHOD: Execute a test operation\n * Internal method called by alarm queue\n */\n private async testOperation(\n id: string,\n label: string,\n expectedOrder: number\n ): Promise<void> {\n const now = Date.now() * 1000; // Microseconds\n\n // Create table if it doesn't exist\n await this.ctx.storage.sql.exec(`\n CREATE TABLE IF NOT EXISTS test_operations (\n id TEXT PRIMARY KEY,\n label TEXT NOT NULL,\n expected_order INTEGER NOT NULL,\n executed_at INTEGER NOT NULL\n )\n `);\n\n // Log the execution\n await this.ctx.storage.sql.exec(\n `INSERT INTO test_operations (id, label, expected_order, executed_at) VALUES (?, ?, ?, ?)`,\n id,\n label,\n expectedOrder,\n now\n );\n }\n\n // ============================================================\n // File Storage Methods (RPC)\n // ============================================================\n\n /**\n * Get file storage helper instance\n */\n private getFileStorage() {\n // Lazy import to avoid circular dependencies\n const { FileStorage } = require(\"./files.js\");\n return new FileStorage(this.ctx.storage.sql);\n }\n\n /**\n * Write a file to storage (RPC method)\n */\n async writeFile(\n path: string,\n data: string, // base64 encoded\n mimeType: string,\n options?: {\n metadata?: Record<string, unknown>;\n thumbnail?: string; // base64 encoded\n }\n ) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n\n // Check if file exists before write to determine create vs update\n const existingFile = await fs.stat(path);\n const isUpdate = existingFile !== null;\n\n // Base64 decode with periodic yielding to avoid blocking event loop\n const binaryString = atob(data);\n const dataBuffer = new Uint8Array(binaryString.length);\n const YIELD_INTERVAL = 65536; // Yield every 64KB to allow other requests\n for (let i = 0; i < binaryString.length; i++) {\n dataBuffer[i] = binaryString.charCodeAt(i);\n if (i > 0 && i % YIELD_INTERVAL === 0) {\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n }\n\n let thumbnailBuffer: Uint8Array | undefined;\n if (options?.thumbnail) {\n const thumbBinary = atob(options.thumbnail);\n thumbnailBuffer = new Uint8Array(thumbBinary.length);\n for (let i = 0; i < thumbBinary.length; i++) {\n thumbnailBuffer[i] = thumbBinary.charCodeAt(i);\n if (i > 0 && i % YIELD_INTERVAL === 0) {\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n }\n }\n\n const record = await fs.writeFile(path, dataBuffer, mimeType, {\n metadata: options?.metadata,\n thumbnail: thumbnailBuffer,\n });\n\n // Emit file change event\n this.broadcastEvent(isUpdate ? \"file_updated\" : \"file_created\", {\n path,\n file: record,\n });\n\n return { success: true, file: record };\n } catch (error: any) {\n console.error(\"Error in writeFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Write a text file to storage (RPC method)\n */\n async writeTextFile(\n path: string,\n content: string,\n mimeType: string = \"text/plain\",\n options?: {\n metadata?: Record<string, unknown>;\n }\n ) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n\n // Check if file exists before write to determine create vs update\n const existingFile = await fs.stat(path);\n const isUpdate = existingFile !== null;\n\n const record = await fs.writeFile(path, content, mimeType, options);\n\n // Emit file change event\n this.broadcastEvent(isUpdate ? \"file_updated\" : \"file_created\", {\n path,\n file: record,\n });\n\n return { success: true, file: record };\n } catch (error: any) {\n console.error(\"Error in writeTextFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Process an image using sip (WASM-based image processing)\n * This runs inside the DO where WASM is properly initialized.\n *\n * @param data - base64 encoded image data\n * @param mimeType - MIME type of the input image\n * @returns Processed image data, dimensions, and mimeType\n */\n async processImage(\n data: string,\n mimeType: string\n ): Promise<{\n success: boolean;\n data?: string; // base64 encoded\n mimeType?: string;\n width?: number;\n height?: number;\n error?: string;\n }> {\n try {\n // Dynamic import to avoid bundling image-processing into main chunk\n const { processImage, base64ToArrayBuffer, arrayBufferToBase64 } = await import(\n \"../image-processing/index.js\"\n );\n\n const buffer = base64ToArrayBuffer(data);\n const processed = await processImage(buffer, mimeType);\n\n return {\n success: true,\n data: arrayBufferToBase64(processed.data),\n mimeType: processed.mimeType,\n width: processed.width,\n height: processed.height,\n };\n } catch (error: any) {\n console.error(\"[DurableThread.processImage] Error:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Link to an external file (RPC method)\n */\n async linkFile(\n path: string,\n location: string,\n options?: {\n mimeType?: string;\n size?: number;\n metadata?: Record<string, unknown>;\n }\n ) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const record = await fs.linkFile(path, location, options);\n return { success: true, file: record };\n } catch (error: any) {\n console.error(\"Error in linkFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Read a file from storage (RPC method)\n * Returns base64-encoded data\n */\n async readFile(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const data = await fs.readFile(path);\n\n if (data === null) {\n return { success: false, error: \"File not found or external\" };\n }\n\n // Convert ArrayBuffer to base64\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n\n return { success: true, data: base64 };\n } catch (error: any) {\n console.error(\"Error in readFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Read a text file from storage (RPC method)\n */\n async readTextFile(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const content = await fs.readTextFile(path);\n\n if (content === null) {\n return { success: false, error: \"File not found or external\" };\n }\n\n return { success: true, content };\n } catch (error: any) {\n console.error(\"Error in readTextFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Get file metadata (RPC method)\n */\n async statFile(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const record = await fs.stat(path);\n\n if (record === null) {\n return { success: false, error: \"File not found\" };\n }\n\n return { success: true, file: record };\n } catch (error: any) {\n console.error(\"Error in statFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Check if file exists (RPC method)\n */\n async fileExists(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const exists = await fs.exists(path);\n return { success: true, exists };\n } catch (error: any) {\n console.error(\"Error in fileExists:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Delete a file (RPC method)\n */\n async unlinkFile(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n await fs.unlink(path);\n\n // Emit file deleted event\n this.broadcastEvent(\"file_deleted\", { path });\n\n return { success: true };\n } catch (error: any) {\n console.error(\"Error in unlinkFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Create a directory (RPC method)\n */\n async mkdirFile(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const record = await fs.mkdir(path);\n\n // Emit file created event for directory\n this.broadcastEvent(\"file_created\", { path, file: record });\n\n return { success: true, directory: record };\n } catch (error: any) {\n console.error(\"Error in mkdirFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * List directory contents (RPC method)\n */\n async readdirFile(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const files = await fs.readdir(path);\n return { success: true, files };\n } catch (error: any) {\n console.error(\"Error in readdirFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Remove empty directory (RPC method)\n */\n async rmdirFile(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n await fs.rmdir(path);\n\n // Emit file deleted event for directory\n this.broadcastEvent(\"file_deleted\", { path });\n\n return { success: true };\n } catch (error: any) {\n console.error(\"Error in rmdirFile:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Get file storage statistics (RPC method)\n */\n async getFileStats() {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const stats = await fs.getFileStats();\n return { success: true, stats };\n } catch (error: any) {\n console.error(\"Error in getFileStats:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Get thumbnail for an image (RPC method)\n * Returns base64-encoded data\n */\n async getFileThumbnail(path: string) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const data = await fs.getThumbnail(path);\n\n if (data === null) {\n return { success: false, error: \"Thumbnail not found\" };\n }\n\n // Convert ArrayBuffer to base64\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n\n return { success: true, data: base64 };\n } catch (error: any) {\n console.error(\"Error in getFileThumbnail:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Search file contents using FTS5 (RPC method)\n */\n async grepFiles(\n pattern: string,\n options?: {\n path?: string;\n limit?: number;\n }\n ) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const results = await fs.grep(pattern, options);\n return { success: true, results };\n } catch (error: any) {\n console.error(\"Error in grepFiles:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Find files by path pattern (RPC method)\n */\n async findFiles(\n pattern: string,\n options?: {\n type?: \"file\" | \"directory\" | \"all\";\n limit?: number;\n }\n ) {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const files = await fs.find(pattern, options);\n return { success: true, files };\n } catch (error: any) {\n console.error(\"Error in findFiles:\", error);\n return { success: false, error: error.message };\n }\n }\n\n // ============================================================\n // Chunked File Upload Methods (for files > 1.75MB)\n // ============================================================\n\n /**\n * Start a chunked file upload.\n * Creates file record with is_chunked=1 and chunk_count=null.\n * Caller should then use writeFileChunk() to write chunks.\n */\n async startChunkedUpload(\n path: string,\n totalSize: number,\n mimeType: string,\n options?: {\n metadata?: Record<string, unknown>;\n width?: number;\n height?: number;\n }\n ): Promise<{\n success: boolean;\n chunkSize?: number;\n expectedChunks?: number;\n error?: string;\n }> {\n await this.ensureMigrated();\n\n try {\n const { CHUNK_SIZE, normalizePath, basename } = await import(\"./files.js\");\n const normalizedPath = normalizePath(path);\n const name = basename(normalizedPath);\n const now = Date.now();\n const expectedChunks = Math.ceil(totalSize / CHUNK_SIZE);\n\n const metadataJson = options?.metadata\n ? JSON.stringify(options.metadata)\n : null;\n\n // Delete any existing file and chunks\n await this.ctx.storage.sql.exec(\n `DELETE FROM file_chunks WHERE file_path = ?`,\n normalizedPath\n );\n\n // Create file record with is_chunked=1, chunk_count=null (pending completion)\n await this.ctx.storage.sql.exec(\n `INSERT OR REPLACE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at, width, height, is_chunked, chunk_count)\n VALUES (?, ?, ?, 'local', NULL, NULL, NULL, ?, ?, NULL, 0, ?, ?, ?, 1, NULL)`,\n normalizedPath,\n name,\n mimeType,\n totalSize,\n metadataJson,\n now,\n options?.width ?? null,\n options?.height ?? null\n );\n\n return {\n success: true,\n chunkSize: CHUNK_SIZE,\n expectedChunks,\n };\n } catch (error: any) {\n console.error(\"Error in startChunkedUpload:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Write a single chunk of a chunked file upload.\n * @param path - File path\n * @param chunkIndex - 0-based chunk index\n * @param data - Base64 encoded chunk data\n */\n async writeFileChunk(\n path: string,\n chunkIndex: number,\n data: string // base64 encoded\n ): Promise<{\n success: boolean;\n error?: string;\n }> {\n await this.ensureMigrated();\n\n try {\n const { normalizePath } = await import(\"./files.js\");\n const normalizedPath = normalizePath(path);\n\n // Decode base64 to binary\n const binaryString = atob(data);\n const dataBuffer = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n dataBuffer[i] = binaryString.charCodeAt(i);\n }\n\n // Insert chunk\n await this.ctx.storage.sql.exec(\n `INSERT OR REPLACE INTO file_chunks (file_path, chunk_index, data) VALUES (?, ?, ?)`,\n normalizedPath,\n chunkIndex,\n dataBuffer\n );\n\n return { success: true };\n } catch (error: any) {\n console.error(\"Error in writeFileChunk:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Complete a chunked file upload.\n * Validates all chunks are present and sets chunk_count.\n */\n async completeChunkedUpload(\n path: string,\n expectedChunks: number,\n options?: {\n thumbnail?: string; // base64 encoded\n }\n ): Promise<{\n success: boolean;\n file?: import(\"../agents/types\").FileRecord;\n error?: string;\n }> {\n await this.ensureMigrated();\n\n try {\n const { normalizePath } = await import(\"./files.js\");\n const fs = this.getFileStorage();\n const normalizedPath = normalizePath(path);\n\n // Verify all chunks are present\n const countResult = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM file_chunks WHERE file_path = ?`,\n normalizedPath\n );\n const actualCount = countResult.one().count;\n\n if (actualCount !== expectedChunks) {\n return {\n success: false,\n error: `Expected ${expectedChunks} chunks, got ${actualCount}`,\n };\n }\n\n // Decode thumbnail if provided\n let thumbnailBuffer: Uint8Array | undefined;\n if (options?.thumbnail) {\n const thumbBinary = atob(options.thumbnail);\n thumbnailBuffer = new Uint8Array(thumbBinary.length);\n for (let i = 0; i < thumbBinary.length; i++) {\n thumbnailBuffer[i] = thumbBinary.charCodeAt(i);\n }\n }\n\n // Update file record with chunk_count and optional thumbnail\n await this.ctx.storage.sql.exec(\n `UPDATE files SET chunk_count = ?, thumbnail = ? WHERE path = ?`,\n expectedChunks,\n thumbnailBuffer || null,\n normalizedPath\n );\n\n // Get updated file record\n const file = await fs.stat(normalizedPath);\n\n // Emit file created event (chunked uploads are always new files)\n if (file) {\n this.broadcastEvent(\"file_created\", { path: normalizedPath, file });\n }\n\n return { success: true, file: file || undefined };\n } catch (error: any) {\n console.error(\"Error in completeChunkedUpload:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Read a single chunk of a file.\n * Use for streaming large files to client.\n */\n async readFileChunk(\n path: string,\n chunkIndex: number\n ): Promise<{\n success: boolean;\n data?: string; // base64 encoded\n error?: string;\n }> {\n await this.ensureMigrated();\n\n try {\n const { normalizePath } = await import(\"./files.js\");\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.ctx.storage.sql.exec<{ data: ArrayBuffer }>(\n `SELECT data FROM file_chunks WHERE file_path = ? AND chunk_index = ?`,\n normalizedPath,\n chunkIndex\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return { success: false, error: `Chunk ${chunkIndex} not found` };\n }\n\n // Encode to base64\n const chunk = new Uint8Array(rows[0].data);\n let binary = \"\";\n for (let i = 0; i < chunk.length; i++) {\n binary += String.fromCharCode(chunk[i]);\n }\n const base64 = btoa(binary);\n\n return { success: true, data: base64 };\n } catch (error: any) {\n console.error(\"Error in readFileChunk:\", error);\n return { success: false, error: error.message };\n }\n }\n\n /**\n * Get file info including chunking metadata.\n */\n async getFileInfo(\n path: string\n ): Promise<{\n success: boolean;\n file?: import(\"../agents/types\").FileRecord;\n error?: string;\n }> {\n await this.ensureMigrated();\n\n try {\n const fs = this.getFileStorage();\n const file = await fs.stat(path);\n\n if (!file) {\n return { success: false, error: \"File not found\" };\n }\n\n return { success: true, file };\n } catch (error: any) {\n console.error(\"Error in getFileInfo:\", error);\n return { success: false, error: error.message };\n }\n }\n}\n","import type { DurableObjectState } from \"@cloudflare/workers-types\";\n\nexport type AlarmQueueStatus =\n | \"pending\"\n | \"processing\"\n | \"completed\"\n | \"failed\"\n | \"agent_canceled\"\n | \"user_canceled\";\nexport type EffectCancelSource = \"agent\" | \"user\";\n\nexport interface EffectRunRecord {\n id: string;\n name: string;\n args: Record<string, unknown>;\n scheduledAt: number;\n createdAt: number;\n status: AlarmQueueStatus;\n attempts: number;\n error: string | null;\n completedAt: number | null;\n manualRun: boolean;\n manualRunAt: number | null;\n replayedFrom: string | null;\n}\n\nexport interface AlarmQueueEnqueueOptions {\n manualRun?: boolean;\n replayedFrom?: string | null;\n sourceLogId?: string | null;\n}\n\nexport interface EffectRunListOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface EffectRunListResult {\n effects: EffectRunRecord[];\n total: number;\n upcomingCount: number;\n limit: number;\n offset: number;\n}\n\nexport interface EffectRunActionResult {\n action: \"ran\" | \"replayed\";\n id: string;\n replayedId?: string;\n}\n\n/**\n * AlarmQueue - Manages a queue of scheduled method invocations for a Durable Object\n *\n * Since Cloudflare Durable Objects can only have one active alarm at a time,\n * this class maintains a queue in SQLite and processes items sequentially.\n *\n * Key Features:\n * - Atomic queue operations\n * - Completed run history for inspection\n * - 24-hour retention of failed items for debugging\n * - Precise timing control (millisecond accuracy)\n * - Leverages Cloudflare's automatic retry mechanism (up to 6 retries)\n */\nexport class AlarmQueue {\n private ctx: DurableObjectState;\n private sql: DurableObjectState[\"storage\"][\"sql\"];\n\n constructor(ctx: DurableObjectState) {\n this.ctx = ctx;\n this.sql = ctx.storage.sql;\n }\n\n /**\n * Enqueue a method invocation to be executed after a delay\n *\n * @param method - Name of the method to invoke\n * @param args - Arguments to pass to the method (will be JSON serialized)\n * @param delayMs - Delay in milliseconds before execution\n * @returns The ID of the queued item\n */\n async enqueue(\n method: string,\n args: Record<string, any>,\n delayMs: number = 0,\n options: AlarmQueueEnqueueOptions = {}\n ): Promise<string> {\n const id = crypto.randomUUID();\n const now = Date.now();\n const scheduledAt = now + delayMs;\n\n // Store timestamps in microseconds for consistency with other tables\n const nowMicros = now * 1000;\n const scheduledAtMicros = scheduledAt * 1000;\n const manualRun = options.manualRun === true;\n const manualRunAt = manualRun ? nowMicros : null;\n\n // Insert into queue\n await this.sql.exec(\n `\n INSERT INTO alarm_queue (\n id, method, args, scheduled_at, created_at, status, attempts, manual_run, manual_run_at, replayed_from, source_log_id\n ) VALUES (?1, ?2, ?3, ?4, ?5, 'pending', 0, ?6, ?7, ?8, ?9)\n `,\n id,\n method,\n JSON.stringify(args),\n scheduledAtMicros,\n nowMicros,\n manualRun ? 1 : 0,\n manualRunAt,\n options.replayedFrom ?? null,\n options.sourceLogId ?? null\n );\n\n // Schedule or reschedule the alarm for the earliest pending item\n await this.rescheduleAlarm();\n\n return id;\n }\n\n /**\n * Process the next pending item in the queue\n * Called by the alarm() handler\n *\n * @param alarmInfo - Information about the alarm invocation from Cloudflare\n */\n async processNext(alarmInfo?: { retryCount: number; isRetry: boolean }): Promise<void> {\n // Clean up old failed items first\n await this.cleanupOldFailures();\n\n // Get the next pending item that's due to execute\n const now = Date.now() * 1000; // Convert to microseconds\n\n const cursor = await this.sql.exec<{\n id: string;\n method: string;\n args: string;\n attempts: number;\n }>(\n `\n SELECT id, method, args, attempts\n FROM alarm_queue\n WHERE status = 'pending' AND scheduled_at <= ?\n ORDER BY scheduled_at ASC\n LIMIT 1\n `,\n now\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n // No pending items, reschedule for next item if any\n await this.rescheduleAlarm();\n return;\n }\n\n const item = rows[0];\n\n // Mark as processing\n await this.sql.exec(\n `UPDATE alarm_queue SET status = 'processing', attempts = attempts + 1 WHERE id = ?`,\n item.id\n );\n\n try {\n // Parse arguments\n const args = JSON.parse(item.args);\n\n // Execute the method\n await this.executeMethod(item.method, args, item.id);\n\n // Mark as completed and retain it for inspection.\n await this.complete(item.id);\n } catch (error) {\n // Mark as failed and keep for debugging\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.fail(item.id, errorMessage);\n\n // Log the error but don't throw - we want to continue processing the queue\n console.error(`[AlarmQueue] Failed to process item ${item.id}:`, error);\n }\n\n // Always reschedule for the next item, even if this one failed\n await this.rescheduleAlarm();\n }\n\n /**\n * Execute a queued method\n * This method should be overridden or extended by the Durable Object\n *\n * @param method - Name of the method to execute\n * @param args - Arguments to pass to the method\n */\n private async executeMethod(method: string, args: Record<string, any>, itemId?: string): Promise<void> {\n // This will be implemented in DurableThread to dispatch to the appropriate method\n throw new Error(`Method execution not implemented: ${method}`);\n }\n\n /**\n * Set the executor function that will be called to execute queued methods\n *\n * @param executor - Function that takes method name, args, and queue item id, then executes the method\n */\n setExecutor(executor: (method: string, args: Record<string, any>, itemId?: string) => Promise<void>): void {\n this.executeMethod = executor;\n }\n\n /**\n * Mark an item as completed and retain it for inspection.\n *\n * @param id - ID of the completed item\n */\n private async complete(id: string): Promise<void> {\n const now = Date.now() * 1000; // Microseconds\n await this.sql.exec(\n `\n UPDATE alarm_queue\n SET status = 'completed', completed_at = ?\n WHERE id = ?\n `,\n now,\n id\n );\n }\n\n /**\n * Mark an item as failed but keep it for 24 hours for debugging\n *\n * @param id - ID of the failed item\n * @param error - Error message\n */\n private async fail(id: string, error: string): Promise<void> {\n const now = Date.now() * 1000; // Microseconds\n await this.sql.exec(\n `\n UPDATE alarm_queue\n SET status = 'failed', error = ?, completed_at = ?\n WHERE id = ?\n `,\n error,\n now,\n id\n );\n }\n\n /**\n * Clean up failed items older than 24 hours\n */\n private async cleanupOldFailures(): Promise<void> {\n const cutoff = (Date.now() - 24 * 60 * 60 * 1000) * 1000; // 24 hours ago in microseconds\n await this.sql.exec(\n `DELETE FROM alarm_queue WHERE status = 'failed' AND completed_at < ?`,\n cutoff\n );\n }\n\n /**\n * Schedule the alarm for the next pending item\n * If no pending items, clear the alarm\n */\n private async rescheduleAlarm(): Promise<void> {\n // Get the earliest pending item\n const cursor = await this.sql.exec<{ scheduled_at: number }>(\n `\n SELECT scheduled_at\n FROM alarm_queue\n WHERE status = 'pending'\n ORDER BY scheduled_at ASC\n LIMIT 1\n `\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n // No pending items, delete the alarm\n await this.ctx.storage.deleteAlarm();\n return;\n }\n\n const nextScheduledAt = rows[0].scheduled_at;\n // Convert from microseconds to milliseconds for setAlarm\n const nextScheduledAtMs = Math.floor(nextScheduledAt / 1000);\n\n // Set the alarm\n // Note: setAlarm accepts Date or number (milliseconds since epoch)\n await this.ctx.storage.setAlarm(nextScheduledAtMs);\n }\n\n /**\n * Re-arm the Durable Object alarm from persisted queue state.\n *\n * Workerd/dev restarts can preserve the SQL queue while losing the in-memory\n * alarm registration. Calling this after a Durable Object instance wakes up\n * makes overdue pending items fire again.\n */\n async ensureAlarmScheduled(): Promise<void> {\n await this.rescheduleAlarm();\n }\n\n // ============================================================\n // Effect-specific Methods\n // ============================================================\n\n /**\n * Get scheduled effects from the queue.\n * Filters for items with method='runEffect' and optionally by effect name.\n *\n * @param name - Optional effect name to filter by\n * @returns Array of scheduled effect records\n */\n async getScheduledEffects(name?: string): Promise<Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n scheduledAt: number;\n createdAt: number;\n }>> {\n let query = `\n SELECT id, args, scheduled_at, created_at\n FROM alarm_queue\n WHERE status = 'pending' AND method = 'runEffect'\n `;\n const params: any[] = [];\n\n if (name) {\n // Filter by effect name in JSON args\n query += ` AND json_extract(args, '$.effectName') = ?`;\n params.push(name);\n }\n\n query += ` ORDER BY scheduled_at ASC`;\n\n const cursor = await this.sql.exec<{\n id: string;\n args: string;\n scheduled_at: number;\n created_at: number;\n }>(query, ...params);\n\n const rows = cursor.toArray();\n return rows.map(row => {\n const parsedArgs = this.parseEffectPayload(row.args);\n return {\n id: row.id,\n name: parsedArgs.effectName,\n args: parsedArgs.effectArgs,\n scheduledAt: row.scheduled_at,\n createdAt: row.created_at,\n };\n });\n }\n\n /**\n * List pending and historical effect runs for admin inspection.\n *\n * getScheduledEffects() intentionally keeps its public contract scoped to\n * pending effects. This richer view is used by AgentBuilder's thread UI.\n */\n async listEffectRuns(options: EffectRunListOptions = {}): Promise<EffectRunListResult> {\n const limit = this.normalizeLimit(options.limit);\n const offset = this.normalizeOffset(options.offset);\n\n const totalCursor = await this.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM alarm_queue WHERE method = 'runEffect'`\n );\n const total = totalCursor.toArray()[0]?.count ?? 0;\n\n const upcomingCursor = await this.sql.exec<{ count: number }>(\n `\n SELECT COUNT(*) as count\n FROM alarm_queue\n WHERE method = 'runEffect' AND status = 'pending'\n `\n );\n const upcomingCount = upcomingCursor.toArray()[0]?.count ?? 0;\n\n const cursor = await this.sql.exec<{\n id: string;\n args: string;\n scheduled_at: number;\n created_at: number;\n status: AlarmQueueStatus;\n attempts: number;\n error: string | null;\n completed_at: number | null;\n manual_run: number | null;\n manual_run_at: number | null;\n replayed_from: string | null;\n }>(\n `\n SELECT id, args, scheduled_at, created_at, status, attempts, error, completed_at, manual_run, manual_run_at, replayed_from\n FROM alarm_queue\n WHERE method = 'runEffect'\n ORDER BY\n CASE\n WHEN status IN ('pending', 'processing') THEN 0\n ELSE 1\n END ASC,\n CASE\n WHEN status IN ('pending', 'processing') THEN scheduled_at\n ELSE NULL\n END ASC,\n CASE\n WHEN status IN ('pending', 'processing') THEN created_at\n ELSE NULL\n END ASC,\n CASE\n WHEN status NOT IN ('pending', 'processing') THEN created_at\n ELSE NULL\n END DESC,\n CASE\n WHEN status NOT IN ('pending', 'processing') THEN scheduled_at\n ELSE NULL\n END DESC,\n id ASC\n LIMIT ? OFFSET ?\n `,\n limit,\n offset\n );\n\n const effects = cursor.toArray().map((row): EffectRunRecord => {\n const parsedArgs = this.parseEffectPayload(row.args);\n return {\n id: row.id,\n name: parsedArgs.effectName,\n args: parsedArgs.effectArgs,\n scheduledAt: row.scheduled_at,\n createdAt: row.created_at,\n status: row.status,\n attempts: row.attempts,\n error: row.error,\n completedAt: row.completed_at,\n manualRun: row.manual_run === 1,\n manualRunAt: row.manual_run_at,\n replayedFrom: row.replayed_from,\n };\n });\n\n return {\n effects,\n total,\n upcomingCount,\n limit,\n offset,\n };\n }\n\n /**\n * Execute a pending effect immediately, or replay a historical effect as a\n * new immediate run.\n */\n async runEffectNow(id: string): Promise<EffectRunActionResult> {\n const item = await this.getEffectQueueItem(id);\n if (!item) {\n throw new Error(`Effect run not found: ${id}`);\n }\n\n if (item.status === \"pending\") {\n await this.executePendingItemNow(item, { manualRun: true });\n return { action: \"ran\", id };\n }\n\n if (\n item.status === \"completed\" ||\n item.status === \"failed\" ||\n item.status === \"agent_canceled\" ||\n item.status === \"user_canceled\"\n ) {\n const replayedId = await this.enqueue(item.method, JSON.parse(item.args), 0, {\n manualRun: true,\n replayedFrom: id,\n });\n const replayedItem = await this.getEffectQueueItem(replayedId);\n if (!replayedItem) {\n throw new Error(`Replay effect run not found after enqueue: ${replayedId}`);\n }\n await this.executePendingItemNow(replayedItem);\n return { action: \"replayed\", id, replayedId };\n }\n\n throw new Error(`Effect run ${id} cannot be run from status ${item.status}`);\n }\n\n /**\n * Cancel a scheduled effect and retain it in history.\n *\n * @param id - The effect ID returned by scheduleEffect\n * @returns true if the effect was found and canceled, false otherwise\n */\n async removeScheduledEffect(id: string, canceledBy: EffectCancelSource = \"agent\"): Promise<boolean> {\n const cancelStatus: Extract<AlarmQueueStatus, \"agent_canceled\" | \"user_canceled\"> =\n canceledBy === \"user\" ? \"user_canceled\" : \"agent_canceled\";\n const now = Date.now() * 1000;\n\n // Only cancel pending effects with method='runEffect'. Canceled rows are\n // retained so the inspector can explain why a scheduled effect vanished.\n await this.sql.exec(\n `\n UPDATE alarm_queue\n SET status = ?, completed_at = ?, error = NULL\n WHERE id = ? AND status = 'pending' AND method = 'runEffect'\n `,\n cancelStatus,\n now,\n id\n );\n\n const changes = await this.sql.exec<{ changes: number }>(\n `SELECT changes() as changes`\n );\n const changesRows = changes.toArray();\n const canceled = changesRows.length > 0 && changesRows[0].changes > 0;\n\n if (canceled) {\n await this.rescheduleAlarm();\n }\n\n return canceled;\n }\n\n /**\n * Get the current state of the queue for debugging\n */\n async getQueueState(): Promise<{\n pending: number;\n processing: number;\n failed: number;\n nextScheduledAt: number | null;\n }> {\n // Count by status\n const countCursor = await this.sql.exec<{ status: string; count: number }>(\n `SELECT status, COUNT(*) as count FROM alarm_queue GROUP BY status`\n );\n\n const counts = countCursor.toArray();\n const pending = counts.find((c: { status: string; count: number }) => c.status === \"pending\")?.count || 0;\n const processing = counts.find((c: { status: string; count: number }) => c.status === \"processing\")?.count || 0;\n const failed = counts.find((c: { status: string; count: number }) => c.status === \"failed\")?.count || 0;\n\n // Get next scheduled time\n const nextCursor = await this.sql.exec<{ scheduled_at: number }>(\n `SELECT scheduled_at FROM alarm_queue WHERE status = 'pending' ORDER BY scheduled_at ASC LIMIT 1`\n );\n const nextRows = nextCursor.toArray();\n const nextScheduledAt = nextRows.length > 0 ? nextRows[0].scheduled_at : null;\n\n return {\n pending,\n processing,\n failed,\n nextScheduledAt,\n };\n }\n\n private normalizeLimit(value: number | undefined): number {\n const parsed = typeof value === \"number\" ? Math.trunc(value) : Number.NaN;\n if (!Number.isFinite(parsed)) return 100;\n return Math.min(Math.max(parsed, 1), 500);\n }\n\n private async getEffectQueueItem(id: string): Promise<{\n id: string;\n method: string;\n args: string;\n status: AlarmQueueStatus;\n } | null> {\n const cursor = await this.sql.exec<{\n id: string;\n method: string;\n args: string;\n status: AlarmQueueStatus;\n }>(\n `\n SELECT id, method, args, status\n FROM alarm_queue\n WHERE id = ? AND method = 'runEffect'\n LIMIT 1\n `,\n id\n );\n return cursor.toArray()[0] ?? null;\n }\n\n private async executePendingItemNow(item: {\n id: string;\n method: string;\n args: string;\n status: AlarmQueueStatus;\n }, options: AlarmQueueEnqueueOptions = {}): Promise<void> {\n if (item.status !== \"pending\") {\n throw new Error(`Effect run ${item.id} is not pending`);\n }\n\n const manualRun = options.manualRun === true;\n const manualRunAt = manualRun ? Date.now() * 1000 : null;\n await this.sql.exec(\n `\n UPDATE alarm_queue\n SET\n status = 'processing',\n attempts = attempts + 1,\n error = NULL,\n manual_run = CASE WHEN ?2 = 1 THEN 1 ELSE manual_run END,\n manual_run_at = CASE WHEN ?2 = 1 THEN ?3 ELSE manual_run_at END\n WHERE id = ?1 AND status = 'pending' AND method = 'runEffect'\n `,\n item.id,\n manualRun ? 1 : 0,\n manualRunAt\n );\n const changes = await this.sql.exec<{ changes: number }>(\n `SELECT changes() as changes`\n );\n const changed = (changes.toArray()[0]?.changes ?? 0) > 0;\n if (!changed) {\n throw new Error(`Effect run ${item.id} is no longer pending`);\n }\n\n try {\n await this.executeMethod(item.method, JSON.parse(item.args), item.id);\n await this.complete(item.id);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.fail(item.id, errorMessage);\n throw error;\n } finally {\n await this.rescheduleAlarm();\n }\n }\n\n private normalizeOffset(value: number | undefined): number {\n const parsed = typeof value === \"number\" ? Math.trunc(value) : Number.NaN;\n if (!Number.isFinite(parsed)) return 0;\n return Math.max(parsed, 0);\n }\n\n private parseEffectPayload(args: string): {\n effectName: string;\n effectArgs: Record<string, unknown>;\n } {\n const parsed = JSON.parse(args) as {\n effectName?: unknown;\n effectArgs?: unknown;\n };\n\n return {\n effectName: typeof parsed.effectName === \"string\"\n ? parsed.effectName\n : \"unknown_effect\",\n effectArgs: parsed.effectArgs &&\n typeof parsed.effectArgs === \"object\" &&\n !Array.isArray(parsed.effectArgs)\n ? parsed.effectArgs as Record<string, unknown>\n : {},\n };\n }\n}\n","/**\n * Namespace-scoped resolution for the packing system.\n *\n * This module provides functions to resolve items (tools, prompts, models, agents)\n * within the correct namespace context, enforcing isolation between packed and\n * unpacked code.\n *\n * @module\n */\n\nimport type { NamespaceContext } from '@standardagents/spec';\nimport type { NamespacedRegistry, DefinitionLoader } from './types.js';\n\n// ============================================================================\n// Resolution Error\n// ============================================================================\n\n/**\n * Error thrown when an item cannot be resolved in the current namespace.\n */\nexport class NamespaceResolutionError extends Error {\n constructor(\n public readonly itemType: 'tool' | 'prompt' | 'model' | 'agent' | 'hook',\n public readonly itemName: string,\n public readonly namespace: NamespaceContext,\n message: string\n ) {\n super(message);\n this.name = 'NamespaceResolutionError';\n }\n}\n\n// ============================================================================\n// Name Utilities\n// ============================================================================\n\n/**\n * Parse a potentially qualified name into package ID and short name.\n *\n * For scoped npm packages (starting with @), the format is @scope/pkg-name/item-name\n * where @scope/pkg-name is the package and item-name is the short name.\n *\n * For non-scoped packages, the format is pkg-name/item-name.\n *\n * @param name - The name to parse (e.g., 'tool', 'pkg/tool', or '@scope/pkg/tool')\n * @returns Tuple of [packageId, shortName] where packageId is null for unqualified names\n */\nexport function parseQualifiedName(name: string): [string | null, string] {\n // For scoped packages (@scope/name), we need to find the slash AFTER the scoped package name\n if (name.startsWith('@')) {\n // Find the second slash (first is part of @scope/name)\n const firstSlash = name.indexOf('/');\n if (firstSlash === -1) {\n // Just @scope with no slashes - treat as unqualified\n return [null, name];\n }\n const secondSlash = name.indexOf('/', firstSlash + 1);\n if (secondSlash === -1) {\n // Only one slash like @scope/name - treat as unqualified (it's the full name)\n return [null, name];\n }\n // Split at the second slash: @scope/pkg / item-name\n return [name.substring(0, secondSlash), name.substring(secondSlash + 1)];\n }\n\n // Non-scoped: split at first slash\n const separatorIndex = name.indexOf('/');\n if (separatorIndex === -1) {\n return [null, name];\n }\n return [name.substring(0, separatorIndex), name.substring(separatorIndex + 1)];\n}\n\n/**\n * Create a qualified name from package ID and short name.\n */\nexport function qualifyName(packageId: string, shortName: string): string {\n return `${packageId}/${shortName}`;\n}\n\n/**\n * Get the short name (strip any package qualification).\n */\nexport function getShortName(name: string): string {\n const [, shortName] = parseQualifiedName(name);\n return shortName;\n}\n\n// ============================================================================\n// Tool Resolution\n// ============================================================================\n\n/**\n * Resolve a tool by name within a namespace context.\n *\n * Resolution rules:\n * - Qualified names (pkg:tool) → resolve cross-package entry point\n * - Unqualified names in packed context → resolve from own package\n * - Unqualified names in global context → resolve from global namespace\n *\n * @param registry - The namespaced registry\n * @param name - Tool name (can be qualified with packageId:toolName)\n * @param namespace - Current namespace context\n * @returns Loader function for the tool definition\n * @throws NamespaceResolutionError if tool cannot be found or accessed\n */\nexport function resolveTool(\n registry: NamespacedRegistry,\n name: string,\n namespace: NamespaceContext\n): DefinitionLoader<unknown> {\n const [pkgId, shortName] = parseQualifiedName(name);\n\n // Qualified name: cross-package reference (only entry points allowed)\n if (pkgId !== null) {\n const pkg = registry.packages[pkgId];\n if (!pkg) {\n throw new NamespaceResolutionError(\n 'tool',\n name,\n namespace,\n `Package \"${pkgId}\" not found`\n );\n }\n\n // Cross-package tools are not directly accessible\n // Only agents with exposeAsTool can be called cross-package\n throw new NamespaceResolutionError(\n 'tool',\n name,\n namespace,\n `Cannot access tool \"${shortName}\" from package \"${pkgId}\". ` +\n `Only entry point agents are accessible cross-package.`\n );\n }\n\n // Packed context: resolve from own package only\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n if (!pkg) {\n throw new NamespaceResolutionError(\n 'tool',\n name,\n namespace,\n `Package \"${namespace.packageId}\" not found`\n );\n }\n\n const loader = pkg.tools[shortName];\n if (!loader) {\n throw new NamespaceResolutionError(\n 'tool',\n name,\n namespace,\n `Tool \"${shortName}\" not found in package \"${namespace.packageId}\"`\n );\n }\n return loader;\n }\n\n // Global context: resolve from global namespace\n const loader = registry.global.tools[shortName];\n if (!loader) {\n throw new NamespaceResolutionError(\n 'tool',\n name,\n namespace,\n `Tool \"${shortName}\" not found in global namespace`\n );\n }\n return loader;\n}\n\n// ============================================================================\n// Prompt Resolution\n// ============================================================================\n\n/**\n * Resolve a prompt by name within a namespace context.\n *\n * @param registry - The namespaced registry\n * @param name - Prompt name (can be qualified)\n * @param namespace - Current namespace context\n * @returns Loader function for the prompt definition\n */\nexport function resolvePrompt(\n registry: NamespacedRegistry,\n name: string,\n namespace: NamespaceContext\n): DefinitionLoader<unknown> {\n const [pkgId, shortName] = parseQualifiedName(name);\n\n // Qualified name: cross-package (not allowed for prompts)\n if (pkgId !== null) {\n throw new NamespaceResolutionError(\n 'prompt',\n name,\n namespace,\n `Cannot access prompt \"${shortName}\" from package \"${pkgId}\". ` +\n `Prompts are package-internal.`\n );\n }\n\n // Packed context: resolve from own package\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n if (!pkg) {\n throw new NamespaceResolutionError(\n 'prompt',\n name,\n namespace,\n `Package \"${namespace.packageId}\" not found`\n );\n }\n\n const loader = pkg.prompts[shortName];\n if (!loader) {\n throw new NamespaceResolutionError(\n 'prompt',\n name,\n namespace,\n `Prompt \"${shortName}\" not found in package \"${namespace.packageId}\"`\n );\n }\n return loader;\n }\n\n // Global context: resolve from global namespace\n const loader = registry.global.prompts[shortName];\n if (!loader) {\n throw new NamespaceResolutionError(\n 'prompt',\n name,\n namespace,\n `Prompt \"${shortName}\" not found in global namespace`\n );\n }\n return loader;\n}\n\n// ============================================================================\n// Model Resolution\n// ============================================================================\n\n/**\n * Resolve a model by name within a namespace context.\n *\n * Models are special: packed agents include their model definitions,\n * but the host must provide API keys.\n *\n * @param registry - The namespaced registry\n * @param name - Model name\n * @param namespace - Current namespace context\n * @returns Loader function for the model definition\n */\nexport function resolveModel(\n registry: NamespacedRegistry,\n name: string,\n namespace: NamespaceContext\n): DefinitionLoader<unknown> {\n const [possiblePkgId, shortName] = parseQualifiedName(name);\n\n // Only reject if it looks qualified AND the package actually exists.\n // Provider model names like \"openai/gpt-4\" or \"x-ai/grok-4-vision\" should pass through\n // when there's no package with that name (e.g., \"openai\" is not a registered package).\n if (possiblePkgId !== null && registry.packages[possiblePkgId]) {\n throw new NamespaceResolutionError(\n 'model',\n name,\n namespace,\n `Cannot use qualified model name \"${name}\". Models must be unqualified. ` +\n `If this is a provider model name, ensure no package named \"${possiblePkgId}\" exists.`\n );\n }\n\n // Use full name for lookup (preserves provider format like \"openai/gpt-4\")\n const lookupName = name;\n\n // Packed context: try own package first, then fall back to global\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n if (pkg) {\n const loader = pkg.models[lookupName];\n if (loader) {\n return loader;\n }\n }\n\n // Fall back to global (packed agents can use host-provided models)\n const globalLoader = registry.global.models[lookupName];\n if (globalLoader) {\n return globalLoader;\n }\n\n throw new NamespaceResolutionError(\n 'model',\n name,\n namespace,\n `Model \"${lookupName}\" not found in package \"${namespace.packageId}\" or global namespace`\n );\n }\n\n // Global context: resolve from global namespace\n const loader = registry.global.models[lookupName];\n if (!loader) {\n throw new NamespaceResolutionError(\n 'model',\n name,\n namespace,\n `Model \"${lookupName}\" not found in global namespace`\n );\n }\n return loader;\n}\n\n// ============================================================================\n// Agent Resolution\n// ============================================================================\n\n/**\n * Resolve an agent by name within a namespace context.\n *\n * Resolution rules:\n * - Qualified names (pkg:agent) → resolve cross-package entry point\n * - Unqualified in packed → resolve from own package\n * - Unqualified in global → resolve from global + entry points\n *\n * @param registry - The namespaced registry\n * @param name - Agent name (can be qualified)\n * @param namespace - Current namespace context\n * @returns Loader function for the agent definition\n */\nexport function resolveAgent(\n registry: NamespacedRegistry,\n name: string,\n namespace: NamespaceContext\n): DefinitionLoader<unknown> {\n const [pkgId, shortName] = parseQualifiedName(name);\n\n // Qualified name: cross-package entry point\n if (pkgId !== null) {\n const pkg = registry.packages[pkgId];\n if (!pkg) {\n throw new NamespaceResolutionError(\n 'agent',\n name,\n namespace,\n `Package \"${pkgId}\" not found`\n );\n }\n\n // Only entry point agents are accessible cross-package\n if (!pkg.entryAgents.includes(shortName)) {\n throw new NamespaceResolutionError(\n 'agent',\n name,\n namespace,\n `Agent \"${shortName}\" is not an entry point in package \"${pkgId}\"`\n );\n }\n\n const loader = pkg.agents[shortName];\n if (!loader) {\n throw new NamespaceResolutionError(\n 'agent',\n name,\n namespace,\n `Agent \"${shortName}\" not found in package \"${pkgId}\"`\n );\n }\n return loader;\n }\n\n // Packed context: resolve from own package\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n if (!pkg) {\n throw new NamespaceResolutionError(\n 'agent',\n name,\n namespace,\n `Package \"${namespace.packageId}\" not found`\n );\n }\n\n const loader = pkg.agents[shortName];\n if (!loader) {\n throw new NamespaceResolutionError(\n 'agent',\n name,\n namespace,\n `Agent \"${shortName}\" not found in package \"${namespace.packageId}\"`\n );\n }\n return loader;\n }\n\n // Global context: check global first\n const globalLoader = registry.global.agents[shortName];\n if (globalLoader) {\n return globalLoader;\n }\n\n // Then check packed entry points (by short name)\n for (const [pkgId, pkg] of Object.entries(registry.packages)) {\n if (pkg.entryAgents.includes(shortName)) {\n const loader = pkg.agents[shortName];\n if (loader) {\n return loader;\n }\n }\n }\n\n throw new NamespaceResolutionError(\n 'agent',\n name,\n namespace,\n `Agent \"${shortName}\" not found in global namespace`\n );\n}\n\n// ============================================================================\n// Hook Resolution\n// ============================================================================\n\n/**\n * Resolve a hook by name within a namespace context.\n *\n * Hooks follow similar rules to tools but are keyed by hook type.\n *\n * @param registry - The namespaced registry\n * @param name - Hook name (file name, e.g., 'filter_messages')\n * @param namespace - Current namespace context\n * @returns Loader function for the hook implementation\n */\nexport function resolveHook(\n registry: NamespacedRegistry,\n name: string,\n namespace: NamespaceContext\n): DefinitionLoader<unknown> | null {\n const [pkgId, shortName] = parseQualifiedName(name);\n\n // Qualified names not allowed for hooks\n if (pkgId !== null) {\n throw new NamespaceResolutionError(\n 'hook',\n name,\n namespace,\n `Cannot use qualified hook name \"${name}\". Hooks must be unqualified.`\n );\n }\n\n // Packed context: resolve from own package\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n if (pkg) {\n const loader = pkg.hooks[shortName];\n if (loader) {\n return loader;\n }\n }\n // Hooks are optional - return null if not found\n return null;\n }\n\n // Global context: resolve from global namespace\n const loader = registry.global.hooks[shortName];\n return loader || null;\n}\n\n// ============================================================================\n// Visibility Helpers\n// ============================================================================\n\n/**\n * Get all tool names visible in a namespace context.\n *\n * @param registry - The namespaced registry\n * @param namespace - Current namespace context\n * @returns Array of visible tool names (short names)\n */\nexport function getVisibleToolNames(\n registry: NamespacedRegistry,\n namespace: NamespaceContext\n): string[] {\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n return pkg ? Object.keys(pkg.tools) : [];\n }\n\n // Global: unpacked tools only (tools from packed agents are internal)\n return Object.keys(registry.global.tools);\n}\n\n/**\n * Get all agent names visible in a namespace context.\n *\n * @param registry - The namespaced registry\n * @param namespace - Current namespace context\n * @returns Array of visible agent names (may include qualified names for cross-package)\n */\nexport function getVisibleAgentNames(\n registry: NamespacedRegistry,\n namespace: NamespaceContext\n): string[] {\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n const ownAgents = pkg ? Object.keys(pkg.agents) : [];\n\n // Other packages' entry points (qualified names)\n const otherEntryPoints = Object.entries(registry.packages)\n .filter(([id]) => id !== namespace.packageId)\n .flatMap(([pkgId, pkg]) =>\n pkg.entryAgents.map(name => qualifyName(pkgId, name))\n );\n\n return [...ownAgents, ...otherEntryPoints];\n }\n\n // Global: unpacked agents + packed entry points (short names)\n const globalAgents = Object.keys(registry.global.agents);\n const entryPoints = Object.values(registry.packages)\n .flatMap(pkg => pkg.entryAgents);\n\n // Dedupe in case an entry point name matches a global agent\n return [...new Set([...globalAgents, ...entryPoints])];\n}\n\n/**\n * Get all prompt names visible in a namespace context.\n */\nexport function getVisiblePromptNames(\n registry: NamespacedRegistry,\n namespace: NamespaceContext\n): string[] {\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n return pkg ? Object.keys(pkg.prompts) : [];\n }\n return Object.keys(registry.global.prompts);\n}\n\n/**\n * Get all model names visible in a namespace context.\n */\nexport function getVisibleModelNames(\n registry: NamespacedRegistry,\n namespace: NamespaceContext\n): string[] {\n if (namespace.type === 'packed') {\n const pkg = registry.packages[namespace.packageId];\n const ownModels = pkg ? Object.keys(pkg.models) : [];\n const globalModels = Object.keys(registry.global.models);\n return [...new Set([...ownModels, ...globalModels])];\n }\n return Object.keys(registry.global.models);\n}\n\n// ============================================================================\n// Namespace Context Creation\n// ============================================================================\n\n/**\n * Create a namespace context for an agent definition.\n *\n * @param agentDef - Agent definition (may have __package field)\n * @returns Appropriate namespace context\n */\nexport function createNamespaceContext(\n agentDef: { __package?: { packageId: string } } | undefined\n): NamespaceContext {\n if (agentDef?.__package) {\n return { type: 'packed', packageId: agentDef.__package.packageId };\n }\n return { type: 'global' };\n}\n\n/**\n * Check if a name is qualified (contains package prefix).\n *\n * For scoped packages (@scope/name), there must be at least two slashes\n * to be considered qualified (e.g., @scope/pkg/item).\n * For non-scoped packages, a single slash qualifies it (e.g., pkg/item).\n */\nexport function isQualifiedName(name: string): boolean {\n if (name.startsWith('@')) {\n // Scoped: need at least 2 slashes (@scope/pkg/item)\n const firstSlash = name.indexOf('/');\n if (firstSlash === -1) return false;\n return name.indexOf('/', firstSlash + 1) !== -1;\n }\n return name.includes('/');\n}\n","import type { DurableObjectStorage } from '@cloudflare/workers-types';\n\n// SqlStorage interface - the sql property on DurableObjectStorage\ntype SqlStorage = DurableObjectStorage['sql'];\n\n/**\n * Initial schema for DurableAgentBuilder.\n *\n * This creates the core tables for:\n * - Thread registry (maps thread IDs to agent names)\n * - User authentication\n * - API keys\n * - Sessions\n * - OAuth accounts\n * - Provider credentials (API keys for LLM providers)\n * - Edit lock state (for coordinated edits)\n */\nexport const migration = {\n version: 1,\n async up(sql: SqlStorage) {\n // Metadata table for schema versioning\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _metadata (\n key TEXT PRIMARY KEY NOT NULL,\n value TEXT NOT NULL\n )\n `);\n\n // Thread registry - maps thread IDs to agent names\n // agent_name references the name from TypeScript config files\n sql.exec(`\n CREATE TABLE threads (\n id TEXT PRIMARY KEY NOT NULL,\n agent_name TEXT NOT NULL,\n user_id TEXT,\n tags TEXT,\n created_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n sql.exec(`CREATE INDEX idx_threads_agent_name ON threads(agent_name)`);\n sql.exec(`CREATE INDEX idx_threads_user_id ON threads(user_id)`);\n sql.exec(`CREATE INDEX idx_threads_created_at ON threads(created_at)`);\n\n // Users table for authentication\n sql.exec(`\n CREATE TABLE users (\n id TEXT PRIMARY KEY NOT NULL,\n username TEXT UNIQUE NOT NULL,\n password_hash TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'admin' CHECK (role IN ('admin')),\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n sql.exec(`CREATE INDEX idx_users_username ON users(username)`);\n sql.exec(`CREATE INDEX idx_users_role ON users(role)`);\n\n // OAuth accounts table for linking OAuth providers to users\n sql.exec(`\n CREATE TABLE oauth_accounts (\n id TEXT PRIMARY KEY NOT NULL,\n user_id TEXT NOT NULL,\n provider TEXT NOT NULL CHECK (provider IN ('github', 'google')),\n provider_user_id TEXT NOT NULL,\n provider_username TEXT,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE UNIQUE INDEX idx_oauth_accounts_provider ON oauth_accounts(provider, provider_user_id)`);\n sql.exec(`CREATE INDEX idx_oauth_accounts_user_id ON oauth_accounts(user_id)`);\n\n // API Keys table for programmatic access\n sql.exec(`\n CREATE TABLE api_keys (\n id TEXT PRIMARY KEY NOT NULL,\n name TEXT NOT NULL,\n key_hash TEXT NOT NULL,\n key_prefix TEXT NOT NULL,\n last_five TEXT NOT NULL,\n user_id TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n last_used_at INTEGER,\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE INDEX idx_api_keys_key_hash ON api_keys(key_hash)`);\n sql.exec(`CREATE INDEX idx_api_keys_user_id ON api_keys(user_id)`);\n sql.exec(`CREATE INDEX idx_api_keys_key_prefix ON api_keys(key_prefix)`);\n\n // Sessions table for user sessions\n sql.exec(`\n CREATE TABLE sessions (\n id TEXT PRIMARY KEY NOT NULL,\n user_id TEXT NOT NULL,\n token_hash TEXT NOT NULL,\n expires_at INTEGER NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE\n )\n `);\n sql.exec(`CREATE INDEX idx_sessions_token_hash ON sessions(token_hash)`);\n sql.exec(`CREATE INDEX idx_sessions_user_id ON sessions(user_id)`);\n sql.exec(`CREATE INDEX idx_sessions_expires_at ON sessions(expires_at)`);\n\n // Provider credentials (API keys for LLM providers)\n sql.exec(`\n CREATE TABLE providers (\n name TEXT PRIMARY KEY NOT NULL,\n sdk TEXT NOT NULL,\n api_key TEXT NOT NULL\n )\n `);\n\n // Edit lock state for coordinated edits\n // Prevents concurrent writes from multiple editing sessions.\n sql.exec(`\n CREATE TABLE edit_lock (\n id TEXT PRIMARY KEY DEFAULT 'singleton' CHECK (id = 'singleton'),\n locked_by TEXT,\n locked_at INTEGER,\n lock_reason TEXT,\n pending_changes TEXT\n )\n `);\n sql.exec(`INSERT INTO edit_lock (id) VALUES ('singleton')`);\n\n // Set schema version\n sql.exec(`\n INSERT OR REPLACE INTO _metadata (key, value) VALUES ('schema_version', '1')\n `);\n },\n};\n","import type { DurableObjectStorage } from '@cloudflare/workers-types';\n\n// SqlStorage interface - the sql property on DurableObjectStorage\ntype SqlStorage = DurableObjectStorage['sql'];\n\n/**\n * Migration to add tenvs and properties columns to threads table.\n *\n * - tenvs: Thread environment variables (encrypted JSON string)\n * Used to store runtime configuration for tools (e.g., vectorStoreId)\n *\n * - properties: Arbitrary key-value pairs (JSON string)\n * Used for custom metadata that doesn't fit in tags\n */\nexport const migration = {\n version: 2,\n async up(sql: SqlStorage) {\n // Add tenvs column for encrypted thread environment variables\n sql.exec(`ALTER TABLE threads ADD COLUMN tenvs TEXT`);\n\n // Add properties column for arbitrary key-value pairs\n sql.exec(`ALTER TABLE threads ADD COLUMN properties TEXT`);\n\n // Update schema version\n sql.exec(`\n INSERT OR REPLACE INTO _metadata (key, value) VALUES ('schema_version', '2')\n `);\n },\n};\n","import type { DurableObjectStorage } from '@cloudflare/workers-types';\n\ntype SqlStorage = DurableObjectStorage['sql'];\n\n/**\n * Add parent/terminated tracking for thread hierarchy and lifecycle.\n */\nexport const migration = {\n version: 3,\n async up(sql: SqlStorage) {\n sql.exec(`ALTER TABLE threads ADD COLUMN parent TEXT REFERENCES threads(id)`);\n sql.exec(`ALTER TABLE threads ADD COLUMN terminated INTEGER`);\n sql.exec(`CREATE INDEX IF NOT EXISTS idx_threads_parent ON threads(parent)`);\n\n sql.exec(`\n INSERT OR REPLACE INTO _metadata (key, value) VALUES ('schema_version', '3')\n `);\n },\n};\n","import type { DurableObjectStorage } from '@cloudflare/workers-types';\n\ntype SqlStorage = DurableObjectStorage['sql'];\n\n/**\n * Add env-first columns/tables for variable resolution.\n *\n * - threads.env: encrypted thread-level env map\n * - envs: encrypted instance/user scoped values\n */\nexport const migration = {\n version: 4,\n async up(sql: SqlStorage) {\n sql.exec(`ALTER TABLE threads ADD COLUMN env TEXT`);\n sql.exec(`UPDATE threads SET env = tenvs WHERE env IS NULL AND tenvs IS NOT NULL`);\n\n sql.exec(`\n CREATE TABLE IF NOT EXISTS envs (\n scope TEXT NOT NULL CHECK (scope IN ('instance', 'user')),\n user_id TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n value TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER DEFAULT (strftime('%s', 'now')),\n PRIMARY KEY (scope, user_id, name)\n )\n `);\n sql.exec(`CREATE INDEX IF NOT EXISTS idx_envs_scope_user ON envs(scope, user_id)`);\n\n sql.exec(`\n INSERT OR REPLACE INTO _metadata (key, value) VALUES ('schema_version', '4')\n `);\n },\n};\n\n","import type { DurableObjectStorage } from '@cloudflare/workers-types';\n\ntype SqlStorage = DurableObjectStorage['sql'];\n\n/**\n * Add pending scoped-env bootstrap requests for subagent instantiation.\n */\nexport const migration = {\n version: 5,\n async up(sql: SqlStorage) {\n sql.exec(`\n CREATE TABLE IF NOT EXISTS pending_subagent_env_requests (\n id TEXT PRIMARY KEY,\n parent_thread_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n registry_agent_name TEXT NOT NULL,\n required_variables TEXT NOT NULL,\n missing_variables TEXT NOT NULL,\n payload TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n completed_at INTEGER\n )\n `);\n sql.exec(\n `CREATE INDEX IF NOT EXISTS idx_pending_subagent_env_parent ON pending_subagent_env_requests(parent_thread_id)`\n );\n\n sql.exec(`\n INSERT OR REPLACE INTO _metadata (key, value) VALUES ('schema_version', '5')\n `);\n },\n};\n","import type { DurableObjectStorage } from '@cloudflare/workers-types';\n\ntype SqlStorage = DurableObjectStorage['sql'];\n\n/**\n * Add per-key display/redaction type metadata to instance/user env storage.\n *\n * Existing values default to `secret` to preserve conservative behavior.\n */\nexport const migration = {\n version: 6,\n async up(sql: SqlStorage) {\n sql.exec(\n `ALTER TABLE envs\n ADD COLUMN value_type TEXT NOT NULL DEFAULT 'secret'\n CHECK (value_type IN ('text', 'secret'))`\n );\n\n sql.exec(`\n INSERT OR REPLACE INTO _metadata (key, value) VALUES ('schema_version', '6')\n `);\n },\n};\n","import { migration as m0001 } from './0001_initial.js';\nimport { migration as m0002 } from './0002_add_tenvs_properties.js';\nimport { migration as m0003 } from './0003_add_parent_and_terminated.js';\nimport { migration as m0004 } from './0004_add_env_tables.js';\nimport { migration as m0005 } from './0005_add_pending_subagent_env_requests.js';\nimport { migration as m0006 } from './0006_add_env_value_types.js';\n\nexport const migrations = [m0001, m0002, m0003, m0004, m0005, m0006];\n\nexport const LATEST_SCHEMA_VERSION = 6;\n","/**\n * Encryption utilities for sensitive data\n */\n\nexport class CryptoUtil {\n private static algorithm = 'aes-256-gcm';\n \n /**\n * Encrypt a string value\n */\n static async encrypt(text: string, key: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(text);\n \n // Import the key\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n hexToBuffer(key),\n { name: 'AES-GCM' },\n false,\n ['encrypt']\n );\n \n // Generate IV\n const iv = crypto.getRandomValues(new Uint8Array(12));\n \n // Encrypt\n const encrypted = await crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: iv\n },\n cryptoKey,\n data\n );\n \n // Combine IV and encrypted data\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n \n // Return as base64\n return bufferToBase64(combined);\n }\n \n /**\n * Decrypt a string value\n */\n static async decrypt(encryptedText: string, key: string): Promise<string> {\n const combined = base64ToBuffer(encryptedText);\n \n // Extract IV and encrypted data\n const iv = combined.slice(0, 12);\n const encrypted = combined.slice(12);\n \n // Import the key\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n hexToBuffer(key),\n { name: 'AES-GCM' },\n false,\n ['decrypt']\n );\n \n // Decrypt\n const decrypted = await crypto.subtle.decrypt(\n {\n name: 'AES-GCM',\n iv: iv\n },\n cryptoKey,\n encrypted\n );\n \n // Convert back to string\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n }\n}\n\n// Helper functions\nfunction hexToBuffer(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\n }\n return bytes;\n}\n\nfunction bufferToBase64(buffer: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < buffer.byteLength; i++) {\n binary += String.fromCharCode(buffer[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBuffer(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n// ============================================================================\n// Thread Environment Variable Encryption\n// ============================================================================\n\n/**\n * Encrypt thread environment variables before storing in SQLite.\n *\n * @param env - The env object to encrypt\n * @param encryptionKey - Hex-encoded 256-bit encryption key from ENCRYPTION_KEY env var\n * @returns Base64-encoded encrypted string (IV + ciphertext)\n */\nexport async function encryptEnvs(\n env: Record<string, string>,\n encryptionKey: string\n): Promise<string> {\n const plaintext = JSON.stringify(env);\n return CryptoUtil.encrypt(plaintext, encryptionKey);\n}\n\n/**\n * Decrypt thread environment variables when reading from SQLite.\n *\n * @param encrypted - Base64-encoded encrypted string (IV + ciphertext)\n * @param encryptionKey - Hex-encoded 256-bit encryption key from ENCRYPTION_KEY env var\n * @returns The decrypted env object\n */\nexport async function decryptEnvs(\n encrypted: string,\n encryptionKey: string\n): Promise<Record<string, string>> {\n const plaintext = await CryptoUtil.decrypt(encrypted, encryptionKey);\n const parsed = JSON.parse(plaintext);\n if (!parsed || typeof parsed !== 'object') {\n return {};\n }\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value === undefined || value === null) continue;\n result[key] = String(value);\n }\n return result;\n}\n\n/**\n * @deprecated Use encryptEnvs\n */\nexport async function encryptTenvs(\n tenvs: Record<string, unknown>,\n encryptionKey: string\n): Promise<string> {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(tenvs)) {\n if (value === undefined || value === null) continue;\n env[key] = String(value);\n }\n return encryptEnvs(env, encryptionKey);\n}\n\n/**\n * @deprecated Use decryptEnvs\n */\nexport async function decryptTenvs(\n encrypted: string,\n encryptionKey: string\n): Promise<Record<string, unknown>> {\n return decryptEnvs(encrypted, encryptionKey);\n}\n","import { DurableObject } from 'cloudflare:workers';\nimport {\n migrations,\n LATEST_SCHEMA_VERSION,\n} from './agentbuilder-migrations/index.js';\nimport { CryptoUtil, encryptEnvs, decryptEnvs } from '../utils/crypto.js';\nimport { parseQualifiedName, isQualifiedName } from '../packing/resolver.js';\n\nconst ENV_TYPES_PROPERTY = '__agentbuilder_env_types';\ntype EnvValueType = 'text' | 'secret';\n\n/**\n * Environment type for DurableAgentBuilder.\n * Users extend this with their own bindings.\n */\nexport interface AgentBuilderEnv {\n AGENT_BUILDER: DurableObjectNamespace<DurableAgentBuilder>;\n AGENT_BUILDER_THREAD: DurableObjectNamespace;\n // Encryption key for thread/account/instance env values\n ENCRYPTION_KEY?: string;\n}\n\n/**\n * Thread metadata stored in the registry.\n */\nexport interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n env: Record<string, string> | null;\n env_types: Record<string, EnvValueType> | null;\n /** @deprecated Use env */\n tenvs: Record<string, unknown> | null;\n properties: Record<string, unknown> | null;\n parent: string | null;\n terminated: number | null;\n created_at: number;\n}\n\nexport interface PendingSubagentAttachmentRef {\n path: string;\n name?: string;\n mimeType?: string;\n size?: number;\n width?: number;\n height?: number;\n}\n\nexport interface PendingSubagentEnvRequestPayload {\n blocking: boolean;\n resumable: boolean;\n receives_messages: 'side_a' | 'side_b';\n parent_communication: 'implicit' | 'explicit';\n initial_message_content: string;\n initial_message_attachments: PendingSubagentAttachmentRef[];\n initial_agent_name?: string | null;\n agent_title?: string | null;\n agent_description?: string | null;\n spawn_group_id?: string | null;\n}\n\nexport interface PendingSubagentEnvRequest {\n request_id: string;\n parent_thread_id: string;\n agent_name: string;\n registry_agent_name: string;\n required: string[];\n missing: string[];\n payload: PendingSubagentEnvRequestPayload;\n created_at: number;\n}\n\n/**\n * Parameters for updating a thread.\n */\nexport interface UpdateThreadParams {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n env?: Record<string, string> | null;\n env_types?: Record<string, EnvValueType> | null;\n /** @deprecated Use env */\n tenvs?: Record<string, unknown> | null;\n properties?: Record<string, unknown> | null;\n parent?: string | null;\n terminated?: number | null;\n}\n\n/**\n * User record.\n */\nexport interface User {\n id: string;\n username: string;\n password_hash: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n}\n\nexport interface ScopedEnvEntry {\n name: string;\n value: string;\n type: EnvValueType;\n created_at: number;\n updated_at: number;\n}\n\n/**\n * Provider credentials.\n */\nexport interface Provider {\n name: string;\n sdk: string;\n api_key: string;\n}\n\n/**\n * Lightweight agent metadata included with real-time thread events.\n */\nexport interface ThreadEventAgent {\n name: string;\n title: string;\n type: string;\n description?: string;\n icon?: string;\n}\n\n/**\n * DurableAgentBuilder - The root Durable Object for AgentBuilder.\n *\n * This is a singleton DO that stores:\n * - Thread registry (maps thread IDs to agent names)\n * - User authentication data\n * - Provider credentials (API keys for LLM providers)\n * - Edit lock state for coordinated edits\n *\n * ## Usage\n *\n * Users must extend this class to provide virtual module access:\n *\n * ```typescript\n * import { DurableAgentBuilder } from '@standardagents/builder/runtime';\n * import { models } from 'virtual:@standardagents-models';\n * import { prompts } from 'virtual:@standardagents-prompts';\n * import { agents } from 'virtual:@standardagents-agents';\n *\n * export class AgentBuilder extends DurableAgentBuilder {\n * models() { return models; }\n * prompts() { return prompts; }\n * agents() { return agents; }\n * }\n * ```\n */\n/**\n * Event types that can be emitted via WebSocket\n */\nexport type AgentBuilderEvent =\n | {\n type: 'thread_created';\n thread: ThreadRegistryEntry & {\n agent?: ThreadEventAgent;\n };\n }\n | {\n type: 'thread_updated';\n thread: ThreadRegistryEntry & {\n agent?: ThreadEventAgent;\n };\n }\n | { type: 'thread_deleted'; threadId: string };\n\nexport class DurableAgentBuilder<\n Env extends AgentBuilderEnv = AgentBuilderEnv,\n> extends DurableObject<Env> {\n private migratedToVersion: number | null = null;\n private eventSockets: Set<WebSocket> = new Set();\n\n constructor(ctx: DurableObjectState, env: Env) {\n super(ctx, env);\n\n // Restore WebSocket connections after hibernation\n const sockets = ctx.getWebSockets();\n for (const ws of sockets) {\n const attachment = ws.deserializeAttachment();\n if (attachment?.channel === 'events') {\n this.eventSockets.add(ws);\n }\n }\n }\n\n private normalizeEnvRecord(\n input:\n | Record<string, unknown>\n | Record<string, string>\n | null\n | undefined\n ): Record<string, string> | null {\n if (!input || typeof input !== 'object') {\n return null;\n }\n\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(input)) {\n if (value === undefined || value === null) continue;\n result[key] = String(value);\n }\n\n return Object.keys(result).length > 0 ? result : null;\n }\n\n private normalizeEnvTypeRecord(\n input: Record<string, unknown> | null | undefined,\n env: Record<string, string> | null\n ): Record<string, EnvValueType> | null {\n if (!input || typeof input !== 'object' || !env) {\n return null;\n }\n\n const result: Record<string, EnvValueType> = {};\n for (const [key, value] of Object.entries(input)) {\n if (env[key] === undefined) continue;\n if (value === 'text') {\n // Only non-default text classifications are stored. Missing means\n // secret, which preserves conservative behavior for legacy values.\n result[key] = 'text';\n }\n }\n\n return Object.keys(result).length > 0 ? result : null;\n }\n\n private extractEnvTypeRecord(\n properties: Record<string, unknown> | null | undefined,\n env: Record<string, string> | null\n ): Record<string, EnvValueType> | null {\n if (!properties || typeof properties !== 'object') return null;\n const raw = properties[ENV_TYPES_PROPERTY];\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n return this.normalizeEnvTypeRecord(raw as Record<string, unknown>, env);\n }\n\n private withEnvTypeRecord(\n properties: Record<string, unknown> | null | undefined,\n envTypes: Record<string, EnvValueType> | null\n ): Record<string, unknown> | null {\n const next = properties && typeof properties === 'object'\n ? { ...properties }\n : {};\n\n if (envTypes && Object.keys(envTypes).length > 0) {\n next[ENV_TYPES_PROPERTY] = envTypes;\n } else {\n delete next[ENV_TYPES_PROPERTY];\n }\n\n return Object.keys(next).length > 0 ? next : null;\n }\n\n private serializeEnvTypes(\n envTypes: Record<string, EnvValueType> | null | undefined\n ): string {\n const entries = Object.entries(envTypes || {})\n .filter(([, value]) => value === 'text')\n .sort(([a], [b]) => a.localeCompare(b));\n return JSON.stringify(entries);\n }\n\n private resolveRegistryKey(\n registry: Record<string, unknown> | undefined,\n name: string\n ): string | null {\n if (!registry) return null;\n if (registry[name]) return name;\n\n if (name.includes('/')) {\n const short = name.split('/').pop();\n if (short && registry[short]) return short;\n }\n\n const suffix = `/${name}`;\n const suffixMatch = Object.keys(registry).find((key) => key.endsWith(suffix));\n if (suffixMatch) return suffixMatch;\n\n return null;\n }\n\n private extractScopedVariables(\n def: any\n ): Array<{ name: string; required: boolean }> {\n if (!Array.isArray(def?.variables)) {\n return [];\n }\n\n const scoped: Array<{ name: string; required: boolean }> = [];\n for (const entry of def.variables) {\n if (!entry || typeof entry !== 'object') continue;\n const scopedEntry = entry as {\n scoped?: unknown;\n name?: unknown;\n required?: unknown;\n };\n if (!scopedEntry.scoped) continue;\n const name = typeof scopedEntry.name === 'string'\n ? scopedEntry.name.trim()\n : '';\n if (!name) continue;\n scoped.push({\n name,\n required: !!scopedEntry.required,\n });\n }\n return scoped;\n }\n\n private filterScopedInheritedEnv(\n env: Record<string, string> | null,\n scopedVariableNames: Set<string>\n ): Record<string, string> | null {\n if (!env) return null;\n if (scopedVariableNames.size === 0) return env;\n\n const filtered: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n if (scopedVariableNames.has(key)) continue;\n filtered[key] = value;\n }\n return Object.keys(filtered).length > 0 ? filtered : null;\n }\n\n private filterScopedInheritedEnvTypes(\n envTypes: Record<string, EnvValueType> | null,\n env: Record<string, string> | null,\n scopedVariableNames: Set<string>\n ): Record<string, EnvValueType> | null {\n if (!envTypes || !env) return null;\n const filtered: Record<string, EnvValueType> = {};\n for (const [key, value] of Object.entries(envTypes)) {\n if (env[key] === undefined) continue;\n if (scopedVariableNames.has(key)) continue;\n if (value === 'text') {\n filtered[key] = 'text';\n }\n }\n return Object.keys(filtered).length > 0 ? filtered : null;\n }\n\n private async collectScopedVariablesForAgent(\n agentName: string\n ): Promise<{ all: Set<string>; required: Set<string> }> {\n const all = new Set<string>();\n const required = new Set<string>();\n const queue: Array<{ type: 'agent' | 'prompt' | 'tool'; name: string }> = [\n { type: 'agent', name: agentName },\n ];\n const visited = new Set<string>();\n\n const promptsRegistry = this.prompts();\n const agentsRegistry = this.agents();\n const toolsRegistry = this.tools();\n const addScopedVariables = (variables: Array<{ name: string; required: boolean }>) => {\n for (const variable of variables) {\n all.add(variable.name);\n if (variable.required) {\n required.add(variable.name);\n }\n }\n };\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const visitKey = `${current.type}:${current.name}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n if (current.type === 'agent') {\n let def: any = null;\n try {\n def = await this.loadAgent(current.name);\n } catch {\n def = null;\n }\n if (!def) {\n continue;\n }\n\n addScopedVariables(this.extractScopedVariables(def));\n\n if (typeof def.sideA?.prompt === 'string' && def.sideA.prompt) {\n queue.push({ type: 'prompt', name: def.sideA.prompt });\n }\n if (typeof def.sideB?.prompt === 'string' && def.sideB.prompt) {\n queue.push({ type: 'prompt', name: def.sideB.prompt });\n }\n continue;\n }\n\n if (current.type === 'prompt') {\n let def: any = null;\n try {\n def = await this.loadPrompt(current.name);\n } catch {\n def = null;\n }\n if (!def) {\n continue;\n }\n\n addScopedVariables(this.extractScopedVariables(def));\n\n const tools = Array.isArray(def.tools) ? def.tools : [];\n for (const toolEntry of tools) {\n const toolConfig =\n toolEntry && typeof toolEntry === 'object'\n ? (toolEntry as { name?: unknown })\n : null;\n const toolName =\n typeof toolEntry === 'string'\n ? toolEntry\n : (toolConfig && typeof toolConfig.name === 'string'\n ? toolConfig.name\n : null);\n if (!toolName || toolName.startsWith('provider:') || toolName.startsWith('mcp:')) {\n continue;\n }\n\n if (this.resolveRegistryKey(promptsRegistry, toolName)) {\n queue.push({ type: 'prompt', name: toolName });\n } else if (this.resolveRegistryKey(agentsRegistry, toolName)) {\n queue.push({ type: 'agent', name: toolName });\n } else if (this.resolveRegistryKey(toolsRegistry, toolName)) {\n queue.push({ type: 'tool', name: toolName });\n }\n }\n continue;\n }\n\n const toolKey = this.resolveRegistryKey(toolsRegistry, current.name);\n if (!toolKey) {\n continue;\n }\n\n let def: any = null;\n try {\n def = await toolsRegistry[toolKey]();\n } catch {\n def = null;\n }\n if (!def) {\n continue;\n }\n\n addScopedVariables(this.extractScopedVariables(def));\n\n const uses = Array.isArray(def.uses) ? def.uses : [];\n for (const useNameRaw of uses) {\n if (typeof useNameRaw !== 'string') continue;\n const useName = useNameRaw.trim();\n if (!useName) continue;\n\n if (this.resolveRegistryKey(promptsRegistry, useName)) {\n queue.push({ type: 'prompt', name: useName });\n } else if (this.resolveRegistryKey(agentsRegistry, useName)) {\n queue.push({ type: 'agent', name: useName });\n } else if (this.resolveRegistryKey(toolsRegistry, useName)) {\n queue.push({ type: 'tool', name: useName });\n }\n }\n }\n\n return { all, required };\n }\n\n private async getScopedVariableNamesForAgent(\n agentName: string\n ): Promise<Set<string>> {\n const scoped = await this.collectScopedVariablesForAgent(agentName);\n return scoped.all;\n }\n\n private async getRequiredScopedVariableNamesForAgent(\n agentName: string\n ): Promise<string[]> {\n const scoped = await this.collectScopedVariablesForAgent(agentName);\n return Array.from(scoped.required).sort((a, b) => a.localeCompare(b));\n }\n\n private normalizeScopedVariableList(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const seen = new Set<string>();\n const output: string[] = [];\n for (const entry of value) {\n if (typeof entry !== 'string') continue;\n const normalized = entry.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n output.push(normalized);\n }\n output.sort((a, b) => a.localeCompare(b));\n return output;\n }\n\n private normalizePendingAttachments(value: unknown): PendingSubagentAttachmentRef[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const output: PendingSubagentAttachmentRef[] = [];\n for (const entry of value) {\n if (!entry || typeof entry !== 'object') continue;\n const attachment = entry as {\n path?: unknown;\n name?: unknown;\n mimeType?: unknown;\n size?: unknown;\n width?: unknown;\n height?: unknown;\n };\n const path = typeof attachment.path === 'string' ? attachment.path.trim() : '';\n if (!path) continue;\n output.push({\n path,\n name: typeof attachment.name === 'string' ? attachment.name : undefined,\n mimeType: typeof attachment.mimeType === 'string' ? attachment.mimeType : undefined,\n size: typeof attachment.size === 'number' ? attachment.size : undefined,\n width: typeof attachment.width === 'number' ? attachment.width : undefined,\n height: typeof attachment.height === 'number' ? attachment.height : undefined,\n });\n }\n return output;\n }\n\n private sanitizeFilename(value: string): string {\n const normalized = value.trim();\n const withoutPath = normalized.split('/').pop() ?? normalized;\n const sanitized = withoutPath.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/-+/g, '-');\n const trimmed = sanitized.replace(/^[-.]+|[-.]+$/g, '');\n return trimmed || 'attachment';\n }\n\n private inferMimeTypeFromPath(path: string): string | null {\n const normalized = path.toLowerCase();\n if (normalized.endsWith('.png')) return 'image/png';\n if (normalized.endsWith('.jpg') || normalized.endsWith('.jpeg')) return 'image/jpeg';\n if (normalized.endsWith('.webp')) return 'image/webp';\n if (normalized.endsWith('.gif')) return 'image/gif';\n if (normalized.endsWith('.bmp')) return 'image/bmp';\n if (normalized.endsWith('.svg')) return 'image/svg+xml';\n return null;\n }\n\n private extensionForMimeType(mimeType: string | null | undefined): string | null {\n if (!mimeType) return null;\n const normalized = mimeType.toLowerCase();\n if (normalized === 'image/jpeg') return 'jpg';\n if (normalized === 'image/png') return 'png';\n if (normalized === 'image/webp') return 'webp';\n if (normalized === 'image/gif') return 'gif';\n if (normalized === 'image/bmp') return 'bmp';\n if (normalized === 'image/svg+xml') return 'svg';\n const slashIndex = normalized.indexOf('/');\n if (slashIndex === -1 || slashIndex === normalized.length - 1) {\n return null;\n }\n return normalized.slice(slashIndex + 1);\n }\n\n private buildAttachmentTargetPath(\n preferredName: string,\n mimeType: string | null | undefined,\n sourcePath: string\n ): string {\n const safeName = this.sanitizeFilename(preferredName);\n const lastDot = safeName.lastIndexOf('.');\n const stem = lastDot > 0 ? safeName.slice(0, lastDot) : safeName;\n const extFromName = lastDot > 0 ? safeName.slice(lastDot + 1).toLowerCase() : null;\n const ext =\n extFromName ??\n this.extensionForMimeType(mimeType) ??\n this.extensionForMimeType(this.inferMimeTypeFromPath(sourcePath)) ??\n 'bin';\n const shortId = crypto.randomUUID().slice(0, 8);\n const normalizedStem = (stem || 'attachment').slice(0, 64);\n return `/attachments/${normalizedStem}-${shortId}.${ext}`;\n }\n\n private formatSubagentAttachmentPathSummary(\n attachments: Array<{ path?: string }> | undefined\n ): string {\n if (!attachments || attachments.length === 0) {\n return '';\n }\n const paths = attachments\n .map((attachment) => attachment.path)\n .filter((path): path is string => typeof path === 'string' && path.length > 0);\n if (paths.length === 0) {\n return '';\n }\n const label = paths.length === 1 ? 'attachment' : 'attachments';\n return `\\n\\nThe subagent also returned the following ${label}:\\n\\n${paths.join('\\n')}`;\n }\n\n private formatSubagentTerminalMessage(\n referenceId: string,\n status: 'success' | 'error',\n result?: string,\n error?: string,\n attachments?: Array<{ path?: string }>\n ): string {\n const attachmentSummary = this.formatSubagentAttachmentPathSummary(attachments);\n if (status === 'error') {\n return `Subagent (reference: ${referenceId}) has reported a failure:\\n\\n${error ?? result ?? 'No failure details provided.'}${attachmentSummary}`;\n }\n return `Subagent (reference: ${referenceId}) has returned the following result:\\n\\n${result ?? error ?? 'No result content.'}${attachmentSummary}`;\n }\n\n private async copyPendingAttachmentsBetweenThreads(\n sourceThread: {\n readFile(path: string): Promise<{ success: boolean; data?: string; error?: string }>;\n statFile(path: string): Promise<{ success: boolean; file?: any; error?: string }>;\n },\n targetThread: {\n writeFile(\n path: string,\n data: string,\n mimeType: string,\n options?: Record<string, unknown>\n ): Promise<{ success: boolean; file?: any; error?: string }>;\n },\n attachments: PendingSubagentAttachmentRef[]\n ): Promise<Array<{\n id: string;\n type: 'file';\n path: string;\n name: string;\n mimeType: string;\n size: number;\n width?: number;\n height?: number;\n }>> {\n if (attachments.length === 0) {\n return [];\n }\n\n const copied: Array<{\n id: string;\n type: 'file';\n path: string;\n name: string;\n mimeType: string;\n size: number;\n width?: number;\n height?: number;\n }> = [];\n\n for (const attachment of attachments) {\n const sourceStat = await sourceThread.statFile(attachment.path);\n if (!sourceStat?.success || !sourceStat.file) {\n continue;\n }\n\n const sourceData = await sourceThread.readFile(attachment.path);\n if (!sourceData?.success || !sourceData.data) {\n continue;\n }\n\n const sourceFile = sourceStat.file;\n const preferredName =\n attachment.name ||\n sourceFile.name ||\n attachment.path.split('/').pop() ||\n 'attachment';\n const mimeType =\n sourceFile.mimeType ||\n attachment.mimeType ||\n this.inferMimeTypeFromPath(attachment.path) ||\n 'application/octet-stream';\n const targetPath = this.buildAttachmentTargetPath(\n preferredName,\n mimeType,\n attachment.path\n );\n\n const writeResult = await targetThread.writeFile(\n targetPath,\n sourceData.data,\n mimeType,\n {\n width: sourceFile.width ?? attachment.width,\n height: sourceFile.height ?? attachment.height,\n metadata: sourceFile.metadata,\n }\n );\n if (!writeResult?.success || !writeResult.file) {\n continue;\n }\n\n copied.push({\n id: crypto.randomUUID(),\n type: 'file',\n path: targetPath,\n name: this.sanitizeFilename(preferredName),\n mimeType: writeResult.file.mimeType || mimeType,\n size: writeResult.file.size ?? attachment.size ?? 0,\n width: writeResult.file.width ?? sourceFile.width ?? attachment.width,\n height: writeResult.file.height ?? sourceFile.height ?? attachment.height,\n });\n }\n\n return copied;\n }\n\n private buildThreadNameTag(name: string): string {\n const normalized = name.replace(/\\s+/g, ' ').trim();\n const trimmed = normalized.slice(0, 120);\n return `name:${trimmed}`;\n }\n\n private async encryptEnvRecord(\n env: Record<string, string> | null\n ): Promise<string | null> {\n if (!env || Object.keys(env).length === 0) {\n return null;\n }\n const encryptionKey = this.env.ENCRYPTION_KEY;\n if (!encryptionKey) {\n throw new Error('ENCRYPTION_KEY is required when using env values');\n }\n return encryptEnvs(env, encryptionKey);\n }\n\n private async decryptEnvRecord(encrypted: string | null): Promise<Record<string, string> | null> {\n if (!encrypted) return null;\n const encryptionKey = this.env.ENCRYPTION_KEY;\n if (!encryptionKey) {\n throw new Error('ENCRYPTION_KEY is required to read env values');\n }\n const env = await decryptEnvs(encrypted, encryptionKey);\n return Object.keys(env).length > 0 ? env : null;\n }\n\n private async listActiveDescendantThreadIds(rootThreadId: string): Promise<string[]> {\n const cursor = await this.ctx.storage.sql.exec<{ id: string }>(\n `WITH RECURSIVE thread_tree(id) AS (\n SELECT id FROM threads WHERE parent = ?\n UNION ALL\n SELECT t.id\n FROM threads t\n INNER JOIN thread_tree tt ON t.parent = tt.id\n )\n SELECT tt.id\n FROM thread_tree tt\n INNER JOIN threads t ON t.id = tt.id\n WHERE tt.id != ? AND t.terminated IS NULL`,\n rootThreadId,\n rootThreadId\n );\n return cursor.toArray().map((row) => row.id);\n }\n\n private async propagateThreadEnvToDescendants(\n rootThreadId: string,\n env: Record<string, string> | null,\n envTypes: Record<string, EnvValueType> | null\n ): Promise<void> {\n const descendantIds = await this.listActiveDescendantThreadIds(rootThreadId);\n if (descendantIds.length === 0) {\n return;\n }\n const scopedCache = new Map<string, Set<string>>();\n for (const childId of descendantIds) {\n const childThread = await this.getThread(childId);\n const childAgentName = childThread?.agent_name;\n\n let childEnv = env;\n let childEnvTypes = envTypes;\n if (childAgentName && env) {\n let scoped = scopedCache.get(childAgentName);\n if (!scoped) {\n scoped = await this.getScopedVariableNamesForAgent(childAgentName);\n scopedCache.set(childAgentName, scoped);\n }\n childEnv = this.filterScopedInheritedEnv(env, scoped);\n childEnvTypes = this.filterScopedInheritedEnvTypes(envTypes, childEnv, scoped);\n }\n\n const encryptedEnv = await this.encryptEnvRecord(childEnv);\n const properties = this.withEnvTypeRecord(childThread?.properties ?? null, childEnvTypes);\n await this.ctx.storage.sql.exec(\n `UPDATE threads SET env = ?, tenvs = ?, properties = ? WHERE id = ?`,\n encryptedEnv,\n encryptedEnv,\n properties ? JSON.stringify(properties) : null,\n childId\n );\n }\n }\n\n /**\n * Returns the tools registry for lazy-loading tool definitions.\n * Must be overridden in a subclass.\n */\n tools(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.tools() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the hooks registry for lazy-loading hook definitions.\n * Must be overridden in a subclass.\n */\n hooks(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.hooks() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the models registry for lazy-loading model definitions.\n * Must be overridden in a subclass.\n */\n models(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.models() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the prompts registry for lazy-loading prompt definitions.\n * Must be overridden in a subclass.\n */\n prompts(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.prompts() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the agents registry for lazy-loading agent definitions.\n * Must be overridden in a subclass.\n */\n agents(): Record<string, () => Promise<any>> {\n throw new Error(\n 'DurableAgentBuilder.agents() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n /**\n * Returns the namespaced registry for packed agent support.\n * Must be overridden in a subclass.\n */\n registry(): any {\n throw new Error(\n 'DurableAgentBuilder.registry() must be implemented. ' +\n \"Import DurableAgentBuilder from 'virtual:@standardagents/builder' instead.\"\n );\n }\n\n // ============================================================\n // Migration Methods\n // ============================================================\n\n private async ensureMigrated(): Promise<void> {\n if (this.migratedToVersion === LATEST_SCHEMA_VERSION) {\n return;\n }\n\n const currentVersion = await this.getCurrentVersion();\n\n if (currentVersion < LATEST_SCHEMA_VERSION) {\n await this.runMigrations(currentVersion);\n }\n\n this.migratedToVersion = LATEST_SCHEMA_VERSION;\n }\n\n private async getCurrentVersion(): Promise<number> {\n try {\n const cursor = await this.ctx.storage.sql.exec<{\n value: number | string;\n }>(`SELECT value FROM _metadata WHERE key = 'schema_version' LIMIT 1`);\n\n const rows = cursor.toArray();\n\n if (rows.length > 0) {\n const value = rows[0].value;\n const parsed =\n typeof value === 'number' ? value : parseInt(value as string, 10);\n return Number.isFinite(parsed) ? (parsed as number) : 0;\n }\n\n return 0;\n } catch (error) {\n return 0;\n }\n }\n\n private async runMigrations(fromVersion: number): Promise<void> {\n for (const migration of migrations) {\n if (migration.version > fromVersion) {\n await migration.up(this.ctx.storage.sql);\n }\n }\n }\n\n // ============================================================\n // Thread Registry Methods\n // ============================================================\n\n /**\n * Create a new thread and add it to the registry.\n */\n async createThread(params: {\n agent_name: string;\n user_id?: string;\n tags?: string[];\n env?: Record<string, string>;\n env_types?: Record<string, EnvValueType>;\n /** @deprecated Use env */\n tenvs?: Record<string, unknown>;\n properties?: Record<string, unknown>;\n parent?: string;\n }): Promise<ThreadRegistryEntry> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n const explicitEnv = this.normalizeEnvRecord(params.env ?? params.tenvs ?? null);\n const explicitEnvTypes = this.normalizeEnvTypeRecord(params.env_types ?? null, explicitEnv);\n let env = explicitEnv;\n let envTypes = explicitEnvTypes;\n\n // Child threads inherit thread-level env from parent by default.\n // Scoped variables declared in the child graph are filtered from inheritance.\n if (params.parent) {\n const parentThread = await this.getThread(params.parent);\n const inherited = parentThread?.env ?? null;\n if (inherited) {\n const scopedVariables = await this.getScopedVariableNamesForAgent(\n params.agent_name\n );\n const inheritedFiltered = this.filterScopedInheritedEnv(inherited, scopedVariables);\n const inheritedTypeFiltered = this.filterScopedInheritedEnvTypes(\n parentThread?.env_types ?? null,\n inheritedFiltered,\n scopedVariables\n );\n env = inheritedFiltered\n ? { ...inheritedFiltered, ...(env ?? {}) }\n : env;\n envTypes = {\n ...(inheritedTypeFiltered ?? {}),\n ...(envTypes ?? {}),\n };\n envTypes = this.normalizeEnvTypeRecord(envTypes, env);\n }\n }\n\n const encryptedEnv = await this.encryptEnvRecord(env);\n const properties = this.withEnvTypeRecord(params.properties ?? null, envTypes);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO threads (id, agent_name, user_id, tags, env, tenvs, properties, parent, terminated, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, ?)`,\n id,\n params.agent_name,\n params.user_id || null,\n params.tags ? JSON.stringify(params.tags) : null,\n encryptedEnv,\n encryptedEnv,\n properties ? JSON.stringify(properties) : null,\n params.parent ?? null,\n now\n );\n\n const thread: ThreadRegistryEntry = {\n id,\n agent_name: params.agent_name,\n user_id: params.user_id || null,\n tags: params.tags || null,\n env,\n env_types: envTypes,\n tenvs: env,\n properties,\n parent: params.parent ?? null,\n terminated: null,\n created_at: now,\n };\n\n const eventThread = await this.toThreadEventPayload(thread);\n\n // Broadcast thread_created event to connected WebSocket clients\n this.broadcastEvent({ type: 'thread_created', thread: eventThread });\n\n await this.runAfterThreadCreatedHook(thread);\n\n return thread;\n }\n\n private async runAfterThreadCreatedHook(thread: ThreadRegistryEntry): Promise<void> {\n let agentDef: any = null;\n try {\n agentDef = await this.loadAgent(thread.agent_name);\n } catch {\n return;\n }\n\n const hookIds = Array.isArray(agentDef?.hooks) ? agentDef.hooks : [];\n if (hookIds.length === 0) {\n return;\n }\n\n let hooksRegistry: Record<string, () => Promise<any>>;\n try {\n hooksRegistry = this.hooks();\n } catch {\n return;\n }\n\n const durableId = this.env.AGENT_BUILDER_THREAD.idFromName(thread.id);\n const threadStub = this.env.AGENT_BUILDER_THREAD.get(durableId) as any;\n const { ThreadStateImpl } = await import(\"../agents/ThreadStateImpl.js\");\n const threadState = ThreadStateImpl.fromThreadInstance(threadStub, {\n id: thread.id,\n agent_id: thread.agent_name,\n user_id: thread.user_id,\n env: thread.env,\n tenvs: thread.tenvs,\n properties: thread.properties,\n parent: thread.parent,\n terminated: thread.terminated,\n created_at: thread.created_at,\n });\n\n for (const hookId of hookIds) {\n const hookLoader = hooksRegistry[hookId];\n if (!hookLoader) continue;\n\n try {\n const hookDef = await hookLoader();\n if (hookDef?.hook === 'after_thread_created') {\n await hookDef.execute(threadState);\n }\n } catch (error) {\n console.error(`[Hooks] ✗ Error running after_thread_created hook '${hookId}':`, error);\n }\n }\n }\n\n /**\n * Get a thread by ID.\n */\n async getThread(id: string): Promise<ThreadRegistryEntry | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string | null;\n env: string | null;\n tenvs: string | null;\n properties: string | null;\n parent: string | null;\n terminated: number | null;\n created_at: number;\n }>(`SELECT id, agent_name, user_id, tags, env, tenvs, properties, parent, terminated, created_at FROM threads WHERE id = ?`, id);\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n const row = rows[0];\n\n const env = await this.decryptEnvRecord(row.env ?? row.tenvs ?? null);\n const properties = row.properties ? JSON.parse(row.properties) : null;\n const envTypes = this.extractEnvTypeRecord(properties, env);\n\n return {\n id: row.id,\n agent_name: row.agent_name,\n user_id: row.user_id,\n tags: row.tags ? JSON.parse(row.tags) : null,\n env,\n env_types: envTypes,\n tenvs: env,\n properties,\n parent: row.parent,\n terminated: row.terminated,\n created_at: row.created_at,\n };\n }\n\n /**\n * List threads with optional filtering.\n * Note: tenvs are not decrypted in list operations for performance.\n * Use getThread() to retrieve a thread with decrypted tenvs.\n */\n async listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n search?: string;\n startDate?: number;\n endDate?: number;\n limit?: number;\n offset?: number;\n include_children?: boolean;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }> {\n await this.ensureMigrated();\n\n const whereClauses: string[] = [];\n const args: any[] = [];\n\n if (params?.agent_name) {\n if (params.include_children) {\n // Include threads matching the agent AND all descendants (recursive)\n whereClauses.push(`id IN (\n WITH RECURSIVE descendants(id) AS (\n SELECT id FROM threads WHERE agent_name = ?\n UNION ALL\n SELECT t.id FROM threads t JOIN descendants d ON t.parent = d.id\n )\n SELECT id FROM descendants\n )`);\n args.push(params.agent_name);\n } else {\n whereClauses.push('agent_name = ?');\n args.push(params.agent_name);\n }\n }\n\n if (params?.user_id) {\n whereClauses.push('user_id = ?');\n args.push(params.user_id);\n }\n\n // Search by thread ID or tags (case-insensitive partial match)\n if (params?.search) {\n const searchTerm = `%${params.search.toLowerCase()}%`;\n whereClauses.push('(LOWER(id) LIKE ? OR LOWER(tags) LIKE ?)');\n args.push(searchTerm, searchTerm);\n }\n\n // Date range filtering\n if (params?.startDate) {\n whereClauses.push('created_at >= ?');\n args.push(params.startDate);\n }\n\n if (params?.endDate) {\n whereClauses.push('created_at <= ?');\n args.push(params.endDate);\n }\n\n const whereClause = whereClauses.length > 0\n ? `WHERE ${whereClauses.join(' AND ')}`\n : '';\n\n // Get total count\n const countCursor = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM threads ${whereClause}`,\n ...args\n );\n const total = countCursor.one().count;\n\n // Get threads\n const limit = params?.limit ?? 100;\n const offset = params?.offset ?? 0;\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string | null;\n properties: string | null;\n parent: string | null;\n terminated: number | null;\n created_at: number;\n }>(\n `SELECT id, agent_name, user_id, tags, properties, parent, terminated, created_at FROM threads\n ${whereClause}\n ORDER BY created_at DESC\n LIMIT ? OFFSET ?`,\n ...args,\n limit,\n offset\n );\n\n const threads = cursor.toArray().map((row) => ({\n id: row.id,\n agent_name: row.agent_name,\n user_id: row.user_id,\n tags: row.tags ? JSON.parse(row.tags) : null,\n env: null, // env not decrypted in list for performance\n env_types: null, // env types are tied to decrypted env values\n tenvs: null, // tenvs not decrypted in list for performance\n properties: row.properties ? JSON.parse(row.properties) : null,\n parent: row.parent,\n terminated: row.terminated,\n created_at: row.created_at,\n }));\n\n return { threads, total };\n }\n\n /**\n * Delete a thread from the registry.\n */\n async deleteThread(id: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(`DELETE FROM threads WHERE id = ?`, id);\n\n // Broadcast thread_deleted event to connected WebSocket clients\n this.broadcastEvent({ type: 'thread_deleted', threadId: id });\n\n return true;\n }\n\n /**\n * Get a thread tree (root + all descendants) in child-first order.\n *\n * Child-first ordering allows callers to perform destructive operations\n * (like deletes) without leaving child rows referencing a deleted parent.\n */\n async getThreadTreeIds(rootThreadId: string): Promise<string[]> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{ id: string; depth: number }>(\n `WITH RECURSIVE thread_tree(id, depth) AS (\n SELECT id, 0 FROM threads WHERE id = ?\n UNION ALL\n SELECT t.id, tt.depth + 1\n FROM threads t\n INNER JOIN thread_tree tt ON t.parent = tt.id\n )\n SELECT id, depth\n FROM thread_tree\n ORDER BY depth DESC`,\n rootThreadId\n );\n\n return cursor.toArray().map((row) => row.id);\n }\n\n /**\n * Update a thread's agent_name (used during agent handoff).\n */\n async updateThreadAgent(id: string, agent_name: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `UPDATE threads SET agent_name = ? WHERE id = ?`,\n agent_name,\n id\n );\n return true;\n }\n\n /**\n * Update a thread's metadata.\n */\n async updateThread(\n id: string,\n params: UpdateThreadParams\n ): Promise<ThreadRegistryEntry | null> {\n await this.ensureMigrated();\n\n // Check thread exists\n const existing = await this.getThread(id);\n if (!existing) return null;\n\n const updates: string[] = [];\n const values: any[] = [];\n let shouldPropagateEnv = false;\n\n if (params.agent_name !== undefined) {\n updates.push('agent_name = ?');\n values.push(params.agent_name);\n }\n if (params.user_id !== undefined) {\n updates.push('user_id = ?');\n values.push(params.user_id);\n }\n if (params.tags !== undefined) {\n updates.push('tags = ?');\n values.push(params.tags ? JSON.stringify(params.tags) : null);\n }\n if (params.env !== undefined || params.tenvs !== undefined) {\n const env = this.normalizeEnvRecord(params.env ?? params.tenvs ?? null);\n const envTypes = this.normalizeEnvTypeRecord(\n params.env_types !== undefined ? params.env_types : existing.env_types,\n env\n );\n const encryptedEnv = await this.encryptEnvRecord(env);\n updates.push('env = ?');\n values.push(encryptedEnv);\n // Keep legacy column in sync for backward compatibility.\n updates.push('tenvs = ?');\n values.push(encryptedEnv);\n const properties = this.withEnvTypeRecord(\n params.properties !== undefined ? params.properties : existing.properties,\n envTypes\n );\n const existingEnvTypes = this.normalizeEnvTypeRecord(existing.env_types, existing.env);\n if (\n params.properties !== undefined ||\n params.env_types !== undefined ||\n this.serializeEnvTypes(envTypes) !== this.serializeEnvTypes(existingEnvTypes)\n ) {\n updates.push('properties = ?');\n values.push(properties ? JSON.stringify(properties) : null);\n }\n shouldPropagateEnv = true;\n } else if (params.properties !== undefined) {\n updates.push('properties = ?');\n values.push(params.properties ? JSON.stringify(params.properties) : null);\n }\n if (params.parent !== undefined) {\n updates.push('parent = ?');\n values.push(params.parent);\n }\n if (params.terminated !== undefined) {\n updates.push('terminated = ?');\n values.push(params.terminated);\n }\n\n if (updates.length === 0) {\n return existing;\n }\n\n values.push(id);\n\n await this.ctx.storage.sql.exec(\n `UPDATE threads SET ${updates.join(', ')} WHERE id = ?`,\n ...values\n );\n\n if (shouldPropagateEnv) {\n const env = this.normalizeEnvRecord(params.env ?? params.tenvs ?? null);\n const envTypes = this.normalizeEnvTypeRecord(\n params.env_types !== undefined ? params.env_types : existing.env_types,\n env\n );\n await this.propagateThreadEnvToDescendants(id, env, envTypes);\n }\n\n const updated = await this.getThread(id);\n if (updated) {\n const eventThread = await this.toThreadEventPayload(updated);\n this.broadcastEvent({ type: 'thread_updated', thread: eventThread });\n }\n\n return updated;\n }\n\n private getEncryptionKey(): string {\n const encryptionKey = this.env.ENCRYPTION_KEY;\n if (!encryptionKey) {\n throw new Error('ENCRYPTION_KEY is required for env operations');\n }\n return encryptionKey;\n }\n\n private async encryptEnvValue(value: string): Promise<string> {\n return CryptoUtil.encrypt(value, this.getEncryptionKey());\n }\n\n private async decryptEnvValue(encrypted: string): Promise<string> {\n return CryptoUtil.decrypt(encrypted, this.getEncryptionKey());\n }\n\n private async listScopedEnv(\n scope: 'instance' | 'user',\n userId: string = ''\n ): Promise<Record<string, string>> {\n const entries = await this.listScopedEnvEntries(scope, userId);\n const env: Record<string, string> = {};\n for (const entry of entries) {\n env[entry.name] = entry.value;\n }\n return env;\n }\n\n private async listScopedEnvEntries(\n scope: 'instance' | 'user',\n userId: string = ''\n ): Promise<ScopedEnvEntry[]> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n name: string;\n value: string;\n value_type: string | null;\n created_at: number;\n updated_at: number;\n }>(\n `SELECT name, value, value_type, created_at, updated_at\n FROM envs\n WHERE scope = ? AND user_id = ?`,\n scope,\n userId\n );\n\n const entries: ScopedEnvEntry[] = [];\n const rows = cursor.toArray();\n for (const row of rows) {\n try {\n entries.push({\n name: row.name,\n value: await this.decryptEnvValue(row.value),\n type: row.value_type === 'text' ? 'text' : 'secret',\n created_at: row.created_at,\n updated_at: row.updated_at,\n });\n } catch {\n // Ignore invalid entries and continue.\n }\n }\n return entries;\n }\n\n private async getScopedEnvTypeRecord(\n scope: 'instance' | 'user',\n userId: string = ''\n ): Promise<Record<string, EnvValueType>> {\n const entries = await this.listScopedEnvEntries(scope, userId);\n const envTypes: Record<string, EnvValueType> = {};\n for (const entry of entries) {\n if (entry.type === 'text') {\n envTypes[entry.name] = 'text';\n }\n }\n return envTypes;\n }\n\n private async replaceScopedEnv(\n scope: 'instance' | 'user',\n userId: string,\n env: Record<string, string>,\n envTypes?: Record<string, EnvValueType> | null\n ): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `DELETE FROM envs WHERE scope = ? AND user_id = ?`,\n scope,\n userId\n );\n\n const now = Math.floor(Date.now() / 1000);\n const normalizedEnvTypes = this.normalizeEnvTypeRecord(envTypes ?? null, env) ?? {};\n for (const [name, value] of Object.entries(env)) {\n await this.ctx.storage.sql.exec(\n `INSERT INTO envs (scope, user_id, name, value, value_type, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n scope,\n userId,\n name,\n await this.encryptEnvValue(value),\n normalizedEnvTypes[name] === 'text' ? 'text' : 'secret',\n now,\n now\n );\n }\n }\n\n private async patchScopedEnv(\n scope: 'instance' | 'user',\n userId: string,\n params: {\n env_patch?: Record<string, unknown> | null;\n env_type_patch?: Record<string, unknown> | null;\n env_delete?: string[] | null;\n }\n ): Promise<void> {\n const currentEnv = await this.listScopedEnv(scope, userId);\n const currentEnvTypes = await this.getScopedEnvTypeRecord(scope, userId);\n\n const nextEnv: Record<string, string> = { ...currentEnv };\n const nextEnvTypes: Record<string, EnvValueType> = { ...currentEnvTypes };\n\n if (params.env_patch) {\n for (const [key, value] of Object.entries(params.env_patch)) {\n const property = key.trim();\n if (!property) {\n throw new Error('env_patch keys must be non-empty strings');\n }\n if (value === undefined || value === null) {\n throw new Error(`env_patch.${property} must be a string`);\n }\n nextEnv[property] = String(value);\n }\n }\n\n if (params.env_type_patch) {\n for (const [key, value] of Object.entries(params.env_type_patch)) {\n const property = key.trim();\n if (!property) {\n throw new Error('env_type_patch keys must be non-empty strings');\n }\n if (nextEnv[property] === undefined) {\n throw new Error(`env_type_patch.${property} has no matching env value`);\n }\n if (value === 'text') {\n nextEnvTypes[property] = 'text';\n } else {\n delete nextEnvTypes[property];\n }\n }\n }\n\n for (const key of params.env_delete ?? []) {\n delete nextEnv[key];\n delete nextEnvTypes[key];\n }\n\n await this.replaceScopedEnv(scope, userId, nextEnv, nextEnvTypes);\n }\n\n async getInstanceEnv(): Promise<Record<string, string>> {\n return this.listScopedEnv('instance', '');\n }\n\n async getInstanceEnvTypes(): Promise<Record<string, EnvValueType>> {\n return this.getScopedEnvTypeRecord('instance', '');\n }\n\n async getInstanceEnvEntries(): Promise<ScopedEnvEntry[]> {\n return this.listScopedEnvEntries('instance', '');\n }\n\n async setInstanceEnv(\n env: Record<string, string>,\n envTypes?: Record<string, EnvValueType> | null\n ): Promise<void> {\n const normalized = this.normalizeEnvRecord(env) ?? {};\n const normalizedTypes = this.normalizeEnvTypeRecord(envTypes ?? null, normalized);\n await this.replaceScopedEnv('instance', '', normalized, normalizedTypes);\n }\n\n async patchInstanceEnv(params: {\n env_patch?: Record<string, unknown> | null;\n env_type_patch?: Record<string, unknown> | null;\n env_delete?: string[] | null;\n }): Promise<void> {\n await this.patchScopedEnv('instance', '', params);\n }\n\n async getUserEnv(userId: string): Promise<Record<string, string>> {\n return this.listScopedEnv('user', userId);\n }\n\n async getUserEnvTypes(userId: string): Promise<Record<string, EnvValueType>> {\n return this.getScopedEnvTypeRecord('user', userId);\n }\n\n async getUserEnvEntries(userId: string): Promise<ScopedEnvEntry[]> {\n return this.listScopedEnvEntries('user', userId);\n }\n\n async setUserEnv(\n userId: string,\n env: Record<string, string>,\n envTypes?: Record<string, EnvValueType> | null\n ): Promise<void> {\n const normalized = this.normalizeEnvRecord(env) ?? {};\n const normalizedTypes = this.normalizeEnvTypeRecord(envTypes ?? null, normalized);\n await this.replaceScopedEnv('user', userId, normalized, normalizedTypes);\n }\n\n async patchUserEnv(\n userId: string,\n params: {\n env_patch?: Record<string, unknown> | null;\n env_type_patch?: Record<string, unknown> | null;\n env_delete?: string[] | null;\n }\n ): Promise<void> {\n await this.patchScopedEnv('user', userId, params);\n }\n\n async getMissingRequiredScopedSubagentEnv(params: {\n parent_thread_id: string;\n agent_name: string;\n provided_env?: Record<string, string> | null;\n }): Promise<string[]> {\n await this.ensureMigrated();\n\n const requiredScoped = await this.getRequiredScopedVariableNamesForAgent(\n params.agent_name\n );\n if (requiredScoped.length === 0) {\n return [];\n }\n\n const parentThread = await this.getThread(params.parent_thread_id);\n if (!parentThread) {\n return requiredScoped;\n }\n\n const providedEnv = this.normalizeEnvRecord(params.provided_env ?? null) ?? {};\n const userEnv = parentThread.user_id\n ? await this.getUserEnv(parentThread.user_id)\n : {};\n const instanceEnv = await this.getInstanceEnv();\n\n let agentDef: any = null;\n try {\n agentDef = await this.loadAgent(params.agent_name);\n } catch {\n agentDef = null;\n }\n const agentEnv = this.normalizeEnvRecord(agentDef?.env ?? agentDef?.tenvs ?? null) ?? {};\n\n const promptEnv: Record<string, string> = {};\n const promptNames: string[] = [];\n const sideAPrompt = typeof agentDef?.sideA?.prompt === 'string' ? agentDef.sideA.prompt : null;\n const sideBPrompt = typeof agentDef?.sideB?.prompt === 'string' ? agentDef.sideB.prompt : null;\n if (sideAPrompt) promptNames.push(sideAPrompt);\n if (sideBPrompt && sideBPrompt !== sideAPrompt) promptNames.push(sideBPrompt);\n for (const promptName of promptNames) {\n try {\n const promptDef = await this.loadPrompt(promptName);\n const env = this.normalizeEnvRecord(promptDef?.env ?? promptDef?.tenvs ?? null);\n if (!env) continue;\n for (const [name, value] of Object.entries(env)) {\n if (promptEnv[name] === undefined) {\n promptEnv[name] = value;\n }\n }\n } catch {\n // Ignore unresolved prompt definitions.\n }\n }\n\n const missing: string[] = [];\n for (const property of requiredScoped) {\n if (providedEnv[property] !== undefined) continue;\n if (agentEnv[property] !== undefined) continue;\n if (promptEnv[property] !== undefined) continue;\n if (userEnv[property] !== undefined) continue;\n if (instanceEnv[property] !== undefined) continue;\n missing.push(property);\n }\n\n missing.sort((a, b) => a.localeCompare(b));\n return missing;\n }\n\n async createPendingSubagentEnvRequest(params: {\n parent_thread_id: string;\n agent_name: string;\n registry_agent_name: string;\n required_variables: string[];\n missing_variables: string[];\n payload: PendingSubagentEnvRequestPayload;\n }): Promise<PendingSubagentEnvRequest> {\n await this.ensureMigrated();\n\n const requestId = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n const required = this.normalizeScopedVariableList(params.required_variables);\n const missing = this.normalizeScopedVariableList(params.missing_variables);\n const payload: PendingSubagentEnvRequestPayload = {\n blocking: !!params.payload.blocking,\n resumable: !!params.payload.resumable,\n receives_messages:\n params.payload.receives_messages === 'side_b' ? 'side_b' : 'side_a',\n parent_communication:\n params.payload.parent_communication === 'explicit' ? 'explicit' : 'implicit',\n initial_message_content:\n typeof params.payload.initial_message_content === 'string'\n ? params.payload.initial_message_content\n : '',\n initial_message_attachments: this.normalizePendingAttachments(\n params.payload.initial_message_attachments\n ),\n initial_agent_name:\n typeof params.payload.initial_agent_name === 'string'\n ? params.payload.initial_agent_name\n : null,\n agent_title:\n typeof params.payload.agent_title === 'string'\n ? params.payload.agent_title\n : null,\n agent_description:\n typeof params.payload.agent_description === 'string'\n ? params.payload.agent_description\n : null,\n spawn_group_id:\n typeof params.payload.spawn_group_id === 'string'\n ? params.payload.spawn_group_id\n : null,\n };\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO pending_subagent_env_requests (\n id, parent_thread_id, agent_name, registry_agent_name,\n required_variables, missing_variables, payload, created_at, completed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)`,\n requestId,\n params.parent_thread_id,\n params.agent_name,\n params.registry_agent_name,\n JSON.stringify(required),\n JSON.stringify(missing),\n JSON.stringify(payload),\n now\n );\n\n return {\n request_id: requestId,\n parent_thread_id: params.parent_thread_id,\n agent_name: params.agent_name,\n registry_agent_name: params.registry_agent_name,\n required,\n missing,\n payload,\n created_at: now,\n };\n }\n\n async getPendingSubagentEnvRequest(\n parentThreadId: string,\n requestId: string\n ): Promise<PendingSubagentEnvRequest | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n parent_thread_id: string;\n agent_name: string;\n registry_agent_name: string;\n required_variables: string;\n missing_variables: string;\n payload: string;\n created_at: number;\n }>(\n `SELECT\n id, parent_thread_id, agent_name, registry_agent_name,\n required_variables, missing_variables, payload, created_at\n FROM pending_subagent_env_requests\n WHERE id = ? AND parent_thread_id = ? AND completed_at IS NULL\n LIMIT 1`,\n requestId,\n parentThreadId\n );\n\n const row = cursor.toArray()[0];\n if (!row) {\n return null;\n }\n\n let payloadRaw: unknown = null;\n try {\n payloadRaw = JSON.parse(row.payload);\n } catch {\n payloadRaw = null;\n }\n const payloadObject: Record<string, unknown> =\n payloadRaw && typeof payloadRaw === 'object'\n ? (payloadRaw as Record<string, unknown>)\n : {};\n const payload: PendingSubagentEnvRequestPayload = {\n blocking: !!payloadObject.blocking,\n resumable: !!payloadObject.resumable,\n receives_messages:\n payloadObject.receives_messages === 'side_b' ? 'side_b' : 'side_a',\n parent_communication:\n payloadObject.parent_communication === 'explicit' ? 'explicit' : 'implicit',\n initial_message_content:\n typeof payloadObject.initial_message_content === 'string'\n ? payloadObject.initial_message_content\n : '',\n initial_message_attachments: this.normalizePendingAttachments(\n payloadObject.initial_message_attachments\n ),\n initial_agent_name:\n typeof payloadObject.initial_agent_name === 'string'\n ? payloadObject.initial_agent_name\n : null,\n agent_title:\n typeof payloadObject.agent_title === 'string'\n ? payloadObject.agent_title\n : null,\n agent_description:\n typeof payloadObject.agent_description === 'string'\n ? payloadObject.agent_description\n : null,\n spawn_group_id:\n typeof payloadObject.spawn_group_id === 'string'\n ? payloadObject.spawn_group_id\n : null,\n };\n\n let requiredRaw: unknown = [];\n let missingRaw: unknown = [];\n try {\n requiredRaw = JSON.parse(row.required_variables);\n } catch {\n requiredRaw = [];\n }\n try {\n missingRaw = JSON.parse(row.missing_variables);\n } catch {\n missingRaw = [];\n }\n\n return {\n request_id: row.id,\n parent_thread_id: row.parent_thread_id,\n agent_name: row.agent_name,\n registry_agent_name: row.registry_agent_name,\n required: this.normalizeScopedVariableList(requiredRaw),\n missing: this.normalizeScopedVariableList(missingRaw),\n payload,\n created_at: row.created_at,\n };\n }\n\n private async clearPendingSubagentEnvRequest(\n parentThreadId: string,\n requestId: string\n ): Promise<void> {\n await this.ctx.storage.sql.exec(\n `DELETE FROM pending_subagent_env_requests WHERE id = ? AND parent_thread_id = ?`,\n requestId,\n parentThreadId\n );\n }\n\n async completePendingSubagentEnvRequest(params: {\n parent_thread_id: string;\n request_id: string;\n env: Record<string, string>;\n }): Promise<{ request_id: string; child_thread_id: string; status: 'success' }> {\n await this.ensureMigrated();\n\n const pending = await this.getPendingSubagentEnvRequest(\n params.parent_thread_id,\n params.request_id\n );\n if (!pending) {\n throw new Error(`Pending subagent env request not found: ${params.request_id}`);\n }\n\n const providedEnv = this.normalizeEnvRecord(params.env) ?? {};\n const stillMissing = await this.getMissingRequiredScopedSubagentEnv({\n parent_thread_id: params.parent_thread_id,\n agent_name: pending.agent_name,\n provided_env: providedEnv,\n });\n if (stillMissing.length > 0) {\n throw new Error(\n `Missing required scoped environment variables: ${stillMissing.join(', ')}`\n );\n }\n\n const initialAgentName =\n typeof pending.payload.initial_agent_name === 'string'\n ? pending.payload.initial_agent_name.replace(/\\s+/g, ' ').trim()\n : '';\n\n const childThread = await this.createThread({\n agent_name: pending.agent_name,\n parent: params.parent_thread_id,\n env: providedEnv,\n tags: initialAgentName ? [this.buildThreadNameTag(initialAgentName)] : undefined,\n });\n\n const parentId = this.env.AGENT_BUILDER_THREAD.idFromName(params.parent_thread_id);\n const childId = this.env.AGENT_BUILDER_THREAD.idFromName(childThread.id);\n const parentThread = this.env.AGENT_BUILDER_THREAD.get(parentId) as {\n readFile?(path: string): Promise<{ success: boolean; data?: string; error?: string }>;\n statFile?(path: string): Promise<{ success: boolean; file?: any; error?: string }>;\n writeFile?(\n path: string,\n data: string,\n mimeType: string,\n options?: Record<string, unknown>\n ): Promise<{ success: boolean; file?: any; error?: string }>;\n queueMessage?(threadId: string, message: Record<string, unknown>): Promise<void>;\n upsertChildRegistry?(threadId: string, entry: Record<string, unknown>): Promise<void>;\n updateChildRegistryStatus?(\n threadId: string,\n reference: string,\n status: string\n ): Promise<void>;\n };\n const childThreadStub = this.env.AGENT_BUILDER_THREAD.get(childId) as {\n readFile?(path: string): Promise<{ success: boolean; data?: string; error?: string }>;\n statFile?(path: string): Promise<{ success: boolean; file?: any; error?: string }>;\n writeFile?(\n path: string,\n data: string,\n mimeType: string,\n options?: Record<string, unknown>\n ): Promise<{ success: boolean; file?: any; error?: string }>;\n executeBlocking?(\n threadId: string,\n agentName: string,\n initialMessages?: unknown[],\n data?: unknown\n ): Promise<{\n status: 'success' | 'error';\n result?: string;\n error?: string;\n attachments?: PendingSubagentAttachmentRef[];\n terminal?: boolean;\n }>;\n terminateThread?(threadId: string): Promise<{ success: boolean; terminated: number }>;\n };\n\n const canCopyInitialAttachments =\n typeof parentThread.readFile === 'function' &&\n typeof parentThread.statFile === 'function' &&\n typeof childThreadStub.writeFile === 'function';\n const initialAttachments = canCopyInitialAttachments\n ? await this.copyPendingAttachmentsBetweenThreads(\n {\n readFile: parentThread.readFile!,\n statFile: parentThread.statFile!,\n },\n {\n writeFile: childThreadStub.writeFile!,\n },\n pending.payload.initial_message_attachments\n )\n : [];\n\n const targetRole = pending.payload.receives_messages === 'side_b' ? 'assistant' : 'user';\n const baseTimestamp = Date.now() * 1000;\n const initialMessages: Array<Record<string, unknown>> = [];\n for (let i = 0; i < initialAttachments.length; i++) {\n const attachment = initialAttachments[i];\n initialMessages.push({\n id: crypto.randomUUID(),\n role: targetRole,\n content: `Initial asset attachment path: ${attachment.path}`,\n attachments: JSON.stringify([attachment]),\n silent: true,\n created_at: baseTimestamp + i,\n });\n }\n initialMessages.push({\n id: crypto.randomUUID(),\n role: targetRole,\n content: pending.payload.initial_message_content,\n attachments: undefined,\n created_at: baseTimestamp + initialAttachments.length,\n });\n\n if (typeof parentThread.upsertChildRegistry === 'function') {\n await parentThread.upsertChildRegistry(params.parent_thread_id, {\n reference: childThread.id,\n name: pending.registry_agent_name,\n title: pending.payload.agent_title || pending.registry_agent_name,\n description:\n pending.payload.agent_description ||\n `Autonomous subagent ${pending.payload.agent_title || pending.registry_agent_name}`,\n resumable: pending.payload.resumable,\n blocking: pending.payload.blocking,\n status: 'running',\n ...(initialAgentName ? { threadName: initialAgentName } : {}),\n ...(pending.payload.spawn_group_id ? { spawnGroupId: pending.payload.spawn_group_id } : {}),\n createdAt: Date.now() * 1000,\n });\n }\n\n void (async () => {\n try {\n if (typeof childThreadStub.executeBlocking !== 'function') {\n throw new Error('executeBlocking is not available on child thread');\n }\n\n const childResult = await childThreadStub.executeBlocking(\n childThread.id,\n pending.agent_name,\n initialMessages,\n {}\n );\n\n const resultAttachments =\n Array.isArray(childResult.attachments) && childResult.attachments.length > 0 &&\n typeof childThreadStub.readFile === 'function' &&\n typeof childThreadStub.statFile === 'function' &&\n typeof parentThread.writeFile === 'function'\n ? await this.copyPendingAttachmentsBetweenThreads(\n {\n readFile: childThreadStub.readFile,\n statFile: childThreadStub.statFile,\n },\n {\n writeFile: parentThread.writeFile,\n },\n this.normalizePendingAttachments(childResult.attachments)\n )\n : [];\n\n const messageContent = this.formatSubagentTerminalMessage(\n childThread.id,\n childResult.status,\n childResult.result,\n childResult.error,\n resultAttachments\n );\n if (\n pending.payload.parent_communication !== 'explicit' &&\n typeof parentThread.queueMessage === 'function'\n ) {\n await parentThread.queueMessage(params.parent_thread_id, {\n role: 'user',\n content: messageContent,\n attachments: resultAttachments,\n silent: true,\n metadata: { subagent_id: childThread.id },\n });\n }\n\n if (pending.payload.resumable) {\n if (typeof parentThread.updateChildRegistryStatus === 'function') {\n await parentThread.updateChildRegistryStatus(\n params.parent_thread_id,\n childThread.id,\n childResult.terminal ? 'terminated' : 'idle'\n );\n }\n if (childResult.terminal && typeof childThreadStub.terminateThread === 'function') {\n await childThreadStub.terminateThread(childThread.id);\n }\n } else if (typeof childThreadStub.terminateThread === 'function') {\n await childThreadStub.terminateThread(childThread.id);\n }\n } catch (error) {\n console.error(\n '[DurableAgentBuilder] Failed to complete pending subagent env bootstrap:',\n error\n );\n if (\n pending.payload.resumable &&\n typeof parentThread.updateChildRegistryStatus === 'function'\n ) {\n await parentThread.updateChildRegistryStatus(\n params.parent_thread_id,\n childThread.id,\n 'idle'\n );\n }\n }\n })();\n\n await this.clearPendingSubagentEnvRequest(\n params.parent_thread_id,\n params.request_id\n );\n\n return {\n request_id: params.request_id,\n child_thread_id: childThread.id,\n status: 'success',\n };\n }\n\n async resolveThreadEnv(params: {\n threadId: string;\n property: string;\n promptName?: string;\n }): Promise<string | null> {\n const thread = await this.getThread(params.threadId);\n if (!thread) return null;\n\n if (thread.env && thread.env[params.property] !== undefined) {\n return thread.env[params.property];\n }\n\n let agentDef: any = null;\n try {\n agentDef = await this.loadAgent(thread.agent_name);\n } catch {\n agentDef = null;\n }\n const agentEnv = this.normalizeEnvRecord(agentDef?.env ?? agentDef?.tenvs ?? null);\n if (agentEnv && agentEnv[params.property] !== undefined) {\n return agentEnv[params.property];\n }\n\n const fallbackPromptName =\n params.promptName ?? (typeof agentDef?.sideA?.prompt === 'string' ? agentDef.sideA.prompt : undefined);\n if (fallbackPromptName) {\n try {\n const promptDef = await this.loadPrompt(fallbackPromptName);\n const promptEnv = this.normalizeEnvRecord(promptDef?.env ?? promptDef?.tenvs ?? null);\n if (promptEnv && promptEnv[params.property] !== undefined) {\n return promptEnv[params.property];\n }\n } catch {\n // Ignore missing prompt fallback.\n }\n }\n\n if (thread.user_id) {\n const userEnv = await this.getUserEnv(thread.user_id);\n if (userEnv[params.property] !== undefined) {\n return userEnv[params.property];\n }\n }\n\n const instanceEnv = await this.getInstanceEnv();\n if (instanceEnv[params.property] !== undefined) {\n return instanceEnv[params.property];\n }\n\n return null;\n }\n\n async resolveThreadEnvType(params: {\n threadId: string;\n property: string;\n promptName?: string;\n }): Promise<EnvValueType> {\n const thread = await this.getThread(params.threadId);\n if (!thread) return 'secret';\n\n if (thread.env && thread.env[params.property] !== undefined) {\n return thread.env_types?.[params.property] === 'text' ? 'text' : 'secret';\n }\n\n let agentDef: any = null;\n try {\n agentDef = await this.loadAgent(thread.agent_name);\n } catch {\n agentDef = null;\n }\n const agentEnv = this.normalizeEnvRecord(agentDef?.env ?? agentDef?.tenvs ?? null);\n if (agentEnv && agentEnv[params.property] !== undefined) {\n return 'secret';\n }\n\n const fallbackPromptName =\n params.promptName ?? (typeof agentDef?.sideA?.prompt === 'string' ? agentDef.sideA.prompt : undefined);\n if (fallbackPromptName) {\n try {\n const promptDef = await this.loadPrompt(fallbackPromptName);\n const promptEnv = this.normalizeEnvRecord(promptDef?.env ?? promptDef?.tenvs ?? null);\n if (promptEnv && promptEnv[params.property] !== undefined) {\n return 'secret';\n }\n } catch {\n // Ignore missing prompt fallback.\n }\n }\n\n if (thread.user_id) {\n const userEnv = await this.getUserEnv(thread.user_id);\n if (userEnv[params.property] !== undefined) {\n const userEnvTypes = await this.getUserEnvTypes(thread.user_id);\n return userEnvTypes[params.property] === 'text' ? 'text' : 'secret';\n }\n }\n\n const instanceEnv = await this.getInstanceEnv();\n if (instanceEnv[params.property] !== undefined) {\n const instanceEnvTypes = await this.getInstanceEnvTypes();\n return instanceEnvTypes[params.property] === 'text' ? 'text' : 'secret';\n }\n\n return 'secret';\n }\n\n private async toThreadEventPayload(\n thread: ThreadRegistryEntry\n ): Promise<ThreadRegistryEntry & { agent?: ThreadEventAgent }> {\n const eventThread: ThreadRegistryEntry & { agent?: ThreadEventAgent } = {\n ...thread,\n };\n\n try {\n const agentDef = await this.loadAgent(thread.agent_name);\n eventThread.agent = {\n name: thread.agent_name,\n title: agentDef.title || thread.agent_name,\n type: agentDef.type || 'unknown',\n description: agentDef.description,\n icon: agentDef.icon,\n };\n } catch {\n // Agent definition might not be resolvable; fall back to bare thread metadata.\n }\n\n return eventThread;\n }\n\n // ============================================================\n // Model Lookup Methods\n // ============================================================\n\n /**\n * Load a model definition by name.\n */\n async loadModel(name: string): Promise<any> {\n const registry = this.models();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Model not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available model names.\n */\n getModelNames(): string[] {\n return Object.keys(this.models());\n }\n\n // ============================================================\n // Prompt Lookup Methods\n // ============================================================\n\n /**\n * Load a prompt definition by name.\n */\n async loadPrompt(name: string): Promise<any> {\n const registry = this.prompts();\n const loader = registry[name];\n if (!loader) {\n throw new Error(`Prompt not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available prompt names.\n */\n getPromptNames(): string[] {\n return Object.keys(this.prompts());\n }\n\n // ============================================================\n // Agent Lookup Methods\n // ============================================================\n\n /**\n * Load an agent definition by name.\n * Supports both global agents (e.g., \"my-agent\") and packed agents (e.g., \"packageId/agentName\").\n * For scoped packages, use \"@scope/pkg/agentName\".\n */\n async loadAgent(name: string): Promise<any> {\n // Check if this is a qualified name (packed agent)\n if (isQualifiedName(name)) {\n const [packageId, agentName] = parseQualifiedName(name);\n const reg = this.registry();\n console.log(`[loadAgent] Packed agent: ${name}, packageId: ${packageId}, agentName: ${agentName}, registry packages: ${reg?.packages ? Object.keys(reg.packages) : 'undefined'}`);\n\n if (!reg?.packages) {\n throw new Error(`Agent not found: ${name}. Registry packages is undefined.`);\n }\n if (!packageId) {\n throw new Error(`Agent not found: ${name}. Could not parse package ID.`);\n }\n const pkg = reg.packages[packageId];\n if (!pkg) {\n throw new Error(`Agent not found: ${name}. Package \"${packageId}\" not found. Available: ${Object.keys(reg.packages).join(', ')}`);\n }\n if (!pkg.agents?.[agentName]) {\n throw new Error(`Agent not found: ${name}. Agent \"${agentName}\" not found in package \"${packageId}\". Available agents: ${Object.keys(pkg.agents || {}).join(', ')}`);\n }\n return await pkg.agents[agentName]();\n }\n\n // Global agent lookup\n const globalAgents = this.agents();\n const loader = globalAgents[name];\n if (!loader) {\n throw new Error(`Agent not found: ${name}`);\n }\n return await loader();\n }\n\n /**\n * List available agent names.\n */\n getAgentNames(): string[] {\n return Object.keys(this.agents());\n }\n\n // ============================================================\n // Provider Methods\n // ============================================================\n\n /**\n * Get a provider's credentials.\n */\n async getProvider(name: string): Promise<Provider | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n name: string;\n sdk: string;\n api_key: string;\n }>(`SELECT name, sdk, api_key FROM providers WHERE name = ?`, name);\n\n const rows = cursor.toArray();\n return rows.length > 0 ? rows[0] : null;\n }\n\n /**\n * Set a provider's credentials.\n */\n async setProvider(provider: Provider): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `INSERT OR REPLACE INTO providers (name, sdk, api_key) VALUES (?, ?, ?)`,\n provider.name,\n provider.sdk,\n provider.api_key\n );\n }\n\n /**\n * List all providers.\n */\n async listProviders(): Promise<Provider[]> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n name: string;\n sdk: string;\n api_key: string;\n }>(`SELECT name, sdk, api_key FROM providers`);\n\n return cursor.toArray();\n }\n\n /**\n * Delete a provider.\n */\n async deleteProvider(name: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(`DELETE FROM providers WHERE name = ?`, name);\n return true;\n }\n\n // ============================================================\n // User Authentication Methods\n // ============================================================\n\n /**\n * Get a user by username.\n */\n async getUserByUsername(username: string): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n password_hash: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(\n `SELECT id, username, password_hash, role, created_at, updated_at\n FROM users WHERE username = ?`,\n username\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id,\n username: row.username,\n password_hash: row.password_hash,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n /**\n * Get a user by ID.\n */\n async getUserById(id: string): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n password_hash: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(\n `SELECT id, username, password_hash, role, created_at, updated_at\n FROM users WHERE id = ?`,\n id\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id,\n username: row.username,\n password_hash: row.password_hash,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n }\n\n /**\n * Create a new user.\n */\n async createUser(params: {\n username: string;\n password_hash: string;\n role?: 'admin';\n }): Promise<User> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO users (id, username, password_hash, role, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n id,\n params.username,\n params.password_hash,\n params.role || 'admin',\n now,\n now\n );\n\n return {\n id,\n username: params.username,\n password_hash: params.password_hash,\n role: params.role || 'admin',\n created_at: now,\n updated_at: now,\n };\n }\n\n /**\n * Check if any users exist (for first-time setup).\n */\n async hasUsers(): Promise<boolean> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM users`\n );\n\n return cursor.one().count > 0;\n }\n\n /**\n * List all users (excludes password hash).\n */\n async listUsers(): Promise<\n Array<{\n id: string;\n username: string;\n role: 'admin';\n created_at: number;\n updated_at: number;\n }>\n > {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n username: string;\n role: string;\n created_at: number;\n updated_at: number;\n }>(`SELECT id, username, role, created_at, updated_at FROM users ORDER BY created_at DESC`);\n\n return cursor.toArray().map((row) => ({\n id: row.id,\n username: row.username,\n role: row.role as 'admin',\n created_at: row.created_at,\n updated_at: row.updated_at,\n }));\n }\n\n /**\n * Update a user.\n */\n async updateUser(\n id: string,\n params: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n }\n ): Promise<User | null> {\n await this.ensureMigrated();\n\n // Check user exists\n const existing = await this.getUserById(id);\n if (!existing) return null;\n\n const now = Math.floor(Date.now() / 1000);\n const updates: string[] = [];\n const values: any[] = [];\n\n if (params.username !== undefined) {\n updates.push('username = ?');\n values.push(params.username);\n }\n if (params.password_hash !== undefined) {\n updates.push('password_hash = ?');\n values.push(params.password_hash);\n }\n if (params.role !== undefined) {\n updates.push('role = ?');\n values.push(params.role);\n }\n\n if (updates.length === 0) {\n return existing;\n }\n\n updates.push('updated_at = ?');\n values.push(now);\n values.push(id);\n\n await this.ctx.storage.sql.exec(\n `UPDATE users SET ${updates.join(', ')} WHERE id = ?`,\n ...values\n );\n\n return this.getUserById(id);\n }\n\n /**\n * Delete a user.\n */\n async deleteUser(id: string): Promise<boolean> {\n await this.ensureMigrated();\n\n // First delete any sessions for this user\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE user_id = ?`,\n id\n );\n\n // Then delete any API keys for this user\n await this.ctx.storage.sql.exec(\n `DELETE FROM api_keys WHERE user_id = ?`,\n id\n );\n\n // Finally delete the user\n await this.ctx.storage.sql.exec(`DELETE FROM users WHERE id = ?`, id);\n return true;\n }\n\n // ============================================================\n // Session Methods\n // ============================================================\n\n /**\n * Create a new session.\n */\n async createSession(params: {\n user_id: string;\n token_hash: string;\n expires_at: number;\n }): Promise<string> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO sessions (id, user_id, token_hash, expires_at, created_at)\n VALUES (?, ?, ?, ?, ?)`,\n id,\n params.user_id,\n params.token_hash,\n params.expires_at,\n now\n );\n\n return id;\n }\n\n /**\n * Validate a session token.\n */\n async validateSession(\n tokenHash: string\n ): Promise<{ user_id: string; expires_at: number } | null> {\n await this.ensureMigrated();\n\n const now = Math.floor(Date.now() / 1000);\n\n const cursor = await this.ctx.storage.sql.exec<{\n user_id: string;\n expires_at: number;\n }>(\n `SELECT user_id, expires_at FROM sessions\n WHERE token_hash = ? AND expires_at > ?`,\n tokenHash,\n now\n );\n\n const rows = cursor.toArray();\n return rows.length > 0 ? rows[0] : null;\n }\n\n /**\n * Delete expired sessions.\n */\n async cleanupSessions(): Promise<number> {\n await this.ensureMigrated();\n\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE expires_at <= ?`,\n now\n );\n\n return 0; // SQLite in DO doesn't return affected rows easily\n }\n\n /**\n * Delete a session.\n */\n async deleteSession(tokenHash: string): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `DELETE FROM sessions WHERE token_hash = ?`,\n tokenHash\n );\n }\n\n // ============================================================\n // API Key Methods\n // ============================================================\n\n /**\n * Create an API key.\n */\n async createApiKey(params: {\n name: string;\n key_hash: string;\n key_prefix: string;\n last_five: string;\n user_id: string;\n }): Promise<string> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO api_keys (id, name, key_hash, key_prefix, last_five, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n id,\n params.name,\n params.key_hash,\n params.key_prefix,\n params.last_five,\n params.user_id,\n now\n );\n\n return id;\n }\n\n /**\n * Validate an API key.\n */\n async validateApiKey(keyHash: string): Promise<{ user_id: string; id: string } | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n user_id: string;\n }>(`SELECT id, user_id FROM api_keys WHERE key_hash = ?`, keyHash);\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n // Update last_used_at\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `UPDATE api_keys SET last_used_at = ? WHERE key_hash = ?`,\n now,\n keyHash\n );\n\n return rows[0];\n }\n\n /**\n * List API keys for a user.\n */\n async listApiKeys(\n userId: string\n ): Promise<\n Array<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>\n > {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n id: string;\n name: string;\n key_prefix: string;\n last_five: string;\n created_at: number;\n last_used_at: number | null;\n }>(\n `SELECT id, name, key_prefix, last_five, created_at, last_used_at\n FROM api_keys WHERE user_id = ? ORDER BY created_at DESC`,\n userId\n );\n\n return cursor.toArray();\n }\n\n /**\n * Delete an API key.\n */\n async deleteApiKey(id: string, userId: string): Promise<boolean> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `DELETE FROM api_keys WHERE id = ? AND user_id = ?`,\n id,\n userId\n );\n return true;\n }\n\n // ============================================================\n // OAuth Methods\n // ============================================================\n\n /**\n * Link an OAuth account to a user.\n */\n async linkOAuthAccount(params: {\n user_id: string;\n provider: 'github' | 'google';\n provider_user_id: string;\n provider_username?: string;\n }): Promise<void> {\n await this.ensureMigrated();\n\n const id = crypto.randomUUID();\n const now = Math.floor(Date.now() / 1000);\n\n await this.ctx.storage.sql.exec(\n `INSERT INTO oauth_accounts (id, user_id, provider, provider_user_id, provider_username, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n id,\n params.user_id,\n params.provider,\n params.provider_user_id,\n params.provider_username || null,\n now\n );\n }\n\n /**\n * Find user by OAuth account.\n */\n async findUserByOAuth(\n provider: 'github' | 'google',\n providerUserId: string\n ): Promise<User | null> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{ user_id: string }>(\n `SELECT user_id FROM oauth_accounts WHERE provider = ? AND provider_user_id = ?`,\n provider,\n providerUserId\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return null;\n }\n\n return this.getUserById(rows[0].user_id);\n }\n\n // ============================================================\n // Edit Lock Methods\n // ============================================================\n\n /**\n * Acquire edit lock for coordinated edits.\n */\n async acquireEditLock(params: {\n locked_by: string;\n lock_reason: string;\n }): Promise<boolean> {\n await this.ensureMigrated();\n\n // Check if already locked\n const cursor = await this.ctx.storage.sql.exec<{\n locked_by: string | null;\n locked_at: number | null;\n }>(`SELECT locked_by, locked_at FROM edit_lock WHERE id = 'singleton'`);\n\n const row = cursor.one();\n if (row.locked_by) {\n return false; // Already locked\n }\n\n const now = Math.floor(Date.now() / 1000);\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET locked_by = ?, locked_at = ?, lock_reason = ? WHERE id = 'singleton'`,\n params.locked_by,\n now,\n params.lock_reason\n );\n\n return true;\n }\n\n /**\n * Release edit lock.\n */\n async releaseEditLock(lockedBy: string): Promise<boolean> {\n await this.ensureMigrated();\n\n // Only release if we hold the lock\n const cursor = await this.ctx.storage.sql.exec<{ locked_by: string | null }>(\n `SELECT locked_by FROM edit_lock WHERE id = 'singleton'`\n );\n\n const row = cursor.one();\n if (row.locked_by !== lockedBy) {\n return false;\n }\n\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET locked_by = NULL, locked_at = NULL, lock_reason = NULL, pending_changes = NULL WHERE id = 'singleton'`\n );\n\n return true;\n }\n\n /**\n * Get current lock state.\n */\n async getEditLockState(): Promise<{\n locked: boolean;\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }> {\n await this.ensureMigrated();\n\n const cursor = await this.ctx.storage.sql.exec<{\n locked_by: string | null;\n locked_at: number | null;\n lock_reason: string | null;\n pending_changes: string | null;\n }>(\n `SELECT locked_by, locked_at, lock_reason, pending_changes FROM edit_lock WHERE id = 'singleton'`\n );\n\n const row = cursor.one();\n return {\n locked: !!row.locked_by,\n locked_by: row.locked_by,\n locked_at: row.locked_at,\n lock_reason: row.lock_reason,\n pending_changes: row.pending_changes,\n };\n }\n\n /**\n * Store pending changes for commit.\n */\n async setPendingChanges(changes: string): Promise<void> {\n await this.ensureMigrated();\n\n await this.ctx.storage.sql.exec(\n `UPDATE edit_lock SET pending_changes = ? WHERE id = 'singleton'`,\n changes\n );\n }\n\n // ============================================================\n // Utility Methods\n // ============================================================\n\n /**\n * Get the Durable Object stub for a thread.\n */\n getThreadStub(threadId: string): DurableObjectStub {\n const doId = this.env.AGENT_BUILDER_THREAD.idFromName(threadId);\n return this.env.AGENT_BUILDER_THREAD.get(doId);\n }\n\n // ============================================================\n // WebSocket Methods\n // ============================================================\n\n /**\n * Handle fetch requests - used for WebSocket upgrades\n */\n async fetch(request: Request): Promise<Response> {\n await this.ensureMigrated();\n\n // Handle WebSocket upgrade\n const upgradeHeader = request.headers.get('Upgrade');\n if (upgradeHeader?.toLowerCase() === 'websocket') {\n return this.handleEventsWebSocketUpgrade(request);\n }\n\n return new Response('Use RPC methods instead of fetch', { status: 400 });\n }\n\n /**\n * Handle WebSocket upgrade for events channel\n * Uses Hibernation API to reduce costs during inactivity\n */\n private async handleEventsWebSocketUpgrade(\n request: Request\n ): Promise<Response> {\n const pair = new WebSocketPair();\n const [client, server] = Object.values(pair);\n\n // Use Hibernation API - this allows the Durable Object to hibernate\n // while keeping WebSocket connections alive\n this.ctx.acceptWebSocket(server);\n\n // Tag this socket so we can restore it after hibernation\n // The channel field allows for future expansion to other channels\n server.serializeAttachment({ channel: 'events' });\n\n // Track this socket for broadcasting events\n this.eventSockets.add(server);\n\n return new Response(null, {\n status: 101,\n webSocket: client,\n });\n }\n\n /**\n * Broadcast an event to all connected WebSocket clients\n */\n private broadcastEvent(event: AgentBuilderEvent): void {\n const payload = JSON.stringify(event);\n for (const ws of Array.from(this.eventSockets)) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(payload);\n } else {\n this.eventSockets.delete(ws);\n }\n } catch (err) {\n this.eventSockets.delete(ws);\n }\n }\n }\n\n /**\n * WebSocket Hibernation API handler for incoming messages\n * Called when a message is received on a hibernated WebSocket\n */\n async webSocketMessage(\n ws: WebSocket,\n message: string | ArrayBuffer\n ): Promise<void> {\n try {\n // Handle ping/pong for connection health checks\n if (typeof message === 'string' && message === 'ping') {\n ws.send('pong');\n return;\n }\n } catch (error) {\n console.error('[DurableAgentBuilder] Error handling WebSocket message:', error);\n }\n }\n\n /**\n * WebSocket Hibernation API handler for connection close\n * Called when a WebSocket connection is closed\n */\n async webSocketClose(\n ws: WebSocket,\n code: number,\n reason: string,\n wasClean: boolean\n ): Promise<void> {\n const attachment = ws.deserializeAttachment();\n\n // Remove from tracking sets\n if (attachment?.channel === 'events') {\n this.eventSockets.delete(ws);\n }\n\n // Close the WebSocket\n ws.close(code, reason);\n }\n\n /**\n * WebSocket Hibernation API handler for errors\n * Called when a WebSocket encounters an error\n */\n async webSocketError(ws: WebSocket, error: unknown): Promise<void> {\n const attachment = ws.deserializeAttachment();\n console.error(\n `[DurableAgentBuilder] WebSocket error (channel: ${attachment?.channel}):`,\n error\n );\n\n // Remove from tracking sets\n if (attachment?.channel === 'events') {\n this.eventSockets.delete(ws);\n }\n }\n}\n","import { WorkerEntrypoint } from \"cloudflare:workers\";\nimport type { ThreadEnv } from \"../router/index.js\";\n\nexport interface CodeExecutionBridgeProps {\n threadId?: string;\n runId?: string;\n}\n\ninterface CodeExecutionBridgeThread {\n callCodeExecutionBridge(\n runId: string,\n functionId: string,\n encodedArgs: unknown[],\n ): Promise<unknown>;\n}\n\nexport class CodeExecutionBridge extends WorkerEntrypoint<ThreadEnv, CodeExecutionBridgeProps> {\n async call(\n threadId: string,\n runId: string,\n functionId: string,\n encodedArgs: unknown[],\n ): Promise<unknown> {\n if (!threadId || !runId) {\n throw new Error(\"Code execution bridge requires threadId and runId\");\n }\n const durableId = this.env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const thread = this.env.AGENT_BUILDER_THREAD.get(durableId) as unknown as CodeExecutionBridgeThread;\n return thread.callCodeExecutionBridge(runId, functionId, encodedArgs);\n }\n}\n","/**\n * AgentBuilder Worker runtime exports.\n *\n * This entry is selected by the package export map for workerd. Keep it free of\n * Vite plugins, type generation, and Node-only packing services.\n */\n\nimport './sdk/types';\n\nexport { defineController, createThreadEndpointHandler } from './router/index';\nexport type {\n Controller,\n ControllerContext,\n ThreadEndpointContext,\n ThreadEnv,\n BuilderThreadEndpointHandler,\n} from './router/index';\n\nexport { authenticate, requireAuth, requireAdmin } from './middleware/auth';\nexport type { AuthUser, AuthContext } from './middleware/auth';\n\nexport { defineTool } from './tools/index';\nexport type {\n Tool,\n ToolArgs,\n ToolArgsNode,\n ToolArgsRawShape,\n ToolContent,\n TextContent,\n ImageContent,\n} from './tools/index';\n\nexport { defineHook } from './agents/defineHook';\nexport type { HookSignatures } from './agents/defineHook';\n\nexport { DurableThread } from './durable-objects/DurableThread';\nexport { DurableAgentBuilder } from './durable-objects/DurableAgentBuilder';\nexport { CodeExecutionBridge } from './durable-objects/CodeExecutionBridge';\nexport type {\n AgentBuilderEnv,\n ThreadRegistryEntry,\n UpdateThreadParams,\n User,\n Provider,\n} from './durable-objects/DurableAgentBuilder';\n\nexport { defineModel } from './sdk/defineModel';\nexport type {\n ModelDefinition,\n ModelProvider,\n ModelCapabilities,\n} from './sdk/defineModel';\n\nexport { definePrompt } from './sdk/definePrompt';\nexport type {\n PromptDefinition,\n PromptInput,\n SubpromptConfig,\n PromptToolConfig,\n SubagentToolConfig,\n ToolConfig,\n ReasoningConfig,\n PromptContent,\n StructuredPrompt,\n PromptPart,\n PromptTextPart,\n PromptIncludePart,\n} from './sdk/definePrompt';\n\nexport { defineAgent } from './sdk/defineAgent';\nexport type {\n AgentDefinition,\n AgentType,\n SessionToolConfig,\n SessionToolBinding,\n SideConfig,\n} from './sdk/defineAgent';\n\nexport type {\n Agent,\n Message,\n FlowState,\n ThreadInstance,\n ThreadMetadata,\n ToolCall,\n ToolResult,\n LLMResponse,\n RequestContext,\n FlowResult,\n TelemetryEvent,\n Env,\n StorageBackend,\n FileRecord,\n ImageMetadata,\n AttachmentRef,\n GrepResult,\n FileStats,\n TextContentPart,\n ImageContentPart,\n MultimodalContent,\n MessageContent,\n} from './agents/types';\n\nexport {\n queueTool,\n injectMessage,\n getMessages,\n reloadHistory,\n emitThreadEvent,\n forceTurn,\n updateThread,\n writeFile,\n writeImage,\n linkFile,\n readFile,\n stat,\n exists,\n unlink,\n mkdir,\n readdir,\n rmdir,\n getFileStats,\n getThumbnail,\n cat,\n head,\n tail,\n grep,\n find,\n} from './agents/utilities';\nexport type { InjectMessageOptions } from './agents/utilities';\n\nexport { FlowStateSdk, enhanceFlowState } from './agents/FlowStateSdk';\nexport type {\n BroadcastOptions,\n FlowStateWithSdk,\n} from './agents/FlowStateSdk';\n\nexport {\n hasImageAttachments,\n getUnsummarizedImageAttachments,\n getMessagesToSummarize,\n buildImageDescription,\n replaceImagesWithDescriptions,\n optimizeImageContext,\n generateImageDescription,\n} from './agents/context';\nexport type { ImageContextConfig } from './agents/context';\n\nexport { ProviderRegistry } from './agents/providers/ProviderRegistry';\nexport { ProviderError, mapReasoningLevel } from './agents/providers/types';\nexport type {\n Provider as LLMProviderInterface,\n ProviderFactory,\n ProviderFactoryConfig,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ProviderMessage,\n ProviderSystemMessage,\n ProviderUserMessage,\n ProviderAssistantMessage,\n ProviderToolMessage,\n ProviderMessageContent,\n ProviderContentPart,\n ProviderTextPart,\n ProviderImagePart,\n ProviderFilePart,\n ProviderTool,\n ProviderToolCallPart,\n ProviderToolResultContent,\n ProviderFinishReason,\n ProviderUsage,\n ProviderGeneratedImage,\n ProviderReasoningDetail,\n ProviderErrorCode,\n ModelCapabilities as ProviderModelCapabilities,\n} from './agents/providers/types';\n\nexport {\n parseQualifiedName,\n qualifyName,\n getShortName,\n resolveTool,\n resolvePrompt,\n resolveModel,\n resolveAgent,\n resolveHook,\n getVisibleToolNames,\n getVisibleAgentNames,\n getVisiblePromptNames,\n getVisibleModelNames,\n createNamespaceContext,\n isQualifiedName,\n NamespaceResolutionError,\n} from './packing/resolver';\nexport { isPacked, belongsToPackage, isVisibleInNamespace } from '@standardagents/spec';\nexport type {\n NamespacedRegistry,\n PackageSignature,\n NamespaceContext,\n GlobalNamespaceContext,\n PackedNamespaceContext,\n PackedMetadata,\n PackedMeta,\n PackedExports,\n DefinitionLoader,\n} from './packing/types';\n","import type { FlowState, Message, ToolCall } from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Options for injecting a message\n */\nexport interface InjectMessageOptions {\n /** The message content */\n content: string;\n /** The message role */\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n /** Optional message ID. If not provided, a UUID will be generated */\n id?: string;\n /** Optional message to insert before. If not provided, message is appended to the end */\n beforeMessageId?: string;\n /** Optional tool call ID (for role=\"tool\" only) */\n toolCallId?: string;\n /** Optional name field */\n name?: string;\n /** Whether this message is silent (hidden from LLM, visible in UI only). Default: false */\n silent?: boolean;\n /** Force message to be top-level (depth 0) even when called from sub-prompts. Default: false */\n forceTopLevel?: boolean;\n /** Force a specific side to play the next turn after injecting the message */\n forceTurn?: \"side_a\" | \"side_b\";\n}\n\n/**\n * Options for broadcasting custom data\n */\nexport interface BroadcastOptions {\n /** The type of the broadcast message */\n type: string;\n /** The value/payload of the broadcast message */\n value: unknown;\n}\n\n/**\n * FlowState SDK - Utility methods for working with FlowState\n *\n * These methods extend the FlowState object with helpful utilities for:\n * - Queuing tool calls\n * - Injecting messages\n * - Retrieving message history\n * - Broadcasting custom data via WebSocket\n */\nexport class FlowStateSdk {\n /**\n * Queue a new tool call to be executed in the current flow\n *\n * This adds a tool call to the execution queue without immediately executing it.\n * The tool will be executed as part of the normal flow processing.\n *\n * @param flow - The current FlowState\n * @param toolName - The name of the tool to call (autocompletes from available tools)\n * @param args - The arguments to pass to the tool\n *\n * @example\n * ```typescript\n * FlowStateSdk.queueTool(flow, \"search_user\", { email: \"user@example.com\" });\n * ```\n */\n static queueTool(\n flow: FlowState,\n toolName: StandardAgentSpec.Callables,\n args: Record<string, unknown> = {}\n ): void {\n const toolCall: ToolCall = {\n id: crypto.randomUUID(),\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n forceAllow: true,\n queued_at: Date.now() * 1000 // Microseconds to match other timestamps\n };\n\n flow.sequence.queue.push(toolCall);\n flow.sequence.queuedTools.push(toolCall);\n }\n\n /**\n * Inject a message into the thread without triggering execution\n *\n * This allows you to add messages to the conversation history programmatically.\n * The message is persisted to storage but does not cause the agent to execute.\n *\n * By default, messages are appended to the end of the conversation.\n * You can optionally insert a message before another message by providing beforeMessageId.\n *\n * @param flow - The current FlowState\n * @param options - Message options\n *\n * @example\n * ```typescript\n * // Append a system message\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"system\",\n * content: \"Context has been updated\"\n * });\n *\n * // Insert a user message before a specific message\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"user\",\n * content: \"Additional context\",\n * beforeMessageId: \"msg-123\"\n * });\n *\n * // Inject a message and force a specific side to play next\n * await FlowStateSdk.injectMessage(flow, {\n * role: \"system\",\n * content: \"New instructions for the AI\",\n * forceTurn: \"side_a\" // Force side_a to respond to this message\n * });\n * ```\n */\n static async injectMessage(\n flow: FlowState,\n options: InjectMessageOptions\n ): Promise<Message> {\n const messageId = options.id ?? crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n const silent = options.silent ?? false;\n\n // Build the message object with hierarchical tracking\n // If forceTopLevel is true, inject at depth 0 regardless of current flow depth\n const forceTopLevel = options.forceTopLevel ?? false;\n const message: Message = {\n id: messageId,\n role: options.role,\n content: options.content,\n name: options.name ?? null,\n tool_call_id: options.toolCallId ?? null,\n created_at: timestamp,\n status: \"completed\",\n silent,\n parent_id: forceTopLevel ? null : (flow.parentMessageId ?? null),\n depth: forceTopLevel ? 0 : flow.depth,\n };\n\n if (options.beforeMessageId) {\n // Insert before a specific message\n // First, get the target message's timestamp\n const cursor = await flow.storage.sql.exec(\n `SELECT created_at FROM messages WHERE id = ?`,\n options.beforeMessageId\n );\n const rows = cursor.toArray();\n const targetMessage = rows[0];\n\n if (!targetMessage) {\n throw new Error(\n `Message with id ${options.beforeMessageId} not found`\n );\n }\n\n // Use a timestamp slightly before the target message\n message.created_at = (targetMessage.created_at as number) - 1;\n }\n\n // Get current prompt name from promptPath\n const currentPrompt = flow.promptPath.length > 0 ? flow.promptPath[flow.promptPath.length - 1] : null;\n\n // Insert the message with hierarchical tracking columns\n await flow.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_call_id, created_at, status, silent, parent_id, depth, prompt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n messageId,\n message.role,\n message.content,\n message.name,\n message.tool_call_id,\n message.created_at,\n message.status,\n silent ? 1 : 0,\n message.parent_id,\n message.depth,\n currentPrompt\n );\n\n // Add the message to messageHistory if it's not silent (silent messages are filtered from LLM context)\n // If it is silent, we need to reload messageHistory to ensure proper filtering\n if (!silent) {\n flow.messageHistory.push(message);\n } else {\n // Reload messageHistory to ensure silent messages are properly excluded from LLM context\n flow.messageHistory = await FlowStateSdk.reloadHistory(flow);\n }\n\n // Broadcast the message if emitMessage callback is available\n if (flow.emitMessage) {\n flow.emitMessage(message);\n }\n\n // Force a turn if requested\n if (options.forceTurn) {\n FlowStateSdk.forceTurn(flow, options.forceTurn);\n }\n\n return message;\n }\n\n /**\n * Get messages from the thread history\n *\n * Retrieves message history from the thread's SQLite storage.\n * Messages are ordered by creation time (oldest first by default).\n *\n * @param flow - The current FlowState\n * @param limit - Maximum number of messages to retrieve (default: 100)\n * @param offset - Number of messages to skip (default: 0)\n * @param order - Sort order: \"asc\" (oldest first) or \"desc\" (newest first) (default: \"asc\")\n * @returns Array of messages\n *\n * @example\n * ```typescript\n * // Get last 10 messages\n * const messages = await FlowStateSdk.getMessages(flow, 10);\n *\n * // Get 10 messages, skipping the first 20\n * const messages = await FlowStateSdk.getMessages(flow, 10, 20);\n *\n * // Get newest 10 messages\n * const messages = await FlowStateSdk.getMessages(flow, 10, 0, \"desc\");\n * ```\n */\n static async getMessages(\n flow: FlowState,\n limit: number = 100,\n offset: number = 0,\n order: \"asc\" | \"desc\" = \"asc\"\n ): Promise<Message[]> {\n const orderClause = order === \"desc\" ? \"DESC\" : \"ASC\";\n\n const cursor = await flow.storage.sql.exec(\n `SELECT\n id,\n role,\n content,\n name,\n tool_calls,\n tool_call_id,\n log_id,\n created_at,\n request_sent_at,\n response_completed_at,\n status,\n silent,\n parent_id,\n depth,\n metadata,\n subagent_id\n FROM messages\n ORDER BY created_at ${orderClause}, rowid ${orderClause}\n LIMIT ? OFFSET ?`,\n limit,\n offset\n );\n\n const messages: Message[] = [];\n for (const row of cursor) {\n let metadata: Record<string, unknown> | undefined;\n if (typeof row.metadata === \"string\") {\n try {\n const parsed = JSON.parse(row.metadata);\n if (parsed && typeof parsed === \"object\") {\n metadata = parsed as Record<string, unknown>;\n }\n } catch {\n metadata = undefined;\n }\n }\n\n messages.push({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n metadata,\n subagent_id: row.subagent_id as string | null,\n });\n }\n\n return messages;\n }\n\n /**\n * Reload message history from storage\n *\n * Re-loads the complete message history from the thread's SQLite storage,\n * applying any filter_messages hooks. This is useful when you need to refresh\n * the message history after making changes (e.g., injecting silent messages).\n *\n * @param flow - The current FlowState\n * @returns Array of messages (reloaded from storage)\n *\n * @example\n * ```typescript\n * // Reload history after injecting a silent message\n * await FlowStateSdk.injectMessage(flow, { role: \"system\", content: \"...\", silent: true });\n * flow.messageHistory = await FlowStateSdk.reloadHistory(flow);\n * ```\n */\n static async reloadHistory(state: FlowState): Promise<Message[]> {\n // Dynamic import to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n state.messageHistory = await FlowEngine.loadMessageHistory(state);\n return state.messageHistory;\n }\n\n /**\n * Broadcast custom data to WebSocket clients\n *\n * Sends a custom message to all connected WebSocket clients.\n * This allows backend code to push arbitrary data to the frontend\n * outside of the standard telemetry events.\n *\n * The message is sent with the structure: { type: string, value: unknown }\n *\n * @param flow - The current FlowState\n * @param options - Broadcast options\n *\n * @example\n * ```typescript\n * // Broadcast a progress update\n * FlowStateSdk.broadcast(flow, {\n * type: \"progress\",\n * value: { step: 3, total: 10, message: \"Processing data...\" }\n * });\n *\n * // Broadcast a custom notification\n * FlowStateSdk.broadcast(flow, {\n * type: \"notification\",\n * value: { level: \"info\", message: \"User authenticated successfully\" }\n * });\n *\n * // Broadcast metadata\n * FlowStateSdk.broadcast(flow, {\n * type: \"metadata\",\n * value: { userId: \"123\", sessionId: \"abc\", timestamp: Date.now() }\n * });\n * ```\n */\n static broadcast(flow: FlowState, options: BroadcastOptions): void {\n if (!flow.stream) {\n console.warn(\"Cannot broadcast: stream is not available\");\n return;\n }\n\n // Send custom message via WebSocket using the telemetry infrastructure\n // We send it as a special telemetry event with type \"custom\"\n const message = {\n type: \"custom\" as const,\n customType: options.type,\n value: options.value,\n timestamp: Date.now(),\n };\n\n // Use the existing WebSocket infrastructure\n const wsMessage = JSON.stringify(message);\n for (const ws of (flow.stream as any).wsConnections || []) {\n try {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(wsMessage);\n }\n } catch (error) {\n console.error(\"Error broadcasting custom message:\", error);\n }\n }\n }\n\n /**\n * Force a specific side to play the next turn\n *\n * This queues the specified side to play next without interrupting the current turn.\n * The forced turn only takes effect at the END of the current turn execution.\n *\n * If the tool queue is currently being processed (sequence.isHandling is true),\n * the forced turn is deferred until all queued tools complete. This allows patterns like:\n *\n * ```typescript\n * FlowStateSdk.queueTool(flow, 'myTool', {});\n * FlowStateSdk.forceTurn(flow, 'side_a');\n * // myTool executes first, THEN the turn switches to side_a\n * ```\n *\n * @param flow - The current FlowState\n * @param side - Which side should play next ('side_a' or 'side_b')\n *\n * @example\n * ```typescript\n * // Force current side to continue (override stop condition)\n * // If side_a is playing and would stop, this forces it to play at least 1 more turn\n * FlowStateSdk.forceTurn(flow, 'side_a');\n *\n * // Force switch to other side\n * // If side_a is playing, this forces side_b to play next turn\n * FlowStateSdk.forceTurn(flow, 'side_b');\n *\n * // Force human turn in ai_human agent (execution stops and waits for user input)\n * if (flow.agentConfig.type === 'ai_human') {\n * FlowStateSdk.forceTurn(flow, 'side_b'); // Stops execution, awaits user input\n * }\n * ```\n */\n static forceTurn(flow: FlowState, side: 'side_a' | 'side_b'): void {\n // If the tool queue is currently being processed, defer the force turn\n // until all queued tools complete. This allows queueTool + forceTurn to work together.\n if (flow.sequence.isHandling) {\n flow.pendingForceTurn = side;\n } else {\n flow.forcedNextSide = side;\n }\n }\n}\n\n/**\n * Convenience methods added to FlowState (optional - can be used via static methods above)\n *\n * These are helper methods that can be added to FlowState instances for convenience.\n * They delegate to the static methods above.\n */\nexport interface FlowStateWithSdk extends FlowState {\n queueTool: (toolName: StandardAgentSpec.Callables, args?: Record<string, unknown>) => void;\n injectMessage: (options: InjectMessageOptions) => Promise<Message>;\n getMessages: (\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\"\n ) => Promise<Message[]>;\n reloadHistory: () => Promise<Message[]>;\n broadcast: (options: BroadcastOptions) => void;\n forceTurn: (side: 'side_a' | 'side_b') => void;\n}\n\n/**\n * Enhance a FlowState object with SDK methods\n *\n * This adds convenience methods to a FlowState instance that delegate to\n * the static FlowStateSdk methods.\n *\n * @param flow - The FlowState to enhance\n * @returns The enhanced FlowState with SDK methods\n *\n * @example\n * ```typescript\n * const enhancedFlow = enhanceFlowState(flow);\n *\n * // Now you can use methods directly on the flow object\n * enhancedFlow.queueTool(\"search_user\", { email: \"user@example.com\" });\n * await enhancedFlow.injectMessage({ role: \"system\", content: \"Context updated\" });\n * const messages = await enhancedFlow.getMessages(10);\n * flow.messageHistory = await enhancedFlow.reloadHistory();\n * enhancedFlow.broadcast({ type: \"progress\", value: { step: 1 } });\n * enhancedFlow.forceTurn('side_b'); // Force side_b to play next turn\n * ```\n */\nexport function enhanceFlowState(flow: FlowState): FlowStateWithSdk {\n const enhanced = flow as FlowStateWithSdk;\n\n enhanced.queueTool = (toolName: StandardAgentSpec.Callables, args?: Record<string, unknown>) => {\n FlowStateSdk.queueTool(flow, toolName, args);\n };\n\n enhanced.injectMessage = (options: InjectMessageOptions) => {\n return FlowStateSdk.injectMessage(flow, options);\n };\n\n enhanced.getMessages = (\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\"\n ) => {\n return FlowStateSdk.getMessages(flow, limit, offset, order);\n };\n\n enhanced.reloadHistory = () => {\n return FlowStateSdk.reloadHistory(flow);\n };\n\n enhanced.broadcast = (options: BroadcastOptions) => {\n FlowStateSdk.broadcast(flow, options);\n };\n\n enhanced.forceTurn = (side: 'side_a' | 'side_b') => {\n FlowStateSdk.forceTurn(flow, side);\n };\n\n return enhanced;\n}\n"]}
|