omp-fabric 0.85.0
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/LICENSE +21 -0
- package/README.md +170 -0
- package/THIRD_PARTY_NOTICES.md +33 -0
- package/dist/activity/store.d.ts +32 -0
- package/dist/activity/store.d.ts.map +1 -0
- package/dist/activity/types.d.ts +104 -0
- package/dist/activity/types.d.ts.map +1 -0
- package/dist/actors/binding-store.d.ts +17 -0
- package/dist/actors/binding-store.d.ts.map +1 -0
- package/dist/actors/context.d.ts +13 -0
- package/dist/actors/context.d.ts.map +1 -0
- package/dist/actors/delivery-policy.d.ts +8 -0
- package/dist/actors/delivery-policy.d.ts.map +1 -0
- package/dist/actors/directory.d.ts +47 -0
- package/dist/actors/directory.d.ts.map +1 -0
- package/dist/actors/global-registry.d.ts +47 -0
- package/dist/actors/global-registry.d.ts.map +1 -0
- package/dist/actors/host-event-observer.d.ts +5 -0
- package/dist/actors/host-event-observer.d.ts.map +1 -0
- package/dist/actors/host-event-payload.d.ts +14 -0
- package/dist/actors/host-event-payload.d.ts.map +1 -0
- package/dist/actors/manager.d.ts +175 -0
- package/dist/actors/manager.d.ts.map +1 -0
- package/dist/actors/predicate.d.ts +7 -0
- package/dist/actors/predicate.d.ts.map +1 -0
- package/dist/actors/types.d.ts +211 -0
- package/dist/actors/types.d.ts.map +1 -0
- package/dist/agents/bash-worktree-add.d.ts +24 -0
- package/dist/agents/bash-worktree-add.d.ts.map +1 -0
- package/dist/agents/budget-ledger.d.ts +88 -0
- package/dist/agents/budget-ledger.d.ts.map +1 -0
- package/dist/agents/claude-cli.d.ts +32 -0
- package/dist/agents/claude-cli.d.ts.map +1 -0
- package/dist/agents/claude-cli.js +17 -0
- package/dist/agents/claude-cli.js.map +7 -0
- package/dist/agents/clone-first-worktree.d.ts +17 -0
- package/dist/agents/clone-first-worktree.d.ts.map +1 -0
- package/dist/agents/compact-control.d.ts +32 -0
- package/dist/agents/compact-control.d.ts.map +1 -0
- package/dist/agents/compact-control.js +127 -0
- package/dist/agents/compact-control.js.map +7 -0
- package/dist/agents/constants.d.ts +5 -0
- package/dist/agents/constants.d.ts.map +1 -0
- package/dist/agents/cow-clone.d.ts +8 -0
- package/dist/agents/cow-clone.d.ts.map +1 -0
- package/dist/agents/handoff.d.ts +19 -0
- package/dist/agents/handoff.d.ts.map +1 -0
- package/dist/agents/manager.d.ts +68 -0
- package/dist/agents/manager.d.ts.map +1 -0
- package/dist/agents/omp-binary.d.ts +7 -0
- package/dist/agents/omp-binary.d.ts.map +1 -0
- package/dist/agents/rm.d.ts +15 -0
- package/dist/agents/rm.d.ts.map +1 -0
- package/dist/agents/semaphore.d.ts +7 -0
- package/dist/agents/semaphore.d.ts.map +1 -0
- package/dist/agents/session-export.d.ts +9 -0
- package/dist/agents/session-export.d.ts.map +1 -0
- package/dist/agents/thinking-transfer.d.ts +39 -0
- package/dist/agents/thinking-transfer.d.ts.map +1 -0
- package/dist/agents/transports/herdr-transport.d.ts +10 -0
- package/dist/agents/transports/herdr-transport.d.ts.map +1 -0
- package/dist/agents/transports/localterm-transport.d.ts +7 -0
- package/dist/agents/transports/localterm-transport.d.ts.map +1 -0
- package/dist/agents/transports/process-transport.d.ts +7 -0
- package/dist/agents/transports/process-transport.d.ts.map +1 -0
- package/dist/agents/transports/process-utils.d.ts +29 -0
- package/dist/agents/transports/process-utils.d.ts.map +1 -0
- package/dist/agents/transports/screen-transport.d.ts +7 -0
- package/dist/agents/transports/screen-transport.d.ts.map +1 -0
- package/dist/agents/transports/tmux-transport.d.ts +7 -0
- package/dist/agents/transports/tmux-transport.d.ts.map +1 -0
- package/dist/agents/types.d.ts +251 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/veda-cli.d.ts +22 -0
- package/dist/agents/veda-cli.d.ts.map +1 -0
- package/dist/agents/veda-cli.js +13 -0
- package/dist/agents/veda-cli.js.map +7 -0
- package/dist/agents/worktree-manager.d.ts +14 -0
- package/dist/agents/worktree-manager.d.ts.map +1 -0
- package/dist/agents/worktree-paths.d.ts +5 -0
- package/dist/agents/worktree-paths.d.ts.map +1 -0
- package/dist/async-settlement.d.ts +4 -0
- package/dist/async-settlement.d.ts.map +1 -0
- package/dist/audit/details.d.ts +82 -0
- package/dist/audit/details.d.ts.map +1 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/projection.d.ts +20 -0
- package/dist/audit/projection.d.ts.map +1 -0
- package/dist/audit/trace.d.ts +95 -0
- package/dist/audit/trace.d.ts.map +1 -0
- package/dist/capture/catalog.d.ts +29 -0
- package/dist/capture/catalog.d.ts.map +1 -0
- package/dist/capture/interceptor.d.ts +21 -0
- package/dist/capture/interceptor.d.ts.map +1 -0
- package/dist/capture/wrapper.d.ts +15 -0
- package/dist/capture/wrapper.d.ts.map +1 -0
- package/dist/chunks/chunk-2GQC324T.js +5001 -0
- package/dist/chunks/chunk-2GQC324T.js.map +7 -0
- package/dist/chunks/chunk-2KEWFW56.js +1229 -0
- package/dist/chunks/chunk-2KEWFW56.js.map +7 -0
- package/dist/chunks/chunk-3J7BKUNG.js +354 -0
- package/dist/chunks/chunk-3J7BKUNG.js.map +7 -0
- package/dist/chunks/chunk-4A4MVZQW.js +253 -0
- package/dist/chunks/chunk-4A4MVZQW.js.map +7 -0
- package/dist/chunks/chunk-4HQDSTHN.js +221 -0
- package/dist/chunks/chunk-4HQDSTHN.js.map +7 -0
- package/dist/chunks/chunk-4LEDA76O.js +688 -0
- package/dist/chunks/chunk-4LEDA76O.js.map +7 -0
- package/dist/chunks/chunk-5GTPD4BA.js +1318 -0
- package/dist/chunks/chunk-5GTPD4BA.js.map +7 -0
- package/dist/chunks/chunk-5IWFSDU5.js +87 -0
- package/dist/chunks/chunk-5IWFSDU5.js.map +7 -0
- package/dist/chunks/chunk-6N4XGAZY.js +21 -0
- package/dist/chunks/chunk-6N4XGAZY.js.map +7 -0
- package/dist/chunks/chunk-6QBPSZJ5.js +647 -0
- package/dist/chunks/chunk-6QBPSZJ5.js.map +7 -0
- package/dist/chunks/chunk-6X6WUU2K.js +73 -0
- package/dist/chunks/chunk-6X6WUU2K.js.map +7 -0
- package/dist/chunks/chunk-7363CD5A.js +38 -0
- package/dist/chunks/chunk-7363CD5A.js.map +7 -0
- package/dist/chunks/chunk-77FQHHZD.js +231 -0
- package/dist/chunks/chunk-77FQHHZD.js.map +7 -0
- package/dist/chunks/chunk-7BIA5BJN.js +112 -0
- package/dist/chunks/chunk-7BIA5BJN.js.map +7 -0
- package/dist/chunks/chunk-7BOAOKWH.js +64 -0
- package/dist/chunks/chunk-7BOAOKWH.js.map +7 -0
- package/dist/chunks/chunk-7TB7NXSL.js +58 -0
- package/dist/chunks/chunk-7TB7NXSL.js.map +7 -0
- package/dist/chunks/chunk-7VIQNUPS.js +17 -0
- package/dist/chunks/chunk-7VIQNUPS.js.map +7 -0
- package/dist/chunks/chunk-CT2AJ2UI.js +225 -0
- package/dist/chunks/chunk-CT2AJ2UI.js.map +7 -0
- package/dist/chunks/chunk-DLXPTBPL.js +151 -0
- package/dist/chunks/chunk-DLXPTBPL.js.map +7 -0
- package/dist/chunks/chunk-ED3BRM6P.js +17 -0
- package/dist/chunks/chunk-ED3BRM6P.js.map +7 -0
- package/dist/chunks/chunk-G2IBGGBM.js +42 -0
- package/dist/chunks/chunk-G2IBGGBM.js.map +7 -0
- package/dist/chunks/chunk-GKOFZ76R.js +1596 -0
- package/dist/chunks/chunk-GKOFZ76R.js.map +7 -0
- package/dist/chunks/chunk-HDJBUXDX.js +1102 -0
- package/dist/chunks/chunk-HDJBUXDX.js.map +7 -0
- package/dist/chunks/chunk-IGVDD2HT.js +10 -0
- package/dist/chunks/chunk-IGVDD2HT.js.map +7 -0
- package/dist/chunks/chunk-JHKOG5GS.js +187 -0
- package/dist/chunks/chunk-JHKOG5GS.js.map +7 -0
- package/dist/chunks/chunk-JP4LIZFT.js +1334 -0
- package/dist/chunks/chunk-JP4LIZFT.js.map +7 -0
- package/dist/chunks/chunk-JSBTB3P6.js +127 -0
- package/dist/chunks/chunk-JSBTB3P6.js.map +7 -0
- package/dist/chunks/chunk-KAD7UWT2.js +99 -0
- package/dist/chunks/chunk-KAD7UWT2.js.map +7 -0
- package/dist/chunks/chunk-KIH3KLZU.js +95 -0
- package/dist/chunks/chunk-KIH3KLZU.js.map +7 -0
- package/dist/chunks/chunk-KIREBD2V.js +2208 -0
- package/dist/chunks/chunk-KIREBD2V.js.map +7 -0
- package/dist/chunks/chunk-LMAVZN7J.js +8 -0
- package/dist/chunks/chunk-LMAVZN7J.js.map +7 -0
- package/dist/chunks/chunk-NCPJZXLM.js +57 -0
- package/dist/chunks/chunk-NCPJZXLM.js.map +7 -0
- package/dist/chunks/chunk-OJZNMROB.js +195 -0
- package/dist/chunks/chunk-OJZNMROB.js.map +7 -0
- package/dist/chunks/chunk-OPTP4PSE.js +469 -0
- package/dist/chunks/chunk-OPTP4PSE.js.map +7 -0
- package/dist/chunks/chunk-QPXSCMTG.js +24 -0
- package/dist/chunks/chunk-QPXSCMTG.js.map +7 -0
- package/dist/chunks/chunk-ROKMBLGN.js +1265 -0
- package/dist/chunks/chunk-ROKMBLGN.js.map +7 -0
- package/dist/chunks/chunk-SXMWV447.js +2445 -0
- package/dist/chunks/chunk-SXMWV447.js.map +7 -0
- package/dist/chunks/chunk-T5ZA5YRU.js +786 -0
- package/dist/chunks/chunk-T5ZA5YRU.js.map +7 -0
- package/dist/chunks/chunk-T6OAX4FO.js +1835 -0
- package/dist/chunks/chunk-T6OAX4FO.js.map +7 -0
- package/dist/chunks/chunk-U5FYOMG5.js +119 -0
- package/dist/chunks/chunk-U5FYOMG5.js.map +7 -0
- package/dist/chunks/chunk-UOSJZXJV.js +142 -0
- package/dist/chunks/chunk-UOSJZXJV.js.map +7 -0
- package/dist/chunks/chunk-UPCARIJP.js +6627 -0
- package/dist/chunks/chunk-UPCARIJP.js.map +7 -0
- package/dist/chunks/chunk-VPPIJRNZ.js +50 -0
- package/dist/chunks/chunk-VPPIJRNZ.js.map +7 -0
- package/dist/chunks/chunk-XU5Z4JCQ.js +297 -0
- package/dist/chunks/chunk-XU5Z4JCQ.js.map +7 -0
- package/dist/chunks/chunk-YWEXP724.js +427 -0
- package/dist/chunks/chunk-YWEXP724.js.map +7 -0
- package/dist/chunks/chunk-YZZIKJX6.js +60 -0
- package/dist/chunks/chunk-YZZIKJX6.js.map +7 -0
- package/dist/chunks/chunk-ZNAJDPT7.js +2203 -0
- package/dist/chunks/chunk-ZNAJDPT7.js.map +7 -0
- package/dist/chunks/chunk-ZTM45GH5.js +163 -0
- package/dist/chunks/chunk-ZTM45GH5.js.map +7 -0
- package/dist/commands/fabric.d.ts +17 -0
- package/dist/commands/fabric.d.ts.map +1 -0
- package/dist/compaction/bounds.d.ts +23 -0
- package/dist/compaction/bounds.d.ts.map +1 -0
- package/dist/compaction/branch-details.d.ts +83 -0
- package/dist/compaction/branch-details.d.ts.map +1 -0
- package/dist/compaction/branch-summary.d.ts +9 -0
- package/dist/compaction/branch-summary.d.ts.map +1 -0
- package/dist/compaction/enrichers.d.ts +10 -0
- package/dist/compaction/enrichers.d.ts.map +1 -0
- package/dist/compaction/hook.d.ts +98 -0
- package/dist/compaction/hook.d.ts.map +1 -0
- package/dist/compaction/hook.js +19 -0
- package/dist/compaction/hook.js.map +7 -0
- package/dist/compaction/instructions.d.ts +38 -0
- package/dist/compaction/instructions.d.ts.map +1 -0
- package/dist/compaction/normalize.d.ts +83 -0
- package/dist/compaction/normalize.d.ts.map +1 -0
- package/dist/compaction/projections.d.ts +31 -0
- package/dist/compaction/projections.d.ts.map +1 -0
- package/dist/compaction/qa.d.ts +27 -0
- package/dist/compaction/qa.d.ts.map +1 -0
- package/dist/compaction/render.d.ts +10 -0
- package/dist/compaction/render.d.ts.map +1 -0
- package/dist/compaction/threshold.d.ts +5 -0
- package/dist/compaction/threshold.d.ts.map +1 -0
- package/dist/compaction/trace-events.d.ts +23 -0
- package/dist/compaction/trace-events.d.ts.map +1 -0
- package/dist/components/catalog.d.ts +25 -0
- package/dist/components/catalog.d.ts.map +1 -0
- package/dist/components/effect-scope.d.ts +31 -0
- package/dist/components/effect-scope.d.ts.map +1 -0
- package/dist/components/loader.d.ts +27 -0
- package/dist/components/loader.d.ts.map +1 -0
- package/dist/components/model-guidance.d.ts +48 -0
- package/dist/components/model-guidance.d.ts.map +1 -0
- package/dist/components/provider-component.d.ts +31 -0
- package/dist/components/provider-component.d.ts.map +1 -0
- package/dist/components/supervisor.d.ts +29 -0
- package/dist/components/supervisor.d.ts.map +1 -0
- package/dist/components/types.d.ts +140 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/config-migrations.d.ts +11 -0
- package/dist/config-migrations.d.ts.map +1 -0
- package/dist/config.d.ts +269 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/core/action-registry.d.ts +159 -0
- package/dist/core/action-registry.d.ts.map +1 -0
- package/dist/core/action-registry.js +17 -0
- package/dist/core/action-registry.js.map +7 -0
- package/dist/core/action-repair.d.ts +20 -0
- package/dist/core/action-repair.d.ts.map +1 -0
- package/dist/core/agent-dir.d.ts +2 -0
- package/dist/core/agent-dir.d.ts.map +1 -0
- package/dist/core/approval-controller.d.ts +30 -0
- package/dist/core/approval-controller.d.ts.map +1 -0
- package/dist/core/atomic-write.d.ts +15 -0
- package/dist/core/atomic-write.d.ts.map +1 -0
- package/dist/core/auto-approval-classifier.d.ts +13 -0
- package/dist/core/auto-approval-classifier.d.ts.map +1 -0
- package/dist/core/call-preview.d.ts +8 -0
- package/dist/core/call-preview.d.ts.map +1 -0
- package/dist/core/child-tool-allowlist.d.ts +3 -0
- package/dist/core/child-tool-allowlist.d.ts.map +1 -0
- package/dist/core/compact-controller.d.ts +42 -0
- package/dist/core/compact-controller.d.ts.map +1 -0
- package/dist/core/core-override-guidance.d.ts +7 -0
- package/dist/core/core-override-guidance.d.ts.map +1 -0
- package/dist/core/direct-tool-approval.d.ts +19 -0
- package/dist/core/direct-tool-approval.d.ts.map +1 -0
- package/dist/core/effect-conflict.d.ts +3 -0
- package/dist/core/effect-conflict.d.ts.map +1 -0
- package/dist/core/file-lock.d.ts +12 -0
- package/dist/core/file-lock.d.ts.map +1 -0
- package/dist/core/model-resolution.d.ts +62 -0
- package/dist/core/model-resolution.d.ts.map +1 -0
- package/dist/core/model-usage.d.ts +8 -0
- package/dist/core/model-usage.d.ts.map +1 -0
- package/dist/core/omp-bash-error.d.ts +11 -0
- package/dist/core/omp-bash-error.d.ts.map +1 -0
- package/dist/core/omp-tools.d.ts +9 -0
- package/dist/core/omp-tools.d.ts.map +1 -0
- package/dist/core/provider-bindings.d.ts +47 -0
- package/dist/core/provider-bindings.d.ts.map +1 -0
- package/dist/core/proxy-contract.d.ts +18 -0
- package/dist/core/proxy-contract.d.ts.map +1 -0
- package/dist/core/session-context.d.ts +6 -0
- package/dist/core/session-context.d.ts.map +1 -0
- package/dist/core/skill-block.d.ts +10 -0
- package/dist/core/skill-block.d.ts.map +1 -0
- package/dist/core/skill-dir.d.ts +4 -0
- package/dist/core/skill-dir.d.ts.map +1 -0
- package/dist/core/skill-prompt.d.ts +3 -0
- package/dist/core/skill-prompt.d.ts.map +1 -0
- package/dist/core/skill-references.d.ts +7 -0
- package/dist/core/skill-references.d.ts.map +1 -0
- package/dist/core/stable-hash.d.ts +3 -0
- package/dist/core/stable-hash.d.ts.map +1 -0
- package/dist/core/system-guidance.d.ts +12 -0
- package/dist/core/system-guidance.d.ts.map +1 -0
- package/dist/core/token-math.d.ts +16 -0
- package/dist/core/token-math.d.ts.map +1 -0
- package/dist/core/tool-ownership.d.ts +52 -0
- package/dist/core/tool-ownership.d.ts.map +1 -0
- package/dist/core/tool-result-proxy.d.ts +18 -0
- package/dist/core/tool-result-proxy.d.ts.map +1 -0
- package/dist/entropy/active.d.ts +7 -0
- package/dist/entropy/active.d.ts.map +1 -0
- package/dist/entropy/compiled-store.d.ts +16 -0
- package/dist/entropy/compiled-store.d.ts.map +1 -0
- package/dist/entropy/compiled-surface.d.ts +51 -0
- package/dist/entropy/compiled-surface.d.ts.map +1 -0
- package/dist/entropy/compiler.d.ts +28 -0
- package/dist/entropy/compiler.d.ts.map +1 -0
- package/dist/entropy/corpus.d.ts +22 -0
- package/dist/entropy/corpus.d.ts.map +1 -0
- package/dist/entropy/fingerprint.d.ts +9 -0
- package/dist/entropy/fingerprint.d.ts.map +1 -0
- package/dist/entropy/index.d.ts +15 -0
- package/dist/entropy/index.d.ts.map +1 -0
- package/dist/entropy/index.js +172 -0
- package/dist/entropy/index.js.map +7 -0
- package/dist/entropy/meter.d.ts +10 -0
- package/dist/entropy/meter.d.ts.map +1 -0
- package/dist/entropy/passes.d.ts +13 -0
- package/dist/entropy/passes.d.ts.map +1 -0
- package/dist/entropy/pool-store.d.ts +15 -0
- package/dist/entropy/pool-store.d.ts.map +1 -0
- package/dist/entropy/pool.d.ts +41 -0
- package/dist/entropy/pool.d.ts.map +1 -0
- package/dist/entropy/presentation.d.ts +13 -0
- package/dist/entropy/presentation.d.ts.map +1 -0
- package/dist/entropy/sessions.d.ts +47 -0
- package/dist/entropy/sessions.d.ts.map +1 -0
- package/dist/entropy/surface.d.ts +30 -0
- package/dist/entropy/surface.d.ts.map +1 -0
- package/dist/entropy/trial.d.ts +35 -0
- package/dist/entropy/trial.d.ts.map +1 -0
- package/dist/entropy/types.d.ts +158 -0
- package/dist/entropy/types.d.ts.map +1 -0
- package/dist/execution-service.d.ts +63 -0
- package/dist/execution-service.d.ts.map +1 -0
- package/dist/fabric-exec-arguments.d.ts +5 -0
- package/dist/fabric-exec-arguments.d.ts.map +1 -0
- package/dist/fabric-exec-tool.d.ts +8 -0
- package/dist/fabric-exec-tool.d.ts.map +1 -0
- package/dist/fabric-runtime-state.d.ts +90 -0
- package/dist/fabric-runtime-state.d.ts.map +1 -0
- package/dist/fabric-runtime-state.js +13060 -0
- package/dist/fabric-runtime-state.js.map +7 -0
- package/dist/fabric-state.d.ts +89 -0
- package/dist/fabric-state.d.ts.map +1 -0
- package/dist/failure-progress.d.ts +3 -0
- package/dist/failure-progress.d.ts.map +1 -0
- package/dist/host-compatibility.d.ts +5 -0
- package/dist/host-compatibility.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5719 -0
- package/dist/index.js.map +7 -0
- package/dist/lifecycle/broker.d.ts +30 -0
- package/dist/lifecycle/broker.d.ts.map +1 -0
- package/dist/lifecycle/delivery-scheduler.d.ts +30 -0
- package/dist/lifecycle/delivery-scheduler.d.ts.map +1 -0
- package/dist/lifecycle/types.d.ts +91 -0
- package/dist/lifecycle/types.d.ts.map +1 -0
- package/dist/log-tail.d.ts +11 -0
- package/dist/log-tail.d.ts.map +1 -0
- package/dist/main-agent.d.ts +70 -0
- package/dist/main-agent.d.ts.map +1 -0
- package/dist/memory/context.d.ts +112 -0
- package/dist/memory/context.d.ts.map +1 -0
- package/dist/memory/digest.d.ts +48 -0
- package/dist/memory/digest.d.ts.map +1 -0
- package/dist/memory/digest.js +7 -0
- package/dist/memory/digest.js.map +7 -0
- package/dist/memory/discovery.d.ts +43 -0
- package/dist/memory/discovery.d.ts.map +1 -0
- package/dist/memory/discovery.js +23 -0
- package/dist/memory/discovery.js.map +7 -0
- package/dist/memory/index.d.ts +107 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/lineage.d.ts +20 -0
- package/dist/memory/lineage.d.ts.map +1 -0
- package/dist/memory/normalize.d.ts +170 -0
- package/dist/memory/normalize.d.ts.map +1 -0
- package/dist/memory/normalize.js +22 -0
- package/dist/memory/normalize.js.map +7 -0
- package/dist/memory/regex.d.ts +19 -0
- package/dist/memory/regex.d.ts.map +1 -0
- package/dist/memory/search.d.ts +98 -0
- package/dist/memory/search.d.ts.map +1 -0
- package/dist/memory/search.js +22 -0
- package/dist/memory/search.js.map +7 -0
- package/dist/memory/tokenize.d.ts +24 -0
- package/dist/memory/tokenize.d.ts.map +1 -0
- package/dist/mesh/store.d.ts +78 -0
- package/dist/mesh/store.d.ts.map +1 -0
- package/dist/output-budget.d.ts +12 -0
- package/dist/output-budget.d.ts.map +1 -0
- package/dist/prewalk/arm.d.ts +8 -0
- package/dist/prewalk/arm.d.ts.map +1 -0
- package/dist/prewalk/controller.d.ts +60 -0
- package/dist/prewalk/controller.d.ts.map +1 -0
- package/dist/prewalk/fs-drift.d.ts +19 -0
- package/dist/prewalk/fs-drift.d.ts.map +1 -0
- package/dist/prewalk/handoff.d.ts +45 -0
- package/dist/prewalk/handoff.d.ts.map +1 -0
- package/dist/protocol.d.ts +273 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +46 -0
- package/dist/protocol.js.map +7 -0
- package/dist/providers/agents-actions.d.ts +3 -0
- package/dist/providers/agents-actions.d.ts.map +1 -0
- package/dist/providers/agents-provider.d.ts +59 -0
- package/dist/providers/agents-provider.d.ts.map +1 -0
- package/dist/providers/arg-normalization.d.ts +15 -0
- package/dist/providers/arg-normalization.d.ts.map +1 -0
- package/dist/providers/captured-tools-provider.d.ts +23 -0
- package/dist/providers/captured-tools-provider.d.ts.map +1 -0
- package/dist/providers/compact-provider.d.ts +14 -0
- package/dist/providers/compact-provider.d.ts.map +1 -0
- package/dist/providers/components-provider.d.ts +12 -0
- package/dist/providers/components-provider.d.ts.map +1 -0
- package/dist/providers/mcp-descriptor-cache.d.ts +47 -0
- package/dist/providers/mcp-descriptor-cache.d.ts.map +1 -0
- package/dist/providers/mcp-provider.d.ts +27 -0
- package/dist/providers/mcp-provider.d.ts.map +1 -0
- package/dist/providers/memory-provider.d.ts +35 -0
- package/dist/providers/memory-provider.d.ts.map +1 -0
- package/dist/providers/memory-provider.js +16 -0
- package/dist/providers/memory-provider.js.map +7 -0
- package/dist/providers/mesh-provider.d.ts +17 -0
- package/dist/providers/mesh-provider.d.ts.map +1 -0
- package/dist/providers/omp-bash-cwd.d.ts +31 -0
- package/dist/providers/omp-bash-cwd.d.ts.map +1 -0
- package/dist/providers/omp-tools-provider.d.ts +15 -0
- package/dist/providers/omp-tools-provider.d.ts.map +1 -0
- package/dist/providers/schema-provider.d.ts +15 -0
- package/dist/providers/schema-provider.d.ts.map +1 -0
- package/dist/providers/state-provider.d.ts +16 -0
- package/dist/providers/state-provider.d.ts.map +1 -0
- package/dist/providers/write-diff-limits.d.ts +5 -0
- package/dist/providers/write-diff-limits.d.ts.map +1 -0
- package/dist/providers/write-preview.d.ts +3 -0
- package/dist/providers/write-preview.d.ts.map +1 -0
- package/dist/ref-names.d.ts +2 -0
- package/dist/ref-names.d.ts.map +1 -0
- package/dist/repairs/active.d.ts +7 -0
- package/dist/repairs/active.d.ts.map +1 -0
- package/dist/repairs/apply.d.ts +7 -0
- package/dist/repairs/apply.d.ts.map +1 -0
- package/dist/repairs/catalog-digest.d.ts +5 -0
- package/dist/repairs/catalog-digest.d.ts.map +1 -0
- package/dist/repairs/classify.d.ts +10 -0
- package/dist/repairs/classify.d.ts.map +1 -0
- package/dist/repairs/compiler.d.ts +33 -0
- package/dist/repairs/compiler.d.ts.map +1 -0
- package/dist/repairs/promote.d.ts +4 -0
- package/dist/repairs/promote.d.ts.map +1 -0
- package/dist/repairs/store.d.ts +10 -0
- package/dist/repairs/store.d.ts.map +1 -0
- package/dist/repairs/types.d.ts +49 -0
- package/dist/repairs/types.d.ts.map +1 -0
- package/dist/residency/actor-client.d.ts +16 -0
- package/dist/residency/actor-client.d.ts.map +1 -0
- package/dist/residency/actor-client.js +9 -0
- package/dist/residency/actor-client.js.map +7 -0
- package/dist/residency/client.d.ts +44 -0
- package/dist/residency/client.d.ts.map +1 -0
- package/dist/residency/host.d.ts +3 -0
- package/dist/residency/host.d.ts.map +1 -0
- package/dist/residency/host.js +25 -0
- package/dist/residency/host.js.map +7 -0
- package/dist/residency/launcher-owner.d.ts +7 -0
- package/dist/residency/launcher-owner.d.ts.map +1 -0
- package/dist/residency/launcher.d.ts +3 -0
- package/dist/residency/launcher.d.ts.map +1 -0
- package/dist/residency/launcher.js +152 -0
- package/dist/residency/launcher.js.map +7 -0
- package/dist/residency/omp-entry.d.ts +3 -0
- package/dist/residency/omp-entry.d.ts.map +1 -0
- package/dist/residency/omp-entry.js +41 -0
- package/dist/residency/omp-entry.js.map +7 -0
- package/dist/residency/protocol.d.ts +119 -0
- package/dist/residency/protocol.d.ts.map +1 -0
- package/dist/run-display.d.ts +3 -0
- package/dist/run-display.d.ts.map +1 -0
- package/dist/runtime/core-override-guest-types.d.ts +15 -0
- package/dist/runtime/core-override-guest-types.d.ts.map +1 -0
- package/dist/runtime/core-override-guest-types.js +291 -0
- package/dist/runtime/core-override-guest-types.js.map +7 -0
- package/dist/runtime/core-tool-properties.d.ts +6 -0
- package/dist/runtime/core-tool-properties.d.ts.map +1 -0
- package/dist/runtime/dynamic-guest-types.d.ts +3 -0
- package/dist/runtime/dynamic-guest-types.d.ts.map +1 -0
- package/dist/runtime/dynamic-guest-types.js +226 -0
- package/dist/runtime/dynamic-guest-types.js.map +7 -0
- package/dist/runtime/guest-code-repair.d.ts +2 -0
- package/dist/runtime/guest-code-repair.d.ts.map +1 -0
- package/dist/runtime/guest-stack-map.d.ts +11 -0
- package/dist/runtime/guest-stack-map.d.ts.map +1 -0
- package/dist/runtime/guest-types.d.ts +35 -0
- package/dist/runtime/guest-types.d.ts.map +1 -0
- package/dist/runtime/guest-types.js +13 -0
- package/dist/runtime/guest-types.js.map +7 -0
- package/dist/runtime/node-process-child-source.d.ts +2 -0
- package/dist/runtime/node-process-child-source.d.ts.map +1 -0
- package/dist/runtime/node-process-runtime.d.ts +10 -0
- package/dist/runtime/node-process-runtime.d.ts.map +1 -0
- package/dist/runtime/node-process-runtime.js +319 -0
- package/dist/runtime/node-process-runtime.js.map +7 -0
- package/dist/runtime/orchestration.d.ts +3 -0
- package/dist/runtime/orchestration.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.d.ts +24 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +12 -0
- package/dist/runtime/quickjs-runtime.js.map +7 -0
- package/dist/runtime/type-checker.d.ts +21 -0
- package/dist/runtime/type-checker.d.ts.map +1 -0
- package/dist/runtime/type-checker.js +15 -0
- package/dist/runtime/type-checker.js.map +7 -0
- package/dist/runtime-paths.d.ts +7 -0
- package/dist/runtime-paths.d.ts.map +1 -0
- package/dist/schema/controller.d.ts +35 -0
- package/dist/schema/controller.d.ts.map +1 -0
- package/dist/schema/types.d.ts +86 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/workspace.d.ts +19 -0
- package/dist/schema/workspace.d.ts.map +1 -0
- package/dist/speculation/eligibility.d.ts +22 -0
- package/dist/speculation/eligibility.d.ts.map +1 -0
- package/dist/speculation/freshness.d.ts +10 -0
- package/dist/speculation/freshness.d.ts.map +1 -0
- package/dist/speculation/partial-json.d.ts +9 -0
- package/dist/speculation/partial-json.d.ts.map +1 -0
- package/dist/speculation/scanner.d.ts +13 -0
- package/dist/speculation/scanner.d.ts.map +1 -0
- package/dist/speculation/scanner.js +182 -0
- package/dist/speculation/scanner.js.map +7 -0
- package/dist/speculation/store.d.ts +39 -0
- package/dist/speculation/store.d.ts.map +1 -0
- package/dist/speculation/stream-tap.d.ts +27 -0
- package/dist/speculation/stream-tap.d.ts.map +1 -0
- package/dist/speculation/types.d.ts +44 -0
- package/dist/speculation/types.d.ts.map +1 -0
- package/dist/state/complexity.d.ts +13 -0
- package/dist/state/complexity.d.ts.map +1 -0
- package/dist/state/evidence-runner.d.ts +17 -0
- package/dist/state/evidence-runner.d.ts.map +1 -0
- package/dist/state/store.d.ts +76 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/types.d.ts +165 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/storage/retention.d.ts +22 -0
- package/dist/storage/retention.d.ts.map +1 -0
- package/dist/thinking.d.ts +19 -0
- package/dist/thinking.d.ts.map +1 -0
- package/dist/topology/control-plane.d.ts +58 -0
- package/dist/topology/control-plane.d.ts.map +1 -0
- package/dist/topology/participant-directory.d.ts +33 -0
- package/dist/topology/participant-directory.d.ts.map +1 -0
- package/dist/topology/peer-settle.d.ts +51 -0
- package/dist/topology/peer-settle.d.ts.map +1 -0
- package/dist/topology/records.d.ts +6 -0
- package/dist/topology/records.d.ts.map +1 -0
- package/dist/topology/types.d.ts +89 -0
- package/dist/topology/types.d.ts.map +1 -0
- package/dist/type-error-guidance.d.ts +3 -0
- package/dist/type-error-guidance.d.ts.map +1 -0
- package/dist/ui/arc-group.d.ts +17 -0
- package/dist/ui/arc-group.d.ts.map +1 -0
- package/dist/ui/code-preview-shell.d.ts +26 -0
- package/dist/ui/code-preview-shell.d.ts.map +1 -0
- package/dist/ui/code-preview.d.ts +53 -0
- package/dist/ui/code-preview.d.ts.map +1 -0
- package/dist/ui/controller.d.ts +20 -0
- package/dist/ui/controller.d.ts.map +1 -0
- package/dist/ui/conversation-chrome.d.ts +15 -0
- package/dist/ui/conversation-chrome.d.ts.map +1 -0
- package/dist/ui/conversation-chrome.js +10 -0
- package/dist/ui/conversation-chrome.js.map +7 -0
- package/dist/ui/conversation-native-reader.d.ts +106 -0
- package/dist/ui/conversation-native-reader.d.ts.map +1 -0
- package/dist/ui/conversation-native-reader.js +784 -0
- package/dist/ui/conversation-native-reader.js.map +7 -0
- package/dist/ui/conversation-queue-store.d.ts +12 -0
- package/dist/ui/conversation-queue-store.d.ts.map +1 -0
- package/dist/ui/conversation-queue.d.ts +242 -0
- package/dist/ui/conversation-queue.d.ts.map +1 -0
- package/dist/ui/conversation-render.d.ts +45 -0
- package/dist/ui/conversation-render.d.ts.map +1 -0
- package/dist/ui/conversation-shortcut.d.ts +3 -0
- package/dist/ui/conversation-shortcut.d.ts.map +1 -0
- package/dist/ui/conversation-targets.d.ts +7 -0
- package/dist/ui/conversation-targets.d.ts.map +1 -0
- package/dist/ui/conversation-targets.js +12 -0
- package/dist/ui/conversation-targets.js.map +7 -0
- package/dist/ui/conversation-transcript.d.ts +25 -0
- package/dist/ui/conversation-transcript.d.ts.map +1 -0
- package/dist/ui/conversation.d.ts +170 -0
- package/dist/ui/conversation.d.ts.map +1 -0
- package/dist/ui/conversation.js +1868 -0
- package/dist/ui/conversation.js.map +7 -0
- package/dist/ui/core-tool-render.d.ts +20 -0
- package/dist/ui/core-tool-render.d.ts.map +1 -0
- package/dist/ui/dashboard-detail.d.ts +68 -0
- package/dist/ui/dashboard-detail.d.ts.map +1 -0
- package/dist/ui/dashboard-fabric-graph.d.ts +50 -0
- package/dist/ui/dashboard-fabric-graph.d.ts.map +1 -0
- package/dist/ui/dashboard-model.d.ts +111 -0
- package/dist/ui/dashboard-model.d.ts.map +1 -0
- package/dist/ui/dashboard-presentation.d.ts +6 -0
- package/dist/ui/dashboard-presentation.d.ts.map +1 -0
- package/dist/ui/dashboard.d.ts +188 -0
- package/dist/ui/dashboard.d.ts.map +1 -0
- package/dist/ui/dashboard.js +4604 -0
- package/dist/ui/dashboard.js.map +7 -0
- package/dist/ui/diff-background.d.ts +12 -0
- package/dist/ui/diff-background.d.ts.map +1 -0
- package/dist/ui/dynamic-border.d.ts +8 -0
- package/dist/ui/dynamic-border.d.ts.map +1 -0
- package/dist/ui/escape-halt.d.ts +11 -0
- package/dist/ui/escape-halt.d.ts.map +1 -0
- package/dist/ui/fabric-actor-delivery-selector.d.ts +17 -0
- package/dist/ui/fabric-actor-delivery-selector.d.ts.map +1 -0
- package/dist/ui/fabric-actor-tool-selector.d.ts +22 -0
- package/dist/ui/fabric-actor-tool-selector.d.ts.map +1 -0
- package/dist/ui/fabric-code-parser.d.ts +8 -0
- package/dist/ui/fabric-code-parser.d.ts.map +1 -0
- package/dist/ui/fabric-host-event-selector.d.ts +29 -0
- package/dist/ui/fabric-host-event-selector.d.ts.map +1 -0
- package/dist/ui/fabric-model-selector.d.ts +64 -0
- package/dist/ui/fabric-model-selector.d.ts.map +1 -0
- package/dist/ui/fabric-render.d.ts +113 -0
- package/dist/ui/fabric-render.d.ts.map +1 -0
- package/dist/ui/fabric-thinking-selector.d.ts +26 -0
- package/dist/ui/fabric-thinking-selector.d.ts.map +1 -0
- package/dist/ui/fabric-title-hint.d.ts +2 -0
- package/dist/ui/fabric-title-hint.d.ts.map +1 -0
- package/dist/ui/format.d.ts +9 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/highlight.d.ts +69 -0
- package/dist/ui/highlight.d.ts.map +1 -0
- package/dist/ui/model-picker.d.ts +46 -0
- package/dist/ui/model-picker.d.ts.map +1 -0
- package/dist/ui/model-picker.js +17 -0
- package/dist/ui/model-picker.js.map +7 -0
- package/dist/ui/preview-lines.d.ts +16 -0
- package/dist/ui/preview-lines.d.ts.map +1 -0
- package/dist/ui/row-balance.d.ts +29 -0
- package/dist/ui/row-balance.d.ts.map +1 -0
- package/dist/ui/settings.d.ts +57 -0
- package/dist/ui/settings.d.ts.map +1 -0
- package/dist/ui/settings.js +1908 -0
- package/dist/ui/settings.js.map +7 -0
- package/dist/ui/shiki-language.d.ts +7 -0
- package/dist/ui/shiki-language.d.ts.map +1 -0
- package/dist/ui/shiki-theme.d.ts +7 -0
- package/dist/ui/shiki-theme.d.ts.map +1 -0
- package/dist/ui/snapshot.d.ts +7 -0
- package/dist/ui/snapshot.d.ts.map +1 -0
- package/dist/ui/spinner.d.ts +6 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/state-file-preview.d.ts +13 -0
- package/dist/ui/state-file-preview.d.ts.map +1 -0
- package/dist/ui/structured.d.ts +9 -0
- package/dist/ui/structured.d.ts.map +1 -0
- package/dist/ui/symbol-theme.d.ts +3 -0
- package/dist/ui/symbol-theme.d.ts.map +1 -0
- package/dist/ui/tool-call-timing.d.ts +2 -0
- package/dist/ui/tool-call-timing.d.ts.map +1 -0
- package/dist/ui/tool-display.d.ts +8 -0
- package/dist/ui/tool-display.d.ts.map +1 -0
- package/dist/ui/topology.d.ts +162 -0
- package/dist/ui/topology.d.ts.map +1 -0
- package/dist/ui/transcript-parser.d.ts +18 -0
- package/dist/ui/transcript-parser.d.ts.map +1 -0
- package/dist/ui/transcript-reader.d.ts +10 -0
- package/dist/ui/transcript-reader.d.ts.map +1 -0
- package/dist/ui/transcript-sanitization.d.ts +14 -0
- package/dist/ui/transcript-sanitization.d.ts.map +1 -0
- package/dist/ui/transcript.d.ts +52 -0
- package/dist/ui/transcript.d.ts.map +1 -0
- package/dist/ui/types.d.ts +84 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/widget.d.ts +16 -0
- package/dist/ui/widget.d.ts.map +1 -0
- package/dist/ui/word-diff/alignment.d.ts +6 -0
- package/dist/ui/word-diff/alignment.d.ts.map +1 -0
- package/dist/ui/word-diff/change-block.d.ts +18 -0
- package/dist/ui/word-diff/change-block.d.ts.map +1 -0
- package/dist/ui/word-diff/changed-line.d.ts +14 -0
- package/dist/ui/word-diff/changed-line.d.ts.map +1 -0
- package/dist/ui/word-diff/emphasis.d.ts +9 -0
- package/dist/ui/word-diff/emphasis.d.ts.map +1 -0
- package/dist/ui/word-diff/line-emphasis.d.ts +7 -0
- package/dist/ui/word-diff/line-emphasis.d.ts.map +1 -0
- package/dist/ui/word-diff/line-matching.d.ts +10 -0
- package/dist/ui/word-diff/line-matching.d.ts.map +1 -0
- package/dist/ui/word-diff/line-similarity.d.ts +16 -0
- package/dist/ui/word-diff/line-similarity.d.ts.map +1 -0
- package/dist/ui/word-diff/normalize.d.ts +3 -0
- package/dist/ui/word-diff/normalize.d.ts.map +1 -0
- package/dist/ui/word-diff/parse.d.ts +17 -0
- package/dist/ui/word-diff/parse.d.ts.map +1 -0
- package/dist/ui/word-diff/range-refinement.d.ts +5 -0
- package/dist/ui/word-diff/range-refinement.d.ts.map +1 -0
- package/dist/ui/word-diff/ranges.d.ts +11 -0
- package/dist/ui/word-diff/ranges.d.ts.map +1 -0
- package/dist/ui/word-diff/smart-filter.d.ts +3 -0
- package/dist/ui/word-diff/smart-filter.d.ts.map +1 -0
- package/dist/ui/word-diff/sparse-line-matching.d.ts +25 -0
- package/dist/ui/word-diff/sparse-line-matching.d.ts.map +1 -0
- package/dist/ui/word-diff/text-boundaries.d.ts +11 -0
- package/dist/ui/word-diff/text-boundaries.d.ts.map +1 -0
- package/dist/ui/word-diff/token-alignment.d.ts +9 -0
- package/dist/ui/word-diff/token-alignment.d.ts.map +1 -0
- package/dist/ui/word-diff/token-text-refinement.d.ts +4 -0
- package/dist/ui/word-diff/token-text-refinement.d.ts.map +1 -0
- package/dist/ui/word-diff/tokens.d.ts +16 -0
- package/dist/ui/word-diff/tokens.d.ts.map +1 -0
- package/dist/ui/word-diff/types.d.ts +10 -0
- package/dist/ui/word-diff/types.d.ts.map +1 -0
- package/dist/util.d.ts +3 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/worker/options.d.ts +3 -0
- package/dist/worker/options.d.ts.map +1 -0
- package/dist/worker/options.js +104 -0
- package/dist/worker/options.js.map +7 -0
- package/dist/worker/run-record.d.ts +22 -0
- package/dist/worker/run-record.d.ts.map +1 -0
- package/dist/worker/run-record.js +123 -0
- package/dist/worker/run-record.js.map +7 -0
- package/dist/worker/session-export.d.ts +45 -0
- package/dist/worker/session-export.d.ts.map +1 -0
- package/dist/worker/session-export.js +91 -0
- package/dist/worker/session-export.js.map +7 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +1061 -0
- package/dist/worker.js.map +7 -0
- package/docs/agents.md +564 -0
- package/docs/architecture.md +139 -0
- package/docs/audit-trace.md +116 -0
- package/docs/certification.md +134 -0
- package/docs/compaction.md +332 -0
- package/docs/component-calculus.md +191 -0
- package/docs/components.md +329 -0
- package/docs/configuration.md +478 -0
- package/docs/entropy.md +396 -0
- package/docs/interface.md +149 -0
- package/docs/memory-recall.md +614 -0
- package/docs/programmatic-compaction.md +207 -0
- package/docs/provider-component-calculus.md +378 -0
- package/docs/providers.md +109 -0
- package/docs/repairs.md +69 -0
- package/docs/residency-runtime.md +82 -0
- package/docs/schema-enforcement.md +166 -0
- package/docs/skills.md +48 -0
- package/docs/speculation.md +132 -0
- package/docs/state-layer.md +197 -0
- package/package.json +116 -0
- package/skills/fabric-advisor/SKILL.md +29 -0
- package/skills/fabric-ambient/SKILL.md +44 -0
- package/skills/fabric-ambient/references/setup.md +90 -0
- package/skills/fabric-council/SKILL.md +94 -0
- package/skills/fabric-exec/SKILL.md +123 -0
- package/skills/fabric-exec/references/agents.md +211 -0
- package/skills/fabric-exec/references/mcp.md +49 -0
- package/skills/fabric-exec/references/mesh.md +51 -0
- package/skills/fabric-fusion/SKILL.md +332 -0
- package/skills/fabric-guide/SKILL.md +28 -0
- package/skills/fabric-rlm/SKILL.md +284 -0
- package/skills/fabric-schema/SKILL.md +121 -0
- package/skills/fabric-spec/SKILL.md +42 -0
- package/skills/fabric-supervisor/SKILL.md +37 -0
- package/skills/fabric-swarm/SKILL.md +80 -0
- package/skills/fabric-workflow/SKILL.md +133 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/util.ts", "../../src/ui/highlight.ts", "../../src/ui/shiki-theme.ts", "../../src/ui/shiki-language.ts", "../../src/ui/structured.ts", "../../src/ui/arc-group.ts", "../../src/ui/core-tool-render.ts", "../../src/ui/tool-call-timing.ts", "../../src/ui/diff-background.ts", "../../src/ui/word-diff/normalize.ts", "../../src/ui/word-diff/tokens.ts", "../../src/ui/word-diff/changed-line.ts", "../../src/ui/word-diff/alignment.ts", "../../src/ui/word-diff/line-similarity.ts", "../../src/ui/word-diff/sparse-line-matching.ts", "../../src/ui/word-diff/line-matching.ts", "../../src/ui/word-diff/parse.ts", "../../src/ui/word-diff/ranges.ts", "../../src/ui/word-diff/text-boundaries.ts", "../../src/ui/word-diff/token-alignment.ts", "../../src/ui/word-diff/token-text-refinement.ts", "../../src/ui/word-diff/range-refinement.ts", "../../src/ui/word-diff/smart-filter.ts", "../../src/ui/word-diff/emphasis.ts", "../../src/ui/word-diff/change-block.ts", "../../src/ui/word-diff/line-emphasis.ts", "../../src/ui/fabric-render.ts", "../../src/ui/spinner.ts"],
|
|
4
|
+
"sourcesContent": ["export const countNewlines = (value: string): number => {\n let count = 0;\n for (let index = 0; index < value.length; index++) {\n if (value.charCodeAt(index) === 10) count++;\n }\n return count;\n};\n\nexport const truncateMiddle = (value: string, maxChars: number): string => {\n if (value.length <= maxChars) return value;\n const marker = `\\n\\n... ${value.length - maxChars} characters omitted by OMP Fabric ...\\n\\n`;\n const available = Math.max(0, maxChars - marker.length);\n const head = Math.ceil(available / 2);\n const tail = Math.floor(available / 2);\n return `${value.slice(0, head)}${marker}${value.slice(value.length - tail)}`;\n};\n", "import { readFileSync, statSync } from \"node:fs\";\nimport { basename, extname } from \"node:path\";\n// The light shiki subpath entries carry only catalog metadata (~5ms combined).\n// The full shiki entry (createHighlighter, ~50ms in-host) is dynamic-imported\n// lazily inside initHighlighting so extension startup stays off the shiki graph.\nimport { bundledLanguages } from \"shiki/langs\";\nimport { bundledThemesInfo } from \"shiki/themes\";\nimport type { GrammarState, Highlighter } from \"shiki\";\nimport { resolveShikiTheme, type ShikiThemeVariant } from \"./code-preview.js\";\nimport { resolveShikiThemeObject } from \"./shiki-theme.js\";\nimport { resolveShikiLanguageObjects } from \"./shiki-language.js\";\n\nconst configuredMaxHighlightChars = Number.parseInt(\n process.env.CODE_PREVIEW_MAX_HIGHLIGHT_CHARS ?? \"\",\n 10,\n);\nconst MAX_HIGHLIGHT_CHARS =\n Number.isFinite(configuredMaxHighlightChars) && configuredMaxHighlightChars > 0\n ? configuredMaxHighlightChars\n : 80_000;\nconst configuredFileHighlightMaxSourceChars = Number.parseInt(\n process.env.CODE_PREVIEW_FILE_HIGHLIGHT_MAX_CHARS ?? \"\",\n 10,\n);\n// Files larger than this never enter full-file tokenization; their previews\n// fall back to per-run tokenization. Bounds worst-case background work.\nconst FILE_HIGHLIGHT_MAX_SOURCE_CHARS =\n Number.isFinite(configuredFileHighlightMaxSourceChars) &&\n configuredFileHighlightMaxSourceChars > 0\n ? configuredFileHighlightMaxSourceChars\n : 200_000;\n// One background slice covers ~5-10ms of shiki work on heavy grammars\n// (measured ~106ms for a 1.3k-line TS file), keeping each event-loop tick\n// well under one frame.\nconst FILE_HIGHLIGHT_TICK_LINE_BUDGET = 96;\nconst FILE_HIGHLIGHT_TICK_CHAR_BUDGET = 16_000;\nconst FILE_HIGHLIGHT_ENTRY_LIMIT = 24;\nconst FILE_HIGHLIGHT_CHAR_LIMIT = 4_000_000;\nconst CACHE_LIMIT = 192;\nconst CACHE_CHAR_LIMIT = 4_000_000;\nconst PRELOADED_LANGUAGES = [\n \"bash\",\n \"typescript\",\n \"tsx\",\n \"javascript\",\n \"jsx\",\n \"json\",\n \"markdown\",\n \"yaml\",\n \"toml\",\n \"css\",\n] as const;\n\nconst LANGUAGE_ALIASES = new Map<string, string>([\n [\"sh\", \"bash\"],\n [\"shell\", \"bash\"],\n [\"zsh\", \"bash\"],\n [\"ts\", \"typescript\"],\n [\"js\", \"javascript\"],\n [\"md\", \"markdown\"],\n [\"yml\", \"yaml\"],\n [\"py\", \"python\"],\n [\"rs\", \"rust\"],\n [\"rb\", \"ruby\"],\n [\"cs\", \"csharp\"],\n [\"fs\", \"fsharp\"],\n [\"ps1\", \"powershell\"],\n]);\n\nconst EXACT_BASENAMES = new Map<string, string>([\n [\"dockerfile\", \"dockerfile\"],\n [\"makefile\", \"makefile\"],\n [\"gnumakefile\", \"makefile\"],\n [\"justfile\", \"makefile\"],\n [\"procfile\", \"shellscript\"],\n [\"gemfile\", \"ruby\"],\n [\"rakefile\", \"ruby\"],\n [\"cargo.lock\", \"toml\"],\n [\"package-lock.json\", \"json\"],\n [\"composer.lock\", \"json\"],\n [\"pnpm-lock.yaml\", \"yaml\"],\n [\"pnpm-lock.yml\", \"yaml\"],\n [\"yarn.lock\", \"yaml\"],\n]);\n\nconst EXTENSION_ALIASES = new Map<string, string>([\n [\".ts\", \"typescript\"],\n [\".tsx\", \"tsx\"],\n [\".js\", \"javascript\"],\n [\".jsx\", \"jsx\"],\n [\".mjs\", \"javascript\"],\n [\".cjs\", \"javascript\"],\n [\".json\", \"json\"],\n [\".md\", \"markdown\"],\n [\".markdown\", \"markdown\"],\n [\".yml\", \"yaml\"],\n [\".yaml\", \"yaml\"],\n [\".toml\", \"toml\"],\n [\".sh\", \"bash\"],\n [\".bash\", \"bash\"],\n [\".zsh\", \"bash\"],\n [\".css\", \"css\"],\n [\".html\", \"html\"],\n [\".htm\", \"html\"],\n [\".py\", \"python\"],\n [\".rs\", \"rust\"],\n [\".go\", \"go\"],\n [\".rb\", \"ruby\"],\n [\".php\", \"php\"],\n [\".sql\", \"sql\"],\n [\".xml\", \"xml\"],\n [\".svg\", \"xml\"],\n [\".vue\", \"vue\"],\n [\".svelte\", \"svelte\"],\n [\".c\", \"c\"],\n [\".h\", \"c\"],\n [\".cpp\", \"cpp\"],\n [\".cc\", \"cpp\"],\n [\".hpp\", \"cpp\"],\n [\".java\", \"java\"],\n [\".kt\", \"kotlin\"],\n [\".swift\", \"swift\"],\n [\".lua\", \"lua\"],\n [\".r\", \"r\"],\n [\".scala\", \"scala\"],\n [\".clj\", \"clojure\"],\n [\".ex\", \"elixir\"],\n [\".exs\", \"elixir\"],\n [\".erl\", \"erlang\"],\n [\".hs\", \"haskell\"],\n [\".ml\", \"ocaml\"],\n [\".fs\", \"fsharp\"],\n [\".fsx\", \"fsharp\"],\n [\".cs\", \"csharp\"],\n [\".ps1\", \"powershell\"],\n [\".graphql\", \"graphql\"],\n [\".prisma\", \"prisma\"],\n [\".dockerfile\", \"dockerfile\"],\n]);\n\nconst THEME_TYPE = new Map(bundledThemesInfo.map((theme) => [theme.id, theme.type]));\nconst LOW_CONTRAST_FALLBACK = \"\\x1b[38;2;139;148;158m\";\n\nlet highlighter: Highlighter | undefined;\nlet readyTheme: string | undefined;\nlet initializingTheme: string | undefined;\nlet initVersion = 0;\nlet highlighterGeneration = 0;\nlet themePreference = \"auto\";\nlet observedVariant: ShikiThemeVariant = \"dark\";\nlet currentTheme = resolveShikiTheme(themePreference, observedVariant);\nlet enabled = true;\nconst loadedLanguages = new Set<string>();\nconst pendingLanguages = new Set<string>();\nconst languageLoadCallbacks = new Map<string, Set<() => void>>();\nconst highlighterReadyCallbacks = new Set<() => void>();\nconst renderCache = new Map<string, { value: string[]; size: number }>();\nlet renderCacheChars = 0;\n\nconst hashString = (value: string): number => {\n let hash = 5381;\n for (let index = 0; index < value.length; index++) {\n hash = ((hash << 5) + hash + value.charCodeAt(index)) | 0;\n }\n return hash;\n};\n\nconst escapeControlChars = (text: string): string =>\n text\n .replace(/\\x1b/g, \"\u241B\")\n .replace(/\\r/g, \"\u240D\")\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\x9f]/g, \"\uFFFD\");\n\nconst normalizeLanguage = (language: string): string => {\n const normalized = language.toLowerCase();\n return LANGUAGE_ALIASES.get(normalized) ?? normalized;\n};\n\ninterface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\nconst ANSI_16_RGB: readonly Rgb[] = [\n { r: 0, g: 0, b: 0 },\n { r: 205, g: 49, b: 49 },\n { r: 13, g: 161, b: 13 },\n { r: 229, g: 165, b: 10 },\n { r: 36, g: 114, b: 200 },\n { r: 188, g: 63, b: 188 },\n { r: 17, g: 168, b: 205 },\n { r: 229, g: 229, b: 229 },\n { r: 102, g: 102, b: 102 },\n { r: 241, g: 76, b: 76 },\n { r: 35, g: 209, b: 139 },\n { r: 245, g: 245, b: 67 },\n { r: 59, g: 142, b: 234 },\n { r: 214, g: 112, b: 214 },\n { r: 41, g: 184, b: 219 },\n { r: 255, g: 255, b: 255 },\n];\n\nexport const ansi256ToRgb = (index: number): Rgb => {\n if (index < 16) return ANSI_16_RGB[Math.max(0, index)] ?? { r: 0, g: 0, b: 0 };\n if (index < 232) {\n const cube = index - 16;\n const channel = (value: number): number => (value === 0 ? 0 : 55 + 40 * value);\n return {\n r: channel(Math.floor(cube / 36)),\n g: channel(Math.floor((cube % 36) / 6)),\n b: channel(cube % 6),\n };\n }\n const gray = 8 + 10 * (Math.min(index, 255) - 232);\n return { r: gray, g: gray, b: gray };\n};\n\nconst parseAnsiBgColor = (sequence: string): Rgb | undefined => {\n const truecolor = sequence.match(/\\x1b\\[4?8;2;(\\d+);(\\d+);(\\d+)m/);\n if (truecolor) {\n return { r: Number(truecolor[1]), g: Number(truecolor[2]), b: Number(truecolor[3]) };\n }\n const indexed = sequence.match(/\\x1b\\[4?8;5;(\\d+)m/);\n if (indexed) return ansi256ToRgb(Number(indexed[1]));\n return undefined;\n};\n\nconst relativeLuminance = ({ r, g, b }: Rgb): number =>\n (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n\n/** Minimal structural view of OMP's active theme, as handed to renderers. */\nexport interface OmpThemeLike {\n name?: string;\n getBgAnsi?(color: \"userMessageBg\"): string;\n}\n\n/**\n * Classify OMP's active theme as a light or dark variant. Named built-ins are\n * matched directly, custom themes fall back to the luminance of OMP's message\n * background color, and as a last resort COLORFGBG provides a terminal hint.\n */\nexport const classifyOmpTheme = (\n theme: OmpThemeLike | undefined,\n env: NodeJS.ProcessEnv = process.env,\n): ShikiThemeVariant | undefined => {\n const name = theme?.name?.trim().toLowerCase();\n if (name === \"light\") return \"light\";\n if (name === \"dark\") return \"dark\";\n const background = theme?.getBgAnsi\n ? parseAnsiBgColor(theme.getBgAnsi(\"userMessageBg\"))\n : undefined;\n if (background) return relativeLuminance(background) >= 0.5 ? \"light\" : \"dark\";\n const colorFgBg = env.COLORFGBG;\n if (colorFgBg) {\n const index = colorFgBg\n .split(\";\")\n .map((part) => Number.parseInt(part, 10))\n .filter((part) => Number.isInteger(part) && part >= 0 && part <= 255)\n .at(-1);\n if (index !== undefined) {\n return relativeLuminance(ansi256ToRgb(index)) >= 0.5 ? \"light\" : \"dark\";\n }\n }\n return undefined;\n};\n\nconst syncEffectiveTheme = (preference: string, variant: ShikiThemeVariant): boolean => {\n themePreference = preference;\n observedVariant = variant;\n const effective = resolveShikiTheme(preference, variant);\n if (effective === currentTheme) return false;\n currentTheme = effective;\n renderCache.clear();\n renderCacheChars = 0;\n resetFileHighlighting();\n if (enabled && (highlighter || initializingTheme)) {\n void initHighlighting(effective, true);\n }\n return true;\n};\n\n/**\n * Adopt the variant of the OMP theme instance handed to a renderer. When the\n * configured preference follows the variant (\"auto\" or a \"light/dark\" pair),\n * the effective shiki theme swaps as OMP auto-switches.\n */\nexport function observeOmpTheme(theme: OmpThemeLike | undefined): void {\n const variant = classifyOmpTheme(theme);\n if (variant) syncEffectiveTheme(themePreference, variant);\n}\n\n/** The shiki theme currently used for rendering (after variant resolution). */\nexport const effectiveShikiTheme = (): string => currentTheme;\n\n/** Whether the effective shiki theme is a light theme. */\nexport const effectiveShikiThemeIsLight = (): boolean =>\n THEME_TYPE.get(currentTheme) === \"light\";\n\n/** OMP's most recently observed theme variant. */\nexport const observedThemeVariant = (): ShikiThemeVariant => observedVariant;\n\n/** Resolve a shiki language id from a file path, or undefined if unsupported. */\nexport function languageFromPath(filePath: string | undefined): string | undefined {\n if (!filePath) return undefined;\n const name = basename(filePath).toLowerCase();\n if (name.startsWith(\".env\")) {\n const candidate = \"dotenv\";\n return candidate in bundledLanguages ? candidate : undefined;\n }\n if (name === \"dockerfile\" || name.startsWith(\"dockerfile.\")) {\n return \"dockerfile\" in bundledLanguages ? \"dockerfile\" : undefined;\n }\n const exact = EXACT_BASENAMES.get(name);\n if (exact && exact in bundledLanguages) return exact;\n const byExt = EXTENSION_ALIASES.get(extname(name));\n return byExt && byExt in bundledLanguages ? byExt : undefined;\n}\n\n/** Configure highlighting without loading Shiki until the first code preview needs it. */\nexport function configureHighlighting(themePreferenceValue: string, syntaxEnabled = true): void {\n const preference = themePreferenceValue.trim() || \"auto\";\n const wasEnabled = enabled;\n enabled = syntaxEnabled;\n if (!enabled) {\n themePreference = preference;\n currentTheme = resolveShikiTheme(preference, observedVariant);\n initVersion++;\n initializingTheme = undefined;\n highlighter?.dispose();\n highlighter = undefined;\n readyTheme = undefined;\n highlighterGeneration++;\n loadedLanguages.clear();\n pendingLanguages.clear();\n languageLoadCallbacks.clear();\n highlighterReadyCallbacks.clear();\n renderCache.clear();\n renderCacheChars = 0;\n resetFileHighlighting();\n return;\n }\n const themeChanged = syncEffectiveTheme(preference, observedVariant);\n // syncEffectiveTheme already rebuilds eagerly on a real theme swap and\n // highlightCode's requestInit lazily covers a never-initialized highlighter;\n // the only remaining case that needs an explicit init is re-enabling after\n // a disable disposed the highlighter. Rebuilding unconditionally here cost\n // a full 10-grammar shiki init (~80-260ms of main-thread work) on every\n // /fabric settings save even when nothing display-related had changed.\n if (!themeChanged && !wasEnabled && !highlighter && !initializingTheme) {\n void initHighlighting(currentTheme, syntaxEnabled);\n }\n}\n\n/** Initialize (or reinitialize) the shared shiki highlighter. Fire-and-forget safe. */\nexport async function initHighlighting(theme: string, syntaxEnabled = true): Promise<void> {\n currentTheme = theme;\n enabled = syntaxEnabled;\n if (!enabled) return;\n const version = ++initVersion;\n initializingTheme = theme;\n try {\n const { createHighlighter } = await import(\"shiki\");\n // Resolve the theme object from omp-fabric's own module graph and hand\n // createHighlighter the *object*, not a bare id string. Shiki's internal\n // lazy `import(\"@shikijs/themes/<id>)` for string ids cannot be resolved\n // inside OMP's extension host (issue #46); passing the object sidesteps it.\n const themeObject = await resolveShikiThemeObject(theme);\n if (!themeObject) {\n throw new Error(`Unknown shiki theme: ${theme}`);\n }\n const next = await createHighlighter({\n themes: [themeObject],\n langs: await resolveShikiLanguageObjects(PRELOADED_LANGUAGES),\n });\n if (version !== initVersion) {\n next.dispose();\n return;\n }\n highlighter?.dispose();\n highlighter = next;\n resetFileHighlighting();\n readyTheme = theme;\n initializingTheme = undefined;\n highlighterGeneration++;\n loadedLanguages.clear();\n for (const lang of PRELOADED_LANGUAGES) loadedLanguages.add(lang);\n notifyReady();\n } catch (error) {\n if (version !== initVersion) return;\n initializingTheme = undefined;\n console.warn(\"[omp-fabric] Shiki failed to initialize; previews will be plain text.\", error);\n highlighter?.dispose();\n highlighter = undefined;\n readyTheme = undefined;\n highlighterGeneration++;\n loadedLanguages.clear();\n highlighterReadyCallbacks.clear();\n }\n}\n\nconst shouldSkipHighlight = (text: string): boolean => text.length > MAX_HIGHLIGHT_CHARS;\n\nconst ansiFg = (hex: string): string => {\n const clean = hex.replace(/^#/, \"\").slice(0, 6);\n const n = Number.parseInt(clean, 16);\n return Number.isFinite(n)\n ? `\\x1b[38;2;${(n >> 16) & 255};${(n >> 8) & 255};${n & 255}m`\n : \"\";\n};\n\nconst ansiFromToken = (token: { content: string; color?: string; fontStyle?: number }): string => {\n let open = token.color ? ansiFg(token.color) : \"\";\n let close = token.color ? \"\\x1b[39m\" : \"\";\n const fontStyle = token.fontStyle ?? 0;\n if (fontStyle & 2) {\n open += \"\\x1b[1m\";\n close = \"\\x1b[22m\" + close;\n }\n if (fontStyle & 1) {\n open += \"\\x1b[3m\";\n close = \"\\x1b[23m\" + close;\n }\n if (fontStyle & 4) {\n open += \"\\x1b[4m\";\n close = \"\\x1b[24m\" + close;\n }\n return open + escapeControlChars(token.content) + close;\n};\n\nconst isLowContrastFg = (params: string): boolean => {\n if (params === \"30\" || params === \"90\" || params === \"38;5;0\" || params === \"38;5;8\") return true;\n if (!params.startsWith(\"38;2;\")) return false;\n const parts = params.split(\";\").map(Number);\n const r = parts[2];\n const g = parts[3];\n const b = parts[4];\n if (r === undefined || g === undefined || b === undefined) return false;\n if (!Number.isFinite(r) || !Number.isFinite(g) || !Number.isFinite(b)) return false;\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n return luminance < 72;\n};\n\nconst normalizeContrast = (ansi: string): string => {\n if (THEME_TYPE.get(currentTheme) === \"light\") return ansi;\n return ansi.replace(/\\x1b\\[([0-9;]*)m/g, (seq, params: string) =>\n isLowContrastFg(params) ? LOW_CONTRAST_FALLBACK : seq,\n );\n};\n\nconst cacheRendered = (key: string, value: string[]): void => {\n const size = value.reduce((total, line) => total + line.length, 0);\n renderCache.set(key, { value, size });\n renderCacheChars += size;\n while (renderCache.size > CACHE_LIMIT || renderCacheChars > CACHE_CHAR_LIMIT) {\n const first = renderCache.keys().next().value;\n if (first === undefined) break;\n const cached = renderCache.get(first);\n if (cached) renderCacheChars -= cached.size;\n renderCache.delete(first);\n }\n};\n\nconst requestInit = (invalidate?: () => void): void => {\n if (invalidate) highlighterReadyCallbacks.add(invalidate);\n if (initializingTheme === currentTheme) return;\n void initHighlighting(currentTheme, enabled);\n};\n\nconst notifyReady = (): void => {\n const callbacks = [...highlighterReadyCallbacks];\n highlighterReadyCallbacks.clear();\n for (const callback of callbacks) {\n try {\n callback();\n } catch {\n // A stale invalidate callback is harmless.\n }\n }\n};\n\nconst requestLanguageLoad = (lang: string, invalidate?: () => void): void => {\n if (invalidate) {\n const callbacks = languageLoadCallbacks.get(lang) ?? new Set();\n callbacks.add(invalidate);\n languageLoadCallbacks.set(lang, callbacks);\n }\n if (pendingLanguages.has(lang)) return;\n const instance = highlighter;\n if (!instance) return;\n pendingLanguages.add(lang);\n const generation = highlighterGeneration;\n void instance\n .loadLanguage(lang as never)\n .then(() => {\n if (generation !== highlighterGeneration) return;\n loadedLanguages.add(lang);\n const callbacks = languageLoadCallbacks.get(lang);\n languageLoadCallbacks.delete(lang);\n for (const callback of callbacks ?? []) {\n try {\n callback();\n } catch {\n // Stale invalidate; ignore.\n }\n }\n })\n .catch(() => {\n if (generation === highlighterGeneration) languageLoadCallbacks.delete(lang);\n })\n .finally(() => {\n if (generation === highlighterGeneration) pendingLanguages.delete(lang);\n });\n};\n\n/**\n * Highlight `text` as `lang`, returning per-line truecolor ANSI strings that match\n * pi-code-previews' rendering (same shiki theme + token conversion). Returns null\n * when highlighting is disabled, the language is unsupported, the highlighter is\n * not yet ready, or the content is too large. Pass `invalidate` to request a\n * re-render once the highlighter/language becomes ready.\n */\nexport function highlightCode(\n text: string,\n lang: string,\n invalidate?: () => void,\n): string[] | null {\n if (!enabled || !lang || shouldSkipHighlight(text)) return null;\n // A variant flip restarts initialization with the new theme; while it is in\n // flight the old highlighter cannot serve the current theme. Register the\n // invalidate so the preview repaints once the swap completes.\n if (!highlighter || readyTheme !== currentTheme) {\n requestInit(invalidate);\n return null;\n }\n const shikiLang = normalizeLanguage(lang);\n if (!(shikiLang in bundledLanguages)) return null;\n const cacheKey = `${currentTheme}\\0${shikiLang}\\0${text.length}\\0${hashString(text)}`;\n const cached = renderCache.get(cacheKey);\n if (cached) {\n renderCache.delete(cacheKey);\n renderCache.set(cacheKey, cached);\n return cached.value;\n }\n if (!loadedLanguages.has(shikiLang)) {\n requestLanguageLoad(shikiLang, invalidate);\n return null;\n }\n try {\n const tokens = highlighter.codeToTokensBase(text, {\n lang: shikiLang as never,\n theme: currentTheme as never,\n });\n const rendered = tokens.map((line) =>\n normalizeContrast(line.map(ansiFromToken).join(\"\")),\n );\n cacheRendered(cacheKey, rendered);\n return rendered;\n } catch {\n return null;\n }\n}\n\ninterface FileHighlightWaiter {\n to: number;\n invalidate: () => void;\n}\n\ninterface FileHighlightEntry {\n highlighter: Highlighter;\n lang: string;\n // Present only for disk-backed entries; virtual documents omit both.\n mtimeMs?: number;\n size?: number;\n sourceLines: string[];\n lines: string[];\n state: GrammarState | undefined;\n target: number;\n waiters: FileHighlightWaiter[];\n stale: boolean;\n chars: number;\n}\n\nexport interface FileHighlightLine {\n raw: string;\n ansi: string;\n}\n\nconst fileHighlightCache = new Map<string, FileHighlightEntry>();\nlet fileHighlightChars = 0;\nconst fileHighlightQueue: FileHighlightEntry[] = [];\nlet fileHighlightQueueScheduled = false;\n\nconst expandFileLineTabs = (text: string): string => text.replace(/\\t/g, \" \");\n\nconst dropFileHighlightEntry = (key: string, entry: FileHighlightEntry): void => {\n if (fileHighlightCache.get(key) !== entry) return;\n entry.stale = true;\n entry.waiters = [];\n fileHighlightCache.delete(key);\n fileHighlightChars -= entry.chars;\n};\n\nconst evictFileHighlightCache = (): void => {\n while (\n fileHighlightCache.size > FILE_HIGHLIGHT_ENTRY_LIMIT ||\n fileHighlightChars > FILE_HIGHLIGHT_CHAR_LIMIT\n ) {\n const oldestKey = fileHighlightCache.keys().next().value;\n if (oldestKey === undefined) break;\n const oldest = fileHighlightCache.get(oldestKey);\n if (oldest) dropFileHighlightEntry(oldestKey, oldest);\n else fileHighlightCache.delete(oldestKey);\n }\n};\n\nconst resetFileHighlighting = (): void => {\n for (const [, entry] of fileHighlightCache) {\n entry.stale = true;\n entry.waiters = [];\n }\n fileHighlightCache.clear();\n fileHighlightQueue.length = 0;\n fileHighlightChars = 0;\n};\n\nconst fireSatisfiedWaiters = (entry: FileHighlightEntry): void => {\n const covered = entry.lines.length;\n const ready = new Set<() => void>();\n const remaining: FileHighlightWaiter[] = [];\n for (const waiter of entry.waiters) {\n if (waiter.to <= covered) ready.add(waiter.invalidate);\n else remaining.push(waiter);\n }\n entry.waiters = remaining;\n if (ready.size === 0) return;\n queueMicrotask(() => {\n for (const invalidate of ready) {\n try {\n invalidate();\n } catch {\n // A stale invalidate callback is harmless.\n }\n }\n });\n};\n\nconst advanceFileHighlight = (entry: FileHighlightEntry): void => {\n const instance = highlighter;\n if (!instance || readyTheme !== currentTheme || instance !== entry.highlighter) {\n entry.stale = true;\n return;\n }\n const start = entry.lines.length;\n const hardEnd = Math.min(entry.target, entry.sourceLines.length);\n let end = start;\n let chars = 0;\n const maxEnd = Math.min(start + FILE_HIGHLIGHT_TICK_LINE_BUDGET, hardEnd);\n while (end < maxEnd && chars <= FILE_HIGHLIGHT_TICK_CHAR_BUDGET) {\n chars += (entry.sourceLines[end]?.length ?? 0) + 1;\n end++;\n }\n if (end <= start) return;\n try {\n const tokens = instance.codeToTokensBase(entry.sourceLines.slice(start, end).join(\"\\n\"), {\n lang: entry.lang as never,\n theme: currentTheme as never,\n ...(entry.state ? { grammarState: entry.state } : {}),\n });\n const rendered = tokens.map((line) =>\n normalizeContrast(line.map(ansiFromToken).join(\"\")),\n );\n entry.state = instance.getLastGrammarState(tokens as never);\n entry.lines.push(...rendered);\n const delta = rendered.reduce((total, line) => total + line.length, 0);\n entry.chars += delta;\n fileHighlightChars += delta;\n } catch {\n entry.stale = true;\n }\n};\n\nconst pumpFileHighlightQueue = (): void => {\n fileHighlightQueueScheduled = false;\n let entry = fileHighlightQueue.shift();\n while (\n entry !== undefined &&\n (entry.stale ||\n entry.highlighter !== highlighter ||\n entry.lines.length >= Math.min(entry.target, entry.sourceLines.length))\n ) {\n if (entry.waiters.length > 0) fireSatisfiedWaiters(entry);\n entry = fileHighlightQueue.shift();\n }\n if (!entry) return;\n advanceFileHighlight(entry);\n if (!entry.stale) {\n fireSatisfiedWaiters(entry);\n // Coverage only progresses while something on screen waits for it; an\n // entry with no waiters parks so idle state never burns CPU.\n if (entry.waiters.length > 0) fileHighlightQueue.push(entry);\n }\n if (fileHighlightQueue.length > 0) {\n fileHighlightQueueScheduled = true;\n setImmediate(pumpFileHighlightQueue);\n }\n};\n\nconst scheduleFileHighlight = (entry: FileHighlightEntry): void => {\n if (!fileHighlightQueue.includes(entry)) fileHighlightQueue.push(entry);\n if (fileHighlightQueueScheduled) return;\n fileHighlightQueueScheduled = true;\n setImmediate(pumpFileHighlightQueue);\n};\n\n/**\n * Highlight a line range of an on-disk file with full grammar state, returning\n * per-line { raw, ansi } entries for 0-based [from, to). `raw` is the\n * tab-expanded source line so callers can verify the rendered content still\n * matches the file. Returns null while coverage has not reached `to` (or when\n * the file is unusable); passing `invalidate` repaints as soon as the range is\n * covered and pumps bounded background tokenization \u2014 parked shiki\n * GrammarState, one ~5-10ms slice per event-loop tick, work only while\n * waiters exist.\n */\nexport function highlightFileLines(\n filePath: string,\n lang: string,\n from: number,\n to: number,\n invalidate?: () => void,\n): FileHighlightLine[] | null {\n if (!enabled || !lang || !filePath || to <= from || from < 0) return null;\n if (!highlighter || readyTheme !== currentTheme) {\n requestInit(invalidate);\n return null;\n }\n const shikiLang = normalizeLanguage(lang);\n if (!(shikiLang in bundledLanguages)) return null;\n if (!loadedLanguages.has(shikiLang)) {\n requestLanguageLoad(shikiLang, invalidate);\n return null;\n }\n let stat;\n try {\n stat = statSync(filePath);\n } catch {\n return null;\n }\n if (!stat.isFile() || stat.size > FILE_HIGHLIGHT_MAX_SOURCE_CHARS) return null;\n const key = `${currentTheme}\\0${shikiLang}\\0${filePath}`;\n let entry = fileHighlightCache.get(key);\n if (entry && (entry.mtimeMs !== stat.mtimeMs || entry.size !== stat.size)) {\n dropFileHighlightEntry(key, entry);\n entry = undefined;\n }\n if (!entry) {\n let text: string;\n try {\n text = readFileSync(filePath, \"utf8\");\n } catch {\n return null;\n }\n if (text.includes(\"\\0\")) return null;\n const sourceLines = text\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\")\n .map(expandFileLineTabs);\n entry = {\n highlighter,\n lang: shikiLang,\n mtimeMs: stat.mtimeMs,\n size: stat.size,\n sourceLines,\n lines: [],\n state: undefined,\n target: 0,\n waiters: [],\n stale: false,\n chars: sourceLines.reduce((total, line) => total + line.length, 0),\n };\n fileHighlightCache.set(key, entry);\n fileHighlightChars += entry.chars;\n evictFileHighlightCache();\n if (entry.stale) {\n // Evicted immediately by the char budget; treat as unusable.\n entry.waiters = [];\n return null;\n }\n } else {\n fileHighlightCache.delete(key);\n fileHighlightCache.set(key, entry);\n }\n return fileHighlightRange(entry, from, to, invalidate);\n}\n\n/**\n * Highlight a line range of an in-memory document with full grammar state.\n * Shares the disk-backed pump, cache, and budgets; the caller supplies the\n * cache identity via `cacheKey` (already namespaced by theme + language) and\n * the tab-expanded source lines. Returns null while coverage has not reached\n * `to`; passing `invalidate` repaints as soon as the range is covered.\n */\nexport function highlightSourceLines(\n cacheKey: string,\n sourceLines: string[],\n lang: string,\n from: number,\n to: number,\n invalidate?: () => void,\n): FileHighlightLine[] | null {\n if (!enabled || !lang || !cacheKey || to <= from || from < 0) return null;\n if (!highlighter || readyTheme !== currentTheme) {\n requestInit(invalidate);\n return null;\n }\n const shikiLang = normalizeLanguage(lang);\n if (!(shikiLang in bundledLanguages)) return null;\n if (!loadedLanguages.has(shikiLang)) {\n requestLanguageLoad(shikiLang, invalidate);\n return null;\n }\n let entry = fileHighlightCache.get(cacheKey);\n if (!entry) {\n entry = {\n highlighter,\n lang: shikiLang,\n sourceLines,\n lines: [],\n state: undefined,\n target: 0,\n waiters: [],\n stale: false,\n chars: sourceLines.reduce((total, line) => total + line.length, 0),\n };\n fileHighlightCache.set(cacheKey, entry);\n fileHighlightChars += entry.chars;\n evictFileHighlightCache();\n if (entry.stale) {\n entry.waiters = [];\n return null;\n }\n } else {\n fileHighlightCache.delete(cacheKey);\n fileHighlightCache.set(cacheKey, entry);\n }\n return fileHighlightRange(entry, from, to, invalidate);\n}\n\nconst fileHighlightRange = (\n entry: FileHighlightEntry,\n from: number,\n to: number,\n invalidate?: () => void,\n): FileHighlightLine[] | null => {\n const total = entry.sourceLines.length;\n if (from >= total) return null;\n const clampedTo = Math.max(Math.min(to, total), Math.min(from, total));\n entry.target = Math.max(entry.target, clampedTo);\n if (invalidate && entry.lines.length < clampedTo) {\n entry.waiters = entry.waiters.filter((waiter) => waiter.invalidate !== invalidate);\n entry.waiters.push({ to: clampedTo, invalidate });\n scheduleFileHighlight(entry);\n }\n // Coverage past EOF: serve the existing lines rather than wait forever on a\n // target that can never be reached.\n if (entry.lines.length < clampedTo) return null;\n const out: FileHighlightLine[] = [];\n for (let index = from; index < Math.min(to, total); index++) {\n out.push({ raw: entry.sourceLines[index] ?? \"\", ansi: entry.lines[index] ?? \"\" });\n }\n return out;\n};\n", "import type { ThemeRegistration } from \"shiki\";\n\n// Theme resolution for issue #46.\n//\n// OMP's extension host cannot resolve shiki's internal lazy\n// `import(\"@shikijs/themes/<id>)` (triggered when createHighlighter is handed\n// a bare theme *id string*), so previews fell back to plain text. We resolve\n// each theme object from omp-fabric's own module graph with static imports and\n// hand createHighlighter the *object*, so shiki never performs that\n// host-fragile subpath import at runtime.\n//\n// Each entry is a static dynamic import so the module is only fetched when a\n// theme is actually selected, and so vitest can intercept it.\n\nconst THEME_IMPORTS = {\n \"andromeeda\": () => import(\"@shikijs/themes/andromeeda\"),\n \"aurora-x\": () => import(\"@shikijs/themes/aurora-x\"),\n \"ayu-dark\": () => import(\"@shikijs/themes/ayu-dark\"),\n \"ayu-light\": () => import(\"@shikijs/themes/ayu-light\"),\n \"ayu-mirage\": () => import(\"@shikijs/themes/ayu-mirage\"),\n \"catppuccin-frappe\": () => import(\"@shikijs/themes/catppuccin-frappe\"),\n \"catppuccin-latte\": () => import(\"@shikijs/themes/catppuccin-latte\"),\n \"catppuccin-macchiato\": () => import(\"@shikijs/themes/catppuccin-macchiato\"),\n \"catppuccin-mocha\": () => import(\"@shikijs/themes/catppuccin-mocha\"),\n \"dark-plus\": () => import(\"@shikijs/themes/dark-plus\"),\n \"dracula\": () => import(\"@shikijs/themes/dracula\"),\n \"dracula-soft\": () => import(\"@shikijs/themes/dracula-soft\"),\n \"everforest-dark\": () => import(\"@shikijs/themes/everforest-dark\"),\n \"everforest-light\": () => import(\"@shikijs/themes/everforest-light\"),\n \"github-dark\": () => import(\"@shikijs/themes/github-dark\"),\n \"github-dark-default\": () => import(\"@shikijs/themes/github-dark-default\"),\n \"github-dark-dimmed\": () => import(\"@shikijs/themes/github-dark-dimmed\"),\n \"github-dark-high-contrast\": () =>\n import(\"@shikijs/themes/github-dark-high-contrast\"),\n \"github-light\": () => import(\"@shikijs/themes/github-light\"),\n \"github-light-default\": () => import(\"@shikijs/themes/github-light-default\"),\n \"github-light-high-contrast\": () =>\n import(\"@shikijs/themes/github-light-high-contrast\"),\n \"gruvbox-dark-hard\": () => import(\"@shikijs/themes/gruvbox-dark-hard\"),\n \"gruvbox-dark-medium\": () => import(\"@shikijs/themes/gruvbox-dark-medium\"),\n \"gruvbox-dark-soft\": () => import(\"@shikijs/themes/gruvbox-dark-soft\"),\n \"gruvbox-light-hard\": () => import(\"@shikijs/themes/gruvbox-light-hard\"),\n \"gruvbox-light-medium\": () => import(\"@shikijs/themes/gruvbox-light-medium\"),\n \"gruvbox-light-soft\": () => import(\"@shikijs/themes/gruvbox-light-soft\"),\n \"horizon\": () => import(\"@shikijs/themes/horizon\"),\n \"horizon-bright\": () => import(\"@shikijs/themes/horizon-bright\"),\n \"houston\": () => import(\"@shikijs/themes/houston\"),\n \"kanagawa-dragon\": () => import(\"@shikijs/themes/kanagawa-dragon\"),\n \"kanagawa-lotus\": () => import(\"@shikijs/themes/kanagawa-lotus\"),\n \"kanagawa-wave\": () => import(\"@shikijs/themes/kanagawa-wave\"),\n \"laserwave\": () => import(\"@shikijs/themes/laserwave\"),\n \"light-plus\": () => import(\"@shikijs/themes/light-plus\"),\n \"material-theme\": () => import(\"@shikijs/themes/material-theme\"),\n \"material-theme-darker\": () => import(\"@shikijs/themes/material-theme-darker\"),\n \"material-theme-lighter\": () => import(\"@shikijs/themes/material-theme-lighter\"),\n \"material-theme-ocean\": () => import(\"@shikijs/themes/material-theme-ocean\"),\n \"material-theme-palenight\": () =>\n import(\"@shikijs/themes/material-theme-palenight\"),\n \"min-dark\": () => import(\"@shikijs/themes/min-dark\"),\n \"min-light\": () => import(\"@shikijs/themes/min-light\"),\n \"monokai\": () => import(\"@shikijs/themes/monokai\"),\n \"night-owl\": () => import(\"@shikijs/themes/night-owl\"),\n \"night-owl-light\": () => import(\"@shikijs/themes/night-owl-light\"),\n \"nord\": () => import(\"@shikijs/themes/nord\"),\n \"one-dark-pro\": () => import(\"@shikijs/themes/one-dark-pro\"),\n \"one-light\": () => import(\"@shikijs/themes/one-light\"),\n \"plastic\": () => import(\"@shikijs/themes/plastic\"),\n \"poimandres\": () => import(\"@shikijs/themes/poimandres\"),\n \"red\": () => import(\"@shikijs/themes/red\"),\n \"rose-pine\": () => import(\"@shikijs/themes/rose-pine\"),\n \"rose-pine-dawn\": () => import(\"@shikijs/themes/rose-pine-dawn\"),\n \"rose-pine-moon\": () => import(\"@shikijs/themes/rose-pine-moon\"),\n \"slack-dark\": () => import(\"@shikijs/themes/slack-dark\"),\n \"slack-ochin\": () => import(\"@shikijs/themes/slack-ochin\"),\n \"snazzy-light\": () => import(\"@shikijs/themes/snazzy-light\"),\n \"solarized-dark\": () => import(\"@shikijs/themes/solarized-dark\"),\n \"solarized-light\": () => import(\"@shikijs/themes/solarized-light\"),\n \"synthwave-84\": () => import(\"@shikijs/themes/synthwave-84\"),\n \"tokyo-night\": () => import(\"@shikijs/themes/tokyo-night\"),\n \"vesper\": () => import(\"@shikijs/themes/vesper\"),\n \"vitesse-black\": () => import(\"@shikijs/themes/vitesse-black\"),\n \"vitesse-dark\": () => import(\"@shikijs/themes/vitesse-dark\"),\n \"vitesse-light\": () => import(\"@shikijs/themes/vitesse-light\"),\n} as const satisfies Record<string, () => Promise<{ default: ThemeRegistration }>>;\n\n/**\n * Resolve a shiki theme id to its loaded theme object. Returns undefined when\n * the id is not a bundled shiki theme, so callers can fall back gracefully.\n */\nexport async function resolveShikiThemeObject(\n themeId: string,\n): Promise<ThemeRegistration | undefined> {\n const loader = THEME_IMPORTS[themeId as keyof typeof THEME_IMPORTS];\n if (!loader) return undefined;\n const mod = await loader();\n return mod.default;\n}\n", "import type { LanguageRegistration } from \"shiki\";\n\n// Resolve bundled language grammars through omp-fabric's dependency graph.\n// Shiki's own lazy imports are not resolvable from OMP's jiti extension host.\nconst LANGUAGE_IMPORTS = {\n bash: () => import(\"@shikijs/langs/shellscript\"),\n typescript: () => import(\"@shikijs/langs/typescript\"),\n tsx: () => import(\"@shikijs/langs/tsx\"),\n javascript: () => import(\"@shikijs/langs/javascript\"),\n jsx: () => import(\"@shikijs/langs/jsx\"),\n json: () => import(\"@shikijs/langs/json\"),\n markdown: () => import(\"@shikijs/langs/markdown\"),\n yaml: () => import(\"@shikijs/langs/yaml\"),\n toml: () => import(\"@shikijs/langs/toml\"),\n css: () => import(\"@shikijs/langs/css\"),\n} as const satisfies Record<\n string,\n () => Promise<{ default: LanguageRegistration[] }>\n>;\n\n/**\n * Resolve the language registrations used during highlighter initialization.\n * Passing objects prevents Shiki from issuing host-fragile lazy imports.\n */\nexport async function resolveShikiLanguageObjects(\n languageIds: readonly string[],\n): Promise<LanguageRegistration[]> {\n const modules = await Promise.all(\n languageIds.map(async (languageId) => {\n const loader = LANGUAGE_IMPORTS[languageId as keyof typeof LANGUAGE_IMPORTS];\n if (!loader) throw new Error(`Unsupported preloaded Shiki language: ${languageId}`);\n return loader();\n }),\n );\n return modules.flatMap((module) => module.default);\n}\n", "import { stringify } from \"yaml\";\nimport type { FabricResultFormat } from \"../config.js\";\nimport { countNewlines } from \"../util.js\";\n\nconst normalizeJsonValue = (value: unknown): unknown | undefined => {\n try {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? undefined : (JSON.parse(serialized) as unknown);\n } catch {\n return undefined;\n }\n};\n\nexport const formatJsonAsYaml = (value: unknown): string | undefined => {\n const normalized = normalizeJsonValue(value);\n if (normalized === undefined) return undefined;\n return stringify(normalized, { indent: 2, lineWidth: 0 }).trimEnd();\n};\n\nexport interface FormattedFabricValue {\n text: string;\n language?: \"yaml\" | \"json\";\n highlightedLineCount?: number;\n}\n\ninterface HoistedSection {\n path: string;\n text: string;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n// YAML literal block scalars must indent their content, so every multi-line\n// string serialized inside a structure is displayed with extra leading\n// whitespace on each line. Agents transcribe that corrupted indentation into\n// exact-match consumers (omp.edit oldText) and the match fails. Hoist\n// multi-line strings out of the YAML skeleton into raw sections so the\n// model-bound text preserves the original bytes.\nconst hoistMultilineStrings = (\n value: unknown,\n path: string,\n sections: HoistedSection[],\n seen: Set<unknown>,\n): unknown => {\n if (typeof value === \"string\") {\n if (!value.includes(\"\\n\")) return value;\n sections.push({ path, text: value });\n return `<multi-line string, see section: ${path}>`;\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) return \"[circular reference]\";\n seen.add(value);\n const skeleton = value.map((item, index) =>\n hoistMultilineStrings(item, `${path}[${index}]`, sections, seen),\n );\n seen.delete(value);\n return skeleton;\n }\n if (isPlainObject(value)) {\n if (seen.has(value)) return \"[circular reference]\";\n seen.add(value);\n const skeleton: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n skeleton[key] = hoistMultilineStrings(\n item,\n path ? `${path}.${key}` : key,\n sections,\n seen,\n );\n }\n seen.delete(value);\n return skeleton;\n }\n return value;\n};\n\nconst boundedSection = (value: string, maxChars: number): string => {\n if (value.length <= maxChars) return value;\n if (maxChars <= 0) return \"\";\n let omitted = value.length - maxChars;\n let marker = `\u2026[${omitted} chars omitted]\u2026`;\n for (let pass = 0; pass < 2; pass++) {\n omitted = value.length - Math.max(0, maxChars - marker.length);\n marker = `\u2026[${omitted} chars omitted]\u2026`;\n }\n if (marker.length >= maxChars) return marker.slice(0, maxChars);\n const available = maxChars - marker.length;\n const head = Math.ceil(available / 2);\n const tail = Math.floor(available / 2);\n return `${value.slice(0, head)}${marker}${value.slice(value.length - tail)}`;\n};\n\nconst fairSectionBudgets = (lengths: number[], budget: number): number[] => {\n const budgets = Array.from({ length: lengths.length }, () => 0);\n const pending = lengths.map((length, index) => ({ length, index }))\n .sort((left, right) => left.length - right.length);\n let remaining = Math.max(0, budget);\n for (let position = 0; position < pending.length; position++) {\n const item = pending[position]!;\n const share = Math.floor(remaining / (pending.length - position));\n const allocated = Math.min(item.length, share);\n budgets[item.index] = allocated;\n remaining -= allocated;\n }\n return budgets;\n};\n\nconst renderHoistedSections = (\n yaml: string,\n sections: HoistedSection[],\n maxChars?: number,\n): string => {\n const headers = sections.map((section) => `--- ${section.path} (${section.text.length} chars) ---\\n`);\n const separators = sections.length * 2;\n const fixedChars = yaml.length + separators + headers.reduce((sum, header) => sum + header.length, 0);\n const fullChars = fixedChars + sections.reduce((sum, section) => sum + section.text.length, 0);\n const budgets = maxChars !== undefined && fullChars > maxChars\n ? fairSectionBudgets(sections.map((section) => section.text.length), maxChars - fixedChars)\n : sections.map((section) => section.text.length);\n const raw = sections\n .map((section, index) => `${headers[index]}${boundedSection(section.text, budgets[index]!)}`)\n .join(\"\\n\\n\");\n return `${yaml}\\n\\n${raw}`;\n};\n\nexport const formatFabricValue = (\n value: unknown,\n format: FabricResultFormat,\n maxChars?: number,\n): FormattedFabricValue => {\n if (value === undefined) return { text: \"\" };\n if (format === \"text\" && typeof value === \"object\" && value !== null && \"text\" in value) {\n const text = (value as { text?: unknown }).text;\n if (typeof text === \"string\") return { text };\n }\n if (typeof value === \"string\") return { text: value };\n if (format === \"auto\" || format === \"yaml\") {\n const sections: HoistedSection[] = [];\n const skeleton = hoistMultilineStrings(value, \"\", sections, new Set());\n const yaml = formatJsonAsYaml(skeleton);\n if (yaml !== undefined) {\n if (sections.length === 0) return { text: yaml, language: \"yaml\" };\n // Highlight only the YAML skeleton. Raw sections preserve exact bytes when\n // they fit; oversized batches share the model-visible budget across every\n // section instead of allowing middle sections to disappear globally.\n return {\n text: renderHoistedSections(yaml, sections, maxChars),\n language: \"yaml\",\n highlightedLineCount: countNewlines(yaml) + 1,\n };\n }\n }\n try {\n return {\n text: JSON.stringify(value, null, format === \"json\" ? 2 : 0),\n ...(format === \"json\" ? { language: \"json\" as const } : {}),\n };\n } catch {\n return { text: String(value) };\n }\n};\n", "// Tree grouping for stacked footer arcs: every item but the last renders as a\n// continuation (\u251C\u2500) so a block closes with exactly one corner (\u2570\u2500).\nimport type { Theme } from \"@oh-my-pi/pi-coding-agent\";\n\nconst ANSI_ESCAPE = /\\x1b\\[[0-9;]*m/g;\nconst ARC_CLOSING = \"\u2570\u2500 \";\nconst ARC_CONTINUATION = \"\u251C\u2500 \";\n\nconst visibleText = (line: string): string => line.replace(ANSI_ESCAPE, \"\");\n\nconst isArcLine = (line: string): boolean => {\n const visible = visibleText(line);\n return visible.startsWith(ARC_CLOSING) || visible.startsWith(ARC_CONTINUATION);\n};\n\nconst continueArc = (line: string): string =>\n visibleText(line).startsWith(ARC_CLOSING)\n ? line.replace(ARC_CLOSING, ARC_CONTINUATION)\n : line;\n\n/**\n * Returns `lines` with the trailing run of arc items converted to continuation\n * items so a following arc can close the group. Returns the input untouched\n * when no arc item trails the block.\n */\nexport function continueArcGroup(lines: string[]): string[] {\n let start = lines.length;\n while (start > 0 && isArcLine(lines[start - 1]!)) start--;\n if (start === lines.length) return lines;\n const next = [...lines];\n for (let index = start; index < next.length; index++) {\n next[index] = continueArc(next[index]!);\n }\n return next;\n}\n\n/** Arc item line with a plain label; glyph and label are muted. */\nexport function arcItem(theme: Theme, label: string): string {\n return theme.fg(\"muted\", `${ARC_CLOSING}${label}`);\n}\n\n/** Arc item line with a pre-styled label; only the glyph is muted. */\nexport function arcItemStyled(theme: Theme, label: string): string {\n return theme.fg(\"muted\", ARC_CLOSING) + label;\n}\n\n/**\n * Appends an arc item to `lines`, converting the preceding arc run into\n * continuation items so the new item is the group's only closing corner.\n */\nexport function pushArcItem(lines: string[], item: string): void {\n for (let index = lines.length - 1; index >= 0 && isArcLine(lines[index]!); index--) {\n lines[index] = continueArc(lines[index]!);\n }\n lines.push(item);\n}\n", "// Adapted from pi-code-previews for audited nested calls; see THIRD_PARTY_NOTICES.md.\nimport { readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, extname, isAbsolute, relative, resolve } from \"node:path\";\nimport type { Theme } from \"@oh-my-pi/pi-coding-agent\";\nimport type { CodePreviewSettings } from \"./code-preview.js\";\nimport { formatToolCallDuration } from \"./tool-call-timing.js\";\nimport { diffLines } from \"diff\";\nimport { bundledLanguages } from \"shiki/langs\";\nimport type { FabricRenderAudit } from \"./fabric-render.js\";\nimport {\n effectiveShikiThemeIsLight,\n highlightCode,\n highlightFileLines,\n highlightSourceLines,\n languageFromPath,\n observeOmpTheme,\n} from \"./highlight.js\";\nimport { arcItem, pushArcItem } from \"./arc-group.js\";\nimport { markDiffLine } from \"./diff-background.js\";\nimport { countContentLines, selectPreviewTextLines } from \"./preview-lines.js\";\nimport {\n shouldSkipWriteDiffBytes,\n shouldSkipWriteDiffComplexity,\n} from \"../providers/write-diff-limits.js\";\nimport { changedLineEmphasis } from \"./word-diff/line-emphasis.js\";\nimport {\n diffLineNumberWidth,\n formatDiffLineNumber,\n parseDiffLine,\n type ParsedDiffLine,\n} from \"./word-diff/parse.js\";\n\nexport interface CoreToolRenderOptions {\n cwd: string;\n settings: CodePreviewSettings;\n expanded: boolean;\n maxLines: number;\n invalidate?: () => void;\n}\n\nexport interface RenderedCoreToolBody {\n lines: string[];\n hidden: number;\n}\n\ntype PreviewEntry<T> =\n | { kind: \"line\"; line: T; index: number }\n | { kind: \"hidden\"; hidden: number };\n\ntype DiffSummary = {\n additions: number;\n removals: number;\n replacements: number;\n insertions: number;\n deletions: number;\n totalLines: number;\n hunks: number;\n};\n\nconst CORE_TOOLS = new Set([\"bash\", \"read\", \"write\", \"edit\", \"grep\", \"find\", \"ls\"]);\n\nexport const isCoreToolAudit = (audit: FabricRenderAudit): boolean =>\n audit.tool !== undefined &&\n CORE_TOOLS.has(audit.tool) &&\n (audit.provider === \"omp\" || audit.ref === `omp.${audit.tool}`);\n\nconst positiveEnvInteger = (name: string, fallback: number): number => {\n const parsed = Number.parseInt(process.env[name] ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n};\n\nconst SECRET_SCAN_CHARS = positiveEnvInteger(\"CODE_PREVIEW_SECRET_SCAN_CHARS\", 200_000);\nconst MAX_HIGHLIGHT_CHARS = positiveEnvInteger(\"CODE_PREVIEW_MAX_HIGHLIGHT_CHARS\", 80_000);\nconst CONTENT_LANGUAGE_DETECTION_CHARS = positiveEnvInteger(\n \"CODE_PREVIEW_CONTENT_LANGUAGE_DETECTION_CHARS\",\n 50_000,\n);\n\nconst recordOf = (value: unknown): Record<string, unknown> | undefined =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n\nconst stringOf = (value: unknown): string | undefined =>\n typeof value === \"string\" ? value : undefined;\n\nconst numberOf = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst argString = (audit: FabricRenderAudit, key: string): string | undefined =>\n stringOf(audit.args?.[key]);\n\nconst escapeControlChars = (text: string): string =>\n text\n .replace(/\\x1b/g, \"\u241B\")\n .replace(/\\r/g, \"\u240D\")\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\x9f]/g, \"\uFFFD\");\n\nconst expandTabs = (text: string): string => text.replace(/\\t/g, \" \");\n\nconst formatBytes = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nconst countLabel = (count: number, singular: string): string =>\n `${count} ${count === 1 ? singular : `${singular}s`}`;\n\nconst metadata = (theme: Theme, values: Array<string | undefined>): string => {\n const present = values.filter((value): value is string => Boolean(value));\n return present.length > 0 ? theme.fg(\"dim\", ` \u00B7 ${present.join(\" \u00B7 \")}`) : \"\";\n};\n\nconst formatDisplayPath = (filePath: string, cwd: string): string => {\n if (!filePath) return \"\";\n if (isAbsolute(filePath)) {\n const fromCwd = relative(cwd, filePath);\n if (fromCwd && fromCwd !== \"..\" && !fromCwd.startsWith(\"../\") && !isAbsolute(fromCwd)) {\n return fromCwd;\n }\n if (!fromCwd) return \".\";\n const fromHome = relative(homedir(), filePath);\n if (fromHome && fromHome !== \"..\" && !fromHome.startsWith(\"../\") && !isAbsolute(fromHome)) {\n return `~/${fromHome}`;\n }\n if (!fromHome) return \"~\";\n }\n return filePath;\n};\n\nconst renderPath = (filePath: string, cwd: string, theme: Theme, fallback = \"...\"): string =>\n theme.fg(\"accent\", escapeControlChars(formatDisplayPath(filePath, cwd) || fallback));\n\nconst normalizedResult = (audit: FabricRenderAudit): unknown => {\n const preview = recordOf(audit.preview);\n return preview && \"result\" in preview ? preview.result : audit.result;\n};\n\nconst contentOutput = (value: unknown): string | undefined => {\n if (typeof value === \"string\") return value;\n if (!Array.isArray(value)) return undefined;\n const text = value\n .flatMap((part) => {\n const record = recordOf(part);\n return record?.type === \"text\" && typeof record.text === \"string\"\n ? [record.text]\n : [];\n })\n .join(\"\\n\");\n return text || undefined;\n};\n\nconst resultOutput = (audit: FabricRenderAudit): string | undefined => {\n const result = normalizedResult(audit);\n if (typeof result === \"string\") return result;\n const record = recordOf(result);\n return stringOf(record?.output)\n ?? stringOf(record?.text)\n ?? contentOutput(record?.content);\n};\n\nconst resultDetails = (audit: FabricRenderAudit): Record<string, unknown> | undefined => {\n const preview = recordOf(audit.preview);\n const previewDetails = recordOf(preview?.details);\n if (previewDetails) return previewDetails;\n return recordOf(recordOf(normalizedResult(audit))?.details);\n};\n\nconst nativeTruncated = (audit: FabricRenderAudit): boolean => {\n const truncation = recordOf(resultDetails(audit)?.truncation);\n return truncation?.truncated === true || audit.resultTruncated === true;\n};\n\nconst READ_CONTINUATION_NOTICE =\n /^\\[(?:Showing lines \\d+-\\d+ of \\d+(?: \\([^)]+\\))?|\\d+ more lines in file)\\. Use offset=\\d+ to continue\\.\\]$/;\n\nconst splitReadContinuationNotice = (text: string): { content: string; notice?: string } => {\n const match = /^(.*?)(?:\\r?\\n){2}(\\[[^\\r\\n]+\\])$/s.exec(text);\n const notice = match?.[2];\n if (!match || !notice || !READ_CONTINUATION_NOTICE.test(notice)) return { content: text };\n return { content: match[1] ?? \"\", notice: notice.slice(1, -1) };\n};\n\nconst toolLimit = (audit: FabricRenderAudit, options: CoreToolRenderOptions): number => {\n if (options.expanded) return options.maxLines;\n const configured = (() => {\n switch (audit.tool) {\n case \"read\":\n return options.settings.readCollapsedLines;\n case \"write\":\n return options.settings.writeCollapsedLines;\n case \"edit\":\n return options.settings.editCollapsedLines === \"all\"\n ? options.maxLines\n : options.settings.editCollapsedLines;\n case \"grep\":\n return options.settings.grepCollapsedLines;\n case \"find\":\n case \"ls\":\n return options.settings.pathListCollapsedLines;\n case \"bash\":\n return 8;\n default:\n return options.maxLines;\n }\n })();\n return Math.max(1, Math.min(configured, options.maxLines));\n};\n\nconst previewEntries = <T>(lines: T[], limit: number): { entries: PreviewEntry<T>[]; hidden: number } => {\n if (limit <= 0 || lines.length <= limit) {\n return { entries: lines.map((line, index) => ({ kind: \"line\", line, index })), hidden: 0 };\n }\n if (limit < 8) {\n return {\n entries: lines.slice(0, limit).map((line, index) => ({ kind: \"line\", line, index })),\n hidden: lines.length - limit,\n };\n }\n const head = Math.ceil(limit * 0.65);\n const tail = Math.max(1, limit - head - 1);\n const hidden = lines.length - head - tail;\n return {\n entries: [\n ...lines.slice(0, head).map((line, index) => ({ kind: \"line\" as const, line, index })),\n { kind: \"hidden\" as const, hidden },\n ...lines.slice(-tail).map((line, offset) => ({\n kind: \"line\" as const,\n line,\n index: lines.length - tail + offset,\n })),\n ],\n hidden,\n };\n};\n\nconst secretWarnings = (source: string): string[] => {\n if (!source) return [];\n const sample = source.length <= SECRET_SCAN_CHARS\n ? source\n : `${source.slice(0, SECRET_SCAN_CHARS / 2)}\\n${source.slice(-SECRET_SCAN_CHARS / 2)}`;\n const warnings: Array<[string, RegExp]> = [\n [\"private key\", /-----BEGIN [A-Z ]*PRIVATE KEY-----/],\n [\"AWS secret key\", /\\bAWS_SECRET_ACCESS_KEY\\s*=\\s*[\"']?[^\\s'\"]{12,}/i],\n [\n \"API key\",\n /\\b(?:OPENAI|ANTHROPIC|GOOGLE|GEMINI|MISTRAL|GROQ|TOGETHER|PERPLEXITY|XAI)_API_KEY\\s*=\\s*[\"']?[^\\s'\"]{12,}/i,\n ],\n [\"GitHub token\", /\\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{20,}\\b/],\n [\"JWT\", /\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\b/],\n ];\n return warnings.filter(([, pattern]) => pattern.test(sample)).map(([label]) => label);\n};\n\nconst warningLine = (source: string, options: CoreToolRenderOptions, theme: Theme): string | undefined => {\n if (!options.settings.secretWarnings) return undefined;\n const warnings = secretWarnings(source);\n return warnings.length > 0\n ? theme.fg(\"warning\", `\u26A0 Preview ${countLabel(warnings.length, \"warning\")}: possible ${warnings.join(\", \")}`)\n : undefined;\n};\n\nconst resolveLanguage = (filePath: string, content?: string): string | undefined => {\n const fromPath = languageFromPath(filePath);\n if (fromPath) return fromPath;\n const firstLine = content?.split(\"\\n\", 1)[0]?.trim();\n if (firstLine?.startsWith(\"#!\")) {\n const parts = firstLine\n .replace(/^#!\\s*/, \"\")\n .split(/\\s+/)\n .filter(Boolean);\n const envIndex = parts.findIndex((part) => part.split(\"/\").at(-1) === \"env\");\n const command = envIndex >= 0\n ? parts.slice(envIndex + 1).find((part) => !part.startsWith(\"-\"))\n : parts[0];\n const executable = command?.split(\"/\").at(-1)?.toLowerCase().replace(/\\d+(?:\\.\\d+)?$/, \"\");\n const shebang: Record<string, string> = {\n bash: \"bash\",\n sh: \"bash\",\n zsh: \"bash\",\n python: \"python\",\n node: \"javascript\",\n deno: \"typescript\",\n ruby: \"ruby\",\n php: \"php\",\n };\n const language = executable ? shebang[executable] : undefined;\n if (language && language in bundledLanguages) return language;\n }\n if (!content || content.length > CONTENT_LANGUAGE_DETECTION_CHARS) return undefined;\n const trimmed = content.trim();\n if (!trimmed) return undefined;\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n JSON.parse(trimmed);\n return \"json\";\n } catch {\n // Continue with the remaining lightweight content checks.\n }\n }\n if (/^<(!doctype\\s+html|html)(\\s|>)/i.test(trimmed)) return \"html\";\n if (/^<\\?xml\\s/i.test(trimmed)) return \"xml\";\n return undefined;\n};\n\nconst BASH_TRUNCATION_NOTICE =\n /^\\[Showing (?:last [^\\r\\n]+ of line \\d+ \\(line is [^)]+\\)|lines \\d+-\\d+ of \\d+(?: \\([^)]+ limit\\))?)\\. Full output: [^\\r\\n]+\\]$/;\n\nconst isBashTruncationNotice = (line: string): boolean => BASH_TRUNCATION_NOTICE.test(line);\n\nconst renderContent = (\n content: string,\n filePath: string,\n theme: Theme,\n options: CoreToolRenderOptions,\n config: { lineNumbers?: boolean; firstLine?: number; emptyLabel: string; skipLabel: string },\n): RenderedCoreToolBody => {\n const limit = toolLimit({ ref: \"\", tool: config.lineNumbers ? \"read\" : \"write\" }, options);\n const selected = selectPreviewTextLines(content, limit);\n if (selected.total === 0) {\n return { lines: [theme.fg(\"muted\", config.emptyLabel)], hidden: 0 };\n }\n const skipHighlight =\n options.settings.syntaxHighlighting && content.length > MAX_HIGHLIGHT_CHARS;\n const language =\n options.settings.syntaxHighlighting && !skipHighlight\n ? resolveLanguage(filePath, content)\n : undefined;\n const rendered: string[] = [];\n const warning = warningLine(content, options, theme);\n if (warning) rendered.push(warning);\n const absoluteFilePath = language && filePath ? resolve(options.cwd, filePath) : undefined;\n let chunk: Array<{ line: string; index: number }> = [];\n // A chunk is a contiguous run of visible file lines; when the on-disk file\n // matches, slice its fully-tokenized coverage (state-correct across excerpt\n // boundaries). Any mismatch falls back to per-chunk tokenization.\n const flush = (): void => {\n if (chunk.length === 0) return;\n const normalized = chunk.map((entry) => expandTabs(escapeControlChars(entry.line)));\n const first = chunk[0]!;\n const from = (config.firstLine ?? 1) - 1 + first.index;\n const fileLines =\n absoluteFilePath && language && first.index + chunk.length <= selected.total\n ? highlightFileLines(\n absoluteFilePath,\n language,\n from,\n from + chunk.length,\n options.invalidate,\n )\n : null;\n const fileVerified =\n fileLines !== null && fileLines.every((line, index) => line.raw === normalized[index]);\n const highlighted = fileVerified\n ? fileLines!.map((line) => line.ansi)\n : language\n ? highlightCode(normalized.join(\"\\n\"), language, options.invalidate)\n : null;\n const width = String((config.firstLine ?? 1) + selected.total - 1).length;\n for (let index = 0; index < chunk.length; index++) {\n const entry = chunk[index]!;\n const text = highlighted?.[index] ?? theme.fg(\"toolOutput\", normalized[index] || \" \");\n if (config.lineNumbers) {\n const lineNumber = String((config.firstLine ?? 1) + entry.index).padStart(width, \" \");\n rendered.push(`${theme.fg(\"dim\", `${lineNumber} \u2502 `)}${text}`);\n } else {\n rendered.push(text);\n }\n }\n chunk = [];\n };\n for (const entry of selected.entries) {\n if (entry.kind === \"hidden\") {\n flush();\n rendered.push(theme.fg(\"muted\", ` --- ${entry.hidden} lines hidden ---`));\n } else if (isBashTruncationNotice(entry.line)) {\n flush();\n const notice = theme.fg(\"muted\", escapeControlChars(entry.line));\n if (config.lineNumbers) {\n const width = String((config.firstLine ?? 1) + selected.total - 1).length;\n const lineNumber = String((config.firstLine ?? 1) + entry.index).padStart(width, \" \");\n rendered.push(`${theme.fg(\"dim\", `${lineNumber} \u2502 `)}${notice}`);\n } else {\n rendered.push(notice);\n }\n } else {\n chunk.push({ line: entry.line, index: entry.index });\n }\n }\n flush();\n if (skipHighlight) pushArcItem(rendered, arcItem(theme, config.skipLabel));\n return { lines: rendered, hidden: selected.hidden };\n};\n\nconst firstShellCommandName = (command: string): string | undefined => {\n const words: string[] = [];\n let index = 0;\n while (index < command.length && words.length < 8) {\n while (index < command.length && /\\s/.test(command[index] ?? \"\")) index++;\n if (index >= command.length || \"|&;()<>{}\".includes(command[index] ?? \"\")) break;\n let word = \"\";\n while (index < command.length) {\n const character = command[index] ?? \"\";\n if (/\\s/.test(character) || \"|&;()<>{}\".includes(character)) break;\n if (character === \"'\" || character === '\"') {\n const quote = character;\n index++;\n while (index < command.length && command[index] !== quote) {\n if (quote === '\"' && command[index] === \"\\\\\") index++;\n word += command[index] ?? \"\";\n index++;\n }\n if (index < command.length) index++;\n continue;\n }\n if (character === \"\\\\\") {\n index++;\n word += command[index] ?? \"\";\n index++;\n continue;\n }\n word += character;\n index++;\n }\n if (word) words.push(word);\n }\n const commandWord = words.find((word) => !/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(word));\n return commandWord?.split(\"/\").at(-1);\n};\n\nconst bashWarnings = (command: string): string[] => {\n const compact = command.replace(/\\\\\\n/g, \" \").replace(/\\s+/g, \" \").trim();\n const warnings: Array<[string, RegExp]> = [\n [\n \"recursive delete\",\n /\\brm\\b(?=[^;&|]*(?:-[\\w-]*r[\\w-]*|--recursive)\\b)(?=[^;&|]*(?:-[\\w-]*f[\\w-]*|--force)\\b)/i,\n ],\n [\"elevated privileges\", /(^|[;&|]\\s*)sudo\\b/],\n [\"recursive permission change\", /\\bchmod\\s+(?:-[\\w-]*R|--recursive)\\b/],\n [\"recursive ownership change\", /\\bchown\\s+(?:-[\\w-]*R|--recursive)\\b/],\n [\"searches entire filesystem\", /\\bfind\\b(?:\\s+-[\\w-]+)*\\s+\\/+(?=\\s|$)/],\n [\"searches entire home directory\", /\\bfind\\b(?:\\s+-[\\w-]+)*\\s+~\\/?(?=\\s|$)/],\n [\"discards git changes\", /\\bgit\\s+reset\\s+--hard\\b/],\n [\"removes untracked files\", /\\bgit\\s+clean\\s+-[\\w-]*[fd][\\w-]*\\b/],\n [\"removes Docker data\", /\\bdocker\\s+system\\s+prune\\b/],\n [\"writes to a system path\", />{1,2}\\s*\\/?(?:etc|bin|sbin|usr|var|System|Library)\\b/],\n ];\n return warnings.filter(([, pattern]) => pattern.test(compact)).map(([label]) => label);\n};\n\nconst injectVisibleRanges = (\n ansi: string,\n ranges: Array<[number, number]>,\n open: string,\n close: string,\n): string => {\n const sorted = ranges.filter(([start, end]) => end > start).sort((a, b) => a[0] - b[0]);\n let out = \"\";\n let visible = 0;\n let active = false;\n let rangeIndex = 0;\n for (let index = 0; index < ansi.length; index++) {\n if (ansi[index] === \"\\x1b\" && ansi[index + 1] === \"[\") {\n const end = ansi.indexOf(\"m\", index + 2);\n if (end >= 0) {\n const sequence = ansi.slice(index, end + 1);\n out += sequence;\n if (active && (sequence === \"\\x1b[39m\" || sequence === \"\\x1b[22m\")) out += open;\n index = end;\n continue;\n }\n }\n while (rangeIndex < sorted.length && visible >= sorted[rangeIndex]![1]) {\n if (active) out += close;\n active = false;\n rangeIndex++;\n }\n const range = sorted[rangeIndex];\n if (!active && range && visible >= range[0] && visible < range[1]) {\n out += open;\n active = true;\n }\n out += ansi[index];\n visible++;\n }\n if (active) out += close;\n return out;\n};\n\nconst wordEmphasisFor = (\n parsed: Array<ParsedDiffLine | null>,\n mode: CodePreviewSettings[\"wordEmphasis\"],\n): Map<number, { ranges: Array<[number, number]>; kind: \"add\" | \"remove\" }> => {\n const emphasis = new Map<\n number,\n { ranges: Array<[number, number]>; kind: \"add\" | \"remove\" }\n >();\n let start = 0;\n while (start < parsed.length) {\n if (!parsed[start] || parsed[start]!.kind === \" \") {\n start++;\n continue;\n }\n let end = start;\n while (end < parsed.length && parsed[end] && parsed[end]!.kind !== \" \") end++;\n const block = parsed.slice(start, end) as ParsedDiffLine[];\n for (const [index, value] of changedLineEmphasis(block, mode)) {\n emphasis.set(start + index, value);\n }\n start = end;\n }\n return emphasis;\n};\n\nconst summarizeDiff = (diff: string): DiffSummary => {\n let additions = 0;\n let removals = 0;\n let replacements = 0;\n let insertions = 0;\n let deletions = 0;\n let hunks = 0;\n let groupAdditions = 0;\n let groupRemovals = 0;\n const flush = (): void => {\n if (groupAdditions === 0 && groupRemovals === 0) return;\n hunks++;\n if (groupAdditions > 0 && groupRemovals > 0) {\n replacements++;\n insertions += Math.max(0, groupAdditions - groupRemovals);\n deletions += Math.max(0, groupRemovals - groupAdditions);\n } else if (groupAdditions > 0) insertions += groupAdditions;\n else deletions += groupRemovals;\n groupAdditions = 0;\n groupRemovals = 0;\n };\n const lines = diff.split(\"\\n\");\n for (const line of lines) {\n if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n additions++;\n groupAdditions++;\n } else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n removals++;\n groupRemovals++;\n } else {\n flush();\n }\n }\n flush();\n return { additions, removals, replacements, insertions, deletions, totalLines: lines.length, hunks };\n};\n\nconst describeDiffShape = (summary: DiffSummary): string => {\n const parts: string[] = [];\n if (summary.replacements > 0) parts.push(countLabel(summary.replacements, \"replacement\"));\n if (summary.insertions > 0) parts.push(countLabel(summary.insertions, \"insertion\"));\n if (summary.deletions > 0) parts.push(countLabel(summary.deletions, \"deletion\"));\n return parts.length > 0 ? parts.join(\", \") : \"changes\";\n};\n\nconst createSimpleDiff = (before: string, after: string): string => {\n const changes = diffLines(before, after);\n const hasChangeAfter = changes.map(() => false);\n let futureChange = false;\n for (let index = changes.length - 1; index >= 0; index--) {\n hasChangeAfter[index] = futureChange;\n const change = changes[index]!;\n if (change.added || change.removed) futureChange = true;\n }\n const out: string[] = [];\n let oldLine = 1;\n let newLine = 1;\n let changed = false;\n let firstChangedLine = 1;\n const context = 3;\n const contextLines = (lines: string[], oldStart: number): string[] =>\n lines.map((line, offset) => ` ${oldStart + offset} ${line}`);\n for (let index = 0; index < changes.length; index++) {\n const change = changes[index]!;\n const lines = change.value.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\").split(\"\\n\");\n if (lines.at(-1) === \"\") lines.pop();\n if (!change.added && !change.removed) {\n const later = hasChangeAfter[index] ?? false;\n if (!changed && later) {\n const start = Math.max(0, lines.length - context);\n out.push(...contextLines(lines.slice(start), oldLine + start));\n } else if (changed) {\n if (later && lines.length > context * 2) {\n out.push(...contextLines(lines.slice(0, context), oldLine));\n out.push(\"...\");\n out.push(...contextLines(lines.slice(-context), oldLine + lines.length - context));\n } else {\n out.push(...contextLines(lines.slice(0, later ? lines.length : context), oldLine));\n }\n }\n oldLine += lines.length;\n newLine += lines.length;\n continue;\n }\n if (!changed) firstChangedLine = newLine;\n changed = true;\n for (const line of lines) {\n if (change.removed) out.push(`-${oldLine++} ${line}`);\n else out.push(`+${newLine++} ${line}`);\n }\n }\n return out.length > 0 ? [`@@ ${firstChangedLine} @@`, ...out].join(\"\\n\") : \"\";\n};\n\n// FNV-style content hash for virtual-document cache keys; stable within the\n// process, not persisted, so no collision risk across sessions.\nconst hashSourceText = (value: string): number => {\n let hash = 5381;\n for (let index = 0; index < value.length; index++) {\n hash = ((hash << 5) + hash + value.charCodeAt(index)) | 0;\n }\n return hash;\n};\n\n// Ceiling on the pre-edit context we weave back in front of removed lines.\n// Bounds the virtual document so a deep edit never triggers a huge background\n// tokenization just to recover grammar state for a handful of removed lines.\nconst DIFF_REMOVED_CONTEXT_LINES = 512;\n\n/**\n * Resolve surviving compact-diff rows to their post-edit file positions.\n * OMP numbers additions on the new side, but context and removals on the old\n * side. Tracking the line delta is O(visible rows) and lets one existing\n * highlightFileLines request serve every matching row without extra I/O or\n * tokenization.\n */\nconst postEditFileRows = (\n parsed: Array<ParsedDiffLine | null>,\n): Array<{ index: number; lineNumber: number }> => {\n const rows: Array<{ index: number; lineNumber: number }> = [];\n let lineDelta = 0;\n for (let index = 0; index < parsed.length; index++) {\n const line = parsed[index];\n if (!line) continue;\n const lineNumber = Number.parseInt(line.lineNumber.trim(), 10);\n if (line.kind === \"+\") {\n if (Number.isFinite(lineNumber) && lineNumber > 0) rows.push({ index, lineNumber });\n lineDelta++;\n } else if (line.kind === \"-\") {\n lineDelta--;\n } else if (Number.isFinite(lineNumber)) {\n const translated = lineNumber + lineDelta;\n if (translated > 0) rows.push({ index, lineNumber: translated });\n }\n }\n return rows;\n};\n\n/**\n * Highlight removed (`-`) diff lines against a virtual pre-edit document.\n * Removed lines no longer exist on disk, so the file-verified path can never\n * serve them; tokenizing the removed fragment alone leaves embedded-language\n * scopes (e.g. JS inside an HTML <script>) colorless. Weaving the removed\n * lines back into the file's pre-edit line context restores full grammar\n * state. Returns a map from diff-row index to ANSI, or null when the virtual\n * document cannot be reconstructed (file unreadable/oversized/mismatched).\n * Coverage is produced by the shared background pump; pass `invalidate` to\n * repaint once ready.\n */\nconst highlightRemovedDiffLines = (\n parsed: Array<ParsedDiffLine | null>,\n filePath: string,\n language: string,\n cwd: string,\n invalidate?: () => void,\n): Map<number, string> | null => {\n // The first contiguous hunk's removed lines plus their surrounding context.\n let start = 0;\n while (start < parsed.length && !parsed[start]) start++;\n let end = start;\n while (end < parsed.length && parsed[end]) end++;\n const block = parsed.slice(start, end) as ParsedDiffLine[];\n const removed: Array<{ row: number; n: number; content: string }> = [];\n // Context rows preceding the first removed line: they belong to the pre-edit\n // document and must be woven in too \u2014 a scope opener (comment/string/tag) is\n // often one of them.\n const contextBefore: Array<{ n: number; content: string }> = [];\n for (let offset = 0; offset < block.length; offset++) {\n const line = block[offset]!;\n // Separator (\"...\") and other unnumbered rows carry no file position;\n // skip them instead of aborting the whole weave.\n const n = Number.parseInt(line.lineNumber.trim(), 10);\n if (!Number.isFinite(n) || n <= 0) continue;\n if (line.kind === \"-\") removed.push({ row: start + offset, n, content: expandTabs(line.content) });\n else if (line.kind === \" \" && removed.length === 0) contextBefore.push({ n, content: expandTabs(line.content) });\n }\n if (removed.length === 0) return null;\n // The virtual document weaves the removed lines back in as a single run, so\n // it is only faithful when they were contiguous in the pre-edit file. A\n // hunk that interleaves removed and context lines mid-hunk falls through to\n // the fragment fallback rather than reconstruct a wrong document.\n for (let index = 1; index < removed.length; index++) {\n if (removed[index]!.n !== removed[index - 1]!.n + 1) return null;\n }\n const firstRemoved = removed[0]!.n;\n // The woven context must run contiguously right up to the first removed\n // line; a folded gap in between (or interleaved removals) would silently\n // reconstruct the wrong pre-edit document.\n for (let index = 1; index < contextBefore.length; index++) {\n if (contextBefore[index]!.n !== contextBefore[index - 1]!.n + 1) return null;\n }\n if (contextBefore.length > 0 && contextBefore[contextBefore.length - 1]!.n !== firstRemoved - 1) {\n return null;\n }\n const anchor = contextBefore.length > 0 ? contextBefore[0]!.n : firstRemoved;\n\n const absolute = resolve(cwd, filePath);\n let stat;\n try {\n stat = statSync(absolute);\n } catch {\n return null;\n }\n if (!stat.isFile() || stat.size > MAX_HIGHLIGHT_CHARS) return null;\n let text: string;\n try {\n text = readFileSync(absolute, \"utf8\");\n } catch {\n return null;\n }\n if (text.includes(\"\\0\")) return null;\n const fileLines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\").map(expandTabs);\n // Context (post-edit, 1-based) must still match the file, or the pre-edit\n // reconstruction would be anchored to the wrong place.\n for (const line of block) {\n if (line.kind !== \" \") continue;\n const n = Number.parseInt(line.lineNumber.trim(), 10);\n if (!Number.isFinite(n)) continue;\n if (fileLines[n - 1] !== expandTabs(line.content)) return null;\n }\n const prefixCount = Math.max(0, Math.min(anchor - 1, DIFF_REMOVED_CONTEXT_LINES));\n const prefix = fileLines.slice(anchor - 1 - prefixCount, anchor - 1);\n const removedContents = removed.map((row) => row.content);\n const contextContents = contextBefore.map((context) => context.content);\n const virtual = [...prefix, ...contextContents, ...removedContents];\n const cacheKey = `removed\\0${language}\\0${absolute}\\0${hashSourceText(virtual.join(\"\\n\"))}`;\n const covered = highlightSourceLines(\n cacheKey,\n virtual,\n language,\n prefixCount,\n virtual.length,\n invalidate,\n );\n if (!covered) return null;\n const out = new Map<number, string>();\n for (let index = 0; index < removed.length; index++) {\n const entry = covered[contextContents.length + index];\n if (entry && entry.raw === removed[index]!.content) out.set(removed[index]!.row, entry.ansi);\n }\n return out;\n};\n\nconst renderDiff = (\n diff: string,\n filePath: string,\n theme: Theme,\n options: CoreToolRenderOptions,\n limitOverride?: number,\n): RenderedCoreToolBody => {\n if (!diff) return { lines: [], hidden: 0 };\n const sourceLines = diff.split(\"\\n\");\n const limit = Math.max(1, Math.min(limitOverride ?? toolLimit({ ref: \"\", tool: \"edit\" }, options), options.maxLines));\n const shown = sourceLines.slice(0, limit);\n const hidden = sourceLines.length - shown.length;\n const parsed = shown.map(parseDiffLine);\n const width = diffLineNumberWidth(parsed);\n const skipHighlight =\n options.settings.syntaxHighlighting && diff.length > MAX_HIGHLIGHT_CHARS;\n const language =\n options.settings.syntaxHighlighting && !skipHighlight\n ? resolveLanguage(filePath)\n : undefined;\n const highlighted: Array<string | undefined> = Array.from({ length: shown.length }, () => undefined);\n if (language) {\n // Prefer the on-disk document: numbered diff lines whose content still\n // matches the file take fully state-correct tokens straight from its\n // coverage. Removed/rewritten lines of a successful edit (and proposed\n // edits whose file doesn't match) fail verification and fall through.\n if (filePath) {\n const numbered = postEditFileRows(parsed);\n if (numbered.length > 0) {\n let from = numbered[0]!.lineNumber;\n let to = from;\n for (let index = 1; index < numbered.length; index++) {\n const lineNumber = numbered[index]!.lineNumber;\n from = Math.min(from, lineNumber);\n to = Math.max(to, lineNumber);\n }\n from--;\n to++;\n const slice = highlightFileLines(\n resolve(options.cwd, filePath),\n language,\n from,\n to,\n options.invalidate,\n );\n if (slice) {\n for (const row of numbered) {\n const entry = slice[row.lineNumber - 1 - from];\n if (entry && entry.raw === expandTabs(parsed[row.index]!.content)) {\n highlighted[row.index] = entry.ansi;\n }\n }\n }\n }\n // Removed lines never verify against the post-edit file; recover their\n // grammar state from a virtual pre-edit document before falling back to\n // colorless fragment tokenization.\n const removedHighlighted = highlightRemovedDiffLines(\n parsed,\n filePath,\n language,\n options.cwd,\n options.invalidate,\n );\n if (removedHighlighted) {\n for (const [row, ansi] of removedHighlighted) {\n if (highlighted[row] === undefined) highlighted[row] = ansi;\n }\n }\n }\n // Remaining lines: tokenize the old and new side of each contiguous\n // segment as separate streams so removal-side comment/string state can\n // never bleed into added lines (and vice versa).\n let start = 0;\n while (start < parsed.length) {\n if (!parsed[start] || highlighted[start] !== undefined) {\n start++;\n continue;\n }\n let end = start;\n while (end < parsed.length && parsed[end] && highlighted[end] === undefined) end++;\n const oldOffsets: number[] = [];\n const newOffsets: number[] = [];\n const oldContent: string[] = [];\n const newContent: string[] = [];\n for (let offset = start; offset < end; offset++) {\n const line = parsed[offset]!;\n const content = expandTabs(line.content);\n if (line.kind !== \"+\") {\n oldOffsets.push(offset);\n oldContent.push(content);\n }\n if (line.kind !== \"-\") {\n newOffsets.push(offset);\n newContent.push(content);\n }\n }\n const oldRendered = oldContent.length\n ? highlightCode(oldContent.join(\"\\n\"), language, options.invalidate)\n : null;\n if (oldRendered) {\n for (let index = 0; index < oldOffsets.length; index++) {\n highlighted[oldOffsets[index]!] = oldRendered[index];\n }\n }\n const newRendered = newContent.length\n ? highlightCode(newContent.join(\"\\n\"), language, options.invalidate)\n : null;\n if (newRendered) {\n for (let index = 0; index < newOffsets.length; index++) {\n highlighted[newOffsets[index]!] = newRendered[index];\n }\n }\n start = end;\n }\n }\n const emphasis = wordEmphasisFor(parsed, options.settings.wordEmphasis);\n const emphasisColors = effectiveShikiThemeIsLight()\n ? { add: \"\\x1b[48;2;194;209;194m\", remove: \"\\x1b[48;2;216;182;182m\" }\n : { add: \"\\x1b[48;2;64;132;82m\", remove: \"\\x1b[48;2;148;62;70m\" };\n const lines = shown.map((raw, index) => {\n const line = parsed[index];\n if (!line) {\n const safe = escapeControlChars(raw);\n const trimmed = safe.trim();\n if (trimmed === \"...\") return theme.fg(\"muted\", \" --- unchanged lines hidden ---\");\n if (trimmed.startsWith(\"@@\")) return theme.fg(\"accent\", theme.bold(safe));\n if (\n trimmed.startsWith(\"---\") ||\n trimmed.startsWith(\"+++\") ||\n trimmed.startsWith(\"diff \") ||\n trimmed.startsWith(\"index \")\n ) {\n return theme.fg(\"muted\", safe);\n }\n return theme.fg(\"toolDiffContext\", safe);\n }\n const truncationNotice = isBashTruncationNotice(line.content);\n let content = truncationNotice\n ? theme.fg(\"muted\", escapeControlChars(line.content))\n : highlighted[index] ?? theme.fg(\"toolOutput\", escapeControlChars(expandTabs(line.content)) || \" \");\n const match = truncationNotice ? undefined : emphasis.get(index);\n if (match && match.ranges.length > 0) {\n content = injectVisibleRanges(\n content,\n match.ranges,\n match.kind === \"add\" ? emphasisColors.add : emphasisColors.remove,\n \"\\x1b[49m\",\n );\n }\n const lineNumber = formatDiffLineNumber(line.lineNumber, width);\n if (line.kind === \"+\") {\n return markDiffLine(\"add\", `${theme.fg(\"toolDiffAdded\", `+${lineNumber} \u2502 `)}${content}`);\n }\n if (line.kind === \"-\") {\n return markDiffLine(\"remove\", `${theme.fg(\"toolDiffRemoved\", `-${lineNumber} \u2502 `)}${content}`);\n }\n return `\\x1b[2m${theme.fg(\"toolDiffContext\", ` ${lineNumber} \u2502 `)}${content}\\x1b[22m`;\n });\n if (skipHighlight) {\n pushArcItem(lines, arcItem(theme, \"Syntax highlighting skipped for large diff\"));\n }\n return { lines, hidden };\n};\n\nconst renderRead = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: CoreToolRenderOptions,\n): RenderedCoreToolBody | null => {\n if (!options.expanded && !options.settings.readContentPreview) return null;\n const output = resultOutput(audit);\n if (output === undefined) return null;\n const filePath = argString(audit, \"path\") ?? \"\";\n if (/^Read image file/i.test(output)) {\n return { lines: [theme.fg(\"dim\", escapeControlChars(output))], hidden: 0 };\n }\n const truncated = nativeTruncated(audit);\n const { content, notice } =\n truncated || typeof audit.args?.limit === \"number\"\n ? splitReadContinuationNotice(output)\n : { content: output };\n const rendered = renderContent(content, filePath, theme, options, {\n lineNumbers: options.settings.readLineNumbers,\n firstLine: Math.max(1, Math.floor(numberOf(audit.args?.offset) ?? 1)),\n emptyLabel: \"Empty file\",\n skipLabel: \"Syntax highlighting skipped for large file\",\n });\n if (notice) pushArcItem(rendered.lines, arcItem(theme, notice));\n else if (truncated) pushArcItem(rendered.lines, arcItem(theme, \"Output truncated by read\"));\n return rendered;\n};\n\nconst getWriteBefore = (audit: FabricRenderAudit): unknown => {\n const details = resultDetails(audit);\n return details?.codePreviewBeforeWrite ?? recordOf(audit.preview)?.codePreviewBeforeWrite;\n};\n\nconst bashCommand = (audit: FabricRenderAudit): string =>\n stringOf(recordOf(audit.preview)?.bashCommand) ?? argString(audit, \"command\") ?? \"\";\n\nconst writeContent = (audit: FabricRenderAudit): string | undefined =>\n stringOf(recordOf(audit.preview)?.writeContent) ?? argString(audit, \"content\");\n\nconst renderWrite = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: CoreToolRenderOptions,\n): RenderedCoreToolBody | null => {\n if (!options.expanded && !options.settings.writeContentPreview) return null;\n const content = writeContent(audit);\n if (content === undefined) return null;\n const filePath = argString(audit, \"path\") ?? \"\";\n const before = getWriteBefore(audit);\n const beforeRecord = recordOf(before);\n if (audit.success === true && beforeRecord?.kind === \"content\") {\n const beforeContent = stringOf(beforeRecord.content);\n if (beforeContent === undefined) {\n return {\n lines: [\n theme.fg(\"success\", \"\u2713 Write applied\") +\n theme.fg(\"muted\", \" \u00B7 previous content unavailable\"),\n ],\n hidden: 0,\n };\n }\n if (beforeContent === content) {\n return { lines: [theme.fg(\"muted\", \"\u2713 Write applied \u00B7 no changes\")], hidden: 0 };\n }\n if (shouldSkipWriteDiffBytes(beforeContent, content)) {\n return {\n lines: [\n theme.fg(\"success\", \"\u2713 Write applied\") +\n theme.fg(\"muted\", \" \u00B7 diff skipped for large content\"),\n ],\n hidden: 0,\n };\n }\n if (shouldSkipWriteDiffComplexity(beforeContent, content)) {\n return {\n lines: [\n theme.fg(\"success\", \"\u2713 Write applied\") +\n theme.fg(\"muted\", \" \u00B7 diff skipped for complex rewrite\"),\n ],\n hidden: 0,\n };\n }\n const diff = createSimpleDiff(beforeContent, content);\n const summary = summarizeDiff(diff);\n const header =\n `${theme.fg(\"success\", \"\u2713 Write applied\")} ${theme.fg(\"muted\", describeDiffShape(summary))}` +\n theme.fg(\"muted\", \" \u00B7 \") +\n theme.fg(\"success\", `+${summary.additions}`) +\n \" \" +\n theme.fg(\"error\", `-${summary.removals}`);\n const rendered = renderDiff(diff, filePath, theme, options);\n return { lines: [header, ...rendered.lines], hidden: rendered.hidden };\n }\n if (audit.success === true && beforeRecord?.kind === \"skipped\") {\n let reason = stringOf(beforeRecord.reason) ?? \"preview unavailable\";\n const byteLength = numberOf(beforeRecord.byteLength);\n const maxBytes = numberOf(beforeRecord.maxBytes);\n if (byteLength !== undefined) {\n reason += beforeRecord.sizeExceeded === true && maxBytes !== undefined\n ? ` (${formatBytes(byteLength)} > ${formatBytes(maxBytes)})`\n : ` (${formatBytes(byteLength)})`;\n }\n return {\n lines: [\n theme.fg(\"success\", \"\u2713 Write applied\") +\n theme.fg(\"muted\", ` \u00B7 diff skipped: ${reason}`),\n ],\n hidden: 0,\n };\n }\n if (audit.success === true && recordOf(audit.preview)?.writeBeforeCaptured === true && before === undefined) {\n const rendered = renderContent(content, filePath, theme, options, {\n emptyLabel: \"Empty content\",\n skipLabel: \"Syntax highlighting skipped for large content\",\n });\n return {\n lines: [\n theme.fg(\"success\", `\u2713 New file (${countLabel(countContentLines(content), \"line\")})`),\n ...rendered.lines,\n ],\n hidden: rendered.hidden,\n };\n }\n return renderContent(content, filePath, theme, options, {\n emptyLabel: \"Empty content\",\n skipLabel: \"Syntax highlighting skipped for large content\",\n });\n};\n\nconst editOperations = (audit: FabricRenderAudit): Array<{ oldText: string; newText: string }> => {\n const edits = Array.isArray(audit.args?.edits) ? audit.args.edits : [];\n return edits.flatMap((edit) => {\n const record = recordOf(edit);\n const oldText = stringOf(record?.oldText) ?? stringOf(record?.old_text);\n const newText = stringOf(record?.newText) ?? stringOf(record?.new_text);\n return oldText !== undefined && newText !== undefined && oldText !== newText\n ? [{ oldText, newText }]\n : [];\n });\n};\n\nconst renderEdit = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: CoreToolRenderOptions,\n): RenderedCoreToolBody | null => {\n if (!options.expanded && !options.settings.editDiffPreview) return null;\n const filePath = argString(audit, \"path\") ?? \"\";\n const actual = stringOf(resultDetails(audit)?.diff);\n if (actual) {\n const summary = summarizeDiff(actual);\n const header =\n theme.fg(\"muted\", countLabel(summary.hunks, \"hunk\")) +\n theme.fg(\"muted\", \" \u00B7 \") +\n theme.fg(\"success\", `+${summary.additions}`) +\n \" \" +\n theme.fg(\"error\", `-${summary.removals}`);\n const rendered = renderDiff(actual, filePath, theme, options);\n return { lines: [header, ...rendered.lines], hidden: rendered.hidden };\n }\n const operations = editOperations(audit);\n if (operations.length === 0) {\n if (audit.fromTrace) {\n // The durable trace keeps only the edited path (edits/diff are not\n // persisted), so resumed edits have no diff to expand into.\n return { lines: [theme.fg(\"dim\", \"diff not retained across reload\")], hidden: 0 };\n }\n return null;\n }\n const maxOperations = Math.min(operations.length, 3);\n const sections: string[] = [];\n let additions = 0;\n let removals = 0;\n let hidden = 0;\n const perOperation = Math.max(8, Math.floor(toolLimit(audit, options) / maxOperations));\n for (let index = 0; index < maxOperations; index++) {\n const operation = operations[index]!;\n const diff = createSimpleDiff(operation.oldText, operation.newText);\n const summary = summarizeDiff(diff);\n additions += summary.additions;\n removals += summary.removals;\n if (operations.length > 1) sections.push(theme.fg(\"muted\", `Proposed edit ${index + 1}/${operations.length}`));\n const rendered = renderDiff(diff, filePath, theme, options, perOperation);\n sections.push(...rendered.lines);\n hidden += rendered.hidden;\n }\n const header = `${theme.fg(\"muted\", \"proposed edit\")} ${theme.fg(\"success\", `+${additions}`)} ${theme.fg(\"error\", `-${removals}`)}${\n operations.length > 1 ? theme.fg(\"muted\", ` \u00B7 ${operations.length} edit blocks`) : \"\"\n }`;\n if (operations.length > maxOperations) {\n pushArcItem(sections, arcItem(theme, `Showing ${maxOperations} of ${operations.length} edit blocks`));\n }\n return { lines: [header, ...sections], hidden };\n};\n\nconst grepMatchRanges = (\n code: string,\n pattern: string,\n literal: boolean,\n ignoreCase: boolean,\n): Array<[number, number]> => {\n if (!literal || !pattern) return [];\n const haystack = ignoreCase ? code.toLowerCase() : code;\n const needle = ignoreCase ? pattern.toLowerCase() : pattern;\n const ranges: Array<[number, number]> = [];\n let index = haystack.indexOf(needle);\n while (index >= 0) {\n ranges.push([index, index + needle.length]);\n index = haystack.indexOf(needle, index + needle.length);\n }\n return ranges;\n};\n\ntype GrepParsedRow = {\n filePath: string;\n lineNumber: number;\n lineNumberLabel: string;\n code: string;\n isMatch: boolean;\n};\n\nconst parseGrepRow = (raw: string): GrepParsedRow | null => {\n const match = raw.match(/^(.+):(\\d+):\\s(.*)$/);\n const context = raw.match(/^(.+)-(\\d+)-\\s(.*)$/);\n const parsed = match ?? context;\n if (!parsed) return null;\n const lineNumberLabel = parsed[2] ?? \"\";\n const lineNumber = Number.parseInt(lineNumberLabel, 10);\n return {\n filePath: parsed[1] ?? \"\",\n lineNumber: Number.isFinite(lineNumber) ? lineNumber : 0,\n lineNumberLabel,\n code: expandTabs(parsed[3] ?? \"\"),\n isMatch: Boolean(match),\n };\n};\n\n// Tokenize one run of consecutive same-file grep rows. Preferred source is\n// the on-disk file's coverage (correct grammar state across excerpt edges,\n// e.g. a doc comment whose opener sits above the match); otherwise the whole\n// run is tokenized as a single unit so adjacent lines still share state.\nconst highlightGrepRun = (\n run: GrepParsedRow[],\n language: string | undefined,\n options: CoreToolRenderOptions,\n): Array<string | undefined> => {\n if (!language) return run.map(() => undefined);\n const first = run[0]!;\n const last = run[run.length - 1]!;\n const slice = highlightFileLines(\n resolve(options.cwd, first.filePath),\n language,\n first.lineNumber - 1,\n last.lineNumber,\n options.invalidate,\n );\n if (slice && slice.every((line, index) => line.raw === run[index]!.code)) {\n return slice.map((line) => line.ansi);\n }\n const rendered = highlightCode(\n run.map((row) => row.code).join(\"\\n\"),\n language,\n options.invalidate,\n );\n return run.map((_, index) => rendered?.[index]);\n};\n\nconst renderGrepRowLine = (\n row: GrepParsedRow,\n highlighted: string,\n audit: FabricRenderAudit,\n theme: Theme,\n): string => {\n let content = highlighted;\n if (row.isMatch) {\n const ranges = grepMatchRanges(\n row.code,\n argString(audit, \"pattern\") ?? \"\",\n audit.args?.literal === true,\n audit.args?.ignoreCase === true,\n );\n if (ranges.length > 0) {\n content = injectVisibleRanges(\n content,\n ranges,\n effectiveShikiThemeIsLight() ? \"\\x1b[48;2;234;225;171m\" : \"\\x1b[48;2;90;74;28m\",\n \"\\x1b[49m\",\n );\n }\n }\n const number = row.isMatch\n ? theme.fg(\"accent\", row.lineNumberLabel.padStart(4, \" \"))\n : theme.fg(\"dim\", row.lineNumberLabel.padStart(4, \" \"));\n const marker = row.isMatch ? theme.fg(\"warning\", \"\u2502\") : theme.fg(\"dim\", \"\u2506\");\n return `${theme.fg(\"dim\", \" \")}${number} ${marker} ${content}`;\n};\n\nconst renderGrep = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: CoreToolRenderOptions,\n): RenderedCoreToolBody | null => {\n if (!options.expanded && !options.settings.grepResultPreview) return null;\n const output = resultOutput(audit)?.replace(/\\r?\\n$/, \"\");\n if (!output || output === \"No matches found\") {\n return { lines: [theme.fg(\"muted\", output || \"No matches found\")], hidden: 0 };\n }\n const raw = output.split(\"\\n\");\n const skipHighlight =\n options.settings.syntaxHighlighting && output.length > MAX_HIGHLIGHT_CHARS;\n const syntaxOn = options.settings.syntaxHighlighting && !skipHighlight;\n const selected = previewEntries(raw, toolLimit(audit, options));\n const lines: string[] = [];\n let currentPath = \"\";\n let currentLanguage: string | undefined;\n let run: GrepParsedRow[] = [];\n\n const flushRun = (): void => {\n if (run.length === 0) return;\n const highlighted = syntaxOn ? highlightGrepRun(run, currentLanguage, options) : [];\n for (let index = 0; index < run.length; index++) {\n const row = run[index]!;\n const content = highlighted[index] ?? theme.fg(\"toolOutput\", escapeControlChars(row.code));\n lines.push(renderGrepRowLine(row, content, audit, theme));\n }\n run = [];\n };\n\n for (const entry of selected.entries) {\n if (entry.kind === \"hidden\") {\n flushRun();\n lines.push(theme.fg(\"muted\", ` --- ${entry.hidden} lines hidden ---`));\n currentPath = \"\";\n currentLanguage = undefined;\n continue;\n }\n const row = parseGrepRow(entry.line);\n if (!row) {\n flushRun();\n lines.push(\n entry.line.startsWith(\"[\") && entry.line.endsWith(\"]\")\n ? theme.fg(\"warning\", escapeControlChars(entry.line))\n : theme.fg(\"toolOutput\", escapeControlChars(entry.line) || \" \"),\n );\n continue;\n }\n if (row.filePath !== currentPath) {\n flushRun();\n currentPath = row.filePath;\n currentLanguage = syntaxOn ? languageFromPath(row.filePath) : undefined;\n lines.push(theme.fg(\"accent\", escapeControlChars(row.filePath)));\n run.push(row);\n continue;\n }\n const previous = run[run.length - 1];\n if (!previous || row.lineNumber !== previous.lineNumber + 1) {\n flushRun();\n }\n run.push(row);\n }\n flushRun();\n if (skipHighlight) {\n pushArcItem(lines, arcItem(theme, \"Syntax highlighting skipped for large grep output\"));\n }\n return { lines, hidden: selected.hidden };\n};\n\nconst NERD_BY_NAME: Record<string, string> = {\n \"package.json\": \"\uE718\",\n \"package-lock.json\": \"\uE718\",\n \"tsconfig.json\": \"\uE628\",\n \"readme.md\": \"\uE73E\",\n license: \"\uE60A\",\n dockerfile: \"\uE7B0\",\n makefile: \"\uE615\",\n \".gitignore\": \"\uE702\",\n \".env\": \"\uE615\",\n \".envrc\": \"\uE795\",\n};\n\nconst NERD_BY_EXTENSION: Record<string, string> = {\n ts: \"\uE628\", tsx: \"\uE7BA\", js: \"\uE74E\", jsx: \"\uE7BA\", json: \"\uE60B\", md: \"\uE73E\", py: \"\uE73C\", rs: \"\uE7A8\",\n go: \"\uE627\", java: \"\uE738\", rb: \"\uE739\", php: \"\uE73D\", html: \"\uE736\", css: \"\uE749\", scss: \"\uE749\",\n yaml: \"\uE615\", yml: \"\uE615\", toml: \"\uE6B2\", sh: \"\uE795\", bash: \"\uE795\", zsh: \"\uE795\", sql: \"\uE706\",\n xml: \"\uE619\", png: \"\uF1C5\", jpg: \"\uF1C5\", jpeg: \"\uF1C5\", gif: \"\uF1C5\", svg: \"\uF1C5\",\n};\n\nconst pathIcon = (\n filePath: string,\n directory: boolean,\n mode: CodePreviewSettings[\"pathIcons\"],\n): string => {\n if (mode === \"off\") return \"\";\n if (mode === \"unicode\") return directory ? \"\u25B8\" : \"\u2022\";\n if (directory) return \"\uE5FF\";\n const name = basename(filePath).toLowerCase();\n return NERD_BY_NAME[name] ?? NERD_BY_EXTENSION[extname(name).slice(1)] ?? \"\uF15B\";\n};\n\nconst renderPathList = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: CoreToolRenderOptions,\n): RenderedCoreToolBody | null => {\n const enabled = audit.tool === \"find\" ? options.settings.findResultPreview : options.settings.lsResultPreview;\n if (!options.expanded && !enabled) return null;\n const output = resultOutput(audit)?.replace(/\\r?\\n$/, \"\") ?? \"\";\n const emptyMarker = audit.tool === \"find\" ? \"No files found matching pattern\" : \"(empty directory)\";\n if (!output || output === emptyMarker) {\n return {\n lines: [theme.fg(\"muted\", audit.tool === \"find\" ? output || \"No files found\" : \"Empty directory\")],\n hidden: 0,\n };\n }\n const raw = output.split(\"\\n\");\n if (options.expanded && !enabled) {\n return {\n lines: raw.map((line) => theme.fg(\"toolOutput\", escapeControlChars(line) || \" \")),\n hidden: 0,\n };\n }\n const selected = previewEntries(raw, toolLimit(audit, options));\n const lines: string[] = [];\n let chunk: string[] = [];\n const flush = (): void => {\n if (chunk.length === 0) return;\n const shouldTree = chunk\n .filter((line) => line && !(line.startsWith(\"[\") && line.endsWith(\"]\")))\n .some((line) => line.includes(\"/\"));\n const seenDirectories = new Set<string>();\n for (const rawPath of chunk) {\n if (rawPath.startsWith(\"[\") && rawPath.endsWith(\"]\")) {\n lines.push(theme.fg(\"warning\", escapeControlChars(rawPath)));\n continue;\n }\n if (!rawPath) {\n lines.push(\"\");\n continue;\n }\n if (!shouldTree) {\n const leading = rawPath.match(/^\\s*/)?.[0] ?? \"\";\n const body = rawPath.slice(leading.length);\n const directory = body.endsWith(\"/\");\n const icon = pathIcon(body, directory, options.settings.pathIcons);\n const iconText = icon ? leading + icon : leading;\n lines.push(\n `${theme.fg(\"dim\", iconText)}${icon ? \" \" : \"\"}${renderPath(body, options.cwd, theme, body)}`,\n );\n continue;\n }\n const clean = rawPath.replace(/^\\.\\//, \"\");\n const directory = clean.endsWith(\"/\");\n const parts = clean.replace(/\\/$/, \"\").split(\"/\").filter(Boolean);\n let prefix = \"\";\n for (let index = 0; index < parts.length; index++) {\n const part = parts[index]!;\n const leaf = index === parts.length - 1;\n const key = prefix ? `${prefix}/${part}` : part;\n const isDirectory = !leaf || directory;\n if (!isDirectory || !seenDirectories.has(key)) {\n if (isDirectory) seenDirectories.add(key);\n const icon = pathIcon(part, isDirectory, options.settings.pathIcons);\n const indent = \" \".repeat(index);\n const label = isDirectory\n ? theme.fg(\"accent\", `${escapeControlChars(part)}/`)\n : theme.fg(\"toolOutput\", escapeControlChars(part));\n lines.push(`${theme.fg(\"dim\", indent + icon)}${icon ? \" \" : \"\"}${label}`);\n }\n prefix = key;\n }\n }\n chunk = [];\n };\n for (const entry of selected.entries) {\n if (entry.kind === \"hidden\") {\n flush();\n lines.push(theme.fg(\"muted\", ` --- ${entry.hidden} lines hidden ---`));\n } else {\n chunk.push(entry.line);\n }\n }\n flush();\n return { lines, hidden: selected.hidden };\n};\n\nconst renderBash = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: CoreToolRenderOptions,\n): RenderedCoreToolBody | null => {\n const commandName = audit.tool === \"bash\"\n ? firstShellCommandName(bashCommand(audit))\n : \"\";\n const resultEnabled =\n options.settings.bashResultPreview &&\n (commandName === \"grep\" || commandName === \"egrep\" || commandName === \"fgrep\"\n ? options.settings.grepResultPreview\n : commandName === \"find\"\n ? options.settings.findResultPreview\n : commandName === \"ls\"\n ? options.settings.lsResultPreview\n : true);\n if (!options.expanded && !resultEnabled) return null;\n const command = bashCommand(audit);\n // Shiki's tokenizer only splits on \"\\n\"; escape remaining control characters\n // (\\r -> visible glyph) rather than folding them into line breaks, so the\n // highlighted array stays row-aligned with commandLines and trailing rows\n // can't drift into the plain fallback as duplicated lines.\n const displayCommand = escapeControlChars(command.replace(/\\r\\n/g, \"\\n\"));\n const commandLines = displayCommand.split(\"\\n\");\n const highlightedCommand = command\n ? highlightCode(\n displayCommand,\n \"bash\",\n options.invalidate,\n )\n : null;\n const lines = commandLines.slice(1).map((line, index) =>\n `${theme.fg(\"dim\", \" \")}${highlightedCommand?.[index + 1] ?? theme.fg(\"accent\", line)}`,\n );\n const output = resultOutput(audit)?.replace(/\\r?\\n$/, \"\") ?? \"\";\n if (!output || output === \"(no output)\") {\n if (!output && audit.fromTrace) {\n // Trace-derived audits never retain results, so an empty output slot\n // after a session reload means \"not persisted\", not \"no output\".\n return { lines: [...lines, theme.fg(\"dim\", \"output not retained across reload\")], hidden: 0 };\n }\n return {\n lines: [...lines, theme.fg(\"muted\", output || \"No output\")],\n hidden: 0,\n };\n }\n const raw = output.split(\"\\n\");\n const selected = previewEntries(raw, toolLimit(audit, options));\n const warning = warningLine(output, options, theme);\n if (warning) lines.push(warning);\n for (const entry of selected.entries) {\n if (entry.kind === \"hidden\") {\n lines.push(theme.fg(\"muted\", ` --- ${entry.hidden} lines hidden ---`));\n continue;\n }\n const text = theme.fg(audit.success === false ? \"error\" : \"muted\", escapeControlChars(entry.line) || \" \");\n lines.push(text);\n }\n if (nativeTruncated(audit)) {\n pushArcItem(lines, arcItem(theme, `Output truncated by ${audit.tool ?? \"shell\"}`));\n }\n const fullOutputPath = stringOf(resultDetails(audit)?.fullOutputPath);\n if (fullOutputPath) pushArcItem(lines, arcItem(theme, `Full output: ${escapeControlChars(fullOutputPath)}`));\n return { lines, hidden: selected.hidden };\n};\n\nexport const coreToolRendererEnabled = (\n audit: FabricRenderAudit,\n settings: CodePreviewSettings,\n): boolean =>\n isCoreToolAudit(audit) &&\n audit.tool !== undefined &&\n settings.tools.includes(audit.tool as CodePreviewSettings[\"tools\"][number]);\n\nexport const coreToolPreviewEnabled = (\n audit: FabricRenderAudit,\n settings: CodePreviewSettings,\n): boolean => {\n if (!coreToolRendererEnabled(audit, settings)) return true;\n switch (audit.tool) {\n case \"read\":\n return settings.readContentPreview;\n case \"write\":\n return settings.writeContentPreview;\n case \"edit\":\n return settings.editDiffPreview;\n case \"grep\":\n return settings.grepResultPreview;\n case \"find\":\n return settings.findResultPreview;\n case \"ls\":\n return settings.lsResultPreview;\n case \"bash\": {\n if (!settings.bashResultPreview) return false;\n const command = firstShellCommandName(bashCommand(audit));\n if (command === \"grep\" || command === \"egrep\" || command === \"fgrep\") {\n return settings.grepResultPreview;\n }\n if (command === \"find\") return settings.findResultPreview;\n if (command === \"ls\") return settings.lsResultPreview;\n return true;\n }\n default:\n return true;\n }\n};\n\nexport const renderCoreToolBody = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: CoreToolRenderOptions,\n): RenderedCoreToolBody | null => {\n observeOmpTheme(theme);\n if (!coreToolRendererEnabled(audit, options.settings) || !audit.tool) return null;\n switch (audit.tool) {\n case \"read\":\n return renderRead(audit, theme, options);\n case \"write\":\n return renderWrite(audit, theme, options);\n case \"edit\":\n return renderEdit(audit, theme, options);\n case \"grep\":\n return renderGrep(audit, theme, options);\n case \"find\":\n case \"ls\":\n return renderPathList(audit, theme, options);\n case \"bash\":\n return renderBash(audit, theme, options);\n default:\n return null;\n }\n};\n\nexport const coreToolTitle = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: Pick<CoreToolRenderOptions, \"cwd\" | \"settings\" | \"invalidate\">,\n): string | null => {\n observeOmpTheme(theme);\n if (!coreToolRendererEnabled(audit, options.settings) || !audit.tool) return null;\n const title = theme.fg(\"toolTitle\", theme.bold(audit.tool));\n const timing = options.settings.toolCallTiming\n ? formatToolCallDuration(audit.startedAt, audit.endedAt)\n : undefined;\n const filePath = argString(audit, \"path\") ?? \"\";\n if (audit.tool === \"bash\") {\n const command = bashCommand(audit);\n const firstLine = command.split(\"\\n\")[0] ?? \"\";\n const language = \"bash\";\n const highlighted = firstLine ? highlightCode(firstLine, language, options.invalidate)?.[0] : undefined;\n const timeout = numberOf(audit.args?.timeout);\n const warnings = options.settings.bashWarnings\n ? bashWarnings(command)\n : [];\n const prompt = \"$\";\n return `${title} ${theme.fg(\"dim\", prompt)} ${highlighted ?? theme.fg(\"accent\", escapeControlChars(firstLine))}${metadata(theme, [\n timeout !== undefined ? `timeout ${timeout}s` : undefined,\n warnings.length > 0 ? `\u26A0 ${warnings.join(\", \")}` : undefined,\n timing,\n ])}`;\n }\n if (audit.tool === \"grep\") {\n const pattern = argString(audit, \"pattern\") ?? \"\";\n const glob = argString(audit, \"glob\");\n const limit = numberOf(audit.args?.limit);\n return `${title} ${theme.fg(\"accent\", `/${escapeControlChars(pattern)}/`)} ${theme.fg(\"muted\", \"in\")} ${renderPath(filePath || \".\", options.cwd, theme)}${metadata(theme, [\n glob ? escapeControlChars(glob) : undefined,\n limit !== undefined ? `limit ${limit}` : undefined,\n timing,\n ])}`;\n }\n if (audit.tool === \"find\") {\n const pattern = argString(audit, \"pattern\") || \"*\";\n return `${title} ${theme.fg(\"accent\", escapeControlChars(pattern))} ${theme.fg(\"muted\", \"in\")} ${renderPath(filePath || \".\", options.cwd, theme)}${metadata(theme, [timing])}`;\n }\n if (audit.tool === \"ls\") {\n return `${title} ${renderPath(filePath || \".\", options.cwd, theme)}${metadata(theme, [timing])}`;\n }\n if (audit.tool === \"read\") {\n const offset = numberOf(audit.args?.offset);\n const limit = numberOf(audit.args?.limit);\n const range = offset !== undefined || limit !== undefined\n ? theme.fg(\"warning\", `:${offset ?? 1}${limit !== undefined ? `-${(offset ?? 1) + limit - 1}` : \"\"}`)\n : \"\";\n return `${title} ${renderPath(filePath, options.cwd, theme)}${range}${metadata(theme, [\n languageFromPath(filePath),\n timing,\n ])}`;\n }\n if (audit.tool === \"write\") {\n const content = writeContent(audit);\n const rendererPreview = recordOf(audit.preview);\n const byteLength = numberOf(rendererPreview?.writeByteLength) ??\n (content !== undefined ? Buffer.byteLength(content, \"utf8\") : undefined);\n const lineCount = numberOf(rendererPreview?.writeLineCount) ??\n (content !== undefined ? countContentLines(content) : undefined);\n return `${title} ${renderPath(filePath, options.cwd, theme)}${metadata(theme, [\n byteLength !== undefined ? formatBytes(byteLength) : undefined,\n lineCount !== undefined ? countLabel(lineCount, \"line\") : undefined,\n languageFromPath(filePath),\n timing,\n ])}`;\n }\n return `${title} ${renderPath(filePath, options.cwd, theme)}${metadata(theme, [timing])}`;\n};\n", "export const formatToolCallDuration = (\n startedAt: number | undefined,\n endedAt: number | undefined,\n): string | undefined => {\n if (startedAt === undefined || endedAt === undefined) return undefined;\n const durationMs = Math.max(0, endedAt - startedAt);\n return durationMs < 1_000\n ? `${durationMs}ms`\n : `${(durationMs / 1_000).toFixed(1)}s`;\n};\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { Theme } from \"@oh-my-pi/pi-coding-agent\";\nimport { truncateToWidth, visibleWidth } from \"@oh-my-pi/pi-tui\";\nimport { ansi256ToRgb, observedThemeVariant } from \"./highlight.js\";\n\nexport type DiffBackgroundIntensity = \"off\" | \"subtle\" | \"medium\";\nexport type DiffLineKind = \"add\" | \"remove\";\n\nconst DIFF_ADD_MARKER = \"\\u0000PI_DIFF_ADD\\u0000\";\nconst DIFF_REMOVE_MARKER = \"\\u0000PI_DIFF_REMOVE\\u0000\";\n\nexport const markDiffLine = (kind: DiffLineKind, line: string): string =>\n (kind === \"add\" ? DIFF_ADD_MARKER : DIFF_REMOVE_MARKER) + line;\n\nexport const parseMarkedDiffLine = (\n rawLine: string,\n): { kind?: DiffLineKind; line: string } => {\n const addIndex = rawLine.indexOf(DIFF_ADD_MARKER);\n if (addIndex >= 0) {\n return {\n kind: \"add\",\n line: rawLine.slice(0, addIndex) + rawLine.slice(addIndex + DIFF_ADD_MARKER.length),\n };\n }\n const removeIndex = rawLine.indexOf(DIFF_REMOVE_MARKER);\n if (removeIndex >= 0) {\n return {\n kind: \"remove\",\n line: rawLine.slice(0, removeIndex) + rawLine.slice(removeIndex + DIFF_REMOVE_MARKER.length),\n };\n }\n return { line: rawLine };\n};\n\nexport const createDiffBackgroundResolver = (\n theme: Theme | undefined,\n intensity: DiffBackgroundIntensity,\n): ((kind: DiffLineKind) => string | undefined) => {\n if (intensity === \"off\") return () => undefined;\n const cache: Partial<Record<DiffLineKind, string>> = {};\n return (kind) =>\n (cache[kind] ??=\n deriveDiffBg(kind, theme, intensity === \"medium\" ? 0.24 : 0.14) ??\n fallbackDiffBg(kind, intensity));\n};\n\nexport const applyDiffBackground = (\n line: string,\n background: string | undefined,\n): string => {\n if (!background) return line;\n const colored = line\n .replace(/\\x1b\\[0m/g, \"\\x1b[0m\" + background)\n .replace(/\\x1b\\[39m/g, \"\\x1b[39m\" + background)\n .replace(/\\x1b\\[49m/g, \"\\x1b[49m\" + background);\n return background + colored;\n};\n\nconst fallbackDiffBg = (\n kind: DiffLineKind,\n intensity: Exclude<DiffBackgroundIntensity, \"off\">,\n): string => {\n if (observedThemeVariant() === \"light\") {\n if (kind === \"add\") {\n return intensity === \"medium\" ? \"\\x1b[48;2;170;222;186m\" : \"\\x1b[48;2;198;230;206m\";\n }\n return intensity === \"medium\" ? \"\\x1b[48;2;236;178;184m\" : \"\\x1b[48;2;242;206;210m\";\n }\n if (kind === \"add\") {\n return intensity === \"medium\" ? \"\\x1b[48;2;22;68;40m\" : \"\\x1b[48;2;10;42;26m\";\n }\n return intensity === \"medium\" ? \"\\x1b[48;2;78;36;40m\" : \"\\x1b[48;2;50;24;30m\";\n};\n\nconst deriveDiffBg = (\n kind: DiffLineKind,\n theme: Theme | undefined,\n intensity: number,\n): string | undefined => {\n const themed = theme as\n | (Theme & { getFgAnsi?: (key: string) => string; getBgAnsi?: (key: string) => string })\n | undefined;\n const fg = themed?.getFgAnsi?.(kind === \"add\" ? \"toolDiffAdded\" : \"toolDiffRemoved\");\n const fgRgb = parseAnsiRgb(fg ?? \"\");\n if (!fgRgb) return undefined;\n const base =\n parseAnsiRgb(themed?.getBgAnsi?.(kind === \"add\" ? \"toolSuccessBg\" : \"toolErrorBg\") ?? \"\") ??\n parseAnsiRgb(themed?.getBgAnsi?.(\"toolSuccessBg\") ?? \"\") ??\n (observedThemeVariant() === \"light\" ? { r: 255, g: 255, b: 255 } : { r: 0, g: 0, b: 0 });\n return `\\x1b[48;2;${Math.round(base.r + (fgRgb.r - base.r) * intensity)};${Math.round(base.g + (fgRgb.g - base.g) * intensity)};${Math.round(base.b + (fgRgb.b - base.b) * intensity)}m`;\n};\n\nconst PRINTABLE_ASCII_RE = /^[\\x20-\\x7e]*$/;\nconst TRUNCATION_SAFE_RE = /^(?:[\\x20-\\x7e\\t]|\\x1b\\[[0-9;]*m)*$/;\nconst segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport const wrapDiffAnsiToWidth = (\n text: string,\n width: number,\n maxRows = 3,\n continuationPrefix = \"\",\n): string[] => {\n if (width <= 0) return [\"\"];\n const rows: string[] = [];\n let row = \"\";\n let rowWidth = 0;\n let index = 0;\n let state = \"\";\n const continuationWidth = visibleWidth(continuationPrefix);\n\n const pushRow = (): boolean => {\n rows.push(truncateWrappedRow(row, rowWidth, width));\n if (rows.length >= maxRows) {\n truncateLastRow(rows, width);\n return false;\n }\n row = continuationPrefix ? state + continuationPrefix : state;\n rowWidth = continuationWidth;\n return true;\n };\n\n while (index < text.length) {\n const ansi = extractSgr(text, index);\n if (ansi) {\n row += ansi.sequence;\n state = updateAnsiState(state, ansi.sequence);\n index += ansi.sequence.length;\n continue;\n }\n\n const nextAnsi = text.indexOf(\"\\x1b\", index);\n const plainEnd = nextAnsi >= 0 ? nextAnsi : text.length;\n const plain = text.slice(index, plainEnd);\n const remainingWidth = width - rowWidth;\n if (plain.length <= remainingWidth && PRINTABLE_ASCII_RE.test(plain)) {\n row += plain;\n rowWidth += plain.length;\n } else {\n for (const { segment } of segmenter.segment(plain)) {\n const segmentWidth = visibleWidth(segment);\n if (rowWidth > 0 && rowWidth + segmentWidth > width && !pushRow()) return rows;\n if (rowWidth > 0 && rowWidth + segmentWidth > width) {\n row = state;\n rowWidth = 0;\n }\n if (segmentWidth > width && rowWidth === 0) {\n const clipped = truncateToWidth(segment, width, \"\");\n if (clipped) {\n row += clipped;\n rowWidth += visibleWidth(clipped);\n }\n if (!pushRow()) return rows;\n continue;\n }\n row += segment;\n rowWidth += segmentWidth;\n }\n }\n index = plainEnd;\n }\n\n rows.push(truncateWrappedRow(row, rowWidth, width));\n if (rows.length > maxRows) return truncateLastRow(rows.slice(0, maxRows), width);\n return rows;\n};\n\nconst truncateWrappedRow = (row: string, rowWidth: number, width: number): string => {\n if (rowWidth <= width && TRUNCATION_SAFE_RE.test(row)) return row;\n return truncateToWidth(row, width, \"\");\n};\n\nconst truncateLastRow = (rows: string[], width: number): string[] => {\n const last = rows.at(-1) ?? \"\";\n if (visibleWidth(last) >= width && width > 1) {\n rows[rows.length - 1] = truncateToWidth(last, width - 1, \"\") + \"\u203A\";\n }\n return rows;\n};\n\nconst extractSgr = (text: string, index: number): { sequence: string } | undefined => {\n if (text[index] !== \"\\x1b\" || text[index + 1] !== \"[\") return undefined;\n let end = index + 2;\n while (end < text.length && text[end] !== \"m\") end++;\n if (end >= text.length) return undefined;\n return { sequence: text.slice(index, end + 1) };\n};\n\nconst updateAnsiState = (current: string, sequence: string): string => {\n if (sequence === \"\\x1b[0m\") return \"\";\n if (/^\\x1b\\[3(?:8;[^m]+|9)m$/.test(sequence)) {\n return replaceAnsi(current, /\\x1b\\[3(?:8;[^m]+|9)m/g, sequence === \"\\x1b[39m\" ? \"\" : sequence);\n }\n if (/^\\x1b\\[4(?:8;[^m]+|9)m$/.test(sequence)) {\n return replaceAnsi(current, /\\x1b\\[4(?:8;[^m]+|9)m/g, sequence === \"\\x1b[49m\" ? \"\" : sequence);\n }\n if (sequence === \"\\x1b[22m\") return current.replace(/\\x1b\\[(?:1|2)m/g, \"\");\n if (sequence === \"\\x1b[1m\") return replaceAnsi(current, /\\x1b\\[1m/g, sequence);\n if (sequence === \"\\x1b[2m\") return replaceAnsi(current, /\\x1b\\[2m/g, sequence);\n if (sequence === \"\\x1b[3m\" || sequence === \"\\x1b[23m\") {\n return replaceAnsi(current, /\\x1b\\[(?:3|23)m/g, sequence === \"\\x1b[23m\" ? \"\" : sequence);\n }\n if (sequence === \"\\x1b[4m\" || sequence === \"\\x1b[24m\") {\n return replaceAnsi(current, /\\x1b\\[(?:4|24)m/g, sequence === \"\\x1b[24m\" ? \"\" : sequence);\n }\n return current + sequence;\n};\n\nconst replaceAnsi = (current: string, pattern: RegExp, replacement: string): string =>\n current.replace(pattern, \"\") + replacement;\n\nconst parseAnsiRgb = (ansi: string): { r: number; g: number; b: number } | undefined => {\n const match = ansi.match(/\\x1b\\[(?:38|48);2;(\\d+);(\\d+);(\\d+)m/);\n if (match) return { r: Number(match[1]), g: Number(match[2]), b: Number(match[3]) };\n const indexed = ansi.match(/\\x1b\\[(?:38|48);5;(\\d+)m/);\n if (indexed) return ansi256ToRgb(Number(indexed[1]));\n return undefined;\n};\n", "export const expandPreviewTabs = (text: string): string => text.replace(/\\t/g, \" \");\n\nexport const escapeControlChars = (text: string): string =>\n text\n .replace(/\\x1b/g, \"\u241B\")\n .replace(/\\r/g, \"\u240D\")\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\x9f]/g, \"\uFFFD\");\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nexport type WordEmphasisToken = {\n value: string;\n start: number;\n end: number;\n};\n\nconst WORD_TOKEN_PATTERN =\n /[$_\\p{L}][$_\\p{L}\\p{N}\\p{Mark}]*|\\p{N}+(?:\\.\\p{N}+)?|===|!==|=>|==|!=|<=|>=|&&|\\|\\||[^\\s]/gu;\nconst IDENTIFIER_TOKEN_PATTERN = /^[$_\\p{L}][$_\\p{L}\\p{N}\\p{Mark}]*$/u;\nconst NUMBER_TOKEN_PATTERN = /^\\p{N}+(?:\\.\\p{N}+)?$/u;\nconst SYMBOL_TOKEN_PATTERN = /^\\p{S}+$/u;\nconst MEANINGFUL_OPERATOR_TOKEN_PATTERN =\n /^(?:===|!==|=>|==|!=|<=|>=|&&|\\|\\||[+\\-*\\/%<>=!?:~&|^]+)$/;\nconst DOMAIN_SEPARATOR_TOKEN_PATTERN = /^[-/:@#]$/;\nconst STRUCTURAL_PUNCTUATION_TOKEN_PATTERN = /^[{}()[\\].,;]$/;\n\nexport function wordEmphasisTokens(text: string): WordEmphasisToken[] {\n const tokens: WordEmphasisToken[] = [];\n for (const match of text.matchAll(WORD_TOKEN_PATTERN)) {\n const value = match[0];\n const start = match.index;\n tokens.push({ value, start, end: start + value.length });\n }\n return tokens;\n}\n\nexport function wordTokenValues(text: string): string[] {\n return Array.from(text.matchAll(WORD_TOKEN_PATTERN), (match) => match[0]);\n}\n\nexport function isIdentifierToken(value: string): boolean {\n return IDENTIFIER_TOKEN_PATTERN.test(value);\n}\n\nexport function isNumberToken(value: string): boolean {\n return NUMBER_TOKEN_PATTERN.test(value);\n}\n\nexport function isSymbolToken(value: string): boolean {\n return SYMBOL_TOKEN_PATTERN.test(value);\n}\n\nexport function isMeaningfulOperatorToken(value: string): boolean {\n return MEANINGFUL_OPERATOR_TOKEN_PATTERN.test(value);\n}\n\nexport function wordEmphasisTokenWeight(value: string): number {\n if (isIdentifierToken(value)) return 2;\n if (isNumberToken(value)) return 1.5;\n if (DOMAIN_SEPARATOR_TOKEN_PATTERN.test(value)) return 0.25;\n if (isMeaningfulOperatorToken(value)) return 1;\n if (STRUCTURAL_PUNCTUATION_TOKEN_PATTERN.test(value)) return 0.05;\n return 1;\n}\n\nexport function splitIdentifierToken(value: string, start: number): WordEmphasisToken[] {\n const parts: WordEmphasisToken[] = [];\n const partPattern =\n /[$_]+|(?:\\p{Lu}\\p{Mark}*)+(?=(?:\\p{Lu}\\p{Mark}*)(?:\\p{Ll}\\p{Mark}*)|\\p{N}|$)|(?:\\p{Lu}\\p{Mark}*)?(?:\\p{Ll}\\p{Mark}*)+|\\p{N}+|(?:\\p{Lu}\\p{Mark}*)+|(?:\\p{L}\\p{Mark}*)+/gu;\n for (const match of value.matchAll(partPattern)) {\n const part = match[0];\n const offset = match.index;\n parts.push({ value: part, start: start + offset, end: start + offset + part.length });\n }\n return parts.length > 0 ? parts : [{ value, start, end: start + value.length }];\n}\n\nexport function wordEmphasisSimilarityTokenValues(tokens: WordEmphasisToken[]): string[] {\n const values: string[] = [];\n for (const token of tokens) {\n if (!isIdentifierToken(token.value)) {\n values.push(token.value);\n continue;\n }\n const parts = splitIdentifierToken(token.value, 0)\n .map((part) => part.value)\n .filter(isIdentifierSimilarityPart);\n if (parts.length === 0) values.push(token.value.toLowerCase());\n else values.push(...parts.map((part) => part.toLowerCase()));\n }\n return values;\n}\n\nexport function isIdentifierSimilarityPart(value: string): boolean {\n return !/^[$_]+$/.test(value);\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { AddedDiffLine, RemovedDiffLine } from \"./parse.js\";\nimport { expandPreviewTabs } from \"./normalize.js\";\nimport { escapeControlChars } from \"./normalize.js\";\nimport { wordEmphasisTokens, type WordEmphasisToken } from \"./tokens.js\";\n\nexport type IndexedChangedLine<T extends AddedDiffLine | RemovedDiffLine> = {\n index: number;\n line: T;\n normalizedContent?: string;\n tokens?: WordEmphasisToken[];\n similarityTokenValues?: string[];\n similarityFeatureValues?: string[];\n};\n\nexport function indexedChangedLine<T extends AddedDiffLine | RemovedDiffLine>(\n index: number,\n line: T,\n): IndexedChangedLine<T> {\n return { index, line };\n}\n\nexport function normalizedChangedContent(\n line: IndexedChangedLine<AddedDiffLine | RemovedDiffLine>,\n): string {\n // Compute ranges against the same normalized text that Shiki/fallback rendering displays.\n // Otherwise tabs or escaped control chars shift the emphasis range by multiple cells.\n return (line.normalizedContent ??= normalizeDiffContent(line.line.content));\n}\n\nexport function changedLineTokens(\n line: IndexedChangedLine<AddedDiffLine | RemovedDiffLine>,\n): WordEmphasisToken[] {\n return (line.tokens ??= wordEmphasisTokens(normalizedChangedContent(line)));\n}\n\nfunction normalizeDiffContent(content: string): string {\n return escapeControlChars(expandPreviewTabs(content));\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nconst ALIGNMENT_SCORE_EPSILON = 1e-9;\n\ntype PairScoreAt = (beforeIndex: number, afterIndex: number) => number;\n\nfunction sameAlignmentScore(a: number, b: number): boolean {\n return Math.abs(a - b) < ALIGNMENT_SCORE_EPSILON;\n}\n\nexport function suffixAlignedPairs(\n beforeLength: number,\n afterLength: number,\n scoreAt: PairScoreAt,\n): Array<[number, number]> {\n const columns = afterLength + 1;\n const dp = new Float64Array((beforeLength + 1) * columns);\n\n for (let i = beforeLength - 1; i >= 0; i--) {\n const rowOffset = i * columns;\n const nextRowOffset = rowOffset + columns;\n for (let j = afterLength - 1; j >= 0; j--) {\n const pairScore = scoreAt(i, j);\n const align = Number.isFinite(pairScore) ? dp[nextRowOffset + j + 1]! + pairScore : pairScore;\n dp[rowOffset + j] = Math.max(align, dp[nextRowOffset + j]!, dp[rowOffset + j + 1]!);\n }\n }\n\n const pairs: Array<[number, number]> = [];\n let i = 0;\n let j = 0;\n while (i < beforeLength && j < afterLength) {\n const rowOffset = i * columns;\n const nextRowOffset = rowOffset + columns;\n const pairScore = scoreAt(i, j);\n const align = Number.isFinite(pairScore) ? dp[nextRowOffset + j + 1]! + pairScore : pairScore;\n if (Number.isFinite(pairScore) && sameAlignmentScore(dp[rowOffset + j]!, align)) {\n pairs.push([i, j]);\n i++;\n j++;\n } else if (dp[nextRowOffset + j]! >= dp[rowOffset + j + 1]!) {\n i++;\n } else {\n j++;\n }\n }\n return pairs;\n}\n\nexport function prefixAlignedPairs(\n beforeLength: number,\n afterLength: number,\n scoreAt: PairScoreAt,\n): Array<[number, number]> {\n const columns = afterLength + 1;\n const dp = new Float64Array((beforeLength + 1) * columns);\n\n for (let i = 1; i <= beforeLength; i++) {\n const rowOffset = i * columns;\n const previousRowOffset = rowOffset - columns;\n for (let j = 1; j <= afterLength; j++) {\n const pairScore = scoreAt(i - 1, j - 1);\n const pair = Number.isFinite(pairScore)\n ? dp[previousRowOffset + j - 1]! + pairScore\n : pairScore;\n dp[rowOffset + j] = Math.max(dp[previousRowOffset + j]!, dp[rowOffset + j - 1]!, pair);\n }\n }\n\n const pairs: Array<[number, number]> = [];\n let i = beforeLength;\n let j = afterLength;\n while (i > 0 && j > 0) {\n const rowOffset = i * columns;\n const previousRowOffset = rowOffset - columns;\n const pairScore = scoreAt(i - 1, j - 1);\n const pair = Number.isFinite(pairScore)\n ? dp[previousRowOffset + j - 1]! + pairScore\n : pairScore;\n if (Number.isFinite(pairScore) && sameAlignmentScore(dp[rowOffset + j]!, pair)) {\n pairs.push([i - 1, j - 1]);\n i--;\n j--;\n } else if (dp[previousRowOffset + j]! >= dp[rowOffset + j - 1]!) {\n i--;\n } else {\n j--;\n }\n }\n return pairs.reverse();\n}\n\nexport function suffixAlignmentScore(\n beforeLength: number,\n afterLength: number,\n scoreAt: PairScoreAt,\n): number {\n let next = new Float64Array(afterLength + 1);\n let current = new Float64Array(afterLength + 1);\n\n for (let i = beforeLength - 1; i >= 0; i--) {\n current[afterLength] = 0;\n for (let j = afterLength - 1; j >= 0; j--) {\n const pairScore = scoreAt(i, j);\n const match = Number.isFinite(pairScore) ? numericAt(next, j + 1) + pairScore : pairScore;\n current[j] = Math.max(match, numericAt(next, j), numericAt(current, j + 1));\n }\n [next, current] = [current, next];\n }\n\n return numericAt(next, 0);\n}\n\nfunction numericAt(values: ArrayLike<number>, index: number): number {\n const value = values[index];\n if (value === undefined) throw new RangeError(`Missing alignment cell ${index}`);\n return value;\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { AddedDiffLine, RemovedDiffLine } from \"./parse.js\";\nimport { suffixAlignmentScore } from \"./alignment.js\";\nimport { wordEmphasisSimilarityTokenValues, wordEmphasisTokenWeight } from \"./tokens.js\";\nimport { changedLineTokens, type IndexedChangedLine } from \"./changed-line.js\";\n\ntype ChangedLineSimilarityDocuments = {\n removedFeatures: string[][];\n addedFeatures: string[][];\n documentCounts: Map<string, number>;\n};\n\ntype SimilarityTokenWeight = (token: string) => number;\n\nconst SIMILARITY_BIGRAM_PREFIX = \"\\u0000PI_SIM_BIGRAM\\u0000\";\nconst MAX_LINE_TOKEN_SIMILARITY_CELLS = 16_384;\n\nfunction changedLineSimilarityTokenValues(\n line: IndexedChangedLine<AddedDiffLine | RemovedDiffLine>,\n): string[] {\n return (line.similarityTokenValues ??= wordEmphasisSimilarityTokenValues(\n changedLineTokens(line),\n ));\n}\n\nfunction changedLineSimilarityFeatureValues(\n line: IndexedChangedLine<AddedDiffLine | RemovedDiffLine>,\n): string[] {\n return (line.similarityFeatureValues ??= similarityFeatures(\n changedLineSimilarityTokenValues(line),\n ));\n}\n\nexport function changedLineSimilarityDocuments(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n): ChangedLineSimilarityDocuments {\n const removedFeatures = removed.map(changedLineSimilarityFeatureValues);\n const addedFeatures = added.map(changedLineSimilarityFeatureValues);\n const documentCounts = new Map<string, number>();\n countSimilarityDocuments(removedFeatures, documentCounts);\n countSimilarityDocuments(addedFeatures, documentCounts);\n return { removedFeatures, addedFeatures, documentCounts };\n}\n\nfunction countSimilarityDocuments(\n featureLists: string[][],\n documentCounts: Map<string, number>,\n): void {\n for (const features of featureLists) {\n for (const feature of new Set(features))\n documentCounts.set(feature, (documentCounts.get(feature) ?? 0) + 1);\n }\n}\n\nexport function hasUniqueSharedSimilarityFeature(\n removed: IndexedChangedLine<RemovedDiffLine>,\n added: IndexedChangedLine<AddedDiffLine>,\n documents: ChangedLineSimilarityDocuments,\n): boolean {\n const addedFeatures = new Set(changedLineSimilarityFeatureValues(added));\n for (const feature of new Set(changedLineSimilarityFeatureValues(removed))) {\n if (!addedFeatures.has(feature)) continue;\n if (documents.documentCounts.get(feature) === 2 && tokenWeight(feature) >= 1) return true;\n }\n return false;\n}\n\nfunction similarityFeatures(tokens: string[]): string[] {\n const features = [...tokens];\n appendSimilarityShingles(\n features,\n tokens.filter(isSimilarityShingleToken),\n 2,\n SIMILARITY_BIGRAM_PREFIX,\n );\n return features;\n}\n\nfunction appendSimilarityShingles(\n features: string[],\n tokens: string[],\n size: number,\n prefix: string,\n): void {\n for (let index = 0; index + size <= tokens.length; index++)\n features.push(`${prefix}${tokens.slice(index, index + size).join(\"\\u0000\")}`);\n}\n\nfunction isSimilarityShingleToken(token: string): boolean {\n return wordEmphasisTokenWeight(token) >= 1;\n}\n\nexport function similarityTokenWeight(\n documents: ChangedLineSimilarityDocuments,\n): SimilarityTokenWeight {\n const weights = new Map<string, number>();\n const lineCount = documents.removedFeatures.length + documents.addedFeatures.length;\n return (token) => {\n const cached = weights.get(token);\n if (cached !== undefined) return cached;\n const documentCount = documents.documentCounts.get(token) ?? lineCount;\n const rarity = Math.min(3, 1 + Math.log((lineCount + 1) / (documentCount + 1)));\n const weight = tokenWeight(token) * rarity;\n weights.set(token, weight);\n return weight;\n };\n}\n\nexport function fallbackLineSimilarity(\n removed: IndexedChangedLine<RemovedDiffLine>,\n added: IndexedChangedLine<AddedDiffLine>,\n weight: SimilarityTokenWeight,\n removedWeight?: number,\n addedWeight?: number,\n): number {\n return unorderedTokenSimilarity(\n changedLineSimilarityFeatureValues(removed),\n changedLineSimilarityFeatureValues(added),\n weight,\n removedWeight,\n addedWeight,\n );\n}\n\nexport function tokenSimilarity(\n beforeTokens: string[],\n afterTokens: string[],\n weight: SimilarityTokenWeight = tokenWeight,\n minimumRelevantSimilarity = 0,\n beforeWeight?: number,\n afterWeight?: number,\n): number {\n if (beforeTokens.length === 0 || afterTokens.length === 0)\n return beforeTokens.length === afterTokens.length ? 1 : 0;\n const bagSimilarity = unorderedTokenSimilarity(\n beforeTokens,\n afterTokens,\n weight,\n beforeWeight,\n afterWeight,\n );\n // Ordered overlap cannot exceed multiset overlap. Avoid its dynamic program when\n // the upper bound is already below the caller's minimum useful score.\n if (bagSimilarity < minimumRelevantSimilarity) return bagSimilarity;\n const orderedSimilarity = orderedTokenSimilarity(\n beforeTokens,\n afterTokens,\n weight,\n beforeWeight ?? similarityTokenListWeight(beforeTokens, weight),\n afterWeight ?? similarityTokenListWeight(afterTokens, weight),\n );\n if (orderedSimilarity === undefined) return bagSimilarity;\n return Math.max(\n orderedSimilarity,\n bagSimilarity * 0.8,\n orderedSimilarity * 0.75 + bagSimilarity * 0.25,\n );\n}\n\nfunction unorderedTokenSimilarity(\n beforeTokens: string[],\n afterTokens: string[],\n weight: SimilarityTokenWeight,\n beforeWeight = similarityTokenListWeight(beforeTokens, weight),\n afterWeight = similarityTokenListWeight(afterTokens, weight),\n): number {\n const remaining = new Map<string, number>();\n for (const token of beforeTokens) remaining.set(token, (remaining.get(token) ?? 0) + 1);\n let sharedWeight = 0;\n for (const token of afterTokens) {\n const count = remaining.get(token) ?? 0;\n if (count === 0) continue;\n sharedWeight += weight(token);\n if (count === 1) remaining.delete(token);\n else remaining.set(token, count - 1);\n }\n return (2 * sharedWeight) / (beforeWeight + afterWeight);\n}\n\nfunction orderedTokenSimilarity(\n beforeTokens: string[],\n afterTokens: string[],\n weight: SimilarityTokenWeight,\n beforeWeight: number,\n afterWeight: number,\n): number | undefined {\n if (beforeTokens.length * afterTokens.length > MAX_LINE_TOKEN_SIMILARITY_CELLS) return undefined;\n const score = suffixAlignmentScore(\n beforeTokens.length,\n afterTokens.length,\n (beforeIndex, afterIndex) => {\n const beforeToken = stringAt(beforeTokens, beforeIndex);\n return beforeToken === stringAt(afterTokens, afterIndex)\n ? weight(beforeToken)\n : Number.NEGATIVE_INFINITY;\n },\n );\n\n return (2 * score) / (beforeWeight + afterWeight);\n}\n\nexport function similarityTokenListWeight(tokens: string[], weight: SimilarityTokenWeight): number {\n return tokens.reduce((total, token) => total + weight(token), 0);\n}\n\nfunction tokenWeight(token: string): number {\n if (token.startsWith(SIMILARITY_BIGRAM_PREFIX)) return 1.15;\n return wordEmphasisTokenWeight(token);\n}\n\nfunction stringAt(values: string[], index: number): string {\n const value = values[index];\n if (value === undefined) throw new RangeError(`Missing similarity token ${index}`);\n return value;\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { AddedDiffLine, RemovedDiffLine } from \"./parse.js\";\nimport type { IndexedChangedLine } from \"./changed-line.js\";\nimport {\n changedLineSimilarityDocuments,\n fallbackLineSimilarity,\n hasUniqueSharedSimilarityFeature,\n similarityTokenListWeight,\n similarityTokenWeight,\n} from \"./line-similarity.js\";\nimport type { WordChangeConfidence } from \"./types.js\";\n\nexport type SparseChangedLinePair = {\n removedIndex: number;\n addedIndex: number;\n confidence: WordChangeConfidence;\n};\n\ntype SparseChangedLinePairCandidate = {\n removedPosition: number;\n addedPosition: number;\n evidence: number;\n sharedFeatureCount: number;\n hasUniqueFeature: boolean;\n competingEvidence: number;\n};\n\ntype ScoredSparseChangedLinePairCandidate = SparseChangedLinePairCandidate & {\n score: number;\n};\n\ntype ChangedLineScoreAt = (removedPosition: number, addedPosition: number) => number;\n\nexport type SparseLineMatchingPolicy = {\n minPositionalFallbackPairScore: number;\n minChangedLinePairScore: number;\n competingChangedLineScoreAt: (\n removedLength: number,\n addedLength: number,\n removedPosition: number,\n addedPosition: number,\n scoreAt: ChangedLineScoreAt,\n ) => number;\n isAmbiguousChangedLinePairScore: (score: number, competingScore: number) => boolean;\n isReciprocalBestChangedLinePair: (score: number, competingScore: number) => boolean;\n linePairConfidence: (score: number, competingScore: number) => WordChangeConfidence;\n};\n\nexport type TopTwoCandidateValues = { best: number; second: number };\n\nconst MAX_POSITIONAL_FALLBACK_AMBIGUITY_CELLS = 10_000;\nconst MAX_SPARSE_FEATURE_DOCUMENTS = 6;\nconst MAX_SPARSE_FEATURE_DOCUMENTS_PER_SIDE = 3;\nconst MAX_SPARSE_CANDIDATES_PER_LINE = 8;\nconst MIN_SPARSE_RARE_FEATURE_COUNT = 2;\nconst MIN_SPARSE_EVIDENCE_MARGIN = 1;\nconst MIN_SPARSE_EVIDENCE_RATIO = 0.9;\n\nexport function matchChangedLinesSparse(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n policy: SparseLineMatchingPolicy,\n): SparseChangedLinePair[] {\n const similarityDocuments = changedLineSimilarityDocuments(removed, added);\n const tokenWeight = similarityTokenWeight(similarityDocuments);\n const removedWeights: Array<number | undefined> = [];\n const addedWeights: Array<number | undefined> = [];\n const canCheckAmbiguity =\n removed.length * added.length <= MAX_POSITIONAL_FALLBACK_AMBIGUITY_CELLS;\n const scoreCache = canCheckAmbiguity ? new Map<number, number>() : undefined;\n const scoreAt = (removedPosition: number, addedPosition: number): number => {\n const key = removedPosition * added.length + addedPosition;\n const cached = scoreCache?.get(key);\n if (cached !== undefined) return cached;\n const removedFeatures = similarityDocuments.removedFeatures[removedPosition];\n const addedFeatures = similarityDocuments.addedFeatures[addedPosition];\n if (removedFeatures === undefined || addedFeatures === undefined)\n throw new RangeError(`Missing similarity features ${removedPosition}:${addedPosition}`);\n const removedWeight = (removedWeights[removedPosition] ??= similarityTokenListWeight(\n removedFeatures,\n tokenWeight,\n ));\n const addedWeight = (addedWeights[addedPosition] ??= similarityTokenListWeight(\n addedFeatures,\n tokenWeight,\n ));\n const score = fallbackLineSimilarity(\n changedLineAt(removed, removedPosition),\n changedLineAt(added, addedPosition),\n tokenWeight,\n removedWeight,\n addedWeight,\n );\n scoreCache?.set(key, score);\n return score;\n };\n\n const sparseCandidates = sparseChangedLinePairCandidates(similarityDocuments, tokenWeight);\n const pairs = sparseChangedLineAnchors(removed, added, sparseCandidates, scoreAt, policy);\n const positions = changedLinePositions(removed, added);\n const usedRemoved = new Set<number>();\n const usedAdded = new Set<number>();\n for (const pair of pairs) {\n const removedPosition = positions.removed.get(pair.removedIndex);\n const addedPosition = positions.added.get(pair.addedIndex);\n if (removedPosition !== undefined) usedRemoved.add(removedPosition);\n if (addedPosition !== undefined) usedAdded.add(addedPosition);\n }\n\n for (let index = 0; index < Math.min(removed.length, added.length); index++) {\n if (usedRemoved.has(index) || usedAdded.has(index)) continue;\n const score = scoreAt(index, index);\n if (score < policy.minPositionalFallbackPairScore) continue;\n const removedLine = changedLineAt(removed, index);\n const addedLine = changedLineAt(added, index);\n if (hasUniqueSharedSimilarityFeature(removedLine, addedLine, similarityDocuments)) {\n pairs.push({\n removedIndex: removedLine.index,\n addedIndex: addedLine.index,\n confidence: policy.linePairConfidence(score, 0),\n });\n usedRemoved.add(index);\n usedAdded.add(index);\n continue;\n }\n if (!canCheckAmbiguity) continue;\n\n const competingScore = policy.competingChangedLineScoreAt(\n removed.length,\n added.length,\n index,\n index,\n scoreAt,\n );\n if (policy.isAmbiguousChangedLinePairScore(score, competingScore)) continue;\n pairs.push({\n removedIndex: removedLine.index,\n addedIndex: addedLine.index,\n confidence: policy.linePairConfidence(score, competingScore),\n });\n usedRemoved.add(index);\n usedAdded.add(index);\n }\n return pairs.sort(\n (a, b) =>\n (positions.removed.get(a.removedIndex) ?? 0) - (positions.removed.get(b.removedIndex) ?? 0),\n );\n}\n\nfunction sparseChangedLinePairCandidates(\n documents: ReturnType<typeof changedLineSimilarityDocuments>,\n tokenWeight: ReturnType<typeof similarityTokenWeight>,\n): SparseChangedLinePairCandidate[] {\n const removedPositions = similarityFeaturePositions(documents.removedFeatures);\n const addedPositions = similarityFeaturePositions(documents.addedFeatures);\n const candidates = new Map<number, SparseChangedLinePairCandidate>();\n const addedLength = documents.addedFeatures.length;\n\n for (const [feature, featureRemovedPositions] of removedPositions) {\n const featureAddedPositions = addedPositions.get(feature);\n if (!featureAddedPositions) continue;\n const documentCount = documents.documentCounts.get(feature) ?? Number.POSITIVE_INFINITY;\n if (\n documentCount > MAX_SPARSE_FEATURE_DOCUMENTS ||\n featureRemovedPositions.length > MAX_SPARSE_FEATURE_DOCUMENTS_PER_SIDE ||\n featureAddedPositions.length > MAX_SPARSE_FEATURE_DOCUMENTS_PER_SIDE\n )\n continue;\n const weight = tokenWeight(feature);\n if (weight < 1) continue;\n const uniqueFeature =\n documentCount === 2 &&\n featureRemovedPositions.length === 1 &&\n featureAddedPositions.length === 1;\n\n for (const removedPosition of featureRemovedPositions) {\n for (const addedPosition of featureAddedPositions) {\n const key = removedPosition * addedLength + addedPosition;\n const candidate = candidates.get(key);\n if (candidate) {\n candidate.evidence += weight;\n candidate.sharedFeatureCount++;\n candidate.hasUniqueFeature ||= uniqueFeature;\n } else {\n candidates.set(key, {\n removedPosition,\n addedPosition,\n evidence: weight,\n sharedFeatureCount: 1,\n hasUniqueFeature: uniqueFeature,\n competingEvidence: 0,\n });\n }\n }\n }\n }\n\n const candidateList = [...candidates.values()];\n addCompetingSparseEvidence(candidateList);\n return boundedSparseChangedLinePairCandidates(candidateList);\n}\n\nfunction similarityFeaturePositions(featureLists: string[][]): Map<string, number[]> {\n const positions = new Map<string, number[]>();\n for (let position = 0; position < featureLists.length; position++) {\n const features = featureLists[position];\n if (!features) continue;\n for (const feature of new Set(features)) {\n const featurePositions = positions.get(feature);\n if (featurePositions) featurePositions.push(position);\n else positions.set(feature, [position]);\n }\n }\n return positions;\n}\n\nfunction addCompetingSparseEvidence(candidates: SparseChangedLinePairCandidate[]): void {\n const removedEvidence = topTwoCandidateValues(\n candidates,\n (candidate) => candidate.removedPosition,\n (candidate) => candidate.evidence,\n );\n const addedEvidence = topTwoCandidateValues(\n candidates,\n (candidate) => candidate.addedPosition,\n (candidate) => candidate.evidence,\n );\n for (const candidate of candidates) {\n candidate.competingEvidence = Math.max(\n competingCandidateValue(removedEvidence.get(candidate.removedPosition), candidate.evidence),\n competingCandidateValue(addedEvidence.get(candidate.addedPosition), candidate.evidence),\n );\n }\n}\n\nfunction topTwoCandidateValues<T>(\n candidates: T[],\n position: (candidate: T) => number,\n value: (candidate: T) => number,\n): Map<number, TopTwoCandidateValues> {\n const values = new Map<number, TopTwoCandidateValues>();\n for (const candidate of candidates) {\n const current = values.get(position(candidate)) ?? { best: 0, second: 0 };\n const candidateValue = value(candidate);\n if (candidateValue >= current.best) {\n current.second = current.best;\n current.best = candidateValue;\n } else if (candidateValue > current.second) current.second = candidateValue;\n values.set(position(candidate), current);\n }\n return values;\n}\n\nexport function competingCandidateValue(\n values: TopTwoCandidateValues | undefined,\n candidateValue: number,\n): number {\n if (!values) return 0;\n return candidateValue === values.best ? values.second : values.best;\n}\n\nfunction boundedSparseChangedLinePairCandidates(\n candidates: SparseChangedLinePairCandidate[],\n): SparseChangedLinePairCandidate[] {\n const byRemoved = new Map<number, SparseChangedLinePairCandidate[]>();\n const byAdded = new Map<number, SparseChangedLinePairCandidate[]>();\n for (const candidate of candidates) {\n appendSparseCandidate(byRemoved, candidate.removedPosition, candidate);\n appendSparseCandidate(byAdded, candidate.addedPosition, candidate);\n }\n const selectedByRemoved = topSparseCandidates(byRemoved);\n const selectedByAdded = topSparseCandidates(byAdded);\n return candidates.filter(\n (candidate) => selectedByRemoved.has(candidate) && selectedByAdded.has(candidate),\n );\n}\n\nfunction appendSparseCandidate(\n candidates: Map<number, SparseChangedLinePairCandidate[]>,\n position: number,\n candidate: SparseChangedLinePairCandidate,\n): void {\n const atPosition = candidates.get(position);\n if (atPosition) atPosition.push(candidate);\n else candidates.set(position, [candidate]);\n}\n\nfunction topSparseCandidates(\n candidates: Map<number, SparseChangedLinePairCandidate[]>,\n): Set<SparseChangedLinePairCandidate> {\n const selected = new Set<SparseChangedLinePairCandidate>();\n for (const atPosition of candidates.values()) {\n atPosition.sort(compareSparseCandidates);\n for (const candidate of atPosition.slice(0, MAX_SPARSE_CANDIDATES_PER_LINE))\n selected.add(candidate);\n }\n return selected;\n}\n\nfunction compareSparseCandidates(\n a: SparseChangedLinePairCandidate,\n b: SparseChangedLinePairCandidate,\n): number {\n return (\n Number(b.hasUniqueFeature) - Number(a.hasUniqueFeature) ||\n b.evidence - a.evidence ||\n b.sharedFeatureCount - a.sharedFeatureCount ||\n Math.abs(a.removedPosition - a.addedPosition) - Math.abs(b.removedPosition - b.addedPosition) ||\n a.removedPosition - b.removedPosition ||\n a.addedPosition - b.addedPosition\n );\n}\n\nfunction sparseChangedLineAnchors(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n sparseCandidates: SparseChangedLinePairCandidate[],\n scoreAt: ChangedLineScoreAt,\n policy: SparseLineMatchingPolicy,\n): SparseChangedLinePair[] {\n const scoredCandidates: ScoredSparseChangedLinePairCandidate[] = sparseCandidates\n .map((candidate) => ({\n ...candidate,\n score: scoreAt(candidate.removedPosition, candidate.addedPosition),\n }))\n .sort((a, b) => b.score - a.score || compareSparseCandidates(a, b));\n const removedScores = topTwoCandidateValues(\n scoredCandidates,\n (candidate) => candidate.removedPosition,\n (candidate) => candidate.score,\n );\n const addedScores = topTwoCandidateValues(\n scoredCandidates,\n (candidate) => candidate.addedPosition,\n (candidate) => candidate.score,\n );\n const usedRemoved = new Set<number>();\n const usedAdded = new Set<number>();\n const pairs: SparseChangedLinePair[] = [];\n\n for (const candidate of scoredCandidates) {\n if (candidate.score < policy.minChangedLinePairScore) continue;\n if (usedRemoved.has(candidate.removedPosition) || usedAdded.has(candidate.addedPosition))\n continue;\n if (!hasStrongSparseEvidence(candidate)) continue;\n const competingScore = Math.max(\n competingCandidateValue(removedScores.get(candidate.removedPosition), candidate.score),\n competingCandidateValue(addedScores.get(candidate.addedPosition), candidate.score),\n sparsePositionalCompetingScore(candidate, removed.length, added.length, scoreAt),\n );\n if (!policy.isReciprocalBestChangedLinePair(candidate.score, competingScore)) continue;\n usedRemoved.add(candidate.removedPosition);\n usedAdded.add(candidate.addedPosition);\n pairs.push({\n removedIndex: changedLineAt(removed, candidate.removedPosition).index,\n addedIndex: changedLineAt(added, candidate.addedPosition).index,\n confidence: policy.linePairConfidence(candidate.score, competingScore),\n });\n }\n return pairs;\n}\n\nfunction sparsePositionalCompetingScore(\n candidate: SparseChangedLinePairCandidate,\n removedLength: number,\n addedLength: number,\n scoreAt: ChangedLineScoreAt,\n): number {\n let competingScore = 0;\n if (\n candidate.removedPosition < addedLength &&\n candidate.addedPosition !== candidate.removedPosition\n )\n competingScore = scoreAt(candidate.removedPosition, candidate.removedPosition);\n if (\n candidate.addedPosition < removedLength &&\n candidate.removedPosition !== candidate.addedPosition\n )\n competingScore = Math.max(\n competingScore,\n scoreAt(candidate.addedPosition, candidate.addedPosition),\n );\n return competingScore;\n}\n\nfunction hasStrongSparseEvidence(candidate: SparseChangedLinePairCandidate): boolean {\n if (!candidate.hasUniqueFeature && candidate.sharedFeatureCount < MIN_SPARSE_RARE_FEATURE_COUNT)\n return false;\n return (\n candidate.evidence - candidate.competingEvidence > MIN_SPARSE_EVIDENCE_MARGIN &&\n candidate.competingEvidence < candidate.evidence * MIN_SPARSE_EVIDENCE_RATIO\n );\n}\n\ntype ChangedLinePositions = {\n removed: Map<number, number>;\n added: Map<number, number>;\n};\n\nfunction changedLinePositions(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n): ChangedLinePositions {\n return {\n removed: new Map(removed.map((line, index) => [line.index, index])),\n added: new Map(added.map((line, index) => [line.index, index])),\n };\n}\n\nfunction changedLineAt<T extends AddedDiffLine | RemovedDiffLine>(\n lines: Array<IndexedChangedLine<T>>,\n index: number,\n): IndexedChangedLine<T> {\n const line = lines[index];\n if (line === undefined) throw new RangeError(`Missing changed line ${index}`);\n return line;\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { WordChangeConfidence } from \"./types.js\";\nimport type { AddedDiffLine, RemovedDiffLine } from \"./parse.js\";\nimport { prefixAlignedPairs } from \"./alignment.js\";\nimport {\n changedLineSimilarityDocuments,\n similarityTokenListWeight,\n similarityTokenWeight,\n tokenSimilarity,\n} from \"./line-similarity.js\";\nimport type { IndexedChangedLine } from \"./changed-line.js\";\nimport {\n competingCandidateValue,\n matchChangedLinesSparse,\n type SparseLineMatchingPolicy,\n type TopTwoCandidateValues,\n} from \"./sparse-line-matching.js\";\n\nexport type ChangedLinePair = {\n removedIndex: number;\n addedIndex: number;\n confidence: WordChangeConfidence;\n};\n\ntype ChangedLinePairCandidate = {\n removedPosition: number;\n addedPosition: number;\n score: number;\n};\n\ntype ChangedLinePositionPair = [removedPosition: number, addedPosition: number];\ntype ChangedLineIndexPair = [removedIndex: number, addedIndex: number];\ntype ChangedLineScoreAt = (removedPosition: number, addedPosition: number) => number;\n\nexport function matchChangedLines(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n): ChangedLinePair[] {\n if (removed.length === 0 || added.length === 0) return [];\n if (removed.length * added.length > MAX_CHANGED_LINE_PAIR_CELLS)\n return matchChangedLinesSparse(removed, added, SPARSE_LINE_MATCHING_POLICY);\n const similarityDocuments = changedLineSimilarityDocuments(removed, added);\n const tokenWeight = similarityTokenWeight(similarityDocuments);\n const { removedFeatures, addedFeatures } = similarityDocuments;\n const removedWeights = removedFeatures.map((tokens) =>\n similarityTokenListWeight(tokens, tokenWeight),\n );\n const addedWeights = addedFeatures.map((tokens) =>\n similarityTokenListWeight(tokens, tokenWeight),\n );\n const scores = removedFeatures.map((beforeTokens, removedPosition) =>\n addedFeatures.map((afterTokens, addedPosition) =>\n tokenSimilarity(\n beforeTokens,\n afterTokens,\n tokenWeight,\n MIN_POSITIONAL_FALLBACK_PAIR_SCORE,\n removedWeights[removedPosition],\n addedWeights[addedPosition],\n ),\n ),\n );\n const similarPairs = prefixAlignedPairs(\n removed.length,\n added.length,\n (removedPosition, addedPosition) => {\n const score = scores[removedPosition]?.[addedPosition] ?? 0;\n return score >= MIN_CHANGED_LINE_PAIR_SCORE ? score + 0.01 : Number.NEGATIVE_INFINITY;\n },\n );\n if (similarPairs.length === 0 && removed.length === 1 && added.length === 1)\n return [\n {\n removedIndex: changedLineAt(removed, 0).index,\n addedIndex: changedLineAt(added, 0).index,\n confidence: \"medium\",\n },\n ];\n const positions = changedLinePositions(removed, added);\n const confidentPairs = confidentChangedLinePairs(\n positions,\n scores,\n addPositionalFallbackPairs(removed, added, scores, similarPairs),\n );\n return addCrossingPairs(removed, added, scores, positions, confidentPairs);\n}\n\nconst MIN_CHANGED_LINE_PAIR_SCORE = 0.45;\nconst MIN_POSITIONAL_FALLBACK_PAIR_SCORE = 0.28;\nconst CHANGED_LINE_PAIR_AMBIGUITY_MARGIN = 0.06;\nconst CHANGED_LINE_PAIR_AMBIGUITY_RATIO = 0.92;\nconst MIN_HIGH_CONFIDENCE_CROSSING_PAIR_SCORE = 0.72;\nconst HIGH_CONFIDENCE_CROSSING_PAIR_MARGIN = 0.12;\nconst HIGH_CONFIDENCE_CROSSING_PAIR_RATIO = 0.85;\nconst MAX_CHANGED_LINE_PAIR_CELLS = 1024;\n\nconst SPARSE_LINE_MATCHING_POLICY: SparseLineMatchingPolicy = {\n minPositionalFallbackPairScore: MIN_POSITIONAL_FALLBACK_PAIR_SCORE,\n minChangedLinePairScore: MIN_CHANGED_LINE_PAIR_SCORE,\n competingChangedLineScoreAt,\n isAmbiguousChangedLinePairScore,\n isReciprocalBestChangedLinePair,\n linePairConfidence,\n};\n\ntype ChangedLinePositions = {\n removed: Map<number, number>;\n added: Map<number, number>;\n};\n\nfunction changedLinePositions(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n): ChangedLinePositions {\n return {\n removed: new Map(removed.map((line, index) => [line.index, index])),\n added: new Map(added.map((line, index) => [line.index, index])),\n };\n}\n\nfunction confidentChangedLinePairs(\n positions: ChangedLinePositions,\n scores: number[][],\n pairs: ChangedLineIndexPair[],\n): ChangedLinePair[] {\n const confidentPairs: ChangedLinePair[] = [];\n for (const [removedIndex, addedIndex] of pairs) {\n const removedPosition = positions.removed.get(removedIndex);\n const addedPosition = positions.added.get(addedIndex);\n if (removedPosition === undefined || addedPosition === undefined) continue;\n const score = scores[removedPosition]?.[addedPosition] ?? 0;\n const competingScore = competingChangedLineScore(scores, removedPosition, addedPosition);\n if (isAmbiguousChangedLinePairScore(score, competingScore)) continue;\n confidentPairs.push({\n removedIndex,\n addedIndex,\n confidence: linePairConfidence(score, competingScore),\n });\n }\n return confidentPairs;\n}\n\nfunction competingChangedLineScore(\n scores: number[][],\n removedPosition: number,\n addedPosition: number,\n usedRemoved?: ReadonlySet<number>,\n usedAdded?: ReadonlySet<number>,\n): number {\n return competingChangedLineScoreAt(\n scores.length,\n scores[removedPosition]?.length ?? 0,\n removedPosition,\n addedPosition,\n (candidateRemovedPosition, candidateAddedPosition) =>\n scores[candidateRemovedPosition]?.[candidateAddedPosition] ?? 0,\n usedRemoved,\n usedAdded,\n );\n}\n\nfunction competingChangedLineScoreAt(\n removedLength: number,\n addedLength: number,\n removedPosition: number,\n addedPosition: number,\n scoreAt: ChangedLineScoreAt,\n usedRemoved?: ReadonlySet<number>,\n usedAdded?: ReadonlySet<number>,\n): number {\n let competingScore = 0;\n for (\n let candidateAddedPosition = 0;\n candidateAddedPosition < addedLength;\n candidateAddedPosition++\n ) {\n if (candidateAddedPosition === addedPosition || usedAdded?.has(candidateAddedPosition))\n continue;\n competingScore = Math.max(competingScore, scoreAt(removedPosition, candidateAddedPosition));\n }\n for (\n let candidateRemovedPosition = 0;\n candidateRemovedPosition < removedLength;\n candidateRemovedPosition++\n ) {\n if (candidateRemovedPosition === removedPosition || usedRemoved?.has(candidateRemovedPosition))\n continue;\n competingScore = Math.max(competingScore, scoreAt(candidateRemovedPosition, addedPosition));\n }\n return competingScore;\n}\n\nfunction isAmbiguousChangedLinePairScore(score: number, competingScore: number): boolean {\n return (\n competingScore >= MIN_POSITIONAL_FALLBACK_PAIR_SCORE &&\n (score - competingScore <= CHANGED_LINE_PAIR_AMBIGUITY_MARGIN ||\n competingScore >= score * CHANGED_LINE_PAIR_AMBIGUITY_RATIO)\n );\n}\n\nfunction isReciprocalBestChangedLinePair(score: number, competingScore: number): boolean {\n return score > competingScore && !isAmbiguousChangedLinePairScore(score, competingScore);\n}\n\nfunction linePairConfidence(score: number, competingScore: number): WordChangeConfidence {\n if (\n score >= MIN_HIGH_CONFIDENCE_CROSSING_PAIR_SCORE &&\n score - competingScore >= HIGH_CONFIDENCE_CROSSING_PAIR_MARGIN &&\n competingScore <= score * HIGH_CONFIDENCE_CROSSING_PAIR_RATIO\n )\n return \"high\";\n return \"medium\";\n}\n\nfunction addCrossingPairs(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n scores: number[][],\n positions: ChangedLinePositions,\n pairs: ChangedLinePair[],\n): ChangedLinePair[] {\n const usedRemoved = new Set<number>();\n const usedAdded = new Set<number>();\n for (const pair of pairs) {\n const removedPosition = positions.removed.get(pair.removedIndex);\n const addedPosition = positions.added.get(pair.addedIndex);\n if (removedPosition !== undefined) usedRemoved.add(removedPosition);\n if (addedPosition !== undefined) usedAdded.add(addedPosition);\n }\n\n const candidates: ChangedLinePairCandidate[] = [];\n for (let removedPosition = 0; removedPosition < removed.length; removedPosition++) {\n if (usedRemoved.has(removedPosition)) continue;\n for (let addedPosition = 0; addedPosition < added.length; addedPosition++) {\n if (usedAdded.has(addedPosition)) continue;\n const score = scores[removedPosition]?.[addedPosition] ?? 0;\n if (score >= MIN_CHANGED_LINE_PAIR_SCORE)\n candidates.push({ removedPosition, addedPosition, score });\n }\n }\n candidates.sort((a, b) => b.score - a.score);\n const competingScores = changedLineCompetingScores(scores);\n\n const out = [...pairs];\n for (const candidate of candidates) {\n if (usedRemoved.has(candidate.removedPosition) || usedAdded.has(candidate.addedPosition))\n continue;\n let confidence: WordChangeConfidence | undefined;\n if (candidate.score >= MIN_HIGH_CONFIDENCE_CROSSING_PAIR_SCORE) {\n const availableCompetingScore = competingChangedLineScore(\n scores,\n candidate.removedPosition,\n candidate.addedPosition,\n usedRemoved,\n usedAdded,\n );\n if (linePairConfidence(candidate.score, availableCompetingScore) === \"high\")\n confidence = \"high\";\n }\n confidence ??= reciprocalCrossingPairConfidence(competingScores, candidate);\n if (!confidence) continue;\n usedRemoved.add(candidate.removedPosition);\n usedAdded.add(candidate.addedPosition);\n out.push({\n removedIndex: changedLineAt(removed, candidate.removedPosition).index,\n addedIndex: changedLineAt(added, candidate.addedPosition).index,\n confidence,\n });\n }\n\n return out.sort(\n (a, b) =>\n (positions.removed.get(a.removedIndex) ?? 0) - (positions.removed.get(b.removedIndex) ?? 0),\n );\n}\n\ntype ChangedLineCompetingScores = {\n removed: TopTwoCandidateValues[];\n added: TopTwoCandidateValues[];\n};\n\nfunction changedLineCompetingScores(scores: number[][]): ChangedLineCompetingScores {\n const removed: TopTwoCandidateValues[] = [];\n const added: TopTwoCandidateValues[] = [];\n for (let removedPosition = 0; removedPosition < scores.length; removedPosition++) {\n const removedScores = scores[removedPosition] ?? [];\n for (let addedPosition = 0; addedPosition < removedScores.length; addedPosition++) {\n const score = removedScores[addedPosition] ?? 0;\n addCandidateValue(removed, removedPosition, score);\n addCandidateValue(added, addedPosition, score);\n }\n }\n return { removed, added };\n}\n\nfunction addCandidateValue(values: TopTwoCandidateValues[], position: number, value: number): void {\n const current = values[position] ?? { best: 0, second: 0 };\n if (value >= current.best) {\n current.second = current.best;\n current.best = value;\n } else if (value > current.second) current.second = value;\n values[position] = current;\n}\n\nfunction reciprocalCrossingPairConfidence(\n competingScores: ChangedLineCompetingScores,\n candidate: ChangedLinePairCandidate,\n): WordChangeConfidence | undefined {\n const competingScore = Math.max(\n competingCandidateValue(competingScores.removed[candidate.removedPosition], candidate.score),\n competingCandidateValue(competingScores.added[candidate.addedPosition], candidate.score),\n );\n if (!isReciprocalBestChangedLinePair(candidate.score, competingScore)) return undefined;\n return linePairConfidence(candidate.score, competingScore);\n}\n\nfunction addPositionalFallbackPairs(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n scores: number[][],\n similarPairs: ChangedLinePositionPair[],\n): ChangedLineIndexPair[] {\n const pairs: ChangedLineIndexPair[] = [];\n let removedCursor = 0;\n let addedCursor = 0;\n for (const [removedPosition, addedPosition] of similarPairs) {\n pairs.push(\n ...positionPairs(\n removed,\n added,\n scores,\n removedCursor,\n removedPosition,\n addedCursor,\n addedPosition,\n ),\n );\n pairs.push([\n changedLineAt(removed, removedPosition).index,\n changedLineAt(added, addedPosition).index,\n ]);\n removedCursor = removedPosition + 1;\n addedCursor = addedPosition + 1;\n }\n pairs.push(\n ...positionPairs(\n removed,\n added,\n scores,\n removedCursor,\n removed.length,\n addedCursor,\n added.length,\n ),\n );\n return pairs;\n}\n\nfunction positionPairs(\n removed: Array<IndexedChangedLine<RemovedDiffLine>>,\n added: Array<IndexedChangedLine<AddedDiffLine>>,\n scores: number[][],\n removedStart: number,\n removedEnd: number,\n addedStart: number,\n addedEnd: number,\n): ChangedLineIndexPair[] {\n const pairs: ChangedLineIndexPair[] = [];\n const count = Math.min(removedEnd - removedStart, addedEnd - addedStart);\n for (let offset = 0; offset < count; offset++) {\n const removedPosition = removedStart + offset;\n const addedPosition = addedStart + offset;\n const score = scores[removedPosition]?.[addedPosition] ?? 0;\n if (score < MIN_POSITIONAL_FALLBACK_PAIR_SCORE) continue;\n pairs.push([\n changedLineAt(removed, removedPosition).index,\n changedLineAt(added, addedPosition).index,\n ]);\n }\n return pairs;\n}\n\nfunction changedLineAt<T extends AddedDiffLine | RemovedDiffLine>(\n lines: Array<IndexedChangedLine<T>>,\n index: number,\n): IndexedChangedLine<T> {\n const line = lines[index];\n if (line === undefined) throw new RangeError(`Missing changed line ${index}`);\n return line;\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nexport type ParsedDiffLine = { kind: \"+\" | \"-\" | \" \"; lineNumber: string; content: string };\nexport type AddedDiffLine = ParsedDiffLine & { kind: \"+\" };\nexport type RemovedDiffLine = ParsedDiffLine & { kind: \"-\" };\n\nexport function diffLineNumberWidth(lines: Array<ParsedDiffLine | null>): number {\n return lines.reduce((width, line) => Math.max(width, normalizedDiffLineNumber(line).length), 0);\n}\n\nexport function formatDiffLineNumber(lineNumber: string, width: number): string {\n return lineNumber.trim().padStart(width, \" \");\n}\n\nfunction normalizedDiffLineNumber(line: ParsedDiffLine | null): string {\n return line?.lineNumber.trim() ?? \"\";\n}\n\nexport function parseDiffLine(line: string): ParsedDiffLine | null {\n const numbered = line.match(/^([+\\- ])(\\s*\\d+)\\s(.*)$/);\n if (numbered) {\n const [, kind, lineNumber, content] = numbered;\n if (\n (kind !== \"+\" && kind !== \"-\" && kind !== \" \") ||\n lineNumber === undefined ||\n content === undefined\n )\n return null;\n return { kind, lineNumber, content };\n }\n\n if (line.startsWith(\"+++\") || line.startsWith(\"---\")) return null;\n const prefix = line[0];\n if (prefix !== \"+\" && prefix !== \"-\" && prefix !== \" \") return null;\n return { kind: prefix, lineNumber: \"\", content: line.slice(1) };\n}\n\nexport function isAddedDiffLine(line: ParsedDiffLine | null): line is AddedDiffLine {\n return line?.kind === \"+\";\n}\n\nexport function isRemovedDiffLine(line: ParsedDiffLine | null): line is RemovedDiffLine {\n return line?.kind === \"-\";\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { WordEmphasisToken } from \"./tokens.js\";\n\nexport type TextRange = [number, number];\nexport type TokenGroup = { start: number; end: number };\n\nexport function rangesForTokenGroup(tokens: WordEmphasisToken[], group: TokenGroup): TextRange[] {\n const ranges: TextRange[] = [];\n for (let index = group.start; index < group.end; index++) {\n const token = tokens[index];\n if (token) appendTokenRange(ranges, token);\n }\n return ranges;\n}\n\nexport function pushTokenRange(ranges: TextRange[], token: WordEmphasisToken): void {\n ranges.push([token.start, token.end]);\n}\n\nexport function mergeRangesByStart(ranges: TextRange[]): TextRange[] {\n return mergeRanges([...ranges].sort((a, b) => a[0] - b[0]));\n}\n\nexport function mergeRanges(ranges: TextRange[]): TextRange[] {\n const merged: TextRange[] = [];\n for (const range of ranges) {\n const previous = merged.at(-1);\n if (previous && range[0] - previous[1] <= 1) previous[1] = range[1];\n else merged.push([...range]);\n }\n return merged;\n}\n\nfunction appendTokenRange(ranges: TextRange[], token: WordEmphasisToken): void {\n const previous = ranges.at(-1);\n if (previous && token.start - previous[1] <= 1) previous[1] = token.end;\n else ranges.push([token.start, token.end]);\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nconst NON_ASCII_TEXT_PATTERN = /[^\\x00-\\x7F]/;\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\ntype GraphemeSegments = ReturnType<Intl.Segmenter[\"segment\"]>;\n\nexport type TextBoundarySegment = { value: string; start: number; end: number };\n\nexport function commonPrefixLength(before: string, after: string): number {\n const prefix = commonPrefixCodeUnitLength(before, after);\n if (!needsBoundarySafeOffsets(before) && !needsBoundarySafeOffsets(after)) return prefix;\n return commonGraphemePrefixLength(before, after, prefix);\n}\n\nexport function commonSuffixLength(before: string, after: string, prefixLength: number): number {\n const suffix = commonSuffixCodeUnitLength(before, after, prefixLength);\n if (!needsBoundarySafeOffsets(before) && !needsBoundarySafeOffsets(after)) return suffix;\n return commonGraphemeSuffixLength(before, after, suffix);\n}\n\nexport function needsBoundarySafeOffsets(text: string): boolean {\n return NON_ASCII_TEXT_PATTERN.test(text) || text.includes(\"\\r\\n\");\n}\n\nexport function textBoundarySegments(text: string): TextBoundarySegment[] {\n if (!needsBoundarySafeOffsets(text)) {\n return Array.from({ length: text.length }, (_, index) => ({\n value: text[index] ?? \"\",\n start: index,\n end: index + 1,\n }));\n }\n\n return Array.from(graphemeSegmenter.segment(text), (segment) => ({\n value: segment.segment,\n start: segment.index,\n end: segment.index + segment.segment.length,\n }));\n}\n\nexport function rangesAtGraphemeBoundaries(\n text: string,\n ranges: Array<[number, number]>,\n): Array<[number, number]> {\n if (ranges.length === 0 || !needsBoundarySafeOffsets(text)) return ranges;\n\n const segmentedText = graphemeSegmenter.segment(text);\n return ranges.map(([start, end]) => [\n graphemeStartAtOrBefore(segmentedText, start, text.length),\n graphemeEndAtOrAfter(segmentedText, end, text.length),\n ]);\n}\n\nfunction commonPrefixCodeUnitLength(before: string, after: string): number {\n const end = Math.min(before.length, after.length);\n let index = 0;\n while (index < end && before[index] === after[index]) index++;\n return index;\n}\n\nfunction commonSuffixCodeUnitLength(before: string, after: string, prefixLength: number): number {\n const maxLength = Math.min(before.length, after.length) - prefixLength;\n let length = 0;\n while (\n length < maxLength &&\n before[before.length - 1 - length] === after[after.length - 1 - length]\n )\n length++;\n return length;\n}\n\nfunction commonGraphemePrefixLength(before: string, after: string, prefix: number): number {\n const beforeSegments = graphemeSegmenter.segment(before);\n const afterSegments = graphemeSegmenter.segment(after);\n let safePrefix = prefix;\n while (safePrefix > 0) {\n const beforeBoundary = graphemeBoundaryAtOrBefore(beforeSegments, safePrefix);\n const afterBoundary = graphemeBoundaryAtOrBefore(afterSegments, safePrefix);\n const nextPrefix = Math.min(beforeBoundary, afterBoundary);\n if (nextPrefix === safePrefix) break;\n safePrefix = nextPrefix;\n }\n return safePrefix;\n}\n\nfunction commonGraphemeSuffixLength(before: string, after: string, suffix: number): number {\n const beforeSegments = graphemeSegmenter.segment(before);\n const afterSegments = graphemeSegmenter.segment(after);\n let safeSuffix = suffix;\n while (safeSuffix > 0) {\n const beforeStart = before.length - safeSuffix;\n const afterStart = after.length - safeSuffix;\n const beforeTrim =\n graphemeBoundaryAtOrAfter(beforeSegments, beforeStart, before.length) - beforeStart;\n const afterTrim =\n graphemeBoundaryAtOrAfter(afterSegments, afterStart, after.length) - afterStart;\n const trim = Math.max(beforeTrim, afterTrim);\n if (trim === 0) break;\n safeSuffix = Math.max(0, safeSuffix - trim);\n }\n return safeSuffix;\n}\n\nfunction graphemeBoundaryAtOrBefore(segments: GraphemeSegments, offset: number): number {\n if (offset <= 0) return 0;\n const segment = segments.containing(offset - 1);\n if (!segment) return offset;\n const segmentEnd = segment.index + segment.segment.length;\n return segmentEnd === offset ? offset : segment.index;\n}\n\nfunction graphemeBoundaryAtOrAfter(\n segments: GraphemeSegments,\n offset: number,\n textLength: number,\n): number {\n if (offset <= 0) return 0;\n if (offset >= textLength) return textLength;\n const segment = segments.containing(offset);\n if (!segment || segment.index === offset) return offset;\n return segment.index + segment.segment.length;\n}\n\nfunction graphemeStartAtOrBefore(\n segments: GraphemeSegments,\n offset: number,\n textLength: number,\n): number {\n if (offset <= 0) return 0;\n if (offset >= textLength) return textLength;\n const segment = segments.containing(offset - 1);\n if (!segment) return offset;\n const segmentEnd = segment.index + segment.segment.length;\n return segmentEnd === offset ? offset : segment.index;\n}\n\nfunction graphemeEndAtOrAfter(\n segments: GraphemeSegments,\n offset: number,\n textLength: number,\n): number {\n if (offset <= 0) return 0;\n if (offset >= textLength) return textLength;\n const segment = segments.containing(offset - 1);\n return segment ? segment.index + segment.segment.length : offset;\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { WordChangeConfidence } from \"./types.js\";\nimport { wordEmphasisTokenWeight, type WordEmphasisToken } from \"./tokens.js\";\nimport { suffixAlignedPairs } from \"./alignment.js\";\nimport type { TokenGroup } from \"./ranges.js\";\n\nconst WORD_EMPHASIS_EXACT_LCS_MAX_CELLS = 262_144;\n\nexport type ChangedTokenGap = { removed: TokenGroup; added: TokenGroup };\n\nexport function collectChangedTokenGaps(\n before: WordEmphasisToken[],\n beforeStart: number,\n beforeEnd: number,\n after: WordEmphasisToken[],\n afterStart: number,\n afterEnd: number,\n gaps: ChangedTokenGap[],\n): WordChangeConfidence {\n while (\n beforeStart < beforeEnd &&\n afterStart < afterEnd &&\n tokenAt(before, beforeStart).value === tokenAt(after, afterStart).value\n ) {\n beforeStart++;\n afterStart++;\n }\n\n while (\n beforeStart < beforeEnd &&\n afterStart < afterEnd &&\n tokenAt(before, beforeEnd - 1).value === tokenAt(after, afterEnd - 1).value\n ) {\n beforeEnd--;\n afterEnd--;\n }\n\n if (beforeStart === beforeEnd || afterStart === afterEnd) {\n appendChangedTokenGap(gaps, beforeStart, beforeEnd, afterStart, afterEnd);\n return \"high\";\n }\n\n const beforeLength = beforeEnd - beforeStart;\n const afterLength = afterEnd - afterStart;\n if (beforeLength * afterLength <= WORD_EMPHASIS_EXACT_LCS_MAX_CELLS) {\n collectChangedTokenGapsByLcs(before, beforeStart, beforeEnd, after, afterStart, afterEnd, gaps);\n return \"high\";\n }\n\n const anchors = uniqueOrderedAnchors(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n if (anchors.length === 0) {\n appendChangedTokenGap(gaps, beforeStart, beforeEnd, afterStart, afterEnd);\n return \"low\";\n }\n\n let confidence: WordChangeConfidence = \"high\";\n let previousBefore = beforeStart;\n let previousAfter = afterStart;\n for (const anchor of anchors) {\n confidence = lowerWordChangeConfidence(\n confidence,\n collectChangedTokenGaps(\n before,\n previousBefore,\n anchor.beforeIndex,\n after,\n previousAfter,\n anchor.afterIndex,\n gaps,\n ),\n );\n previousBefore = anchor.beforeIndex + 1;\n previousAfter = anchor.afterIndex + 1;\n }\n confidence = lowerWordChangeConfidence(\n confidence,\n collectChangedTokenGaps(\n before,\n previousBefore,\n beforeEnd,\n after,\n previousAfter,\n afterEnd,\n gaps,\n ),\n );\n return lowerWordChangeConfidence(confidence, \"medium\");\n}\n\nfunction lowerWordChangeConfidence(\n a: WordChangeConfidence,\n b: WordChangeConfidence,\n): WordChangeConfidence {\n return WORD_CHANGE_CONFIDENCE_RANK[a] <= WORD_CHANGE_CONFIDENCE_RANK[b] ? a : b;\n}\n\nconst WORD_CHANGE_CONFIDENCE_RANK = {\n low: 0,\n medium: 1,\n high: 2,\n} satisfies Record<WordChangeConfidence, number>;\n\nfunction collectChangedTokenGapsByLcs(\n before: WordEmphasisToken[],\n beforeStart: number,\n beforeEnd: number,\n after: WordEmphasisToken[],\n afterStart: number,\n afterEnd: number,\n gaps: ChangedTokenGap[],\n): void {\n const beforeLength = beforeEnd - beforeStart;\n const afterLength = afterEnd - afterStart;\n const pairs = suffixAlignedPairs(beforeLength, afterLength, (beforeIndex, afterIndex) => {\n const beforeToken = tokenAt(before, beforeStart + beforeIndex);\n const afterToken = tokenAt(after, afterStart + afterIndex);\n return beforeToken.value === afterToken.value\n ? wordEmphasisTokenWeight(beforeToken.value)\n : Number.NEGATIVE_INFINITY;\n });\n\n let beforeIndex = 0;\n let afterIndex = 0;\n for (const [nextBeforeIndex, nextAfterIndex] of pairs) {\n appendChangedTokenGap(\n gaps,\n beforeStart + beforeIndex,\n beforeStart + nextBeforeIndex,\n afterStart + afterIndex,\n afterStart + nextAfterIndex,\n );\n beforeIndex = nextBeforeIndex + 1;\n afterIndex = nextAfterIndex + 1;\n }\n appendChangedTokenGap(\n gaps,\n beforeStart + beforeIndex,\n beforeEnd,\n afterStart + afterIndex,\n afterEnd,\n );\n}\n\nfunction uniqueOrderedAnchors(\n before: WordEmphasisToken[],\n beforeStart: number,\n beforeEnd: number,\n after: WordEmphasisToken[],\n afterStart: number,\n afterEnd: number,\n): Array<{ beforeIndex: number; afterIndex: number }> {\n const beforeCounts = tokenCounts(before, beforeStart, beforeEnd);\n const afterCounts = tokenCounts(after, afterStart, afterEnd);\n const afterUniqueIndexes = new Map<string, number>();\n for (let index = afterStart; index < afterEnd; index++) {\n const value = tokenAt(after, index).value;\n if (beforeCounts.get(value) === 1 && afterCounts.get(value) === 1)\n afterUniqueIndexes.set(value, index);\n }\n const candidates: Array<{ beforeIndex: number; afterIndex: number }> = [];\n for (let index = beforeStart; index < beforeEnd; index++) {\n const value = tokenAt(before, index).value;\n if (beforeCounts.get(value) !== 1 || afterCounts.get(value) !== 1) continue;\n const afterIndex = afterUniqueIndexes.get(value);\n if (afterIndex !== undefined) candidates.push({ beforeIndex: index, afterIndex });\n }\n return longestIncreasingAfterIndexes(candidates);\n}\n\nfunction longestIncreasingAfterIndexes(\n candidates: Array<{ beforeIndex: number; afterIndex: number }>,\n): Array<{ beforeIndex: number; afterIndex: number }> {\n if (candidates.length <= 1) return candidates;\n const tails: number[] = [];\n const previous = Array.from({ length: candidates.length }, () => -1);\n const tailCandidateIndexes: number[] = [];\n\n for (let index = 0; index < candidates.length; index++) {\n const afterIndex = candidateAt(candidates, index).afterIndex;\n let low = 0;\n let high = tails.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (numberAt(tails, middle) < afterIndex) low = middle + 1;\n else high = middle;\n }\n if (low > 0) previous[index] = numberAt(tailCandidateIndexes, low - 1);\n tails[low] = afterIndex;\n tailCandidateIndexes[low] = index;\n }\n\n const ordered: Array<{ beforeIndex: number; afterIndex: number }> = [];\n let index = tailCandidateIndexes[tails.length - 1] ?? -1;\n while (index >= 0) {\n ordered.push(candidateAt(candidates, index));\n index = previous[index] ?? -1;\n }\n return ordered.reverse();\n}\n\nfunction tokenCounts(tokens: WordEmphasisToken[], start: number, end: number): Map<string, number> {\n const counts = new Map<string, number>();\n for (let index = start; index < end; index++) {\n const value = tokenAt(tokens, index).value;\n counts.set(value, (counts.get(value) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction appendChangedTokenGap(\n gaps: ChangedTokenGap[],\n beforeStart: number,\n beforeEnd: number,\n afterStart: number,\n afterEnd: number,\n): void {\n if (beforeStart === beforeEnd && afterStart === afterEnd) return;\n gaps.push({\n removed: { start: beforeStart, end: beforeEnd },\n added: { start: afterStart, end: afterEnd },\n });\n}\n\nfunction tokenAt(tokens: WordEmphasisToken[], index: number): WordEmphasisToken {\n const token = tokens[index];\n if (token === undefined) throw new RangeError(`Missing word-emphasis token ${index}`);\n return token;\n}\n\nfunction candidateAt(\n candidates: Array<{ beforeIndex: number; afterIndex: number }>,\n index: number,\n): { beforeIndex: number; afterIndex: number } {\n const candidate = candidates[index];\n if (candidate === undefined) throw new RangeError(`Missing anchor candidate ${index}`);\n return candidate;\n}\n\nfunction numberAt(values: number[], index: number): number {\n const value = values[index];\n if (value === undefined) throw new RangeError(`Missing numeric value ${index}`);\n return value;\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport { suffixAlignedPairs } from \"./alignment.js\";\nimport type { TextRange } from \"./ranges.js\";\nimport {\n commonPrefixLength,\n commonSuffixLength,\n needsBoundarySafeOffsets,\n textBoundarySegments,\n type TextBoundarySegment,\n} from \"./text-boundaries.js\";\nimport {\n isIdentifierToken,\n isMeaningfulOperatorToken,\n isNumberToken,\n type WordEmphasisToken,\n} from \"./tokens.js\";\nimport type { WordChangeRanges } from \"./types.js\";\n\nconst MAX_REFINED_TEXT_ALIGNMENT_CELLS = 1024;\nconst MAX_REFINED_TEXT_GRAPHEMES = 48;\nconst MAX_REFINED_TEXT_INTERNAL_RUNS = 4;\nconst MIN_REFINED_TEXT_INTERNAL_RUN_GRAPHEMES = 3;\n\ntype CommonTextRun = {\n beforeStart: number;\n beforeEnd: number;\n afterStart: number;\n afterEnd: number;\n};\n\nexport function refinedTokenTextRanges(\n beforeToken: WordEmphasisToken,\n afterToken: WordEmphasisToken,\n): WordChangeRanges | undefined {\n if (beforeToken.value === afterToken.value) return undefined;\n const prefix = commonPrefixLength(beforeToken.value, afterToken.value);\n const suffix = commonSuffixLength(beforeToken.value, afterToken.value, prefix);\n if (!shouldRefineTokenText(beforeToken.value, afterToken.value, prefix, suffix)) return undefined;\n const aligned = refinedTokenTextRangesByAlignment(beforeToken, afterToken, prefix, suffix);\n if (aligned) return aligned;\n\n return tokenTextGapRanges(\n beforeToken,\n afterToken,\n prefix,\n beforeToken.value.length - suffix,\n prefix,\n afterToken.value.length - suffix,\n );\n}\n\nfunction refinedTokenTextRangesByAlignment(\n beforeToken: WordEmphasisToken,\n afterToken: WordEmphasisToken,\n prefix: number,\n suffix: number,\n): WordChangeRanges | undefined {\n const beforeValue = beforeToken.value;\n const afterValue = afterToken.value;\n if (!isIdentifierToken(beforeValue) || !isIdentifierToken(afterValue)) return undefined;\n if (beforeValue.length * afterValue.length > MAX_REFINED_TEXT_ALIGNMENT_CELLS) return undefined;\n if (!hasPotentialInternalCommonText(beforeValue, afterValue, prefix, suffix)) return undefined;\n\n const beforeSegments = textBoundarySegments(beforeValue);\n const afterSegments = textBoundarySegments(afterValue);\n if (\n beforeSegments.length > MAX_REFINED_TEXT_GRAPHEMES ||\n afterSegments.length > MAX_REFINED_TEXT_GRAPHEMES ||\n beforeSegments.length * afterSegments.length > MAX_REFINED_TEXT_ALIGNMENT_CELLS\n )\n return undefined;\n\n const pairs = suffixAlignedPairs(beforeSegments.length, afterSegments.length, (before, after) =>\n segmentAt(beforeSegments, before).value === segmentAt(afterSegments, after).value\n ? 1\n : Number.NEGATIVE_INFINITY,\n );\n const runs = commonTextRuns(pairs);\n const keptRuns = runs.filter(\n (run) =>\n isEdgeTextRun(run, beforeSegments.length, afterSegments.length) ||\n run.beforeEnd - run.beforeStart >= MIN_REFINED_TEXT_INTERNAL_RUN_GRAPHEMES,\n );\n const internalRunCount = keptRuns.filter(\n (run) => !isEdgeTextRun(run, beforeSegments.length, afterSegments.length),\n ).length;\n if (internalRunCount === 0 || internalRunCount > MAX_REFINED_TEXT_INTERNAL_RUNS) return undefined;\n\n const removed: TextRange[] = [];\n const added: TextRange[] = [];\n let beforeIndex = 0;\n let afterIndex = 0;\n for (const run of keptRuns) {\n pushTextSegmentRange(removed, beforeToken, beforeSegments, beforeIndex, run.beforeStart);\n pushTextSegmentRange(added, afterToken, afterSegments, afterIndex, run.afterStart);\n beforeIndex = run.beforeEnd;\n afterIndex = run.afterEnd;\n }\n pushTextSegmentRange(removed, beforeToken, beforeSegments, beforeIndex, beforeSegments.length);\n pushTextSegmentRange(added, afterToken, afterSegments, afterIndex, afterSegments.length);\n\n return removed.length > 0 || added.length > 0 ? { removed, added } : undefined;\n}\n\nfunction tokenTextGapRanges(\n beforeToken: WordEmphasisToken,\n afterToken: WordEmphasisToken,\n beforeStart: number,\n beforeEnd: number,\n afterStart: number,\n afterEnd: number,\n): WordChangeRanges | undefined {\n const removed: TextRange[] =\n beforeStart < beforeEnd\n ? [[beforeToken.start + beforeStart, beforeToken.start + beforeEnd]]\n : [];\n const added: TextRange[] =\n afterStart < afterEnd ? [[afterToken.start + afterStart, afterToken.start + afterEnd]] : [];\n return removed.length > 0 || added.length > 0 ? { removed, added } : undefined;\n}\n\nfunction hasPotentialInternalCommonText(\n before: string,\n after: string,\n prefix: number,\n suffix: number,\n): boolean {\n const beforeMiddle = before.slice(prefix, before.length - suffix);\n const afterMiddle = after.slice(prefix, after.length - suffix);\n const [shorter, longer] =\n beforeMiddle.length <= afterMiddle.length\n ? [beforeMiddle, afterMiddle]\n : [afterMiddle, beforeMiddle];\n if (shorter.length < MIN_REFINED_TEXT_INTERNAL_RUN_GRAPHEMES) return false;\n\n for (let index = 0; index <= shorter.length - MIN_REFINED_TEXT_INTERNAL_RUN_GRAPHEMES; index++) {\n const candidate = shorter.slice(index, index + MIN_REFINED_TEXT_INTERNAL_RUN_GRAPHEMES);\n if (longer.includes(candidate)) return true;\n }\n return false;\n}\n\nfunction commonTextRuns(pairs: Array<[number, number]>): CommonTextRun[] {\n const runs: CommonTextRun[] = [];\n for (const [beforeIndex, afterIndex] of pairs) {\n const previous = runs.at(-1);\n if (previous?.beforeEnd === beforeIndex && previous.afterEnd === afterIndex) {\n previous.beforeEnd++;\n previous.afterEnd++;\n } else {\n runs.push({\n beforeStart: beforeIndex,\n beforeEnd: beforeIndex + 1,\n afterStart: afterIndex,\n afterEnd: afterIndex + 1,\n });\n }\n }\n return runs;\n}\n\nfunction isEdgeTextRun(run: CommonTextRun, beforeLength: number, afterLength: number): boolean {\n return (\n (run.beforeStart === 0 && run.afterStart === 0) ||\n (run.beforeEnd === beforeLength && run.afterEnd === afterLength)\n );\n}\n\nfunction pushTextSegmentRange(\n ranges: TextRange[],\n token: WordEmphasisToken,\n segments: TextBoundarySegment[],\n start: number,\n end: number,\n): void {\n if (start >= end) return;\n ranges.push([\n token.start + textSegmentOffset(segments, start, token.value.length),\n token.start + textSegmentOffset(segments, end, token.value.length),\n ]);\n}\n\nfunction textSegmentOffset(\n segments: TextBoundarySegment[],\n index: number,\n textLength: number,\n): number {\n return index === segments.length ? textLength : segmentAt(segments, index).start;\n}\n\nfunction segmentAt(segments: TextBoundarySegment[], index: number): TextBoundarySegment {\n const segment = segments[index];\n if (segment === undefined) throw new RangeError(`Missing text segment ${index}`);\n return segment;\n}\n\nfunction shouldRefineTokenText(\n before: string,\n after: string,\n prefix: number,\n suffix: number,\n): boolean {\n const sharedEdgeLength = prefix + suffix;\n if (sharedEdgeLength === 0) return false;\n if (isIdentifierToken(before) && isIdentifierToken(after)) {\n if (\n sharedEdgeLength < 2 &&\n !needsBoundarySafeOffsets(before) &&\n !needsBoundarySafeOffsets(after)\n )\n return false;\n if (prefix === 0 && suffix > 0) {\n const beforeChangedLength = before.length - suffix;\n const afterChangedLength = after.length - suffix;\n if (\n beforeChangedLength !== afterChangedLength &&\n Math.min(beforeChangedLength, afterChangedLength) < 2\n )\n return false;\n }\n return true;\n }\n if (isNumberToken(before) && isNumberToken(after)) return true;\n if (isMeaningfulOperatorToken(before) && isMeaningfulOperatorToken(after)) return true;\n return false;\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport {\n mergeRanges,\n mergeRangesByStart,\n pushTokenRange,\n rangesForTokenGroup,\n type TextRange,\n type TokenGroup,\n} from \"./ranges.js\";\nimport {\n commonPrefixLength,\n commonSuffixLength,\n rangesAtGraphemeBoundaries,\n} from \"./text-boundaries.js\";\nimport { collectChangedTokenGaps, type ChangedTokenGap } from \"./token-alignment.js\";\nimport {\n isIdentifierSimilarityPart,\n isIdentifierToken,\n isMeaningfulOperatorToken,\n isNumberToken,\n splitIdentifierToken,\n wordEmphasisTokenWeight,\n type WordEmphasisToken,\n} from \"./tokens.js\";\nimport type { WordChangeRanges } from \"./types.js\";\nimport { suffixAlignedPairs } from \"./alignment.js\";\nimport { refinedTokenTextRanges } from \"./token-text-refinement.js\";\n\nconst MAX_SOFT_TOKEN_ALIGNMENT_CELLS = 4096;\nconst MIN_SOFT_TOKEN_SUBSTITUTION_SIMILARITY = 0.45;\n\nexport function refinedRangesForChangedTokens(\n beforeText: string,\n beforeTokens: WordEmphasisToken[],\n afterText: string,\n afterTokens: WordEmphasisToken[],\n gaps: ChangedTokenGap[],\n): WordChangeRanges {\n const ranges = refinedRangesForTokenGaps(beforeTokens, afterTokens, gaps);\n return {\n removed: mergeRanges(rangesAtGraphemeBoundaries(beforeText, ranges.removed)),\n added: mergeRanges(rangesAtGraphemeBoundaries(afterText, ranges.added)),\n };\n}\n\nfunction refinedRangesForTokenGaps(\n beforeTokens: WordEmphasisToken[],\n afterTokens: WordEmphasisToken[],\n gaps: ChangedTokenGap[],\n): WordChangeRanges {\n const removed: TextRange[] = [];\n const added: TextRange[] = [];\n\n for (const gap of gaps) {\n const removedGroup = nonEmptyTokenGroup(gap.removed);\n const addedGroup = nonEmptyTokenGroup(gap.added);\n const refined =\n removedGroup && addedGroup\n ? refinedChangedTokenGroupRanges(beforeTokens, removedGroup, afterTokens, addedGroup)\n : undefined;\n if (refined) {\n removed.push(...refined.removed);\n added.push(...refined.added);\n continue;\n }\n if (removedGroup) removed.push(...rangesForTokenGroup(beforeTokens, removedGroup));\n if (addedGroup) added.push(...rangesForTokenGroup(afterTokens, addedGroup));\n }\n\n return { removed: mergeRanges(removed), added: mergeRanges(added) };\n}\n\nfunction nonEmptyTokenGroup(group: TokenGroup): TokenGroup | undefined {\n return group.start < group.end ? group : undefined;\n}\n\nfunction refinedChangedTokenGroupRanges(\n beforeTokens: WordEmphasisToken[],\n beforeGroup: TokenGroup,\n afterTokens: WordEmphasisToken[],\n afterGroup: TokenGroup,\n): WordChangeRanges | undefined {\n return (\n refinedSingleTokenRanges(beforeTokens, beforeGroup, afterTokens, afterGroup) ??\n refinedSoftTokenGroupRanges(beforeTokens, beforeGroup, afterTokens, afterGroup)\n );\n}\n\nfunction refinedSingleTokenRanges(\n beforeTokens: WordEmphasisToken[],\n beforeGroup: TokenGroup,\n afterTokens: WordEmphasisToken[],\n afterGroup: TokenGroup,\n): WordChangeRanges | undefined {\n if (beforeGroup.end - beforeGroup.start !== 1 || afterGroup.end - afterGroup.start !== 1)\n return undefined;\n return refinedTokenPairRanges(\n tokenAt(beforeTokens, beforeGroup.start),\n tokenAt(afterTokens, afterGroup.start),\n );\n}\n\nfunction refinedTokenPairRanges(\n beforeToken: WordEmphasisToken,\n afterToken: WordEmphasisToken,\n): WordChangeRanges | undefined {\n const identifierRanges = refinedIdentifierTokenRanges(beforeToken, afterToken);\n const textRanges = refinedTokenTextRanges(beforeToken, afterToken);\n if (identifierRanges && isNarrowerThanWholeTokens(identifierRanges, beforeToken, afterToken)) {\n if (shouldSuppressUnbalancedIdentifierPartRefinement(beforeToken, afterToken, textRanges))\n return textRanges;\n if (\n textRanges &&\n (textRanges.removed.length === 0 || textRanges.added.length === 0) &&\n highlightedRangeWidth(textRanges) < highlightedRangeWidth(identifierRanges)\n )\n return textRanges;\n return identifierRanges;\n }\n return textRanges ?? identifierRanges;\n}\n\nfunction highlightedRangeWidth(ranges: WordChangeRanges): number {\n let width = 0;\n for (const [start, end] of ranges.removed) width += end - start;\n for (const [start, end] of ranges.added) width += end - start;\n return width;\n}\n\nfunction shouldSuppressUnbalancedIdentifierPartRefinement(\n beforeToken: WordEmphasisToken,\n afterToken: WordEmphasisToken,\n textRanges: WordChangeRanges | undefined,\n): boolean {\n if (textRanges) return false;\n if (!isIdentifierToken(beforeToken.value) || !isIdentifierToken(afterToken.value)) return false;\n const beforePartCount = splitIdentifierToken(beforeToken.value, 0).filter((part) =>\n isIdentifierSimilarityPart(part.value),\n ).length;\n const afterPartCount = splitIdentifierToken(afterToken.value, 0).filter((part) =>\n isIdentifierSimilarityPart(part.value),\n ).length;\n return Math.min(beforePartCount, afterPartCount) === 1 && beforePartCount !== afterPartCount;\n}\n\nfunction refinedSoftTokenGroupRanges(\n beforeTokens: WordEmphasisToken[],\n beforeGroup: TokenGroup,\n afterTokens: WordEmphasisToken[],\n afterGroup: TokenGroup,\n): WordChangeRanges | undefined {\n const before = beforeTokens.slice(beforeGroup.start, beforeGroup.end);\n const after = afterTokens.slice(afterGroup.start, afterGroup.end);\n if (before.length * after.length > MAX_SOFT_TOKEN_ALIGNMENT_CELLS) return undefined;\n const pairs = softAlignedTokenPairs(before, after);\n if (pairs.length === 0) return undefined;\n\n const pairedBefore = new Set<number>();\n const pairedAfter = new Set<number>();\n const removed: TextRange[] = [];\n const added: TextRange[] = [];\n\n for (const [beforeIndex, afterIndex] of pairs) {\n pairedBefore.add(beforeIndex);\n pairedAfter.add(afterIndex);\n const beforeToken = tokenAt(before, beforeIndex);\n const afterToken = tokenAt(after, afterIndex);\n if (beforeToken.value === afterToken.value) continue;\n const refined = refinedTokenPairRanges(beforeToken, afterToken);\n if (refined) {\n removed.push(...refined.removed);\n added.push(...refined.added);\n } else {\n pushTokenRange(removed, beforeToken);\n pushTokenRange(added, afterToken);\n }\n }\n\n for (let index = 0; index < before.length; index++) {\n if (!pairedBefore.has(index)) pushTokenRange(removed, tokenAt(before, index));\n }\n for (let index = 0; index < after.length; index++) {\n if (!pairedAfter.has(index)) pushTokenRange(added, tokenAt(after, index));\n }\n\n const result = { removed: mergeRangesByStart(removed), added: mergeRangesByStart(added) };\n return result.removed.length > 0 || result.added.length > 0 ? result : undefined;\n}\n\nfunction softAlignedTokenPairs(\n before: WordEmphasisToken[],\n after: WordEmphasisToken[],\n): Array<[number, number]> {\n return suffixAlignedPairs(before.length, after.length, (beforeIndex, afterIndex) => {\n const substitution = softTokenSubstitutionWeight(\n tokenAt(before, beforeIndex),\n tokenAt(after, afterIndex),\n );\n return substitution > 0 ? substitution : Number.NEGATIVE_INFINITY;\n });\n}\n\nfunction softTokenSubstitutionWeight(\n beforeToken: WordEmphasisToken,\n afterToken: WordEmphasisToken,\n): number {\n if (beforeToken.value === afterToken.value) return wordEmphasisTokenWeight(beforeToken.value);\n const similarity = softTokenSimilarity(beforeToken.value, afterToken.value);\n return similarity >= MIN_SOFT_TOKEN_SUBSTITUTION_SIMILARITY\n ? Math.min(\n wordEmphasisTokenWeight(beforeToken.value),\n wordEmphasisTokenWeight(afterToken.value),\n ) * similarity\n : 0;\n}\n\nfunction softTokenSimilarity(before: string, after: string): number {\n if (isIdentifierToken(before) && isIdentifierToken(after))\n return identifierTokenSimilarity(before, after);\n if (isNumberToken(before) && isNumberToken(after)) return edgeTextSimilarity(before, after);\n if (isMeaningfulOperatorToken(before) && isMeaningfulOperatorToken(after))\n return edgeTextSimilarity(before, after);\n return 0;\n}\n\nfunction identifierTokenSimilarity(before: string, after: string): number {\n const beforeParts = splitIdentifierToken(before, 0)\n .map((part) => part.value.toLowerCase())\n .filter(isIdentifierSimilarityPart);\n const afterParts = splitIdentifierToken(after, 0)\n .map((part) => part.value.toLowerCase())\n .filter(isIdentifierSimilarityPart);\n const partSimilarity = tokenDiceSimilarity(beforeParts, afterParts);\n return Math.max(partSimilarity, edgeTextSimilarity(before, after));\n}\n\nfunction tokenDiceSimilarity(before: string[], after: string[]): number {\n if (before.length === 0 || after.length === 0) return 0;\n const remaining = new Map<string, number>();\n for (const token of before) remaining.set(token, (remaining.get(token) ?? 0) + 1);\n let shared = 0;\n for (const token of after) {\n const count = remaining.get(token) ?? 0;\n if (count === 0) continue;\n shared++;\n if (count === 1) remaining.delete(token);\n else remaining.set(token, count - 1);\n }\n return (2 * shared) / (before.length + after.length);\n}\n\nfunction edgeTextSimilarity(before: string, after: string): number {\n const prefix = commonPrefixLength(before, after);\n const suffix = commonSuffixLength(before, after, prefix);\n return (2 * (prefix + suffix)) / (before.length + after.length);\n}\n\nfunction refinedIdentifierTokenRanges(\n beforeToken: WordEmphasisToken,\n afterToken: WordEmphasisToken,\n): WordChangeRanges | undefined {\n if (!isIdentifierToken(beforeToken.value) || !isIdentifierToken(afterToken.value))\n return undefined;\n const beforeParts = splitIdentifierToken(beforeToken.value, beforeToken.start);\n const afterParts = splitIdentifierToken(afterToken.value, afterToken.start);\n if (beforeParts.length <= 1 && afterParts.length <= 1) return undefined;\n\n const gaps: ChangedTokenGap[] = [];\n collectChangedTokenGaps(\n beforeParts,\n 0,\n beforeParts.length,\n afterParts,\n 0,\n afterParts.length,\n gaps,\n );\n const ranges = refinedRangesForTokenGaps(beforeParts, afterParts, gaps);\n return hasWordChangeRanges(ranges) ? ranges : undefined;\n}\n\nfunction isNarrowerThanWholeTokens(\n ranges: WordChangeRanges,\n beforeToken: WordEmphasisToken,\n afterToken: WordEmphasisToken,\n): boolean {\n return (\n ranges.removed.some((range) => range[0] > beforeToken.start || range[1] < beforeToken.end) ||\n ranges.added.some((range) => range[0] > afterToken.start || range[1] < afterToken.end) ||\n ranges.removed.length === 0 ||\n ranges.added.length === 0\n );\n}\n\nfunction hasWordChangeRanges(ranges: WordChangeRanges): boolean {\n return ranges.removed.length > 0 || ranges.added.length > 0;\n}\n\nfunction tokenAt(tokens: WordEmphasisToken[], index: number): WordEmphasisToken {\n const token = tokens[index];\n if (token === undefined) throw new RangeError(`Missing word-emphasis token ${index}`);\n return token;\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { WordChangeRanges } from \"./types.js\";\nimport {\n isIdentifierToken,\n isMeaningfulOperatorToken,\n isNumberToken,\n isSymbolToken,\n wordTokenValues,\n} from \"./tokens.js\";\n\nexport function filterLowSignalWordEmphasis(\n before: string,\n after: string,\n ranges: WordChangeRanges,\n): WordChangeRanges {\n const hasRemovedSignal = ranges.removed.some((range) => hasSmartRangeSignal(before, range));\n const hasAddedSignal = ranges.added.some((range) => hasSmartRangeSignal(after, range));\n return {\n removed: ranges.removed.filter((range) =>\n shouldKeepSmartRange(before.slice(range[0], range[1]), hasAddedSignal),\n ),\n added: ranges.added.filter((range) =>\n shouldKeepSmartRange(after.slice(range[0], range[1]), hasRemovedSignal),\n ),\n };\n}\n\nfunction hasSmartRangeSignal(content: string, range: [number, number]): boolean {\n const tokens = wordTokenValues(content.slice(range[0], range[1]));\n return tokens.some(isSmartSignalToken);\n}\n\nfunction shouldKeepSmartRange(text: string, oppositeSideHasSignal: boolean): boolean {\n const tokens = wordTokenValues(text);\n const signalTokens = tokens.filter(isSmartSignalToken);\n if (signalTokens.length === 0) return false;\n const wordTokens = signalTokens.filter(\n (token) => isIdentifierToken(token) || isNumberToken(token),\n );\n const hasIntrinsicSignal = signalTokens.some(\n (token) => isMeaningfulOperatorToken(token) || isSymbolToken(token),\n );\n if (\n !oppositeSideHasSignal &&\n !hasIntrinsicSignal &&\n wordTokens.every((token) => LOW_SIGNAL_SYNTAX_TOKENS.has(token))\n )\n return false;\n if (!oppositeSideHasSignal && !hasIntrinsicSignal && isWrapperCallNoise(text, wordTokens))\n return false;\n return true;\n}\n\nfunction isSmartSignalToken(token: string): boolean {\n return (\n isIdentifierToken(token) ||\n isNumberToken(token) ||\n isMeaningfulOperatorToken(token) ||\n isSymbolToken(token)\n );\n}\n\nconst LOW_SIGNAL_SYNTAX_TOKENS = new Set([\n \"as\",\n \"const\",\n \"else\",\n \"export\",\n \"from\",\n \"function\",\n \"if\",\n \"import\",\n \"let\",\n \"var\",\n]);\n\nconst WRAPPER_CALL_TOKENS = new Set([\"filter\", \"flatMap\", \"forEach\", \"map\", \"reduce\"]);\n\nfunction isWrapperCallNoise(text: string, tokens: string[]): boolean {\n return (\n tokens.length === 1 &&\n tokens[0] !== undefined &&\n WRAPPER_CALL_TOKENS.has(tokens[0]) &&\n /^[\\s.()[\\]{};,]*[$_\\p{L}][$_\\p{L}\\p{N}\\p{Mark}]*[\\s.()[\\]{};,]*$/u.test(text)\n );\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport type { DiffWordEmphasis } from \"./types.js\";\nimport { refinedRangesForChangedTokens } from \"./range-refinement.js\";\nimport { filterLowSignalWordEmphasis } from \"./smart-filter.js\";\nimport { collectChangedTokenGaps, type ChangedTokenGap } from \"./token-alignment.js\";\nimport type { ConfidentWordChangeRanges, WordChangeConfidence, WordChangeRanges } from \"./types.js\";\nimport { wordEmphasisTokens, type WordEmphasisToken } from \"./tokens.js\";\n\nexport type { ConfidentWordChangeRanges, WordChangeConfidence, WordChangeRanges } from \"./types.js\";\n\nexport function shouldEmphasizeChangedPair(\n ranges: ConfidentWordChangeRanges,\n lineConfidence: WordChangeConfidence,\n): boolean {\n if (ranges.removed.length === 0 && ranges.added.length === 0) return false;\n if (lineConfidence === \"low\") return false;\n if (ranges.confidence === \"low\" && lineConfidence !== \"high\") return false;\n return true;\n}\n\nexport function changedRanges(\n before: string,\n after: string,\n wordEmphasis: DiffWordEmphasis,\n): WordChangeRanges {\n return stripWordChangeConfidence(changedRangesWithConfidence(before, after, wordEmphasis));\n}\n\nexport function changedRangesWithConfidence(\n before: string,\n after: string,\n wordEmphasis: DiffWordEmphasis,\n): ConfidentWordChangeRanges {\n if (wordEmphasis === \"off\") return emptyWordChangeRanges();\n return changedRangesForTokensWithConfidence(\n before,\n after,\n wordEmphasisTokens(before),\n wordEmphasisTokens(after),\n wordEmphasis,\n );\n}\n\nexport function changedRangesForTokensWithConfidence(\n before: string,\n after: string,\n beforeTokens: WordEmphasisToken[],\n afterTokens: WordEmphasisToken[],\n wordEmphasis: DiffWordEmphasis,\n): ConfidentWordChangeRanges {\n if (wordEmphasis === \"off\") return emptyWordChangeRanges();\n\n const gaps: ChangedTokenGap[] = [];\n const alignmentConfidence = collectChangedTokenGaps(\n beforeTokens,\n 0,\n beforeTokens.length,\n afterTokens,\n 0,\n afterTokens.length,\n gaps,\n );\n const ranges = refinedRangesForChangedTokens(before, beforeTokens, after, afterTokens, gaps);\n const confidence: WordChangeConfidence = hasWordChangeRanges(ranges)\n ? alignmentConfidence\n : \"low\";\n if (wordEmphasis !== \"smart\") return { ...ranges, confidence };\n\n const filtered = filterLowSignalWordEmphasis(before, after, ranges);\n return { ...filtered, confidence: hasWordChangeRanges(filtered) ? confidence : \"low\" };\n}\n\nfunction stripWordChangeConfidence(ranges: ConfidentWordChangeRanges): WordChangeRanges {\n return { removed: ranges.removed, added: ranges.added };\n}\n\nfunction hasWordChangeRanges(ranges: WordChangeRanges): boolean {\n return ranges.removed.length > 0 || ranges.added.length > 0;\n}\n\nfunction emptyWordChangeRanges(): ConfidentWordChangeRanges {\n return { removed: [], added: [], confidence: \"low\" };\n}\n", "// Adapted from pi-code-previews; see THIRD_PARTY_NOTICES.md.\nimport {\n changedLineTokens,\n indexedChangedLine,\n normalizedChangedContent,\n type IndexedChangedLine,\n} from \"./changed-line.js\";\nimport { matchChangedLines, type ChangedLinePair } from \"./line-matching.js\";\nimport type { DiffWordEmphasis } from \"./types.js\";\nimport {\n isAddedDiffLine,\n isRemovedDiffLine,\n type AddedDiffLine,\n type ParsedDiffLine,\n type RemovedDiffLine,\n} from \"./parse.js\";\nimport { changedRangesForTokensWithConfidence } from \"./emphasis.js\";\nimport type { ConfidentWordChangeRanges } from \"./types.js\";\n\ntype ChangedLineBlockAnalysis = {\n removed: Array<IndexedChangedLine<RemovedDiffLine>>;\n added: Array<IndexedChangedLine<AddedDiffLine>>;\n pairs: ChangedLinePair[];\n ranges: ChangedLineRangePair[];\n};\n\ntype ChangedLineRangePair = {\n pair: ChangedLinePair;\n ranges: ConfidentWordChangeRanges;\n};\n\nexport function analyzeChangedLineBlock(\n block: ParsedDiffLine[],\n wordEmphasis: DiffWordEmphasis,\n): ChangedLineBlockAnalysis {\n const removed: Array<IndexedChangedLine<RemovedDiffLine>> = [];\n const added: Array<IndexedChangedLine<AddedDiffLine>> = [];\n for (let index = 0; index < block.length; index++) {\n const line = block[index];\n if (line === undefined) continue;\n if (isRemovedDiffLine(line)) removed.push(indexedChangedLine(index, line));\n else if (isAddedDiffLine(line)) added.push(indexedChangedLine(index, line));\n }\n const removedByIndex = new Map(removed.map((line) => [line.index, line]));\n const addedByIndex = new Map(added.map((line) => [line.index, line]));\n const pairs = matchChangedLines(removed, added);\n const ranges: ChangedLineRangePair[] = [];\n\n for (const pair of pairs) {\n const removedLine = removedByIndex.get(pair.removedIndex);\n const addedLine = addedByIndex.get(pair.addedIndex);\n if (!removedLine || !addedLine) continue;\n ranges.push({\n pair,\n ranges: changedRangesForTokensWithConfidence(\n normalizedChangedContent(removedLine),\n normalizedChangedContent(addedLine),\n changedLineTokens(removedLine),\n changedLineTokens(addedLine),\n wordEmphasis,\n ),\n });\n }\n\n return { removed, added, pairs, ranges };\n}\n", "import type { ParsedDiffLine } from \"./parse.js\";\nimport { analyzeChangedLineBlock } from \"./change-block.js\";\nimport { shouldEmphasizeChangedPair } from \"./emphasis.js\";\nimport type { DiffWordEmphasis } from \"./types.js\";\n\nexport const changedLineEmphasis = (\n block: ParsedDiffLine[],\n wordEmphasis: DiffWordEmphasis,\n): Map<number, { ranges: Array<[number, number]>; kind: \"add\" | \"remove\" }> => {\n const emphasis = new Map<\n number,\n { ranges: Array<[number, number]>; kind: \"add\" | \"remove\" }\n >();\n if (wordEmphasis === \"off\") return emphasis;\n\n for (const { pair, ranges } of analyzeChangedLineBlock(block, wordEmphasis).ranges) {\n if (!shouldEmphasizeChangedPair(ranges, pair.confidence)) continue;\n emphasis.set(pair.removedIndex, { ranges: ranges.removed, kind: \"remove\" });\n emphasis.set(pair.addedIndex, { ranges: ranges.added, kind: \"add\" });\n }\n return emphasis;\n};\n", "import { createHash } from \"node:crypto\";\nimport type { AppKeybinding, Theme } from \"@oh-my-pi/pi-coding-agent\";\nimport type { CodePreviewSettings } from \"./code-preview.js\";\nimport { formatToolCallDuration } from \"./tool-call-timing.js\";\nimport {\n getKeybindings,\n truncateToWidth,\n visibleWidth,\n wrapTextWithAnsi,\n type Component,\n} from \"@oh-my-pi/pi-tui\";\nimport { highlightCode, languageFromPath } from \"./highlight.js\";\nimport { headlineArg } from \"../core/call-preview.js\";\nimport { coreToolTitle, renderCoreToolBody } from \"./core-tool-render.js\";\nimport { isFabricAgentToolPreview, type FabricAgentToolPreviewNode, type FabricTranscriptEntry } from \"./transcript.js\";\nimport { fabricStringLiterals, fabricWriteBindings, type FabricWriteBinding } from \"./fabric-code-parser.js\";\nexport { fabricWriteBindings, type FabricWriteBinding } from \"./fabric-code-parser.js\";\nimport {\n applyDiffBackground,\n createDiffBackgroundResolver,\n parseMarkedDiffLine,\n wrapDiffAnsiToWidth,\n type DiffBackgroundIntensity,\n} from \"./diff-background.js\";\n\nexport interface FabricRenderAudit {\n ref: string;\n tool?: string;\n provider?: string;\n success?: boolean;\n error?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n resultTruncated?: boolean;\n preview?: unknown;\n /** True for audits reconstructed from the durable trace: args are privacy-projected and results/previews were never persisted. */\n fromTrace?: boolean;\n startedAt?: number;\n endedAt?: number;\n previewHeadline?: string;\n}\n\nconst configuredDiffWrapRows = Number.parseInt(\n process.env.CODE_PREVIEW_DIFF_WRAP_ROWS ?? \"\",\n 10,\n);\nconst DIFF_WRAP_ROWS =\n Number.isFinite(configuredDiffWrapRows) && configuredDiffWrapRows > 0\n ? configuredDiffWrapRows\n : 3;\n\nconst EXPAND_KEYBINDING = \"app.tools.expand\" as AppKeybinding;\nconst COLLAPSED_MULTICALL_LIMIT = 8;\nconst EXPANDED_MULTICALL_LIMIT = 30;\nconst AGENT_RESPONSE_LINE_CODE_POINTS = 240;\nconst EXPANDED_AGENT_TOOL_BODY_COUNT = 2;\nconst EXPANDED_AGENT_TOOL_BODY_LINES = 12;\nconst FULL_SGR_RESET = \"\\x1b[0m\";\nconst TEXT_SGR_RESET = \"\\x1b[22;23;24;27;29;39m\";\nconst INHERITED_TEXT_RESET_PARAMETERS = [\n \"22\", \"23\", \"24\", \"25\", \"27\", \"28\", \"29\", \"39\", \"54\", \"55\",\n];\nconst SGR_SEQUENCE = /\\x1b\\[([0-9:;]*)m/g;\n\nexport const inheritEnclosingBackground = (text: string): string =>\n text.replace(SGR_SEQUENCE, (_sequence, rawParameters: string) => {\n const parameters = rawParameters === \"\" ? [\"0\"] : rawParameters.split(\";\");\n const kept: string[] = [];\n for (let index = 0; index < parameters.length; index++) {\n const parameter = parameters[index]!;\n const code = Number.parseInt(parameter, 10);\n if (parameter === \"0\") {\n kept.push(...INHERITED_TEXT_RESET_PARAMETERS);\n } else if (parameter.startsWith(\"48:\")) {\n continue;\n } else if (code === 38 || code === 58) {\n const mode = parameters[index + 1];\n const end = index + (mode === \"2\" ? 4 : mode === \"5\" ? 2 : 0);\n kept.push(...parameters.slice(index, end + 1));\n index = end;\n } else if (code === 48) {\n const mode = parameters[index + 1];\n index += mode === \"2\" ? 4 : mode === \"5\" ? 2 : 0;\n } else if (\n code === 49\n || code === 7\n || (code >= 40 && code <= 47)\n || (code >= 100 && code <= 107)\n ) {\n continue;\n } else {\n kept.push(parameter);\n }\n }\n return kept.length > 0 ? `\\x1b[${kept.join(\";\")}m` : \"\";\n });\n\nexport const safeTerminalText = (value: string): string =>\n value.replace(/[\\u0000-\\u0008\\u000b-\\u001f\\u007f-\\u009f]/g, (character) => {\n const code = character.codePointAt(0)?.toString(16).padStart(2, \"0\") ?? \"00\";\n return `\\\\x${code}`;\n });\n\nconst truncateBoundedLine = (line: string, width: number): string => {\n const truncated = truncateToWidth(line, width, \"\");\n if (visibleWidth(line) <= width) return truncated;\n if (truncated.endsWith(FULL_SGR_RESET)) {\n return truncated.slice(0, -FULL_SGR_RESET.length) + TEXT_SGR_RESET;\n }\n return truncated.endsWith(TEXT_SGR_RESET) ? truncated : truncated + TEXT_SGR_RESET;\n};\n\nclass BoundedLineList implements Component {\n #cachedWidth: number | undefined;\n #cachedRows: string[] | undefined;\n\n constructor(\n readonly lines: string[],\n private readonly theme?: Theme,\n private readonly diffIntensity: DiffBackgroundIntensity = \"off\",\n private readonly wrapLineIndexes?: ReadonlySet<number>,\n private readonly inheritBackground = false,\n ) {}\n\n render(width: number): string[] {\n if (this.#cachedWidth === width && this.#cachedRows) return this.#cachedRows;\n if (width <= 0) return this.#cache(width, []);\n const diffBackground = createDiffBackgroundResolver(this.theme, this.diffIntensity);\n const rows: string[] = [];\n for (let lineIndex = 0; lineIndex < this.lines.length; lineIndex++) {\n const rawLine = this.lines[lineIndex]!;\n const { kind, line } = parseMarkedDiffLine(rawLine);\n if (!kind) {\n let renderedRows: string[];\n if (this.wrapLineIndexes?.has(lineIndex)) {\n const continuationIndent = width > 2 ? \" \" : \"\";\n const wrapped = wrapTextWithAnsi(\n line,\n Math.max(1, width - visibleWidth(continuationIndent)),\n );\n renderedRows = wrapped.map(\n (row, index) => truncateBoundedLine(\n index === 0 ? row : continuationIndent + row,\n width,\n ),\n );\n } else renderedRows = [truncateBoundedLine(line, width)];\n rows.push(...(\n this.inheritBackground\n ? renderedRows.map(inheritEnclosingBackground)\n : renderedRows\n ));\n continue;\n }\n const pipe = line.indexOf(\"\u2502 \");\n const continuationPrefix = pipe < 0\n ? \"\"\n : \" \".repeat(visibleWidth(line.slice(0, pipe + 2)));\n const wrappedRows = wrapDiffAnsiToWidth(\n line,\n width,\n DIFF_WRAP_ROWS,\n visibleWidth(continuationPrefix) < width ? continuationPrefix : \"\",\n );\n for (const row of wrappedRows) {\n const padding = \" \".repeat(Math.max(0, width - visibleWidth(row)));\n rows.push(applyDiffBackground(row + padding, diffBackground(kind)));\n }\n }\n return this.#cache(width, rows);\n }\n\n invalidate(): void {\n this.#cachedWidth = undefined;\n this.#cachedRows = undefined;\n }\n\n withInheritedBackground(): BoundedLineList {\n if (this.inheritBackground) return this;\n return new BoundedLineList(\n this.lines,\n this.theme,\n this.diffIntensity,\n this.wrapLineIndexes,\n true,\n );\n }\n\n #cache(width: number, rows: string[]): string[] {\n this.#cachedWidth = width;\n this.#cachedRows = rows;\n return rows;\n }\n}\n\nclass InheritedBackgroundComponent implements Component {\n constructor(private readonly child: Component) {}\n\n render(width: number): string[] {\n return this.child.render(width).map(inheritEnclosingBackground);\n }\n\n invalidate(): void {\n this.child.invalidate?.();\n }\n}\n\nexport const inheritComponentBackground = (component: Component): Component =>\n component instanceof BoundedLineList\n ? component.withInheritedBackground()\n : new InheritedBackgroundComponent(component);\n\nexport const renderBoundedLines = (\n lines: string[],\n theme?: Theme,\n diffIntensity: DiffBackgroundIntensity = \"off\",\n wrapLineIndexes?: ReadonlySet<number>,\n): Component => new BoundedLineList(lines, theme, diffIntensity, wrapLineIndexes);\n\nexport const fabricMulticallCallLimit = (expanded: boolean): number =>\n expanded ? EXPANDED_MULTICALL_LIMIT : COLLAPSED_MULTICALL_LIMIT;\n\nconst visibleMulticallAudits = (\n audits: FabricRenderAudit[],\n expanded: boolean,\n): Array<{ audit: FabricRenderAudit; auditIndex: number }> => {\n const limit = fabricMulticallCallLimit(expanded);\n if (expanded || audits.length <= limit) {\n return audits.slice(0, limit).map((audit, auditIndex) => ({ audit, auditIndex }));\n }\n const active = audits\n .map((audit, auditIndex) => ({ audit, auditIndex }))\n .filter(({ audit }) => audit.success === undefined);\n const selected = new Set(\n active.slice(-limit).map(({ auditIndex }) => auditIndex),\n );\n for (let auditIndex = 0; auditIndex < audits.length && selected.size < limit; auditIndex++) {\n if (!selected.has(auditIndex)) selected.add(auditIndex);\n }\n return [...selected]\n .sort((left, right) => left - right)\n .map((auditIndex) => ({ audit: audits[auditIndex]!, auditIndex }));\n};\n\n/** Render the \"keybinding to expand\" hint, mirroring OMP core's native tool previews. */\nexport function expandHint(theme: Theme): string {\n let keys: string[] = [];\n try {\n keys = getKeybindings().getKeys(EXPAND_KEYBINDING);\n } catch {\n keys = [];\n }\n const keyText = keys.length > 0 ? keys.join(\"/\") : \"ctrl-o\";\n return theme.fg(\"dim\", `${keyText} to expand`);\n}\n\nconst truncateOneLine = (value: string, max: number): string => {\n const single = value.replace(/\\s+/g, \" \").trim();\n return single.length <= max ? single : `${single.slice(0, max - 1)}\u2026`;\n};\n\nconst argString = (args: Record<string, unknown>, key: string): string | undefined =>\n typeof args[key] === \"string\" ? (args[key] as string) : undefined;\n\nconst LEGACY_COMMAND_DIGEST = /^sha256:[a-f0-9]{64}$/;\nconst legacyCommandCache = new WeakMap<object, ReadonlyMap<string, string>>();\n\nconst digestCommand = (command: string): string =>\n `sha256:${createHash(\"sha256\").update(command).digest(\"hex\")}`;\n\nconst recordOf = (value: unknown): Record<string, unknown> | undefined =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n\nconst legacyCommandsFrom = (fabricArgs: unknown): ReadonlyMap<string, string> => {\n const args = recordOf(fabricArgs);\n if (!args) return new Map();\n const cached = legacyCommandCache.get(args);\n if (cached) return cached;\n\n const commands = new Map<string, string>();\n const remember = (candidate: unknown): void => {\n if (typeof candidate === \"string\") commands.set(digestCommand(candidate), candidate);\n };\n const namedStrings = recordOf(args.payloads);\n if (namedStrings) {\n for (const value of Object.values(namedStrings)) remember(value);\n }\n const rawCode = args.code;\n const code =\n typeof rawCode === \"string\"\n ? rawCode\n : Array.isArray(rawCode) && rawCode.every((value) => typeof value === \"string\")\n ? rawCode.join(\"\\n\")\n : undefined;\n if (code) {\n for (const literal of fabricStringLiterals(code)) remember(literal);\n }\n legacyCommandCache.set(args, commands);\n return commands;\n};\n\nexport const restoreLegacyBashCommands = (\n audits: FabricRenderAudit[],\n fabricArgs: unknown,\n): FabricRenderAudit[] => {\n const hasLegacyCommand = audits.some((audit) => {\n const digest = audit.ref === \"omp.bash\" ? argString(audit.args ?? {}, \"commandDigest\") : undefined;\n return Boolean(digest && LEGACY_COMMAND_DIGEST.test(digest));\n });\n if (!hasLegacyCommand) return audits;\n\n const commands = legacyCommandsFrom(fabricArgs);\n return audits.map((audit) => {\n if (audit.ref !== \"omp.bash\" || !audit.args) return audit;\n const digest = argString(audit.args, \"commandDigest\");\n if (!digest || !LEGACY_COMMAND_DIGEST.test(digest)) return audit;\n const { commandDigest: _commandDigest, ...argsWithoutDigest } = audit.args;\n const command = commands.get(digest);\n return {\n ...audit,\n args: command ? { ...argsWithoutDigest, command } : argsWithoutDigest,\n };\n });\n};\n\nexport interface FabricWriteArgumentPreviewInput {\n bindings: FabricWriteBinding[];\n payloads?: Record<string, string> | undefined;\n expanded: boolean;\n cwd?: string | undefined;\n settings?: CodePreviewSettings | undefined;\n spinner?: string | undefined;\n}\n\nconst renderWriteArgumentBody = (\n path: string,\n content: string,\n expanded: boolean,\n theme: Theme,\n invalidate?: () => void,\n parity?: { cwd: string; settings: CodePreviewSettings },\n): { lines: string[]; hidden: number } => {\n if (parity) {\n const rendered = renderCoreToolBody(\n { ref: \"omp.write\", provider: \"omp\", tool: \"write\", args: { path, content } },\n theme,\n {\n cwd: parity.cwd,\n settings: parity.settings,\n expanded,\n maxLines: 200,\n ...(invalidate ? { invalidate } : {}),\n },\n );\n if (rendered) return rendered;\n }\n const allLines = safeTerminalText(content).split(\"\\n\");\n while (allLines.length > 0 && allLines[allLines.length - 1] === \"\") allLines.pop();\n const limit = expanded ? Math.min(allLines.length, 200) : 10;\n const shown = allLines.slice(0, limit);\n const lang = languageFromPath(path);\n const highlighted = lang && shown.length > 0\n ? highlightCode(shown.join(\"\\n\"), lang, invalidate)\n : null;\n return {\n lines: shown.map((line, index) =>\n highlighted?.[index] ?? theme.fg(\"toolOutput\", line || \" \"),\n ),\n hidden: allLines.length - shown.length,\n };\n};\n\nexport const renderFabricWriteArgumentPreview = (\n input: FabricWriteArgumentPreviewInput,\n theme: Theme,\n invalidate?: () => void,\n): Component | null => {\n const available = input.bindings.map(\n (binding) => input.payloads?.[binding.stringKey],\n );\n let activeIndex = -1;\n for (let index = 0; index < available.length; index++) {\n if (typeof available[index] === \"string\") activeIndex = index;\n }\n if (activeIndex < 0) return null;\n\n if (input.bindings.length === 1) {\n const binding = input.bindings[0]!;\n const rows = [\n nestedCallTitle(\n {\n ref: \"omp.write\",\n provider: \"omp\",\n tool: \"write\",\n args: { path: binding.path, content: available[0] ?? \"\" },\n },\n theme,\n invalidate,\n input.cwd && input.settings ? { cwd: input.cwd, settings: input.settings } : undefined,\n ),\n ];\n const body = renderWriteArgumentBody(\n binding.path,\n available[0] ?? \"\",\n input.expanded,\n theme,\n invalidate,\n input.cwd && input.settings ? { cwd: input.cwd, settings: input.settings } : undefined,\n );\n rows.push(...body.lines);\n if (body.hidden > 0) {\n rows.push(\n theme.fg(\"dim\", `\u2026 ${body.hidden} more ${body.hidden === 1 ? \"line\" : \"lines\"}`) +\n (input.expanded ? \"\" : theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme)),\n );\n }\n return renderBoundedLines(rows);\n }\n\n const completed = Math.max(\n 0,\n available.filter((value) => typeof value === \"string\").length - 1,\n );\n const rows = [\n theme.fg(\n \"warning\",\n `\u25C6 Fabric composing \u00B7 ${completed}/${input.bindings.length} writes`,\n ),\n ];\n const callLimit = fabricMulticallCallLimit(input.expanded);\n const shownBindings = input.bindings.slice(0, callLimit);\n for (let index = 0; index < shownBindings.length; index++) {\n const binding = shownBindings[index]!;\n const glyph =\n index !== activeIndex && typeof available[index] === \"string\"\n ? theme.fg(\"dim\", \"\u203A\")\n : index === activeIndex\n ? theme.fg(\"warning\", input.spinner ?? \"\u25D0\")\n : theme.fg(\"dim\", \"\u25CB\");\n rows.push(\n `${glyph} ${nestedCallTitle(\n {\n ref: \"omp.write\",\n provider: \"omp\",\n tool: \"write\",\n args: {\n path: binding.path,\n ...(typeof available[index] === \"string\" ? { content: available[index] } : {}),\n },\n },\n theme,\n invalidate,\n input.cwd && input.settings ? { cwd: input.cwd, settings: input.settings } : undefined,\n )}`,\n );\n if (index === activeIndex) {\n const body = renderWriteArgumentBody(\n binding.path,\n available[index] ?? \"\",\n input.expanded,\n theme,\n invalidate,\n input.cwd && input.settings ? { cwd: input.cwd, settings: input.settings } : undefined,\n );\n for (const line of body.lines) rows.push(` ${line}`);\n if (body.hidden > 0) {\n rows.push(\n theme.fg(\"dim\", ` \u2026 ${body.hidden} more ${body.hidden === 1 ? \"line\" : \"lines\"}`),\n );\n }\n }\n }\n const hidden = input.bindings.length - shownBindings.length;\n if (hidden > 0) {\n rows.push(\n theme.fg(\"dim\", `\u2026 ${hidden} more ${hidden === 1 ? \"write\" : \"writes\"}`) +\n (input.expanded ? \"\" : theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme)),\n );\n }\n return renderBoundedLines(rows);\n};\n\nconst shortIdOf = (value: unknown): string | undefined =>\n typeof value === \"string\" ? value.slice(0, 8) : undefined;\n\nconst countOf = (result: unknown): string =>\n Array.isArray(result) ? String(result.length) : \"\";\n\nconst providerCallDetail = (\n provider: string,\n tool: string,\n args: Record<string, unknown>,\n result: unknown,\n preview: unknown,\n previewHeadline?: string,\n): string => {\n if (provider === \"agents\") {\n if (previewHeadline) return previewHeadline;\n const name = argString(args, \"name\");\n const previewName = isFabricAgentToolPreview(preview) ? preview.name : undefined;\n const id = shortIdOf(args.id);\n const message = argString(args, \"message\");\n const task = argString(args, \"task\");\n switch (tool) {\n case \"create\":\n return name ?? \"\";\n case \"remove\":\n case \"stop\":\n case \"cleanup\":\n case \"wait\":\n case \"status\":\n case \"actorStatus\":\n case \"messages\":\n return previewName ?? name ?? id ?? \"\";\n case \"ask\":\n case \"tell\":\n return [previewName ?? name ?? id, message ? truncateOneLine(message, 48) : \"\"]\n .filter(Boolean)\n .join(\" \");\n case \"run\":\n case \"spawn\":\n return name ?? (task ? truncateOneLine(task, 64) : previewName ?? \"\");\n case \"actors\":\n case \"list\":\n case \"models\":\n case \"peers\":\n return countOf(result);\n default:\n return previewName ?? id ?? \"\";\n }\n }\n if (provider === \"mesh\") {\n if (previewHeadline) return previewHeadline;\n switch (tool) {\n case \"publish\":\n return argString(args, \"topic\") ?? \"\";\n case \"read\":\n return [argString(args, \"topic\"), countOf(result)].filter(Boolean).join(\" \u00B7 \");\n case \"get\":\n case \"put\":\n case \"delete\":\n return argString(args, \"key\") ?? \"\";\n case \"list\":\n return [argString(args, \"prefix\"), countOf(result)].filter(Boolean).join(\" \u00B7 \");\n case \"members\":\n return countOf(result);\n default:\n return \"\";\n }\n }\n if (provider === \"mcp\") {\n if (previewHeadline) return previewHeadline;\n switch (tool) {\n case \"$call\":\n return [argString(args, \"server\"), argString(args, \"tool\")].filter(Boolean).join(\".\");\n case \"$register\":\n return argString(args, \"name\") ?? \"\";\n case \"$servers\":\n return countOf(result);\n default:\n return \"\";\n }\n }\n return \"\";\n};\n\nconst structuralCallDetail = (\n provider: string,\n tool: string,\n args: Record<string, unknown>,\n result: unknown,\n): string => {\n if (provider !== \"fabric\") return \"\";\n const count = countOf(result);\n switch (tool) {\n case \"discovery.providers\":\n case \"discovery.models\":\n case \"discovery.search\":\n return count;\n case \"discovery.list\":\n return [argString(args, \"provider\"), argString(args, \"namespace\"), count]\n .filter(Boolean)\n .join(\" \u00B7 \");\n case \"discovery.describe\":\n return argString(args, \"ref\") ?? \"\";\n case \"workflow.parallel\":\n case \"workflow.pipeline\": {\n const itemCount = typeof args.itemCount === \"number\" ? args.itemCount : undefined;\n const stageCount = typeof args.stageCount === \"number\" ? args.stageCount : undefined;\n return [\n itemCount !== undefined ? `${itemCount} ${itemCount === 1 ? \"item\" : \"items\"}` : \"\",\n stageCount !== undefined ? `${stageCount} ${stageCount === 1 ? \"stage\" : \"stages\"}` : \"\",\n ].filter(Boolean).join(\" \u00B7 \");\n }\n default:\n return \"\";\n }\n};\n\nconst callHeadlinePreview = (audit: FabricRenderAudit): string | undefined => {\n const ref = audit.ref;\n const provider = audit.provider ?? ref.split(\".\")[0] ?? ref;\n const tool = audit.tool ?? ref.split(\".\")[1] ?? ref;\n const args = audit.args ?? {};\n return providerCallDetail(provider, tool, args, audit.result, audit.preview)\n || headlineArg(args)\n || structuralCallDetail(provider, tool, args, audit.result);\n};\n\nconst nestedResultTruncated = (audit: FabricRenderAudit): boolean => {\n if (audit.resultTruncated === true) return true;\n const result = audit.result;\n if (typeof result !== \"object\" || result === null) return false;\n const details = (result as Record<string, unknown>).details;\n if (typeof details !== \"object\" || details === null) return false;\n const truncation = (details as Record<string, unknown>).truncation;\n if (typeof truncation !== \"object\" || truncation === null) return false;\n return (truncation as Record<string, unknown>).truncated === true;\n};\n\n/** Compact one-line title for a nested Fabric call, e.g. `read src/index.ts` or `$ ls -la`. */\nexport function nestedCallTitle(\n audit: FabricRenderAudit,\n theme: Theme,\n invalidate?: () => void,\n core?: { cwd: string; settings: CodePreviewSettings },\n): string {\n const title = nestedCallTitleText(audit, theme, invalidate, core);\n return nestedResultTruncated(audit)\n ? `${title} ${theme.fg(\"warning\", \"\u00B7 truncated\")}`\n : title;\n}\n\nconst nestedCallTitleText = (\n audit: FabricRenderAudit,\n theme: Theme,\n invalidate?: () => void,\n core?: { cwd: string; settings: CodePreviewSettings },\n): string => {\n const coreTitle = core\n ? coreToolTitle(audit, theme, { ...core, ...(invalidate ? { invalidate } : {}) })\n : null;\n if (coreTitle) return coreTitle;\n const timing = core?.settings.toolCallTiming\n ? formatToolCallDuration(audit.startedAt, audit.endedAt)\n : undefined;\n const withTiming = (value: string): string =>\n timing ? `${value}${theme.fg(\"dim\", ` \u00B7 ${timing}`)}` : value;\n const ref = audit.ref;\n const provider = audit.provider ?? ref.split(\".\")[0] ?? ref;\n const tool = audit.tool ?? ref.split(\".\")[1] ?? ref;\n const title = theme.fg(\"toolTitle\", theme.bold(tool));\n const args = audit.args ?? {};\n const providerDetail = providerCallDetail(\n provider,\n tool,\n args,\n audit.result,\n audit.preview,\n audit.previewHeadline,\n );\n if (providerDetail) return withTiming(`${title} ${theme.fg(\"accent\", providerDetail)}`);\n const command = argString(args, \"command\");\n if (command) {\n const firstLine = command.split(\"\\n\")[0] ?? \"\";\n const highlighted =\n firstLine.length > 0 ? highlightCode(firstLine, \"bash\", invalidate) : null;\n const cmd =\n highlighted && highlighted[0] ? highlighted[0] : theme.fg(\"accent\", firstLine);\n return withTiming(`${title} ${theme.fg(\"dim\", \"$\")} ${cmd}`);\n }\n const path = argString(args, \"path\");\n const pattern = argString(args, \"pattern\");\n const task = argString(args, \"task\");\n let detail = \"\";\n if (path) detail = path;\n else if (pattern) detail = `/${pattern}/${path ? ` ${path}` : \"\"}`;\n else if (task) detail = truncateOneLine(task, 64);\n else {\n detail = headlineArg(args)\n || structuralCallDetail(provider, tool, args, audit.result)\n || audit.previewHeadline\n || \"\";\n }\n return withTiming(detail ? `${title} ${theme.fg(\"accent\", detail)}` : title);\n};\n\nconst transcriptToolAudit = (entry: FabricTranscriptEntry): FabricRenderAudit => {\n const rawName = entry.toolName ?? entry.label;\n const normalized = rawName.toLowerCase();\n const tool = normalized === \"glob\"\n ? \"find\"\n : [\"read\", \"write\", \"edit\", \"bash\", \"grep\", \"find\", \"ls\"].includes(normalized)\n ? normalized\n : rawName;\n const rawArgs = entry.args ?? {};\n const args: Record<string, unknown> = { ...rawArgs };\n if (typeof rawArgs.file_path === \"string\" && typeof args.path !== \"string\") {\n args.path = rawArgs.file_path;\n }\n if (tool === \"edit\" && !Array.isArray(args.edits)) {\n const oldText = typeof rawArgs.old_string === \"string\" ? rawArgs.old_string : undefined;\n const newText = typeof rawArgs.new_string === \"string\" ? rawArgs.new_string : undefined;\n if (oldText !== undefined && newText !== undefined) args.edits = [{ oldText, newText }];\n }\n return {\n ref: `omp.${tool}`,\n provider: \"omp\",\n tool,\n ...(Object.keys(args).length > 0 ? { args } : {}),\n ...(entry.result !== undefined ? { result: entry.result } : {}),\n ...(entry.status !== \"running\" ? { success: entry.status !== \"failed\" } : {}),\n };\n};\n\nconst AGENT_PREVIEW_RENDER_MAX_DEPTH = 6;\n\ntype AgentToolPreviewRenderOptions = {\n expanded: boolean;\n compact?: boolean | undefined;\n showTools?: boolean | undefined;\n core?: { cwd: string; settings: CodePreviewSettings } | undefined;\n invalidate?: (() => void) | undefined;\n};\n\nconst previewStatusGlyph = (status: string | undefined, theme: Theme): string =>\n status === \"running\"\n ? theme.fg(\"warning\", \"\u25D0\")\n : status === \"failed\"\n ? theme.fg(\"error\", \"\u2717\")\n : theme.fg(\"dim\", \"\u203A\");\n\n// Collapsed mode allows a single descendant row: prefer the running branch,\n// then follow it depth-first so the breadcrumb always ends at live work.\nconst descendantBreadcrumb = (\n node: FabricAgentToolPreviewNode,\n theme: Theme,\n): string | undefined => {\n let tail: FabricAgentToolPreviewNode | undefined =\n node.agents?.find((child) => child.status === \"running\") ?? node.agents?.[0];\n if (!tail) return undefined;\n const names = [tail.name];\n for (let depth = 0; depth < AGENT_PREVIEW_RENDER_MAX_DEPTH; depth += 1) {\n const next: FabricAgentToolPreviewNode | undefined =\n tail.agents?.find((child) => child.status === \"running\") ?? tail.agents?.[0];\n if (!next) break;\n tail = next;\n names.push(tail.name);\n }\n // Tool executions in transcript tails are short windows; a 1s preview tick\n // usually samples between them. Falling back to the latest known tool keeps\n // the crumb informative instead of going blank between executions.\n const runningTool = tail.tools.slice().reverse().find((entry) => entry.status === \"running\");\n const shownTool = runningTool ?? tail.tools.at(-1);\n const trail = names\n .map((name) => theme.fg(\"accent\", safeTerminalText(name)))\n .join(theme.fg(\"dim\", \" \u203A \"));\n const tool = shownTool\n ? theme.fg(\"dim\", \" \u203A \") + nestedCallTitle(transcriptToolAudit(shownTool), theme)\n : \"\";\n // Only abnormal states earn a glyph; a terminal \"\u203A\" would duplicate the\n // preview-line chevron this crumb is appended after.\n const glyph =\n tail.status === \"running\" || tail.status === \"failed\"\n ? `${previewStatusGlyph(tail.status, theme)} `\n : \"\";\n return `${glyph}${trail}${tool}`;\n};\n\nexport const renderAgentToolPreviewLines = (\n audit: FabricRenderAudit,\n theme: Theme,\n options: AgentToolPreviewRenderOptions,\n): string[] => {\n if (!isFabricAgentToolPreview(audit.preview)) return [];\n return renderAgentToolPreviewNodeLines(audit.preview, theme, options, 0);\n};\n\nconst renderAgentToolPreviewNodeLines = (\n preview: FabricAgentToolPreviewNode,\n theme: Theme,\n options: AgentToolPreviewRenderOptions,\n depth: number,\n): string[] => {\n const rawPreviewText = safeTerminalText(preview.text ?? \"\").trim();\n const responseLines = rawPreviewText\n ? options.compact\n ? [rawPreviewText.replace(/\\s+/g, \" \").trim()]\n : rawPreviewText.split(\"\\n\").flatMap((line) => {\n const normalized = line.replace(/\\s+/g, \" \").trim();\n if (!normalized) return [\"\"];\n const codePoints = Array.from(normalized);\n const chunks: string[] = [];\n for (\n let offset = 0;\n offset < codePoints.length;\n offset += AGENT_RESPONSE_LINE_CODE_POINTS\n ) {\n chunks.push(codePoints.slice(offset, offset + AGENT_RESPONSE_LINE_CODE_POINTS).join(\"\"));\n }\n return chunks;\n })\n : [];\n const tools = options.showTools === false ? [] : preview.tools;\n // Collapsed cards get one inline row; a live descendant branch is more\n // informative than the parent's own spinning tool or narrative, so the\n // breadcrumb wins the slot \u2014 matching how a running tool already displaces\n // response text here.\n const descendantCrumb =\n !options.expanded &&\n options.showTools !== false &&\n preview.agents !== undefined &&\n preview.agents.length > 0\n ? descendantBreadcrumb(preview, theme)\n : undefined;\n const runningTool = tools.slice().reverse().find((entry) => entry.status === \"running\");\n const latestTool = tools.at(-1);\n const collapsedRunningTool =\n !options.expanded && descendantCrumb === undefined ? runningTool : undefined;\n const visibleResponseLines =\n collapsedRunningTool !== undefined || descendantCrumb !== undefined ? [] : responseLines;\n const visibleTools =\n options.expanded || descendantCrumb !== undefined\n ? options.expanded\n ? tools\n : []\n : collapsedRunningTool\n ? [collapsedRunningTool]\n : responseLines.length === 0 && latestTool\n ? [latestTool]\n : [];\n const chevron = theme.fg(\"dim\", \"\u203A\");\n const lines: string[] = [];\n\n for (const responseLine of visibleResponseLines) {\n const text = theme.fg(\"toolOutput\", responseLine || \" \");\n lines.push(lines.length === 0 ? `${chevron} ${text}` : ` ${text}`);\n }\n\n for (let toolIndex = 0; toolIndex < visibleTools.length; toolIndex++) {\n const entry = visibleTools[toolIndex]!;\n const nestedAudit = transcriptToolAudit(entry);\n const title = nestedCallTitle(\n nestedAudit,\n theme,\n options.invalidate,\n options.core,\n );\n if (lines.length === 0) {\n lines.push(`${chevron} ${title}`);\n } else {\n const glyph = entry.status === \"running\"\n ? theme.fg(\"warning\", \"\u25D0\")\n : entry.status === \"failed\"\n ? theme.fg(\"error\", \"\u2717\")\n : theme.fg(\"dim\", \"\u203A\");\n lines.push(` ${glyph} ${title}`);\n }\n if (\n !options.expanded ||\n !options.core ||\n toolIndex < visibleTools.length - EXPANDED_AGENT_TOOL_BODY_COUNT\n ) continue;\n const body = renderCoreToolBody(nestedAudit, theme, {\n cwd: options.core.cwd,\n settings: options.core.settings,\n expanded: true,\n maxLines: EXPANDED_AGENT_TOOL_BODY_LINES,\n ...(options.invalidate ? { invalidate: options.invalidate } : {}),\n });\n if (!body) continue;\n for (const row of body.lines) lines.push(` ${row}`);\n if (body.hidden > 0) {\n lines.push(theme.fg(\"dim\", ` \u2026 ${body.hidden} more lines`));\n }\n }\n\n if (descendantCrumb !== undefined && lines.length === 0) {\n lines.push(`${chevron} ${descendantCrumb}`);\n }\n\n if (options.expanded && options.showTools !== false && preview.agents && preview.agents.length > 0) {\n if (depth < AGENT_PREVIEW_RENDER_MAX_DEPTH) {\n for (const child of preview.agents) {\n const status =\n child.status && child.status !== \"completed\"\n ? theme.fg(\"dim\", ` \u00B7 ${safeTerminalText(child.status)}`)\n : \"\";\n const currentTool =\n child.currentTool && child.status === \"running\"\n ? theme.fg(\"dim\", ` \u00B7 ${safeTerminalText(child.currentTool)}`)\n : \"\";\n lines.push(\n ` ${previewStatusGlyph(child.status, theme)} ${theme.fg(\"accent\", safeTerminalText(child.name))}${status}${currentTool}`,\n );\n const childLines = renderAgentToolPreviewNodeLines(\n child,\n theme,\n { ...options, core: undefined },\n depth + 1,\n );\n for (const row of childLines) lines.push(` ${row}`);\n }\n if (preview.agentsTruncated) {\n lines.push(theme.fg(\"dim\", \" \u2026 deeper agent previews hidden\"));\n }\n } else {\n lines.push(theme.fg(\"dim\", \" \u2026 deeper agent previews hidden\"));\n }\n }\n\n return lines;\n};\n\ninterface FabricMulticallPreview {\n auditIndex: number;\n body: string;\n hidden: number;\n}\n\nexport interface FabricMulticallPartialInput {\n audits: FabricRenderAudit[];\n phases: string[];\n progress?: string | undefined;\n expanded: boolean;\n preview?: FabricMulticallPreview | undefined;\n core?: { cwd: string; settings: CodePreviewSettings } | undefined;\n showAgentToolPreview?: boolean | undefined;\n spinner?: string | undefined;\n activityLabel?: string | undefined;\n}\n\nexport const singleCallProgressLine = (\n progress: string | undefined,\n previewLines: string[],\n): string => progress && previewLines.length === 0 ? safeTerminalText(progress) : \"\";\n\nexport const compactProgressPreview = (progress: string): string => {\n const lines = safeTerminalText(progress)\n .split(\"\\n\")\n .map((line) => line.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n const latest = lines[lines.length - 1] ?? \"\";\n if (lines.length <= 1) return latest;\n return `\u2026 ${lines.length - 1} ${lines.length === 2 ? \"line\" : \"lines\"} \u00B7 ${latest}`;\n};\n\nexport const renderFabricMulticallPartial = (\n input: FabricMulticallPartialInput,\n theme: Theme,\n invalidate?: () => void,\n): Component => {\n const done = input.audits.filter((audit) => audit.success !== undefined).length;\n let header = theme.fg(\n \"warning\",\n `\u25C6 ${input.activityLabel ?? \"Fabric\"} running \u00B7 ${done}/${input.audits.length} calls`,\n );\n const progress = input.progress ? compactProgressPreview(input.progress) : \"\";\n if (progress) header += theme.fg(\"dim\", ` \u00B7 ${progress}`);\n\n const rows = [header];\n const wrapLineIndexes = input.expanded ? new Set<number>() : undefined;\n if (input.phases.length > 0) {\n rows.push(theme.fg(\"dim\", input.phases.map((phase) => `\u25C6 ${phase}`).join(\" \")));\n }\n\n const callsShown = visibleMulticallAudits(input.audits, input.expanded);\n for (let visibleIndex = 0; visibleIndex < callsShown.length; visibleIndex++) {\n const { audit, auditIndex } = callsShown[visibleIndex]!;\n if (input.expanded && visibleIndex > 0) rows.push(\"\");\n const glyph =\n audit.success === undefined\n ? theme.fg(\"warning\", input.spinner ?? \"\u25D0\")\n : audit.success === false\n ? theme.fg(\"error\", \"\u2717\")\n : theme.fg(\"dim\", \"\u203A\");\n const previewLines = renderAgentToolPreviewLines(audit, theme, {\n expanded: input.expanded,\n compact: !input.expanded,\n showTools: input.showAgentToolPreview,\n core: input.core,\n ...(invalidate ? { invalidate } : {}),\n });\n let callRow = `${glyph} ${nestedCallTitle(audit, theme, invalidate, input.core)}`;\n if (audit.success === false && audit.error) {\n callRow += ` ${theme.fg(\"dim\", \"\u203A\")} ${theme.fg(\"error\", truncateOneLine(safeTerminalText(audit.error), 240))}`;\n } else if (previewLines[0]) {\n callRow += ` ${previewLines[0]}`;\n }\n if (previewLines.length > 0) wrapLineIndexes?.add(rows.length);\n rows.push(callRow);\n if (audit.success !== false && input.preview?.auditIndex === auditIndex) {\n for (const line of input.preview.body.split(\"\\n\")) rows.push(` ${line}`);\n if (input.preview.hidden > 0) {\n rows.push(\n theme.fg(\n \"dim\",\n ` \u2026 ${input.preview.hidden} more ${input.preview.hidden === 1 ? \"line\" : \"lines\"}`,\n ),\n );\n }\n }\n if (audit.success !== false && previewLines.length > 1) {\n for (const line of previewLines.slice(1)) {\n wrapLineIndexes?.add(rows.length);\n rows.push(line);\n }\n }\n }\n\n const callsHidden = input.audits.length - callsShown.length;\n if (callsHidden > 0) {\n const label = `\u2026 ${callsHidden} nested ${callsHidden === 1 ? \"call\" : \"calls\"} hidden`;\n rows.push(\n theme.fg(\"dim\", label) +\n (input.expanded ? \"\" : theme.fg(\"dim\", \" \u00B7 \") + expandHint(theme)),\n );\n }\n return renderBoundedLines(\n rows,\n theme,\n input.core?.settings.diffIntensity ?? \"off\",\n wrapLineIndexes,\n );\n};\n\nexport interface FabricCoreToolPreview extends FabricRenderAudit {\n ref: string;\n}\n\nconst CORE_TOOL_NAMES = new Set([\"bash\", \"read\", \"write\", \"edit\", \"grep\", \"find\", \"ls\"]);\n\nexport const captureFabricCoreToolPreviews = (\n audits: FabricRenderAudit[],\n previous: FabricCoreToolPreview[] = [],\n): FabricCoreToolPreview[] => {\n const prior = previous.slice();\n return audits.flatMap((audit) => {\n if (\n !audit.tool ||\n !CORE_TOOL_NAMES.has(audit.tool) ||\n (audit.provider !== \"omp\" && audit.ref !== `omp.${audit.tool}`)\n ) return [];\n const path = argString(audit.args ?? {}, \"path\");\n const index = prior.findIndex(\n (candidate) =>\n candidate.ref === audit.ref &&\n argString(candidate.args ?? {}, \"path\") === path,\n );\n const old = index >= 0 ? prior.splice(index, 1)[0] : undefined;\n return [{\n ...(old ?? {}),\n ...audit,\n args: { ...(old?.args ?? {}), ...(audit.args ?? {}) },\n ...(audit.result !== undefined\n ? { result: audit.result }\n : old?.result !== undefined\n ? { result: old.result }\n : {}),\n ...(audit.preview !== undefined\n ? { preview: audit.preview }\n : old?.preview !== undefined\n ? { preview: old.preview }\n : {}),\n }];\n });\n};\n\nexport const restoreFabricCoreToolPreviews = (\n audits: FabricRenderAudit[],\n previews: FabricCoreToolPreview[],\n): FabricRenderAudit[] => {\n const remaining = previews.slice();\n return audits.map((audit) => {\n if (\n !audit.tool ||\n !CORE_TOOL_NAMES.has(audit.tool) ||\n (audit.provider !== \"omp\" && audit.ref !== `omp.${audit.tool}`)\n ) return audit;\n const path = argString(audit.args ?? {}, \"path\");\n let index = remaining.findIndex(\n (preview) =>\n preview.ref === audit.ref &&\n argString(preview.args ?? {}, \"path\") === path,\n );\n if (index < 0) index = remaining.findIndex((preview) => preview.ref === audit.ref);\n if (index < 0) return audit;\n const preview = remaining.splice(index, 1)[0];\n if (!preview) return audit;\n return {\n ...preview,\n ...audit,\n args: { ...(preview.args ?? {}), ...(audit.args ?? {}) },\n ...(audit.result !== undefined\n ? { result: audit.result }\n : preview.result !== undefined\n ? { result: preview.result }\n : {}),\n ...(audit.preview !== undefined\n ? { preview: audit.preview }\n : preview.preview !== undefined\n ? { preview: preview.preview }\n : {}),\n ...(audit.resultTruncated !== undefined\n ? { resultTruncated: audit.resultTruncated }\n : preview.resultTruncated !== undefined\n ? { resultTruncated: preview.resultTruncated }\n : {}),\n };\n });\n};\n\nexport interface FabricAgentPreview {\n ref: string;\n id: string;\n preview: unknown;\n}\n\nexport const captureFabricAgentPreviews = (\n audits: FabricRenderAudit[],\n previous: FabricAgentPreview[] = [],\n): FabricAgentPreview[] => {\n const captured = previous.slice();\n const indexes = new Map(\n captured.map((preview, index) => [`${preview.ref}\\0${preview.id}`, index]),\n );\n for (const audit of audits) {\n if (!isFabricAgentToolPreview(audit.preview)) continue;\n const entry = { ref: audit.ref, id: audit.preview.id, preview: audit.preview };\n const key = `${entry.ref}\\0${entry.id}`;\n const index = indexes.get(key);\n if (index === undefined) {\n indexes.set(key, captured.length);\n captured.push(entry);\n } else captured[index] = entry;\n }\n return captured;\n};\n\nexport const restoreFabricAgentPreviews = (\n audits: FabricRenderAudit[],\n previews: FabricAgentPreview[],\n): FabricRenderAudit[] => {\n const remaining = previews.slice();\n return audits.map((audit) => {\n if (isFabricAgentToolPreview(audit.preview)) return audit;\n const requestedId = argString(audit.args ?? {}, \"id\");\n let index = requestedId\n ? remaining.findIndex((preview) => preview.ref === audit.ref && preview.id === requestedId)\n : -1;\n if (index < 0) index = remaining.findIndex((preview) => preview.ref === audit.ref);\n if (index < 0) return audit;\n const preview = remaining.splice(index, 1)[0];\n return preview ? { ...audit, preview: preview.preview } : audit;\n });\n};\n\nexport interface FabricWritePreview {\n ref: string;\n path?: string | undefined;\n content: string;\n}\n\nexport const captureFabricWritePreviews = (audits: FabricRenderAudit[]): FabricWritePreview[] =>\n audits.flatMap((audit) => {\n const rendererPreview =\n typeof audit.preview === \"object\" && audit.preview !== null && !Array.isArray(audit.preview)\n ? (audit.preview as Record<string, unknown>)\n : undefined;\n const content = audit.tool === \"write\"\n ? (typeof rendererPreview?.writeContent === \"string\"\n ? rendererPreview.writeContent\n : argString(audit.args ?? {}, \"content\"))\n : undefined;\n if (content === undefined) return [];\n return [{ ref: audit.ref, path: argString(audit.args ?? {}, \"path\"), content }];\n });\n\n// Arbitrary provider arguments are deliberately absent from persisted traces.\n// Keep only their selected one-line headlines in renderer state so completion\n// does not erase a preview that was already visible while the call was live.\nexport interface FabricCallHeadlinePreview {\n ref: string;\n headline: string;\n}\n\nexport const captureFabricCallHeadlinePreviews = (\n audits: FabricRenderAudit[],\n): FabricCallHeadlinePreview[] =>\n audits.flatMap((audit) => {\n const headline = callHeadlinePreview(audit);\n return headline ? [{ ref: audit.ref, headline }] : [];\n });\n\nexport const restoreFabricCallHeadlinePreviews = (\n audits: FabricRenderAudit[],\n previews: FabricCallHeadlinePreview[],\n): FabricRenderAudit[] => {\n const remaining = previews.slice();\n return audits.map((audit) => {\n const index = remaining.findIndex((preview) => preview.ref === audit.ref);\n if (index < 0) return audit;\n const [preview] = remaining.splice(index, 1);\n if (headlineArg(audit.args) || !preview) return audit;\n return { ...audit, previewHeadline: preview.headline };\n });\n};\n\n// Write content is also absent from persisted traces. Keep bounded live content\n// so a fast write can still render when its final result replaces the partial.\nexport const restoreFabricWritePreviews = (\n audits: FabricRenderAudit[],\n previews: FabricWritePreview[],\n): FabricRenderAudit[] => {\n const remaining = previews.slice();\n return audits.map((audit) => {\n if (audit.tool !== \"write\" || typeof audit.args?.content === \"string\") return audit;\n const path = argString(audit.args ?? {}, \"path\");\n const index = remaining.findIndex(\n (preview) => preview.ref === audit.ref && preview.path === path,\n );\n if (index < 0) return audit;\n const [preview] = remaining.splice(index, 1);\n return preview\n ? { ...audit, args: { ...(audit.args ?? {}), content: preview.content } }\n : audit;\n });\n};\n\n/** Extract the human-readable body text from a nested call result or write arguments, if any. */\nexport function nestedCallBody(audit: FabricRenderAudit): string | undefined {\n if (audit.tool === \"write\" && typeof audit.args?.content === \"string\") {\n return audit.args.content;\n }\n const result = audit.result;\n if (typeof result === \"string\") return result;\n if (result !== null && typeof result === \"object\" && !Array.isArray(result)) {\n const obj = result as Record<string, unknown>;\n if (typeof obj.output === \"string\") return obj.output;\n if (typeof obj.text === \"string\") return obj.text;\n }\n return undefined;\n}\n\n/** Source code + language for syntax highlighting, for reads (file content) and writes (content being written). */\nexport function nestedCallCode(\n audit: FabricRenderAudit,\n): { code: string; lang: string } | null {\n const args = audit.args ?? {};\n const path = typeof args.path === \"string\" ? args.path : undefined;\n const lang = languageFromPath(path);\n if (!lang) return null;\n if (audit.tool === \"read\") {\n return typeof audit.result === \"string\" ? { code: audit.result, lang } : null;\n }\n if (audit.tool === \"write\") {\n return typeof args.content === \"string\" ? { code: args.content, lang } : null;\n }\n return null;\n}\n\nconst escapeControlChars = (text: string): string =>\n text\n .replace(/\\x1b/g, \"\u241B\")\n .replace(/\\r/g, \"\u240D\")\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g, \"\uFFFD\");\n\ntype DiffLine = { kind: \"+\" | \"-\" | \" \"; content: string };\n\nconst lineDiff = (oldLines: string[], newLines: string[]): DiffLine[] => {\n const m = oldLines.length;\n const n = newLines.length;\n if (m * n > 1_000_000) {\n return [\n ...oldLines.map((line) => ({ kind: \"-\" as const, content: line })),\n ...newLines.map((line) => ({ kind: \"+\" as const, content: line })),\n ];\n }\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0));\n for (let i = m - 1; i >= 0; i--) {\n const oldLine = oldLines[i] ?? \"\";\n const cur = dp[i]!;\n const next = dp[i + 1]!;\n for (let j = n - 1; j >= 0; j--) {\n const newLine = newLines[j] ?? \"\";\n cur[j] =\n oldLine === newLine\n ? (next[j + 1] ?? 0) + 1\n : Math.max(next[j] ?? 0, cur[j + 1] ?? 0);\n }\n }\n const out: DiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < m && j < n) {\n const oldLine = oldLines[i] ?? \"\";\n const newLine = newLines[j] ?? \"\";\n if (oldLine === newLine) {\n out.push({ kind: \" \", content: oldLine });\n i++;\n j++;\n } else if ((dp[i + 1]![j] ?? 0) >= (dp[i]![j + 1] ?? 0)) {\n out.push({ kind: \"-\", content: oldLine });\n i++;\n } else {\n out.push({ kind: \"+\", content: newLine });\n j++;\n }\n }\n while (i < m) {\n out.push({ kind: \"-\", content: oldLines[i] ?? \"\" });\n i++;\n }\n while (j < n) {\n out.push({ kind: \"+\", content: newLines[j] ?? \"\" });\n j++;\n }\n return out;\n};\n\n/** Render a syntax-highlighted line diff for a nested `omp.edit` call, or null. */\nexport function nestedEditDiff(\n audit: FabricRenderAudit,\n theme: Theme,\n invalidate?: () => void,\n): string[] | null {\n if (audit.tool !== \"edit\") return null;\n const args = audit.args ?? {};\n const edits = Array.isArray(args.edits) ? args.edits : [];\n if (edits.length === 0) return null;\n const lang = languageFromPath(typeof args.path === \"string\" ? args.path : undefined);\n const lines: string[] = [];\n for (const edit of edits.slice(0, 5)) {\n if (!edit || typeof edit !== \"object\") continue;\n const record = edit as Record<string, unknown>;\n const oldText = typeof record.oldText === \"string\" ? record.oldText : \"\";\n const newText = typeof record.newText === \"string\" ? record.newText : \"\";\n const diff = lineDiff(oldText.split(\"\\n\"), newText.split(\"\\n\"));\n if (diff.length === 0) continue;\n // Tokenize the old and new side as separate streams so removal-side\n // comment/string state cannot bleed into added lines.\n const oldHighlighted = lang\n ? highlightCode(\n diff.filter((entry) => entry.kind !== \"+\").map((entry) => entry.content).join(\"\\n\"),\n lang,\n invalidate,\n )\n : null;\n const newHighlighted = lang\n ? highlightCode(\n diff.filter((entry) => entry.kind !== \"-\").map((entry) => entry.content).join(\"\\n\"),\n lang,\n invalidate,\n )\n : null;\n let oldCursor = 0;\n let newCursor = 0;\n for (let index = 0; index < diff.length; index++) {\n const entry = diff[index]!;\n let text: string | undefined;\n if (entry.kind === \"-\") {\n text = oldHighlighted?.[oldCursor++];\n } else if (entry.kind === \"+\") {\n text = newHighlighted?.[newCursor++];\n } else {\n oldCursor++;\n text = newHighlighted?.[newCursor++];\n }\n const content =\n text != null ? text || \" \" : theme.fg(\"toolOutput\", escapeControlChars(entry.content) || \" \");\n if (entry.kind === \"+\") {\n lines.push(`${theme.fg(\"toolDiffAdded\", \"+\")} ${content}`);\n } else if (entry.kind === \"-\") {\n lines.push(`${theme.fg(\"toolDiffRemoved\", \"-\")} ${content}`);\n } else {\n lines.push(`${theme.fg(\"toolDiffContext\", \" \")} ${content}`);\n }\n }\n }\n return lines.length > 0 ? lines : null;\n}\n\nconst lineCountTrimmed = (value: string): number => {\n const lines = value.split(\"\\n\");\n let end = lines.length;\n while (end > 0) {\n const last = lines[end - 1];\n if (last === undefined || last.trim() === \"\") end--;\n else break;\n }\n return end;\n};\n\n// Mirrors OMP core's read range notice: surface how many lines a fabric_exec\n// program sent to the model vs. how many its nested read(s) returned, so\n// sliced reads don't look like full-file reads. The audited body is unchanged.\nexport function modelReadHint(\n audits: FabricRenderAudit[],\n output: string,\n theme: Theme,\n): string {\n if (!output) return \"\";\n const modelLines = lineCountTrimmed(output);\n let readLines = 0;\n let sawRead = false;\n for (const audit of audits) {\n if (audit.tool !== \"read\") continue;\n const body = nestedCallBody(audit);\n if (typeof body !== \"string\") continue;\n sawRead = true;\n readLines += lineCountTrimmed(body);\n }\n if (!sawRead || modelLines >= readLines) return \"\";\n return theme.fg(\"warning\", \"\u2192 \" + modelLines + \" of \" + readLines + \" lines to model\");\n}\n", "const SPINNER_INTERVAL_MS = 250;\n\nconst SPINNER_FRAMES = [\"\u25D0\", \"\u25D3\", \"\u25D1\", \"\u25D2\"] as const;\n\nexport interface SpinnerTimerState {\n timer?: ReturnType<typeof setTimeout>;\n}\n\nexport const spinnerFrame = (now = Date.now()): string =>\n SPINNER_FRAMES[Math.floor(now / SPINNER_INTERVAL_MS) % SPINNER_FRAMES.length]!;\n\nexport const updateSpinner = (\n state: SpinnerTimerState,\n active: boolean,\n invalidate: () => void,\n now = Date.now(),\n): string => {\n if (!active) {\n if (state.timer) clearTimeout(state.timer);\n delete state.timer;\n return spinnerFrame(now);\n }\n if (!state.timer) {\n const delay = SPINNER_INTERVAL_MS - (now % SPINNER_INTERVAL_MS);\n state.timer = setTimeout(() => {\n delete state.timer;\n invalidate();\n }, delay);\n state.timer.unref?.();\n }\n return spinnerFrame(now);\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;AAAO,IAAM,gBAAgB,CAAC,UAA0B;AACtD,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,QAAI,MAAM,WAAW,KAAK,MAAM,GAAI;AAAA,EACtC;AACA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAAC,OAAe,aAA6B;AACzE,MAAI,MAAM,UAAU,SAAU,QAAO;AACrC,QAAM,SAAS;AAAA;AAAA,MAAW,MAAM,SAAS,QAAQ;AAAA;AAAA;AACjD,QAAM,YAAY,KAAK,IAAI,GAAG,WAAW,OAAO,MAAM;AACtD,QAAM,OAAO,KAAK,KAAK,YAAY,CAAC;AACpC,QAAM,OAAO,KAAK,MAAM,YAAY,CAAC;AACrC,SAAO,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,MAAM,MAAM,SAAS,IAAI,CAAC;AAC5E;;;ACfA,SAAS,cAAc,gBAAgB;AACvC,SAAS,UAAU,eAAe;AAIlC,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;;;ACQlC,IAAM,gBAAgB;AAAA,EACpB,cAAc,MAAM,OAAO,4BAA4B;AAAA,EACvD,YAAY,MAAM,OAAO,0BAA0B;AAAA,EACnD,YAAY,MAAM,OAAO,0BAA0B;AAAA,EACnD,aAAa,MAAM,OAAO,2BAA2B;AAAA,EACrD,cAAc,MAAM,OAAO,4BAA4B;AAAA,EACvD,qBAAqB,MAAM,OAAO,mCAAmC;AAAA,EACrE,oBAAoB,MAAM,OAAO,kCAAkC;AAAA,EACnE,wBAAwB,MAAM,OAAO,sCAAsC;AAAA,EAC3E,oBAAoB,MAAM,OAAO,kCAAkC;AAAA,EACnE,aAAa,MAAM,OAAO,2BAA2B;AAAA,EACrD,WAAW,MAAM,OAAO,yBAAyB;AAAA,EACjD,gBAAgB,MAAM,OAAO,8BAA8B;AAAA,EAC3D,mBAAmB,MAAM,OAAO,iCAAiC;AAAA,EACjE,oBAAoB,MAAM,OAAO,kCAAkC;AAAA,EACnE,eAAe,MAAM,OAAO,6BAA6B;AAAA,EACzD,uBAAuB,MAAM,OAAO,qCAAqC;AAAA,EACzE,sBAAsB,MAAM,OAAO,oCAAoC;AAAA,EACvE,6BAA6B,MAC3B,OAAO,2CAA2C;AAAA,EACpD,gBAAgB,MAAM,OAAO,8BAA8B;AAAA,EAC3D,wBAAwB,MAAM,OAAO,sCAAsC;AAAA,EAC3E,8BAA8B,MAC5B,OAAO,4CAA4C;AAAA,EACrD,qBAAqB,MAAM,OAAO,mCAAmC;AAAA,EACrE,uBAAuB,MAAM,OAAO,qCAAqC;AAAA,EACzE,qBAAqB,MAAM,OAAO,mCAAmC;AAAA,EACrE,sBAAsB,MAAM,OAAO,oCAAoC;AAAA,EACvE,wBAAwB,MAAM,OAAO,sCAAsC;AAAA,EAC3E,sBAAsB,MAAM,OAAO,oCAAoC;AAAA,EACvE,WAAW,MAAM,OAAO,yBAAyB;AAAA,EACjD,kBAAkB,MAAM,OAAO,gCAAgC;AAAA,EAC/D,WAAW,MAAM,OAAO,yBAAyB;AAAA,EACjD,mBAAmB,MAAM,OAAO,iCAAiC;AAAA,EACjE,kBAAkB,MAAM,OAAO,gCAAgC;AAAA,EAC/D,iBAAiB,MAAM,OAAO,+BAA+B;AAAA,EAC7D,aAAa,MAAM,OAAO,2BAA2B;AAAA,EACrD,cAAc,MAAM,OAAO,4BAA4B;AAAA,EACvD,kBAAkB,MAAM,OAAO,gCAAgC;AAAA,EAC/D,yBAAyB,MAAM,OAAO,uCAAuC;AAAA,EAC7E,0BAA0B,MAAM,OAAO,wCAAwC;AAAA,EAC/E,wBAAwB,MAAM,OAAO,sCAAsC;AAAA,EAC3E,4BAA4B,MAC1B,OAAO,0CAA0C;AAAA,EACnD,YAAY,MAAM,OAAO,0BAA0B;AAAA,EACnD,aAAa,MAAM,OAAO,2BAA2B;AAAA,EACrD,WAAW,MAAM,OAAO,yBAAyB;AAAA,EACjD,aAAa,MAAM,OAAO,2BAA2B;AAAA,EACrD,mBAAmB,MAAM,OAAO,iCAAiC;AAAA,EACjE,QAAQ,MAAM,OAAO,sBAAsB;AAAA,EAC3C,gBAAgB,MAAM,OAAO,8BAA8B;AAAA,EAC3D,aAAa,MAAM,OAAO,2BAA2B;AAAA,EACrD,WAAW,MAAM,OAAO,yBAAyB;AAAA,EACjD,cAAc,MAAM,OAAO,4BAA4B;AAAA,EACvD,OAAO,MAAM,OAAO,qBAAqB;AAAA,EACzC,aAAa,MAAM,OAAO,2BAA2B;AAAA,EACrD,kBAAkB,MAAM,OAAO,gCAAgC;AAAA,EAC/D,kBAAkB,MAAM,OAAO,gCAAgC;AAAA,EAC/D,cAAc,MAAM,OAAO,4BAA4B;AAAA,EACvD,eAAe,MAAM,OAAO,6BAA6B;AAAA,EACzD,gBAAgB,MAAM,OAAO,8BAA8B;AAAA,EAC3D,kBAAkB,MAAM,OAAO,gCAAgC;AAAA,EAC/D,mBAAmB,MAAM,OAAO,iCAAiC;AAAA,EACjE,gBAAgB,MAAM,OAAO,8BAA8B;AAAA,EAC3D,eAAe,MAAM,OAAO,6BAA6B;AAAA,EACzD,UAAU,MAAM,OAAO,wBAAwB;AAAA,EAC/C,iBAAiB,MAAM,OAAO,+BAA+B;AAAA,EAC7D,gBAAgB,MAAM,OAAO,8BAA8B;AAAA,EAC3D,iBAAiB,MAAM,OAAO,+BAA+B;AAC/D;AAMA,eAAsB,wBACpB,SACwC;AACxC,QAAM,SAAS,cAAc,OAAqC;AAClE,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,MAAM,MAAM,OAAO;AACzB,SAAO,IAAI;AACb;;;AC5FA,IAAM,mBAAmB;AAAA,EACvB,MAAM,MAAM,OAAO,4BAA4B;AAAA,EAC/C,YAAY,MAAM,OAAO,2BAA2B;AAAA,EACpD,KAAK,MAAM,OAAO,oBAAoB;AAAA,EACtC,YAAY,MAAM,OAAO,2BAA2B;AAAA,EACpD,KAAK,MAAM,OAAO,oBAAoB;AAAA,EACtC,MAAM,MAAM,OAAO,qBAAqB;AAAA,EACxC,UAAU,MAAM,OAAO,yBAAyB;AAAA,EAChD,MAAM,MAAM,OAAO,qBAAqB;AAAA,EACxC,MAAM,MAAM,OAAO,qBAAqB;AAAA,EACxC,KAAK,MAAM,OAAO,oBAAoB;AACxC;AASA,eAAsB,4BACpB,aACiC;AACjC,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,YAAY,IAAI,OAAO,eAAe;AACpC,YAAM,SAAS,iBAAiB,UAA2C;AAC3E,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,yCAAyC,UAAU,EAAE;AAClF,aAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AACA,SAAO,QAAQ,QAAQ,CAAC,WAAW,OAAO,OAAO;AACnD;;;AFvBA,IAAM,8BAA8B,OAAO;AAAA,EACzC,QAAQ,IAAI,oCAAoC;AAAA,EAChD;AACF;AACA,IAAM,sBACJ,OAAO,SAAS,2BAA2B,KAAK,8BAA8B,IAC1E,8BACA;AACN,IAAM,wCAAwC,OAAO;AAAA,EACnD,QAAQ,IAAI,yCAAyC;AAAA,EACrD;AACF;AAGA,IAAM,kCACJ,OAAO,SAAS,qCAAqC,KACrD,wCAAwC,IACpC,wCACA;AAIN,IAAM,kCAAkC;AACxC,IAAM,kCAAkC;AACxC,IAAM,6BAA6B;AACnC,IAAM,4BAA4B;AAClC,IAAM,cAAc;AACpB,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAmB,oBAAI,IAAoB;AAAA,EAC/C,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,OAAO,MAAM;AAAA,EACd,CAAC,MAAM,YAAY;AAAA,EACnB,CAAC,MAAM,YAAY;AAAA,EACnB,CAAC,MAAM,UAAU;AAAA,EACjB,CAAC,OAAO,MAAM;AAAA,EACd,CAAC,MAAM,QAAQ;AAAA,EACf,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,MAAM;AAAA,EACb,CAAC,MAAM,QAAQ;AAAA,EACf,CAAC,MAAM,QAAQ;AAAA,EACf,CAAC,OAAO,YAAY;AACtB,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAoB;AAAA,EAC9C,CAAC,cAAc,YAAY;AAAA,EAC3B,CAAC,YAAY,UAAU;AAAA,EACvB,CAAC,eAAe,UAAU;AAAA,EAC1B,CAAC,YAAY,UAAU;AAAA,EACvB,CAAC,YAAY,aAAa;AAAA,EAC1B,CAAC,WAAW,MAAM;AAAA,EAClB,CAAC,YAAY,MAAM;AAAA,EACnB,CAAC,cAAc,MAAM;AAAA,EACrB,CAAC,qBAAqB,MAAM;AAAA,EAC5B,CAAC,iBAAiB,MAAM;AAAA,EACxB,CAAC,kBAAkB,MAAM;AAAA,EACzB,CAAC,iBAAiB,MAAM;AAAA,EACxB,CAAC,aAAa,MAAM;AACtB,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAAoB;AAAA,EAChD,CAAC,OAAO,YAAY;AAAA,EACpB,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,OAAO,YAAY;AAAA,EACpB,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,QAAQ,YAAY;AAAA,EACrB,CAAC,QAAQ,YAAY;AAAA,EACrB,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,OAAO,UAAU;AAAA,EAClB,CAAC,aAAa,UAAU;AAAA,EACxB,CAAC,QAAQ,MAAM;AAAA,EACf,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,OAAO,MAAM;AAAA,EACd,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,QAAQ,MAAM;AAAA,EACf,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,QAAQ,MAAM;AAAA,EACf,CAAC,OAAO,QAAQ;AAAA,EAChB,CAAC,OAAO,MAAM;AAAA,EACd,CAAC,OAAO,IAAI;AAAA,EACZ,CAAC,OAAO,MAAM;AAAA,EACd,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,WAAW,QAAQ;AAAA,EACpB,CAAC,MAAM,GAAG;AAAA,EACV,CAAC,MAAM,GAAG;AAAA,EACV,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,OAAO,KAAK;AAAA,EACb,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,SAAS,MAAM;AAAA,EAChB,CAAC,OAAO,QAAQ;AAAA,EAChB,CAAC,UAAU,OAAO;AAAA,EAClB,CAAC,QAAQ,KAAK;AAAA,EACd,CAAC,MAAM,GAAG;AAAA,EACV,CAAC,UAAU,OAAO;AAAA,EAClB,CAAC,QAAQ,SAAS;AAAA,EAClB,CAAC,OAAO,QAAQ;AAAA,EAChB,CAAC,QAAQ,QAAQ;AAAA,EACjB,CAAC,QAAQ,QAAQ;AAAA,EACjB,CAAC,OAAO,SAAS;AAAA,EACjB,CAAC,OAAO,OAAO;AAAA,EACf,CAAC,OAAO,QAAQ;AAAA,EAChB,CAAC,QAAQ,QAAQ;AAAA,EACjB,CAAC,OAAO,QAAQ;AAAA,EAChB,CAAC,QAAQ,YAAY;AAAA,EACrB,CAAC,YAAY,SAAS;AAAA,EACtB,CAAC,WAAW,QAAQ;AAAA,EACpB,CAAC,eAAe,YAAY;AAC9B,CAAC;AAED,IAAM,aAAa,IAAI,IAAI,kBAAkB,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,CAAC;AACnF,IAAM,wBAAwB;AAE9B,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI,cAAc;AAClB,IAAI,wBAAwB;AAC5B,IAAI,kBAAkB;AACtB,IAAI,kBAAqC;AACzC,IAAI,eAAe,kBAAkB,iBAAiB,eAAe;AACrE,IAAI,UAAU;AACd,IAAM,kBAAkB,oBAAI,IAAY;AACxC,IAAM,mBAAmB,oBAAI,IAAY;AACzC,IAAM,wBAAwB,oBAAI,IAA6B;AAC/D,IAAM,4BAA4B,oBAAI,IAAgB;AACtD,IAAM,cAAc,oBAAI,IAA+C;AACvE,IAAI,mBAAmB;AAEvB,IAAM,aAAa,CAAC,UAA0B;AAC5C,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,YAAS,QAAQ,KAAK,OAAO,MAAM,WAAW,KAAK,IAAK;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAC,SAC1B,KACG,QAAQ,SAAS,QAAG,EACpB,QAAQ,OAAO,QAAG,EAClB,QAAQ,0CAA0C,QAAG;AAE1D,IAAM,oBAAoB,CAAC,aAA6B;AACtD,QAAM,aAAa,SAAS,YAAY;AACxC,SAAO,iBAAiB,IAAI,UAAU,KAAK;AAC7C;AAQA,IAAM,cAA8B;AAAA,EAClC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EACnB,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG;AAAA,EACvB,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG;AAAA,EACvB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG;AAAA,EACxB,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI;AAAA,EACxB,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI;AAAA,EACxB,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI;AAAA,EACxB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACzB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACzB,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG;AAAA,EACvB,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI;AAAA,EACxB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG;AAAA,EACxB,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI;AAAA,EACxB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACzB,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI;AAAA,EACxB,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAC3B;AAEO,IAAM,eAAe,CAAC,UAAuB;AAClD,MAAI,QAAQ,GAAI,QAAO,YAAY,KAAK,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAC7E,MAAI,QAAQ,KAAK;AACf,UAAM,OAAO,QAAQ;AACrB,UAAM,UAAU,CAAC,UAA2B,UAAU,IAAI,IAAI,KAAK,KAAK;AACxE,WAAO;AAAA,MACL,GAAG,QAAQ,KAAK,MAAM,OAAO,EAAE,CAAC;AAAA,MAChC,GAAG,QAAQ,KAAK,MAAO,OAAO,KAAM,CAAC,CAAC;AAAA,MACtC,GAAG,QAAQ,OAAO,CAAC;AAAA,IACrB;AAAA,EACF;AACA,QAAM,OAAO,IAAI,MAAM,KAAK,IAAI,OAAO,GAAG,IAAI;AAC9C,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK;AACrC;AAEA,IAAM,mBAAmB,CAAC,aAAsC;AAC9D,QAAM,YAAY,SAAS,MAAM,gCAAgC;AACjE,MAAI,WAAW;AACb,WAAO,EAAE,GAAG,OAAO,UAAU,CAAC,CAAC,GAAG,GAAG,OAAO,UAAU,CAAC,CAAC,GAAG,GAAG,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,EACrF;AACA,QAAM,UAAU,SAAS,MAAM,oBAAoB;AACnD,MAAI,QAAS,QAAO,aAAa,OAAO,QAAQ,CAAC,CAAC,CAAC;AACnD,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,EAAE,GAAG,GAAG,EAAE,OAClC,SAAS,IAAI,SAAS,IAAI,SAAS,KAAK;AAapC,IAAM,mBAAmB,CAC9B,OACA,MAAyB,QAAQ,QACC;AAClC,QAAM,OAAO,OAAO,MAAM,KAAK,EAAE,YAAY;AAC7C,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,SAAS,OAAQ,QAAO;AAC5B,QAAM,aAAa,OAAO,YACtB,iBAAiB,MAAM,UAAU,eAAe,CAAC,IACjD;AACJ,MAAI,WAAY,QAAO,kBAAkB,UAAU,KAAK,MAAM,UAAU;AACxE,QAAM,YAAY,IAAI;AACtB,MAAI,WAAW;AACb,UAAM,QAAQ,UACX,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC,EACvC,OAAO,CAAC,SAAS,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK,QAAQ,GAAG,EACnE,GAAG,EAAE;AACR,QAAI,UAAU,QAAW;AACvB,aAAO,kBAAkB,aAAa,KAAK,CAAC,KAAK,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAC,YAAoB,YAAwC;AACtF,oBAAkB;AAClB,oBAAkB;AAClB,QAAM,YAAY,kBAAkB,YAAY,OAAO;AACvD,MAAI,cAAc,aAAc,QAAO;AACvC,iBAAe;AACf,cAAY,MAAM;AAClB,qBAAmB;AACnB,wBAAsB;AACtB,MAAI,YAAY,eAAe,oBAAoB;AACjD,SAAK,iBAAiB,WAAW,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAOO,SAAS,gBAAgB,OAAuC;AACrE,QAAM,UAAU,iBAAiB,KAAK;AACtC,MAAI,QAAS,oBAAmB,iBAAiB,OAAO;AAC1D;AAMO,IAAM,6BAA6B,MACxC,WAAW,IAAI,YAAY,MAAM;AAG5B,IAAM,uBAAuB,MAAyB;AAGtD,SAAS,iBAAiB,UAAkD;AACjF,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,OAAO,SAAS,QAAQ,EAAE,YAAY;AAC5C,MAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,UAAM,YAAY;AAClB,WAAO,aAAa,mBAAmB,YAAY;AAAA,EACrD;AACA,MAAI,SAAS,gBAAgB,KAAK,WAAW,aAAa,GAAG;AAC3D,WAAO,gBAAgB,mBAAmB,eAAe;AAAA,EAC3D;AACA,QAAM,QAAQ,gBAAgB,IAAI,IAAI;AACtC,MAAI,SAAS,SAAS,iBAAkB,QAAO;AAC/C,QAAM,QAAQ,kBAAkB,IAAI,QAAQ,IAAI,CAAC;AACjD,SAAO,SAAS,SAAS,mBAAmB,QAAQ;AACtD;AAGO,SAAS,sBAAsB,sBAA8B,gBAAgB,MAAY;AAC9F,QAAM,aAAa,qBAAqB,KAAK,KAAK;AAClD,QAAM,aAAa;AACnB,YAAU;AACV,MAAI,CAAC,SAAS;AACZ,sBAAkB;AAClB,mBAAe,kBAAkB,YAAY,eAAe;AAC5D;AACA,wBAAoB;AACpB,iBAAa,QAAQ;AACrB,kBAAc;AACd,iBAAa;AACb;AACA,oBAAgB,MAAM;AACtB,qBAAiB,MAAM;AACvB,0BAAsB,MAAM;AAC5B,8BAA0B,MAAM;AAChC,gBAAY,MAAM;AAClB,uBAAmB;AACnB,0BAAsB;AACtB;AAAA,EACF;AACA,QAAM,eAAe,mBAAmB,YAAY,eAAe;AAOnE,MAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,eAAe,CAAC,mBAAmB;AACtE,SAAK,iBAAiB,cAAc,aAAa;AAAA,EACnD;AACF;AAGA,eAAsB,iBAAiB,OAAe,gBAAgB,MAAqB;AACzF,iBAAe;AACf,YAAU;AACV,MAAI,CAAC,QAAS;AACd,QAAM,UAAU,EAAE;AAClB,sBAAoB;AACpB,MAAI;AACF,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,OAAO;AAKlD,UAAM,cAAc,MAAM,wBAAwB,KAAK;AACvD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AAAA,IACjD;AACA,UAAM,OAAO,MAAM,kBAAkB;AAAA,MACnC,QAAQ,CAAC,WAAW;AAAA,MACpB,OAAO,MAAM,4BAA4B,mBAAmB;AAAA,IAC9D,CAAC;AACD,QAAI,YAAY,aAAa;AAC3B,WAAK,QAAQ;AACb;AAAA,IACF;AACA,iBAAa,QAAQ;AACrB,kBAAc;AACd,0BAAsB;AACtB,iBAAa;AACb,wBAAoB;AACpB;AACA,oBAAgB,MAAM;AACtB,eAAW,QAAQ,oBAAqB,iBAAgB,IAAI,IAAI;AAChE,gBAAY;AAAA,EACd,SAAS,OAAO;AACd,QAAI,YAAY,YAAa;AAC7B,wBAAoB;AACpB,YAAQ,KAAK,yEAAyE,KAAK;AAC3F,iBAAa,QAAQ;AACrB,kBAAc;AACd,iBAAa;AACb;AACA,oBAAgB,MAAM;AACtB,8BAA0B,MAAM;AAAA,EAClC;AACF;AAEA,IAAM,sBAAsB,CAAC,SAA0B,KAAK,SAAS;AAErE,IAAM,SAAS,CAAC,QAAwB;AACtC,QAAM,QAAQ,IAAI,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,CAAC;AAC9C,QAAM,IAAI,OAAO,SAAS,OAAO,EAAE;AACnC,SAAO,OAAO,SAAS,CAAC,IACpB,aAAc,KAAK,KAAM,GAAG,IAAK,KAAK,IAAK,GAAG,IAAI,IAAI,GAAG,MACzD;AACN;AAEA,IAAM,gBAAgB,CAAC,UAA2E;AAChG,MAAI,OAAO,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI;AAC/C,MAAI,QAAQ,MAAM,QAAQ,aAAa;AACvC,QAAM,YAAY,MAAM,aAAa;AACrC,MAAI,YAAY,GAAG;AACjB,YAAQ;AACR,YAAQ,aAAa;AAAA,EACvB;AACA,MAAI,YAAY,GAAG;AACjB,YAAQ;AACR,YAAQ,aAAa;AAAA,EACvB;AACA,MAAI,YAAY,GAAG;AACjB,YAAQ;AACR,YAAQ,aAAa;AAAA,EACvB;AACA,SAAO,OAAO,mBAAmB,MAAM,OAAO,IAAI;AACpD;AAEA,IAAM,kBAAkB,CAAC,WAA4B;AACnD,MAAI,WAAW,QAAQ,WAAW,QAAQ,WAAW,YAAY,WAAW,SAAU,QAAO;AAC7F,MAAI,CAAC,OAAO,WAAW,OAAO,EAAG,QAAO;AACxC,QAAM,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAC1C,QAAM,IAAI,MAAM,CAAC;AACjB,QAAM,IAAI,MAAM,CAAC;AACjB,QAAM,IAAI,MAAM,CAAC;AACjB,MAAI,MAAM,UAAa,MAAM,UAAa,MAAM,OAAW,QAAO;AAClE,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAC9E,QAAM,YAAY,SAAS,IAAI,SAAS,IAAI,SAAS;AACrD,SAAO,YAAY;AACrB;AAEA,IAAM,oBAAoB,CAAC,SAAyB;AAClD,MAAI,WAAW,IAAI,YAAY,MAAM,QAAS,QAAO;AACrD,SAAO,KAAK;AAAA,IAAQ;AAAA,IAAqB,CAAC,KAAK,WAC7C,gBAAgB,MAAM,IAAI,wBAAwB;AAAA,EACpD;AACF;AAEA,IAAM,gBAAgB,CAAC,KAAa,UAA0B;AAC5D,QAAM,OAAO,MAAM,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,QAAQ,CAAC;AACjE,cAAY,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC;AACpC,sBAAoB;AACpB,SAAO,YAAY,OAAO,eAAe,mBAAmB,kBAAkB;AAC5E,UAAM,QAAQ,YAAY,KAAK,EAAE,KAAK,EAAE;AACxC,QAAI,UAAU,OAAW;AACzB,UAAM,SAAS,YAAY,IAAI,KAAK;AACpC,QAAI,OAAQ,qBAAoB,OAAO;AACvC,gBAAY,OAAO,KAAK;AAAA,EAC1B;AACF;AAEA,IAAM,cAAc,CAAC,eAAkC;AACrD,MAAI,WAAY,2BAA0B,IAAI,UAAU;AACxD,MAAI,sBAAsB,aAAc;AACxC,OAAK,iBAAiB,cAAc,OAAO;AAC7C;AAEA,IAAM,cAAc,MAAY;AAC9B,QAAM,YAAY,CAAC,GAAG,yBAAyB;AAC/C,4BAA0B,MAAM;AAChC,aAAW,YAAY,WAAW;AAChC,QAAI;AACF,eAAS;AAAA,IACX,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,IAAM,sBAAsB,CAAC,MAAc,eAAkC;AAC3E,MAAI,YAAY;AACd,UAAM,YAAY,sBAAsB,IAAI,IAAI,KAAK,oBAAI,IAAI;AAC7D,cAAU,IAAI,UAAU;AACxB,0BAAsB,IAAI,MAAM,SAAS;AAAA,EAC3C;AACA,MAAI,iBAAiB,IAAI,IAAI,EAAG;AAChC,QAAM,WAAW;AACjB,MAAI,CAAC,SAAU;AACf,mBAAiB,IAAI,IAAI;AACzB,QAAM,aAAa;AACnB,OAAK,SACF,aAAa,IAAa,EAC1B,KAAK,MAAM;AACV,QAAI,eAAe,sBAAuB;AAC1C,oBAAgB,IAAI,IAAI;AACxB,UAAM,YAAY,sBAAsB,IAAI,IAAI;AAChD,0BAAsB,OAAO,IAAI;AACjC,eAAW,YAAY,aAAa,CAAC,GAAG;AACtC,UAAI;AACF,iBAAS;AAAA,MACX,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAC,EACA,MAAM,MAAM;AACX,QAAI,eAAe,sBAAuB,uBAAsB,OAAO,IAAI;AAAA,EAC7E,CAAC,EACA,QAAQ,MAAM;AACb,QAAI,eAAe,sBAAuB,kBAAiB,OAAO,IAAI;AAAA,EACxE,CAAC;AACL;AASO,SAAS,cACd,MACA,MACA,YACiB;AACjB,MAAI,CAAC,WAAW,CAAC,QAAQ,oBAAoB,IAAI,EAAG,QAAO;AAI3D,MAAI,CAAC,eAAe,eAAe,cAAc;AAC/C,gBAAY,UAAU;AACtB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,kBAAkB,IAAI;AACxC,MAAI,EAAE,aAAa,kBAAmB,QAAO;AAC7C,QAAM,WAAW,GAAG,YAAY,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,WAAW,IAAI,CAAC;AACnF,QAAM,SAAS,YAAY,IAAI,QAAQ;AACvC,MAAI,QAAQ;AACV,gBAAY,OAAO,QAAQ;AAC3B,gBAAY,IAAI,UAAU,MAAM;AAChC,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,CAAC,gBAAgB,IAAI,SAAS,GAAG;AACnC,wBAAoB,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,YAAY,iBAAiB,MAAM;AAAA,MAChD,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AACD,UAAM,WAAW,OAAO;AAAA,MAAI,CAAC,SAC3B,kBAAkB,KAAK,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;AAAA,IACpD;AACA,kBAAc,UAAU,QAAQ;AAChC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA2BA,IAAM,qBAAqB,oBAAI,IAAgC;AAC/D,IAAI,qBAAqB;AACzB,IAAM,qBAA2C,CAAC;AAClD,IAAI,8BAA8B;AAElC,IAAM,qBAAqB,CAAC,SAAyB,KAAK,QAAQ,OAAO,MAAM;AAE/E,IAAM,yBAAyB,CAAC,KAAa,UAAoC;AAC/E,MAAI,mBAAmB,IAAI,GAAG,MAAM,MAAO;AAC3C,QAAM,QAAQ;AACd,QAAM,UAAU,CAAC;AACjB,qBAAmB,OAAO,GAAG;AAC7B,wBAAsB,MAAM;AAC9B;AAEA,IAAM,0BAA0B,MAAY;AAC1C,SACE,mBAAmB,OAAO,8BAC1B,qBAAqB,2BACrB;AACA,UAAM,YAAY,mBAAmB,KAAK,EAAE,KAAK,EAAE;AACnD,QAAI,cAAc,OAAW;AAC7B,UAAM,SAAS,mBAAmB,IAAI,SAAS;AAC/C,QAAI,OAAQ,wBAAuB,WAAW,MAAM;AAAA,QAC/C,oBAAmB,OAAO,SAAS;AAAA,EAC1C;AACF;AAEA,IAAM,wBAAwB,MAAY;AACxC,aAAW,CAAC,EAAE,KAAK,KAAK,oBAAoB;AAC1C,UAAM,QAAQ;AACd,UAAM,UAAU,CAAC;AAAA,EACnB;AACA,qBAAmB,MAAM;AACzB,qBAAmB,SAAS;AAC5B,uBAAqB;AACvB;AAEA,IAAM,uBAAuB,CAAC,UAAoC;AAChE,QAAM,UAAU,MAAM,MAAM;AAC5B,QAAM,QAAQ,oBAAI,IAAgB;AAClC,QAAM,YAAmC,CAAC;AAC1C,aAAW,UAAU,MAAM,SAAS;AAClC,QAAI,OAAO,MAAM,QAAS,OAAM,IAAI,OAAO,UAAU;AAAA,QAChD,WAAU,KAAK,MAAM;AAAA,EAC5B;AACA,QAAM,UAAU;AAChB,MAAI,MAAM,SAAS,EAAG;AACtB,iBAAe,MAAM;AACnB,eAAW,cAAc,OAAO;AAC9B,UAAI;AACF,mBAAW;AAAA,MACb,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,IAAM,uBAAuB,CAAC,UAAoC;AAChE,QAAM,WAAW;AACjB,MAAI,CAAC,YAAY,eAAe,gBAAgB,aAAa,MAAM,aAAa;AAC9E,UAAM,QAAQ;AACd;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,MAAM;AAC1B,QAAM,UAAU,KAAK,IAAI,MAAM,QAAQ,MAAM,YAAY,MAAM;AAC/D,MAAI,MAAM;AACV,MAAI,QAAQ;AACZ,QAAM,SAAS,KAAK,IAAI,QAAQ,iCAAiC,OAAO;AACxE,SAAO,MAAM,UAAU,SAAS,iCAAiC;AAC/D,cAAU,MAAM,YAAY,GAAG,GAAG,UAAU,KAAK;AACjD;AAAA,EACF;AACA,MAAI,OAAO,MAAO;AAClB,MAAI;AACF,UAAM,SAAS,SAAS,iBAAiB,MAAM,YAAY,MAAM,OAAO,GAAG,EAAE,KAAK,IAAI,GAAG;AAAA,MACvF,MAAM,MAAM;AAAA,MACZ,OAAO;AAAA,MACP,GAAI,MAAM,QAAQ,EAAE,cAAc,MAAM,MAAM,IAAI,CAAC;AAAA,IACrD,CAAC;AACD,UAAM,WAAW,OAAO;AAAA,MAAI,CAAC,SAC3B,kBAAkB,KAAK,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;AAAA,IACpD;AACA,UAAM,QAAQ,SAAS,oBAAoB,MAAe;AAC1D,UAAM,MAAM,KAAK,GAAG,QAAQ;AAC5B,UAAM,QAAQ,SAAS,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,QAAQ,CAAC;AACrE,UAAM,SAAS;AACf,0BAAsB;AAAA,EACxB,QAAQ;AACN,UAAM,QAAQ;AAAA,EAChB;AACF;AAEA,IAAM,yBAAyB,MAAY;AACzC,gCAA8B;AAC9B,MAAI,QAAQ,mBAAmB,MAAM;AACrC,SACE,UAAU,WACT,MAAM,SACL,MAAM,gBAAgB,eACtB,MAAM,MAAM,UAAU,KAAK,IAAI,MAAM,QAAQ,MAAM,YAAY,MAAM,IACvE;AACA,QAAI,MAAM,QAAQ,SAAS,EAAG,sBAAqB,KAAK;AACxD,YAAQ,mBAAmB,MAAM;AAAA,EACnC;AACA,MAAI,CAAC,MAAO;AACZ,uBAAqB,KAAK;AAC1B,MAAI,CAAC,MAAM,OAAO;AAChB,yBAAqB,KAAK;AAG1B,QAAI,MAAM,QAAQ,SAAS,EAAG,oBAAmB,KAAK,KAAK;AAAA,EAC7D;AACA,MAAI,mBAAmB,SAAS,GAAG;AACjC,kCAA8B;AAC9B,iBAAa,sBAAsB;AAAA,EACrC;AACF;AAEA,IAAM,wBAAwB,CAAC,UAAoC;AACjE,MAAI,CAAC,mBAAmB,SAAS,KAAK,EAAG,oBAAmB,KAAK,KAAK;AACtE,MAAI,4BAA6B;AACjC,gCAA8B;AAC9B,eAAa,sBAAsB;AACrC;AAYO,SAAS,mBACd,UACA,MACA,MACA,IACA,YAC4B;AAC5B,MAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,MAAM,QAAQ,OAAO,EAAG,QAAO;AACrE,MAAI,CAAC,eAAe,eAAe,cAAc;AAC/C,gBAAY,UAAU;AACtB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,kBAAkB,IAAI;AACxC,MAAI,EAAE,aAAa,kBAAmB,QAAO;AAC7C,MAAI,CAAC,gBAAgB,IAAI,SAAS,GAAG;AACnC,wBAAoB,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,WAAO,SAAS,QAAQ;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO,gCAAiC,QAAO;AAC1E,QAAM,MAAM,GAAG,YAAY,KAAK,SAAS,KAAK,QAAQ;AACtD,MAAI,QAAQ,mBAAmB,IAAI,GAAG;AACtC,MAAI,UAAU,MAAM,YAAY,KAAK,WAAW,MAAM,SAAS,KAAK,OAAO;AACzE,2BAAuB,KAAK,KAAK;AACjC,YAAQ;AAAA,EACV;AACA,MAAI,CAAC,OAAO;AACV,QAAI;AACJ,QAAI;AACF,aAAO,aAAa,UAAU,MAAM;AAAA,IACtC,QAAQ;AACN,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,IAAI,EAAG,QAAO;AAChC,UAAM,cAAc,KACjB,QAAQ,UAAU,IAAI,EACtB,MAAM,IAAI,EACV,IAAI,kBAAkB;AACzB,YAAQ;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX;AAAA,MACA,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,OAAO;AAAA,MACP,OAAO,YAAY,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,QAAQ,CAAC;AAAA,IACnE;AACA,uBAAmB,IAAI,KAAK,KAAK;AACjC,0BAAsB,MAAM;AAC5B,4BAAwB;AACxB,QAAI,MAAM,OAAO;AAEf,YAAM,UAAU,CAAC;AACjB,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,uBAAmB,OAAO,GAAG;AAC7B,uBAAmB,IAAI,KAAK,KAAK;AAAA,EACnC;AACA,SAAO,mBAAmB,OAAO,MAAM,IAAI,UAAU;AACvD;AASO,SAAS,qBACd,UACA,aACA,MACA,MACA,IACA,YAC4B;AAC5B,MAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,MAAM,QAAQ,OAAO,EAAG,QAAO;AACrE,MAAI,CAAC,eAAe,eAAe,cAAc;AAC/C,gBAAY,UAAU;AACtB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,kBAAkB,IAAI;AACxC,MAAI,EAAE,aAAa,kBAAmB,QAAO;AAC7C,MAAI,CAAC,gBAAgB,IAAI,SAAS,GAAG;AACnC,wBAAoB,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,mBAAmB,IAAI,QAAQ;AAC3C,MAAI,CAAC,OAAO;AACV,YAAQ;AAAA,MACN;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,OAAO;AAAA,MACP,OAAO,YAAY,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,QAAQ,CAAC;AAAA,IACnE;AACA,uBAAmB,IAAI,UAAU,KAAK;AACtC,0BAAsB,MAAM;AAC5B,4BAAwB;AACxB,QAAI,MAAM,OAAO;AACf,YAAM,UAAU,CAAC;AACjB,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,uBAAmB,OAAO,QAAQ;AAClC,uBAAmB,IAAI,UAAU,KAAK;AAAA,EACxC;AACA,SAAO,mBAAmB,OAAO,MAAM,IAAI,UAAU;AACvD;AAEA,IAAM,qBAAqB,CACzB,OACA,MACA,IACA,eAC+B;AAC/B,QAAM,QAAQ,MAAM,YAAY;AAChC,MAAI,QAAQ,MAAO,QAAO;AAC1B,QAAM,YAAY,KAAK,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,MAAM,KAAK,CAAC;AACrE,QAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,SAAS;AAC/C,MAAI,cAAc,MAAM,MAAM,SAAS,WAAW;AAChD,UAAM,UAAU,MAAM,QAAQ,OAAO,CAAC,WAAW,OAAO,eAAe,UAAU;AACjF,UAAM,QAAQ,KAAK,EAAE,IAAI,WAAW,WAAW,CAAC;AAChD,0BAAsB,KAAK;AAAA,EAC7B;AAGA,MAAI,MAAM,MAAM,SAAS,UAAW,QAAO;AAC3C,QAAM,MAA2B,CAAC;AAClC,WAAS,QAAQ,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,GAAG,SAAS;AAC3D,QAAI,KAAK,EAAE,KAAK,MAAM,YAAY,KAAK,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,KAAK,GAAG,CAAC;AAAA,EAClF;AACA,SAAO;AACT;;;AGx2BA,SAAS,iBAAiB;AAI1B,IAAM,qBAAqB,CAAC,UAAwC;AAClE,MAAI;AACF,UAAM,aAAa,KAAK,UAAU,KAAK;AACvC,WAAO,eAAe,SAAY,SAAa,KAAK,MAAM,UAAU;AAAA,EACtE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,mBAAmB,CAAC,UAAuC;AACtE,QAAM,aAAa,mBAAmB,KAAK;AAC3C,MAAI,eAAe,OAAW,QAAO;AACrC,SAAO,UAAU,YAAY,EAAE,QAAQ,GAAG,WAAW,EAAE,CAAC,EAAE,QAAQ;AACpE;AAaA,IAAM,gBAAgB,CAAC,UACrB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAQrE,IAAM,wBAAwB,CAC5B,OACA,MACA,UACA,SACY;AACZ,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,MAAM,SAAS,IAAI,EAAG,QAAO;AAClC,aAAS,KAAK,EAAE,MAAM,MAAM,MAAM,CAAC;AACnC,WAAO,oCAAoC,IAAI;AAAA,EACjD;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAC5B,SAAK,IAAI,KAAK;AACd,UAAM,WAAW,MAAM;AAAA,MAAI,CAAC,MAAM,UAChC,sBAAsB,MAAM,GAAG,IAAI,IAAI,KAAK,KAAK,UAAU,IAAI;AAAA,IACjE;AACA,SAAK,OAAO,KAAK;AACjB,WAAO;AAAA,EACT;AACA,MAAI,cAAc,KAAK,GAAG;AACxB,QAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAC5B,SAAK,IAAI,KAAK;AACd,UAAM,WAAoC,CAAC;AAC3C,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,eAAS,GAAG,IAAI;AAAA,QACd;AAAA,QACA,OAAO,GAAG,IAAI,IAAI,GAAG,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,OAAO,KAAK;AACjB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,OAAe,aAA6B;AAClE,MAAI,MAAM,UAAU,SAAU,QAAO;AACrC,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,UAAU,MAAM,SAAS;AAC7B,MAAI,SAAS,UAAK,OAAO;AACzB,WAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,cAAU,MAAM,SAAS,KAAK,IAAI,GAAG,WAAW,OAAO,MAAM;AAC7D,aAAS,UAAK,OAAO;AAAA,EACvB;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM,GAAG,QAAQ;AAC9D,QAAM,YAAY,WAAW,OAAO;AACpC,QAAM,OAAO,KAAK,KAAK,YAAY,CAAC;AACpC,QAAM,OAAO,KAAK,MAAM,YAAY,CAAC;AACrC,SAAO,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,MAAM,MAAM,SAAS,IAAI,CAAC;AAC5E;AAEA,IAAM,qBAAqB,CAAC,SAAmB,WAA6B;AAC1E,QAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,QAAQ,OAAO,GAAG,MAAM,CAAC;AAC9D,QAAM,UAAU,QAAQ,IAAI,CAAC,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,EAC/D,KAAK,CAAC,MAAM,UAAU,KAAK,SAAS,MAAM,MAAM;AACnD,MAAI,YAAY,KAAK,IAAI,GAAG,MAAM;AAClC,WAAS,WAAW,GAAG,WAAW,QAAQ,QAAQ,YAAY;AAC5D,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,QAAQ,KAAK,MAAM,aAAa,QAAQ,SAAS,SAAS;AAChE,UAAM,YAAY,KAAK,IAAI,KAAK,QAAQ,KAAK;AAC7C,YAAQ,KAAK,KAAK,IAAI;AACtB,iBAAa;AAAA,EACf;AACA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAC5B,MACA,UACA,aACW;AACX,QAAM,UAAU,SAAS,IAAI,CAAC,YAAY,OAAO,QAAQ,IAAI,KAAK,QAAQ,KAAK,MAAM;AAAA,CAAe;AACpG,QAAM,aAAa,SAAS,SAAS;AACrC,QAAM,aAAa,KAAK,SAAS,aAAa,QAAQ,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,QAAQ,CAAC;AACpG,QAAM,YAAY,aAAa,SAAS,OAAO,CAAC,KAAK,YAAY,MAAM,QAAQ,KAAK,QAAQ,CAAC;AAC7F,QAAM,UAAU,aAAa,UAAa,YAAY,WAClD,mBAAmB,SAAS,IAAI,CAAC,YAAY,QAAQ,KAAK,MAAM,GAAG,WAAW,UAAU,IACxF,SAAS,IAAI,CAAC,YAAY,QAAQ,KAAK,MAAM;AACjD,QAAM,MAAM,SACT,IAAI,CAAC,SAAS,UAAU,GAAG,QAAQ,KAAK,CAAC,GAAG,eAAe,QAAQ,MAAM,QAAQ,KAAK,CAAE,CAAC,EAAE,EAC3F,KAAK,MAAM;AACd,SAAO,GAAG,IAAI;AAAA;AAAA,EAAO,GAAG;AAC1B;AAEO,IAAM,oBAAoB,CAC/B,OACA,QACA,aACyB;AACzB,MAAI,UAAU,OAAW,QAAO,EAAE,MAAM,GAAG;AAC3C,MAAI,WAAW,UAAU,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,OAAO;AACvF,UAAM,OAAQ,MAA6B;AAC3C,QAAI,OAAO,SAAS,SAAU,QAAO,EAAE,KAAK;AAAA,EAC9C;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,EAAE,MAAM,MAAM;AACpD,MAAI,WAAW,UAAU,WAAW,QAAQ;AAC1C,UAAM,WAA6B,CAAC;AACpC,UAAM,WAAW,sBAAsB,OAAO,IAAI,UAAU,oBAAI,IAAI,CAAC;AACrE,UAAM,OAAO,iBAAiB,QAAQ;AACtC,QAAI,SAAS,QAAW;AACtB,UAAI,SAAS,WAAW,EAAG,QAAO,EAAE,MAAM,MAAM,UAAU,OAAO;AAIjE,aAAO;AAAA,QACL,MAAM,sBAAsB,MAAM,UAAU,QAAQ;AAAA,QACpD,UAAU;AAAA,QACV,sBAAsB,cAAc,IAAI,IAAI;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,WAAO;AAAA,MACL,MAAM,KAAK,UAAU,OAAO,MAAM,WAAW,SAAS,IAAI,CAAC;AAAA,MAC3D,GAAI,WAAW,SAAS,EAAE,UAAU,OAAgB,IAAI,CAAC;AAAA,IAC3D;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,MAAM,OAAO,KAAK,EAAE;AAAA,EAC/B;AACF;;;AC7JA,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,mBAAmB;AAEzB,IAAM,cAAc,CAAC,SAAyB,KAAK,QAAQ,aAAa,EAAE;AAE1E,IAAM,YAAY,CAAC,SAA0B;AAC3C,QAAM,UAAU,YAAY,IAAI;AAChC,SAAO,QAAQ,WAAW,WAAW,KAAK,QAAQ,WAAW,gBAAgB;AAC/E;AAEA,IAAM,cAAc,CAAC,SACnB,YAAY,IAAI,EAAE,WAAW,WAAW,IACpC,KAAK,QAAQ,aAAa,gBAAgB,IAC1C;AAOC,SAAS,iBAAiB,OAA2B;AAC1D,MAAI,QAAQ,MAAM;AAClB,SAAO,QAAQ,KAAK,UAAU,MAAM,QAAQ,CAAC,CAAE,EAAG;AAClD,MAAI,UAAU,MAAM,OAAQ,QAAO;AACnC,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,WAAS,QAAQ,OAAO,QAAQ,KAAK,QAAQ,SAAS;AACpD,SAAK,KAAK,IAAI,YAAY,KAAK,KAAK,CAAE;AAAA,EACxC;AACA,SAAO;AACT;AAGO,SAAS,QAAQ,OAAc,OAAuB;AAC3D,SAAO,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,EAAE;AACnD;AAGO,SAAS,cAAc,OAAc,OAAuB;AACjE,SAAO,MAAM,GAAG,SAAS,WAAW,IAAI;AAC1C;AAMO,SAAS,YAAY,OAAiB,MAAoB;AAC/D,WAAS,QAAQ,MAAM,SAAS,GAAG,SAAS,KAAK,UAAU,MAAM,KAAK,CAAE,GAAG,SAAS;AAClF,UAAM,KAAK,IAAI,YAAY,MAAM,KAAK,CAAE;AAAA,EAC1C;AACA,QAAM,KAAK,IAAI;AACjB;;;ACtDA,SAAS,gBAAAA,eAAc,YAAAC,iBAAgB;AACvC,SAAS,eAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,UAAS,YAAY,UAAU,eAAe;;;ACH1D,IAAM,yBAAyB,CACpC,WACA,YACuB;AACvB,MAAI,cAAc,UAAa,YAAY,OAAW,QAAO;AAC7D,QAAM,aAAa,KAAK,IAAI,GAAG,UAAU,SAAS;AAClD,SAAO,aAAa,MAChB,GAAG,UAAU,OACb,IAAI,aAAa,KAAO,QAAQ,CAAC,CAAC;AACxC;;;ADFA,SAAS,iBAAiB;AAC1B,SAAS,oBAAAC,yBAAwB;;;AENjC,SAAS,iBAAiB,oBAAoB;AAM9C,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAEpB,IAAM,eAAe,CAAC,MAAoB,UAC9C,SAAS,QAAQ,kBAAkB,sBAAsB;AAErD,IAAM,sBAAsB,CACjC,YAC0C;AAC1C,QAAM,WAAW,QAAQ,QAAQ,eAAe;AAChD,MAAI,YAAY,GAAG;AACjB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,QAAQ,MAAM,GAAG,QAAQ,IAAI,QAAQ,MAAM,WAAW,gBAAgB,MAAM;AAAA,IACpF;AAAA,EACF;AACA,QAAM,cAAc,QAAQ,QAAQ,kBAAkB;AACtD,MAAI,eAAe,GAAG;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,QAAQ,MAAM,GAAG,WAAW,IAAI,QAAQ,MAAM,cAAc,mBAAmB,MAAM;AAAA,IAC7F;AAAA,EACF;AACA,SAAO,EAAE,MAAM,QAAQ;AACzB;AAEO,IAAM,+BAA+B,CAC1C,OACA,cACiD;AACjD,MAAI,cAAc,MAAO,QAAO,MAAM;AACtC,QAAM,QAA+C,CAAC;AACtD,SAAO,CAAC,SACL,MAAM,IAAI,MACT,aAAa,MAAM,OAAO,cAAc,WAAW,OAAO,IAAI,KAC9D,eAAe,MAAM,SAAS;AACpC;AAEO,IAAM,sBAAsB,CACjC,MACA,eACW;AACX,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,UAAU,KACb,QAAQ,aAAa,YAAY,UAAU,EAC3C,QAAQ,cAAc,aAAa,UAAU,EAC7C,QAAQ,cAAc,aAAa,UAAU;AAChD,SAAO,aAAa;AACtB;AAEA,IAAM,iBAAiB,CACrB,MACA,cACW;AACX,MAAI,qBAAqB,MAAM,SAAS;AACtC,QAAI,SAAS,OAAO;AAClB,aAAO,cAAc,WAAW,2BAA2B;AAAA,IAC7D;AACA,WAAO,cAAc,WAAW,2BAA2B;AAAA,EAC7D;AACA,MAAI,SAAS,OAAO;AAClB,WAAO,cAAc,WAAW,wBAAwB;AAAA,EAC1D;AACA,SAAO,cAAc,WAAW,wBAAwB;AAC1D;AAEA,IAAM,eAAe,CACnB,MACA,OACA,cACuB;AACvB,QAAM,SAAS;AAGf,QAAM,KAAK,QAAQ,YAAY,SAAS,QAAQ,kBAAkB,iBAAiB;AACnF,QAAM,QAAQ,aAAa,MAAM,EAAE;AACnC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OACJ,aAAa,QAAQ,YAAY,SAAS,QAAQ,kBAAkB,aAAa,KAAK,EAAE,KACxF,aAAa,QAAQ,YAAY,eAAe,KAAK,EAAE,MACtD,qBAAqB,MAAM,UAAU,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AACxF,SAAO,aAAa,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC,IAAI,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC,IAAI,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC;AACvL;AAEA,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,YAAY,IAAI,KAAK,UAAU,QAAW,EAAE,aAAa,WAAW,CAAC;AAEpE,IAAM,sBAAsB,CACjC,MACA,OACA,UAAU,GACV,qBAAqB,OACR;AACb,MAAI,SAAS,EAAG,QAAO,CAAC,EAAE;AAC1B,QAAM,OAAiB,CAAC;AACxB,MAAI,MAAM;AACV,MAAI,WAAW;AACf,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,QAAM,oBAAoB,aAAa,kBAAkB;AAEzD,QAAM,UAAU,MAAe;AAC7B,SAAK,KAAK,mBAAmB,KAAK,UAAU,KAAK,CAAC;AAClD,QAAI,KAAK,UAAU,SAAS;AAC1B,sBAAgB,MAAM,KAAK;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,qBAAqB,QAAQ,qBAAqB;AACxD,eAAW;AACX,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,KAAK,QAAQ;AAC1B,UAAM,OAAO,WAAW,MAAM,KAAK;AACnC,QAAI,MAAM;AACR,aAAO,KAAK;AACZ,cAAQ,gBAAgB,OAAO,KAAK,QAAQ;AAC5C,eAAS,KAAK,SAAS;AACvB;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,QAAQ,QAAQ,KAAK;AAC3C,UAAM,WAAW,YAAY,IAAI,WAAW,KAAK;AACjD,UAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ;AACxC,UAAM,iBAAiB,QAAQ;AAC/B,QAAI,MAAM,UAAU,kBAAkB,mBAAmB,KAAK,KAAK,GAAG;AACpE,aAAO;AACP,kBAAY,MAAM;AAAA,IACpB,OAAO;AACL,iBAAW,EAAE,QAAQ,KAAK,UAAU,QAAQ,KAAK,GAAG;AAClD,cAAM,eAAe,aAAa,OAAO;AACzC,YAAI,WAAW,KAAK,WAAW,eAAe,SAAS,CAAC,QAAQ,EAAG,QAAO;AAC1E,YAAI,WAAW,KAAK,WAAW,eAAe,OAAO;AACnD,gBAAM;AACN,qBAAW;AAAA,QACb;AACA,YAAI,eAAe,SAAS,aAAa,GAAG;AAC1C,gBAAM,UAAU,gBAAgB,SAAS,OAAO,EAAE;AAClD,cAAI,SAAS;AACX,mBAAO;AACP,wBAAY,aAAa,OAAO;AAAA,UAClC;AACA,cAAI,CAAC,QAAQ,EAAG,QAAO;AACvB;AAAA,QACF;AACA,eAAO;AACP,oBAAY;AAAA,MACd;AAAA,IACF;AACA,YAAQ;AAAA,EACV;AAEA,OAAK,KAAK,mBAAmB,KAAK,UAAU,KAAK,CAAC;AAClD,MAAI,KAAK,SAAS,QAAS,QAAO,gBAAgB,KAAK,MAAM,GAAG,OAAO,GAAG,KAAK;AAC/E,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAC,KAAa,UAAkB,UAA0B;AACnF,MAAI,YAAY,SAAS,mBAAmB,KAAK,GAAG,EAAG,QAAO;AAC9D,SAAO,gBAAgB,KAAK,OAAO,EAAE;AACvC;AAEA,IAAM,kBAAkB,CAAC,MAAgB,UAA4B;AACnE,QAAM,OAAO,KAAK,GAAG,EAAE,KAAK;AAC5B,MAAI,aAAa,IAAI,KAAK,SAAS,QAAQ,GAAG;AAC5C,SAAK,KAAK,SAAS,CAAC,IAAI,gBAAgB,MAAM,QAAQ,GAAG,EAAE,IAAI;AAAA,EACjE;AACA,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,MAAc,UAAoD;AACpF,MAAI,KAAK,KAAK,MAAM,UAAU,KAAK,QAAQ,CAAC,MAAM,IAAK,QAAO;AAC9D,MAAI,MAAM,QAAQ;AAClB,SAAO,MAAM,KAAK,UAAU,KAAK,GAAG,MAAM,IAAK;AAC/C,MAAI,OAAO,KAAK,OAAQ,QAAO;AAC/B,SAAO,EAAE,UAAU,KAAK,MAAM,OAAO,MAAM,CAAC,EAAE;AAChD;AAEA,IAAM,kBAAkB,CAAC,SAAiB,aAA6B;AACrE,MAAI,aAAa,UAAW,QAAO;AACnC,MAAI,0BAA0B,KAAK,QAAQ,GAAG;AAC5C,WAAO,YAAY,SAAS,0BAA0B,aAAa,aAAa,KAAK,QAAQ;AAAA,EAC/F;AACA,MAAI,0BAA0B,KAAK,QAAQ,GAAG;AAC5C,WAAO,YAAY,SAAS,0BAA0B,aAAa,aAAa,KAAK,QAAQ;AAAA,EAC/F;AACA,MAAI,aAAa,WAAY,QAAO,QAAQ,QAAQ,mBAAmB,EAAE;AACzE,MAAI,aAAa,UAAW,QAAO,YAAY,SAAS,aAAa,QAAQ;AAC7E,MAAI,aAAa,UAAW,QAAO,YAAY,SAAS,aAAa,QAAQ;AAC7E,MAAI,aAAa,aAAa,aAAa,YAAY;AACrD,WAAO,YAAY,SAAS,oBAAoB,aAAa,aAAa,KAAK,QAAQ;AAAA,EACzF;AACA,MAAI,aAAa,aAAa,aAAa,YAAY;AACrD,WAAO,YAAY,SAAS,oBAAoB,aAAa,aAAa,KAAK,QAAQ;AAAA,EACzF;AACA,SAAO,UAAU;AACnB;AAEA,IAAM,cAAc,CAAC,SAAiB,SAAiB,gBACrD,QAAQ,QAAQ,SAAS,EAAE,IAAI;AAEjC,IAAM,eAAe,CAAC,SAAkE;AACtF,QAAM,QAAQ,KAAK,MAAM,sCAAsC;AAC/D,MAAI,MAAO,QAAO,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC,EAAE;AAClF,QAAM,UAAU,KAAK,MAAM,0BAA0B;AACrD,MAAI,QAAS,QAAO,aAAa,OAAO,QAAQ,CAAC,CAAC,CAAC;AACnD,SAAO;AACT;;;ACxNO,IAAM,oBAAoB,CAAC,SAAyB,KAAK,QAAQ,OAAO,MAAM;AAE9E,IAAMC,sBAAqB,CAAC,SACjC,KACG,QAAQ,SAAS,QAAG,EACpB,QAAQ,OAAO,QAAG,EAClB,QAAQ,0CAA0C,QAAG;;;ACC1D,IAAM,qBACJ,WAAC,uGAA0F,IAAE;AAC/F,IAAM,2BAA2B;AACjC,IAAM,uBAAuB,WAAC,4BAAsB,GAAC;AACrD,IAAM,uBAAuB,WAAC,aAAS,GAAC;AACxC,IAAM,oCACJ;AACF,IAAM,iCAAiC;AACvC,IAAM,uCAAuC;AAEtC,SAAS,mBAAmB,MAAmC;AACpE,QAAM,SAA8B,CAAC;AACrC,aAAW,SAAS,KAAK,SAAS,kBAAkB,GAAG;AACrD,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,QAAQ,MAAM;AACpB,WAAO,KAAK,EAAE,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,CAAC;AAAA,EACzD;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAwB;AACtD,SAAO,MAAM,KAAK,KAAK,SAAS,kBAAkB,GAAG,CAAC,UAAU,MAAM,CAAC,CAAC;AAC1E;AAEO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,yBAAyB,KAAK,KAAK;AAC5C;AAEO,SAAS,cAAc,OAAwB;AACpD,SAAO,qBAAqB,KAAK,KAAK;AACxC;AAEO,SAAS,cAAc,OAAwB;AACpD,SAAO,qBAAqB,KAAK,KAAK;AACxC;AAEO,SAAS,0BAA0B,OAAwB;AAChE,SAAO,kCAAkC,KAAK,KAAK;AACrD;AAEO,SAAS,wBAAwB,OAAuB;AAC7D,MAAI,kBAAkB,KAAK,EAAG,QAAO;AACrC,MAAI,cAAc,KAAK,EAAG,QAAO;AACjC,MAAI,+BAA+B,KAAK,KAAK,EAAG,QAAO;AACvD,MAAI,0BAA0B,KAAK,EAAG,QAAO;AAC7C,MAAI,qCAAqC,KAAK,KAAK,EAAG,QAAO;AAC7D,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAe,OAAoC;AACtF,QAAM,QAA6B,CAAC;AACpC,QAAM,cACJ,WAAC,yLAAsK,IAAE;AAC3K,aAAW,SAAS,MAAM,SAAS,WAAW,GAAG;AAC/C,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,SAAS,MAAM;AACrB,UAAM,KAAK,EAAE,OAAO,MAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,SAAS,KAAK,OAAO,CAAC;AAAA,EACtF;AACA,SAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,EAAE,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,CAAC;AAChF;AAEO,SAAS,kCAAkC,QAAuC;AACvF,QAAM,SAAmB,CAAC;AAC1B,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,kBAAkB,MAAM,KAAK,GAAG;AACnC,aAAO,KAAK,MAAM,KAAK;AACvB;AAAA,IACF;AACA,UAAM,QAAQ,qBAAqB,MAAM,OAAO,CAAC,EAC9C,IAAI,CAAC,SAAS,KAAK,KAAK,EACxB,OAAO,0BAA0B;AACpC,QAAI,MAAM,WAAW,EAAG,QAAO,KAAK,MAAM,MAAM,YAAY,CAAC;AAAA,QACxD,QAAO,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;AAAA,EAC7D;AACA,SAAO;AACT;AAEO,SAAS,2BAA2B,OAAwB;AACjE,SAAO,CAAC,UAAU,KAAK,KAAK;AAC9B;;;ACvEO,SAAS,mBACd,OACA,MACuB;AACvB,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,yBACd,MACQ;AAGR,SAAQ,KAAK,sBAAsB,qBAAqB,KAAK,KAAK,OAAO;AAC3E;AAEO,SAAS,kBACd,MACqB;AACrB,SAAQ,KAAK,WAAW,mBAAmB,yBAAyB,IAAI,CAAC;AAC3E;AAEA,SAAS,qBAAqB,SAAyB;AACrD,SAAOC,oBAAmB,kBAAkB,OAAO,CAAC;AACtD;;;ACrCA,IAAM,0BAA0B;AAIhC,SAAS,mBAAmB,GAAW,GAAoB;AACzD,SAAO,KAAK,IAAI,IAAI,CAAC,IAAI;AAC3B;AAEO,SAAS,mBACd,cACA,aACA,SACyB;AACzB,QAAM,UAAU,cAAc;AAC9B,QAAM,KAAK,IAAI,cAAc,eAAe,KAAK,OAAO;AAExD,WAASC,KAAI,eAAe,GAAGA,MAAK,GAAGA,MAAK;AAC1C,UAAM,YAAYA,KAAI;AACtB,UAAM,gBAAgB,YAAY;AAClC,aAASC,KAAI,cAAc,GAAGA,MAAK,GAAGA,MAAK;AACzC,YAAM,YAAY,QAAQD,IAAGC,EAAC;AAC9B,YAAM,QAAQ,OAAO,SAAS,SAAS,IAAI,GAAG,gBAAgBA,KAAI,CAAC,IAAK,YAAY;AACpF,SAAG,YAAYA,EAAC,IAAI,KAAK,IAAI,OAAO,GAAG,gBAAgBA,EAAC,GAAI,GAAG,YAAYA,KAAI,CAAC,CAAE;AAAA,IACpF;AAAA,EACF;AAEA,QAAM,QAAiC,CAAC;AACxC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,IAAI,gBAAgB,IAAI,aAAa;AAC1C,UAAM,YAAY,IAAI;AACtB,UAAM,gBAAgB,YAAY;AAClC,UAAM,YAAY,QAAQ,GAAG,CAAC;AAC9B,UAAM,QAAQ,OAAO,SAAS,SAAS,IAAI,GAAG,gBAAgB,IAAI,CAAC,IAAK,YAAY;AACpF,QAAI,OAAO,SAAS,SAAS,KAAK,mBAAmB,GAAG,YAAY,CAAC,GAAI,KAAK,GAAG;AAC/E,YAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AACjB;AACA;AAAA,IACF,WAAW,GAAG,gBAAgB,CAAC,KAAM,GAAG,YAAY,IAAI,CAAC,GAAI;AAC3D;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBACd,cACA,aACA,SACyB;AACzB,QAAM,UAAU,cAAc;AAC9B,QAAM,KAAK,IAAI,cAAc,eAAe,KAAK,OAAO;AAExD,WAASD,KAAI,GAAGA,MAAK,cAAcA,MAAK;AACtC,UAAM,YAAYA,KAAI;AACtB,UAAM,oBAAoB,YAAY;AACtC,aAASC,KAAI,GAAGA,MAAK,aAAaA,MAAK;AACrC,YAAM,YAAY,QAAQD,KAAI,GAAGC,KAAI,CAAC;AACtC,YAAM,OAAO,OAAO,SAAS,SAAS,IAClC,GAAG,oBAAoBA,KAAI,CAAC,IAAK,YACjC;AACJ,SAAG,YAAYA,EAAC,IAAI,KAAK,IAAI,GAAG,oBAAoBA,EAAC,GAAI,GAAG,YAAYA,KAAI,CAAC,GAAI,IAAI;AAAA,IACvF;AAAA,EACF;AAEA,QAAM,QAAiC,CAAC;AACxC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,IAAI,GAAG;AACrB,UAAM,YAAY,IAAI;AACtB,UAAM,oBAAoB,YAAY;AACtC,UAAM,YAAY,QAAQ,IAAI,GAAG,IAAI,CAAC;AACtC,UAAM,OAAO,OAAO,SAAS,SAAS,IAClC,GAAG,oBAAoB,IAAI,CAAC,IAAK,YACjC;AACJ,QAAI,OAAO,SAAS,SAAS,KAAK,mBAAmB,GAAG,YAAY,CAAC,GAAI,IAAI,GAAG;AAC9E,YAAM,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACzB;AACA;AAAA,IACF,WAAW,GAAG,oBAAoB,CAAC,KAAM,GAAG,YAAY,IAAI,CAAC,GAAI;AAC/D;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,QAAQ;AACvB;AAEO,SAAS,qBACd,cACA,aACA,SACQ;AACR,MAAI,OAAO,IAAI,aAAa,cAAc,CAAC;AAC3C,MAAI,UAAU,IAAI,aAAa,cAAc,CAAC;AAE9C,WAAS,IAAI,eAAe,GAAG,KAAK,GAAG,KAAK;AAC1C,YAAQ,WAAW,IAAI;AACvB,aAAS,IAAI,cAAc,GAAG,KAAK,GAAG,KAAK;AACzC,YAAM,YAAY,QAAQ,GAAG,CAAC;AAC9B,YAAM,QAAQ,OAAO,SAAS,SAAS,IAAI,UAAU,MAAM,IAAI,CAAC,IAAI,YAAY;AAChF,cAAQ,CAAC,IAAI,KAAK,IAAI,OAAO,UAAU,MAAM,CAAC,GAAG,UAAU,SAAS,IAAI,CAAC,CAAC;AAAA,IAC5E;AACA,KAAC,MAAM,OAAO,IAAI,CAAC,SAAS,IAAI;AAAA,EAClC;AAEA,SAAO,UAAU,MAAM,CAAC;AAC1B;AAEA,SAAS,UAAU,QAA2B,OAAuB;AACnE,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,UAAU,OAAW,OAAM,IAAI,WAAW,0BAA0B,KAAK,EAAE;AAC/E,SAAO;AACT;;;ACtGA,IAAM,2BAA2B;AACjC,IAAM,kCAAkC;AAExC,SAAS,iCACP,MACU;AACV,SAAQ,KAAK,0BAA0B;AAAA,IACrC,kBAAkB,IAAI;AAAA,EACxB;AACF;AAEA,SAAS,mCACP,MACU;AACV,SAAQ,KAAK,4BAA4B;AAAA,IACvC,iCAAiC,IAAI;AAAA,EACvC;AACF;AAEO,SAAS,+BACd,SACA,OACgC;AAChC,QAAM,kBAAkB,QAAQ,IAAI,kCAAkC;AACtE,QAAM,gBAAgB,MAAM,IAAI,kCAAkC;AAClE,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,2BAAyB,iBAAiB,cAAc;AACxD,2BAAyB,eAAe,cAAc;AACtD,SAAO,EAAE,iBAAiB,eAAe,eAAe;AAC1D;AAEA,SAAS,yBACP,cACA,gBACM;AACN,aAAW,YAAY,cAAc;AACnC,eAAW,WAAW,IAAI,IAAI,QAAQ;AACpC,qBAAe,IAAI,UAAU,eAAe,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,EACtE;AACF;AAEO,SAAS,iCACd,SACA,OACA,WACS;AACT,QAAM,gBAAgB,IAAI,IAAI,mCAAmC,KAAK,CAAC;AACvE,aAAW,WAAW,IAAI,IAAI,mCAAmC,OAAO,CAAC,GAAG;AAC1E,QAAI,CAAC,cAAc,IAAI,OAAO,EAAG;AACjC,QAAI,UAAU,eAAe,IAAI,OAAO,MAAM,KAAK,YAAY,OAAO,KAAK,EAAG,QAAO;AAAA,EACvF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAA4B;AACtD,QAAM,WAAW,CAAC,GAAG,MAAM;AAC3B;AAAA,IACE;AAAA,IACA,OAAO,OAAO,wBAAwB;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBACP,UACA,QACA,MACA,QACM;AACN,WAAS,QAAQ,GAAG,QAAQ,QAAQ,OAAO,QAAQ;AACjD,aAAS,KAAK,GAAG,MAAM,GAAG,OAAO,MAAM,OAAO,QAAQ,IAAI,EAAE,KAAK,IAAQ,CAAC,EAAE;AAChF;AAEA,SAAS,yBAAyB,OAAwB;AACxD,SAAO,wBAAwB,KAAK,KAAK;AAC3C;AAEO,SAAS,sBACd,WACuB;AACvB,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,YAAY,UAAU,gBAAgB,SAAS,UAAU,cAAc;AAC7E,SAAO,CAAC,UAAU;AAChB,UAAM,SAAS,QAAQ,IAAI,KAAK;AAChC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,gBAAgB,UAAU,eAAe,IAAI,KAAK,KAAK;AAC7D,UAAM,SAAS,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK,YAAY,MAAM,gBAAgB,EAAE,CAAC;AAC9E,UAAM,SAAS,YAAY,KAAK,IAAI;AACpC,YAAQ,IAAI,OAAO,MAAM;AACzB,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBACd,SACA,OACA,QACA,eACA,aACQ;AACR,SAAO;AAAA,IACL,mCAAmC,OAAO;AAAA,IAC1C,mCAAmC,KAAK;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gBACd,cACA,aACA,SAAgC,aAChC,4BAA4B,GAC5B,cACA,aACQ;AACR,MAAI,aAAa,WAAW,KAAK,YAAY,WAAW;AACtD,WAAO,aAAa,WAAW,YAAY,SAAS,IAAI;AAC1D,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,MAAI,gBAAgB,0BAA2B,QAAO;AACtD,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,0BAA0B,cAAc,MAAM;AAAA,IAC9D,eAAe,0BAA0B,aAAa,MAAM;AAAA,EAC9D;AACA,MAAI,sBAAsB,OAAW,QAAO;AAC5C,SAAO,KAAK;AAAA,IACV;AAAA,IACA,gBAAgB;AAAA,IAChB,oBAAoB,OAAO,gBAAgB;AAAA,EAC7C;AACF;AAEA,SAAS,yBACP,cACA,aACA,QACA,eAAe,0BAA0B,cAAc,MAAM,GAC7D,cAAc,0BAA0B,aAAa,MAAM,GACnD;AACR,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,SAAS,aAAc,WAAU,IAAI,QAAQ,UAAU,IAAI,KAAK,KAAK,KAAK,CAAC;AACtF,MAAI,eAAe;AACnB,aAAW,SAAS,aAAa;AAC/B,UAAM,QAAQ,UAAU,IAAI,KAAK,KAAK;AACtC,QAAI,UAAU,EAAG;AACjB,oBAAgB,OAAO,KAAK;AAC5B,QAAI,UAAU,EAAG,WAAU,OAAO,KAAK;AAAA,QAClC,WAAU,IAAI,OAAO,QAAQ,CAAC;AAAA,EACrC;AACA,SAAQ,IAAI,gBAAiB,eAAe;AAC9C;AAEA,SAAS,uBACP,cACA,aACA,QACA,cACA,aACoB;AACpB,MAAI,aAAa,SAAS,YAAY,SAAS,gCAAiC,QAAO;AACvF,QAAM,QAAQ;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,CAAC,aAAa,eAAe;AAC3B,YAAM,cAAc,SAAS,cAAc,WAAW;AACtD,aAAO,gBAAgB,SAAS,aAAa,UAAU,IACnD,OAAO,WAAW,IAClB,OAAO;AAAA,IACb;AAAA,EACF;AAEA,SAAQ,IAAI,SAAU,eAAe;AACvC;AAEO,SAAS,0BAA0B,QAAkB,QAAuC;AACjG,SAAO,OAAO,OAAO,CAAC,OAAO,UAAU,QAAQ,OAAO,KAAK,GAAG,CAAC;AACjE;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,MAAM,WAAW,wBAAwB,EAAG,QAAO;AACvD,SAAO,wBAAwB,KAAK;AACtC;AAEA,SAAS,SAAS,QAAkB,OAAuB;AACzD,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,UAAU,OAAW,OAAM,IAAI,WAAW,4BAA4B,KAAK,EAAE;AACjF,SAAO;AACT;;;ACrKA,IAAM,0CAA0C;AAChD,IAAM,+BAA+B;AACrC,IAAM,wCAAwC;AAC9C,IAAM,iCAAiC;AACvC,IAAM,gCAAgC;AACtC,IAAM,6BAA6B;AACnC,IAAM,4BAA4B;AAE3B,SAAS,wBACd,SACA,OACA,QACyB;AACzB,QAAM,sBAAsB,+BAA+B,SAAS,KAAK;AACzE,QAAMC,eAAc,sBAAsB,mBAAmB;AAC7D,QAAM,iBAA4C,CAAC;AACnD,QAAM,eAA0C,CAAC;AACjD,QAAM,oBACJ,QAAQ,SAAS,MAAM,UAAU;AACnC,QAAM,aAAa,oBAAoB,oBAAI,IAAoB,IAAI;AACnE,QAAM,UAAU,CAAC,iBAAyB,kBAAkC;AAC1E,UAAM,MAAM,kBAAkB,MAAM,SAAS;AAC7C,UAAM,SAAS,YAAY,IAAI,GAAG;AAClC,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,kBAAkB,oBAAoB,gBAAgB,eAAe;AAC3E,UAAM,gBAAgB,oBAAoB,cAAc,aAAa;AACrE,QAAI,oBAAoB,UAAa,kBAAkB;AACrD,YAAM,IAAI,WAAW,+BAA+B,eAAe,IAAI,aAAa,EAAE;AACxF,UAAM,gBAAiB,eAAe,eAAe,MAAM;AAAA,MACzD;AAAA,MACAA;AAAA,IACF;AACA,UAAM,cAAe,aAAa,aAAa,MAAM;AAAA,MACnD;AAAA,MACAA;AAAA,IACF;AACA,UAAM,QAAQ;AAAA,MACZ,cAAc,SAAS,eAAe;AAAA,MACtC,cAAc,OAAO,aAAa;AAAA,MAClCA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,gBAAY,IAAI,KAAK,KAAK;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,gCAAgC,qBAAqBA,YAAW;AACzF,QAAM,QAAQ,yBAAyB,SAAS,OAAO,kBAAkB,SAAS,MAAM;AACxF,QAAM,YAAY,qBAAqB,SAAS,KAAK;AACrD,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,YAAY,oBAAI,IAAY;AAClC,aAAW,QAAQ,OAAO;AACxB,UAAM,kBAAkB,UAAU,QAAQ,IAAI,KAAK,YAAY;AAC/D,UAAM,gBAAgB,UAAU,MAAM,IAAI,KAAK,UAAU;AACzD,QAAI,oBAAoB,OAAW,aAAY,IAAI,eAAe;AAClE,QAAI,kBAAkB,OAAW,WAAU,IAAI,aAAa;AAAA,EAC9D;AAEA,WAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,QAAQ,QAAQ,MAAM,MAAM,GAAG,SAAS;AAC3E,QAAI,YAAY,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,EAAG;AACpD,UAAM,QAAQ,QAAQ,OAAO,KAAK;AAClC,QAAI,QAAQ,OAAO,+BAAgC;AACnD,UAAM,cAAc,cAAc,SAAS,KAAK;AAChD,UAAM,YAAY,cAAc,OAAO,KAAK;AAC5C,QAAI,iCAAiC,aAAa,WAAW,mBAAmB,GAAG;AACjF,YAAM,KAAK;AAAA,QACT,cAAc,YAAY;AAAA,QAC1B,YAAY,UAAU;AAAA,QACtB,YAAY,OAAO,mBAAmB,OAAO,CAAC;AAAA,MAChD,CAAC;AACD,kBAAY,IAAI,KAAK;AACrB,gBAAU,IAAI,KAAK;AACnB;AAAA,IACF;AACA,QAAI,CAAC,kBAAmB;AAExB,UAAM,iBAAiB,OAAO;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,OAAO,gCAAgC,OAAO,cAAc,EAAG;AACnE,UAAM,KAAK;AAAA,MACT,cAAc,YAAY;AAAA,MAC1B,YAAY,UAAU;AAAA,MACtB,YAAY,OAAO,mBAAmB,OAAO,cAAc;AAAA,IAC7D,CAAC;AACD,gBAAY,IAAI,KAAK;AACrB,cAAU,IAAI,KAAK;AAAA,EACrB;AACA,SAAO,MAAM;AAAA,IACX,CAAC,GAAG,OACD,UAAU,QAAQ,IAAI,EAAE,YAAY,KAAK,MAAM,UAAU,QAAQ,IAAI,EAAE,YAAY,KAAK;AAAA,EAC7F;AACF;AAEA,SAAS,gCACP,WACAA,cACkC;AAClC,QAAM,mBAAmB,2BAA2B,UAAU,eAAe;AAC7E,QAAM,iBAAiB,2BAA2B,UAAU,aAAa;AACzE,QAAM,aAAa,oBAAI,IAA4C;AACnE,QAAM,cAAc,UAAU,cAAc;AAE5C,aAAW,CAAC,SAAS,uBAAuB,KAAK,kBAAkB;AACjE,UAAM,wBAAwB,eAAe,IAAI,OAAO;AACxD,QAAI,CAAC,sBAAuB;AAC5B,UAAM,gBAAgB,UAAU,eAAe,IAAI,OAAO,KAAK,OAAO;AACtE,QACE,gBAAgB,gCAChB,wBAAwB,SAAS,yCACjC,sBAAsB,SAAS;AAE/B;AACF,UAAM,SAASA,aAAY,OAAO;AAClC,QAAI,SAAS,EAAG;AAChB,UAAM,gBACJ,kBAAkB,KAClB,wBAAwB,WAAW,KACnC,sBAAsB,WAAW;AAEnC,eAAW,mBAAmB,yBAAyB;AACrD,iBAAW,iBAAiB,uBAAuB;AACjD,cAAM,MAAM,kBAAkB,cAAc;AAC5C,cAAM,YAAY,WAAW,IAAI,GAAG;AACpC,YAAI,WAAW;AACb,oBAAU,YAAY;AACtB,oBAAU;AACV,oBAAU,qBAAqB;AAAA,QACjC,OAAO;AACL,qBAAW,IAAI,KAAK;AAAA,YAClB;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV,oBAAoB;AAAA,YACpB,kBAAkB;AAAA,YAClB,mBAAmB;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,GAAG,WAAW,OAAO,CAAC;AAC7C,6BAA2B,aAAa;AACxC,SAAO,uCAAuC,aAAa;AAC7D;AAEA,SAAS,2BAA2B,cAAiD;AACnF,QAAM,YAAY,oBAAI,IAAsB;AAC5C,WAAS,WAAW,GAAG,WAAW,aAAa,QAAQ,YAAY;AACjE,UAAM,WAAW,aAAa,QAAQ;AACtC,QAAI,CAAC,SAAU;AACf,eAAW,WAAW,IAAI,IAAI,QAAQ,GAAG;AACvC,YAAM,mBAAmB,UAAU,IAAI,OAAO;AAC9C,UAAI,iBAAkB,kBAAiB,KAAK,QAAQ;AAAA,UAC/C,WAAU,IAAI,SAAS,CAAC,QAAQ,CAAC;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,YAAoD;AACtF,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,CAAC,cAAc,UAAU;AAAA,IACzB,CAAC,cAAc,UAAU;AAAA,EAC3B;AACA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,CAAC,cAAc,UAAU;AAAA,IACzB,CAAC,cAAc,UAAU;AAAA,EAC3B;AACA,aAAW,aAAa,YAAY;AAClC,cAAU,oBAAoB,KAAK;AAAA,MACjC,wBAAwB,gBAAgB,IAAI,UAAU,eAAe,GAAG,UAAU,QAAQ;AAAA,MAC1F,wBAAwB,cAAc,IAAI,UAAU,aAAa,GAAG,UAAU,QAAQ;AAAA,IACxF;AAAA,EACF;AACF;AAEA,SAAS,sBACP,YACA,UACA,OACoC;AACpC,QAAM,SAAS,oBAAI,IAAmC;AACtD,aAAW,aAAa,YAAY;AAClC,UAAM,UAAU,OAAO,IAAI,SAAS,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE;AACxE,UAAM,iBAAiB,MAAM,SAAS;AACtC,QAAI,kBAAkB,QAAQ,MAAM;AAClC,cAAQ,SAAS,QAAQ;AACzB,cAAQ,OAAO;AAAA,IACjB,WAAW,iBAAiB,QAAQ,OAAQ,SAAQ,SAAS;AAC7D,WAAO,IAAI,SAAS,SAAS,GAAG,OAAO;AAAA,EACzC;AACA,SAAO;AACT;AAEO,SAAS,wBACd,QACA,gBACQ;AACR,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,mBAAmB,OAAO,OAAO,OAAO,SAAS,OAAO;AACjE;AAEA,SAAS,uCACP,YACkC;AAClC,QAAM,YAAY,oBAAI,IAA8C;AACpE,QAAM,UAAU,oBAAI,IAA8C;AAClE,aAAW,aAAa,YAAY;AAClC,0BAAsB,WAAW,UAAU,iBAAiB,SAAS;AACrE,0BAAsB,SAAS,UAAU,eAAe,SAAS;AAAA,EACnE;AACA,QAAM,oBAAoB,oBAAoB,SAAS;AACvD,QAAM,kBAAkB,oBAAoB,OAAO;AACnD,SAAO,WAAW;AAAA,IAChB,CAAC,cAAc,kBAAkB,IAAI,SAAS,KAAK,gBAAgB,IAAI,SAAS;AAAA,EAClF;AACF;AAEA,SAAS,sBACP,YACA,UACA,WACM;AACN,QAAM,aAAa,WAAW,IAAI,QAAQ;AAC1C,MAAI,WAAY,YAAW,KAAK,SAAS;AAAA,MACpC,YAAW,IAAI,UAAU,CAAC,SAAS,CAAC;AAC3C;AAEA,SAAS,oBACP,YACqC;AACrC,QAAM,WAAW,oBAAI,IAAoC;AACzD,aAAW,cAAc,WAAW,OAAO,GAAG;AAC5C,eAAW,KAAK,uBAAuB;AACvC,eAAW,aAAa,WAAW,MAAM,GAAG,8BAA8B;AACxE,eAAS,IAAI,SAAS;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,wBACP,GACA,GACQ;AACR,SACE,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,gBAAgB,KACtD,EAAE,WAAW,EAAE,YACf,EAAE,qBAAqB,EAAE,sBACzB,KAAK,IAAI,EAAE,kBAAkB,EAAE,aAAa,IAAI,KAAK,IAAI,EAAE,kBAAkB,EAAE,aAAa,KAC5F,EAAE,kBAAkB,EAAE,mBACtB,EAAE,gBAAgB,EAAE;AAExB;AAEA,SAAS,yBACP,SACA,OACA,kBACA,SACA,QACyB;AACzB,QAAM,mBAA2D,iBAC9D,IAAI,CAAC,eAAe;AAAA,IACnB,GAAG;AAAA,IACH,OAAO,QAAQ,UAAU,iBAAiB,UAAU,aAAa;AAAA,EACnE,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,wBAAwB,GAAG,CAAC,CAAC;AACpE,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,CAAC,cAAc,UAAU;AAAA,IACzB,CAAC,cAAc,UAAU;AAAA,EAC3B;AACA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,CAAC,cAAc,UAAU;AAAA,IACzB,CAAC,cAAc,UAAU;AAAA,EAC3B;AACA,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,QAAiC,CAAC;AAExC,aAAW,aAAa,kBAAkB;AACxC,QAAI,UAAU,QAAQ,OAAO,wBAAyB;AACtD,QAAI,YAAY,IAAI,UAAU,eAAe,KAAK,UAAU,IAAI,UAAU,aAAa;AACrF;AACF,QAAI,CAAC,wBAAwB,SAAS,EAAG;AACzC,UAAM,iBAAiB,KAAK;AAAA,MAC1B,wBAAwB,cAAc,IAAI,UAAU,eAAe,GAAG,UAAU,KAAK;AAAA,MACrF,wBAAwB,YAAY,IAAI,UAAU,aAAa,GAAG,UAAU,KAAK;AAAA,MACjF,+BAA+B,WAAW,QAAQ,QAAQ,MAAM,QAAQ,OAAO;AAAA,IACjF;AACA,QAAI,CAAC,OAAO,gCAAgC,UAAU,OAAO,cAAc,EAAG;AAC9E,gBAAY,IAAI,UAAU,eAAe;AACzC,cAAU,IAAI,UAAU,aAAa;AACrC,UAAM,KAAK;AAAA,MACT,cAAc,cAAc,SAAS,UAAU,eAAe,EAAE;AAAA,MAChE,YAAY,cAAc,OAAO,UAAU,aAAa,EAAE;AAAA,MAC1D,YAAY,OAAO,mBAAmB,UAAU,OAAO,cAAc;AAAA,IACvE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,+BACP,WACA,eACA,aACA,SACQ;AACR,MAAI,iBAAiB;AACrB,MACE,UAAU,kBAAkB,eAC5B,UAAU,kBAAkB,UAAU;AAEtC,qBAAiB,QAAQ,UAAU,iBAAiB,UAAU,eAAe;AAC/E,MACE,UAAU,gBAAgB,iBAC1B,UAAU,oBAAoB,UAAU;AAExC,qBAAiB,KAAK;AAAA,MACpB;AAAA,MACA,QAAQ,UAAU,eAAe,UAAU,aAAa;AAAA,IAC1D;AACF,SAAO;AACT;AAEA,SAAS,wBAAwB,WAAoD;AACnF,MAAI,CAAC,UAAU,oBAAoB,UAAU,qBAAqB;AAChE,WAAO;AACT,SACE,UAAU,WAAW,UAAU,oBAAoB,8BACnD,UAAU,oBAAoB,UAAU,WAAW;AAEvD;AAOA,SAAS,qBACP,SACA,OACsB;AACtB,SAAO;AAAA,IACL,SAAS,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,IAClE,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EAChE;AACF;AAEA,SAAS,cACP,OACA,OACuB;AACvB,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI,SAAS,OAAW,OAAM,IAAI,WAAW,wBAAwB,KAAK,EAAE;AAC5E,SAAO;AACT;;;AC9XO,SAAS,kBACd,SACA,OACmB;AACnB,MAAI,QAAQ,WAAW,KAAK,MAAM,WAAW,EAAG,QAAO,CAAC;AACxD,MAAI,QAAQ,SAAS,MAAM,SAAS;AAClC,WAAO,wBAAwB,SAAS,OAAO,2BAA2B;AAC5E,QAAM,sBAAsB,+BAA+B,SAAS,KAAK;AACzE,QAAMC,eAAc,sBAAsB,mBAAmB;AAC7D,QAAM,EAAE,iBAAiB,cAAc,IAAI;AAC3C,QAAM,iBAAiB,gBAAgB;AAAA,IAAI,CAAC,WAC1C,0BAA0B,QAAQA,YAAW;AAAA,EAC/C;AACA,QAAM,eAAe,cAAc;AAAA,IAAI,CAAC,WACtC,0BAA0B,QAAQA,YAAW;AAAA,EAC/C;AACA,QAAM,SAAS,gBAAgB;AAAA,IAAI,CAAC,cAAc,oBAChD,cAAc;AAAA,MAAI,CAAC,aAAa,kBAC9B;AAAA,QACE;AAAA,QACA;AAAA,QACAA;AAAA,QACA;AAAA,QACA,eAAe,eAAe;AAAA,QAC9B,aAAa,aAAa;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,CAAC,iBAAiB,kBAAkB;AAClC,YAAM,QAAQ,OAAO,eAAe,IAAI,aAAa,KAAK;AAC1D,aAAO,SAAS,8BAA8B,QAAQ,OAAO,OAAO;AAAA,IACtE;AAAA,EACF;AACA,MAAI,aAAa,WAAW,KAAK,QAAQ,WAAW,KAAK,MAAM,WAAW;AACxE,WAAO;AAAA,MACL;AAAA,QACE,cAAcC,eAAc,SAAS,CAAC,EAAE;AAAA,QACxC,YAAYA,eAAc,OAAO,CAAC,EAAE;AAAA,QACpC,YAAY;AAAA,MACd;AAAA,IACF;AACF,QAAM,YAAYC,sBAAqB,SAAS,KAAK;AACrD,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,2BAA2B,SAAS,OAAO,QAAQ,YAAY;AAAA,EACjE;AACA,SAAO,iBAAiB,SAAS,OAAO,QAAQ,WAAW,cAAc;AAC3E;AAEA,IAAM,8BAA8B;AACpC,IAAM,qCAAqC;AAC3C,IAAM,qCAAqC;AAC3C,IAAM,oCAAoC;AAC1C,IAAM,0CAA0C;AAChD,IAAM,uCAAuC;AAC7C,IAAM,sCAAsC;AAC5C,IAAM,8BAA8B;AAEpC,IAAM,8BAAwD;AAAA,EAC5D,gCAAgC;AAAA,EAChC,yBAAyB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOA,SAASA,sBACP,SACA,OACsB;AACtB,SAAO;AAAA,IACL,SAAS,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,IAClE,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EAChE;AACF;AAEA,SAAS,0BACP,WACA,QACA,OACmB;AACnB,QAAM,iBAAoC,CAAC;AAC3C,aAAW,CAAC,cAAc,UAAU,KAAK,OAAO;AAC9C,UAAM,kBAAkB,UAAU,QAAQ,IAAI,YAAY;AAC1D,UAAM,gBAAgB,UAAU,MAAM,IAAI,UAAU;AACpD,QAAI,oBAAoB,UAAa,kBAAkB,OAAW;AAClE,UAAM,QAAQ,OAAO,eAAe,IAAI,aAAa,KAAK;AAC1D,UAAM,iBAAiB,0BAA0B,QAAQ,iBAAiB,aAAa;AACvF,QAAI,gCAAgC,OAAO,cAAc,EAAG;AAC5D,mBAAe,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA,YAAY,mBAAmB,OAAO,cAAc;AAAA,IACtD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,0BACP,QACA,iBACA,eACA,aACA,WACQ;AACR,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO,eAAe,GAAG,UAAU;AAAA,IACnC;AAAA,IACA;AAAA,IACA,CAAC,0BAA0B,2BACzB,OAAO,wBAAwB,IAAI,sBAAsB,KAAK;AAAA,IAChE;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,4BACP,eACA,aACA,iBACA,eACA,SACA,aACA,WACQ;AACR,MAAI,iBAAiB;AACrB,WACM,yBAAyB,GAC7B,yBAAyB,aACzB,0BACA;AACA,QAAI,2BAA2B,iBAAiB,WAAW,IAAI,sBAAsB;AACnF;AACF,qBAAiB,KAAK,IAAI,gBAAgB,QAAQ,iBAAiB,sBAAsB,CAAC;AAAA,EAC5F;AACA,WACM,2BAA2B,GAC/B,2BAA2B,eAC3B,4BACA;AACA,QAAI,6BAA6B,mBAAmB,aAAa,IAAI,wBAAwB;AAC3F;AACF,qBAAiB,KAAK,IAAI,gBAAgB,QAAQ,0BAA0B,aAAa,CAAC;AAAA,EAC5F;AACA,SAAO;AACT;AAEA,SAAS,gCAAgC,OAAe,gBAAiC;AACvF,SACE,kBAAkB,uCACjB,QAAQ,kBAAkB,sCACzB,kBAAkB,QAAQ;AAEhC;AAEA,SAAS,gCAAgC,OAAe,gBAAiC;AACvF,SAAO,QAAQ,kBAAkB,CAAC,gCAAgC,OAAO,cAAc;AACzF;AAEA,SAAS,mBAAmB,OAAe,gBAA8C;AACvF,MACE,SAAS,2CACT,QAAQ,kBAAkB,wCAC1B,kBAAkB,QAAQ;AAE1B,WAAO;AACT,SAAO;AACT;AAEA,SAAS,iBACP,SACA,OACA,QACA,WACA,OACmB;AACnB,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,YAAY,oBAAI,IAAY;AAClC,aAAW,QAAQ,OAAO;AACxB,UAAM,kBAAkB,UAAU,QAAQ,IAAI,KAAK,YAAY;AAC/D,UAAM,gBAAgB,UAAU,MAAM,IAAI,KAAK,UAAU;AACzD,QAAI,oBAAoB,OAAW,aAAY,IAAI,eAAe;AAClE,QAAI,kBAAkB,OAAW,WAAU,IAAI,aAAa;AAAA,EAC9D;AAEA,QAAM,aAAyC,CAAC;AAChD,WAAS,kBAAkB,GAAG,kBAAkB,QAAQ,QAAQ,mBAAmB;AACjF,QAAI,YAAY,IAAI,eAAe,EAAG;AACtC,aAAS,gBAAgB,GAAG,gBAAgB,MAAM,QAAQ,iBAAiB;AACzE,UAAI,UAAU,IAAI,aAAa,EAAG;AAClC,YAAM,QAAQ,OAAO,eAAe,IAAI,aAAa,KAAK;AAC1D,UAAI,SAAS;AACX,mBAAW,KAAK,EAAE,iBAAiB,eAAe,MAAM,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,aAAW,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC3C,QAAM,kBAAkB,2BAA2B,MAAM;AAEzD,QAAM,MAAM,CAAC,GAAG,KAAK;AACrB,aAAW,aAAa,YAAY;AAClC,QAAI,YAAY,IAAI,UAAU,eAAe,KAAK,UAAU,IAAI,UAAU,aAAa;AACrF;AACF,QAAI;AACJ,QAAI,UAAU,SAAS,yCAAyC;AAC9D,YAAM,0BAA0B;AAAA,QAC9B;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,UAAI,mBAAmB,UAAU,OAAO,uBAAuB,MAAM;AACnE,qBAAa;AAAA,IACjB;AACA,mBAAe,iCAAiC,iBAAiB,SAAS;AAC1E,QAAI,CAAC,WAAY;AACjB,gBAAY,IAAI,UAAU,eAAe;AACzC,cAAU,IAAI,UAAU,aAAa;AACrC,QAAI,KAAK;AAAA,MACP,cAAcD,eAAc,SAAS,UAAU,eAAe,EAAE;AAAA,MAChE,YAAYA,eAAc,OAAO,UAAU,aAAa,EAAE;AAAA,MAC1D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,IAAI;AAAA,IACT,CAAC,GAAG,OACD,UAAU,QAAQ,IAAI,EAAE,YAAY,KAAK,MAAM,UAAU,QAAQ,IAAI,EAAE,YAAY,KAAK;AAAA,EAC7F;AACF;AAOA,SAAS,2BAA2B,QAAgD;AAClF,QAAM,UAAmC,CAAC;AAC1C,QAAM,QAAiC,CAAC;AACxC,WAAS,kBAAkB,GAAG,kBAAkB,OAAO,QAAQ,mBAAmB;AAChF,UAAM,gBAAgB,OAAO,eAAe,KAAK,CAAC;AAClD,aAAS,gBAAgB,GAAG,gBAAgB,cAAc,QAAQ,iBAAiB;AACjF,YAAM,QAAQ,cAAc,aAAa,KAAK;AAC9C,wBAAkB,SAAS,iBAAiB,KAAK;AACjD,wBAAkB,OAAO,eAAe,KAAK;AAAA,IAC/C;AAAA,EACF;AACA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,SAAS,kBAAkB,QAAiC,UAAkB,OAAqB;AACjG,QAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE;AACzD,MAAI,SAAS,QAAQ,MAAM;AACzB,YAAQ,SAAS,QAAQ;AACzB,YAAQ,OAAO;AAAA,EACjB,WAAW,QAAQ,QAAQ,OAAQ,SAAQ,SAAS;AACpD,SAAO,QAAQ,IAAI;AACrB;AAEA,SAAS,iCACP,iBACA,WACkC;AAClC,QAAM,iBAAiB,KAAK;AAAA,IAC1B,wBAAwB,gBAAgB,QAAQ,UAAU,eAAe,GAAG,UAAU,KAAK;AAAA,IAC3F,wBAAwB,gBAAgB,MAAM,UAAU,aAAa,GAAG,UAAU,KAAK;AAAA,EACzF;AACA,MAAI,CAAC,gCAAgC,UAAU,OAAO,cAAc,EAAG,QAAO;AAC9E,SAAO,mBAAmB,UAAU,OAAO,cAAc;AAC3D;AAEA,SAAS,2BACP,SACA,OACA,QACA,cACwB;AACxB,QAAM,QAAgC,CAAC;AACvC,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAClB,aAAW,CAAC,iBAAiB,aAAa,KAAK,cAAc;AAC3D,UAAM;AAAA,MACJ,GAAG;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,KAAK;AAAA,MACTA,eAAc,SAAS,eAAe,EAAE;AAAA,MACxCA,eAAc,OAAO,aAAa,EAAE;AAAA,IACtC,CAAC;AACD,oBAAgB,kBAAkB;AAClC,kBAAc,gBAAgB;AAAA,EAChC;AACA,QAAM;AAAA,IACJ,GAAG;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cACP,SACA,OACA,QACA,cACA,YACA,YACA,UACwB;AACxB,QAAM,QAAgC,CAAC;AACvC,QAAM,QAAQ,KAAK,IAAI,aAAa,cAAc,WAAW,UAAU;AACvE,WAAS,SAAS,GAAG,SAAS,OAAO,UAAU;AAC7C,UAAM,kBAAkB,eAAe;AACvC,UAAM,gBAAgB,aAAa;AACnC,UAAM,QAAQ,OAAO,eAAe,IAAI,aAAa,KAAK;AAC1D,QAAI,QAAQ,mCAAoC;AAChD,UAAM,KAAK;AAAA,MACTA,eAAc,SAAS,eAAe,EAAE;AAAA,MACxCA,eAAc,OAAO,aAAa,EAAE;AAAA,IACtC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAASA,eACP,OACA,OACuB;AACvB,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI,SAAS,OAAW,OAAM,IAAI,WAAW,wBAAwB,KAAK,EAAE;AAC5E,SAAO;AACT;;;AChYO,SAAS,oBAAoB,OAA6C;AAC/E,SAAO,MAAM,OAAO,CAAC,OAAO,SAAS,KAAK,IAAI,OAAO,yBAAyB,IAAI,EAAE,MAAM,GAAG,CAAC;AAChG;AAEO,SAAS,qBAAqB,YAAoB,OAAuB;AAC9E,SAAO,WAAW,KAAK,EAAE,SAAS,OAAO,GAAG;AAC9C;AAEA,SAAS,yBAAyB,MAAqC;AACrE,SAAO,MAAM,WAAW,KAAK,KAAK;AACpC;AAEO,SAAS,cAAc,MAAqC;AACjE,QAAM,WAAW,KAAK,MAAM,0BAA0B;AACtD,MAAI,UAAU;AACZ,UAAM,CAAC,EAAE,MAAM,YAAY,OAAO,IAAI;AACtC,QACG,SAAS,OAAO,SAAS,OAAO,SAAS,OAC1C,eAAe,UACf,YAAY;AAEZ,aAAO;AACT,WAAO,EAAE,MAAM,YAAY,QAAQ;AAAA,EACrC;AAEA,MAAI,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,KAAK,EAAG,QAAO;AAC7D,QAAM,SAAS,KAAK,CAAC;AACrB,MAAI,WAAW,OAAO,WAAW,OAAO,WAAW,IAAK,QAAO;AAC/D,SAAO,EAAE,MAAM,QAAQ,YAAY,IAAI,SAAS,KAAK,MAAM,CAAC,EAAE;AAChE;AAEO,SAAS,gBAAgB,MAAoD;AAClF,SAAO,MAAM,SAAS;AACxB;AAEO,SAAS,kBAAkB,MAAsD;AACtF,SAAO,MAAM,SAAS;AACxB;;;ACpCO,SAAS,oBAAoB,QAA6B,OAAgC;AAC/F,QAAM,SAAsB,CAAC;AAC7B,WAAS,QAAQ,MAAM,OAAO,QAAQ,MAAM,KAAK,SAAS;AACxD,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,MAAO,kBAAiB,QAAQ,KAAK;AAAA,EAC3C;AACA,SAAO;AACT;AAEO,SAAS,eAAe,QAAqB,OAAgC;AAClF,SAAO,KAAK,CAAC,MAAM,OAAO,MAAM,GAAG,CAAC;AACtC;AAEO,SAAS,mBAAmB,QAAkC;AACnE,SAAO,YAAY,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5D;AAEO,SAAS,YAAY,QAAkC;AAC5D,QAAM,SAAsB,CAAC;AAC7B,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAW,OAAO,GAAG,EAAE;AAC7B,QAAI,YAAY,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK,EAAG,UAAS,CAAC,IAAI,MAAM,CAAC;AAAA,QAC7D,QAAO,KAAK,CAAC,GAAG,KAAK,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAqB,OAAgC;AAC7E,QAAM,WAAW,OAAO,GAAG,EAAE;AAC7B,MAAI,YAAY,MAAM,QAAQ,SAAS,CAAC,KAAK,EAAG,UAAS,CAAC,IAAI,MAAM;AAAA,MAC/D,QAAO,KAAK,CAAC,MAAM,OAAO,MAAM,GAAG,CAAC;AAC3C;;;ACpCA,IAAM,yBAAyB;AAC/B,IAAM,oBAAoB,IAAI,KAAK,UAAU,QAAW,EAAE,aAAa,WAAW,CAAC;AAK5E,SAAS,mBAAmB,QAAgB,OAAuB;AACxE,QAAM,SAAS,2BAA2B,QAAQ,KAAK;AACvD,MAAI,CAAC,yBAAyB,MAAM,KAAK,CAAC,yBAAyB,KAAK,EAAG,QAAO;AAClF,SAAO,2BAA2B,QAAQ,OAAO,MAAM;AACzD;AAEO,SAAS,mBAAmB,QAAgB,OAAe,cAA8B;AAC9F,QAAM,SAAS,2BAA2B,QAAQ,OAAO,YAAY;AACrE,MAAI,CAAC,yBAAyB,MAAM,KAAK,CAAC,yBAAyB,KAAK,EAAG,QAAO;AAClF,SAAO,2BAA2B,QAAQ,OAAO,MAAM;AACzD;AAEO,SAAS,yBAAyB,MAAuB;AAC9D,SAAO,uBAAuB,KAAK,IAAI,KAAK,KAAK,SAAS,MAAM;AAClE;AAEO,SAAS,qBAAqB,MAAqC;AACxE,MAAI,CAAC,yBAAyB,IAAI,GAAG;AACnC,WAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,OAAO,GAAG,CAAC,GAAG,WAAW;AAAA,MACxD,OAAO,KAAK,KAAK,KAAK;AAAA,MACtB,OAAO;AAAA,MACP,KAAK,QAAQ;AAAA,IACf,EAAE;AAAA,EACJ;AAEA,SAAO,MAAM,KAAK,kBAAkB,QAAQ,IAAI,GAAG,CAAC,aAAa;AAAA,IAC/D,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,KAAK,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,EACvC,EAAE;AACJ;AAEO,SAAS,2BACd,MACA,QACyB;AACzB,MAAI,OAAO,WAAW,KAAK,CAAC,yBAAyB,IAAI,EAAG,QAAO;AAEnE,QAAM,gBAAgB,kBAAkB,QAAQ,IAAI;AACpD,SAAO,OAAO,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM;AAAA,IAClC,wBAAwB,eAAe,OAAO,KAAK,MAAM;AAAA,IACzD,qBAAqB,eAAe,KAAK,KAAK,MAAM;AAAA,EACtD,CAAC;AACH;AAEA,SAAS,2BAA2B,QAAgB,OAAuB;AACzE,QAAM,MAAM,KAAK,IAAI,OAAO,QAAQ,MAAM,MAAM;AAChD,MAAI,QAAQ;AACZ,SAAO,QAAQ,OAAO,OAAO,KAAK,MAAM,MAAM,KAAK,EAAG;AACtD,SAAO;AACT;AAEA,SAAS,2BAA2B,QAAgB,OAAe,cAA8B;AAC/F,QAAM,YAAY,KAAK,IAAI,OAAO,QAAQ,MAAM,MAAM,IAAI;AAC1D,MAAI,SAAS;AACb,SACE,SAAS,aACT,OAAO,OAAO,SAAS,IAAI,MAAM,MAAM,MAAM,MAAM,SAAS,IAAI,MAAM;AAEtE;AACF,SAAO;AACT;AAEA,SAAS,2BAA2B,QAAgB,OAAe,QAAwB;AACzF,QAAM,iBAAiB,kBAAkB,QAAQ,MAAM;AACvD,QAAM,gBAAgB,kBAAkB,QAAQ,KAAK;AACrD,MAAI,aAAa;AACjB,SAAO,aAAa,GAAG;AACrB,UAAM,iBAAiB,2BAA2B,gBAAgB,UAAU;AAC5E,UAAM,gBAAgB,2BAA2B,eAAe,UAAU;AAC1E,UAAM,aAAa,KAAK,IAAI,gBAAgB,aAAa;AACzD,QAAI,eAAe,WAAY;AAC/B,iBAAa;AAAA,EACf;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,QAAgB,OAAe,QAAwB;AACzF,QAAM,iBAAiB,kBAAkB,QAAQ,MAAM;AACvD,QAAM,gBAAgB,kBAAkB,QAAQ,KAAK;AACrD,MAAI,aAAa;AACjB,SAAO,aAAa,GAAG;AACrB,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,aAAa,MAAM,SAAS;AAClC,UAAM,aACJ,0BAA0B,gBAAgB,aAAa,OAAO,MAAM,IAAI;AAC1E,UAAM,YACJ,0BAA0B,eAAe,YAAY,MAAM,MAAM,IAAI;AACvE,UAAM,OAAO,KAAK,IAAI,YAAY,SAAS;AAC3C,QAAI,SAAS,EAAG;AAChB,iBAAa,KAAK,IAAI,GAAG,aAAa,IAAI;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,UAA4B,QAAwB;AACtF,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,UAAU,SAAS,WAAW,SAAS,CAAC;AAC9C,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,aAAa,QAAQ,QAAQ,QAAQ,QAAQ;AACnD,SAAO,eAAe,SAAS,SAAS,QAAQ;AAClD;AAEA,SAAS,0BACP,UACA,QACA,YACQ;AACR,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,WAAY,QAAO;AACjC,QAAM,UAAU,SAAS,WAAW,MAAM;AAC1C,MAAI,CAAC,WAAW,QAAQ,UAAU,OAAQ,QAAO;AACjD,SAAO,QAAQ,QAAQ,QAAQ,QAAQ;AACzC;AAEA,SAAS,wBACP,UACA,QACA,YACQ;AACR,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,WAAY,QAAO;AACjC,QAAM,UAAU,SAAS,WAAW,SAAS,CAAC;AAC9C,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,aAAa,QAAQ,QAAQ,QAAQ,QAAQ;AACnD,SAAO,eAAe,SAAS,SAAS,QAAQ;AAClD;AAEA,SAAS,qBACP,UACA,QACA,YACQ;AACR,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,WAAY,QAAO;AACjC,QAAM,UAAU,SAAS,WAAW,SAAS,CAAC;AAC9C,SAAO,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAC5D;;;AC1IA,IAAM,oCAAoC;AAInC,SAAS,wBACd,QACA,aACA,WACA,OACA,YACA,UACA,MACsB;AACtB,SACE,cAAc,aACd,aAAa,YACb,QAAQ,QAAQ,WAAW,EAAE,UAAU,QAAQ,OAAO,UAAU,EAAE,OAClE;AACA;AACA;AAAA,EACF;AAEA,SACE,cAAc,aACd,aAAa,YACb,QAAQ,QAAQ,YAAY,CAAC,EAAE,UAAU,QAAQ,OAAO,WAAW,CAAC,EAAE,OACtE;AACA;AACA;AAAA,EACF;AAEA,MAAI,gBAAgB,aAAa,eAAe,UAAU;AACxD,0BAAsB,MAAM,aAAa,WAAW,YAAY,QAAQ;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,YAAY;AACjC,QAAM,cAAc,WAAW;AAC/B,MAAI,eAAe,eAAe,mCAAmC;AACnE,iCAA6B,QAAQ,aAAa,WAAW,OAAO,YAAY,UAAU,IAAI;AAC9F,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,qBAAqB,QAAQ,aAAa,WAAW,OAAO,YAAY,QAAQ;AAChG,MAAI,QAAQ,WAAW,GAAG;AACxB,0BAAsB,MAAM,aAAa,WAAW,YAAY,QAAQ;AACxE,WAAO;AAAA,EACT;AAEA,MAAI,aAAmC;AACvC,MAAI,iBAAiB;AACrB,MAAI,gBAAgB;AACpB,aAAW,UAAU,SAAS;AAC5B,iBAAa;AAAA,MACX;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AACA,qBAAiB,OAAO,cAAc;AACtC,oBAAgB,OAAO,aAAa;AAAA,EACtC;AACA,eAAa;AAAA,IACX;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,0BAA0B,YAAY,QAAQ;AACvD;AAEA,SAAS,0BACP,GACA,GACsB;AACtB,SAAO,4BAA4B,CAAC,KAAK,4BAA4B,CAAC,IAAI,IAAI;AAChF;AAEA,IAAM,8BAA8B;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,SAAS,6BACP,QACA,aACA,WACA,OACA,YACA,UACA,MACM;AACN,QAAM,eAAe,YAAY;AACjC,QAAM,cAAc,WAAW;AAC/B,QAAM,QAAQ,mBAAmB,cAAc,aAAa,CAACE,cAAaC,gBAAe;AACvF,UAAM,cAAc,QAAQ,QAAQ,cAAcD,YAAW;AAC7D,UAAM,aAAa,QAAQ,OAAO,aAAaC,WAAU;AACzD,WAAO,YAAY,UAAU,WAAW,QACpC,wBAAwB,YAAY,KAAK,IACzC,OAAO;AAAA,EACb,CAAC;AAED,MAAI,cAAc;AAClB,MAAI,aAAa;AACjB,aAAW,CAAC,iBAAiB,cAAc,KAAK,OAAO;AACrD;AAAA,MACE;AAAA,MACA,cAAc;AAAA,MACd,cAAc;AAAA,MACd,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AACA,kBAAc,kBAAkB;AAChC,iBAAa,iBAAiB;AAAA,EAChC;AACA;AAAA,IACE;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,aAAa;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,qBACP,QACA,aACA,WACA,OACA,YACA,UACoD;AACpD,QAAM,eAAe,YAAY,QAAQ,aAAa,SAAS;AAC/D,QAAM,cAAc,YAAY,OAAO,YAAY,QAAQ;AAC3D,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,WAAS,QAAQ,YAAY,QAAQ,UAAU,SAAS;AACtD,UAAM,QAAQ,QAAQ,OAAO,KAAK,EAAE;AACpC,QAAI,aAAa,IAAI,KAAK,MAAM,KAAK,YAAY,IAAI,KAAK,MAAM;AAC9D,yBAAmB,IAAI,OAAO,KAAK;AAAA,EACvC;AACA,QAAM,aAAiE,CAAC;AACxE,WAAS,QAAQ,aAAa,QAAQ,WAAW,SAAS;AACxD,UAAM,QAAQ,QAAQ,QAAQ,KAAK,EAAE;AACrC,QAAI,aAAa,IAAI,KAAK,MAAM,KAAK,YAAY,IAAI,KAAK,MAAM,EAAG;AACnE,UAAM,aAAa,mBAAmB,IAAI,KAAK;AAC/C,QAAI,eAAe,OAAW,YAAW,KAAK,EAAE,aAAa,OAAO,WAAW,CAAC;AAAA,EAClF;AACA,SAAO,8BAA8B,UAAU;AACjD;AAEA,SAAS,8BACP,YACoD;AACpD,MAAI,WAAW,UAAU,EAAG,QAAO;AACnC,QAAM,QAAkB,CAAC;AACzB,QAAM,WAAW,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,GAAG,MAAM,EAAE;AACnE,QAAM,uBAAiC,CAAC;AAExC,WAASC,SAAQ,GAAGA,SAAQ,WAAW,QAAQA,UAAS;AACtD,UAAM,aAAa,YAAY,YAAYA,MAAK,EAAE;AAClD,QAAI,MAAM;AACV,QAAI,OAAO,MAAM;AACjB,WAAO,MAAM,MAAM;AACjB,YAAM,SAAU,MAAM,QAAS;AAC/B,UAAI,SAAS,OAAO,MAAM,IAAI,WAAY,OAAM,SAAS;AAAA,UACpD,QAAO;AAAA,IACd;AACA,QAAI,MAAM,EAAG,UAASA,MAAK,IAAI,SAAS,sBAAsB,MAAM,CAAC;AACrE,UAAM,GAAG,IAAI;AACb,yBAAqB,GAAG,IAAIA;AAAA,EAC9B;AAEA,QAAM,UAA8D,CAAC;AACrE,MAAI,QAAQ,qBAAqB,MAAM,SAAS,CAAC,KAAK;AACtD,SAAO,SAAS,GAAG;AACjB,YAAQ,KAAK,YAAY,YAAY,KAAK,CAAC;AAC3C,YAAQ,SAAS,KAAK,KAAK;AAAA,EAC7B;AACA,SAAO,QAAQ,QAAQ;AACzB;AAEA,SAAS,YAAY,QAA6B,OAAe,KAAkC;AACjG,QAAM,SAAS,oBAAI,IAAoB;AACvC,WAAS,QAAQ,OAAO,QAAQ,KAAK,SAAS;AAC5C,UAAM,QAAQ,QAAQ,QAAQ,KAAK,EAAE;AACrC,WAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,sBACP,MACA,aACA,WACA,YACA,UACM;AACN,MAAI,gBAAgB,aAAa,eAAe,SAAU;AAC1D,OAAK,KAAK;AAAA,IACR,SAAS,EAAE,OAAO,aAAa,KAAK,UAAU;AAAA,IAC9C,OAAO,EAAE,OAAO,YAAY,KAAK,SAAS;AAAA,EAC5C,CAAC;AACH;AAEA,SAAS,QAAQ,QAA6B,OAAkC;AAC9E,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,UAAU,OAAW,OAAM,IAAI,WAAW,+BAA+B,KAAK,EAAE;AACpF,SAAO;AACT;AAEA,SAAS,YACP,YACA,OAC6C;AAC7C,QAAM,YAAY,WAAW,KAAK;AAClC,MAAI,cAAc,OAAW,OAAM,IAAI,WAAW,4BAA4B,KAAK,EAAE;AACrF,SAAO;AACT;AAEA,SAAS,SAAS,QAAkB,OAAuB;AACzD,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,UAAU,OAAW,OAAM,IAAI,WAAW,yBAAyB,KAAK,EAAE;AAC9E,SAAO;AACT;;;AChOA,IAAM,mCAAmC;AACzC,IAAM,6BAA6B;AACnC,IAAM,iCAAiC;AACvC,IAAM,0CAA0C;AASzC,SAAS,uBACd,aACA,YAC8B;AAC9B,MAAI,YAAY,UAAU,WAAW,MAAO,QAAO;AACnD,QAAM,SAAS,mBAAmB,YAAY,OAAO,WAAW,KAAK;AACrE,QAAM,SAAS,mBAAmB,YAAY,OAAO,WAAW,OAAO,MAAM;AAC7E,MAAI,CAAC,sBAAsB,YAAY,OAAO,WAAW,OAAO,QAAQ,MAAM,EAAG,QAAO;AACxF,QAAM,UAAU,kCAAkC,aAAa,YAAY,QAAQ,MAAM;AACzF,MAAI,QAAS,QAAO;AAEpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,MAAM,SAAS;AAAA,IAC3B;AAAA,IACA,WAAW,MAAM,SAAS;AAAA,EAC5B;AACF;AAEA,SAAS,kCACP,aACA,YACA,QACA,QAC8B;AAC9B,QAAM,cAAc,YAAY;AAChC,QAAM,aAAa,WAAW;AAC9B,MAAI,CAAC,kBAAkB,WAAW,KAAK,CAAC,kBAAkB,UAAU,EAAG,QAAO;AAC9E,MAAI,YAAY,SAAS,WAAW,SAAS,iCAAkC,QAAO;AACtF,MAAI,CAAC,+BAA+B,aAAa,YAAY,QAAQ,MAAM,EAAG,QAAO;AAErF,QAAM,iBAAiB,qBAAqB,WAAW;AACvD,QAAM,gBAAgB,qBAAqB,UAAU;AACrD,MACE,eAAe,SAAS,8BACxB,cAAc,SAAS,8BACvB,eAAe,SAAS,cAAc,SAAS;AAE/C,WAAO;AAET,QAAM,QAAQ;AAAA,IAAmB,eAAe;AAAA,IAAQ,cAAc;AAAA,IAAQ,CAAC,QAAQ,UACrF,UAAU,gBAAgB,MAAM,EAAE,UAAU,UAAU,eAAe,KAAK,EAAE,QACxE,IACA,OAAO;AAAA,EACb;AACA,QAAM,OAAO,eAAe,KAAK;AACjC,QAAM,WAAW,KAAK;AAAA,IACpB,CAAC,QACC,cAAc,KAAK,eAAe,QAAQ,cAAc,MAAM,KAC9D,IAAI,YAAY,IAAI,eAAe;AAAA,EACvC;AACA,QAAM,mBAAmB,SAAS;AAAA,IAChC,CAAC,QAAQ,CAAC,cAAc,KAAK,eAAe,QAAQ,cAAc,MAAM;AAAA,EAC1E,EAAE;AACF,MAAI,qBAAqB,KAAK,mBAAmB,+BAAgC,QAAO;AAExF,QAAM,UAAuB,CAAC;AAC9B,QAAM,QAAqB,CAAC;AAC5B,MAAI,cAAc;AAClB,MAAI,aAAa;AACjB,aAAW,OAAO,UAAU;AAC1B,yBAAqB,SAAS,aAAa,gBAAgB,aAAa,IAAI,WAAW;AACvF,yBAAqB,OAAO,YAAY,eAAe,YAAY,IAAI,UAAU;AACjF,kBAAc,IAAI;AAClB,iBAAa,IAAI;AAAA,EACnB;AACA,uBAAqB,SAAS,aAAa,gBAAgB,aAAa,eAAe,MAAM;AAC7F,uBAAqB,OAAO,YAAY,eAAe,YAAY,cAAc,MAAM;AAEvF,SAAO,QAAQ,SAAS,KAAK,MAAM,SAAS,IAAI,EAAE,SAAS,MAAM,IAAI;AACvE;AAEA,SAAS,mBACP,aACA,YACA,aACA,WACA,YACA,UAC8B;AAC9B,QAAM,UACJ,cAAc,YACV,CAAC,CAAC,YAAY,QAAQ,aAAa,YAAY,QAAQ,SAAS,CAAC,IACjE,CAAC;AACP,QAAM,QACJ,aAAa,WAAW,CAAC,CAAC,WAAW,QAAQ,YAAY,WAAW,QAAQ,QAAQ,CAAC,IAAI,CAAC;AAC5F,SAAO,QAAQ,SAAS,KAAK,MAAM,SAAS,IAAI,EAAE,SAAS,MAAM,IAAI;AACvE;AAEA,SAAS,+BACP,QACA,OACA,QACA,QACS;AACT,QAAM,eAAe,OAAO,MAAM,QAAQ,OAAO,SAAS,MAAM;AAChE,QAAM,cAAc,MAAM,MAAM,QAAQ,MAAM,SAAS,MAAM;AAC7D,QAAM,CAAC,SAAS,MAAM,IACpB,aAAa,UAAU,YAAY,SAC/B,CAAC,cAAc,WAAW,IAC1B,CAAC,aAAa,YAAY;AAChC,MAAI,QAAQ,SAAS,wCAAyC,QAAO;AAErE,WAAS,QAAQ,GAAG,SAAS,QAAQ,SAAS,yCAAyC,SAAS;AAC9F,UAAM,YAAY,QAAQ,MAAM,OAAO,QAAQ,uCAAuC;AACtF,QAAI,OAAO,SAAS,SAAS,EAAG,QAAO;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAiD;AACvE,QAAM,OAAwB,CAAC;AAC/B,aAAW,CAAC,aAAa,UAAU,KAAK,OAAO;AAC7C,UAAM,WAAW,KAAK,GAAG,EAAE;AAC3B,QAAI,UAAU,cAAc,eAAe,SAAS,aAAa,YAAY;AAC3E,eAAS;AACT,eAAS;AAAA,IACX,OAAO;AACL,WAAK,KAAK;AAAA,QACR,aAAa;AAAA,QACb,WAAW,cAAc;AAAA,QACzB,YAAY;AAAA,QACZ,UAAU,aAAa;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAAoB,cAAsB,aAA8B;AAC7F,SACG,IAAI,gBAAgB,KAAK,IAAI,eAAe,KAC5C,IAAI,cAAc,gBAAgB,IAAI,aAAa;AAExD;AAEA,SAAS,qBACP,QACA,OACA,UACA,OACA,KACM;AACN,MAAI,SAAS,IAAK;AAClB,SAAO,KAAK;AAAA,IACV,MAAM,QAAQ,kBAAkB,UAAU,OAAO,MAAM,MAAM,MAAM;AAAA,IACnE,MAAM,QAAQ,kBAAkB,UAAU,KAAK,MAAM,MAAM,MAAM;AAAA,EACnE,CAAC;AACH;AAEA,SAAS,kBACP,UACA,OACA,YACQ;AACR,SAAO,UAAU,SAAS,SAAS,aAAa,UAAU,UAAU,KAAK,EAAE;AAC7E;AAEA,SAAS,UAAU,UAAiC,OAAoC;AACtF,QAAM,UAAU,SAAS,KAAK;AAC9B,MAAI,YAAY,OAAW,OAAM,IAAI,WAAW,wBAAwB,KAAK,EAAE;AAC/E,SAAO;AACT;AAEA,SAAS,sBACP,QACA,OACA,QACA,QACS;AACT,QAAM,mBAAmB,SAAS;AAClC,MAAI,qBAAqB,EAAG,QAAO;AACnC,MAAI,kBAAkB,MAAM,KAAK,kBAAkB,KAAK,GAAG;AACzD,QACE,mBAAmB,KACnB,CAAC,yBAAyB,MAAM,KAChC,CAAC,yBAAyB,KAAK;AAE/B,aAAO;AACT,QAAI,WAAW,KAAK,SAAS,GAAG;AAC9B,YAAM,sBAAsB,OAAO,SAAS;AAC5C,YAAM,qBAAqB,MAAM,SAAS;AAC1C,UACE,wBAAwB,sBACxB,KAAK,IAAI,qBAAqB,kBAAkB,IAAI;AAEpD,eAAO;AAAA,IACX;AACA,WAAO;AAAA,EACT;AACA,MAAI,cAAc,MAAM,KAAK,cAAc,KAAK,EAAG,QAAO;AAC1D,MAAI,0BAA0B,MAAM,KAAK,0BAA0B,KAAK,EAAG,QAAO;AAClF,SAAO;AACT;;;ACrMA,IAAM,iCAAiC;AACvC,IAAM,yCAAyC;AAExC,SAAS,8BACd,YACA,cACA,WACA,aACA,MACkB;AAClB,QAAM,SAAS,0BAA0B,cAAc,aAAa,IAAI;AACxE,SAAO;AAAA,IACL,SAAS,YAAY,2BAA2B,YAAY,OAAO,OAAO,CAAC;AAAA,IAC3E,OAAO,YAAY,2BAA2B,WAAW,OAAO,KAAK,CAAC;AAAA,EACxE;AACF;AAEA,SAAS,0BACP,cACA,aACA,MACkB;AAClB,QAAM,UAAuB,CAAC;AAC9B,QAAM,QAAqB,CAAC;AAE5B,aAAW,OAAO,MAAM;AACtB,UAAM,eAAe,mBAAmB,IAAI,OAAO;AACnD,UAAM,aAAa,mBAAmB,IAAI,KAAK;AAC/C,UAAM,UACJ,gBAAgB,aACZ,+BAA+B,cAAc,cAAc,aAAa,UAAU,IAClF;AACN,QAAI,SAAS;AACX,cAAQ,KAAK,GAAG,QAAQ,OAAO;AAC/B,YAAM,KAAK,GAAG,QAAQ,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,aAAc,SAAQ,KAAK,GAAG,oBAAoB,cAAc,YAAY,CAAC;AACjF,QAAI,WAAY,OAAM,KAAK,GAAG,oBAAoB,aAAa,UAAU,CAAC;AAAA,EAC5E;AAEA,SAAO,EAAE,SAAS,YAAY,OAAO,GAAG,OAAO,YAAY,KAAK,EAAE;AACpE;AAEA,SAAS,mBAAmB,OAA2C;AACrE,SAAO,MAAM,QAAQ,MAAM,MAAM,QAAQ;AAC3C;AAEA,SAAS,+BACP,cACA,aACA,aACA,YAC8B;AAC9B,SACE,yBAAyB,cAAc,aAAa,aAAa,UAAU,KAC3E,4BAA4B,cAAc,aAAa,aAAa,UAAU;AAElF;AAEA,SAAS,yBACP,cACA,aACA,aACA,YAC8B;AAC9B,MAAI,YAAY,MAAM,YAAY,UAAU,KAAK,WAAW,MAAM,WAAW,UAAU;AACrF,WAAO;AACT,SAAO;AAAA,IACLC,SAAQ,cAAc,YAAY,KAAK;AAAA,IACvCA,SAAQ,aAAa,WAAW,KAAK;AAAA,EACvC;AACF;AAEA,SAAS,uBACP,aACA,YAC8B;AAC9B,QAAM,mBAAmB,6BAA6B,aAAa,UAAU;AAC7E,QAAM,aAAa,uBAAuB,aAAa,UAAU;AACjE,MAAI,oBAAoB,0BAA0B,kBAAkB,aAAa,UAAU,GAAG;AAC5F,QAAI,iDAAiD,aAAa,YAAY,UAAU;AACtF,aAAO;AACT,QACE,eACC,WAAW,QAAQ,WAAW,KAAK,WAAW,MAAM,WAAW,MAChE,sBAAsB,UAAU,IAAI,sBAAsB,gBAAgB;AAE1E,aAAO;AACT,WAAO;AAAA,EACT;AACA,SAAO,cAAc;AACvB;AAEA,SAAS,sBAAsB,QAAkC;AAC/D,MAAI,QAAQ;AACZ,aAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAS,UAAS,MAAM;AAC1D,aAAW,CAAC,OAAO,GAAG,KAAK,OAAO,MAAO,UAAS,MAAM;AACxD,SAAO;AACT;AAEA,SAAS,iDACP,aACA,YACA,YACS;AACT,MAAI,WAAY,QAAO;AACvB,MAAI,CAAC,kBAAkB,YAAY,KAAK,KAAK,CAAC,kBAAkB,WAAW,KAAK,EAAG,QAAO;AAC1F,QAAM,kBAAkB,qBAAqB,YAAY,OAAO,CAAC,EAAE;AAAA,IAAO,CAAC,SACzE,2BAA2B,KAAK,KAAK;AAAA,EACvC,EAAE;AACF,QAAM,iBAAiB,qBAAqB,WAAW,OAAO,CAAC,EAAE;AAAA,IAAO,CAAC,SACvE,2BAA2B,KAAK,KAAK;AAAA,EACvC,EAAE;AACF,SAAO,KAAK,IAAI,iBAAiB,cAAc,MAAM,KAAK,oBAAoB;AAChF;AAEA,SAAS,4BACP,cACA,aACA,aACA,YAC8B;AAC9B,QAAM,SAAS,aAAa,MAAM,YAAY,OAAO,YAAY,GAAG;AACpE,QAAM,QAAQ,YAAY,MAAM,WAAW,OAAO,WAAW,GAAG;AAChE,MAAI,OAAO,SAAS,MAAM,SAAS,+BAAgC,QAAO;AAC1E,QAAM,QAAQ,sBAAsB,QAAQ,KAAK;AACjD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,UAAuB,CAAC;AAC9B,QAAM,QAAqB,CAAC;AAE5B,aAAW,CAAC,aAAa,UAAU,KAAK,OAAO;AAC7C,iBAAa,IAAI,WAAW;AAC5B,gBAAY,IAAI,UAAU;AAC1B,UAAM,cAAcA,SAAQ,QAAQ,WAAW;AAC/C,UAAM,aAAaA,SAAQ,OAAO,UAAU;AAC5C,QAAI,YAAY,UAAU,WAAW,MAAO;AAC5C,UAAM,UAAU,uBAAuB,aAAa,UAAU;AAC9D,QAAI,SAAS;AACX,cAAQ,KAAK,GAAG,QAAQ,OAAO;AAC/B,YAAM,KAAK,GAAG,QAAQ,KAAK;AAAA,IAC7B,OAAO;AACL,qBAAe,SAAS,WAAW;AACnC,qBAAe,OAAO,UAAU;AAAA,IAClC;AAAA,EACF;AAEA,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS;AAClD,QAAI,CAAC,aAAa,IAAI,KAAK,EAAG,gBAAe,SAASA,SAAQ,QAAQ,KAAK,CAAC;AAAA,EAC9E;AACA,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,QAAI,CAAC,YAAY,IAAI,KAAK,EAAG,gBAAe,OAAOA,SAAQ,OAAO,KAAK,CAAC;AAAA,EAC1E;AAEA,QAAM,SAAS,EAAE,SAAS,mBAAmB,OAAO,GAAG,OAAO,mBAAmB,KAAK,EAAE;AACxF,SAAO,OAAO,QAAQ,SAAS,KAAK,OAAO,MAAM,SAAS,IAAI,SAAS;AACzE;AAEA,SAAS,sBACP,QACA,OACyB;AACzB,SAAO,mBAAmB,OAAO,QAAQ,MAAM,QAAQ,CAAC,aAAa,eAAe;AAClF,UAAM,eAAe;AAAA,MACnBA,SAAQ,QAAQ,WAAW;AAAA,MAC3BA,SAAQ,OAAO,UAAU;AAAA,IAC3B;AACA,WAAO,eAAe,IAAI,eAAe,OAAO;AAAA,EAClD,CAAC;AACH;AAEA,SAAS,4BACP,aACA,YACQ;AACR,MAAI,YAAY,UAAU,WAAW,MAAO,QAAO,wBAAwB,YAAY,KAAK;AAC5F,QAAM,aAAa,oBAAoB,YAAY,OAAO,WAAW,KAAK;AAC1E,SAAO,cAAc,yCACjB,KAAK;AAAA,IACH,wBAAwB,YAAY,KAAK;AAAA,IACzC,wBAAwB,WAAW,KAAK;AAAA,EAC1C,IAAI,aACJ;AACN;AAEA,SAAS,oBAAoB,QAAgB,OAAuB;AAClE,MAAI,kBAAkB,MAAM,KAAK,kBAAkB,KAAK;AACtD,WAAO,0BAA0B,QAAQ,KAAK;AAChD,MAAI,cAAc,MAAM,KAAK,cAAc,KAAK,EAAG,QAAO,mBAAmB,QAAQ,KAAK;AAC1F,MAAI,0BAA0B,MAAM,KAAK,0BAA0B,KAAK;AACtE,WAAO,mBAAmB,QAAQ,KAAK;AACzC,SAAO;AACT;AAEA,SAAS,0BAA0B,QAAgB,OAAuB;AACxE,QAAM,cAAc,qBAAqB,QAAQ,CAAC,EAC/C,IAAI,CAAC,SAAS,KAAK,MAAM,YAAY,CAAC,EACtC,OAAO,0BAA0B;AACpC,QAAM,aAAa,qBAAqB,OAAO,CAAC,EAC7C,IAAI,CAAC,SAAS,KAAK,MAAM,YAAY,CAAC,EACtC,OAAO,0BAA0B;AACpC,QAAM,iBAAiB,oBAAoB,aAAa,UAAU;AAClE,SAAO,KAAK,IAAI,gBAAgB,mBAAmB,QAAQ,KAAK,CAAC;AACnE;AAEA,SAAS,oBAAoB,QAAkB,OAAyB;AACtE,MAAI,OAAO,WAAW,KAAK,MAAM,WAAW,EAAG,QAAO;AACtD,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,SAAS,OAAQ,WAAU,IAAI,QAAQ,UAAU,IAAI,KAAK,KAAK,KAAK,CAAC;AAChF,MAAI,SAAS;AACb,aAAW,SAAS,OAAO;AACzB,UAAM,QAAQ,UAAU,IAAI,KAAK,KAAK;AACtC,QAAI,UAAU,EAAG;AACjB;AACA,QAAI,UAAU,EAAG,WAAU,OAAO,KAAK;AAAA,QAClC,WAAU,IAAI,OAAO,QAAQ,CAAC;AAAA,EACrC;AACA,SAAQ,IAAI,UAAW,OAAO,SAAS,MAAM;AAC/C;AAEA,SAAS,mBAAmB,QAAgB,OAAuB;AACjE,QAAM,SAAS,mBAAmB,QAAQ,KAAK;AAC/C,QAAM,SAAS,mBAAmB,QAAQ,OAAO,MAAM;AACvD,SAAQ,KAAK,SAAS,WAAY,OAAO,SAAS,MAAM;AAC1D;AAEA,SAAS,6BACP,aACA,YAC8B;AAC9B,MAAI,CAAC,kBAAkB,YAAY,KAAK,KAAK,CAAC,kBAAkB,WAAW,KAAK;AAC9E,WAAO;AACT,QAAM,cAAc,qBAAqB,YAAY,OAAO,YAAY,KAAK;AAC7E,QAAM,aAAa,qBAAqB,WAAW,OAAO,WAAW,KAAK;AAC1E,MAAI,YAAY,UAAU,KAAK,WAAW,UAAU,EAAG,QAAO;AAE9D,QAAM,OAA0B,CAAC;AACjC;AAAA,IACE;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,EACF;AACA,QAAM,SAAS,0BAA0B,aAAa,YAAY,IAAI;AACtE,SAAO,oBAAoB,MAAM,IAAI,SAAS;AAChD;AAEA,SAAS,0BACP,QACA,aACA,YACS;AACT,SACE,OAAO,QAAQ,KAAK,CAAC,UAAU,MAAM,CAAC,IAAI,YAAY,SAAS,MAAM,CAAC,IAAI,YAAY,GAAG,KACzF,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,CAAC,IAAI,WAAW,SAAS,MAAM,CAAC,IAAI,WAAW,GAAG,KACrF,OAAO,QAAQ,WAAW,KAC1B,OAAO,MAAM,WAAW;AAE5B;AAEA,SAAS,oBAAoB,QAAmC;AAC9D,SAAO,OAAO,QAAQ,SAAS,KAAK,OAAO,MAAM,SAAS;AAC5D;AAEA,SAASA,SAAQ,QAA6B,OAAkC;AAC9E,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,UAAU,OAAW,OAAM,IAAI,WAAW,+BAA+B,KAAK,EAAE;AACpF,SAAO;AACT;;;ACpSO,SAAS,4BACd,QACA,OACA,QACkB;AAClB,QAAM,mBAAmB,OAAO,QAAQ,KAAK,CAAC,UAAU,oBAAoB,QAAQ,KAAK,CAAC;AAC1F,QAAM,iBAAiB,OAAO,MAAM,KAAK,CAAC,UAAU,oBAAoB,OAAO,KAAK,CAAC;AACrF,SAAO;AAAA,IACL,SAAS,OAAO,QAAQ;AAAA,MAAO,CAAC,UAC9B,qBAAqB,OAAO,MAAM,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,cAAc;AAAA,IACvE;AAAA,IACA,OAAO,OAAO,MAAM;AAAA,MAAO,CAAC,UAC1B,qBAAqB,MAAM,MAAM,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,gBAAgB;AAAA,IACxE;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,SAAiB,OAAkC;AAC9E,QAAM,SAAS,gBAAgB,QAAQ,MAAM,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAChE,SAAO,OAAO,KAAK,kBAAkB;AACvC;AAEA,SAAS,qBAAqB,MAAc,uBAAyC;AACnF,QAAM,SAAS,gBAAgB,IAAI;AACnC,QAAM,eAAe,OAAO,OAAO,kBAAkB;AACrD,MAAI,aAAa,WAAW,EAAG,QAAO;AACtC,QAAM,aAAa,aAAa;AAAA,IAC9B,CAAC,UAAU,kBAAkB,KAAK,KAAK,cAAc,KAAK;AAAA,EAC5D;AACA,QAAM,qBAAqB,aAAa;AAAA,IACtC,CAAC,UAAU,0BAA0B,KAAK,KAAK,cAAc,KAAK;AAAA,EACpE;AACA,MACE,CAAC,yBACD,CAAC,sBACD,WAAW,MAAM,CAAC,UAAU,yBAAyB,IAAI,KAAK,CAAC;AAE/D,WAAO;AACT,MAAI,CAAC,yBAAyB,CAAC,sBAAsB,mBAAmB,MAAM,UAAU;AACtF,WAAO;AACT,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAwB;AAClD,SACE,kBAAkB,KAAK,KACvB,cAAc,KAAK,KACnB,0BAA0B,KAAK,KAC/B,cAAc,KAAK;AAEvB;AAEA,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,sBAAsB,oBAAI,IAAI,CAAC,UAAU,WAAW,WAAW,OAAO,QAAQ,CAAC;AAErF,SAAS,mBAAmB,MAAc,QAA2B;AACnE,SACE,OAAO,WAAW,KAClB,OAAO,CAAC,MAAM,UACd,oBAAoB,IAAI,OAAO,CAAC,CAAC,KACjC,oEAAoE,KAAK,IAAI;AAEjF;;;AC1EO,SAAS,2BACd,QACA,gBACS;AACT,MAAI,OAAO,QAAQ,WAAW,KAAK,OAAO,MAAM,WAAW,EAAG,QAAO;AACrE,MAAI,mBAAmB,MAAO,QAAO;AACrC,MAAI,OAAO,eAAe,SAAS,mBAAmB,OAAQ,QAAO;AACrE,SAAO;AACT;AAyBO,SAAS,qCACd,QACA,OACA,cACA,aACA,cAC2B;AAC3B,MAAI,iBAAiB,MAAO,QAAO,sBAAsB;AAEzD,QAAM,OAA0B,CAAC;AACjC,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EACF;AACA,QAAM,SAAS,8BAA8B,QAAQ,cAAc,OAAO,aAAa,IAAI;AAC3F,QAAM,aAAmCC,qBAAoB,MAAM,IAC/D,sBACA;AACJ,MAAI,iBAAiB,QAAS,QAAO,EAAE,GAAG,QAAQ,WAAW;AAE7D,QAAM,WAAW,4BAA4B,QAAQ,OAAO,MAAM;AAClE,SAAO,EAAE,GAAG,UAAU,YAAYA,qBAAoB,QAAQ,IAAI,aAAa,MAAM;AACvF;AAMA,SAASC,qBAAoB,QAAmC;AAC9D,SAAO,OAAO,QAAQ,SAAS,KAAK,OAAO,MAAM,SAAS;AAC5D;AAEA,SAAS,wBAAmD;AAC1D,SAAO,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,YAAY,MAAM;AACrD;;;ACnDO,SAAS,wBACd,OACA,cAC0B;AAC1B,QAAM,UAAsD,CAAC;AAC7D,QAAM,QAAkD,CAAC;AACzD,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,SAAS,OAAW;AACxB,QAAI,kBAAkB,IAAI,EAAG,SAAQ,KAAK,mBAAmB,OAAO,IAAI,CAAC;AAAA,aAChE,gBAAgB,IAAI,EAAG,OAAM,KAAK,mBAAmB,OAAO,IAAI,CAAC;AAAA,EAC5E;AACA,QAAM,iBAAiB,IAAI,IAAI,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;AACxE,QAAM,eAAe,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;AACpE,QAAM,QAAQ,kBAAkB,SAAS,KAAK;AAC9C,QAAM,SAAiC,CAAC;AAExC,aAAW,QAAQ,OAAO;AACxB,UAAM,cAAc,eAAe,IAAI,KAAK,YAAY;AACxD,UAAM,YAAY,aAAa,IAAI,KAAK,UAAU;AAClD,QAAI,CAAC,eAAe,CAAC,UAAW;AAChC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,QACN,yBAAyB,WAAW;AAAA,QACpC,yBAAyB,SAAS;AAAA,QAClC,kBAAkB,WAAW;AAAA,QAC7B,kBAAkB,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,SAAS,OAAO,OAAO,OAAO;AACzC;;;AC5DO,IAAM,sBAAsB,CACjC,OACA,iBAC6E;AAC7E,QAAM,WAAW,oBAAI,IAGnB;AACF,MAAI,iBAAiB,MAAO,QAAO;AAEnC,aAAW,EAAE,MAAM,OAAO,KAAK,wBAAwB,OAAO,YAAY,EAAE,QAAQ;AAClF,QAAI,CAAC,2BAA2B,QAAQ,KAAK,UAAU,EAAG;AAC1D,aAAS,IAAI,KAAK,cAAc,EAAE,QAAQ,OAAO,SAAS,MAAM,SAAS,CAAC;AAC1E,aAAS,IAAI,KAAK,YAAY,EAAE,QAAQ,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,EACrE;AACA,SAAO;AACT;;;AnBuCA,IAAM,aAAa,oBAAI,IAAI,CAAC,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,IAAI,CAAC;AAE3E,IAAM,kBAAkB,CAAC,UAC9B,MAAM,SAAS,UACf,WAAW,IAAI,MAAM,IAAI,MACxB,MAAM,aAAa,SAAS,MAAM,QAAQ,OAAO,MAAM,IAAI;AAE9D,IAAM,qBAAqB,CAAC,MAAc,aAA6B;AACrE,QAAM,SAAS,OAAO,SAAS,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE;AAC1D,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAC1D;AAEA,IAAM,oBAAoB,mBAAmB,kCAAkC,GAAO;AACtF,IAAMC,uBAAsB,mBAAmB,oCAAoC,GAAM;AACzF,IAAM,mCAAmC;AAAA,EACvC;AAAA,EACA;AACF;AAEA,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAC9D,QACD;AAEN,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,WAAW,QAAQ;AAEtC,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AAEhE,IAAM,YAAY,CAAC,OAA0B,QAC3C,SAAS,MAAM,OAAO,GAAG,CAAC;AAE5B,IAAMC,sBAAqB,CAAC,SAC1B,KACG,QAAQ,SAAS,QAAG,EACpB,QAAQ,OAAO,QAAG,EAClB,QAAQ,0CAA0C,QAAG;AAE1D,IAAM,aAAa,CAAC,SAAyB,KAAK,QAAQ,OAAO,MAAM;AAEvE,IAAM,cAAc,CAAC,UAA0B;AAC7C,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC;AACpF,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C;AAEA,IAAM,aAAa,CAAC,OAAe,aACjC,GAAG,KAAK,IAAI,UAAU,IAAI,WAAW,GAAG,QAAQ,GAAG;AAErD,IAAM,WAAW,CAAC,OAAc,WAA8C;AAC5E,QAAM,UAAU,OAAO,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC;AACxE,SAAO,QAAQ,SAAS,IAAI,MAAM,GAAG,OAAO,SAAM,QAAQ,KAAK,QAAK,CAAC,EAAE,IAAI;AAC7E;AAEA,IAAM,oBAAoB,CAAC,UAAkB,QAAwB;AACnE,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,WAAW,QAAQ,GAAG;AACxB,UAAM,UAAU,SAAS,KAAK,QAAQ;AACtC,QAAI,WAAW,YAAY,QAAQ,CAAC,QAAQ,WAAW,KAAK,KAAK,CAAC,WAAW,OAAO,GAAG;AACrF,aAAO;AAAA,IACT;AACA,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,WAAW,SAAS,QAAQ,GAAG,QAAQ;AAC7C,QAAI,YAAY,aAAa,QAAQ,CAAC,SAAS,WAAW,KAAK,KAAK,CAAC,WAAW,QAAQ,GAAG;AACzF,aAAO,KAAK,QAAQ;AAAA,IACtB;AACA,QAAI,CAAC,SAAU,QAAO;AAAA,EACxB;AACA,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,UAAkB,KAAa,OAAc,WAAW,UAC1E,MAAM,GAAG,UAAUA,oBAAmB,kBAAkB,UAAU,GAAG,KAAK,QAAQ,CAAC;AAErF,IAAM,mBAAmB,CAAC,UAAsC;AAC9D,QAAM,UAAU,SAAS,MAAM,OAAO;AACtC,SAAO,WAAW,YAAY,UAAU,QAAQ,SAAS,MAAM;AACjE;AAEA,IAAM,gBAAgB,CAAC,UAAuC;AAC5D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,QAAM,OAAO,MACV,QAAQ,CAAC,SAAS;AACjB,UAAM,SAAS,SAAS,IAAI;AAC5B,WAAO,QAAQ,SAAS,UAAU,OAAO,OAAO,SAAS,WACrD,CAAC,OAAO,IAAI,IACZ,CAAC;AAAA,EACP,CAAC,EACA,KAAK,IAAI;AACZ,SAAO,QAAQ;AACjB;AAEA,IAAM,eAAe,CAAC,UAAiD;AACrE,QAAM,SAAS,iBAAiB,KAAK;AACrC,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,QAAM,SAAS,SAAS,MAAM;AAC9B,SAAO,SAAS,QAAQ,MAAM,KACzB,SAAS,QAAQ,IAAI,KACrB,cAAc,QAAQ,OAAO;AACpC;AAEA,IAAM,gBAAgB,CAAC,UAAkE;AACvF,QAAM,UAAU,SAAS,MAAM,OAAO;AACtC,QAAM,iBAAiB,SAAS,SAAS,OAAO;AAChD,MAAI,eAAgB,QAAO;AAC3B,SAAO,SAAS,SAAS,iBAAiB,KAAK,CAAC,GAAG,OAAO;AAC5D;AAEA,IAAM,kBAAkB,CAAC,UAAsC;AAC7D,QAAM,aAAa,SAAS,cAAc,KAAK,GAAG,UAAU;AAC5D,SAAO,YAAY,cAAc,QAAQ,MAAM,oBAAoB;AACrE;AAEA,IAAM,2BACJ;AAEF,IAAM,8BAA8B,CAAC,SAAuD;AAC1F,QAAM,QAAQ,qCAAqC,KAAK,IAAI;AAC5D,QAAM,SAAS,QAAQ,CAAC;AACxB,MAAI,CAAC,SAAS,CAAC,UAAU,CAAC,yBAAyB,KAAK,MAAM,EAAG,QAAO,EAAE,SAAS,KAAK;AACxF,SAAO,EAAE,SAAS,MAAM,CAAC,KAAK,IAAI,QAAQ,OAAO,MAAM,GAAG,EAAE,EAAE;AAChE;AAEA,IAAM,YAAY,CAAC,OAA0B,YAA2C;AACtF,MAAI,QAAQ,SAAU,QAAO,QAAQ;AACrC,QAAM,cAAc,MAAM;AACxB,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,QAAQ,SAAS;AAAA,MAC1B,KAAK;AACH,eAAO,QAAQ,SAAS;AAAA,MAC1B,KAAK;AACH,eAAO,QAAQ,SAAS,uBAAuB,QAC3C,QAAQ,WACR,QAAQ,SAAS;AAAA,MACvB,KAAK;AACH,eAAO,QAAQ,SAAS;AAAA,MAC1B,KAAK;AAAA,MACL,KAAK;AACH,eAAO,QAAQ,SAAS;AAAA,MAC1B,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,QAAQ;AAAA,IACnB;AAAA,EACF,GAAG;AACH,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,QAAQ,QAAQ,CAAC;AAC3D;AAEA,IAAM,iBAAiB,CAAI,OAAY,UAAkE;AACvG,MAAI,SAAS,KAAK,MAAM,UAAU,OAAO;AACvC,WAAO,EAAE,SAAS,MAAM,IAAI,CAAC,MAAM,WAAW,EAAE,MAAM,QAAQ,MAAM,MAAM,EAAE,GAAG,QAAQ,EAAE;AAAA,EAC3F;AACA,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,MACL,SAAS,MAAM,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,MAAM,WAAW,EAAE,MAAM,QAAQ,MAAM,MAAM,EAAE;AAAA,MACnF,QAAQ,MAAM,SAAS;AAAA,IACzB;AAAA,EACF;AACA,QAAM,OAAO,KAAK,KAAK,QAAQ,IAAI;AACnC,QAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,OAAO,CAAC;AACzC,QAAM,SAAS,MAAM,SAAS,OAAO;AACrC,SAAO;AAAA,IACL,SAAS;AAAA,MACP,GAAG,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,WAAW,EAAE,MAAM,QAAiB,MAAM,MAAM,EAAE;AAAA,MACrF,EAAE,MAAM,UAAmB,OAAO;AAAA,MAClC,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,YAAY;AAAA,QAC3C,MAAM;AAAA,QACN;AAAA,QACA,OAAO,MAAM,SAAS,OAAO;AAAA,MAC/B,EAAE;AAAA,IACJ;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,iBAAiB,CAAC,WAA6B;AACnD,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,SAAS,OAAO,UAAU,oBAC5B,SACA,GAAG,OAAO,MAAM,GAAG,oBAAoB,CAAC,CAAC;AAAA,EAAK,OAAO,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACtF,QAAM,WAAoC;AAAA,IACxC,CAAC,eAAe,oCAAoC;AAAA,IACpD,CAAC,kBAAkB,kDAAkD;AAAA,IACrE;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,+CAA+C;AAAA,IAChE,CAAC,OAAO,mEAAmE;AAAA,EAC7E;AACA,SAAO,SAAS,OAAO,CAAC,CAAC,EAAE,OAAO,MAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,KAAK;AACtF;AAEA,IAAM,cAAc,CAAC,QAAgB,SAAgC,UAAqC;AACxG,MAAI,CAAC,QAAQ,SAAS,eAAgB,QAAO;AAC7C,QAAM,WAAW,eAAe,MAAM;AACtC,SAAO,SAAS,SAAS,IACrB,MAAM,GAAG,WAAW,kBAAa,WAAW,SAAS,QAAQ,SAAS,CAAC,cAAc,SAAS,KAAK,IAAI,CAAC,EAAE,IAC1G;AACN;AAEA,IAAM,kBAAkB,CAAC,UAAkB,YAAyC;AAClF,QAAM,WAAW,iBAAiB,QAAQ;AAC1C,MAAI,SAAU,QAAO;AACrB,QAAM,YAAY,SAAS,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK;AACnD,MAAI,WAAW,WAAW,IAAI,GAAG;AAC/B,UAAM,QAAQ,UACX,QAAQ,UAAU,EAAE,EACpB,MAAM,KAAK,EACX,OAAO,OAAO;AACjB,UAAM,WAAW,MAAM,UAAU,CAAC,SAAS,KAAK,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK;AAC3E,UAAM,UAAU,YAAY,IACxB,MAAM,MAAM,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,WAAW,GAAG,CAAC,IAC9D,MAAM,CAAC;AACX,UAAM,aAAa,SAAS,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,EAAE,QAAQ,kBAAkB,EAAE;AACzF,UAAM,UAAkC;AAAA,MACtC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AACA,UAAM,WAAW,aAAa,QAAQ,UAAU,IAAI;AACpD,QAAI,YAAY,YAAYC,kBAAkB,QAAO;AAAA,EACvD;AACA,MAAI,CAAC,WAAW,QAAQ,SAAS,iCAAkC,QAAO;AAC1E,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACtD,QAAI;AACF,WAAK,MAAM,OAAO;AAClB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,kCAAkC,KAAK,OAAO,EAAG,QAAO;AAC5D,MAAI,aAAa,KAAK,OAAO,EAAG,QAAO;AACvC,SAAO;AACT;AAEA,IAAM,yBACJ;AAEF,IAAM,yBAAyB,CAAC,SAA0B,uBAAuB,KAAK,IAAI;AAE1F,IAAM,gBAAgB,CACpB,SACA,UACA,OACA,SACA,WACyB;AACzB,QAAM,QAAQ,UAAU,EAAE,KAAK,IAAI,MAAM,OAAO,cAAc,SAAS,QAAQ,GAAG,OAAO;AACzF,QAAM,WAAW,uBAAuB,SAAS,KAAK;AACtD,MAAI,SAAS,UAAU,GAAG;AACxB,WAAO,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,OAAO,UAAU,CAAC,GAAG,QAAQ,EAAE;AAAA,EACpE;AACA,QAAM,gBACJ,QAAQ,SAAS,sBAAsB,QAAQ,SAASF;AAC1D,QAAM,WACJ,QAAQ,SAAS,sBAAsB,CAAC,gBACpC,gBAAgB,UAAU,OAAO,IACjC;AACN,QAAM,WAAqB,CAAC;AAC5B,QAAM,UAAU,YAAY,SAAS,SAAS,KAAK;AACnD,MAAI,QAAS,UAAS,KAAK,OAAO;AAClC,QAAM,mBAAmB,YAAY,WAAW,QAAQ,QAAQ,KAAK,QAAQ,IAAI;AACjF,MAAI,QAAgD,CAAC;AAIrD,QAAM,QAAQ,MAAY;AACxB,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,aAAa,MAAM,IAAI,CAAC,UAAU,WAAWC,oBAAmB,MAAM,IAAI,CAAC,CAAC;AAClF,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,QAAQ,OAAO,aAAa,KAAK,IAAI,MAAM;AACjD,UAAM,YACJ,oBAAoB,YAAY,MAAM,QAAQ,MAAM,UAAU,SAAS,QACnE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM;AAAA,MACb,QAAQ;AAAA,IACV,IACA;AACN,UAAM,eACJ,cAAc,QAAQ,UAAU,MAAM,CAAC,MAAM,UAAU,KAAK,QAAQ,WAAW,KAAK,CAAC;AACvF,UAAM,cAAc,eAChB,UAAW,IAAI,CAAC,SAAS,KAAK,IAAI,IAClC,WACE,cAAc,WAAW,KAAK,IAAI,GAAG,UAAU,QAAQ,UAAU,IACjE;AACN,UAAM,QAAQ,QAAQ,OAAO,aAAa,KAAK,SAAS,QAAQ,CAAC,EAAE;AACnE,aAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,YAAM,QAAQ,MAAM,KAAK;AACzB,YAAM,OAAO,cAAc,KAAK,KAAK,MAAM,GAAG,cAAc,WAAW,KAAK,KAAK,GAAG;AACpF,UAAI,OAAO,aAAa;AACtB,cAAM,aAAa,QAAQ,OAAO,aAAa,KAAK,MAAM,KAAK,EAAE,SAAS,OAAO,GAAG;AACpF,iBAAS,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,UAAK,CAAC,GAAG,IAAI,EAAE;AAAA,MAC/D,OAAO;AACL,iBAAS,KAAK,IAAI;AAAA,MACpB;AAAA,IACF;AACA,YAAQ,CAAC;AAAA,EACX;AACA,aAAW,SAAS,SAAS,SAAS;AACpC,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM;AACN,eAAS,KAAK,MAAM,GAAG,SAAS,aAAa,MAAM,MAAM,mBAAmB,CAAC;AAAA,IAC/E,WAAW,uBAAuB,MAAM,IAAI,GAAG;AAC7C,YAAM;AACN,YAAM,SAAS,MAAM,GAAG,SAASA,oBAAmB,MAAM,IAAI,CAAC;AAC/D,UAAI,OAAO,aAAa;AACtB,cAAM,QAAQ,QAAQ,OAAO,aAAa,KAAK,SAAS,QAAQ,CAAC,EAAE;AACnE,cAAM,aAAa,QAAQ,OAAO,aAAa,KAAK,MAAM,KAAK,EAAE,SAAS,OAAO,GAAG;AACpF,iBAAS,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,UAAK,CAAC,GAAG,MAAM,EAAE;AAAA,MACjE,OAAO;AACL,iBAAS,KAAK,MAAM;AAAA,MACtB;AAAA,IACF,OAAO;AACL,YAAM,KAAK,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,MAAM,CAAC;AAAA,IACrD;AAAA,EACF;AACA,QAAM;AACN,MAAI,cAAe,aAAY,UAAU,QAAQ,OAAO,OAAO,SAAS,CAAC;AACzE,SAAO,EAAE,OAAO,UAAU,QAAQ,SAAS,OAAO;AACpD;AAEA,IAAM,wBAAwB,CAAC,YAAwC;AACrE,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ;AACZ,SAAO,QAAQ,QAAQ,UAAU,MAAM,SAAS,GAAG;AACjD,WAAO,QAAQ,QAAQ,UAAU,KAAK,KAAK,QAAQ,KAAK,KAAK,EAAE,EAAG;AAClE,QAAI,SAAS,QAAQ,UAAU,YAAY,SAAS,QAAQ,KAAK,KAAK,EAAE,EAAG;AAC3E,QAAI,OAAO;AACX,WAAO,QAAQ,QAAQ,QAAQ;AAC7B,YAAM,YAAY,QAAQ,KAAK,KAAK;AACpC,UAAI,KAAK,KAAK,SAAS,KAAK,YAAY,SAAS,SAAS,EAAG;AAC7D,UAAI,cAAc,OAAO,cAAc,KAAK;AAC1C,cAAM,QAAQ;AACd;AACA,eAAO,QAAQ,QAAQ,UAAU,QAAQ,KAAK,MAAM,OAAO;AACzD,cAAI,UAAU,OAAO,QAAQ,KAAK,MAAM,KAAM;AAC9C,kBAAQ,QAAQ,KAAK,KAAK;AAC1B;AAAA,QACF;AACA,YAAI,QAAQ,QAAQ,OAAQ;AAC5B;AAAA,MACF;AACA,UAAI,cAAc,MAAM;AACtB;AACA,gBAAQ,QAAQ,KAAK,KAAK;AAC1B;AACA;AAAA,MACF;AACA,cAAQ;AACR;AAAA,IACF;AACA,QAAI,KAAM,OAAM,KAAK,IAAI;AAAA,EAC3B;AACA,QAAM,cAAc,MAAM,KAAK,CAAC,SAAS,CAAC,6BAA6B,KAAK,IAAI,CAAC;AACjF,SAAO,aAAa,MAAM,GAAG,EAAE,GAAG,EAAE;AACtC;AAEA,IAAM,eAAe,CAAC,YAA8B;AAClD,QAAM,UAAU,QAAQ,QAAQ,SAAS,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACxE,QAAM,WAAoC;AAAA,IACxC;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,uBAAuB,oBAAoB;AAAA,IAC5C,CAAC,+BAA+B,sCAAsC;AAAA,IACtE,CAAC,8BAA8B,sCAAsC;AAAA,IACrE,CAAC,8BAA8B,uCAAuC;AAAA,IACtE,CAAC,kCAAkC,wCAAwC;AAAA,IAC3E,CAAC,wBAAwB,0BAA0B;AAAA,IACnD,CAAC,2BAA2B,qCAAqC;AAAA,IACjE,CAAC,uBAAuB,6BAA6B;AAAA,IACrD,CAAC,2BAA2B,uDAAuD;AAAA,EACrF;AACA,SAAO,SAAS,OAAO,CAAC,CAAC,EAAE,OAAO,MAAM,QAAQ,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,KAAK;AACvF;AAEA,IAAM,sBAAsB,CAC1B,MACA,QACA,MACA,UACW;AACX,QAAM,SAAS,OAAO,OAAO,CAAC,CAAC,OAAO,GAAG,MAAM,MAAM,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACtF,MAAI,MAAM;AACV,MAAI,UAAU;AACd,MAAI,SAAS;AACb,MAAI,aAAa;AACjB,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAChD,QAAI,KAAK,KAAK,MAAM,UAAU,KAAK,QAAQ,CAAC,MAAM,KAAK;AACrD,YAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ,CAAC;AACvC,UAAI,OAAO,GAAG;AACZ,cAAM,WAAW,KAAK,MAAM,OAAO,MAAM,CAAC;AAC1C,eAAO;AACP,YAAI,WAAW,aAAa,cAAc,aAAa,YAAa,QAAO;AAC3E,gBAAQ;AACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,aAAa,OAAO,UAAU,WAAW,OAAO,UAAU,EAAG,CAAC,GAAG;AACtE,UAAI,OAAQ,QAAO;AACnB,eAAS;AACT;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,UAAU;AAC/B,QAAI,CAAC,UAAU,SAAS,WAAW,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAG;AACjE,aAAO;AACP,eAAS;AAAA,IACX;AACA,WAAO,KAAK,KAAK;AACjB;AAAA,EACF;AACA,MAAI,OAAQ,QAAO;AACnB,SAAO;AACT;AAEA,IAAM,kBAAkB,CACtB,QACA,SAC6E;AAC7E,QAAM,WAAW,oBAAI,IAGnB;AACF,MAAI,QAAQ;AACZ,SAAO,QAAQ,OAAO,QAAQ;AAC5B,QAAI,CAAC,OAAO,KAAK,KAAK,OAAO,KAAK,EAAG,SAAS,KAAK;AACjD;AACA;AAAA,IACF;AACA,QAAI,MAAM;AACV,WAAO,MAAM,OAAO,UAAU,OAAO,GAAG,KAAK,OAAO,GAAG,EAAG,SAAS,IAAK;AACxE,UAAM,QAAQ,OAAO,MAAM,OAAO,GAAG;AACrC,eAAW,CAAC,OAAO,KAAK,KAAK,oBAAoB,OAAO,IAAI,GAAG;AAC7D,eAAS,IAAI,QAAQ,OAAO,KAAK;AAAA,IACnC;AACA,YAAQ;AAAA,EACV;AACA,SAAO;AACT;AAEA,IAAM,gBAAgB,CAAC,SAA8B;AACnD,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,MAAI,QAAQ;AACZ,MAAI,iBAAiB;AACrB,MAAI,gBAAgB;AACpB,QAAM,QAAQ,MAAY;AACxB,QAAI,mBAAmB,KAAK,kBAAkB,EAAG;AACjD;AACA,QAAI,iBAAiB,KAAK,gBAAgB,GAAG;AAC3C;AACA,oBAAc,KAAK,IAAI,GAAG,iBAAiB,aAAa;AACxD,mBAAa,KAAK,IAAI,GAAG,gBAAgB,cAAc;AAAA,IACzD,WAAW,iBAAiB,EAAG,eAAc;AAAA,QACxC,cAAa;AAClB,qBAAiB;AACjB,oBAAgB;AAAA,EAClB;AACA,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AACnD;AACA;AAAA,IACF,WAAW,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AAC1D;AACA;AAAA,IACF,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM;AACN,SAAO,EAAE,WAAW,UAAU,cAAc,YAAY,WAAW,YAAY,MAAM,QAAQ,MAAM;AACrG;AAEA,IAAM,oBAAoB,CAAC,YAAiC;AAC1D,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,eAAe,EAAG,OAAM,KAAK,WAAW,QAAQ,cAAc,aAAa,CAAC;AACxF,MAAI,QAAQ,aAAa,EAAG,OAAM,KAAK,WAAW,QAAQ,YAAY,WAAW,CAAC;AAClF,MAAI,QAAQ,YAAY,EAAG,OAAM,KAAK,WAAW,QAAQ,WAAW,UAAU,CAAC;AAC/E,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,IAAM,mBAAmB,CAAC,QAAgB,UAA0B;AAClE,QAAM,UAAU,UAAU,QAAQ,KAAK;AACvC,QAAM,iBAAiB,QAAQ,IAAI,MAAM,KAAK;AAC9C,MAAI,eAAe;AACnB,WAAS,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS;AACxD,mBAAe,KAAK,IAAI;AACxB,UAAM,SAAS,QAAQ,KAAK;AAC5B,QAAI,OAAO,SAAS,OAAO,QAAS,gBAAe;AAAA,EACrD;AACA,QAAM,MAAgB,CAAC;AACvB,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,mBAAmB;AACvB,QAAM,UAAU;AAChB,QAAM,eAAe,CAAC,OAAiB,aACrC,MAAM,IAAI,CAAC,MAAM,WAAW,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;AAC7D,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;AACnD,UAAM,SAAS,QAAQ,KAAK;AAC5B,UAAM,QAAQ,OAAO,MAAM,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,IAAI,EAAE,MAAM,IAAI;AACjF,QAAI,MAAM,GAAG,EAAE,MAAM,GAAI,OAAM,IAAI;AACnC,QAAI,CAAC,OAAO,SAAS,CAAC,OAAO,SAAS;AACpC,YAAM,QAAQ,eAAe,KAAK,KAAK;AACvC,UAAI,CAAC,WAAW,OAAO;AACrB,cAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,OAAO;AAChD,YAAI,KAAK,GAAG,aAAa,MAAM,MAAM,KAAK,GAAG,UAAU,KAAK,CAAC;AAAA,MAC/D,WAAW,SAAS;AAClB,YAAI,SAAS,MAAM,SAAS,UAAU,GAAG;AACvC,cAAI,KAAK,GAAG,aAAa,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAC1D,cAAI,KAAK,KAAK;AACd,cAAI,KAAK,GAAG,aAAa,MAAM,MAAM,CAAC,OAAO,GAAG,UAAU,MAAM,SAAS,OAAO,CAAC;AAAA,QACnF,OAAO;AACL,cAAI,KAAK,GAAG,aAAa,MAAM,MAAM,GAAG,QAAQ,MAAM,SAAS,OAAO,GAAG,OAAO,CAAC;AAAA,QACnF;AAAA,MACF;AACA,iBAAW,MAAM;AACjB,iBAAW,MAAM;AACjB;AAAA,IACF;AACA,QAAI,CAAC,QAAS,oBAAmB;AACjC,cAAU;AACV,eAAW,QAAQ,OAAO;AACxB,UAAI,OAAO,QAAS,KAAI,KAAK,IAAI,SAAS,IAAI,IAAI,EAAE;AAAA,UAC/C,KAAI,KAAK,IAAI,SAAS,IAAI,IAAI,EAAE;AAAA,IACvC;AAAA,EACF;AACA,SAAO,IAAI,SAAS,IAAI,CAAC,MAAM,gBAAgB,OAAO,GAAG,GAAG,EAAE,KAAK,IAAI,IAAI;AAC7E;AAIA,IAAM,iBAAiB,CAAC,UAA0B;AAChD,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,YAAS,QAAQ,KAAK,OAAO,MAAM,WAAW,KAAK,IAAK;AAAA,EAC1D;AACA,SAAO;AACT;AAKA,IAAM,6BAA6B;AASnC,IAAM,mBAAmB,CACvB,WACiD;AACjD,QAAM,OAAqD,CAAC;AAC5D,MAAI,YAAY;AAChB,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS;AAClD,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI,CAAC,KAAM;AACX,UAAM,aAAa,OAAO,SAAS,KAAK,WAAW,KAAK,GAAG,EAAE;AAC7D,QAAI,KAAK,SAAS,KAAK;AACrB,UAAI,OAAO,SAAS,UAAU,KAAK,aAAa,EAAG,MAAK,KAAK,EAAE,OAAO,WAAW,CAAC;AAClF;AAAA,IACF,WAAW,KAAK,SAAS,KAAK;AAC5B;AAAA,IACF,WAAW,OAAO,SAAS,UAAU,GAAG;AACtC,YAAM,aAAa,aAAa;AAChC,UAAI,aAAa,EAAG,MAAK,KAAK,EAAE,OAAO,YAAY,WAAW,CAAC;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAaA,IAAM,4BAA4B,CAChC,QACA,UACA,UACA,KACA,eAC+B;AAE/B,MAAI,QAAQ;AACZ,SAAO,QAAQ,OAAO,UAAU,CAAC,OAAO,KAAK,EAAG;AAChD,MAAI,MAAM;AACV,SAAO,MAAM,OAAO,UAAU,OAAO,GAAG,EAAG;AAC3C,QAAM,QAAQ,OAAO,MAAM,OAAO,GAAG;AACrC,QAAM,UAA8D,CAAC;AAIrE,QAAM,gBAAuD,CAAC;AAC9D,WAAS,SAAS,GAAG,SAAS,MAAM,QAAQ,UAAU;AACpD,UAAM,OAAO,MAAM,MAAM;AAGzB,UAAM,IAAI,OAAO,SAAS,KAAK,WAAW,KAAK,GAAG,EAAE;AACpD,QAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,EAAG;AACnC,QAAI,KAAK,SAAS,IAAK,SAAQ,KAAK,EAAE,KAAK,QAAQ,QAAQ,GAAG,SAAS,WAAW,KAAK,OAAO,EAAE,CAAC;AAAA,aACxF,KAAK,SAAS,OAAO,QAAQ,WAAW,EAAG,eAAc,KAAK,EAAE,GAAG,SAAS,WAAW,KAAK,OAAO,EAAE,CAAC;AAAA,EACjH;AACA,MAAI,QAAQ,WAAW,EAAG,QAAO;AAKjC,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;AACnD,QAAI,QAAQ,KAAK,EAAG,MAAM,QAAQ,QAAQ,CAAC,EAAG,IAAI,EAAG,QAAO;AAAA,EAC9D;AACA,QAAM,eAAe,QAAQ,CAAC,EAAG;AAIjC,WAAS,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS;AACzD,QAAI,cAAc,KAAK,EAAG,MAAM,cAAc,QAAQ,CAAC,EAAG,IAAI,EAAG,QAAO;AAAA,EAC1E;AACA,MAAI,cAAc,SAAS,KAAK,cAAc,cAAc,SAAS,CAAC,EAAG,MAAM,eAAe,GAAG;AAC/F,WAAO;AAAA,EACT;AACA,QAAM,SAAS,cAAc,SAAS,IAAI,cAAc,CAAC,EAAG,IAAI;AAEhE,QAAM,WAAW,QAAQ,KAAK,QAAQ;AACtC,MAAI;AACJ,MAAI;AACF,WAAOE,UAAS,QAAQ;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,KAAK,OAAO,KAAK,KAAK,OAAOH,qBAAqB,QAAO;AAC9D,MAAI;AACJ,MAAI;AACF,WAAOI,cAAa,UAAU,MAAM;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,IAAI,EAAG,QAAO;AAChC,QAAM,YAAY,KAAK,QAAQ,UAAU,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI,UAAU;AAGzE,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,IAAK;AACvB,UAAM,IAAI,OAAO,SAAS,KAAK,WAAW,KAAK,GAAG,EAAE;AACpD,QAAI,CAAC,OAAO,SAAS,CAAC,EAAG;AACzB,QAAI,UAAU,IAAI,CAAC,MAAM,WAAW,KAAK,OAAO,EAAG,QAAO;AAAA,EAC5D;AACA,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,GAAG,0BAA0B,CAAC;AAChF,QAAM,SAAS,UAAU,MAAM,SAAS,IAAI,aAAa,SAAS,CAAC;AACnE,QAAM,kBAAkB,QAAQ,IAAI,CAAC,QAAQ,IAAI,OAAO;AACxD,QAAM,kBAAkB,cAAc,IAAI,CAAC,YAAY,QAAQ,OAAO;AACtE,QAAM,UAAU,CAAC,GAAG,QAAQ,GAAG,iBAAiB,GAAG,eAAe;AAClE,QAAM,WAAW,YAAY,QAAQ,KAAK,QAAQ,KAAK,eAAe,QAAQ,KAAK,IAAI,CAAC,CAAC;AACzF,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAM,oBAAI,IAAoB;AACpC,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;AACnD,UAAM,QAAQ,QAAQ,gBAAgB,SAAS,KAAK;AACpD,QAAI,SAAS,MAAM,QAAQ,QAAQ,KAAK,EAAG,QAAS,KAAI,IAAI,QAAQ,KAAK,EAAG,KAAK,MAAM,IAAI;AAAA,EAC7F;AACA,SAAO;AACT;AAEA,IAAM,aAAa,CACjB,MACA,UACA,OACA,SACA,kBACyB;AACzB,MAAI,CAAC,KAAM,QAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAE;AACzC,QAAM,cAAc,KAAK,MAAM,IAAI;AACnC,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,iBAAiB,UAAU,EAAE,KAAK,IAAI,MAAM,OAAO,GAAG,OAAO,GAAG,QAAQ,QAAQ,CAAC;AACpH,QAAM,QAAQ,YAAY,MAAM,GAAG,KAAK;AACxC,QAAM,SAAS,YAAY,SAAS,MAAM;AAC1C,QAAM,SAAS,MAAM,IAAI,aAAa;AACtC,QAAM,QAAQ,oBAAoB,MAAM;AACxC,QAAM,gBACJ,QAAQ,SAAS,sBAAsB,KAAK,SAASJ;AACvD,QAAM,WACJ,QAAQ,SAAS,sBAAsB,CAAC,gBACpC,gBAAgB,QAAQ,IACxB;AACN,QAAM,cAAyC,MAAM,KAAK,EAAE,QAAQ,MAAM,OAAO,GAAG,MAAM,MAAS;AACnG,MAAI,UAAU;AAKZ,QAAI,UAAU;AACZ,YAAM,WAAW,iBAAiB,MAAM;AACxC,UAAI,SAAS,SAAS,GAAG;AACvB,YAAI,OAAO,SAAS,CAAC,EAAG;AACxB,YAAI,KAAK;AACT,iBAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;AACpD,gBAAM,aAAa,SAAS,KAAK,EAAG;AACpC,iBAAO,KAAK,IAAI,MAAM,UAAU;AAChC,eAAK,KAAK,IAAI,IAAI,UAAU;AAAA,QAC9B;AACA;AACA;AACA,cAAM,QAAQ;AAAA,UACZ,QAAQ,QAAQ,KAAK,QAAQ;AAAA,UAC7B;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV;AACA,YAAI,OAAO;AACT,qBAAW,OAAO,UAAU;AAC1B,kBAAM,QAAQ,MAAM,IAAI,aAAa,IAAI,IAAI;AAC7C,gBAAI,SAAS,MAAM,QAAQ,WAAW,OAAO,IAAI,KAAK,EAAG,OAAO,GAAG;AACjE,0BAAY,IAAI,KAAK,IAAI,MAAM;AAAA,YACjC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAIA,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AACA,UAAI,oBAAoB;AACtB,mBAAW,CAAC,KAAK,IAAI,KAAK,oBAAoB;AAC5C,cAAI,YAAY,GAAG,MAAM,OAAW,aAAY,GAAG,IAAI;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAIA,QAAI,QAAQ;AACZ,WAAO,QAAQ,OAAO,QAAQ;AAC5B,UAAI,CAAC,OAAO,KAAK,KAAK,YAAY,KAAK,MAAM,QAAW;AACtD;AACA;AAAA,MACF;AACA,UAAI,MAAM;AACV,aAAO,MAAM,OAAO,UAAU,OAAO,GAAG,KAAK,YAAY,GAAG,MAAM,OAAW;AAC7E,YAAM,aAAuB,CAAC;AAC9B,YAAM,aAAuB,CAAC;AAC9B,YAAM,aAAuB,CAAC;AAC9B,YAAM,aAAuB,CAAC;AAC9B,eAAS,SAAS,OAAO,SAAS,KAAK,UAAU;AAC/C,cAAM,OAAO,OAAO,MAAM;AAC1B,cAAM,UAAU,WAAW,KAAK,OAAO;AACvC,YAAI,KAAK,SAAS,KAAK;AACrB,qBAAW,KAAK,MAAM;AACtB,qBAAW,KAAK,OAAO;AAAA,QACzB;AACA,YAAI,KAAK,SAAS,KAAK;AACrB,qBAAW,KAAK,MAAM;AACtB,qBAAW,KAAK,OAAO;AAAA,QACzB;AAAA,MACF;AACA,YAAM,cAAc,WAAW,SAC3B,cAAc,WAAW,KAAK,IAAI,GAAG,UAAU,QAAQ,UAAU,IACjE;AACJ,UAAI,aAAa;AACf,iBAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS;AACtD,sBAAY,WAAW,KAAK,CAAE,IAAI,YAAY,KAAK;AAAA,QACrD;AAAA,MACF;AACA,YAAM,cAAc,WAAW,SAC3B,cAAc,WAAW,KAAK,IAAI,GAAG,UAAU,QAAQ,UAAU,IACjE;AACJ,UAAI,aAAa;AACf,iBAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS;AACtD,sBAAY,WAAW,KAAK,CAAE,IAAI,YAAY,KAAK;AAAA,QACrD;AAAA,MACF;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,WAAW,gBAAgB,QAAQ,QAAQ,SAAS,YAAY;AACtE,QAAM,iBAAiB,2BAA2B,IAC9C,EAAE,KAAK,0BAA0B,QAAQ,yBAAyB,IAClE,EAAE,KAAK,wBAAwB,QAAQ,uBAAuB;AAClE,QAAM,QAAQ,MAAM,IAAI,CAAC,KAAK,UAAU;AACtC,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI,CAAC,MAAM;AACT,YAAM,OAAOC,oBAAmB,GAAG;AACnC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,YAAY,MAAO,QAAO,MAAM,GAAG,SAAS,sCAAsC;AACtF,UAAI,QAAQ,WAAW,IAAI,EAAG,QAAO,MAAM,GAAG,UAAU,MAAM,KAAK,IAAI,CAAC;AACxE,UACE,QAAQ,WAAW,KAAK,KACxB,QAAQ,WAAW,KAAK,KACxB,QAAQ,WAAW,OAAO,KAC1B,QAAQ,WAAW,QAAQ,GAC3B;AACA,eAAO,MAAM,GAAG,SAAS,IAAI;AAAA,MAC/B;AACA,aAAO,MAAM,GAAG,mBAAmB,IAAI;AAAA,IACzC;AACA,UAAM,mBAAmB,uBAAuB,KAAK,OAAO;AAC5D,QAAI,UAAU,mBACV,MAAM,GAAG,SAASA,oBAAmB,KAAK,OAAO,CAAC,IAClD,YAAY,KAAK,KAAK,MAAM,GAAG,cAAcA,oBAAmB,WAAW,KAAK,OAAO,CAAC,KAAK,GAAG;AACpG,UAAM,QAAQ,mBAAmB,SAAY,SAAS,IAAI,KAAK;AAC/D,QAAI,SAAS,MAAM,OAAO,SAAS,GAAG;AACpC,gBAAU;AAAA,QACR;AAAA,QACA,MAAM;AAAA,QACN,MAAM,SAAS,QAAQ,eAAe,MAAM,eAAe;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,qBAAqB,KAAK,YAAY,KAAK;AAC9D,QAAI,KAAK,SAAS,KAAK;AACrB,aAAO,aAAa,OAAO,GAAG,MAAM,GAAG,iBAAiB,IAAI,UAAU,UAAK,CAAC,GAAG,OAAO,EAAE;AAAA,IAC1F;AACA,QAAI,KAAK,SAAS,KAAK;AACrB,aAAO,aAAa,UAAU,GAAG,MAAM,GAAG,mBAAmB,IAAI,UAAU,UAAK,CAAC,GAAG,OAAO,EAAE;AAAA,IAC/F;AACA,WAAO,UAAU,MAAM,GAAG,mBAAmB,IAAI,UAAU,UAAK,CAAC,GAAG,OAAO;AAAA,EAC7E,CAAC;AACD,MAAI,eAAe;AACjB,gBAAY,OAAO,QAAQ,OAAO,4CAA4C,CAAC;AAAA,EACjF;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,IAAM,aAAa,CACjB,OACA,OACA,YACgC;AAChC,MAAI,CAAC,QAAQ,YAAY,CAAC,QAAQ,SAAS,mBAAoB,QAAO;AACtE,QAAM,SAAS,aAAa,KAAK;AACjC,MAAI,WAAW,OAAW,QAAO;AACjC,QAAM,WAAW,UAAU,OAAO,MAAM,KAAK;AAC7C,MAAI,oBAAoB,KAAK,MAAM,GAAG;AACpC,WAAO,EAAE,OAAO,CAAC,MAAM,GAAG,OAAOA,oBAAmB,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE;AAAA,EAC3E;AACA,QAAM,YAAY,gBAAgB,KAAK;AACvC,QAAM,EAAE,SAAS,OAAO,IACtB,aAAa,OAAO,MAAM,MAAM,UAAU,WACtC,4BAA4B,MAAM,IAClC,EAAE,SAAS,OAAO;AACxB,QAAM,WAAW,cAAc,SAAS,UAAU,OAAO,SAAS;AAAA,IAChE,aAAa,QAAQ,SAAS;AAAA,IAC9B,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,MAAM,MAAM,MAAM,KAAK,CAAC,CAAC;AAAA,IACpE,YAAY;AAAA,IACZ,WAAW;AAAA,EACb,CAAC;AACD,MAAI,OAAQ,aAAY,SAAS,OAAO,QAAQ,OAAO,MAAM,CAAC;AAAA,WACrD,UAAW,aAAY,SAAS,OAAO,QAAQ,OAAO,0BAA0B,CAAC;AAC1F,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,UAAsC;AAC5D,QAAM,UAAU,cAAc,KAAK;AACnC,SAAO,SAAS,0BAA0B,SAAS,MAAM,OAAO,GAAG;AACrE;AAEA,IAAM,cAAc,CAAC,UACnB,SAAS,SAAS,MAAM,OAAO,GAAG,WAAW,KAAK,UAAU,OAAO,SAAS,KAAK;AAEnF,IAAM,eAAe,CAAC,UACpB,SAAS,SAAS,MAAM,OAAO,GAAG,YAAY,KAAK,UAAU,OAAO,SAAS;AAE/E,IAAM,cAAc,CAClB,OACA,OACA,YACgC;AAChC,MAAI,CAAC,QAAQ,YAAY,CAAC,QAAQ,SAAS,oBAAqB,QAAO;AACvE,QAAM,UAAU,aAAa,KAAK;AAClC,MAAI,YAAY,OAAW,QAAO;AAClC,QAAM,WAAW,UAAU,OAAO,MAAM,KAAK;AAC7C,QAAM,SAAS,eAAe,KAAK;AACnC,QAAM,eAAe,SAAS,MAAM;AACpC,MAAI,MAAM,YAAY,QAAQ,cAAc,SAAS,WAAW;AAC9D,UAAM,gBAAgB,SAAS,aAAa,OAAO;AACnD,QAAI,kBAAkB,QAAW;AAC/B,aAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM,GAAG,WAAW,sBAAiB,IACnC,MAAM,GAAG,SAAS,oCAAiC;AAAA,QACvD;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AACA,QAAI,kBAAkB,SAAS;AAC7B,aAAO,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,sCAA8B,CAAC,GAAG,QAAQ,EAAE;AAAA,IACjF;AACA,QAAI,yBAAyB,eAAe,OAAO,GAAG;AACpD,aAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM,GAAG,WAAW,sBAAiB,IACnC,MAAM,GAAG,SAAS,sCAAmC;AAAA,QACzD;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AACA,QAAI,8BAA8B,eAAe,OAAO,GAAG;AACzD,aAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM,GAAG,WAAW,sBAAiB,IACnC,MAAM,GAAG,SAAS,wCAAqC;AAAA,QAC3D;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AACA,UAAM,OAAO,iBAAiB,eAAe,OAAO;AACpD,UAAM,UAAU,cAAc,IAAI;AAClC,UAAM,SACJ,GAAG,MAAM,GAAG,WAAW,sBAAiB,CAAC,IAAI,MAAM,GAAG,SAAS,kBAAkB,OAAO,CAAC,CAAC,KAC1F,MAAM,GAAG,SAAS,QAAK,IACvB,MAAM,GAAG,WAAW,IAAI,QAAQ,SAAS,EAAE,IAC3C,MACA,MAAM,GAAG,SAAS,IAAI,QAAQ,QAAQ,EAAE;AAC1C,UAAM,WAAW,WAAW,MAAM,UAAU,OAAO,OAAO;AAC1D,WAAO,EAAE,OAAO,CAAC,QAAQ,GAAG,SAAS,KAAK,GAAG,QAAQ,SAAS,OAAO;AAAA,EACvE;AACA,MAAI,MAAM,YAAY,QAAQ,cAAc,SAAS,WAAW;AAC9D,QAAI,SAAS,SAAS,aAAa,MAAM,KAAK;AAC9C,UAAM,aAAa,SAAS,aAAa,UAAU;AACnD,UAAM,WAAW,SAAS,aAAa,QAAQ;AAC/C,QAAI,eAAe,QAAW;AAC5B,gBAAU,aAAa,iBAAiB,QAAQ,aAAa,SACzD,KAAK,YAAY,UAAU,CAAC,MAAM,YAAY,QAAQ,CAAC,MACvD,KAAK,YAAY,UAAU,CAAC;AAAA,IAClC;AACA,WAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM,GAAG,WAAW,sBAAiB,IACnC,MAAM,GAAG,SAAS,uBAAoB,MAAM,EAAE;AAAA,MAClD;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACA,MAAI,MAAM,YAAY,QAAQ,SAAS,MAAM,OAAO,GAAG,wBAAwB,QAAQ,WAAW,QAAW;AAC3G,UAAM,WAAW,cAAc,SAAS,UAAU,OAAO,SAAS;AAAA,MAChE,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,CAAC;AACD,WAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM,GAAG,WAAW,oBAAe,WAAW,kBAAkB,OAAO,GAAG,MAAM,CAAC,GAAG;AAAA,QACpF,GAAG,SAAS;AAAA,MACd;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB;AAAA,EACF;AACA,SAAO,cAAc,SAAS,UAAU,OAAO,SAAS;AAAA,IACtD,YAAY;AAAA,IACZ,WAAW;AAAA,EACb,CAAC;AACH;AAEA,IAAM,iBAAiB,CAAC,UAA0E;AAChG,QAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,KAAK,IAAI,MAAM,KAAK,QAAQ,CAAC;AACrE,SAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,UAAM,SAAS,SAAS,IAAI;AAC5B,UAAM,UAAU,SAAS,QAAQ,OAAO,KAAK,SAAS,QAAQ,QAAQ;AACtE,UAAM,UAAU,SAAS,QAAQ,OAAO,KAAK,SAAS,QAAQ,QAAQ;AACtE,WAAO,YAAY,UAAa,YAAY,UAAa,YAAY,UACjE,CAAC,EAAE,SAAS,QAAQ,CAAC,IACrB,CAAC;AAAA,EACP,CAAC;AACH;AAEA,IAAM,aAAa,CACjB,OACA,OACA,YACgC;AAChC,MAAI,CAAC,QAAQ,YAAY,CAAC,QAAQ,SAAS,gBAAiB,QAAO;AACnE,QAAM,WAAW,UAAU,OAAO,MAAM,KAAK;AAC7C,QAAM,SAAS,SAAS,cAAc,KAAK,GAAG,IAAI;AAClD,MAAI,QAAQ;AACV,UAAM,UAAU,cAAc,MAAM;AACpC,UAAMI,UACJ,MAAM,GAAG,SAAS,WAAW,QAAQ,OAAO,MAAM,CAAC,IACnD,MAAM,GAAG,SAAS,QAAK,IACvB,MAAM,GAAG,WAAW,IAAI,QAAQ,SAAS,EAAE,IAC3C,MACA,MAAM,GAAG,SAAS,IAAI,QAAQ,QAAQ,EAAE;AAC1C,UAAM,WAAW,WAAW,QAAQ,UAAU,OAAO,OAAO;AAC5D,WAAO,EAAE,OAAO,CAACA,SAAQ,GAAG,SAAS,KAAK,GAAG,QAAQ,SAAS,OAAO;AAAA,EACvE;AACA,QAAM,aAAa,eAAe,KAAK;AACvC,MAAI,WAAW,WAAW,GAAG;AAC3B,QAAI,MAAM,WAAW;AAGnB,aAAO,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,iCAAiC,CAAC,GAAG,QAAQ,EAAE;AAAA,IAClF;AACA,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,KAAK,IAAI,WAAW,QAAQ,CAAC;AACnD,QAAM,WAAqB,CAAC;AAC5B,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,MAAI,SAAS;AACb,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,OAAO,OAAO,IAAI,aAAa,CAAC;AACtF,WAAS,QAAQ,GAAG,QAAQ,eAAe,SAAS;AAClD,UAAM,YAAY,WAAW,KAAK;AAClC,UAAM,OAAO,iBAAiB,UAAU,SAAS,UAAU,OAAO;AAClE,UAAM,UAAU,cAAc,IAAI;AAClC,iBAAa,QAAQ;AACrB,gBAAY,QAAQ;AACpB,QAAI,WAAW,SAAS,EAAG,UAAS,KAAK,MAAM,GAAG,SAAS,iBAAiB,QAAQ,CAAC,IAAI,WAAW,MAAM,EAAE,CAAC;AAC7G,UAAM,WAAW,WAAW,MAAM,UAAU,OAAO,SAAS,YAAY;AACxE,aAAS,KAAK,GAAG,SAAS,KAAK;AAC/B,cAAU,SAAS;AAAA,EACrB;AACA,QAAM,SAAS,GAAG,MAAM,GAAG,SAAS,eAAe,CAAC,IAAI,MAAM,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC,IAAI,MAAM,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC,GAC/H,WAAW,SAAS,IAAI,MAAM,GAAG,SAAS,SAAM,WAAW,MAAM,cAAc,IAAI,EACrF;AACA,MAAI,WAAW,SAAS,eAAe;AACrC,gBAAY,UAAU,QAAQ,OAAO,WAAW,aAAa,OAAO,WAAW,MAAM,cAAc,CAAC;AAAA,EACtG;AACA,SAAO,EAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,GAAG,OAAO;AAChD;AAEA,IAAM,kBAAkB,CACtB,MACA,SACA,SACA,eAC4B;AAC5B,MAAI,CAAC,WAAW,CAAC,QAAS,QAAO,CAAC;AAClC,QAAM,WAAW,aAAa,KAAK,YAAY,IAAI;AACnD,QAAM,SAAS,aAAa,QAAQ,YAAY,IAAI;AACpD,QAAM,SAAkC,CAAC;AACzC,MAAI,QAAQ,SAAS,QAAQ,MAAM;AACnC,SAAO,SAAS,GAAG;AACjB,WAAO,KAAK,CAAC,OAAO,QAAQ,OAAO,MAAM,CAAC;AAC1C,YAAQ,SAAS,QAAQ,QAAQ,QAAQ,OAAO,MAAM;AAAA,EACxD;AACA,SAAO;AACT;AAUA,IAAM,eAAe,CAAC,QAAsC;AAC1D,QAAM,QAAQ,IAAI,MAAM,qBAAqB;AAC7C,QAAM,UAAU,IAAI,MAAM,qBAAqB;AAC/C,QAAM,SAAS,SAAS;AACxB,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,kBAAkB,OAAO,CAAC,KAAK;AACrC,QAAM,aAAa,OAAO,SAAS,iBAAiB,EAAE;AACtD,SAAO;AAAA,IACL,UAAU,OAAO,CAAC,KAAK;AAAA,IACvB,YAAY,OAAO,SAAS,UAAU,IAAI,aAAa;AAAA,IACvD;AAAA,IACA,MAAM,WAAW,OAAO,CAAC,KAAK,EAAE;AAAA,IAChC,SAAS,QAAQ,KAAK;AAAA,EACxB;AACF;AAMA,IAAM,mBAAmB,CACvB,KACA,UACA,YAC8B;AAC9B,MAAI,CAAC,SAAU,QAAO,IAAI,IAAI,MAAM,MAAS;AAC7C,QAAM,QAAQ,IAAI,CAAC;AACnB,QAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QAAM,QAAQ;AAAA,IACZ,QAAQ,QAAQ,KAAK,MAAM,QAAQ;AAAA,IACnC;AAAA,IACA,MAAM,aAAa;AAAA,IACnB,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AACA,MAAI,SAAS,MAAM,MAAM,CAAC,MAAM,UAAU,KAAK,QAAQ,IAAI,KAAK,EAAG,IAAI,GAAG;AACxE,WAAO,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,EACtC;AACA,QAAM,WAAW;AAAA,IACf,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,IACpC;AAAA,IACA,QAAQ;AAAA,EACV;AACA,SAAO,IAAI,IAAI,CAAC,GAAG,UAAU,WAAW,KAAK,CAAC;AAChD;AAEA,IAAM,oBAAoB,CACxB,KACA,aACA,OACA,UACW;AACX,MAAI,UAAU;AACd,MAAI,IAAI,SAAS;AACf,UAAM,SAAS;AAAA,MACb,IAAI;AAAA,MACJ,UAAU,OAAO,SAAS,KAAK;AAAA,MAC/B,MAAM,MAAM,YAAY;AAAA,MACxB,MAAM,MAAM,eAAe;AAAA,IAC7B;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,gBAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,2BAA2B,IAAI,2BAA2B;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,IAAI,UACf,MAAM,GAAG,UAAU,IAAI,gBAAgB,SAAS,GAAG,GAAG,CAAC,IACvD,MAAM,GAAG,OAAO,IAAI,gBAAgB,SAAS,GAAG,GAAG,CAAC;AACxD,QAAM,SAAS,IAAI,UAAU,MAAM,GAAG,WAAW,QAAG,IAAI,MAAM,GAAG,OAAO,QAAG;AAC3E,SAAO,GAAG,MAAM,GAAG,OAAO,IAAI,CAAC,GAAG,MAAM,IAAI,MAAM,IAAI,OAAO;AAC/D;AAEA,IAAM,aAAa,CACjB,OACA,OACA,YACgC;AAChC,MAAI,CAAC,QAAQ,YAAY,CAAC,QAAQ,SAAS,kBAAmB,QAAO;AACrE,QAAM,SAAS,aAAa,KAAK,GAAG,QAAQ,UAAU,EAAE;AACxD,MAAI,CAAC,UAAU,WAAW,oBAAoB;AAC5C,WAAO,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,UAAU,kBAAkB,CAAC,GAAG,QAAQ,EAAE;AAAA,EAC/E;AACA,QAAM,MAAM,OAAO,MAAM,IAAI;AAC7B,QAAM,gBACJ,QAAQ,SAAS,sBAAsB,OAAO,SAASL;AACzD,QAAM,WAAW,QAAQ,SAAS,sBAAsB,CAAC;AACzD,QAAM,WAAW,eAAe,KAAK,UAAU,OAAO,OAAO,CAAC;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAClB,MAAI;AACJ,MAAI,MAAuB,CAAC;AAE5B,QAAM,WAAW,MAAY;AAC3B,QAAI,IAAI,WAAW,EAAG;AACtB,UAAM,cAAc,WAAW,iBAAiB,KAAK,iBAAiB,OAAO,IAAI,CAAC;AAClF,aAAS,QAAQ,GAAG,QAAQ,IAAI,QAAQ,SAAS;AAC/C,YAAM,MAAM,IAAI,KAAK;AACrB,YAAM,UAAU,YAAY,KAAK,KAAK,MAAM,GAAG,cAAcC,oBAAmB,IAAI,IAAI,CAAC;AACzF,YAAM,KAAK,kBAAkB,KAAK,SAAS,OAAO,KAAK,CAAC;AAAA,IAC1D;AACA,UAAM,CAAC;AAAA,EACT;AAEA,aAAW,SAAS,SAAS,SAAS;AACpC,QAAI,MAAM,SAAS,UAAU;AAC3B,eAAS;AACT,YAAM,KAAK,MAAM,GAAG,SAAS,aAAa,MAAM,MAAM,mBAAmB,CAAC;AAC1E,oBAAc;AACd,wBAAkB;AAClB;AAAA,IACF;AACA,UAAM,MAAM,aAAa,MAAM,IAAI;AACnC,QAAI,CAAC,KAAK;AACR,eAAS;AACT,YAAM;AAAA,QACJ,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,KAAK,SAAS,GAAG,IACjD,MAAM,GAAG,WAAWA,oBAAmB,MAAM,IAAI,CAAC,IAClD,MAAM,GAAG,cAAcA,oBAAmB,MAAM,IAAI,KAAK,GAAG;AAAA,MAClE;AACA;AAAA,IACF;AACA,QAAI,IAAI,aAAa,aAAa;AAChC,eAAS;AACT,oBAAc,IAAI;AAClB,wBAAkB,WAAW,iBAAiB,IAAI,QAAQ,IAAI;AAC9D,YAAM,KAAK,MAAM,GAAG,UAAUA,oBAAmB,IAAI,QAAQ,CAAC,CAAC;AAC/D,UAAI,KAAK,GAAG;AACZ;AAAA,IACF;AACA,UAAM,WAAW,IAAI,IAAI,SAAS,CAAC;AACnC,QAAI,CAAC,YAAY,IAAI,eAAe,SAAS,aAAa,GAAG;AAC3D,eAAS;AAAA,IACX;AACA,QAAI,KAAK,GAAG;AAAA,EACd;AACA,WAAS;AACT,MAAI,eAAe;AACjB,gBAAY,OAAO,QAAQ,OAAO,mDAAmD,CAAC;AAAA,EACxF;AACA,SAAO,EAAE,OAAO,QAAQ,SAAS,OAAO;AAC1C;AAEA,IAAM,eAAuC;AAAA,EAC3C,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,IAAM,oBAA4C;AAAA,EAChD,IAAI;AAAA,EAAK,KAAK;AAAA,EAAK,IAAI;AAAA,EAAK,KAAK;AAAA,EAAK,MAAM;AAAA,EAAK,IAAI;AAAA,EAAK,IAAI;AAAA,EAAK,IAAI;AAAA,EACvE,IAAI;AAAA,EAAK,MAAM;AAAA,EAAK,IAAI;AAAA,EAAK,KAAK;AAAA,EAAK,MAAM;AAAA,EAAK,KAAK;AAAA,EAAK,MAAM;AAAA,EAClE,MAAM;AAAA,EAAK,KAAK;AAAA,EAAK,MAAM;AAAA,EAAK,IAAI;AAAA,EAAK,MAAM;AAAA,EAAK,KAAK;AAAA,EAAK,KAAK;AAAA,EACnE,KAAK;AAAA,EAAK,KAAK;AAAA,EAAK,KAAK;AAAA,EAAK,MAAM;AAAA,EAAK,KAAK;AAAA,EAAK,KAAK;AAC1D;AAEA,IAAM,WAAW,CACf,UACA,WACA,SACW;AACX,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,SAAS,UAAW,QAAO,YAAY,WAAM;AACjD,MAAI,UAAW,QAAO;AACtB,QAAM,OAAOK,UAAS,QAAQ,EAAE,YAAY;AAC5C,SAAO,aAAa,IAAI,KAAK,kBAAkBC,SAAQ,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK;AAC5E;AAEA,IAAM,iBAAiB,CACrB,OACA,OACA,YACgC;AAChC,QAAMC,WAAU,MAAM,SAAS,SAAS,QAAQ,SAAS,oBAAoB,QAAQ,SAAS;AAC9F,MAAI,CAAC,QAAQ,YAAY,CAACA,SAAS,QAAO;AAC1C,QAAM,SAAS,aAAa,KAAK,GAAG,QAAQ,UAAU,EAAE,KAAK;AAC7D,QAAM,cAAc,MAAM,SAAS,SAAS,oCAAoC;AAChF,MAAI,CAAC,UAAU,WAAW,aAAa;AACrC,WAAO;AAAA,MACL,OAAO,CAAC,MAAM,GAAG,SAAS,MAAM,SAAS,SAAS,UAAU,mBAAmB,iBAAiB,CAAC;AAAA,MACjG,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,MAAM,OAAO,MAAM,IAAI;AAC7B,MAAI,QAAQ,YAAY,CAACA,UAAS;AAChC,WAAO;AAAA,MACL,OAAO,IAAI,IAAI,CAAC,SAAS,MAAM,GAAG,cAAcP,oBAAmB,IAAI,KAAK,GAAG,CAAC;AAAA,MAChF,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,WAAW,eAAe,KAAK,UAAU,OAAO,OAAO,CAAC;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAkB,CAAC;AACvB,QAAM,QAAQ,MAAY;AACxB,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,aAAa,MAChB,OAAO,CAAC,SAAS,QAAQ,EAAE,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,EAAE,EACtE,KAAK,CAAC,SAAS,KAAK,SAAS,GAAG,CAAC;AACpC,UAAM,kBAAkB,oBAAI,IAAY;AACxC,eAAW,WAAW,OAAO;AAC3B,UAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,cAAM,KAAK,MAAM,GAAG,WAAWA,oBAAmB,OAAO,CAAC,CAAC;AAC3D;AAAA,MACF;AACA,UAAI,CAAC,SAAS;AACZ,cAAM,KAAK,EAAE;AACb;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,cAAM,UAAU,QAAQ,MAAM,MAAM,IAAI,CAAC,KAAK;AAC9C,cAAM,OAAO,QAAQ,MAAM,QAAQ,MAAM;AACzC,cAAMQ,aAAY,KAAK,SAAS,GAAG;AACnC,cAAM,OAAO,SAAS,MAAMA,YAAW,QAAQ,SAAS,SAAS;AACjE,cAAM,WAAW,OAAO,UAAU,OAAO;AACzC,cAAM;AAAA,UACJ,GAAG,MAAM,GAAG,OAAO,QAAQ,CAAC,GAAG,OAAO,MAAM,EAAE,GAAG,WAAW,MAAM,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QAC7F;AACA;AAAA,MACF;AACA,YAAM,QAAQ,QAAQ,QAAQ,SAAS,EAAE;AACzC,YAAM,YAAY,MAAM,SAAS,GAAG;AACpC,YAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAChE,UAAI,SAAS;AACb,eAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,cAAM,OAAO,MAAM,KAAK;AACxB,cAAM,OAAO,UAAU,MAAM,SAAS;AACtC,cAAM,MAAM,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AAC3C,cAAM,cAAc,CAAC,QAAQ;AAC7B,YAAI,CAAC,eAAe,CAAC,gBAAgB,IAAI,GAAG,GAAG;AAC7C,cAAI,YAAa,iBAAgB,IAAI,GAAG;AACxC,gBAAM,OAAO,SAAS,MAAM,aAAa,QAAQ,SAAS,SAAS;AACnE,gBAAM,SAAS,KAAK,OAAO,KAAK;AAChC,gBAAM,QAAQ,cACV,MAAM,GAAG,UAAU,GAAGR,oBAAmB,IAAI,CAAC,GAAG,IACjD,MAAM,GAAG,cAAcA,oBAAmB,IAAI,CAAC;AACnD,gBAAM,KAAK,GAAG,MAAM,GAAG,OAAO,SAAS,IAAI,CAAC,GAAG,OAAO,MAAM,EAAE,GAAG,KAAK,EAAE;AAAA,QAC1E;AACA,iBAAS;AAAA,MACX;AAAA,IACF;AACA,YAAQ,CAAC;AAAA,EACX;AACA,aAAW,SAAS,SAAS,SAAS;AACpC,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM;AACN,YAAM,KAAK,MAAM,GAAG,SAAS,aAAa,MAAM,MAAM,mBAAmB,CAAC;AAAA,IAC5E,OAAO;AACL,YAAM,KAAK,MAAM,IAAI;AAAA,IACvB;AAAA,EACF;AACA,QAAM;AACN,SAAO,EAAE,OAAO,QAAQ,SAAS,OAAO;AAC1C;AAEA,IAAM,aAAa,CACjB,OACA,OACA,YACgC;AAChC,QAAM,cAAc,MAAM,SAAS,SAC/B,sBAAsB,YAAY,KAAK,CAAC,IACxC;AACJ,QAAM,gBACJ,QAAQ,SAAS,sBAChB,gBAAgB,UAAU,gBAAgB,WAAW,gBAAgB,UAClE,QAAQ,SAAS,oBACjB,gBAAgB,SACd,QAAQ,SAAS,oBACjB,gBAAgB,OACd,QAAQ,SAAS,kBACjB;AACV,MAAI,CAAC,QAAQ,YAAY,CAAC,cAAe,QAAO;AAChD,QAAM,UAAU,YAAY,KAAK;AAKjC,QAAM,iBAAiBA,oBAAmB,QAAQ,QAAQ,SAAS,IAAI,CAAC;AACxE,QAAM,eAAe,eAAe,MAAM,IAAI;AAC9C,QAAM,qBAAqB,UACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IACA;AACJ,QAAM,QAAQ,aAAa,MAAM,CAAC,EAAE;AAAA,IAAI,CAAC,MAAM,UAC7C,GAAG,MAAM,GAAG,OAAO,IAAI,CAAC,GAAG,qBAAqB,QAAQ,CAAC,KAAK,MAAM,GAAG,UAAU,IAAI,CAAC;AAAA,EACxF;AACA,QAAM,SAAS,aAAa,KAAK,GAAG,QAAQ,UAAU,EAAE,KAAK;AAC7D,MAAI,CAAC,UAAU,WAAW,eAAe;AACvC,QAAI,CAAC,UAAU,MAAM,WAAW;AAG9B,aAAO,EAAE,OAAO,CAAC,GAAG,OAAO,MAAM,GAAG,OAAO,mCAAmC,CAAC,GAAG,QAAQ,EAAE;AAAA,IAC9F;AACA,WAAO;AAAA,MACL,OAAO,CAAC,GAAG,OAAO,MAAM,GAAG,SAAS,UAAU,WAAW,CAAC;AAAA,MAC1D,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,MAAM,OAAO,MAAM,IAAI;AAC7B,QAAM,WAAW,eAAe,KAAK,UAAU,OAAO,OAAO,CAAC;AAC9D,QAAM,UAAU,YAAY,QAAQ,SAAS,KAAK;AAClD,MAAI,QAAS,OAAM,KAAK,OAAO;AAC/B,aAAW,SAAS,SAAS,SAAS;AACpC,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,KAAK,MAAM,GAAG,SAAS,aAAa,MAAM,MAAM,mBAAmB,CAAC;AAC1E;AAAA,IACF;AACA,UAAM,OAAO,MAAM,GAAG,MAAM,YAAY,QAAQ,UAAU,SAASA,oBAAmB,MAAM,IAAI,KAAK,GAAG;AACxG,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,MAAI,gBAAgB,KAAK,GAAG;AAC1B,gBAAY,OAAO,QAAQ,OAAO,uBAAuB,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,EACnF;AACA,QAAM,iBAAiB,SAAS,cAAc,KAAK,GAAG,cAAc;AACpE,MAAI,eAAgB,aAAY,OAAO,QAAQ,OAAO,gBAAgBA,oBAAmB,cAAc,CAAC,EAAE,CAAC;AAC3G,SAAO,EAAE,OAAO,QAAQ,SAAS,OAAO;AAC1C;AAEO,IAAM,0BAA0B,CACrC,OACA,aAEA,gBAAgB,KAAK,KACrB,MAAM,SAAS,UACf,SAAS,MAAM,SAAS,MAAM,IAA4C;AAErE,IAAM,yBAAyB,CACpC,OACA,aACY;AACZ,MAAI,CAAC,wBAAwB,OAAO,QAAQ,EAAG,QAAO;AACtD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK,QAAQ;AACX,UAAI,CAAC,SAAS,kBAAmB,QAAO;AACxC,YAAM,UAAU,sBAAsB,YAAY,KAAK,CAAC;AACxD,UAAI,YAAY,UAAU,YAAY,WAAW,YAAY,SAAS;AACpE,eAAO,SAAS;AAAA,MAClB;AACA,UAAI,YAAY,OAAQ,QAAO,SAAS;AACxC,UAAI,YAAY,KAAM,QAAO,SAAS;AACtC,aAAO;AAAA,IACT;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,qBAAqB,CAChC,OACA,OACA,YACgC;AAChC,kBAAgB,KAAK;AACrB,MAAI,CAAC,wBAAwB,OAAO,QAAQ,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7E,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,OAAO;AAAA,IACzC,KAAK;AACH,aAAO,YAAY,OAAO,OAAO,OAAO;AAAA,IAC1C,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,OAAO;AAAA,IACzC,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,OAAO;AAAA,IACzC,KAAK;AAAA,IACL,KAAK;AACH,aAAO,eAAe,OAAO,OAAO,OAAO;AAAA,IAC7C,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,OAAO;AAAA,IACzC;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,gBAAgB,CAC3B,OACA,OACA,YACkB;AAClB,kBAAgB,KAAK;AACrB,MAAI,CAAC,wBAAwB,OAAO,QAAQ,QAAQ,KAAK,CAAC,MAAM,KAAM,QAAO;AAC7E,QAAM,QAAQ,MAAM,GAAG,aAAa,MAAM,KAAK,MAAM,IAAI,CAAC;AAC1D,QAAM,SAAS,QAAQ,SAAS,iBAC5B,uBAAuB,MAAM,WAAW,MAAM,OAAO,IACrD;AACJ,QAAM,WAAW,UAAU,OAAO,MAAM,KAAK;AAC7C,MAAI,MAAM,SAAS,QAAQ;AACzB,UAAM,UAAU,YAAY,KAAK;AACjC,UAAM,YAAY,QAAQ,MAAM,IAAI,EAAE,CAAC,KAAK;AAC5C,UAAM,WAAW;AACjB,UAAM,cAAc,YAAY,cAAc,WAAW,UAAU,QAAQ,UAAU,IAAI,CAAC,IAAI;AAC9F,UAAM,UAAU,SAAS,MAAM,MAAM,OAAO;AAC5C,UAAM,WAAW,QAAQ,SAAS,eAC9B,aAAa,OAAO,IACpB,CAAC;AACL,UAAM,SAAS;AACf,WAAO,GAAG,KAAK,IAAI,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,eAAe,MAAM,GAAG,UAAUA,oBAAmB,SAAS,CAAC,CAAC,GAAG,SAAS,OAAO;AAAA,MAC/H,YAAY,SAAY,WAAW,OAAO,MAAM;AAAA,MAChD,SAAS,SAAS,IAAI,UAAK,SAAS,KAAK,IAAI,CAAC,KAAK;AAAA,MACnD;AAAA,IACF,CAAC,CAAC;AAAA,EACJ;AACA,MAAI,MAAM,SAAS,QAAQ;AACzB,UAAM,UAAU,UAAU,OAAO,SAAS,KAAK;AAC/C,UAAM,OAAO,UAAU,OAAO,MAAM;AACpC,UAAM,QAAQ,SAAS,MAAM,MAAM,KAAK;AACxC,WAAO,GAAG,KAAK,IAAI,MAAM,GAAG,UAAU,IAAIA,oBAAmB,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,SAAS,IAAI,CAAC,IAAI,WAAW,YAAY,KAAK,QAAQ,KAAK,KAAK,CAAC,GAAG,SAAS,OAAO;AAAA,MACxK,OAAOA,oBAAmB,IAAI,IAAI;AAAA,MAClC,UAAU,SAAY,SAAS,KAAK,KAAK;AAAA,MACzC;AAAA,IACF,CAAC,CAAC;AAAA,EACJ;AACA,MAAI,MAAM,SAAS,QAAQ;AACzB,UAAM,UAAU,UAAU,OAAO,SAAS,KAAK;AAC/C,WAAO,GAAG,KAAK,IAAI,MAAM,GAAG,UAAUA,oBAAmB,OAAO,CAAC,CAAC,IAAI,MAAM,GAAG,SAAS,IAAI,CAAC,IAAI,WAAW,YAAY,KAAK,QAAQ,KAAK,KAAK,CAAC,GAAG,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC;AAAA,EAC9K;AACA,MAAI,MAAM,SAAS,MAAM;AACvB,WAAO,GAAG,KAAK,IAAI,WAAW,YAAY,KAAK,QAAQ,KAAK,KAAK,CAAC,GAAG,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC;AAAA,EAChG;AACA,MAAI,MAAM,SAAS,QAAQ;AACzB,UAAM,SAAS,SAAS,MAAM,MAAM,MAAM;AAC1C,UAAM,QAAQ,SAAS,MAAM,MAAM,KAAK;AACxC,UAAM,QAAQ,WAAW,UAAa,UAAU,SAC5C,MAAM,GAAG,WAAW,IAAI,UAAU,CAAC,GAAG,UAAU,SAAY,KAAK,UAAU,KAAK,QAAQ,CAAC,KAAK,EAAE,EAAE,IAClG;AACJ,WAAO,GAAG,KAAK,IAAI,WAAW,UAAU,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,GAAG,SAAS,OAAO;AAAA,MACpF,iBAAiB,QAAQ;AAAA,MACzB;AAAA,IACF,CAAC,CAAC;AAAA,EACJ;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,UAAM,UAAU,aAAa,KAAK;AAClC,UAAM,kBAAkB,SAAS,MAAM,OAAO;AAC9C,UAAM,aAAa,SAAS,iBAAiB,eAAe,MACzD,YAAY,SAAY,OAAO,WAAW,SAAS,MAAM,IAAI;AAChE,UAAM,YAAY,SAAS,iBAAiB,cAAc,MACvD,YAAY,SAAY,kBAAkB,OAAO,IAAI;AACxD,WAAO,GAAG,KAAK,IAAI,WAAW,UAAU,QAAQ,KAAK,KAAK,CAAC,GAAG,SAAS,OAAO;AAAA,MAC5E,eAAe,SAAY,YAAY,UAAU,IAAI;AAAA,MACrD,cAAc,SAAY,WAAW,WAAW,MAAM,IAAI;AAAA,MAC1D,iBAAiB,QAAQ;AAAA,MACzB;AAAA,IACF,CAAC,CAAC;AAAA,EACJ;AACA,SAAO,GAAG,KAAK,IAAI,WAAW,UAAU,QAAQ,KAAK,KAAK,CAAC,GAAG,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC;AACzF;;;AoB9kDA,SAAS,kBAAkB;AAI3B;AAAA,EACE;AAAA,EACA,mBAAAS;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,OAEK;AAgCP,IAAM,yBAAyB,OAAO;AAAA,EACpC,QAAQ,IAAI,+BAA+B;AAAA,EAC3C;AACF;AACA,IAAM,iBACJ,OAAO,SAAS,sBAAsB,KAAK,yBAAyB,IAChE,yBACA;AAEN,IAAM,oBAAoB;AAC1B,IAAM,4BAA4B;AAClC,IAAM,2BAA2B;AACjC,IAAM,kCAAkC;AACxC,IAAM,iCAAiC;AACvC,IAAM,iCAAiC;AACvC,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,kCAAkC;AAAA,EACtC;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AACxD;AACA,IAAM,eAAe;AAEd,IAAM,6BAA6B,CAAC,SACzC,KAAK,QAAQ,cAAc,CAAC,WAAW,kBAA0B;AAC/D,QAAM,aAAa,kBAAkB,KAAK,CAAC,GAAG,IAAI,cAAc,MAAM,GAAG;AACzE,QAAM,OAAiB,CAAC;AACxB,WAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS;AACtD,UAAM,YAAY,WAAW,KAAK;AAClC,UAAM,OAAO,OAAO,SAAS,WAAW,EAAE;AAC1C,QAAI,cAAc,KAAK;AACrB,WAAK,KAAK,GAAG,+BAA+B;AAAA,IAC9C,WAAW,UAAU,WAAW,KAAK,GAAG;AACtC;AAAA,IACF,WAAW,SAAS,MAAM,SAAS,IAAI;AACrC,YAAM,OAAO,WAAW,QAAQ,CAAC;AACjC,YAAM,MAAM,SAAS,SAAS,MAAM,IAAI,SAAS,MAAM,IAAI;AAC3D,WAAK,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,CAAC,CAAC;AAC7C,cAAQ;AAAA,IACV,WAAW,SAAS,IAAI;AACtB,YAAM,OAAO,WAAW,QAAQ,CAAC;AACjC,eAAS,SAAS,MAAM,IAAI,SAAS,MAAM,IAAI;AAAA,IACjD,WACE,SAAS,MACN,SAAS,KACR,QAAQ,MAAM,QAAQ,MACtB,QAAQ,OAAO,QAAQ,KAC3B;AACA;AAAA,IACF,OAAO;AACL,WAAK,KAAK,SAAS;AAAA,IACrB;AAAA,EACF;AACA,SAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,KAAK,GAAG,CAAC,MAAM;AACvD,CAAC;AAEI,IAAM,mBAAmB,CAAC,UAC/B,MAAM,QAAQ,8CAA8C,CAAC,cAAc;AACzE,QAAM,OAAO,UAAU,YAAY,CAAC,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,KAAK;AACxE,SAAO,MAAM,IAAI;AACnB,CAAC;AAEH,IAAM,sBAAsB,CAAC,MAAc,UAA0B;AACnE,QAAM,YAAYC,iBAAgB,MAAM,OAAO,EAAE;AACjD,MAAIC,cAAa,IAAI,KAAK,MAAO,QAAO;AACxC,MAAI,UAAU,SAAS,cAAc,GAAG;AACtC,WAAO,UAAU,MAAM,GAAG,CAAC,eAAe,MAAM,IAAI;AAAA,EACtD;AACA,SAAO,UAAU,SAAS,cAAc,IAAI,YAAY,YAAY;AACtE;AAEA,IAAM,kBAAN,MAAM,iBAAqC;AAAA,EAIzC,YACW,OACQ,OACA,gBAAyC,OACzC,iBACA,oBAAoB,OACrC;AALS;AACQ;AACA;AACA;AACA;AAAA,EAChB;AAAA,EATH;AAAA,EACA;AAAA,EAUA,OAAO,OAAyB;AAC9B,QAAI,KAAK,iBAAiB,SAAS,KAAK,YAAa,QAAO,KAAK;AACjE,QAAI,SAAS,EAAG,QAAO,KAAK,OAAO,OAAO,CAAC,CAAC;AAC5C,UAAM,iBAAiB,6BAA6B,KAAK,OAAO,KAAK,aAAa;AAClF,UAAM,OAAiB,CAAC;AACxB,aAAS,YAAY,GAAG,YAAY,KAAK,MAAM,QAAQ,aAAa;AAClE,YAAM,UAAU,KAAK,MAAM,SAAS;AACpC,YAAM,EAAE,MAAM,KAAK,IAAI,oBAAoB,OAAO;AAClD,UAAI,CAAC,MAAM;AACT,YAAI;AACJ,YAAI,KAAK,iBAAiB,IAAI,SAAS,GAAG;AACxC,gBAAM,qBAAqB,QAAQ,IAAI,OAAO;AAC9C,gBAAM,UAAU;AAAA,YACd;AAAA,YACA,KAAK,IAAI,GAAG,QAAQA,cAAa,kBAAkB,CAAC;AAAA,UACtD;AACA,yBAAe,QAAQ;AAAA,YACrB,CAAC,KAAK,UAAU;AAAA,cACd,UAAU,IAAI,MAAM,qBAAqB;AAAA,cACzC;AAAA,YACF;AAAA,UACF;AAAA,QACF,MAAO,gBAAe,CAAC,oBAAoB,MAAM,KAAK,CAAC;AACvD,aAAK,KAAK,GACR,KAAK,oBACD,aAAa,IAAI,0BAA0B,IAC3C,YACL;AACD;AAAA,MACF;AACA,YAAM,OAAO,KAAK,QAAQ,SAAI;AAC9B,YAAM,qBAAqB,OAAO,IAC9B,KACA,IAAI,OAAOA,cAAa,KAAK,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;AACpD,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACAA,cAAa,kBAAkB,IAAI,QAAQ,qBAAqB;AAAA,MAClE;AACA,iBAAW,OAAO,aAAa;AAC7B,cAAM,UAAU,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQA,cAAa,GAAG,CAAC,CAAC;AACjE,aAAK,KAAK,oBAAoB,MAAM,SAAS,eAAe,IAAI,CAAC,CAAC;AAAA,MACpE;AAAA,IACF;AACA,WAAO,KAAK,OAAO,OAAO,IAAI;AAAA,EAChC;AAAA,EAEA,aAAmB;AACjB,SAAK,eAAe;AACpB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,0BAA2C;AACzC,QAAI,KAAK,kBAAmB,QAAO;AACnC,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,OAAe,MAA0B;AAC9C,SAAK,eAAe;AACpB,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AACF;AAEA,IAAM,+BAAN,MAAwD;AAAA,EACtD,YAA6B,OAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,OAAO,OAAyB;AAC9B,WAAO,KAAK,MAAM,OAAO,KAAK,EAAE,IAAI,0BAA0B;AAAA,EAChE;AAAA,EAEA,aAAmB;AACjB,SAAK,MAAM,aAAa;AAAA,EAC1B;AACF;AAEO,IAAM,6BAA6B,CAAC,cACzC,qBAAqB,kBACjB,UAAU,wBAAwB,IAClC,IAAI,6BAA6B,SAAS;AAEzC,IAAM,qBAAqB,CAChC,OACA,OACA,gBAAyC,OACzC,oBACc,IAAI,gBAAgB,OAAO,OAAO,eAAe,eAAe;AAEzE,IAAM,2BAA2B,CAAC,aACvC,WAAW,2BAA2B;AAExC,IAAM,yBAAyB,CAC7B,QACA,aAC4D;AAC5D,QAAM,QAAQ,yBAAyB,QAAQ;AAC/C,MAAI,YAAY,OAAO,UAAU,OAAO;AACtC,WAAO,OAAO,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,OAAO,gBAAgB,EAAE,OAAO,WAAW,EAAE;AAAA,EAClF;AACA,QAAM,SAAS,OACZ,IAAI,CAAC,OAAO,gBAAgB,EAAE,OAAO,WAAW,EAAE,EAClD,OAAO,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY,MAAS;AACpD,QAAM,WAAW,IAAI;AAAA,IACnB,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,WAAW,MAAM,UAAU;AAAA,EACzD;AACA,WAAS,aAAa,GAAG,aAAa,OAAO,UAAU,SAAS,OAAO,OAAO,cAAc;AAC1F,QAAI,CAAC,SAAS,IAAI,UAAU,EAAG,UAAS,IAAI,UAAU;AAAA,EACxD;AACA,SAAO,CAAC,GAAG,QAAQ,EAChB,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK,EAClC,IAAI,CAAC,gBAAgB,EAAE,OAAO,OAAO,UAAU,GAAI,WAAW,EAAE;AACrE;AAGO,SAAS,WAAW,OAAsB;AAC/C,MAAI,OAAiB,CAAC;AACtB,MAAI;AACF,WAAO,eAAe,EAAE,QAAQ,iBAAiB;AAAA,EACnD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,QAAM,UAAU,KAAK,SAAS,IAAI,KAAK,KAAK,GAAG,IAAI;AACnD,SAAO,MAAM,GAAG,OAAO,GAAG,OAAO,YAAY;AAC/C;AAEA,IAAM,kBAAkB,CAAC,OAAe,QAAwB;AAC9D,QAAM,SAAS,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC/C,SAAO,OAAO,UAAU,MAAM,SAAS,GAAG,OAAO,MAAM,GAAG,MAAM,CAAC,CAAC;AACpE;AAEA,IAAMC,aAAY,CAAC,MAA+B,QAChD,OAAO,KAAK,GAAG,MAAM,WAAY,KAAK,GAAG,IAAe;AAE1D,IAAM,wBAAwB;AAC9B,IAAM,qBAAqB,oBAAI,QAA6C;AAE5E,IAAM,gBAAgB,CAAC,YACrB,UAAU,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAE9D,IAAMC,YAAW,CAAC,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAC9D,QACD;AAEN,IAAM,qBAAqB,CAAC,eAAqD;AAC/E,QAAM,OAAOA,UAAS,UAAU;AAChC,MAAI,CAAC,KAAM,QAAO,oBAAI,IAAI;AAC1B,QAAM,SAAS,mBAAmB,IAAI,IAAI;AAC1C,MAAI,OAAQ,QAAO;AAEnB,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,WAAW,CAAC,cAA6B;AAC7C,QAAI,OAAO,cAAc,SAAU,UAAS,IAAI,cAAc,SAAS,GAAG,SAAS;AAAA,EACrF;AACA,QAAM,eAAeA,UAAS,KAAK,QAAQ;AAC3C,MAAI,cAAc;AAChB,eAAW,SAAS,OAAO,OAAO,YAAY,EAAG,UAAS,KAAK;AAAA,EACjE;AACA,QAAM,UAAU,KAAK;AACrB,QAAM,OACJ,OAAO,YAAY,WACf,UACA,MAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,IAC1E,QAAQ,KAAK,IAAI,IACjB;AACR,MAAI,MAAM;AACR,eAAW,WAAW,qBAAqB,IAAI,EAAG,UAAS,OAAO;AAAA,EACpE;AACA,qBAAmB,IAAI,MAAM,QAAQ;AACrC,SAAO;AACT;AAEO,IAAM,4BAA4B,CACvC,QACA,eACwB;AACxB,QAAM,mBAAmB,OAAO,KAAK,CAAC,UAAU;AAC9C,UAAM,SAAS,MAAM,QAAQ,aAAaD,WAAU,MAAM,QAAQ,CAAC,GAAG,eAAe,IAAI;AACzF,WAAO,QAAQ,UAAU,sBAAsB,KAAK,MAAM,CAAC;AAAA,EAC7D,CAAC;AACD,MAAI,CAAC,iBAAkB,QAAO;AAE9B,QAAM,WAAW,mBAAmB,UAAU;AAC9C,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,QAAI,MAAM,QAAQ,cAAc,CAAC,MAAM,KAAM,QAAO;AACpD,UAAM,SAASA,WAAU,MAAM,MAAM,eAAe;AACpD,QAAI,CAAC,UAAU,CAAC,sBAAsB,KAAK,MAAM,EAAG,QAAO;AAC3D,UAAM,EAAE,eAAe,gBAAgB,GAAG,kBAAkB,IAAI,MAAM;AACtE,UAAM,UAAU,SAAS,IAAI,MAAM;AACnC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,UAAU,EAAE,GAAG,mBAAmB,QAAQ,IAAI;AAAA,IACtD;AAAA,EACF,CAAC;AACH;AAWA,IAAM,0BAA0B,CAC9B,MACA,SACA,UACA,OACA,YACA,WACwC;AACxC,MAAI,QAAQ;AACV,UAAM,WAAW;AAAA,MACf,EAAE,KAAK,aAAa,UAAU,OAAO,MAAM,SAAS,MAAM,EAAE,MAAM,QAAQ,EAAE;AAAA,MAC5E;AAAA,MACA;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,UAAU,OAAO;AAAA,QACjB;AAAA,QACA,UAAU;AAAA,QACV,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACrC;AAAA,IACF;AACA,QAAI,SAAU,QAAO;AAAA,EACvB;AACA,QAAM,WAAW,iBAAiB,OAAO,EAAE,MAAM,IAAI;AACrD,SAAO,SAAS,SAAS,KAAK,SAAS,SAAS,SAAS,CAAC,MAAM,GAAI,UAAS,IAAI;AACjF,QAAM,QAAQ,WAAW,KAAK,IAAI,SAAS,QAAQ,GAAG,IAAI;AAC1D,QAAM,QAAQ,SAAS,MAAM,GAAG,KAAK;AACrC,QAAM,OAAO,iBAAiB,IAAI;AAClC,QAAM,cAAc,QAAQ,MAAM,SAAS,IACvC,cAAc,MAAM,KAAK,IAAI,GAAG,MAAM,UAAU,IAChD;AACJ,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,MAAI,CAAC,MAAM,UACtB,cAAc,KAAK,KAAK,MAAM,GAAG,cAAc,QAAQ,GAAG;AAAA,IAC5D;AAAA,IACA,QAAQ,SAAS,SAAS,MAAM;AAAA,EAClC;AACF;AAEO,IAAM,mCAAmC,CAC9C,OACA,OACA,eACqB;AACrB,QAAM,YAAY,MAAM,SAAS;AAAA,IAC/B,CAAC,YAAY,MAAM,WAAW,QAAQ,SAAS;AAAA,EACjD;AACA,MAAI,cAAc;AAClB,WAAS,QAAQ,GAAG,QAAQ,UAAU,QAAQ,SAAS;AACrD,QAAI,OAAO,UAAU,KAAK,MAAM,SAAU,eAAc;AAAA,EAC1D;AACA,MAAI,cAAc,EAAG,QAAO;AAE5B,MAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,UAAM,UAAU,MAAM,SAAS,CAAC;AAChC,UAAME,QAAO;AAAA,MACX;AAAA,QACE;AAAA,UACE,KAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAM;AAAA,UACN,MAAM,EAAE,MAAM,QAAQ,MAAM,SAAS,UAAU,CAAC,KAAK,GAAG;AAAA,QAC1D;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,OAAO,MAAM,WAAW,EAAE,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,IAAI;AAAA,MAC/E;AAAA,IACF;AACA,UAAM,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,UAAU,CAAC,KAAK;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM,OAAO,MAAM,WAAW,EAAE,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,IAAI;AAAA,IAC/E;AACA,IAAAA,MAAK,KAAK,GAAG,KAAK,KAAK;AACvB,QAAI,KAAK,SAAS,GAAG;AACnB,MAAAA,MAAK;AAAA,QACH,MAAM,GAAG,OAAO,UAAK,KAAK,MAAM,SAAS,KAAK,WAAW,IAAI,SAAS,OAAO,EAAE,KAC5E,MAAM,WAAW,KAAK,MAAM,GAAG,OAAO,QAAK,IAAI,WAAW,KAAK;AAAA,MACpE;AAAA,IACF;AACA,WAAO,mBAAmBA,KAAI;AAAA,EAChC;AAEA,QAAM,YAAY,KAAK;AAAA,IACrB;AAAA,IACA,UAAU,OAAO,CAAC,UAAU,OAAO,UAAU,QAAQ,EAAE,SAAS;AAAA,EAClE;AACA,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,MACJ;AAAA,MACA,gCAAwB,SAAS,IAAI,MAAM,SAAS,MAAM;AAAA,IAC5D;AAAA,EACF;AACA,QAAM,YAAY,yBAAyB,MAAM,QAAQ;AACzD,QAAM,gBAAgB,MAAM,SAAS,MAAM,GAAG,SAAS;AACvD,WAAS,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS;AACzD,UAAM,UAAU,cAAc,KAAK;AACnC,UAAM,QACJ,UAAU,eAAe,OAAO,UAAU,KAAK,MAAM,WACjD,MAAM,GAAG,OAAO,QAAG,IACnB,UAAU,cACR,MAAM,GAAG,WAAW,MAAM,WAAW,QAAG,IACxC,MAAM,GAAG,OAAO,QAAG;AAC3B,SAAK;AAAA,MACH,GAAG,KAAK,IAAI;AAAA,QACV;AAAA,UACE,KAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,YACJ,MAAM,QAAQ;AAAA,YACd,GAAI,OAAO,UAAU,KAAK,MAAM,WAAW,EAAE,SAAS,UAAU,KAAK,EAAE,IAAI,CAAC;AAAA,UAC9E;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,OAAO,MAAM,WAAW,EAAE,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,IAAI;AAAA,MAC/E,CAAC;AAAA,IACH;AACA,QAAI,UAAU,aAAa;AACzB,YAAM,OAAO;AAAA,QACX,QAAQ;AAAA,QACR,UAAU,KAAK,KAAK;AAAA,QACpB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,MAAM,OAAO,MAAM,WAAW,EAAE,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,IAAI;AAAA,MAC/E;AACA,iBAAW,QAAQ,KAAK,MAAO,MAAK,KAAK,KAAK,IAAI,EAAE;AACpD,UAAI,KAAK,SAAS,GAAG;AACnB,aAAK;AAAA,UACH,MAAM,GAAG,OAAO,YAAO,KAAK,MAAM,SAAS,KAAK,WAAW,IAAI,SAAS,OAAO,EAAE;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,MAAM,SAAS,SAAS,cAAc;AACrD,MAAI,SAAS,GAAG;AACd,SAAK;AAAA,MACH,MAAM,GAAG,OAAO,UAAK,MAAM,SAAS,WAAW,IAAI,UAAU,QAAQ,EAAE,KACpE,MAAM,WAAW,KAAK,MAAM,GAAG,OAAO,QAAK,IAAI,WAAW,KAAK;AAAA,IACpE;AAAA,EACF;AACA,SAAO,mBAAmB,IAAI;AAChC;AAEA,IAAM,YAAY,CAAC,UACjB,OAAO,UAAU,WAAW,MAAM,MAAM,GAAG,CAAC,IAAI;AAElD,IAAM,UAAU,CAAC,WACf,MAAM,QAAQ,MAAM,IAAI,OAAO,OAAO,MAAM,IAAI;AAElD,IAAM,qBAAqB,CACzB,UACA,MACA,MACA,QACA,SACA,oBACW;AACX,MAAI,aAAa,UAAU;AACzB,QAAI,gBAAiB,QAAO;AAC5B,UAAM,OAAOF,WAAU,MAAM,MAAM;AACnC,UAAM,cAAc,yBAAyB,OAAO,IAAI,QAAQ,OAAO;AACvE,UAAM,KAAK,UAAU,KAAK,EAAE;AAC5B,UAAM,UAAUA,WAAU,MAAM,SAAS;AACzC,UAAM,OAAOA,WAAU,MAAM,MAAM;AACnC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,QAAQ;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,eAAe,QAAQ,MAAM;AAAA,MACtC,KAAK;AAAA,MACL,KAAK;AACH,eAAO,CAAC,eAAe,QAAQ,IAAI,UAAU,gBAAgB,SAAS,EAAE,IAAI,EAAE,EAC3E,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AACH,eAAO,SAAS,OAAO,gBAAgB,MAAM,EAAE,IAAI,eAAe;AAAA,MACpE,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,QAAQ,MAAM;AAAA,MACvB;AACE,eAAO,eAAe,MAAM;AAAA,IAChC;AAAA,EACF;AACA,MAAI,aAAa,QAAQ;AACvB,QAAI,gBAAiB,QAAO;AAC5B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAOA,WAAU,MAAM,OAAO,KAAK;AAAA,MACrC,KAAK;AACH,eAAO,CAACA,WAAU,MAAM,OAAO,GAAG,QAAQ,MAAM,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAAA,MAC/E,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAOA,WAAU,MAAM,KAAK,KAAK;AAAA,MACnC,KAAK;AACH,eAAO,CAACA,WAAU,MAAM,QAAQ,GAAG,QAAQ,MAAM,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAAA,MAChF,KAAK;AACH,eAAO,QAAQ,MAAM;AAAA,MACvB;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACA,MAAI,aAAa,OAAO;AACtB,QAAI,gBAAiB,QAAO;AAC5B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,CAACA,WAAU,MAAM,QAAQ,GAAGA,WAAU,MAAM,MAAM,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtF,KAAK;AACH,eAAOA,WAAU,MAAM,MAAM,KAAK;AAAA,MACpC,KAAK;AACH,eAAO,QAAQ,MAAM;AAAA,MACvB;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,uBAAuB,CAC3B,UACA,MACA,MACA,WACW;AACX,MAAI,aAAa,SAAU,QAAO;AAClC,QAAM,QAAQ,QAAQ,MAAM;AAC5B,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,CAACA,WAAU,MAAM,UAAU,GAAGA,WAAU,MAAM,WAAW,GAAG,KAAK,EACrE,OAAO,OAAO,EACd,KAAK,QAAK;AAAA,IACf,KAAK;AACH,aAAOA,WAAU,MAAM,KAAK,KAAK;AAAA,IACnC,KAAK;AAAA,IACL,KAAK,qBAAqB;AACxB,YAAM,YAAY,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AACxE,YAAM,aAAa,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAC3E,aAAO;AAAA,QACL,cAAc,SAAY,GAAG,SAAS,IAAI,cAAc,IAAI,SAAS,OAAO,KAAK;AAAA,QACjF,eAAe,SAAY,GAAG,UAAU,IAAI,eAAe,IAAI,UAAU,QAAQ,KAAK;AAAA,MACxF,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAAA,IAC9B;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,sBAAsB,CAAC,UAAiD;AAC5E,QAAM,MAAM,MAAM;AAClB,QAAM,WAAW,MAAM,YAAY,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AACxD,QAAM,OAAO,MAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AAChD,QAAM,OAAO,MAAM,QAAQ,CAAC;AAC5B,SAAO,mBAAmB,UAAU,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,KACtE,YAAY,IAAI,KAChB,qBAAqB,UAAU,MAAM,MAAM,MAAM,MAAM;AAC9D;AAEA,IAAM,wBAAwB,CAAC,UAAsC;AACnE,MAAI,MAAM,oBAAoB,KAAM,QAAO;AAC3C,QAAM,SAAS,MAAM;AACrB,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,UAAW,OAAmC;AACpD,MAAI,OAAO,YAAY,YAAY,YAAY,KAAM,QAAO;AAC5D,QAAM,aAAc,QAAoC;AACxD,MAAI,OAAO,eAAe,YAAY,eAAe,KAAM,QAAO;AAClE,SAAQ,WAAuC,cAAc;AAC/D;AAGO,SAAS,gBACd,OACA,OACA,YACA,MACQ;AACR,QAAM,QAAQ,oBAAoB,OAAO,OAAO,YAAY,IAAI;AAChE,SAAO,sBAAsB,KAAK,IAC9B,GAAG,KAAK,IAAI,MAAM,GAAG,WAAW,gBAAa,CAAC,KAC9C;AACN;AAEA,IAAM,sBAAsB,CAC1B,OACA,OACA,YACA,SACW;AACX,QAAM,YAAY,OACd,cAAc,OAAO,OAAO,EAAE,GAAG,MAAM,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC,EAAG,CAAC,IAC9E;AACJ,MAAI,UAAW,QAAO;AACtB,QAAM,SAAS,MAAM,SAAS,iBAC1B,uBAAuB,MAAM,WAAW,MAAM,OAAO,IACrD;AACJ,QAAM,aAAa,CAAC,UAClB,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,SAAM,MAAM,EAAE,CAAC,KAAK;AAC1D,QAAM,MAAM,MAAM;AAClB,QAAM,WAAW,MAAM,YAAY,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AACxD,QAAM,OAAO,MAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AAChD,QAAM,QAAQ,MAAM,GAAG,aAAa,MAAM,KAAK,IAAI,CAAC;AACpD,QAAM,OAAO,MAAM,QAAQ,CAAC;AAC5B,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,MAAI,eAAgB,QAAO,WAAW,GAAG,KAAK,IAAI,MAAM,GAAG,UAAU,cAAc,CAAC,EAAE;AACtF,QAAM,UAAUA,WAAU,MAAM,SAAS;AACzC,MAAI,SAAS;AACX,UAAM,YAAY,QAAQ,MAAM,IAAI,EAAE,CAAC,KAAK;AAC5C,UAAM,cACJ,UAAU,SAAS,IAAI,cAAc,WAAW,QAAQ,UAAU,IAAI;AACxE,UAAM,MACJ,eAAe,YAAY,CAAC,IAAI,YAAY,CAAC,IAAI,MAAM,GAAG,UAAU,SAAS;AAC/E,WAAO,WAAW,GAAG,KAAK,IAAI,MAAM,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAC7D;AACA,QAAM,OAAOA,WAAU,MAAM,MAAM;AACnC,QAAM,UAAUA,WAAU,MAAM,SAAS;AACzC,QAAM,OAAOA,WAAU,MAAM,MAAM;AACnC,MAAI,SAAS;AACb,MAAI,KAAM,UAAS;AAAA,WACV,QAAS,UAAS,IAAI,OAAO,IAAI,OAAO,IAAI,IAAI,KAAK,EAAE;AAAA,WACvD,KAAM,UAAS,gBAAgB,MAAM,EAAE;AAAA,OAC3C;AACH,aAAS,YAAY,IAAI,KACpB,qBAAqB,UAAU,MAAM,MAAM,MAAM,MAAM,KACvD,MAAM,mBACN;AAAA,EACP;AACA,SAAO,WAAW,SAAS,GAAG,KAAK,IAAI,MAAM,GAAG,UAAU,MAAM,CAAC,KAAK,KAAK;AAC7E;AAEA,IAAM,sBAAsB,CAAC,UAAoD;AAC/E,QAAM,UAAU,MAAM,YAAY,MAAM;AACxC,QAAM,aAAa,QAAQ,YAAY;AACvC,QAAM,OAAO,eAAe,SACxB,SACA,CAAC,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,IAAI,EAAE,SAAS,UAAU,IACzE,aACA;AACN,QAAM,UAAU,MAAM,QAAQ,CAAC;AAC/B,QAAM,OAAgC,EAAE,GAAG,QAAQ;AACnD,MAAI,OAAO,QAAQ,cAAc,YAAY,OAAO,KAAK,SAAS,UAAU;AAC1E,SAAK,OAAO,QAAQ;AAAA,EACtB;AACA,MAAI,SAAS,UAAU,CAAC,MAAM,QAAQ,KAAK,KAAK,GAAG;AACjD,UAAM,UAAU,OAAO,QAAQ,eAAe,WAAW,QAAQ,aAAa;AAC9E,UAAM,UAAU,OAAO,QAAQ,eAAe,WAAW,QAAQ,aAAa;AAC9E,QAAI,YAAY,UAAa,YAAY,OAAW,MAAK,QAAQ,CAAC,EAAE,SAAS,QAAQ,CAAC;AAAA,EACxF;AACA,SAAO;AAAA,IACL,KAAK,OAAO,IAAI;AAAA,IAChB,UAAU;AAAA,IACV;AAAA,IACA,GAAI,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAC/C,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,IAC7D,GAAI,MAAM,WAAW,YAAY,EAAE,SAAS,MAAM,WAAW,SAAS,IAAI,CAAC;AAAA,EAC7E;AACF;AAEA,IAAM,iCAAiC;AAUvC,IAAM,qBAAqB,CAAC,QAA4B,UACtD,WAAW,YACP,MAAM,GAAG,WAAW,QAAG,IACvB,WAAW,WACT,MAAM,GAAG,SAAS,QAAG,IACrB,MAAM,GAAG,OAAO,QAAG;AAI3B,IAAM,uBAAuB,CAC3B,MACA,UACuB;AACvB,MAAI,OACF,KAAK,QAAQ,KAAK,CAAC,UAAU,MAAM,WAAW,SAAS,KAAK,KAAK,SAAS,CAAC;AAC7E,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,CAAC,KAAK,IAAI;AACxB,WAAS,QAAQ,GAAG,QAAQ,gCAAgC,SAAS,GAAG;AACtE,UAAM,OACJ,KAAK,QAAQ,KAAK,CAAC,UAAU,MAAM,WAAW,SAAS,KAAK,KAAK,SAAS,CAAC;AAC7E,QAAI,CAAC,KAAM;AACX,WAAO;AACP,UAAM,KAAK,KAAK,IAAI;AAAA,EACtB;AAIA,QAAM,cAAc,KAAK,MAAM,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,SAAS;AAC3F,QAAM,YAAY,eAAe,KAAK,MAAM,GAAG,EAAE;AACjD,QAAM,QAAQ,MACX,IAAI,CAAC,SAAS,MAAM,GAAG,UAAU,iBAAiB,IAAI,CAAC,CAAC,EACxD,KAAK,MAAM,GAAG,OAAO,UAAK,CAAC;AAC9B,QAAM,OAAO,YACT,MAAM,GAAG,OAAO,UAAK,IAAI,gBAAgB,oBAAoB,SAAS,GAAG,KAAK,IAC9E;AAGJ,QAAM,QACJ,KAAK,WAAW,aAAa,KAAK,WAAW,WACzC,GAAG,mBAAmB,KAAK,QAAQ,KAAK,CAAC,MACzC;AACN,SAAO,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAChC;AAEO,IAAM,8BAA8B,CACzC,OACA,OACA,YACa;AACb,MAAI,CAAC,yBAAyB,MAAM,OAAO,EAAG,QAAO,CAAC;AACtD,SAAO,gCAAgC,MAAM,SAAS,OAAO,SAAS,CAAC;AACzE;AAEA,IAAM,kCAAkC,CACtC,SACA,OACA,SACA,UACa;AACb,QAAM,iBAAiB,iBAAiB,QAAQ,QAAQ,EAAE,EAAE,KAAK;AACjE,QAAM,gBAAgB,iBAClB,QAAQ,UACN,CAAC,eAAe,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,IAC3C,eAAe,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS;AAC3C,UAAM,aAAa,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAClD,QAAI,CAAC,WAAY,QAAO,CAAC,EAAE;AAC3B,UAAM,aAAa,MAAM,KAAK,UAAU;AACxC,UAAM,SAAmB,CAAC;AAC1B,aACM,SAAS,GACb,SAAS,WAAW,QACpB,UAAU,iCACV;AACA,aAAO,KAAK,WAAW,MAAM,QAAQ,SAAS,+BAA+B,EAAE,KAAK,EAAE,CAAC;AAAA,IACzF;AACA,WAAO;AAAA,EACT,CAAC,IACH,CAAC;AACL,QAAM,QAAQ,QAAQ,cAAc,QAAQ,CAAC,IAAI,QAAQ;AAKzD,QAAM,kBACJ,CAAC,QAAQ,YACT,QAAQ,cAAc,SACtB,QAAQ,WAAW,UACnB,QAAQ,OAAO,SAAS,IACpB,qBAAqB,SAAS,KAAK,IACnC;AACN,QAAM,cAAc,MAAM,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,SAAS;AACtF,QAAM,aAAa,MAAM,GAAG,EAAE;AAC9B,QAAM,uBACJ,CAAC,QAAQ,YAAY,oBAAoB,SAAY,cAAc;AACrE,QAAM,uBACJ,yBAAyB,UAAa,oBAAoB,SAAY,CAAC,IAAI;AAC7E,QAAM,eACJ,QAAQ,YAAY,oBAAoB,SACpC,QAAQ,WACN,QACA,CAAC,IACH,uBACE,CAAC,oBAAoB,IACrB,cAAc,WAAW,KAAK,aAC5B,CAAC,UAAU,IACX,CAAC;AACX,QAAM,UAAU,MAAM,GAAG,OAAO,QAAG;AACnC,QAAM,QAAkB,CAAC;AAEzB,aAAW,gBAAgB,sBAAsB;AAC/C,UAAM,OAAO,MAAM,GAAG,cAAc,gBAAgB,GAAG;AACvD,UAAM,KAAK,MAAM,WAAW,IAAI,GAAG,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE;AAAA,EACpE;AAEA,WAAS,YAAY,GAAG,YAAY,aAAa,QAAQ,aAAa;AACpE,UAAM,QAAQ,aAAa,SAAS;AACpC,UAAM,cAAc,oBAAoB,KAAK;AAC7C,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,KAAK,GAAG,OAAO,IAAI,KAAK,EAAE;AAAA,IAClC,OAAO;AACL,YAAM,QAAQ,MAAM,WAAW,YAC3B,MAAM,GAAG,WAAW,QAAG,IACvB,MAAM,WAAW,WACf,MAAM,GAAG,SAAS,QAAG,IACrB,MAAM,GAAG,OAAO,QAAG;AACzB,YAAM,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE;AAAA,IAClC;AACA,QACE,CAAC,QAAQ,YACT,CAAC,QAAQ,QACT,YAAY,aAAa,SAAS,+BAClC;AACF,UAAM,OAAO,mBAAmB,aAAa,OAAO;AAAA,MAClD,KAAK,QAAQ,KAAK;AAAA,MAClB,UAAU,QAAQ,KAAK;AAAA,MACvB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,GAAI,QAAQ,aAAa,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;AAAA,IACjE,CAAC;AACD,QAAI,CAAC,KAAM;AACX,eAAW,OAAO,KAAK,MAAO,OAAM,KAAK,OAAO,GAAG,EAAE;AACrD,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,KAAK,MAAM,GAAG,OAAO,cAAS,KAAK,MAAM,aAAa,CAAC;AAAA,IAC/D;AAAA,EACF;AAEA,MAAI,oBAAoB,UAAa,MAAM,WAAW,GAAG;AACvD,UAAM,KAAK,GAAG,OAAO,IAAI,eAAe,EAAE;AAAA,EAC5C;AAEA,MAAI,QAAQ,YAAY,QAAQ,cAAc,SAAS,QAAQ,UAAU,QAAQ,OAAO,SAAS,GAAG;AAClG,QAAI,QAAQ,gCAAgC;AAC1C,iBAAW,SAAS,QAAQ,QAAQ;AAClC,cAAM,SACJ,MAAM,UAAU,MAAM,WAAW,cAC7B,MAAM,GAAG,OAAO,SAAM,iBAAiB,MAAM,MAAM,CAAC,EAAE,IACtD;AACN,cAAM,cACJ,MAAM,eAAe,MAAM,WAAW,YAClC,MAAM,GAAG,OAAO,SAAM,iBAAiB,MAAM,WAAW,CAAC,EAAE,IAC3D;AACN,cAAM;AAAA,UACJ,KAAK,mBAAmB,MAAM,QAAQ,KAAK,CAAC,IAAI,MAAM,GAAG,UAAU,iBAAiB,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,WAAW;AAAA,QACzH;AACA,cAAM,aAAa;AAAA,UACjB;AAAA,UACA;AAAA,UACA,EAAE,GAAG,SAAS,MAAM,OAAU;AAAA,UAC9B,QAAQ;AAAA,QACV;AACA,mBAAW,OAAO,WAAY,OAAM,KAAK,KAAK,GAAG,EAAE;AAAA,MACrD;AACA,UAAI,QAAQ,iBAAiB;AAC3B,cAAM,KAAK,MAAM,GAAG,OAAO,uCAAkC,CAAC;AAAA,MAChE;AAAA,IACF,OAAO;AACL,YAAM,KAAK,MAAM,GAAG,OAAO,uCAAkC,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AACT;AAoBO,IAAM,yBAAyB,CACpC,UACA,iBACW,YAAY,aAAa,WAAW,IAAI,iBAAiB,QAAQ,IAAI;AAE3E,IAAM,yBAAyB,CAAC,aAA6B;AAClE,QAAM,QAAQ,iBAAiB,QAAQ,EACpC,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAC9C,OAAO,OAAO;AACjB,QAAM,SAAS,MAAM,MAAM,SAAS,CAAC,KAAK;AAC1C,MAAI,MAAM,UAAU,EAAG,QAAO;AAC9B,SAAO,UAAK,MAAM,SAAS,CAAC,IAAI,MAAM,WAAW,IAAI,SAAS,OAAO,SAAM,MAAM;AACnF;AAEO,IAAM,+BAA+B,CAC1C,OACA,OACA,eACc;AACd,QAAM,OAAO,MAAM,OAAO,OAAO,CAAC,UAAU,MAAM,YAAY,MAAS,EAAE;AACzE,MAAI,SAAS,MAAM;AAAA,IACjB;AAAA,IACA,UAAK,MAAM,iBAAiB,QAAQ,iBAAc,IAAI,IAAI,MAAM,OAAO,MAAM;AAAA,EAC/E;AACA,QAAM,WAAW,MAAM,WAAW,uBAAuB,MAAM,QAAQ,IAAI;AAC3E,MAAI,SAAU,WAAU,MAAM,GAAG,OAAO,SAAM,QAAQ,EAAE;AAExD,QAAM,OAAO,CAAC,MAAM;AACpB,QAAM,kBAAkB,MAAM,WAAW,oBAAI,IAAY,IAAI;AAC7D,MAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,SAAK,KAAK,MAAM,GAAG,OAAO,MAAM,OAAO,IAAI,CAAC,UAAU,UAAK,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC;AAAA,EACjF;AAEA,QAAM,aAAa,uBAAuB,MAAM,QAAQ,MAAM,QAAQ;AACtE,WAAS,eAAe,GAAG,eAAe,WAAW,QAAQ,gBAAgB;AAC3E,UAAM,EAAE,OAAO,WAAW,IAAI,WAAW,YAAY;AACrD,QAAI,MAAM,YAAY,eAAe,EAAG,MAAK,KAAK,EAAE;AACpD,UAAM,QACJ,MAAM,YAAY,SACd,MAAM,GAAG,WAAW,MAAM,WAAW,QAAG,IACxC,MAAM,YAAY,QAChB,MAAM,GAAG,SAAS,QAAG,IACrB,MAAM,GAAG,OAAO,QAAG;AAC3B,UAAM,eAAe,4BAA4B,OAAO,OAAO;AAAA,MAC7D,UAAU,MAAM;AAAA,MAChB,SAAS,CAAC,MAAM;AAAA,MAChB,WAAW,MAAM;AAAA,MACjB,MAAM,MAAM;AAAA,MACZ,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACrC,CAAC;AACD,QAAI,UAAU,GAAG,KAAK,IAAI,gBAAgB,OAAO,OAAO,YAAY,MAAM,IAAI,CAAC;AAC/E,QAAI,MAAM,YAAY,SAAS,MAAM,OAAO;AAC1C,iBAAW,IAAI,MAAM,GAAG,OAAO,QAAG,CAAC,IAAI,MAAM,GAAG,SAAS,gBAAgB,iBAAiB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC;AAAA,IAC/G,WAAW,aAAa,CAAC,GAAG;AAC1B,iBAAW,IAAI,aAAa,CAAC,CAAC;AAAA,IAChC;AACA,QAAI,aAAa,SAAS,EAAG,kBAAiB,IAAI,KAAK,MAAM;AAC7D,SAAK,KAAK,OAAO;AACjB,QAAI,MAAM,YAAY,SAAS,MAAM,SAAS,eAAe,YAAY;AACvE,iBAAW,QAAQ,MAAM,QAAQ,KAAK,MAAM,IAAI,EAAG,MAAK,KAAK,KAAK,IAAI,EAAE;AACxE,UAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,aAAK;AAAA,UACH,MAAM;AAAA,YACJ;AAAA,YACA,YAAO,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,WAAW,IAAI,SAAS,OAAO;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,YAAY,SAAS,aAAa,SAAS,GAAG;AACtD,iBAAW,QAAQ,aAAa,MAAM,CAAC,GAAG;AACxC,yBAAiB,IAAI,KAAK,MAAM;AAChC,aAAK,KAAK,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,OAAO,SAAS,WAAW;AACrD,MAAI,cAAc,GAAG;AACnB,UAAM,QAAQ,UAAK,WAAW,WAAW,gBAAgB,IAAI,SAAS,OAAO;AAC7E,SAAK;AAAA,MACH,MAAM,GAAG,OAAO,KAAK,KAClB,MAAM,WAAW,KAAK,MAAM,GAAG,OAAO,QAAK,IAAI,WAAW,KAAK;AAAA,IACpE;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,MAAM,SAAS,iBAAiB;AAAA,IACtC;AAAA,EACF;AACF;AAMA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,IAAI,CAAC;AAEhF,IAAM,gCAAgC,CAC3C,QACA,WAAoC,CAAC,MACT;AAC5B,QAAM,QAAQ,SAAS,MAAM;AAC7B,SAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,QACE,CAAC,MAAM,QACP,CAAC,gBAAgB,IAAI,MAAM,IAAI,KAC9B,MAAM,aAAa,SAAS,MAAM,QAAQ,OAAO,MAAM,IAAI,GAC5D,QAAO,CAAC;AACV,UAAM,OAAOA,WAAU,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC/C,UAAM,QAAQ,MAAM;AAAA,MAClB,CAAC,cACC,UAAU,QAAQ,MAAM,OACxBA,WAAU,UAAU,QAAQ,CAAC,GAAG,MAAM,MAAM;AAAA,IAChD;AACA,UAAM,MAAM,SAAS,IAAI,MAAM,OAAO,OAAO,CAAC,EAAE,CAAC,IAAI;AACrD,WAAO,CAAC;AAAA,MACN,GAAI,OAAO,CAAC;AAAA,MACZ,GAAG;AAAA,MACH,MAAM,EAAE,GAAI,KAAK,QAAQ,CAAC,GAAI,GAAI,MAAM,QAAQ,CAAC,EAAG;AAAA,MACpD,GAAI,MAAM,WAAW,SACjB,EAAE,QAAQ,MAAM,OAAO,IACvB,KAAK,WAAW,SACd,EAAE,QAAQ,IAAI,OAAO,IACrB,CAAC;AAAA,MACP,GAAI,MAAM,YAAY,SAClB,EAAE,SAAS,MAAM,QAAQ,IACzB,KAAK,YAAY,SACf,EAAE,SAAS,IAAI,QAAQ,IACvB,CAAC;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACH;AAEO,IAAM,gCAAgC,CAC3C,QACA,aACwB;AACxB,QAAM,YAAY,SAAS,MAAM;AACjC,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,QACE,CAAC,MAAM,QACP,CAAC,gBAAgB,IAAI,MAAM,IAAI,KAC9B,MAAM,aAAa,SAAS,MAAM,QAAQ,OAAO,MAAM,IAAI,GAC5D,QAAO;AACT,UAAM,OAAOA,WAAU,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC/C,QAAI,QAAQ,UAAU;AAAA,MACpB,CAACG,aACCA,SAAQ,QAAQ,MAAM,OACtBH,WAAUG,SAAQ,QAAQ,CAAC,GAAG,MAAM,MAAM;AAAA,IAC9C;AACA,QAAI,QAAQ,EAAG,SAAQ,UAAU,UAAU,CAACA,aAAYA,SAAQ,QAAQ,MAAM,GAAG;AACjF,QAAI,QAAQ,EAAG,QAAO;AACtB,UAAM,UAAU,UAAU,OAAO,OAAO,CAAC,EAAE,CAAC;AAC5C,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,MAAM,EAAE,GAAI,QAAQ,QAAQ,CAAC,GAAI,GAAI,MAAM,QAAQ,CAAC,EAAG;AAAA,MACvD,GAAI,MAAM,WAAW,SACjB,EAAE,QAAQ,MAAM,OAAO,IACvB,QAAQ,WAAW,SACjB,EAAE,QAAQ,QAAQ,OAAO,IACzB,CAAC;AAAA,MACP,GAAI,MAAM,YAAY,SAClB,EAAE,SAAS,MAAM,QAAQ,IACzB,QAAQ,YAAY,SAClB,EAAE,SAAS,QAAQ,QAAQ,IAC3B,CAAC;AAAA,MACP,GAAI,MAAM,oBAAoB,SAC1B,EAAE,iBAAiB,MAAM,gBAAgB,IACzC,QAAQ,oBAAoB,SAC1B,EAAE,iBAAiB,QAAQ,gBAAgB,IAC3C,CAAC;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAQO,IAAM,6BAA6B,CACxC,QACA,WAAiC,CAAC,MACT;AACzB,QAAM,WAAW,SAAS,MAAM;AAChC,QAAM,UAAU,IAAI;AAAA,IAClB,SAAS,IAAI,CAAC,SAAS,UAAU,CAAC,GAAG,QAAQ,GAAG,KAAK,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,EAC3E;AACA,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,yBAAyB,MAAM,OAAO,EAAG;AAC9C,UAAM,QAAQ,EAAE,KAAK,MAAM,KAAK,IAAI,MAAM,QAAQ,IAAI,SAAS,MAAM,QAAQ;AAC7E,UAAM,MAAM,GAAG,MAAM,GAAG,KAAK,MAAM,EAAE;AACrC,UAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,QAAI,UAAU,QAAW;AACvB,cAAQ,IAAI,KAAK,SAAS,MAAM;AAChC,eAAS,KAAK,KAAK;AAAA,IACrB,MAAO,UAAS,KAAK,IAAI;AAAA,EAC3B;AACA,SAAO;AACT;AAEO,IAAM,6BAA6B,CACxC,QACA,aACwB;AACxB,QAAM,YAAY,SAAS,MAAM;AACjC,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,QAAI,yBAAyB,MAAM,OAAO,EAAG,QAAO;AACpD,UAAM,cAAcH,WAAU,MAAM,QAAQ,CAAC,GAAG,IAAI;AACpD,QAAI,QAAQ,cACR,UAAU,UAAU,CAACG,aAAYA,SAAQ,QAAQ,MAAM,OAAOA,SAAQ,OAAO,WAAW,IACxF;AACJ,QAAI,QAAQ,EAAG,SAAQ,UAAU,UAAU,CAACA,aAAYA,SAAQ,QAAQ,MAAM,GAAG;AACjF,QAAI,QAAQ,EAAG,QAAO;AACtB,UAAM,UAAU,UAAU,OAAO,OAAO,CAAC,EAAE,CAAC;AAC5C,WAAO,UAAU,EAAE,GAAG,OAAO,SAAS,QAAQ,QAAQ,IAAI;AAAA,EAC5D,CAAC;AACH;AAQO,IAAM,6BAA6B,CAAC,WACzC,OAAO,QAAQ,CAAC,UAAU;AACxB,QAAM,kBACJ,OAAO,MAAM,YAAY,YAAY,MAAM,YAAY,QAAQ,CAAC,MAAM,QAAQ,MAAM,OAAO,IACtF,MAAM,UACP;AACN,QAAM,UAAU,MAAM,SAAS,UAC1B,OAAO,iBAAiB,iBAAiB,WACtC,gBAAgB,eAChBH,WAAU,MAAM,QAAQ,CAAC,GAAG,SAAS,IACzC;AACJ,MAAI,YAAY,OAAW,QAAO,CAAC;AACnC,SAAO,CAAC,EAAE,KAAK,MAAM,KAAK,MAAMA,WAAU,MAAM,QAAQ,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;AAChF,CAAC;AAUI,IAAM,oCAAoC,CAC/C,WAEA,OAAO,QAAQ,CAAC,UAAU;AACxB,QAAM,WAAW,oBAAoB,KAAK;AAC1C,SAAO,WAAW,CAAC,EAAE,KAAK,MAAM,KAAK,SAAS,CAAC,IAAI,CAAC;AACtD,CAAC;AAEI,IAAM,oCAAoC,CAC/C,QACA,aACwB;AACxB,QAAM,YAAY,SAAS,MAAM;AACjC,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,UAAM,QAAQ,UAAU,UAAU,CAACG,aAAYA,SAAQ,QAAQ,MAAM,GAAG;AACxE,QAAI,QAAQ,EAAG,QAAO;AACtB,UAAM,CAAC,OAAO,IAAI,UAAU,OAAO,OAAO,CAAC;AAC3C,QAAI,YAAY,MAAM,IAAI,KAAK,CAAC,QAAS,QAAO;AAChD,WAAO,EAAE,GAAG,OAAO,iBAAiB,QAAQ,SAAS;AAAA,EACvD,CAAC;AACH;AAIO,IAAM,6BAA6B,CACxC,QACA,aACwB;AACxB,QAAM,YAAY,SAAS,MAAM;AACjC,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,QAAI,MAAM,SAAS,WAAW,OAAO,MAAM,MAAM,YAAY,SAAU,QAAO;AAC9E,UAAM,OAAOH,WAAU,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC/C,UAAM,QAAQ,UAAU;AAAA,MACtB,CAACG,aAAYA,SAAQ,QAAQ,MAAM,OAAOA,SAAQ,SAAS;AAAA,IAC7D;AACA,QAAI,QAAQ,EAAG,QAAO;AACtB,UAAM,CAAC,OAAO,IAAI,UAAU,OAAO,OAAO,CAAC;AAC3C,WAAO,UACH,EAAE,GAAG,OAAO,MAAM,EAAE,GAAI,MAAM,QAAQ,CAAC,GAAI,SAAS,QAAQ,QAAQ,EAAE,IACtE;AAAA,EACN,CAAC;AACH;AAGO,SAAS,eAAe,OAA8C;AAC3E,MAAI,MAAM,SAAS,WAAW,OAAO,MAAM,MAAM,YAAY,UAAU;AACrE,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,QAAM,SAAS,MAAM;AACrB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,WAAW,QAAQ,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,UAAM,MAAM;AACZ,QAAI,OAAO,IAAI,WAAW,SAAU,QAAO,IAAI;AAC/C,QAAI,OAAO,IAAI,SAAS,SAAU,QAAO,IAAI;AAAA,EAC/C;AACA,SAAO;AACT;AAmBA,IAAMC,sBAAqB,CAAC,SAC1B,KACG,QAAQ,SAAS,QAAG,EACpB,QAAQ,OAAO,QAAG,EAClB,QAAQ,qCAAqC,QAAG;AAIrD,IAAM,WAAW,CAAC,UAAoB,aAAmC;AACvE,QAAM,IAAI,SAAS;AACnB,QAAM,IAAI,SAAS;AACnB,MAAI,IAAI,IAAI,KAAW;AACrB,WAAO;AAAA,MACL,GAAG,SAAS,IAAI,CAAC,UAAU,EAAE,MAAM,KAAc,SAAS,KAAK,EAAE;AAAA,MACjE,GAAG,SAAS,IAAI,CAAC,UAAU,EAAE,MAAM,KAAc,SAAS,KAAK,EAAE;AAAA,IACnE;AAAA,EACF;AACA,QAAM,KAAiB,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,GAAG,MAAM,IAAI,MAAc,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3F,WAASC,KAAI,IAAI,GAAGA,MAAK,GAAGA,MAAK;AAC/B,UAAM,UAAU,SAASA,EAAC,KAAK;AAC/B,UAAM,MAAM,GAAGA,EAAC;AAChB,UAAM,OAAO,GAAGA,KAAI,CAAC;AACrB,aAASC,KAAI,IAAI,GAAGA,MAAK,GAAGA,MAAK;AAC/B,YAAM,UAAU,SAASA,EAAC,KAAK;AAC/B,UAAIA,EAAC,IACH,YAAY,WACP,KAAKA,KAAI,CAAC,KAAK,KAAK,IACrB,KAAK,IAAI,KAAKA,EAAC,KAAK,GAAG,IAAIA,KAAI,CAAC,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,QAAM,MAAkB,CAAC;AACzB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,IAAI,GAAG;AACrB,UAAM,UAAU,SAAS,CAAC,KAAK;AAC/B,UAAM,UAAU,SAAS,CAAC,KAAK;AAC/B,QAAI,YAAY,SAAS;AACvB,UAAI,KAAK,EAAE,MAAM,KAAK,SAAS,QAAQ,CAAC;AACxC;AACA;AAAA,IACF,YAAY,GAAG,IAAI,CAAC,EAAG,CAAC,KAAK,OAAO,GAAG,CAAC,EAAG,IAAI,CAAC,KAAK,IAAI;AACvD,UAAI,KAAK,EAAE,MAAM,KAAK,SAAS,QAAQ,CAAC;AACxC;AAAA,IACF,OAAO;AACL,UAAI,KAAK,EAAE,MAAM,KAAK,SAAS,QAAQ,CAAC;AACxC;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI,GAAG;AACZ,QAAI,KAAK,EAAE,MAAM,KAAK,SAAS,SAAS,CAAC,KAAK,GAAG,CAAC;AAClD;AAAA,EACF;AACA,SAAO,IAAI,GAAG;AACZ,QAAI,KAAK,EAAE,MAAM,KAAK,SAAS,SAAS,CAAC,KAAK,GAAG,CAAC;AAClD;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,eACd,OACA,OACA,YACiB;AACjB,MAAI,MAAM,SAAS,OAAQ,QAAO;AAClC,QAAM,OAAO,MAAM,QAAQ,CAAC;AAC5B,QAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AACxD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,OAAO,iBAAiB,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,MAAS;AACnF,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,MAAM,MAAM,GAAG,CAAC,GAAG;AACpC,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,UAAM,SAAS;AACf,UAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACtE,UAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACtE,UAAM,OAAO,SAAS,QAAQ,MAAM,IAAI,GAAG,QAAQ,MAAM,IAAI,CAAC;AAC9D,QAAI,KAAK,WAAW,EAAG;AAGvB,UAAM,iBAAiB,OACnB;AAAA,MACE,KAAK,OAAO,CAAC,UAAU,MAAM,SAAS,GAAG,EAAE,IAAI,CAAC,UAAU,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,MAClF;AAAA,MACA;AAAA,IACF,IACA;AACJ,UAAM,iBAAiB,OACnB;AAAA,MACE,KAAK,OAAO,CAAC,UAAU,MAAM,SAAS,GAAG,EAAE,IAAI,CAAC,UAAU,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,MAClF;AAAA,MACA;AAAA,IACF,IACA;AACJ,QAAI,YAAY;AAChB,QAAI,YAAY;AAChB,aAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS;AAChD,YAAM,QAAQ,KAAK,KAAK;AACxB,UAAI;AACJ,UAAI,MAAM,SAAS,KAAK;AACtB,eAAO,iBAAiB,WAAW;AAAA,MACrC,WAAW,MAAM,SAAS,KAAK;AAC7B,eAAO,iBAAiB,WAAW;AAAA,MACrC,OAAO;AACL;AACA,eAAO,iBAAiB,WAAW;AAAA,MACrC;AACA,YAAM,UACJ,QAAQ,OAAO,QAAQ,MAAM,MAAM,GAAG,cAAcF,oBAAmB,MAAM,OAAO,KAAK,GAAG;AAC9F,UAAI,MAAM,SAAS,KAAK;AACtB,cAAM,KAAK,GAAG,MAAM,GAAG,iBAAiB,GAAG,CAAC,IAAI,OAAO,EAAE;AAAA,MAC3D,WAAW,MAAM,SAAS,KAAK;AAC7B,cAAM,KAAK,GAAG,MAAM,GAAG,mBAAmB,GAAG,CAAC,IAAI,OAAO,EAAE;AAAA,MAC7D,OAAO;AACL,cAAM,KAAK,GAAG,MAAM,GAAG,mBAAmB,GAAG,CAAC,IAAI,OAAO,EAAE;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAEA,IAAM,mBAAmB,CAAC,UAA0B;AAClD,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,MAAI,MAAM,MAAM;AAChB,SAAO,MAAM,GAAG;AACd,UAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,QAAI,SAAS,UAAa,KAAK,KAAK,MAAM,GAAI;AAAA,QACzC;AAAA,EACP;AACA,SAAO;AACT;AAKO,SAAS,cACd,QACA,QACA,OACQ;AACR,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,aAAa,iBAAiB,MAAM;AAC1C,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,OAAQ;AAC3B,UAAM,OAAO,eAAe,KAAK;AACjC,QAAI,OAAO,SAAS,SAAU;AAC9B,cAAU;AACV,iBAAa,iBAAiB,IAAI;AAAA,EACpC;AACA,MAAI,CAAC,WAAW,cAAc,UAAW,QAAO;AAChD,SAAO,MAAM,GAAG,WAAW,YAAO,aAAa,SAAS,YAAY,iBAAiB;AACvF;;;ACx4CA,IAAM,sBAAsB;AAE5B,IAAM,iBAAiB,CAAC,UAAK,UAAK,UAAK,QAAG;AAMnC,IAAM,eAAe,CAAC,MAAM,KAAK,IAAI,MAC1C,eAAe,KAAK,MAAM,MAAM,mBAAmB,IAAI,eAAe,MAAM;AAEvE,IAAM,gBAAgB,CAC3B,OACA,QACA,YACA,MAAM,KAAK,IAAI,MACJ;AACX,MAAI,CAAC,QAAQ;AACX,QAAI,MAAM,MAAO,cAAa,MAAM,KAAK;AACzC,WAAO,MAAM;AACb,WAAO,aAAa,GAAG;AAAA,EACzB;AACA,MAAI,CAAC,MAAM,OAAO;AAChB,UAAM,QAAQ,sBAAuB,MAAM;AAC3C,UAAM,QAAQ,WAAW,MAAM;AAC7B,aAAO,MAAM;AACb,iBAAW;AAAA,IACb,GAAG,KAAK;AACR,UAAM,MAAM,QAAQ;AAAA,EACtB;AACA,SAAO,aAAa,GAAG;AACzB;",
|
|
6
|
+
"names": ["readFileSync", "statSync", "basename", "extname", "bundledLanguages", "escapeControlChars", "escapeControlChars", "i", "j", "tokenWeight", "tokenWeight", "changedLineAt", "changedLinePositions", "beforeIndex", "afterIndex", "index", "tokenAt", "hasWordChangeRanges", "hasWordChangeRanges", "MAX_HIGHLIGHT_CHARS", "escapeControlChars", "bundledLanguages", "statSync", "readFileSync", "header", "basename", "extname", "enabled", "directory", "truncateToWidth", "visibleWidth", "truncateToWidth", "visibleWidth", "argString", "recordOf", "rows", "preview", "escapeControlChars", "i", "j"]
|
|
7
|
+
}
|