likec4 1.59.4 → 1.61.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.
Files changed (186) hide show
  1. package/README.md +2 -0
  2. package/__app__/codegen/react.mjs +4 -10
  3. package/__app__/codegen/webcomponent.mjs +6 -131
  4. package/__app__/index.html +15 -15
  5. package/__app__/src/aichat/index.mjs +11 -7
  6. package/__app__/src/chunks/AIChat.mjs +1355 -739
  7. package/__app__/src/chunks/ErrorComponent.mjs +444 -0
  8. package/__app__/src/chunks/Header.mjs +269 -0
  9. package/__app__/src/chunks/ViewReact.mjs +438 -0
  10. package/__app__/src/chunks/find.mjs +38 -0
  11. package/__app__/src/chunks/hooks.mjs +158 -472
  12. package/__app__/src/chunks/libs/@tabler/icons-react.mjs +340 -0
  13. package/__app__/src/chunks/libs/@tanstack-ai.mjs +11841 -1417
  14. package/__app__/src/chunks/libs/@tanstack.mjs +5110 -2404
  15. package/__app__/src/chunks/libs/fast-equals.mjs +507 -214
  16. package/__app__/src/chunks/libs/html-to-image.mjs +613 -0
  17. package/__app__/src/chunks/libs/nanostores.mjs +170 -0
  18. package/__app__/src/chunks/libs/react-resizable-panels.mjs +2792 -0
  19. package/__app__/src/chunks/react.mjs +22 -0
  20. package/__app__/src/chunks/rolldown-runtime.mjs +16 -29
  21. package/__app__/src/chunks/router.mjs +106 -0
  22. package/__app__/src/chunks/scope.mjs +106 -0
  23. package/__app__/src/chunks/searchParams.mjs +29 -0
  24. package/__app__/src/chunks/single-index.mjs +465 -0
  25. package/__app__/src/chunks/styled-system.mjs +1826 -2528
  26. package/__app__/src/chunks/useAsync.mjs +69 -0
  27. package/__app__/src/chunks/useSyncedRef.mjs +16 -0
  28. package/__app__/src/components/ColorSchemeToggle.mjs +124 -0
  29. package/__app__/src/components/CopyToClipboard.mjs +53 -0
  30. package/__app__/src/components/ErrorComponent.mjs +1 -0
  31. package/__app__/src/components/NavigationPanel.mjs +63 -0
  32. package/__app__/src/components/NotFound.mjs +155 -0
  33. package/__app__/src/components/ViewOutlet.mjs +9 -0
  34. package/__app__/src/components/model-diff/CompareModelProvider.mjs +44 -0
  35. package/__app__/src/components/model-diff/ModelDiffPanel.mjs +179 -0
  36. package/__app__/src/components/model-diff/compare-model.mjs +76 -0
  37. package/__app__/src/components/model-diff/state.mjs +45 -0
  38. package/__app__/src/components/search/OverviewSearch.mjs +92 -0
  39. package/__app__/src/components/search/OverviewSearchAdapter.mjs +94 -0
  40. package/__app__/src/components/sidebar/DiagramTree.css.mjs +48 -0
  41. package/__app__/src/components/sidebar/DiagramsTree.mjs +304 -0
  42. package/__app__/src/components/sidebar/Drawer.mjs +178 -0
  43. package/__app__/src/components/sidebar/SidebarBurger.mjs +28 -0
  44. package/__app__/src/components/sidebar/data.mjs +94 -0
  45. package/__app__/src/components/sidebar/state.mjs +16 -0
  46. package/__app__/src/components/view-page/Header.mjs +1 -0
  47. package/__app__/src/components/view-page/SelectProject.mjs +258 -0
  48. package/__app__/src/components/view-page/ShareModal.mjs +111 -0
  49. package/__app__/src/components/view-page/share-modal/AlertLocalhost.mjs +31 -0
  50. package/__app__/src/components/view-page/share-modal/CopyButtonChild.mjs +36 -0
  51. package/__app__/src/components/view-page/share-modal/EmbedPanel.mjs +100 -0
  52. package/__app__/src/components/view-page/share-modal/WebcomponentsPanel.mjs +264 -0
  53. package/__app__/src/components/view-page/state.mjs +17 -0
  54. package/__app__/src/context/LikeC4CustomizationContext.mjs +26 -0
  55. package/__app__/src/context/LikeC4IconRendererContext.mjs +29 -0
  56. package/__app__/src/context/LikeC4ModelContext.mjs +34 -0
  57. package/__app__/src/context/LikeC4ProjectsContext.mjs +40 -0
  58. package/__app__/src/context/ModelDiffsContext.mjs +33 -0
  59. package/__app__/src/context/safeCtx.mjs +14 -0
  60. package/__app__/src/fonts.css +112 -1
  61. package/__app__/src/hooks.mjs +1 -0
  62. package/__app__/src/main.mjs +6 -29151
  63. package/__app__/src/pages/EmbedPage.mjs +93 -0
  64. package/__app__/src/pages/ExportPage.mjs +691 -0
  65. package/__app__/src/pages/ProjectsOverview.mjs +23 -0
  66. package/__app__/src/pages/ViewAsD2.mjs +105 -0
  67. package/__app__/src/pages/ViewAsDot.mjs +65 -0
  68. package/__app__/src/pages/ViewAsMmd.mjs +109 -0
  69. package/__app__/src/pages/ViewAsPuml.mjs +105 -0
  70. package/__app__/src/pages/ViewEditor.mjs +220 -0
  71. package/__app__/src/pages/ViewReact.mjs +1 -0
  72. package/__app__/src/pages/export-layout.mjs +95 -0
  73. package/__app__/src/pages/export-page-params.mjs +9 -0
  74. package/__app__/src/pages/styles.css.mjs +23 -0
  75. package/__app__/src/routeTree.gen.mjs +105 -0
  76. package/__app__/src/router.mjs +1 -0
  77. package/__app__/src/routes/__root.mjs +65 -0
  78. package/__app__/src/routes/index.css.mjs +29 -0
  79. package/__app__/src/routes/index.mjs +32 -0
  80. package/__app__/src/routes/project._projectId/-components.mjs +100 -0
  81. package/__app__/src/routes/project._projectId/embed._viewId.mjs +5 -0
  82. package/__app__/src/routes/project._projectId/export._viewId.mjs +24 -0
  83. package/__app__/src/routes/project._projectId/index.mjs +14 -0
  84. package/__app__/src/routes/project._projectId/route.mjs +93 -0
  85. package/__app__/src/routes/project._projectId/view._viewId.d2.mjs +34 -0
  86. package/__app__/src/routes/project._projectId/view._viewId.dot.mjs +41 -0
  87. package/__app__/src/routes/project._projectId/view._viewId.index.mjs +7 -0
  88. package/__app__/src/routes/project._projectId/view._viewId.mjs +23 -0
  89. package/__app__/src/routes/project._projectId/view._viewId.mmd.mjs +39 -0
  90. package/__app__/src/routes/project._projectId/view._viewId.puml.mjs +34 -0
  91. package/__app__/src/routes/projects.mjs +36 -0
  92. package/__app__/src/routes/single-index.mjs +1 -0
  93. package/__app__/src/routes/webcomponent._.mjs +94 -0
  94. package/__app__/src/style.css +18497 -1
  95. package/config/schema.json +146 -97
  96. package/dist/app/render-view-client.css +1 -1
  97. package/dist/app/render-view-client.js +394 -238
  98. package/dist/chunks/enableServer.mjs +1 -1
  99. package/dist/chunks/filenames.mjs +25 -17
  100. package/dist/chunks/generate-likec4.mjs +5 -0
  101. package/dist/chunks/index.d.mts +255 -194
  102. package/dist/chunks/index2.d.mts +8246 -3610
  103. package/dist/chunks/libs/@chenglou/pretext.mjs +9 -0
  104. package/dist/chunks/libs/@chevrotain/gast.mjs +27 -1
  105. package/dist/chunks/libs/@chevrotain/regexp-to-ast.mjs +81 -9
  106. package/dist/chunks/libs/@logtape/logtape.mjs +5 -4
  107. package/dist/chunks/libs/@lume/kiwi.mjs +1 -1
  108. package/dist/chunks/libs/@ts-graphviz/common.d.mts +2 -4
  109. package/dist/chunks/libs/@ts-graphviz/core.mjs +1 -1
  110. package/dist/chunks/libs/birpc.mjs +1 -1
  111. package/dist/chunks/libs/chevrotain-allstar.mjs +2 -2
  112. package/dist/chunks/libs/chevrotain.mjs +88 -36
  113. package/dist/chunks/libs/clone.mjs +1 -0
  114. package/dist/chunks/libs/eventemitter3.mjs +1 -1
  115. package/dist/chunks/libs/fast-equals.mjs +1 -0
  116. package/dist/chunks/libs/fontkit.mjs +1 -0
  117. package/dist/chunks/libs/json5.mjs +4 -4
  118. package/dist/chunks/libs/langium.d.mts +6707 -6715
  119. package/dist/chunks/libs/langium.mjs +16 -24
  120. package/dist/chunks/libs/merge-error-cause.mjs +1 -1
  121. package/dist/chunks/libs/p-limit.mjs +1 -0
  122. package/dist/chunks/libs/p-queue.mjs +1 -1
  123. package/dist/chunks/libs/package-manager-detector.mjs +1 -1
  124. package/dist/chunks/libs/pako.mjs +1 -1
  125. package/dist/chunks/libs/pathe.mjs +1 -1
  126. package/dist/chunks/libs/pretty-ms.mjs +1 -1
  127. package/dist/chunks/libs/remeda.mjs +1 -1
  128. package/dist/chunks/libs/ufo.mjs +1 -1
  129. package/dist/chunks/libs/unstorage.mjs +1 -1
  130. package/dist/chunks/libs/which.mjs +1 -1
  131. package/dist/chunks/node.mjs +111 -77
  132. package/dist/chunks/rolldown-runtime.mjs +1 -1
  133. package/dist/chunks/sequence-view.mjs +1 -1
  134. package/dist/chunks/vite-plugin.mjs +185 -166
  135. package/dist/cli/index.mjs +254 -1306
  136. package/dist/config/index.d.mts +66 -5
  137. package/dist/config/index.mjs +1 -1
  138. package/dist/generators/likec4.d.mts +6530 -0
  139. package/dist/generators/likec4.mjs +1 -0
  140. package/dist/index.d.mts +2 -4
  141. package/dist/model/index.d.mts +0 -7
  142. package/dist/vite-plugin/index.d.mts +83 -58
  143. package/dist/vite-plugin/index.mjs +1 -1
  144. package/dist/vite-plugin/internal/chunks/rolldown-runtime.mjs +8 -0
  145. package/dist/vite-plugin/internal/index.d.mts +92 -17
  146. package/dist/vite-plugin/internal/index.mjs +225 -126
  147. package/generators/likec4/package.json +4 -0
  148. package/package.json +134 -122
  149. package/react/index.d.mts +7496 -26659
  150. package/react/index.mjs +533 -63936
  151. package/react/rolldown-runtime-CfRud99p.js +1 -0
  152. package/skills/likec4-dsl/SKILL.md +474 -0
  153. package/skills/likec4-dsl/evals/evals-public.json +207 -0
  154. package/skills/likec4-dsl/evals/grading-spec.json +603 -0
  155. package/skills/likec4-dsl/references/bridge-leanix-drawio.md +42 -0
  156. package/skills/likec4-dsl/references/cli.md +168 -0
  157. package/skills/likec4-dsl/references/configuration.md +266 -0
  158. package/skills/likec4-dsl/references/deployment.md +160 -0
  159. package/skills/likec4-dsl/references/diffs.md +52 -0
  160. package/skills/likec4-dsl/references/dynamic-views.md +455 -0
  161. package/skills/likec4-dsl/references/examples.md +370 -0
  162. package/skills/likec4-dsl/references/identifier-validity.md +90 -0
  163. package/skills/likec4-dsl/references/include-predicates-wildcards.md +180 -0
  164. package/skills/likec4-dsl/references/model.md +182 -0
  165. package/skills/likec4-dsl/references/predicates.md +123 -0
  166. package/skills/likec4-dsl/references/relationships-bidirectional.md +176 -0
  167. package/skills/likec4-dsl/references/specification.md +79 -0
  168. package/skills/likec4-dsl/references/style-tokens-colors.md +150 -0
  169. package/skills/likec4-dsl/references/troubleshooting.md +101 -0
  170. package/skills/likec4-dsl/references/views.md +329 -0
  171. package/vite-plugin-modules.d.ts +126 -51
  172. package/__app__/src/chunks/LikeC4Styles.mjs +0 -2306
  173. package/__app__/src/chunks/ProjectsOverview.mjs +0 -537
  174. package/__app__/src/chunks/es.mjs +0 -439
  175. package/__app__/src/chunks/libs/@floating-ui.mjs +0 -2532
  176. package/__app__/src/chunks/libs/@mantine.mjs +0 -13868
  177. package/__app__/src/chunks/libs/@xstate/react.mjs +0 -2015
  178. package/__app__/src/chunks/libs/@xyflow/react.mjs +0 -5367
  179. package/__app__/src/chunks/libs/bezier-js.mjs +0 -1007
  180. package/__app__/src/chunks/libs/d3.mjs +0 -2817
  181. package/__app__/src/chunks/libs/framer.mjs +0 -5926
  182. package/__app__/src/chunks/libs/zod.mjs +0 -3176
  183. package/dist/chunks/libs/@chevrotain/types.d.mts +0 -108
  184. package/dist/chunks/libs/picomatch.mjs +0 -1
  185. package/dist/chunks/libs/zod.d.mts +0 -3840
  186. package/dist/chunks/libs/zod.mjs +0 -65
@@ -1,106 +1,140 @@
1
- import{c as e,i as t,r,t as o}from"./rolldown-runtime.mjs";import{a as s,i as c,n as u,o as d,r as p,t as m}from"./libs/@logtape/logtape.mjs";import{n as h,t as g}from"./libs/merge-error-cause.mjs";import{n as _,t as v}from"./sequence-view.mjs";import{$ as y,A as b,B as x,C as ee,D as te,E as S,F as ne,G as re,H as C,I as ie,J as w,K as ae,L as oe,M as se,N as ce,O as le,P as ue,Q as de,R as fe,S as pe,T as me,U as he,V as T,W as ge,X as _e,Y as ve,Z as ye,_t as be,a as xe,at as Se,bt as Ce,c as we,ct as Te,d as Ee,dt as De,et as Oe,f as ke,ft as Ae,g as je,gt as Me,h as Ne,ht as Pe,i as Fe,it as Ie,j as Le,k as Re,l as ze,lt as Be,m as Ve,mt as He,n as Ue,nt as We,o as Ge,ot as Ke,p as qe,pt as Je,q as Ye,r as Xe,rt as Ze,st as Qe,t as $e,tt as et,u as tt,ut as nt,v as rt,vt as it,w as at,x as ot,y as st,yt as ct,z as lt}from"./libs/langium.mjs";import{a as ut,d as dt,f as ft,i as pt,l as mt,n as ht,o as gt,r as _t,t as vt,u as yt}from"./libs/ufo.mjs";import{t as bt}from"./libs/json5.mjs";import{A as xt,C as St,D as E,E as Ct,T as D,b as k,g as A,h as wt,l as j,p as Tt,t as Et,u as Dt,v as Ot,w as kt,y as At,z as jt}from"./libs/zod.mjs";import{a as Mt,c as Nt,d as Pt,n as Ft,r as It,s as Lt,t as Rt}from"./filenames.mjs";import{n as zt,t as Bt}from"./libs/pathe.mjs";import{$ as M,A as Vt,B as Ht,C as Ut,D as Wt,E as Gt,F as Kt,G as qt,H as Jt,I as Yt,J as Xt,K as Zt,L as Qt,M as $t,N as en,O as tn,P as N,Q as nn,R as rn,S as an,T as on,U as sn,W as cn,X as ln,Y as un,Z as P,_ as dn,a as fn,at as pn,b as F,c as mn,d as hn,et as gn,f as _n,g as vn,h as yn,i as bn,it as xn,j as I,k as L,l as Sn,m as Cn,n as wn,nt as Tn,o as En,ot as Dn,p as On,r as kn,rt as An,s as jn,t as Mn,tt as R,u as Nn,v as Pn,w as z,x as Fn,y as In,z as Ln}from"./libs/remeda.mjs";import{t as Rn}from"./libs/@ts-graphviz/core.mjs";import{n as zn,r as Bn,t as Vn}from"./libs/@ts-graphviz/ast.mjs";import{n as Hn,r as Un,t as Wn}from"./libs/khroma.mjs";import{t as Gn}from"./libs/p-queue.mjs";import{t as Kn}from"./libs/which.mjs";import{t as qn}from"./libs/pretty-ms.mjs";import{t as Jn}from"./libs/picomatch.mjs";import{n as Yn,t as Xn}from"./libs/unstorage.mjs";import*as Zn from"node:fs/promises";import{unlink as Qn,writeFile as $n}from"node:fs/promises";import{basename as er,dirname as tr,join as nr,relative as rr,resolve as ir}from"node:path";import{BorderStyles as ar,ElementShapes as or,IconPositions as sr,LikeC4Styles as cr,RelationshipArrowTypes as lr,RelationshipLineTypes as ur,Sizes as dr,ThemeColors as fr,assignTagColors as pr,computeColorValues as mr}from"@likec4/core/styles";import{Fqn as hr,FqnExpr as gr,FqnRef as _r,_stage as vr,_type as yr,exact as br,isAnyOf as xr,isExtendsElementView as Sr}from"@likec4/core/types";import{Builder as Cr,assertSpecificationCompatible as wr}from"@likec4/core/builder";import*as V from"@likec4/core";import{DefaultMap as Tr,Fqn as Er,FqnExpr as Dr,FqnRef as H,GlobalFqn as Or,LikeC4Styles as kr,LinkedList as Ar,RelationExpr as jr,RichText as Mr,_layout as Nr,_stage as Pr,_type as Fr,ancestorsFqn as Ir,applyCachedLayout as Lr,applyManualLayout as Rr,calcDriftsFromSnapshot as zr,exact as Br,hasProp as Vr,invariant as U,isAncestor as Hr,isAndOperator as Ur,isAnyOf as Wr,isDeploymentNode as Gr,isDeploymentView as Kr,isDynamicView as qr,isElementView as Jr,isGlobalFqn as Yr,isNonEmptyArray as Xr,isOrOperator as Zr,isSameHierarchy as Qr,memoizeProp as $r,nameFromFqn as ei,nonNullable as ti,nonexhaustive as W,preferSummary as ni,splitGlobalFqn as ri}from"@likec4/core";import{DefaultMap as ii,DefaultWeakMap as ai,MultiMap as oi,ancestorsFqn as si,compareFqnHierarchically as ci,compareNatural as li,compareNaturalHierarchically as ui,delay as di,hierarchyDistance as fi,ifilter as pi,invariant as G,isNonEmptyArray as mi,isString as hi,memoizeProp as gi,nameFromFqn as _i,nonNullable as vi,nonexhaustive as yi,onNextTick as bi,parentFqn as xi,promiseNextTick as Si,sortNaturalByFqn as Ci,sortParentsFirst as wi,stringHash as Ti,toArray as Ei}from"@likec4/core/utils";import{produce as Di}from"immer";import{Graph as Oi}from"@likec4/core/utils/graphology";import{Graphviz as ki}from"@hpcc-js/wasm-graphviz";import{LikeC4Model as Ai,VIEW_FOLDERS_SEPARATOR as ji,splitViewFolderPath as Mi}from"@likec4/core/model";import Ni,{SubprocessError as Pi}from"nano-spawn";import Fi from"node:os";import{mkdirSync as Ii,statSync as Li}from"node:fs";import{isColorSupported as Ri,isDevelopment as zi}from"std-env";import{bundleRequire as Bi}from"bundle-require";import{formatMessagesSync as Vi}from"esbuild";import{cwd as Hi}from"node:process";import{fdir as Ui}from"fdir";import Wi from"chokidar";import{computeAdhocView as Gi,computeProjectsView as Ki,computeView as qi,resolveRulesExtendedViews as Ji}from"@likec4/core/compute-view";function serializeValue(e,t,r,o){if(typeof e?.toJSON==`function`&&(e=e.toJSON()),!(typeof e==`object`&&e))return e;if(t.has(e)){if(!r)return`[Circular]`;let o=t.get(e);return`[Circular ${o===``?`*`:`*${o}`}]`}t.set(e,o);let s=Array.isArray(e)?[]:{};for(let[c,u]of Object.entries(e))s[c]=serializeValue(u,t,r,o===``?c:`${o}.${c}`);return t.delete(e),s}function safeStringify(e,{indentation:t,trace:r}={}){let o=serializeValue(e,new WeakMap,r,``);return JSON.stringify(o,void 0,t)}const parseStack=e=>e.split(`
2
- `).map(e=>e.trimEnd().replace(`file://`,``).replace(/[A-Za-z]:\\Users\\[^\\]+\\/i,`@vscode\\`).replace(/\/Users\/[^/]+\//,`@vscode/`));function indent$1(e,t=2){e=Array.isArray(e)?e:e.split(`
1
+ import{i as e,s as t,t as r}from"./rolldown-runtime.mjs";import{a,i as o,n as s,o as l,r as p,t as g}from"./libs/@logtape/logtape.mjs";import{n as _,t as v}from"./libs/merge-error-cause.mjs";import{n as b,t as x}from"./sequence-view.mjs";import{$ as S,A as C,At as w,B as T,Ct as ee,D as te,Dt as ne,E as re,Et as ie,F as ae,G as E,H as oe,I as se,J as ce,K as D,L as le,M as ue,Mt as de,N as fe,O as pe,Ot as me,P as he,Q as k,R as ge,St as _e,T as ve,Tt as A,U as ye,V as be,W as xe,X as Se,Y as Ce,Z as we,_t as Te,a as Ee,at as De,bt as Oe,ct as ke,d as Ae,dt as je,et as Me,f as Ne,ft as Pe,gt as Fe,h as Ie,ht as Le,i as Re,it as ze,j as Be,jt as Ve,k as He,kt as Ue,l as We,lt as Ge,m as Ke,mt as qe,n as Je,nt as Ye,o as Xe,ot as Ze,p as Qe,pt as $e,q as j,r as et,rt as tt,s as nt,st as rt,t as it,tt as at,u as ot,ut as st,vt as ct,w as lt,wt as ut,xt as dt,yt as ft,z as pt}from"./libs/langium.mjs";import{a as mt,d as ht,f as gt,i as _t,l as vt,n as yt,o as bt,r as xt,t as St,u as Ct}from"./libs/ufo.mjs";import{t as wt}from"./libs/json5.mjs";import{a as Tt,c as Et,n as Dt,r as Ot,s as kt,t as At}from"./filenames.mjs";import{$ as M,A as jt,B as Mt,C as Nt,D as Pt,E as Ft,F as It,G as Lt,H as Rt,I as N,J as zt,K as Bt,L as Vt,M as Ht,N as Ut,O as Wt,Q as Gt,R as Kt,S as qt,T as P,V as Jt,W as Yt,X as Xt,Z as Zt,_ as Qt,a as $t,at as en,b as tn,c as nn,d as rn,et as an,f as I,g as on,h as sn,i as cn,it as ln,j as L,l as un,m as dn,n as fn,nt as pn,o as mn,ot as hn,q as gn,r as _n,rt as vn,s as yn,st as bn,t as xn,tt as R,u as z,v as Sn,w as Cn,x as V,y as wn,z as Tn}from"./libs/remeda.mjs";import{n as En,r as Dn,t as On}from"./libs/pathe.mjs";import{B as kn,R as An,Z as jn,b as Mn,c as Nn,et as Pn,k as Fn,n as In,t as Ln,v as Rn}from"./generate-likec4.mjs";import{t as zn}from"./libs/@ts-graphviz/core.mjs";import{n as Bn,r as Vn,t as Hn}from"./libs/@ts-graphviz/ast.mjs";import{a as Un,i as Wn,n as Gn,r as Kn,t as qn}from"./libs/@chenglou/pretext.mjs";import{t as Jn}from"./libs/fontkit.mjs";import{n as Yn,r as Xn,t as Zn}from"./libs/khroma.mjs";import{t as Qn}from"./libs/p-limit.mjs";import{t as $n}from"./libs/p-queue.mjs";import{t as er}from"./libs/which.mjs";import{t as tr}from"./libs/pretty-ms.mjs";import{t as nr}from"./libs/fast-equals.mjs";import{n as rr,t as ir}from"./libs/unstorage.mjs";import ar from"zod/v4";import*as or from"node:fs/promises";import{readFile as sr,unlink as cr,writeFile as lr}from"node:fs/promises";import{basename as ur,dirname as dr,join as fr,relative as pr,resolve as mr,sep as hr}from"node:path";import{BorderStyles as gr,EdgeLabelMetrics as _r,ElementNodeMetrics as vr,ElementShapes as yr,LikeC4Styles as br,Sizes as xr,Sizings as Sr,ThemeColors as Cr,assignTagColors as wr,computeColorValues as Tr,elementNodePaddings as Er}from"@likec4/core/styles";import{DiffId as Dr,Fqn as Or,FqnExpr as kr,FqnRef as H,RichText as Ar,_stage as jr,_type as Mr,exact as Nr,hasProp as Pr,isAnyOf as Fr,isExtendsElementView as Ir}from"@likec4/core/types";import{Builder as Lr,assertSpecificationCompatible as Rr}from"@likec4/core/builder";import*as zr from"@likec4/core";import{DefaultMap as Br,DiffId as Vr,Fqn as Hr,FqnExpr as Ur,FqnRef as U,GlobalFqn as Wr,LikeC4Styles as Gr,LinkedList as Kr,RelationExpr as qr,RichText as Jr,ViewId as Yr,_layout as Xr,_stage as Zr,_type as Qr,ancestorsFqn as $r,applyCachedLayout as ei,applyManualLayout as ti,calcDriftsFromSnapshot as ni,exact as ri,invariant as W,isAncestor as ii,isAndOperator as ai,isAnyOf as oi,isDeploymentNode as si,isDeploymentView as ci,isDynamicView as li,isElementView as ui,isGlobalFqn as di,isNonEmptyArray as fi,isOrOperator as pi,isSameHierarchy as mi,memoizeProp as hi,nameFromFqn as gi,nonNullable as _i,nonexhaustive as G,preferSummary as vi,splitGlobalFqn as yi}from"@likec4/core";import{DefaultMap as bi,LRUMap as xi,MultiMap as Si,ancestorsFqn as Ci,compareFqnHierarchically as wi,compareNatural as Ti,compareNaturalHierarchically as Ei,delay as Di,difference as Oi,extractRefs as ki,getOrCreate as Ai,hasProp as ji,hierarchyDistance as Mi,ifilter as Ni,invariant as Pi,isAnyOf as Fi,isNonEmptyArray as Ii,isString as Li,memoizeProp as Ri,nameFromFqn as zi,nonNullable as Bi,nonexhaustive as Vi,objectHash as Hi,onNextTick as Ui,parentFqn as Wi,promiseNextTick as Gi,sortNaturalByFqn as Ki,sortParentsFirst as qi,stringHash as Ji,toArray as Yi}from"@likec4/core/utils";import{mkdirSync as Xi,statSync as Zi}from"node:fs";import{Graph as Qi}from"@likec4/core/utils/graphology";import{BBox as $i,placeLabelsAlongRoutes as ea,polylineToSegments as ta,splineToPolyline as na}from"@likec4/core/geometry";import{Graphviz as ra}from"@hpcc-js/wasm-graphviz";import{LikeC4Model as ia,VIEW_FOLDERS_SEPARATOR as aa,splitViewFolderPath as oa}from"@likec4/core/model";import sa,{SubprocessError as ca}from"nano-spawn";import{isColorSupported as la,isDevelopment as ua}from"std-env";import{createJiti as da}from"jiti";import{cwd as fa}from"node:process";import{fdir as pa}from"fdir";import ma from"picomatch";import ha from"chokidar";import{computeAdhocView as ga,computeCompareViews as _a,computeProjectsView as va,computeRemovalImpact as ya,computeView as ba,createCompareModels as xa,markRemovalImpact as Sa,mergeElementOverlay as Ca,removalImpactViewPredicates as wa,resolveRulesExtendedViews as Ta,withoutDiffOnlyReferences as Ea}from"@likec4/core/compute-view";function serializeValue(e,t,r,a){if(typeof e?.toJSON==`function`&&(e=e.toJSON()),!(typeof e==`object`&&e))return e;if(t.has(e)){if(!r)return`[Circular]`;let a=t.get(e);return`[Circular ${a===``?`*`:`*${a}`}]`}t.set(e,a);let o=Array.isArray(e)?[]:{};for(let[s,l]of Object.entries(e))o[s]=serializeValue(l,t,r,a===``?s:`${a}.${s}`);return t.delete(e),o}function safeStringify(e,{indentation:t,trace:r}={}){let a=serializeValue(e,/* @__PURE__ */ new WeakMap,r,``);return JSON.stringify(a,void 0,t)}const parseStack=e=>e.split(`
2
+ `).map(e=>e.trimEnd().replace(`file://`,``).replace(/[A-Za-z]:\\Users\\[^\\]+\\/i,`@vscode\\`).replace(/\/Users\/[^/]+\//,`@vscode/`));function indent(e,t=2){e=Array.isArray(e)?e:e.split(`
3
3
  `);let r=typeof t==`string`?t:` `.repeat(t);return e.map(e=>`${r}${e}`).join(`
4
- `)}t(indent$1,`indent`);function loggable(e){if(typeof e==`string`)return e;if(isError$1(e)){let t=g(e);if(t.stack){let e=parseStack(t.stack);return t.message+`
5
- `+indent$1(e.slice(1),` `)}return t.message}return safeStringify(e,{indentation:` `})}function wrapError(e,t){return h(e,t)}function isError$1(e){return e instanceof Error}t(isError$1,`isError`);function getErrorFromLogRecord(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=g(t);return e.stack&&=parseStack(e.stack).join(`
6
- `),[e]}return e===`error`||e===`err`?[Error(loggable(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function errorFromLogRecord(e){let t=getErrorFromLogRecord(e);return t&&typeof e.rawMessage==`string`?h(t,e.rawMessage+`
7
- `):t}function appendErrorToMessage(e,t=!1){let r=getErrorFromLogRecord(e.record);if(r){let o=`
8
- `+indent$1(r.stack||r.message,` `);return t&&(o=`${Xi}${Zi.red}${o}${Xi}`),{...e,message:e.message+o}}return e}const Yi={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function getMessageOnlyFormatter(){return getTextFormatter({format:({message:e})=>e})}const level=e=>Yi[e];function getTextFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:o})=>`${e} ${t} ${r} ${o}`);return s({timestamp:`time`,level,category:`.`,...e,format:e=>t(appendErrorToMessage(e))})}const Xi=`\x1B[0m`,Zi={red:`\x1B[31m`};function getAnsiColorFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:o})=>`${e} ${t} ${r} ${o}`);return c({timestamp:`time`,level,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,levelColors:{trace:`black`,debug:`blue`,info:`green`,warning:`yellow`,error:`red`,fatal:`magenta`},...e,format:e=>t(appendErrorToMessage(e,!0))})}function getConsoleFormatter(e){let t=e?.messageFormatter;return t?e=>{let{properties:r}=e;return r&&Object.keys(r).length>0?[t(e),r]:[t(e)]}:p}function getConsoleSink(e){return u({formatter:getConsoleFormatter(),...e})}function getConsoleStderrSink(e){let t=e?.formatter??getConsoleFormatter();return e=>{let r=t(e);if(typeof r==`string`){let e=r.replace(/\r?\n$/,``);console.error(e)}else console.error(...r)}}const K=d(`likec4`);function createLogger(e){return K.getChild(e)}function configureLogger$1(e){try{let{sinks:t={},loggers:r,...o}=e??{},s={console:getConsoleSink(),...t};m({reset:!0,...o,sinks:s,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}t(configureLogger$1,`configureLogger`),Ze();var Qi={reset:[0,0],bold:[1,22,`\x1B[22m\x1B[1m`],dim:[2,22,`\x1B[22m\x1B[2m`],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29],black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],gray:[90,39],bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]};function i(e){return String(e)}i.open=``,i.close=``;function B(){let e=typeof process<`u`?process:void 0,t=e?.env||{},r=t.FORCE_TTY!==`false`,o=e?.argv||[];return!(`NO_COLOR`in t||o.includes(`--no-color`))&&(`FORCE_COLOR`in t||o.includes(`--color`)||e?.platform===`win32`||r&&t.TERM!==`dumb`||`CI`in t)||typeof window<`u`&&!!window.chrome}function C$1({force:e}={}){let t=e||B(),a=(e,t,r,o)=>{let s=``,c=0;do s+=e.substring(c,o)+r,c=o+t.length,o=e.indexOf(t,c);while(~o);return s+e.substring(c)},l=(e,t,r=e)=>{let n=o=>{let s=String(o),c=s.indexOf(t,e.length);return~c?e+a(s,t,r,c)+t:e+s+t};return n.open=e,n.close=t,n},r={isColorSupported:t},f=e=>`\x1B[${e}m`;for(let e in Qi){let o=Qi[e];r[e]=t?l(f(o[0]),f(o[1]),o[2]):i}return r}t(C$1,`C`);var $i=C$1();function stripIndent(e){let t=e.match(/^[ \t]*(?=\S)/gm);if(!t)return e;let r=1/0;for(let e of t)r=Math.min(r,e.length);return r===0||r===1/0?e:e.replace(RegExp(`^[ \\t]{${r}}`,`gm`),``)}function dedent(e){return stripIndent(e.replace(/^(?:[ \t]*\r?\n)+|(?:\r?\n[ \t]*)+$/g,``))}const ea=new rt(`
9
- `);function toStringLF(e,t){return st(e,t).replaceAll(`\r
10
- `,`
11
- `)}function hasContent(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof je&&e.contents.some(e=>hasContent(e))}function hasContentOrNewLine(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof rt?!e.ifNotEmpty:e instanceof je&&e.contents.some(e=>hasContentOrNewLine(e))}function fresh(e){return{ctx:e??void 0,out:new je}}function materialize(e,t=2){return toStringLF($t(e)?executeOnFresh(void 0,[e]).out:e.out,t)}function executeOnCtx(e,t,...r){Qt(t)?(U(r.length===0,`When first argument is an array, no additional operations are allowed`),r=t):r=[t,...r];for(let t of r)e=t(e);return e}function executeOnFresh(e,t,...r){return Qt(t)?executeOnCtx(fresh(e),t):executeOnCtx(fresh(e),[t,...r])}function eachOnFresh(e,t){return t.map(t=>t(fresh(e)))}function operation(e,t){let r=typeof e==`function`?e:t,wrapped=e=>{let t=r(e);return t instanceof je?{...e,out:t}:e};return typeof e==`string`&&r.name==``&&Object.defineProperties(wrapped,{name:{value:`wrapped(${e})`}}),wrapped}function isPrintable(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function print(e){return operation(function printOp({ctx:t,out:r}){let o=typeof e==`function`?e(t):e??t;L(o)||o===``||(U(isPrintable(o),`Value must be a string, number or boolean - got `+typeof o),r.append(String(o)))})}const space=()=>print(` `);function noop(){return Ln()}function lazy(e){return t=>(e()(t),t)}function newline(e){return operation(({out:t})=>{e===`ifNotEmpty`?t.appendNewLineIfNotEmpty():t.appendNewLine()})}function merge(...e){return operation(function merge({ctx:t,out:r}){let o=executeOnFresh(t,e);r.appendIf(hasContent(o.out),o.out)})}function indent(...e){if(e.length===1&&typeof e[0]==`string`){let t=dedent(e[0]);return t.trimStart().length===0?noop():operation(function indent1({out:e}){e.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:[Ne(t.split(/\r?\n/),{separator:ea})]}).appendNewLineIfNotEmpty()})}let t=e;return operation(function indent2({ctx:e,out:r}){let o=executeOnFresh(e,t);hasContent(o.out)&&r.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:o.out.contents}).appendNewLineIfNotEmpty()})}function body(...e){let t=Cn(e);if(on(t))return body(t+` {`,`}`);if(e.length===2&&on(e[0])&&on(e[1])){let[t,r]=e;return(...e)=>operation(function body({ctx:o,out:s}){let c=indent(lines(...e))(fresh(o)).out;s.appendIf(hasContent(c),Ne([t,c,r]))})}let r=e;return body(`{`,`}`)(...r)}function inlineText(e){return operation(({ctx:t,out:r})=>{let o=e??t;if(L(o))return;U(on(o),`Value must be a string - got `+typeof o);let s=o.replace(/(\r?\n|\t)+/g,` `).replaceAll(`'`,`\\'`).trim();r.append(`'${s}'`)})}function multilineText(e,t=`'`){return merge(print(t),indent(e.replaceAll(`'`,`\\'`)),print(t))}function text(e){return operation(function text({ctx:t,out:r}){let o=typeof e==`function`?e(t):e??t;if(!L(o))return U(on(o),`Value must be a string - got `+typeof o),o.includes(`
12
- `)?multilineText(o)({ctx:o,out:r}):inlineText()({ctx:o,out:r})})}const ta=`'`.repeat(3);function markdown(e){return operation(function markdown(t){let r=e??t.ctx;if(!L(r))return U(on(r),`Value must be a string - got `+typeof r),multilineText(r,ta)(t)})}function markdownOrString$1(e){return operation(function markdownOrString(t){let r=e??t.ctx;if(!L(r)){if(typeof r==`string`)return text(r)(t);if(`md`in r)return markdown(r.md)(t);if(`txt`in r)return multilineText(r.txt)(t);throw Error(`Invalid MarkdownOrString value: `+r)}})}t(markdownOrString$1,`markdownOrString`);function join$1(e){return operation(function joinOp({ctx:t,out:r}){let{operations:o,...s}=e,c=Array.isArray(o)?o:[o];U(M(c,1),`At least one operation is required`);let u;return u=c.length===1?c[0](fresh(t)).out.contents:R(eachOnFresh(t,c),F(e=>e.out)),u=P(u,hasContentOrNewLine),r.appendIf(u.length>0,Ne(u,s))})}t(join$1,`join`);function spaceBetween(...e){return join$1({operations:e,suffix:(e,t,r)=>!r&&hasContent(e)?` `:void 0})}function lines(...e){let t=Cn(e);if(tn(t)){let e=fresh(void 0);for(let r=0;r<t;r++)e.out.appendNewLine();return(...t)=>join$1({operations:t,suffix:(t,r,o)=>o?void 0:e.out})}return join$1({operations:e,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0})}function withctx(...e){let t=e[0];if(e.length===1)return(...e)=>operation(function withctx1({out:r}){executeOnCtx({ctx:t,out:r},e)});let r=e.slice(1);return operation(function withctx2({out:e}){executeOnCtx({ctx:t,out:e},r)})}function property(e,t){return operation(function propertyOp({ctx:r,out:o}){let s=Wt(r)&&Vr(r,e)?r[e]:void 0;if(s!=null){if(!t){U(isPrintable(s),`Property ${e} is not printable "${s}"`),o.append(e,` `,String(s));return}t({ctx:s,out:o})}})}function printProperty(e){return property(e,print())}function foreach(...e){let[t,r]=e;if(e.length===2&&!$t(r)){let e=t,o=r;return operation(function foreachSingleOp({ctx:t,out:r}){let s=[];for(let r of t){let t=e(fresh(r)).out;hasContent(t)&&s.push(t)}r.appendIf(s.length>0,Ne(s,o))})}let o=e;return operation(({ctx:e,out:t})=>{for(let r of e)executeOnCtx({ctx:r,out:t},o)})}function separateWith(e){return{separator:e}}function separateNewLine(e=1){if(e>1){let t=fresh(void 0);for(let r=0;r<e;r++)t.out.appendNewLine();return separateWith(t.out)}return separateWith(ea)}function separateComma(e){return e?{separator:`,`,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0}:{separator:`, `}}function foreachNewLine(...e){return operation(function foreachNewLineOp({ctx:t,out:r}){let o=[];for(let r of t){let t=executeOnFresh(r,e).out;hasContent(t)&&o.push(t)}r.appendIf(o.length>0,Ne(o,separateNewLine()))})}function guard(e,...t){return operation(`guard`,({ctx:r,out:o})=>{if(`safeParse`in e){let s=e.safeParse(r);if(s.success)executeOnCtx({ctx:s.data,out:o},t);else throw Error(`Guard failed: ${jt(s.error)}`);return}if(U(typeof e==`function`),e(r)){executeOnCtx({ctx:r,out:o},t);return}})}function when(e,...t){return operation(function whenOp({ctx:r,out:o}){e(r)&&executeOnCtx({ctx:r,out:o},t)})}function select(e,...t){return operation(function selectOp({ctx:r,out:o}){let s=e(r);I(s)&&executeOnCtx({ctx:s,out:o},t)})}function execToOut(e){return(t,...r)=>executeOnCtx({ctx:t,out:e},r)}function zodOp(e){return t=>()=>({ctx:r,out:o})=>{let s=xt(e,r);if(s.success){let e=t({ctx:s.data,out:o,exec:execToOut(o)});return e instanceof je?{ctx:r,out:e}:typeof e==`function`?{ctx:r,out:o,...e({ctx:r,out:o})}:{ctx:r,out:o}}throw s.error}}var na=r({arrow:()=>pa,border:()=>ua,color:()=>Sa,customColor:()=>va,fqn:()=>aa,icon:()=>la,iconPosition:()=>fa,id:()=>ra,kind:()=>oa,line:()=>ma,link:()=>ha,links:()=>ga,markdownOrString:()=>xa,metadata:()=>Ta,metadataValue:()=>wa,opacity:()=>sa,props:()=>Ea,shape:()=>ca,size:()=>da,style:()=>Ca,tag:()=>ya,tags:()=>ba,themeColor:()=>_a,viewId:()=>ia});const ra=D().regex(/^[a-zA-Z0-9_.-]+$/,`id must consist of alphanumeric characters, underscores or hyphens`),ia=ra.transform(e=>e),aa=D().regex(/^[a-zA-Z0-9_.-]+$/,`FQN must consist of alphanumeric characters, dots, underscores or hyphens`).transform(e=>e),oa=D().regex(/^[a-zA-Z0-9_-]+$/,`Kind must consist of alphanumeric characters, underscores or hyphens`).transform(e=>e),sa=Tt().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`),ca=A(or),la=D().nonempty(`Icon cannot be empty`).transform(e=>e),ua=A(ar),da=A(dr),fa=A(sr),pa=A(lr),ma=A(ur),ha=E([D(),k({title:D().optional(),url:D()})]).transform(e=>br(typeof e==`string`?{url:e}:e)),ga=j(ha).readonly(),_a=A(fr),va=D().nonempty(`Custom color name cannot be empty`).transform(e=>e),ya=D().nonempty(`Tag cannot be empty`).transform(e=>e.startsWith(`#`)?e.slice(1):e),ba=j(ya).readonly(),xa=E([D().transform(e=>({txt:e})),kt({md:D()}),kt({txt:D()})]),Sa=_a.or(va),Ca=k({shape:ca,icon:la,iconColor:Sa,iconSize:da,iconPosition:fa,color:Sa,border:ua,opacity:sa,size:da,padding:da,textSize:da,multiple:Dt()}).partial().transform(_n(I)),wa=E([D(),Dt(),At()]),Ta=St(D(),wa.or(j(wa))),Ea=k({tags:ba.nullish(),title:D().nullish(),summary:xa.nullish(),description:xa.nullish(),notation:D().nullish(),technology:D().nullish(),links:ga.nullish(),metadata:Ta.nullish()});var Da=r({directRelationExpr:()=>$a,elementKindExpr:()=>Ua,elementTagExpr:()=>Wa,expression:()=>co,fqnExpr:()=>Ga,fqnExprAny:()=>Qa,fqnExprCustom:()=>Za,fqnExprOrWhere:()=>qa,fqnRef:()=>Aa,incomingRelationExpr:()=>eo,inoutRelationExpr:()=>no,outgoingRelationExpr:()=>to,refDeployment:()=>ka,refExpr:()=>Ha,refModel:()=>Oa,relationExpr:()=>ro,relationExprAny:()=>oo,relationExprCustom:()=>ao,relationExprOrWhere:()=>io,selector:()=>ja,whereAnd:()=>La,whereExpr:()=>so,whereKind:()=>Na,whereMetadata:()=>Pa,whereNot:()=>Ra,whereOperator:()=>Ba,whereOr:()=>za,whereParticipant:()=>Ia,whereTag:()=>Ma,wildcardExpr:()=>Va});const Oa=kt({model:aa,project:D().optional()}),ka=kt({deployment:aa,element:aa.nullish()}),Aa=E([Oa,ka]),ja=A([`children`,`expanded`,`descendants`]);function equalOp(e){return E([e.transform(e=>({eq:e})),k({eq:e}),k({neq:e})])}const Ma=k({tag:equalOp(ya)}),Na=k({kind:equalOp(oa)}),Pa=k({metadata:k({key:D(),value:equalOp(D()).optional()})}),Fa=E([Ma,Na,Pa]),Ia=k({participant:A([`source`,`target`]),operator:Fa}),La=k({get and(){return j(Ba)}}),Ra=k({get not(){return Ba}}),za=k({get or(){return j(Ba)}}),Ba=E([Ma,Na,Pa,Ia,La,za,Ra]),Va=k({wildcard:A(!0)}),Ha=k({ref:Aa,selector:ja.optional()}),Ua=k({elementKind:oa,isEqual:Dt()}),Wa=k({elementTag:ya,isEqual:Dt()}),Ga=E([Va,Ha,Ua,Wa]),Ka=kt({where:kt({expr:Ga,condition:Ba})}),qa=E([Ga,Ka]),Ja=k({title:D(),description:xa,technology:D(),notation:D(),notes:xa,navigateTo:ia,color:Sa}),Ya=k({...Ja.shape,shape:ca,icon:la,iconColor:Sa,iconSize:da,iconPosition:fa,border:ua,opacity:sa,multiple:Dt(),size:da,padding:da,textSize:da}).partial(),Xa=k({...Ja.shape,line:ma,head:pa,tail:pa}).partial(),Za=kt({custom:Ya.extend({expr:qa})}),Qa=E([qa,Za]),$a=k({source:Ga,target:Ga,isBidirectional:Dt().optional()}),eo=k({incoming:Ga}),to=k({outgoing:Ga}),no=k({inout:Ga}),ro=E([$a,eo,to,no]),io=E([ro,kt({where:kt({expr:ro,condition:Ba})})]),ao=kt({customRelation:Xa.extend({expr:io})}),oo=E([io,ao]),so=k({where:k({expr:E([Ga,ro]),condition:Ba})}),co=E([Ga,Za,ro,ao,so]);var lo=r({element:()=>go,instance:()=>fo,node:()=>uo,relationship:()=>ho,schema:()=>bo});const uo=Ea.extend({id:aa,kind:oa,style:Ca.optional(),shape:ca.optional(),color:Sa.optional(),icon:la.optional()}).readonly().transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return _n(Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)}),I)}),fo=Ea.extend({id:aa,element:aa,style:Ca.optional(),shape:ca.optional(),color:Sa.optional(),icon:la.optional()}).readonly().transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return _n(Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)}),I)}),po=ka,mo=ra.transform(e=>e),ho=Ea.extend({id:mo.optional(),title:D().nullish(),source:po,target:po,isBidirectional:Dt().nullish(),navigateTo:ia.nullish(),color:Sa.nullish(),kind:oa.nullish(),line:ma.nullish(),head:pa.nullish(),tail:pa.nullish()}).readonly().transform(_n(I)),go=E([uo,fo]),_o=St(aa,go),vo=St(mo,ho),yo=t(e=>e.id??Sn(8),`genRelationshipId`),bo=k({elements:E([_o,j(go)]).transform(e=>Qt(e)?rn(e,Nn(`id`)):e).optional(),relations:E([vo,j(ho)]).transform(e=>Qt(e)?rn(e,yo):e).optional()});var xo=r({element:()=>So,relationship:()=>To,schema:()=>Oo});const So=k({...Ea.shape,id:aa,kind:oa,style:Ca.optional(),shape:ca.optional(),color:Sa.optional(),icon:la.optional()}).transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return(t||r||o)&&(s=Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)})),_n(s,I)}).readonly(),Co=E([aa,kt({model:aa})]).transform(e=>typeof e==`string`?{model:e}:e),wo=ra.transform(e=>e),To=k({...Ea.shape,id:wo.optional(),title:D().nullish(),source:Co,target:Co,isBidirectional:Dt().nullish(),navigateTo:ia.nullish(),color:Sa.nullish(),kind:oa.nullish(),line:ma.nullish(),head:pa.nullish(),tail:pa.nullish()}).transform(_n(I)).readonly(),Eo=St(aa,So),Do=St(wo,To),genRelationshipId=e=>e.id??Sn(8),Oo=k({elements:E([Eo,j(So)]).transform(e=>Qt(e)?rn(e,Nn(`id`)):e).optional(),relations:E([Do,j(To)]).transform(e=>Qt(e)?rn(e,genRelationshipId):e).optional()});var ko=r({element:()=>Ao,relationship:()=>jo,schema:()=>No,tagSpec:()=>Mo});const Ao=k({tags:ba.nullable(),title:D().nullable(),summary:xa.nullable(),description:xa.nullable(),technology:D().nullable(),notation:D().nullable(),links:ga.nullable(),style:Ca.nullable()}).partial().transform(_n(I)),jo=k({technology:D().nullable(),notation:D().nullable(),color:Sa.nullable(),line:ma.nullable(),head:pa.nullable(),tail:pa.nullable()}).partial().transform(_n(I)),Mo=k({color:Sa.nullable()}).partial().transform(_n(I)),No=k({elements:St(oa,Ao),deployments:St(oa,Ao),relationships:St(oa,jo),tags:E([St(ya,Mo),j(ya).transform(e=>In(e,e=>[e,{}]))])}).partial();var Po=r({anyView:()=>us,autoLayoutDirection:()=>Fo,deploymentView:()=>Zo,deploymentViewRule:()=>Xo,deploymentViewRuleIncludeAncestors:()=>Lo,dynamicStep:()=>Qo,dynamicStepAlt:()=>is,dynamicStepAltBranch:()=>rs,dynamicStepBlock:()=>ts,dynamicStepSeries:()=>es,dynamicStepTry:()=>ns,dynamicView:()=>ls,dynamicViewIncludeRule:()=>os,dynamicViewRule:()=>ss,dynamicViewStep:()=>as,dynamicViewVariant:()=>cs,elementView:()=>Yo,elementViewRule:()=>qo,viewRuleAutoLayout:()=>Io,viewRuleExclude:()=>zo,viewRuleGlobalPredicate:()=>Uo,viewRuleGlobalStyle:()=>Ho,viewRuleGroup:()=>Ko,viewRuleInclude:()=>Ro,viewRulePredicate:()=>Bo,viewRuleRank:()=>Go,viewRuleStyle:()=>Vo,views:()=>ds});const Fo=A([`TB`,`BT`,`LR`,`RL`]),Io=k({direction:Fo,nodeSep:At().optional(),rankSep:At().optional()}),Lo=kt({includeAncestors:Dt()}),Ro=kt({include:j(co)}),zo=kt({exclude:j(co)}),Bo=E([Ro,zo]).transform(e=>e),Vo=k({targets:j(Ga),notation:D().optional(),style:Ca}).transform(e=>e),Ho=k({styleId:D()}).transform(e=>e),Uo=k({predicateId:D()}).transform(e=>e),Wo=A([`max`,`min`,`same`,`sink`,`source`]),Go=k({targets:j(Ga),rank:Wo}).transform(e=>e),Ko=wt(()=>k({groupRules:j(E([Bo,Uo,Ko])),title:D().nullable(),color:Sa.optional(),border:ua.optional(),opacity:sa.optional(),multiple:Dt().optional(),size:da.optional(),padding:da.optional(),textSize:da.optional()})),qo=E([Bo,Io,Vo,Ho,Uo,Go,Ko]),Jo=k({id:ia,title:D().nullish(),description:xa.nullish(),order:At().int().nonnegative().optional(),tags:ba.nullish(),links:ga.nullish()}),Yo=Jo.extend({_type:A(`element`),viewOf:aa.nullish(),extends:ia.nullish(),rules:j(qo).optional().default([])}),Xo=E([Bo,Io,Vo,Ho,Uo,Lo]),Zo=Jo.extend({_type:A(`deployment`),rules:j(Xo).optional().default([])}),Qo=k({_type:Ot().exactOptional(),source:aa,target:aa,title:D().nullish().default(null),kind:D().nullish(),description:xa.nullish(),technology:D().nullish(),notation:D().nullish(),notes:xa.nullish(),color:Sa.optional(),line:ma.optional(),head:pa.optional(),tail:pa.optional(),isBackward:Dt().optional(),navigateTo:ia.nullish()}),$o=k({title:D().optional(),source:Ot().exactOptional(),target:Ot().exactOptional(),get steps(){return j(as).nonempty(`must have at least one step`)}}),es=k({_type:A(`series`),steps:j(Qo).nonempty(`must have at least one step`)}).readonly(),ts=$o.extend({_type:A([`par`,`loop`,`opt`,`break`])}).readonly(),ns=k({_type:A(`try`),try:$o,catch:$o.optional(),finally:$o.optional()}).readonly(),rs=$o.extend({_type:A([`when`,`if`,`else`])}).readonly(),is=k({_type:A(`alt`),title:D().optional(),branches:j(rs).nonempty(`alt block must have at least one branch`)}).readonly(),as=E([Qo,is,es,ts,ns]),os=kt({include:j(co)}),ss=E([os,Uo,Vo,Ho,Io]),cs=A([`diagram`,`sequence`]),ls=Jo.extend({_type:A(`dynamic`),variant:cs.optional(),steps:j(as).optional(),rules:j(ss).optional()}),us=E([Yo,Zo,ls]),ds=St(ia,us),fs=k({...Oo.shape,views:ds,project:k({id:D(),styles:Pt.nullish()}),deployment:bo,deployments:bo,specification:No}).partial().readonly().transform(normalizeStyles);function normalizeStyles(e){let t=e.specification?.elements;return!en(t)&&!en(e.elements)&&(e={...e,elements:Pn(e.elements,e=>normalizeElementStyles(e,t))}),e}function normalizeElementStyles(e,t){let r=t[e.kind];if(!r)return e;let o=r.style??{};return Di(e,t=>{for(let o of[`description`,`technology`,`tags`,`summary`]){let s=r[o],c=e[o];Ht(s,c)&&delete t[o]}if(e.style)for(let[r,s]of nn(o))Ht(e.style?.[r],s)&&delete t.style[r]})}const q={common:na,expr:Da,specification:ko,model:xo,deployment:lo,views:Po,likec4data:fs};function markdownProperty(e,t){return select(t=>t[e],spaceBetween(print(t??e),markdownOrString$1()))}const titleProperty=()=>property(`title`,spaceBetween(print(`title`),text())),summaryProperty=()=>property(`summary`,spaceBetween(print(`summary`),markdownOrString$1())),descriptionProperty=()=>property(`description`,spaceBetween(print(`description`),markdownOrString$1())),notesProperty=()=>property(`notes`,spaceBetween(print(`notes`),markdownOrString$1())),technologyProperty=()=>property(`technology`,spaceBetween(print(`technology`),text())),notationProperty=()=>property(`notation`,spaceBetween(print(`notation`),text()));function printMetadataValue(){return operation(({ctx:e,out:t})=>on(e)?text()({ctx:e,out:t}):print()({ctx:e,out:t}))}function metadataValue(){return hn(guard(Vt(Qt),printMetadataValue()),guard(Qt,body(`[`,`]`)(foreach(printMetadataValue(),{appendNewLineIfNotEmpty:!0,suffix(e,t,r){return r?void 0:`,`}}))))}const metadataProperty=()=>select(e=>e.metadata?nn(e.metadata):void 0,body(`metadata`)(foreach(spaceBetween(print(e=>e[0]),property(`1`,metadataValue())),separateNewLine()))),tagsProperty=()=>property(`tags`,print(e=>e.map(e=>`#${e}`).join(`, `)));function linkProperty(){return spaceBetween(select(e=>typeof e==`string`?{url:e}:br({url:e.url,title:e.title}),print(`link`),print(e=>e.url),property(`title`,inlineText())))}const linksProperty=()=>property(`links`,foreachNewLine(linkProperty()));function colorProperty(){return property(`color`,spaceBetween(print(`color`),print()))}function opacityProperty(){return property(`opacity`,spaceBetween(print(`opacity`),print(e=>`${e}%`)))}function iconProperty(){return property(`icon`,spaceBetween(print(`icon`),print()))}const ps=zodOp(Ca)(lines(property(`shape`),colorProperty(),iconProperty(),property(`iconColor`),property(`iconSize`),property(`iconPosition`),property(`border`),opacityProperty(),property(`size`),property(`padding`),property(`textSize`),property(`multiple`)));function relationConnector(e,t){let r=t?`<->`:`->`;return e?`-[${e}]${r}`:r}function appendSelector(e,t){if(t)switch(t){case`children`:e.append(`.*`);break;case`descendants`:e.append(`.**`);break;case`expanded`:e.append(`._`);break;default:W(t)}return e}const ms=zodOp(Ma)(function whereTagEqualOp({ctx:{tag:e},out:t}){if(`eq`in e)return t.appendTemplate`tag is #${e.eq}`;if(`neq`in e)return t.appendTemplate`tag is not #${e.neq}`;W(e)}),hs=zodOp(Na)(function whereKindEqualOp({ctx:{kind:e},out:t}){if(`eq`in e)return t.appendTemplate`kind is ${e.eq}`;if(`neq`in e)return t.appendTemplate`kind is not ${e.neq}`;W(e)});function quoteMetadataValue(e){return e===`true`||e===`false`?e:`"${e}"`}const gs=zodOp(Pa)(function whereMetadataEqualOp({ctx:{metadata:e},out:t}){let{key:r,value:o}=e;if(o===void 0)return t.appendTemplate`metadata.${r}`;if(`eq`in o)return t.append(`metadata.${r} is ${quoteMetadataValue(o.eq)}`);if(`neq`in o)return t.append(`metadata.${r} is not ${quoteMetadataValue(o.neq)}`);W(o)}),_s=zodOp(Ra)(property(`not`,spaceBetween(print(`not (`),lazy(()=>xs()),print(`)`)))),vs=zodOp(Ia)(function whereParticipantOp({ctx:{participant:e,operator:t},out:r}){if(r.append(e,`.`),`tag`in t){ms()({ctx:t,out:r});return}if(`kind`in t){hs()({ctx:t,out:r});return}if(`metadata`in t){gs()({ctx:t,out:r});return}W(t)}),ys=zodOp(La)(function whereAndOp({ctx:{and:e},out:t}){let r=F(e,e=>{let{out:t}=executeOnFresh(e,xs());return`or`in e&&(t=fresh().out.append(`(`,...t.contents,`)`)),t});return t.append(Ne(r,{appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0,prefix(e,t){return t>0?`and `:void 0}}))}),bs=zodOp(za)(({ctx:{or:e},out:t})=>{let r=F(e,e=>{let{out:t}=executeOnFresh(e,xs());return`and`in e&&(t=fresh().out.append(`(`,...t.contents,`)`)),t});return t.append(Ne(r,{appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0,prefix(e,t){return t>0?`or `:void 0}}))}),xs=zodOp(Ba)(({ctx:e,exec:t})=>{if(`and`in e)return t(e,ys());if(`or`in e)return t(e,bs());if(`not`in e)return t(e,_s());if(`tag`in e)return t(e,ms());if(`kind`in e)return t(e,hs());if(`metadata`in e)return t(e,gs());if(`participant`in e)return t(e,vs());W(e)}),Ss=zodOp(Aa)(({ctx:e,out:t})=>(`model`in e?t.append(e.model):(t.append(e.deployment),e.element&&t.append(`.`,e.element)),t)),Cs=zodOp(Ga)(({ctx:e,out:t,exec:r})=>{if(`wildcard`in e)return t.append(`*`);if(`elementKind`in e)return t.append(`element.kind`).append(e.isEqual?` = `:` != `).append(e.elementKind);if(`elementTag`in e)return t.append(`element.tag`).append(e.isEqual?` = `:` != `).append(`#${e.elementTag}`);if(`ref`in e)return r(e.ref,Ss()),appendSelector(t,e.selector),t;W(e)}),ws=zodOp(Za)(({ctx:{custom:e},exec:t})=>{t(e.expr,Ts());let r=withctx(e)(body(`with`)(titleProperty(),descriptionProperty(),notationProperty(),notesProperty(),property(`navigateTo`),ps()));return`where`in e.expr?t({},indent(r)):t({},space(),r)}),Ts=zodOp(qa)(({ctx:e,exec:t})=>{if(`where`in e){t(e.where.expr,Cs()),t(e.where.condition,indent(print(`where`),indent(xs())));return}t(e,Cs())});zodOp(Qa)(({ctx:e,out:t})=>`custom`in e?ws()({ctx:e,out:t}):Ts()({ctx:e,out:t}));const Es=zodOp($a)(merge(property(`source`,Cs()),print(e=>e.isBidirectional?` <-> `:` -> `),property(`target`,Cs()))),Ds=zodOp(eo)(merge(print(`-> `),property(`incoming`,Cs()))),Os=zodOp(to)(merge(property(`outgoing`,Cs()),print(` ->`))),ks=zodOp(no)(merge(print(`-> `),property(`inout`,Cs()),print(` ->`))),As=zodOp(ro)(({ctx:e,exec:t})=>{if(`source`in e)return t(e,Es());if(`incoming`in e)return t(e,Ds());if(`outgoing`in e)return t(e,Os());if(`inout`in e)return t(e,ks());W(e)}),js=zodOp(io)(({ctx:e,out:t})=>`where`in e?merge(withctx(e.where.expr)(As()),indent(print(`where`),indent(withctx(e.where.condition)(xs()))))({ctx:e,out:t}):As()({ctx:e,out:t})),Ms=zodOp(ao)(({ctx:{customRelation:e},exec:t})=>{t(e.expr,js());let r=withctx(e)(body(`with`)(titleProperty(),descriptionProperty(),notationProperty(),markdownProperty(`notes`),property(`navigateTo`),ps(),property(`head`),property(`tail`),property(`line`)));`where`in e.expr?t({},indent(r)):t({},space(),r)});zodOp(oo)(({ctx:e,exec:t})=>`customRelation`in e?t(e,Ms()):t(e,js()));const Ns=zodOp(co)(({ctx:e,exec:t})=>{if(`custom`in e)return t(e,ws());if(`customRelation`in e)return t(e,Ms());if(`wildcard`in e||`ref`in e||`elementKind`in e||`elementTag`in e)return t(e,Cs());if(`source`in e||`incoming`in e||`outgoing`in e||`inout`in e)return t(e,As());if(`where`in e){let{expr:r,condition:o}=e.where;return`source`in r||`incoming`in r||`outgoing`in r||`inout`in r?t({where:{expr:r,condition:o}},js()):t({where:{expr:r,condition:o}},Ts())}W(e)});function buildTree$1(e){let t=new Map,r=[],o=R(e,wi);for(let e of o){let o;o=`element`in e?e:{...e,children:[]},t.set(e.id,o);let s=xi(e.id),c=s?t.get(s):void 0;c&&`children`in c?c.children.push(o):r.push(o)}return{roots:r,nodes:t,exists:e=>t.has(e)}}t(buildTree$1,`buildTree`);function hasStyleProps$1(e){return!en(e.style)}t(hasStyleProps$1,`hasStyleProps`);function hasElementProps$1(e){return!!(e.description||e.summary||e.technology||e.notation||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!en(e.metadata)||hasStyleProps$1(e))}t(hasElementProps$1,`hasElementProps`);const Ps=zodOp(q.deployment.element)(lines(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),linksProperty(),metadataProperty(),select(e=>hasStyleProps$1(e)?e.style:void 0,body(`style`)(ps())))),Fs=zodOp(q.deployment.instance)(spaceBetween(when(e=>_i(e.id)!==_i(e.element),print(e=>_i(e.id)),print(` =`)),print(`instanceOf`),printProperty(`element`),when(e=>!!e.title&&e.title!==_i(e.id),property(`title`,inlineText())),when(e=>hasElementProps$1(e),body(Ps()))));function node(){return function nodeOp({ctx:e,out:t}){let r=e;if(`element`in r)return Fs()({ctx:r,out:t}),{ctx:e,out:t};G(`children`in r,`Node must have children property`);let o=r.children.length>0||hasElementProps$1(r),s=_i(r.id),c=[print(s),print(`=`),print(r.kind)];return r.title&&r.title!==s&&c.push(inlineText(r.title)),o&&c.push(body(lines(2)(withctx(r,Ps()),...r.children.map(e=>withctx(e,nodeOp))))),spaceBetween(...c)({ctx:e,out:t})}}function hasRelationStyle$1(e){return!!(e.color||e.line||e.head||e.tail)}t(hasRelationStyle$1,`hasRelationStyle`);function hasRelationProps$1(e){return!!(e.description||e.summary||e.technology||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!en(e.metadata)||hasRelationStyle$1(e)||e.navigateTo)}t(hasRelationProps$1,`hasRelationProps`);const Is=zodOp(q.deployment.relationship)(spaceBetween(property(`source`,Ss()),print(e=>relationConnector(e.kind,e.isBidirectional)),property(`target`,Ss()),property(`title`,inlineText()),when(hasRelationProps$1,body(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),property(`navigateTo`),linksProperty(),metadataProperty(),when(hasRelationStyle$1,body(`style`)(colorProperty(),property(`line`),property(`head`),property(`tail`))))))),Ls=zodOp(q.deployment.schema)(body(`deployment`)(lines(2)(select(e=>buildTree$1(e.elements?Mn(e.elements):[]).roots,lines(2)(foreach(node()))),select(e=>e.relations?Mn(e.relations):void 0,lines(2)(foreach(Is()))))));function buildTree(e){let t=new Map,r=[],o=R(e,wi);for(let e of o){let o={...e,children:[]};t.set(e.id,o);let s=xi(e.id),c=s?t.get(s):void 0;c?c.children.push(o):r.push(o)}return{roots:r,nodes:t,exists:e=>t.has(e)}}function hasStyleProps(e){return!en(e.style)}function hasElementProps(e){return!!(e.description||e.summary||e.technology||e.notation||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!en(e.metadata)||hasStyleProps(e))}const Rs=zodOp(q.model.element)(lines(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),linksProperty(),metadataProperty(),select(e=>hasStyleProps(e)?e.style:void 0,body(`style`)(ps()))));function elementTree(){return function elementTreeNodeOp({ctx:e,out:t}){let r=e,o=(e.children?.length??0)>0||hasElementProps(r),s=_i(r.id),c=[print(s),print(`=`),print(r.kind)];return r.title&&r.title!==s&&c.push(inlineText(r.title)),o&&c.push(body(lines(2)(withctx(r,Rs()),...(e.children??[]).map(e=>withctx(e,elementTree()))))),spaceBetween(...c)({ctx:e,out:t})}}function hasRelationStyle(e){return!!(e.color||e.line||e.head||e.tail)}function hasRelationProps(e){return!!(e.description||e.summary||e.technology||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!en(e.metadata)||hasRelationStyle(e)||e.navigateTo)}const zs=zodOp(q.model.relationship)(spaceBetween(property(`source`,Ss()),print(e=>relationConnector(e.kind,e.isBidirectional)),property(`target`,Ss()),property(`title`,inlineText()),when(hasRelationProps,body(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),property(`navigateTo`),linksProperty(),metadataProperty(),when(hasRelationStyle,body(`style`)(colorProperty(),property(`line`),property(`head`),property(`tail`)))))));zodOp(q.model.element)(elementTree());const Bs=zodOp(q.model.schema)(body(`model`)(lines(2)(select(e=>buildTree(e.elements?Mn(e.elements):[]).roots,lines(2)(foreach(elementTree()))),select(e=>e.relations?Mn(e.relations):void 0,lines(2)(foreach(zs())))))),Vs=zodOp(Ct([D(),Mo]))(spaceBetween(print(`tag`),printProperty(`0`),property(`1`,property(`color`,body(spaceBetween(print(`color`),print())))))),elementKind=e=>zodOp(Ct([D(),Ao]))(spaceBetween(print(e),printProperty(`0`),property(`1`,body(tagsProperty(),titleProperty(),summaryProperty(),descriptionProperty(),technologyProperty(),notationProperty(),linksProperty(),property(`style`,body(`style`)(ps())))))),Hs=zodOp(Ct([D(),jo]))(spaceBetween(print(`relationship`),printProperty(`0`),property(`1`,body(technologyProperty(),notationProperty(),colorProperty(),property(`line`),property(`head`),property(`tail`))))),Us=zodOp(No)(body(`specification`)(lines(2)(select(e=>e.elements&&nn(e.elements),foreachNewLine(elementKind(`element`)())),select(e=>e.deployments&&nn(e.deployments),foreachNewLine(elementKind(`deploymentNode`)())),select(e=>e.relationships&&nn(e.relationships),foreachNewLine(Hs())),select(e=>e.tags&&nn(e.tags),foreachNewLine(Vs()))))),viewTitleProperty=()=>property(`title`,spaceBetween(print(`title`),inlineText())),Ws=zodOp(q.views.viewRulePredicate)(({ctx:e,exec:t})=>{let r,o;if(`include`in e?(r=e.include,o=`include`):`exclude`in e&&(r=e.exclude,o=`exclude`),U(r&&o,`Invalid view rule predicate`),!M(r,1))return;let s=M(r,2),c=withctx(r)(foreach(Ns(),separateComma(s)));t(e,merge(print(o),...s?[indent(c)]:[space(),c]))}),Gs=zodOp(q.views.viewRuleStyle)(spaceBetween(print(`style`),property(`targets`,foreach(Ns(),separateComma())),body(`{`,`}`)(notationProperty(),property(`style`,ps())))),Ks=zodOp(q.views.viewRuleGroup)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),qs=zodOp(q.views.viewRuleGlobalStyle)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Js=zodOp(q.views.viewRuleGlobalPredicate)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Ys={TB:`TopBottom`,BT:`BottomTop`,LR:`LeftRight`,RL:`RightLeft`},Xs=zodOp(q.views.viewRuleAutoLayout)(spaceBetween(print(`autoLayout`),property(`direction`,print(e=>Ys[e])),guard(Vr(`rankSep`),spaceBetween(printProperty(`rankSep`),printProperty(`nodeSep`))))),Zs=zodOp(q.views.deploymentViewRuleIncludeAncestors)(spaceBetween(print(`includeAncestors`),printProperty(`includeAncestors`))),Qs=zodOp(q.views.viewRuleRank)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),$s=zodOp(q.views.elementViewRule)(({ctx:e,exec:t})=>{if(`include`in e||`exclude`in e)return t(e,Ws());if(`groupRules`in e)return t(e,Ks());if(`rank`in e)return t(e,Qs());if(`direction`in e)return t(e,Xs());if(`styleId`in e)return t(e,qs());if(`predicateId`in e)return t(e,Js());if(`targets`in e&&`style`in e)return t(e,Gs());W(e)}),ec=zodOp(q.views.elementView.partial({_type:!0}))(spaceBetween(print(`view`),print(e=>e.id),property(`viewOf`,spaceBetween(print(`of`),print())),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty()),property(`rules`,foreachNewLine($s())))))),tc=zodOp(q.views.deploymentViewRule)(({ctx:e,exec:t})=>{if(`include`in e||`exclude`in e)return t(e,Ws());if(`includeAncestors`in e)return t(e,Zs());if(`direction`in e)return t(e,Xs());if(`styleId`in e)return t(e,qs());if(`predicateId`in e)return t(e,Js());if(`targets`in e&&`style`in e)return t(e,Gs());W(e)}),nc=zodOp(q.views.deploymentView.partial({_type:!0}))(spaceBetween(print(`deployment view`),print(e=>e.id),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty()),property(`rules`,foreachNewLine(tc())))))),rc=zodOp(q.views.dynamicStep.partial({source:!0}))(spaceBetween(print(e=>e.isBackward?`<-`:e.kind?`-[${e.kind}]->`:`->`),printProperty(`target`),property(`title`,text()),body(lines(technologyProperty(),descriptionProperty(),notesProperty(),property(`navigateTo`),notationProperty(),colorProperty(),property(`line`),property(`head`),property(`tail`))))),ic=zodOp(q.views.dynamicStep)(spaceBetween(printProperty(`source`),rc())),bodyWithSteps=()=>property(`steps`,body(foreachNewLine(lazy(()=>uc())))),ac=zodOp(q.views.dynamicStepBlock)(spaceBetween(printProperty(`_type`),property(`title`,text()),bodyWithSteps())),oc=zodOp(q.views.dynamicStepSeries)(merge(select(e=>e.steps[0],printProperty(`source`)),indent(property(`steps`,foreachNewLine(rc()))))),sc=zodOp(q.views.dynamicStepTry)(spaceBetween(select(e=>e.try,spaceBetween(print(`try`),property(`title`,text()),bodyWithSteps())),select(e=>e.catch,spaceBetween(print(`catch`),property(`title`,text()),bodyWithSteps())),select(e=>e.finally,spaceBetween(print(`finally`),property(`title`,text()),bodyWithSteps())))),cc=zodOp(q.views.dynamicStepAltBranch)(spaceBetween(printProperty(`_type`),property(`title`,text()),bodyWithSteps())),lc=zodOp(q.views.dynamicStepAlt)(spaceBetween(print(`alt`),property(`title`,text()),body(property(`branches`,foreachNewLine(cc()))))),uc=zodOp(q.views.dynamicViewStep)(({ctx:e,exec:t})=>{if(e.source&&e.target)return t(e,ic());switch(U(e._type,`Step must have a type`),e._type){case`loop`:case`opt`:case`break`:case`par`:return t(e,ac());case`alt`:return t(e,lc());case`series`:return t(e,oc());case`try`:return t(e,sc());default:W(e)}}),dc={single:ic,block:ac,alt:lc,series:oc,try:sc,any:uc},fc=zodOp(q.views.dynamicViewIncludeRule)(({ctx:e,exec:t})=>{if(!M(e.include,1))return;let r=M(e.include,2),o=withctx(e.include)(foreach(Ns(),separateComma(r)));t(e,merge(print(`include`),...r?[indent(o)]:[space(),o]))}),pc=zodOp(q.views.dynamicViewRule)(({ctx:e,exec:t})=>{if(`include`in e)return t(e,fc());if(`predicateId`in e)return t(e,Js());if(`targets`in e&&`style`in e)return t(e,Gs());if(`styleId`in e)return t(e,qs());if(`direction`in e)return t(e,Xs());W(e)}),mc=zodOp(q.views.dynamicView.partial({_type:!0}))(spaceBetween(print(`dynamic view`),print(e=>e.id),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty(),property(`variant`)),property(`steps`,foreachNewLine(dc.any())),property(`rules`,foreachNewLine(pc())))))),hc=zodOp(q.views.anyView)(({ctx:e,exec:t})=>{if(`_type`in e){if(e._type==`element`)return t(e,ec());if(e._type===`deployment`)return t(e,nc());if(e._type===`dynamic`)return t(e,mc())}W(e)}),gc=zodOp(q.views.views)(body(`views`)(select(e=>Mn(e),foreach(hc(),{separator:new je().appendNewLine().appendNewLine(),prefix:(e,t,r)=>t===0&&!r?ea:void 0})))),_c=zodOp(q.likec4data)(lines(2)(property(`specification`,Us()),Bs(),property(`deployment`,Ls()),property(`deployments`,Ls()),property(`views`,gc())));function generateLikeC4(e,t){return t={indentation:2,...t},materialize(withctx(e,_c()),t.indentation)}function printOperation(e,t,r){return materialize(withctx(t??{},e),r?.indentation)}const vc=t(e=>e.severity===1,`isErrorDiagnostic`);var LikeC4=class{langium;logger;constructor(e,t=K){this.langium=e,this.logger=t}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let e=this.languageServices.projects();if(e.length>1)throw this.logger.error(`Multiple projects found:
4
+ `)}function loggable(e){if(typeof e==`string`)return e;if(isError(e)){let t=v(e);if(t.stack){let e=parseStack(t.stack);return t.message+`
5
+ `+indent(e.slice(1),` `)}return t.message}return safeStringify(e,{indentation:` `})}function wrapError(e,t){return _(e,t)}function isError(e){return e instanceof Error}function getErrorFromLogRecord(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=v(t);return e.stack&&=parseStack(e.stack).join(`
6
+ `),[e]}return e===`error`||e===`err`?[Error(loggable(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function errorFromLogRecord(e){let t=getErrorFromLogRecord(e);return t&&typeof e.rawMessage==`string`?_(t,e.rawMessage+`
7
+ `):t}function appendErrorToMessage(e,t=!1){let r=getErrorFromLogRecord(e.record);if(r){let a=`
8
+ `+indent(r.stack||r.message,` `);return t&&(a=`${Oa}${ka.red}${a}${Oa}`),{...e,message:e.message+a}}return e}const Da={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function getMessageOnlyFormatter(){return getTextFormatter({format:({message:e})=>e})}const level=e=>Da[e];function getTextFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:a})=>`${e} ${t} ${r} ${a}`);return a({timestamp:`time`,level,category:`.`,...e,format:e=>t(appendErrorToMessage(e))})}const Oa=`\x1B[0m`,ka={red:`\x1B[31m`};function getAnsiColorFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:a})=>`${e} ${t} ${r} ${a}`);return o({timestamp:`time`,level,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,levelColors:{trace:`black`,debug:`blue`,info:`green`,warning:`yellow`,error:`red`,fatal:`magenta`},...e,format:e=>t(appendErrorToMessage(e,!0))})}function getConsoleFormatter(e){let t=e?.messageFormatter;return t?e=>{let{properties:r}=e;return r&&Object.keys(r).length>0?[t(e),r]:[t(e)]}:p}function getConsoleSink(e){return s({formatter:getConsoleFormatter(),...e})}function getConsoleStderrSink(e){let t=e?.formatter??getConsoleFormatter();return e=>{let r=t(e);if(typeof r==`string`){let e=r.replace(/\r?\n$/,``);console.error(e)}else console.error(...r)}}const Aa=l(`likec4`);function createLogger(e){return Aa.getChild(e)}function configureLogger$1(e){try{let{sinks:t={},loggers:r,...a}=e??{},o={console:getConsoleSink(),...t};g({reset:!0,...a,sinks:o,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}e(configureLogger$1,`configureLogger`);var K=je();st();var q=we(),d=e=>String(e);d.open=d.close=``;var i=()=>d,ja=`\x1B[39m`,Ma=`\x1B[49m`,F=(e,t,r,a,o)=>{let s=``,l=0;do s+=e.substring(l,a)+r,l=a+o,a=e.indexOf(t,l);while(~a);return s+e.substring(l)},u=(e,t,r=e,a=e.length)=>{let o=t.length,m=s=>{let l=s+``,p=l.indexOf(t,a);return~p?e+F(l,t,r,p,o)+t:e+l+t};return m.open=e,m.close=t,m},B=(e,t)=>u(e,t,e,5),c=e=>{let t=e.charCodeAt(0)===35?e.slice(1):e,r=parseInt(t,16)||0;return t.length<6?`${(r>>8&15)*17};${(r>>4&15)*17};${(r&15)*17}`:`${r>>16&255};${r>>8&255};${r&255}`};function y(e){let t=e?u:i;return{isColorSupported:e,reset:t(`\x1B[0m`,`\x1B[0m`),bold:t(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:t(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:t(`\x1B[3m`,`\x1B[23m`),underline:t(`\x1B[4m`,`\x1B[24m`),inverse:t(`\x1B[7m`,`\x1B[27m`),hidden:t(`\x1B[8m`,`\x1B[28m`),strikethrough:t(`\x1B[9m`,`\x1B[29m`),black:t(`\x1B[30m`,ja),red:t(`\x1B[31m`,ja),green:t(`\x1B[32m`,ja),yellow:t(`\x1B[33m`,ja),blue:t(`\x1B[34m`,ja),magenta:t(`\x1B[35m`,ja),cyan:t(`\x1B[36m`,ja),white:t(`\x1B[37m`,ja),gray:t(`\x1B[90m`,ja),bgBlack:t(`\x1B[40m`,Ma),bgRed:t(`\x1B[41m`,Ma),bgGreen:t(`\x1B[42m`,Ma),bgYellow:t(`\x1B[43m`,Ma),bgBlue:t(`\x1B[44m`,Ma),bgMagenta:t(`\x1B[45m`,Ma),bgCyan:t(`\x1B[46m`,Ma),bgWhite:t(`\x1B[47m`,Ma),blackBright:t(`\x1B[90m`,ja),redBright:t(`\x1B[91m`,ja),greenBright:t(`\x1B[92m`,ja),yellowBright:t(`\x1B[93m`,ja),blueBright:t(`\x1B[94m`,ja),magentaBright:t(`\x1B[95m`,ja),cyanBright:t(`\x1B[96m`,ja),whiteBright:t(`\x1B[97m`,ja),bgBlackBright:t(`\x1B[100m`,Ma),bgRedBright:t(`\x1B[101m`,Ma),bgGreenBright:t(`\x1B[102m`,Ma),bgYellowBright:t(`\x1B[103m`,Ma),bgBlueBright:t(`\x1B[104m`,Ma),bgMagentaBright:t(`\x1B[105m`,Ma),bgCyanBright:t(`\x1B[106m`,Ma),bgWhiteBright:t(`\x1B[107m`,Ma),rgb:e?(e,t,r)=>B(`\x1B[38;2;${e};${t};${r}m`,ja):i,bgRgb:e?(e,t,r)=>B(`\x1B[48;2;${e};${t};${r}m`,Ma):i,hex:e?e=>B(`\x1B[38;2;${c(e)}m`,ja):i,bgHex:e?e=>B(`\x1B[48;2;${c(e)}m`,Ma):i}}function C$1(){let e=typeof process<`u`?process:void 0,t=e?.env||{},r=t.FORCE_TTY!==`false`,a=e?.argv||[];return!(`NO_COLOR`in t||a.includes(`--no-color`))&&(`FORCE_COLOR`in t||a.includes(`--color`)||e?.platform===`win32`||r&&t.TERM!==`dumb`||`CI`in t)||typeof window<`u`&&!!window.chrome}e(C$1,`C`);function h({force:e}={}){return y(e||C$1())}var Na=h();const Pa=/* @__PURE__ */ e(e=>e.severity===1,`isErrorDiagnostic`),isWarningDiagnostic=e=>e.severity===2;var LikeC4=class{langium;logger;constructor(e,t=Aa){this.langium=e,this.logger=t}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get modelDiffs(){return this.langium.likec4.likec4.ModelDiffs}get removalImpact(){return this.langium.likec4.likec4.RemovalImpact}get modelEdits(){return this.langium.likec4.likec4.ModelEdits}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let e=this.languageServices.projects();if(e.length>1)throw this.logger.error(`Multiple projects found:
13
9
  ${e.map(e=>` - ${e.folder.fsPath}`).join(`
14
10
  `)}
15
11
 
16
- Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(e){let t=this.projectsManager.ensureProjectId(e);return await this.viewsService.diagrams(t)}syncComputedModel(e){let t=this.projectsManager.ensureProjectId(e);return this.modelBuilder.unsafeSyncComputeModel(t)}async computedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.modelBuilder.computeModel(t)}async parsedModel(e){let t=this.projectsManager.ensureProjectId(e),r=await this.modelBuilder.parseModel(t);if(!r)throw Error(`Failed to parse model for project "${t}"`);return r}async toBuilder(e=`editable`,t){let r=await this.parsedModel(t);return Cr.fromParsed(r.$data,e)}async toTypedBuilder(e){let{specification:t,mode:r=`editable`,project:o}=e,s=await this.parsedModel(o);return wr(t,s.$data.specification),Cr.fromParsed(s.$data,r)}async toDSL(e){return generateLikeC4((await this.parsedModel(e)).$data)}projects(){return F(this.languageServices.projects(),Nn(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return[...this.LangiumDocuments.userDocuments].flatMap(e=>(e.diagnostics?.filter(vc)??[]).map(({message:t,range:r})=>({message:t,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.userDocuments.some(e=>e.diagnostics&&e.diagnostics.some(vc))}printErrors(){let e=!1;for(let t of this.LangiumDocuments.userDocuments){let r=t.diagnostics?.filter(vc)??[];if(!M(r,1))continue;e=!0;let o=R(r,Zt(e=>{let t=e.range.start.line,r=e.message.split(`
17
- `);return r.length>5&&(r.length=5,r.push(`...`)),r.map((e,r)=>r===0?` `+$i.dim(`Line ${t}: `)+$i.red(e):` `.repeat(10)+$i.red(e))}),Ut(`
18
- `));this.logger.error(`Invalid ${t.uri.fsPath}\n${o}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}documentPaths(){return[...this.LangiumDocuments.userDocuments].map(e=>e.uri.fsPath)}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(t=>e(t));return()=>{t.dispose()}}async format(e){let{projects:t,...r}=e??{},o={...r,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(o)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const yc={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,configureLogger:!1,logLevel:void 0},validationErrorsToError=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
19
- `)}`);async function handleInitOptions(e,t=K,r){let o=new LikeC4(e,t),s=r?.throwIfInvalid??yc.throwIfInvalid,c=r?.printErrors??yc.printErrors;if((s||c)&&o.hasErrors()){if(s)return await o.dispose(),Promise.reject(validationErrorsToError(o));o.printErrors()}return o}async function createFromSources(e,t,r,o){let s=C.from({scheme:`virtual`,path:`/workspace`}),c={name:`virtual`,uri:s.toString()},u=e.shared.workspace.WorkspaceManager;u.initialize({capabilities:{},processId:null,rootUri:c.uri,workspaceFolders:[c]}),await u.initializeWorkspace([c]);let d=e.shared.ServiceRegistry.all.flatMap(e=>e.LanguageMetaData.fileExtensions),[p,m]=On(nn(r),([e])=>Ft(e));for(let[r,o]of p){let c=T.joinPath(s,r);try{await e.shared.workspace.ProjectsManager.registerProject({configUri:c,config:Mt.parse(o)})}catch(e){t.error(loggable(e))}}let h=R(m,F(([t,r])=>{d.includes(Bt(t))||(t+=`.c4`);let o=T.joinPath(s,t);return e.shared.workspace.LangiumDocuments.createDocument(o,r)}));return await e.shared.workspace.DocumentBuilder.build(h,{validation:!0}),handleInitOptions(e,t,o)}const J=new Proxy(Object.freeze({}),{get:(e,t)=>t});function f(e,t){return(...r)=>{let o=e?this.Digraph:this.Graph,s=r.find(e=>typeof e==`string`),c=r.find(e=>typeof e==`object`),u=r.find(e=>typeof e==`function`),d=new o(s,t,c);return d.with(this),typeof u==`function`&&u(d),d}}function n(e,t=Bn){return Object.freeze({digraph:f.call(t,!0,e),graph:f.call(t,!1,e)})}const bc=n(!1),xc=bc.digraph;bc.graph,n(!0);function O(e,t){let r=Vn(e,t?.convert);return zn(r,t?.print)}Rn()
12
+ Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(e){let t=this.projectsManager.ensureProjectId(e);return await this.viewsService.diagrams(t)}syncComputedModel(e){let t=this.projectsManager.ensureProjectId(e);return this.modelBuilder.unsafeSyncComputeModel(t)}async computedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.modelBuilder.computeModel(t)}async parsedModel(e){let t=this.projectsManager.ensureProjectId(e),r=await this.modelBuilder.parseModel(t);if(!r)throw Error(`Failed to parse model for project "${t}"`);return r}async toBuilder(e=`editable`,t){let r=await this.parsedModel(t);return Lr.fromParsed(r.$data,e)}async toTypedBuilder(e){let{specification:t,mode:r=`editable`,project:a}=e,o=await this.parsedModel(a);return Rr(t,o.$data.specification),Lr.fromParsed(o.$data,r)}async toDSL(e){let t=await this.parsedModel(e);return Ln(t.$data)}projects(){return V(this.languageServices.projects(),z(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return this.collectDiagnostics(Pa)}getWarnings(){return this.collectDiagnostics(isWarningDiagnostic)}collectDiagnostics(e){return[...this.LangiumDocuments.userDocuments].flatMap(t=>(t.diagnostics?.filter(e)??[]).map(({message:e,range:r})=>({message:typeof e==`string`?e:e.value,line:r.start.line,range:r,sourceFsPath:t.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.userDocuments.some(e=>e.diagnostics&&e.diagnostics.some(Pa))}printErrors(){let e=!1;for(let t of this.LangiumDocuments.userDocuments){let r=t.diagnostics?.filter(Pa)??[];if(!R(r,1))continue;e=!0;let a=I(r,zt(e=>{let t=e.range.start.line,r=(typeof e.message==`string`?e.message:e.message.value).split(`
13
+ `);return r.length>5&&(r.length=5,r.push(`...`)),r.map((e,r)=>r===0?` `+Na.dim(`Line ${t}: `)+Na.red(e):` `.repeat(10)+Na.red(e))}),Cn(`
14
+ `));this.logger.error(`Invalid ${t.uri.fsPath}\n${a}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}documentPaths(){return[...this.LangiumDocuments.userDocuments].map(e=>e.uri.fsPath)}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(t=>e(t));return()=>{t.dispose()}}async format(e){let{projects:t,...r}=e??{},a={...r,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(a)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const Fa={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,configureLogger:!1,logLevel:void 0},validationErrorsToError=e=>/* @__PURE__ */ Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
15
+ `)}`);async function handleInitOptions(e,t=Aa,r){let a=new LikeC4(e,t),o=r?.throwIfInvalid??Fa.throwIfInvalid,s=r?.printErrors??Fa.printErrors;if((o||s)&&a.hasErrors()){if(o)return await a.dispose(),Promise.reject(validationErrorsToError(a));a.printErrors()}return a}async function createFromSources(e,t,r,a){let o=j.from({scheme:`virtual`,path:`/workspace`}),s={name:`virtual`,uri:o.toString()},l=e.shared.workspace.WorkspaceManager;l.initialize({capabilities:{},processId:null,rootUri:s.uri,workspaceFolders:[s]}),await l.initializeWorkspace([s]);let p=e.shared.ServiceRegistry.all.flatMap(e=>e.LanguageMetaData.fileExtensions),[g,_]=dn(an(r),([e])=>Dt(e));for(let[r,a]of g){let s=D.joinPath(o,r);try{await e.shared.workspace.ProjectsManager.registerProject({configUri:s,config:Tt.parse(a)})}catch(e){t.error(loggable(e))}}let v=I(_,V(([t,r])=>{p.includes(En(t))||(t+=`.c4`);let a=D.joinPath(o,t);return e.shared.workspace.LangiumDocuments.createDocument(a,r)}));return await e.shared.workspace.DocumentBuilder.build(v,{validation:!0}),handleInitOptions(e,t,a)}const J=new Proxy(Object.freeze({}),{get:(e,t)=>t});function f(e,t){return(...r)=>{let a=e?this.Digraph:this.Graph,o=r.find(e=>typeof e==`string`),s=r.find(e=>typeof e==`object`),l=r.find(e=>typeof e==`function`),p=new a(o,t,s);return p.with(this),typeof l==`function`&&l(p),p}}function n(e,t=Vn){return Object.freeze({digraph:f.call(t,!0,e),graph:f.call(t,!1,e)})}const Ia=n(!1),La=Ia.digraph;Ia.graph,n(!0);function O(e,t){let r=Hn(e,t?.convert);return Bn(r,t?.print)}zn();var Ra=/* @__PURE__ */ r(((e,t)=>{
20
16
  /*!
21
17
  * word-wrap <https://github.com/jonschlinkert/word-wrap>
22
18
  *
23
19
  * Copyright (c) 2014-2023, Jon Schlinkert.
24
20
  * Released under the MIT License.
25
21
  */
26
- ;var Sc=e(o(((e,t)=>{function trimEnd(e){let t=e.length-1,r=e[t];for(;r===` `||r===` `;)r=e[--t];return e.substring(0,t+1)}function trimTabAndSpaces(e){return e.split(`
22
+ function trimEnd(e){let t=e.length-1,r=e[t];for(;r===` `||r===` `;)r=e[--t];return e.substring(0,t+1)}function trimTabAndSpaces(e){return e.split(`
27
23
  `).map(e=>trimEnd(e)).join(`
28
- `)}t.exports=function(e,t){if(t||={},e==null)return e;var r=t.width||50,o=typeof t.indent==`string`?t.indent:` `,s=t.newline||`
29
- `+o,c=typeof t.escape==`function`?t.escape:identity,u=`.{1,`+r+`}`;t.cut!==!0&&(u+=`([\\s​]+|$)|[^\\s​]+?([\\s​]+|$)`);var d=new RegExp(u,`g`),p=o+(e.match(d)||[]).map(function(e){return e.slice(-1)===`
30
- `&&(e=e.slice(0,e.length-1)),c(e)}).join(s);return t.trim===!0&&(p=trimTabAndSpaces(p)),p};function identity(e){return e}}))(),1);function isCompound(e){return e.children.length>0}function toArrowType(e){switch(e){case`open`:return`vee`;default:return e}}function pointToPx(e){return Array.isArray(e)?[pointToPx(e[0]),pointToPx(e[1])]:(G(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const inchToPx=e=>(G(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),pxToInch=e=>Math.ceil(e/72*1e3)/1e3,pxToPoints=e=>Math.ceil(e);pxToPoints(40).toString();function compoundColor(e,t){return Un(Wn(e,{l:-35-5*t,s:-15-5*t}))}function compoundLabelColor(e){return Un(Hn(e,.3))}function sanitize(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function wrap(e,{maxchars:t,maxLines:r,sanitize:o=Ln()}){let s=(0,Sc.default)(e,{width:t,indent:``,escape:o}).split(`
31
- `);return Kt(r)&&r>0&&s.length>r&&(s=s.slice(0,r)),s}function wrapWithFont({text:e,maxchars:t,fontsize:r,maxLines:o,bold:s,color:c}){let u=wrap(e,{maxchars:t,maxLines:o,sanitize}).join(`<BR/>`);s&&(u=`<B>${u}</B>`);let d=c?` COLOR="${c}"`:``;return`<FONT POINT-SIZE="${pxToPoints(r)}"${d}>${u}</FONT>`}function maxchars(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:yi(e)}}function nodeLabel(e,t){let{sizes:{size:r},values:o}=t.nodeSizes(e.style),s=t.colors(e.color).elements,c=[`sm`,`xs`].includes(r),u=z(e.icon),d=e.style.iconPosition??`left`,p=u&&(d===`left`||d===`right`),m=[wrapWithFont({text:e.title,fontsize:o.textSize,maxchars:maxchars(r),maxLines:c?1:3})];if(r!==`xs`){z(e.technology?.trim())&&m.push(wrapWithFont({text:e.technology,fontsize:Math.ceil(o.textSize*.65),maxchars:p?35:45,maxLines:1,color:s.loContrast}));let t=Mr.from(e.description).text;t&&m.push(wrapWithFont({text:t,fontsize:Math.ceil(o.textSize*.75),maxchars:p?35:45,maxLines:c?3:5,color:s.loContrast}))}if(m.length===1&&u===!1)return`<${m[0]}>`;let h=p?(t,r,s)=>{let c=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(r===0){let t=s.length>1?` ROWSPAN="${s.length}"`:``,r=Math.ceil(o.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(r+=20),d===`right`?(c=`<TD${t} WIDTH="16"> </TD>${c}`,c=`${c}<TD${t} WIDTH="${r}"> </TD>`):(c=`<TD${t} WIDTH="${r}"> </TD>${c}`,c=`${c}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${c}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,g=m.map(h).join(``);if(u&&(d===`top`||d===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(o.iconSize+8)}"> </TD></TR>`;g=d===`top`?`${e}${g}`:`${g}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${g}</TABLE>>`}function compoundLabel(e,t){let r=wrapWithFont({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return r.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${r}</TD></TR></TABLE>>`:`<${r}>`}const Cc=`BGCOLOR="${kr.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:e,technology:t}){let r=[];if(z(e?.trim())&&r.push(wrapWithFont({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),z(t?.trim())&&r.push(wrapWithFont({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),r.length===0)return null;let o=r.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``);return`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Cc}>${o}</TABLE>>`}function stepEdgeLabel(e,t){let r=`<TABLE BORDER="0" CELLPADDING="6" ${Cc}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return z(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${r}</TD>`,`<TD ${Cc} CELLPADDING="3">`,wrapWithFont({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${r}>`}const wc=`Arial`,Tc=createLogger(`dot`);var DotPrinter=class{view;styles;ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;viewNodes=new ii(e=>vi(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`));logger=Tc;graphology=new Oi({allowSelfLoops:!0,multi:!0,type:`directed`});G;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(isCompound).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),r=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||r===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),r=this.graphology.getNodeAttribute(t.target,`modelRef`));let o=-1;e!==null&&r!==null&&(o=fi(e,r)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:o,weight:1}),o>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:o}),o>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:o})}this.graphology.forEachEdge((e,{hierarchyDistance:t},r,o,s,c)=>{let u=Math.max(s.maxConnectedHierarchyDistance,c.maxConnectedHierarchyDistance);if(u>t)this.graphology.mergeEdgeAttributes(e,{weight:u-t+1});else{let s=this.graphology.directedDegree(r),c=this.graphology.directedDegree(o);s===1&&c===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let r=this.G=this.createGraph();this.applyNodeAttributes(r.attributes.node),this.applyEdgeAttributes(r.attributes.edge)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}selectViewNodes(){return this.view.nodes}selectViewEdges(){return this.view.edges}build(){let e=this.G,t=[];for(let r of this.selectViewNodes())if(isCompound(r))L(r.parent)&&t.push(r);else{let t=this.generateGraphvizId(r),o=this.elementToNode(r,e.node(t));this.nodes.set(r.id,o)}let traverseClusters=(e,t)=>{let r=this.generateGraphvizId(e),o=this.elementToSubgraph(e,t.subgraph(r));this.subgraphs.set(e.id,o);for(let t of e.children){let e=this.computedNode(t);if(isCompound(e))traverseClusters(e,o);else{let t=this.getGraphNode(e.id);t&&o.node(t.id)}}};for(let r of t)traverseClusters(r,e);for(let t of this.selectViewEdges()){let r=this.addEdge(t,e);r&&this.edges.set(t.id,r)}return this}print(){return this.build(),this.postBuild(this.G),O(this.G,{print:{indentStyle:`space`,indentSize:2}})}enableNewRankIfNeeded(){return this.G.subgraphs.some(e=>!!e.get(J.rank))&&this.G.set(J.newrank,!0),this}createGraph(){let e=this.view.autoLayout,t=e.direction,r=xc({[J.likec4_viewId]:this.view.id,[J.bgcolor]:`transparent`,[J.layout]:`dot`,[J.compound]:!0,[J.rankdir]:t,[J.TBbalance]:`min`,[J.splines]:`spline`,[J.outputorder]:`nodesfirst`,[J.nodesep]:pxToInch(e.nodeSep??110),[J.ranksep]:pxToInch(e.rankSep??120),[J.pad]:pxToInch(15),[J.fontname]:wc});return r.attributes.graph.apply({[J.fontsize]:pxToPoints(this.styles.fontSize()),[J.labeljust]:t===`RL`?`r`:`l`,[J.labelloc]:t===`BT`?`b`:`t`,[J.margin]:50.1}),r}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[J.fontname]:wc,[J.shape]:`rect`,[J.fillcolor]:t.fill,[J.fontcolor]:t.hiContrast,[J.color]:t.stroke,[J.style]:`filled`,[J.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[J.arrowsize]:.75,[J.fontname]:wc,[J.fontsize]:pxToPoints(14),[J.penwidth]:pxToPoints(2),[J.color]:t.line,[J.fontcolor]:t.label,[J.style]:this.$defaults.relationship.line})}reserveNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),!this.ids.has(e)&&(this.ids.add(e),e)}generateGraphvizId(e){let t=isCompound(e),r=_i(e.id).toLowerCase(),o=this.reserveNodeId(r,t),s=1;for(;o===!1;)o=this.reserveNodeId(r+`_`+s++,t);return o}elementToSubgraph(e,t){G(isCompound(e),`node should be compound`),G(tn(e.depth),`node.depth should be defined`);let r=this.styles.colors(e.color).elements,o=compoundLabelColor(r.loContrast);return t.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.likec4_depth]:e.depth,[J.fillcolor]:compoundColor(r.fill,e.depth),[J.color]:compoundColor(r.stroke,e.depth),[J.style]:`filled`,[J.margin]:pxToPoints(e.children.length>1?40:32)}),N(e.title.trim())||t.set(J.label,compoundLabel(e,o)),t}elementToNode(e,t){G(!isCompound(e),`node should not be compound`);let r=z(e.icon),{values:{padding:o,sizes:{width:s,height:c}}}=this.styles.nodeSizes(e.style),u=r?8:o;if(t.attributes.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.label]:nodeLabel(e,this.styles),[J.margin]:`${pxToInch(u)},${pxToInch(o)}`}),t.attributes.set(J.width,pxToInch(s)),t.attributes.set(J.height,pxToInch(c)),!this.styles.isDefaultColor(e.color)){let r=this.styles.colors(e.color).elements;t.attributes.apply({[J.fillcolor]:r.fill,[J.fontcolor]:r.hiContrast,[J.color]:r.stroke})}switch(e.shape){case`cylinder`:case`storage`:t.attributes.apply({[J.margin]:`${pxToInch(u)},${pxToInch(0)}`,[J.penwidth]:pxToPoints(2),[J.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[J.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o+6)}`});break;case`mobile`:t.attributes.apply({[J.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o)}`});break;case`queue`:t.attributes.apply({[J.width]:pxToInch(s),[J.height]:pxToInch(c-8),[J.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o)}`});break;case`component`:t.attributes.apply({[J.width]:pxToInch(s+10),[J.margin]:`${pxToInch(u+20)},${pxToInch(o)}`})}return t}leafElements(e){return e===null?P([...this.selectViewNodes()],e=>!isCompound(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return isCompound(t)?this.leafElements(t.id):[t]})}descendants(e){return e===null?[...this.selectViewNodes()]:this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return this.viewNodes.get(e)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let r=this.computedNode(e),o=this.getGraphNode(e),s;return o?[r,o,void 0]:(G(isCompound(r),`endpoint node should be compound`),s=this.getSubgraph(e)?.id,G(s,`subgraph ${e} not found`),r=vi(t(this.leafElements(e)),`leaf element in ${e} not found`),o=vi(this.getGraphNode(r.id),`source graphviz node ${r.id} not found`),[r,o,s])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return R(this.descendants(e),Zt(e=>Tn(e.inEdges,e.outEdges)),kn(),gn(Tn(t.inEdges,t.outEdges)),F(e=>this.view.edges.find(t=>t.id===e)),P(z))}assignGroups(){let e=R(this.view.nodes,P(isCompound),F(e=>e.id),En(ci),jn(),F(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),P(({edges:e})=>e.length>1&&e.length<8),fn(4)),t=new Set;for(let r of e){let e=r.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let o of e)try{let e=vi(this.getGraphNode(o.source),`Graphviz Node not found for ${o.source}`),s=vi(this.getGraphNode(o.target),`Graphviz Node not found for ${o.target}`);t.add(o.source),t.add(o.target),e.attributes.set(J.group,r.id),s.attributes.set(J.group,r.id)}catch(e){Tc.error(`Failed to assign group to edge ${o.id}`,{error:e})}}return this}},AiLayoutViewPrinter=class extends DotPrinter{aiHints;constructor(e,t,r){super(e,t),this.aiHints=r}createGraph(){let e=super.createGraph();return e.delete(J.TBbalance),e}selectViewNodes(){if(!this.aiHints.nodeOrder)return this.view.nodes;let e=[...this.view.nodes],t=[];for(let r of this.aiHints.nodeOrder){let o=e.findIndex(e=>e.id===r);o!==-1&&t.push(...e.splice(o,1))}return t.push(...e),t}selectViewEdges(){if(!this.aiHints.edgeOrder)return this.view.edges;let e=[...this.view.edges],t=[];for(let r of this.aiHints.edgeOrder){let o=e.findIndex(e=>e.id===r);o!==-1&&t.push(...e.splice(o,1))}return t.push(...e),t}postBuild(e){this.applyNodeRanks().addInvisibleEdges().enableNewRankIfNeeded()}applyNodeRanks(){let e=this.G;for(let t of this.aiHints.ranks){let r=[...new Set(t.nodes)].map(e=>this.getGraphNode(e)).filter(I);if(r.length===0||t.rank===`same`&&r.length===1)continue;let o=e.createSubgraph({[J.rank]:t.rank});for(let e of r)o.node(e.id)}return this}addEdge(e,t){let r=this.aiHints.reverseRank?.includes(e.id)??!1,[o,s]=r?[e.target,e.source]:[e.source,e.target],[,c,u]=this.edgeEndpoint(o,e=>Fn(e)),[,d,p]=this.edgeEndpoint(s,Xt),m=t.edge([c,d],{[J.likec4_id]:e.id});e.line&&e.line!==`dashed`&&m.attributes.set(J.style,e.line),p&&m.attributes.set(J.lhead,p),u&&m.attributes.set(J.ltail,u);let h=I(p)||I(u),g=edgelabel(e);if(g&&m.attributes.set(h?J.xlabel:J.label,g),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;m.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let _=this.aiHints.edgeWeight[e.id];_!==void 0&&_!==1&&m.attributes.set(J.weight,_);let v=this.aiHints.edgeMinlen[e.id];return v!==void 0&&v!==1&&m.attributes.set(J.minlen,v),this.aiHints.excludeFromRanking?.includes(e.id)&&m.attributes.set(J.constraint,!1),r&&m.attributes.set(J.dir,`back`),m}addInvisibleEdges(){if(!this.aiHints.invisibleEdges)return this;let e=this.G;for(let{source:t,target:r,...o}of this.aiHints.invisibleEdges){let s=this.getGraphNode(t),c=this.getGraphNode(r);if(!s||!c)continue;let u=`invisible_${t}->${r}`;if(this.edges.has(u)){this.logger.trace`invisible edge ${t} -> ${r} already exists with id ${u}, skipping creation`;continue}this.graphology.addEdgeWithKey(u,t,r,{hierarchyDistance:0,origin:`invisible`,weight:o.weight??1});let d=e.edge([s,c],{[J.style]:`invis`});this.edges.set(u,d),o.minlen!==void 0&&o.minlen!==1&&d.attributes.set(J.minlen,o.minlen),o.weight!==void 0&&o.weight!==1&&d.attributes.set(J.weight,o.weight)}return this}reduceDefaultRankSeparation(){let e=this.view.autoLayout,t=this.G;return tn(e.rankSep)||!(nn(this.aiHints.edgeMinlen).some(([e,t])=>t>1)||(this.aiHints.invisibleEdges?.some(e=>e.minlen&&e.minlen>1)??!1))||t.set(J.ranksep,pxToInch(80)),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(J.TBbalance),e.apply({[J.nodesep]:pxToInch(t.nodeSep??130),[J.ranksep]:pxToInch(t.rankSep??130)}),e}postBuild(){let e=this.G;return R(this.view.nodes,F(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),Jt(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Mn(),F(e=>e),qt(t=>{t.length<2||e.subgraph({[J.rank]:`same`},e=>{for(let{graphvizNode:r}of t)e.node(vi(r).id)})}),bn(()=>{e.set(J.newrank,!0),e.set(J.clusterrank,`global`),e.delete(J.pack),e.delete(J.packmode)})),this}elementToSubgraph(e,t){let r=super.elementToSubgraph(e,t);return e.children.length>1&&r.set(J.margin,pxToPoints(50)),r}addEdge(e,t){let[r,o]=[e.source,e.target],[s,c,u]=this.edgeEndpoint(r,e=>Fn(e)),[d,p,m]=this.edgeEndpoint(o,Xt),h=I(m)||I(u),g=t.edge([c,p],{[J.likec4_id]:e.id,[J.style]:e.line??`dashed`});m&&g.attributes.set(J.lhead,m),u&&g.attributes.set(J.ltail,u);let _=this.graphology.getEdgeAttribute(e.id,`weight`);_>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&g.attributes.set(J.weight,_);let v=edgelabel(e);if(v&&g.attributes.set(h?J.xlabel:J.label,v),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;g.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let[y,b]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return y===`none`&&b===`none`?(g.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`}),g):e.dir===`both`?(g.attributes.apply({[J.arrowhead]:toArrowType(y),[J.arrowtail]:toArrowType(e.tail??y),[J.dir]:`both`}),!h&&s.modelRef!==d.modelRef&&g.attributes.set(J.constraint,!1),g):(y&&g.attributes.set(J.arrowhead,toArrowType(y)),b!==`none`&&g.attributes.set(J.arrowtail,toArrowType(b)),g)}},DynamicViewPrinter=class extends DotPrinter{postBuild(e){e.delete(J.TBbalance),e.set(J.ordering,`in`)}addEdge(e,t){let{nodes:r}=this.view,[o,s]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[c,u,d]=this.edgeEndpoint(o,e=>Fn(e)),[p,m,h]=this.edgeEndpoint(s,Xt),g=t.edge([u,m],{[J.likec4_id]:e.id});if(e.line&&e.line!==this.$defaults.relationship.line&&g.attributes.set(J.style,e.line),h&&g.attributes.set(J.lhead,h),d&&g.attributes.set(J.ltail,d),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;g.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let _=[e.label?.trim(),e.technology?.trim()].filter(z).join(`
32
- `),v=stepEdgeLabel(this.view.edges.indexOf(e),_);g.attributes.set(J.label,v);let y=r.findIndex(e=>e.id===o);r.findIndex(e=>e.id===s)<y&&e.dir!==`back`&&g.attributes.apply({[J.minlen]:0});let[b,x]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(g.attributes.apply({[J.arrowtail]:toArrowType(b),[J.dir]:`back`}),x!==`none`&&g.attributes.apply({[J.arrowhead]:toArrowType(x),[J.minlen]:0}),g):b===`none`&&x===`none`||b!==`none`&&x!==`none`?(g.attributes.apply({[J.arrowhead]:toArrowType(b),[J.arrowtail]:toArrowType(x),[J.dir]:`both`}),g):b===`none`?(g.attributes.delete(J.arrowhead),g.attributes.apply({[J.arrowtail]:toArrowType(x),[J.minlen]:0,[J.dir]:`back`}),g):(g.attributes.set(J.arrowhead,toArrowType(b)),g)}};const Ec=createLogger(`dot.rank`);var ElementViewPrinter=class extends DotPrinter{postBuild(){this.assignGroups().tileNodesWithoutEdges().applyExplicitRankBlocks().enableNewRankIfNeeded()}tileNodesWithoutEdges(){let e=new Set,t=this.view.nodes.reduce((t,r)=>(isCompound(r)&&(e.add(r.id),t.push(r)),t),[]);for(let e of t){let t=R(e.children,P(e=>!this.compoundIds.has(e)&&this.graphology.degree(e)===0),F(e=>this.computedNode(e)));if(t.length<=2)continue;let r=2;switch(!0){case t.length>11:r=4;break;case t.length>4:r=3}let o=vi(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),s=null;xn(t,r).forEach(e=>{let t=e.length>1?o.createSubgraph({[J.rank]:`same`}):null;e.forEach((e,r)=>{let c=this.getGraphNode(e.id);c&&(t?.node(c.id),r===0&&(s&&o.edge([s,c],{[J.style]:`invis`}),s=c))})})}return this}applyExplicitRankBlocks(){let e=this.view.ranks??[];if(e.length===0)return this;let t=0;for(let r of e){let e=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(e.length===0)continue;let o=this.G.createSubgraph({[J.rank]:r.type});e.forEach(e=>o.node(e.id)),t+=1,Ec.trace`rank ${r.type} => ${e.map(e=>e.id).join(`, `)}`}return t>0&&this.G.set(`likec4_rankBlocks`,t),this}addEdge(e,t){let[r,o]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[s,c,u]=this.edgeEndpoint(r,e=>Fn(e)),[d,p,m]=this.edgeEndpoint(o,Xt),h=e.parent,g=this.graphology.getEdgeAttributes(e.id),_=t.edge([c,p],{[J.likec4_id]:e.id});e.line&&e.line!==this.$defaults.relationship.line&&_.attributes.set(J.style,e.line),m&&_.attributes.set(J.lhead,m),u&&_.attributes.set(J.ltail,u);let v=I(m)||I(u),y=edgelabel(e);if(y&&_.attributes.set(v?J.xlabel:J.label,y),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;_.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}!this.graphology.hasDirectedEdge(e.target,e.source)&&g.weight>1&&_.attributes.set(J.weight,g.weight);let[b,x]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return _.attributes.apply({[J.arrowtail]:toArrowType(b),[J.dir]:`back`}),x!==`none`&&_.attributes.apply({[J.arrowhead]:toArrowType(x),[J.dir]:`both`,[J.minlen]:0}),_;if(b===`none`&&x===`none`)return _.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`,[J.minlen]:0,[J.constraint]:!1}),_;if(b!==`none`&&x!==`none`)return _.attributes.apply({[J.arrowhead]:toArrowType(b),[J.arrowtail]:toArrowType(x),[J.dir]:`both`}),_;if(_.attributes.set(J.arrowhead,toArrowType(b)),x!==`none`&&_.attributes.set(J.arrowtail,toArrowType(x)),this.view.edges.length===1)return _;let ee;return ee=h===null&&s.parent==null&&d.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let r=this.computedNode(t.source),o=this.computedNode(t.target);return isCompound(r)||isCompound(o)?!1:r.parent==null&&o.parent==null}):this.findInternalEdges(h).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),ee.length===0&&(h===null||this.leafElements(h).length<=3)&&_.attributes.set(J.minlen,0),_}};function parseBB(e){let[t,r,o,s]=e?e.split(`,`).map(e=>pointToPx(+e)):[0,0,0,0],c=Math.round(o-t),u=Math.round(r-s);return{x:Math.round(t),y:Math.round(s),width:c,height:u}}function parsePos(e){try{let[t,r]=e.split(`,`);return{x:pointToPx(parseFloat(t)),y:pointToPx(parseFloat(r))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function parseNode(e){let{x:t,y:r}=parsePos(e.pos),o=inchToPx(parseFloat(e.width)),s=inchToPx(parseFloat(e.height));return{x:t-Math.round(o/2),y:r-Math.round(s/2),width:o,height:s}}function parseLabelBbox(e,[t,r]=[0,0]){if(!e||e.length===0)return null;let o=1/0,s=1/0,c=-1/0,u=-1/0,d=13;try{for(let p of e){if(p.op===`F`){d=pointToPx(p.size);continue}if(p.op===`T`){let e=pointToPx(p.pt[0])-t,m=pointToPx(p.width);switch(p.align){case`r`:e-=m;break;case`c`:e-=Math.round(m/2)}o=Math.min(o,e),c=Math.max(c,e+m);let h=pointToPx(p.pt[1])-r;s=Math.min(s,Math.round(h-d)),u=Math.max(u,h)}}}catch(t){return K.warn(`Failed on parsing label draw ops:
33
- {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return o===1/0?null:{x:o-2,y:s-2,width:c-o+4,height:u-s+4}}function parseEdgePoints({_draw_:e,likec4_id:t=`???`},r=`<unknown view>`){try{let o=e.filter(e=>e.op.toLowerCase()===`b`);G(M(o,1),`view ${r} edge ${t} should have at least one bezier draw op`),o.length>1&&K.warn(`view ${r} edge ${t} has more than one bezier draw op, using the first one only`);let s=o[0].points.map(e=>pointToPx(e));return G(M(s,2),`view ${r} edge ${t} should have at least two points`),s}catch(o){throw Error(`failed on parsing view ${r} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:o})}}function parseGraphvizEdge(e,{id:t,source:r,target:o,dir:s,label:c,description:u,...d},p){let m=parseLabelBbox(e._ldraw_??e._tldraw_??e._hldraw_),h=e.dir===`back`||s===`back`;return c=c&&m?wrap(c,{maxchars:40,maxLines:5}).join(`
34
- `):null,{id:t,source:r,target:o,label:c,...z(u)&&{description:u},points:parseEdgePoints(e,p),labelBBox:m,...h?{dir:`back`}:{},...d}}function parseGraphvizJson(e,t){let r=parseBB(e.bb),{nodes:o,edges:s,hasManualLayout:c,...u}=t,d=[],p=[],m;if(m=u._type===`dynamic`?{...u,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],subflows:[],steps:[],bounds:r},[Pr]:`layouted`,bounds:r,nodes:d,edges:p}:{...u,[Pr]:`layouted`,bounds:r,nodes:d,edges:p},c){let e=m;e[Nr]=`auto`}let h=e.objects??[];for(let e of o){let t=h.find(t=>t.likec4_id===e.id);G(t,`View ${u.id} node ${e.id} not found in graphviz output`);try{let{x:r,y:o,width:s,height:c}=`bb`in t?parseBB(t.bb):parseNode(t),u=[r,o];d.push({...e,x:r,y:o,width:s,height:c,labelBBox:parseLabelBbox(t._ldraw_,u)??{x:r,y:o,width:s,height:c}})}catch(r){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:r})}}let g=e.edges??[];for(let e of s){let t=g.find(t=>t.likec4_id===e.id);if(!t){K.warn`View ${u.id} edge ${e.id} not found in graphviz output, skipping`;continue}p.push(parseGraphvizEdge(t,e,u.id))}return m}function parseGraphvizJsonOfProjectsView(e,t){return parseGraphvizJson(e,t)}var Dc=class ProjectsViewPrinter extends DotPrinter{static toDot(e){return new ProjectsViewPrinter(e).print()}constructor(e){super(e,cr.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[J.nodesep]:pxToInch(100),[J.ranksep]:pxToInch(100)}),e.delete(J.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[J.likec4_id]:e.id,[J.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let r=vi(this.getGraphNode(e.source),`Node not found for ${e.source}`),o=vi(this.getGraphNode(e.target),`Node not found for ${e.target}`),s=this.graphology.getEdgeAttributes(e.id),c=t.edge([r,o],{[J.likec4_id]:e.id,[J.likec4_project]:e.projectId});e.line&&e.line!==this.$defaults.relationship.line&&c.attributes.set(J.style,e.line),!this.graphology.hasDirectedEdge(e.target,e.source)&&s.weight>1&&c.attributes.set(J.weight,s.weight);let u=edgelabel(e);if(u&&c.attributes.set(J.label,u),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;c.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}return c}},Node=class{value;next;constructor(e){this.value=e}},Queue=class{#e;#t;#n;constructor(){this.clear()}enqueue(e){let t=new Node(e);this.#e?(this.#t.next=t,this.#t=t):(this.#e=t,this.#t=t),this.#n++}dequeue(){let e=this.#e;if(e)return this.#e=this.#e.next,this.#n--,this.#e||(this.#t=void 0),e.value}peek(){if(this.#e)return this.#e.value}clear(){this.#e=void 0,this.#t=void 0,this.#n=0}get size(){return this.#n}*[Symbol.iterator](){let e=this.#e;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#e;)yield this.dequeue()}};function pLimit(e){let t=!1;if(typeof e==`object`&&({concurrency:e,rejectOnClear:t=!1}=e),validateConcurrency(e),typeof t!=`boolean`)throw TypeError("Expected `rejectOnClear` to be a boolean");let r=new Queue,o=0,resumeNext=()=>{o<e&&r.size>0&&(o++,r.dequeue().run())},next=()=>{o--,resumeNext()},run=async(e,t,r)=>{let o=(async()=>e(...r))();t(o);try{await o}catch{}next()},enqueue=(t,s,c,u)=>{let d={reject:c};new Promise(e=>{d.run=e,r.enqueue(d)}).then(run.bind(void 0,t,s,u)),o<e&&resumeNext()},generator=(e,...t)=>new Promise((r,o)=>{enqueue(e,r,o,t)});return Object.defineProperties(generator,{activeCount:{get:()=>o},pendingCount:{get:()=>r.size},clearQueue:{value(){if(!t){r.clear();return}let e=AbortSignal.abort().reason;for(;r.size>0;)r.dequeue().reject(e)}},concurrency:{get:()=>e,set(t){validateConcurrency(t),e=t,queueMicrotask(()=>{for(;o<e&&r.size>0;)resumeNext()})}},map:{async value(e,t){let r=Array.from(e,(e,r)=>generator(t,e,r));return Promise.all(r)}}}),generator}function validateConcurrency(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const Oc=pLimit(1);var kc=class GraphvizWasmAdapter{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){ki.unload()}[Symbol.dispose](){this.dispose()}async attempt(e,t,r){return await Oc(async()=>{let o=K.getChild([`layouter`,`wasm`,e,`_`,Sn(4).toLowerCase()]);try{o.trace`execute`;let e=await r();return++GraphvizWasmAdapter.opsCount>=20&&(GraphvizWasmAdapter.opsCount=0,o.trace`reached 20 operations, unloading wasm`,ki.unload()),e}catch(e){o.trace(`FAILED DOT
35
- `+t);let r=loggable(e);if(r.includes(`syntax error`))throw e;o.warn(r),GraphvizWasmAdapter.opsCount=0,ki.unload()}return o.warn(`Retrying...`),await di(30,300),await r()})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await ki.load()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await ki.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await ki.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await ki.load()).layout(e,`svg`))}};const getPrinter=({view:e,styles:t})=>{switch(!0){case qr(e):return new DynamicViewPrinter(e,t);case Kr(e):return new DeploymentViewPrinter(e,t);case Jr(e):return new ElementViewPrinter(e,t);default:yi(e)}},Ac=K.getChild(`layouter`);function normalizeDot(e){return e.split(`
24
+ `)}t.exports=function(e,t){if(t||={},e==null)return e;var r=t.width||50,a=typeof t.indent==`string`?t.indent:` `,o=t.newline||`
25
+ `+a,s=typeof t.escape==`function`?t.escape:identity,l=`.{1,`+r+`}`;t.cut!==!0&&(l+=`([\\s​]+|$)|[^\\s​]+?([\\s​]+|$)`);var p=new RegExp(l,`g`),g=a+(e.match(p)||[]).map(function(e){return e.slice(-1)===`
26
+ `&&(e=e.slice(0,e.length-1)),s(e)}).join(o);return t.trim===!0&&(g=trimTabAndSpaces(g)),g};function identity(e){return e}}));const za=[`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ANmAAAACAOWAAAACATKAAAABAAOAAAACAJaAAAACARaAAAACAGGAAAACAFCAAAACAKyAAAACAKOAAAACAM2AAAACAQCAAAACAFSAAAACACWAAAACABGAAAACAHCAAAABAAeAAAACANiAAAACAQaAAAACAQ+AAAACASCAAAACARuAAAACATSAAAACAOaAAAACAKiAAAACATOAAAACALKAAAACAOqAAAACAKSAAAACAOKAAAACAPqAAAACAJCAAAACALaAAAACAPOAAAACAL2AAAACAPWAAAACAIqAAAACAE6AAAACAKaAAAACAN+AAAACAJ+AAAACAGuAAAACAHWAAAACASGAAAACAJGAAAACAPGAAAACAJSAAAACAJuAAAACAICAAAAAAA+AAAACAKuAAAACAOSAAAACALmAAAACAFiAAAACAISAAAACASaAAAACAS2AAAACAIGAAAACAT6AAAACATGAAAACAOOAAAACALyAAAACALCAAAABAA6AAAABAAuAAAAAABGAAAACAQ2AAAACALqAAAACADiAAAACAHqAAAACANWAAAAAAB2AAAAAABWAAAACAJyAAAACAMeAAAACAIOAAAAAABqAAAACASiAAAACAHKAAAACAHGAAAACALGAAAAAAAmAAAABAAEAywAFAAMAEAABAAMAAQAXABEAEQAQAAoAHQAQAA4ACQAJAAEAAAADAAkAEgAYAAcAAAAZAAAADAAbAAQAAAACAAAAAAAAAAIAAAAIAB4AAAAAAAAAAAACAAAAAgAAAA8AEwAGAAAAFAAAAAsAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAA0ADQAAABYAFgAcABYAHAAVABUAIgAjACIAIwAWABYAIAAhACAAIQAAAAAAAAAAAAAAAAAAAB8AAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAFQAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAUABQAFAAUABQAFAAUAAQADAAEAAQABAAEACQAKAAoACgAKAB0ACQABAAEAAQABAAEAAQABABcAAAAHAAcABwAHAAwADAAEAAQABAAEAAQABAAEAAIAAAAAAAAAAAAAAAAACAAIAAgACAAAAAIAAgACAAIAAgACAAIAAAAGAAYABgAGAAsAAQABAMsAAgAAACIAEQAAAAUAAAASABIACwAJAAoAJAAaAAsACwAGACIACgAgABMAGwAAAAAAHAAAAA0AIQABAAAADwAdAAMAAAAUAAAACAAlACYAFQAAAAAABAAAAAQAHgAQABYABwAAABcAAAAMAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4AAAAZABkAIwAZACMAGAAYACoAKwAqACsAGQAZACgAKQAoACkAAAAAAAAAAAAAAAAAJwAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYABgAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQACAAIAAgACAAIAAgAFABEABgAFAAUABQAFAAoACQAJAAkACQAKAAsABgAGAAYABgAGAAYABQAAACIAAAAAAAAAAAANAA0AAQABAAEAAQABAAEAAwAPAAAAHQADAAMAAwADAAgACAAIAAgAAAAEAAQABAAEAAQABAADAAAABwAHAAcABwAMAAEAAgAAAAgAAQFcAEQAAACpUbZRnFDaUDZPgEz8TEZMRkvYS5pLbkrcSixL2EvYSZRQ2kl6SMpIPkegUZxFXkTYQ1xCykIaQV5ABj+YPxI+vDwCO7I7Sjr6OlY5vjlENq45RDYuNYQ01DS0MdwxAi6uLgotZixKK6ArjCuMK4wp4CnAKcApsinAKbIpnimeKXgpOil4KTopwCnAKTIpJCkyKSQpECeyJxom1iSyJGgkTimeKZ4pnkuaUbZRtlG2UbZRtlG2T4BQNiO2T4BPgE+AT4BJekuaI1oi/kuaSXpL2EmUSZRJlEmUSZRJlE+AIFxQ2lGcUZxRnFGcQspCykFeQV5BXkFeQV5BXj68P5g/Ej68Prw+vD68O0o7SjtKO0o5RDlEOUQ5RDlEOUQ+vB3ANLQ0tDS0NLQuChxuG1gaPBiQF4AV5hQcEewQ6A76Da4MbgtwChgI/AdWBmoE4gMwAa4AAgANAAEABAAAAAYAIwAEACUAKAAiACsANgAmAEEAWAAyAFoAXABKAGIAYgBNAGwAbQBOAHEAcwBQAIgAswBTALUAvQB/AL8AywCIAM0A4ACVAEAAAQAAT8QAAgAKULgABAAKULgABQAKULgABgAKULgAB//2ULgACP/7ULIACf/7ULIAEQAKULgAEwAKULgAFf/7ULIAFv/sFDIAGf/sTYQAG//sUNwAHf/7ULIAJf/xULIAL//2PPwAMP/EUNwAMf/7ULIAMv/EUPQAM//dULgANP/sTU4ANf+wULIANgAKT8oAiP/2ULgAiQAAT8QAigAAT8QAiwAAT8QAjAAAT8QAjQAAT8QAjgAAT8QAjwAAT8QAkAAKULgAkQAKULgAkgAKULgAkwAKULgAlAAKULgAlQAKULgAnQAKULgAngAKULgAnwAKULgAoAAKULgAoQAKULgAogAKULgAowAKULgApP/2ULgAqv/sUNwAq//sUNwArP/7ULIArf/7ULIArv/7ULIAr//7ULIAsP/7ULIAsf/7ULIAsv/7ULIAuv/xULIAu//xULIAvP/xULIAvf/xULIAx//7ULIAyP/7ULIAyf/7ULIAyv/7ULIAy/+wULIASAABAABOQgACAApPNgAEAAVPNgAFAApPNgAGAAVPNgAH/+xOgAAI//tPMAAJ//tPMAARAAVPNgATAApPNgAY/+JPMAAZ/+dPhAAaAABOSAAb/+dPMAAcAApPWgAdAABPMAAf//ZPMAAj//ZPMAAmAAVPNgAr//ZPMAAt//ZPMAAw/8RPWgAx//tPMAAy/7pOgAAz/9hPMAA0//ZL2AA1/7BOgAA2AA9NkgCI/+xOgACJAABOQgCKAABOQgCLAABOQgCMAABOQgCNAABOQgCOAABOQgCPAABOQgCQAAVPNgCRAApPNgCSAAVPNgCTAAVPNgCUAAVPNgCVAAVPNgCdAAVPNgCeAAVPNgCfAAVPNgCgAAVPNgChAAVPNgCiAAVPNgCjAAVPNgCk/+xOgACq/+dPMACr/+dPMACsAABPMACtAABPMACuAABPMACvAABPMACwAABPMACxAABPMACyAABPMACz//ZPMAC///ZPMADA//ZPMADB//ZPMADC//ZPMADD//ZPMADE//ZPMADF//ZPMADH//tPMADI//tPMADJ//tPMADK//tPMADL/7BOgABBAAIABUpoAAQABUpoAAUABUpoAAYABUpoAAf/9kyoAAj/8T5uAAn/8T5uABEABUpoABMABUpoABb/+0vsABj/9jCcABn/9ko4ABr/9k2EABv/+0poAB0AAEs8AB8ABU2EACMABU2EACb/7EoUACsABU2EAC0ABU2EAC//9k3SADD/zkzOADH/+01+ADL/2CaSADP/50o4ADT/4inGADX/xEyKADYABU2EAIj/9kyoAJAABUpoAJEABUpoAJIABUpoAJMABUpoAJQABUpoAJUABUpoAJ0ABUpoAJ4ABUpoAJ8ABUpoAKAABUpoAKEABUpoAKIABUpoAKMABUpoAKT/9kyoAKr/+0poAKv/+0poAKwAAEs8AK0AAEs8AK4AAEs8AK8AAEs8ALAAAEs8ALEAAEs8ALIAAEs8ALMABU2EAL8ABU2EAMAABU2EAMEABU2EAMIABU2EAMMABU2EAMQABU2EAMUABU2EAMf/+01+AMj/+01+AMn/+01+AMr/+01+AMv/xEyKACYACP/xSIwACf/xSIwAFv/nD3YAGgAASw4AG//nS/wAHAAKTCAAH//5AOYAI//5AOYAJf/7S/YAJgAAQQwAK//5AOYALf/5AOYAL//7TEQAMP/ESxoAMf/2S0YAMv/OSxoAM//YSbQANf+6ERAANgAPSlgAqv/nS/wAq//nS/wAs//5AOYAuv/7S/YAu//7S/YAvP/7S/YAvf/7S/YAv//5AOYAwP/5AOYAwf/5AOYAwv/5AOYAw//5AOYAxP/5AOYAxf/5AOYAx//2S0YAyP/2S0YAyf/2S0YAyv/2S0YAy/+6ERAAAgDegAAARgABAABLXgACAABJeAAEAABJeAAFAABJeAAGAABJeAAI//ZHsgAJ//ZHsgARAABJeAATAABJeAAY/+xLXgAZ//ZLNAAaAABKIgAb//FLEAAcAA9JbAAdAABHsgAf//tJeAAj//tJeAAl//tLCgAmAABHsgAr//tJeAAt//tJeAAv//tLWAAw/85LNAAy/8RLXgAz/+JLBAA0AABLEAA1/7BLCgA2AApLEACJAABLXgCKAABLXgCLAABLXgCMAABLXgCNAABLXgCOAABLXgCPAABLXgCQAABJeACRAABJeACSAABJeACTAABJeACUAABJeACVAABJeACdAABJeACeAABJeACfAABJeACgAABJeAChAABJeACiAABJeACjAABJeACq//FLEACr//FLEACsAABHsgCtAABHsgCuAABHsgCvAABHsgCwAABHsgCxAABHsgCyAABHsgCz//tJeAC6//tLCgC7//tLCgC8//tLCgC9//tLCgC///tJeADA//tJeADB//tJeADC//tJeADD//tJeADE//tJeADF//tJeADL/7BLCgAvAAEACkh2AAQACklqAAYACklqAAf/9kiOAAj/+zHyAAn/+zHyABEACklqABUABUm4ABb/9kiOABj/7EYeABn/8TWuABoAAEmOABv/8TWuABwAHkKYACUAAElkACYACkm4ADD/00fGADL/zklqADP/7EmOADYAHkfGAIj/9kiOAIkACkh2AIoACkh2AIsACkh2AIwACkh2AI0ACkh2AI4ACkh2AI8ACkh2AJAACklqAJIACklqAJMACklqAJQACklqAJUACklqAJ0ACklqAJ4ACklqAJ8ACklqAKAACklqAKEACklqAKIACklqAKMACklqAKT/9kiOAKr/8TWuAKv/8TWuALoAAElkALsAAElkALwAAElkAL0AAElkADkAAQAARTIAAgAFSJwABAAFSJwABQAFSJwABgAFSJwACP/7SEgACf/7SEgAEQAFSJwAEwAFSJwAGP/sSJwAGf/2SHIAGgAARgYAG//sSHIAHAAKSHIAHQAKSE4AJQAASEgAJgAARTIAL//7RrYAMP/ESEgAMv/OSHIAM//TQsAANf+wRrYANgAUSFQAiQAARTIAigAARTIAiwAARTIAjAAARTIAjQAARTIAjgAARTIAjwAARTIAkAAFSJwAkQAFSJwAkgAFSJwAkwAFSJwAlAAFSJwAlQAFSJwAnQAFSJwAngAFSJwAnwAFSJwAoAAFSJwAoQAFSJwAogAFSJwAowAFSJwAqv/sSHIAq//sSHIArAAKSE4ArQAKSE4ArgAKSE4ArwAKSE4AsAAKSE4AsQAKSE4AsgAKSE4AugAASEgAuwAASEgAvAAASEgAvQAASEgAy/+wRrYAKgABAABDmAACAAVHPgAFAAVHPgAH//ZG8AATAAVHPgAVAABG8AAaAApHGgAcABRG9gAf//tG8AAj//tG8AAlAApErgAmAABG8AAr//tG8AAt//tG8AAvAABHRAAw/85HGgAy/85ErgAz/91G9gA1/7BHRACI//ZG8ACJAABDmACKAABDmACLAABDmACMAABDmACNAABDmACOAABDmACPAABDmACRAAVHPgCk//ZG8ACz//tG8AC6AApErgC7AApErgC8AApErgC9AApErgC///tG8ADA//tG8ADB//tG8ADC//tG8ADD//tG8ADE//tG8ADF//tG8ADL/7BHRAA1AAEAAEXyAAf/7EVCABUAAEXyABj/2EKOABv/4kVCABwAFEX4AB0AD0XyAB//9kVCACP/9kVCACUAAEKIACYAAEXyACv/9kVCAC3/9kVCADD/xEYcADH/7EKIADL/ukVCADX/nEKmADYAGUX4AIj/7EVCAIkAAEXyAIoAAEXyAIsAAEXyAIwAAEXyAI0AAEXyAI4AAEXyAI8AAEXyAKT/7EVCAKr/4kVCAKv/4kVCAKwAD0XyAK0AD0XyAK4AD0XyAK8AD0XyALAAD0XyALEAD0XyALIAD0XyALP/9kVCALoAAEKIALsAAEKIALwAAEKIAL0AAEKIAL//9kVCAMD/9kVCAMH/9kVCAML/9kVCAMP/9kVCAMT/9kVCAMX/9kVCAMf/7EKIAMj/7EKIAMn/7EKIAMr/7EKIAMv/nEKmADcAAQAAQVoAAgAKRLgABAAKRLgABQAKRLgABgAKRLgAEQAKRLgAEwAKRLgAGgAAQ8oAG//nRLgAHAAKRNwAHQAURNwAJf/7RAIAJgAARAIAMQAARLgAMv/ORNwANf+wQ9wANgAKRLgAiQAAQVoAigAAQVoAiwAAQVoAjAAAQVoAjQAAQVoAjgAAQVoAjwAAQVoAkAAKRLgAkQAKRLgAkgAKRLgAkwAKRLgAlAAKRLgAlQAKRLgAnQAKRLgAngAKRLgAnwAKRLgAoAAKRLgAoQAKRLgAogAKRLgAowAKRLgAqv/nRLgAq//nRLgArAAURNwArQAURNwArgAURNwArwAURNwAsAAURNwAsQAURNwAsgAURNwAuv/7RAIAu//7RAIAvP/7RAIAvf/7RAIAxwAARLgAyAAARLgAyQAARLgAygAARLgAy/+wQ9wAUgAB//tDhAAC//ZCfgAE//ZCigAF//ZCfgAG//ZCigAHAApDZgAI/+xDqAAJ/+xDqAALABlDigAP//ZB1AAQ//ZB1AAR//ZCigASAABDWgAT//ZCfgAU//ZB1AAV//FDbAAWABlDbAAYAA9AUAAZABRCfgAaAABBJAAbAA9AUAAcAApDkAAd/8RByAAf//tDbAAj//tDbAAl//tDZgAm/9NByAAr//tDbAAt//tDbAAwABRDbAAzABRDhAA0AABDkAA2//ZCtgCIAApDZgCJ//tDhACK//tDhACL//tDhACM//tDhACN//tDhACO//tDhACP//tDhACQ//ZCigCR//ZCfgCS//ZCigCT//ZCigCU//ZCigCV//ZCigCW//ZB1ACXABlDigCYABlDigCZABlDigCaABlDigCc//ZB1ACd//ZCigCe//ZCigCf//ZCigCg//ZCigCh//ZCigCi//ZCigCj//ZCigCkAApDZgCqAA9AUACrAA9AUACs/8RByACt/8RByACu/8RByACv/8RByACw/8RByACx/8RByACy/8RByACz//tDbAC6//tDZgC7//tDZgC8//tDZgC9//tDZgC///tDbADA//tDbADB//tDbADC//tDbADD//tDbADE//tDbADF//tDbAArAAEAAECQAAcACkDIAAj/+yDWAAn/+yDWAAsAFEDIABgAFEHMABkAGUGWABoACkGiABsAFEHMABwAFD/aAB3/zkGcACX/9kDIACb/zkGiADAACkHMADMACkF+ADT/9j82ADb/9gMiAIgACkDIAIkAAECQAIoAAECQAIsAAECQAIwAAECQAI0AAECQAI4AAECQAI8AAECQAJcAFEDIAJgAFEDIAJkAFEDIAJoAFEDIAKQACkDIAKoAFEHMAKsAFEHMAKz/zkGcAK3/zkGcAK7/zkGcAK//zkGcALD/zkGcALH/zkGcALL/zkGcALr/9kDIALv/9kDIALz/9kDIAL3/9kDIAFoAAf/sAioAAv/iQLYABP/OP54ABf/iQLYABv/OP54AB//2P54ACP/dAiQACf/dAiQACwAUAh4AD//sPQoAEP/sPQoAEf/OP54AEv/sP8QAE//iQLYAFP/sPQoAFf/iP8QAFv/7QHQAF//sPiwAGAAAP54AGQAFQJIAGv/2QJ4AGwAAQMgAHP/2QJ4AHf+wP8QAHwAAQJIAIwAAQJIAJQAFQHQAJv/dQKQAKwAAQJIALQAAQJIAL//2QMgAMAAeQMgAMwAeP4wANAAKQHoANQAUQJ4ANgAFQHQAiP/2P54Aif/sAioAiv/sAioAi//sAioAjP/sAioAjf/sAioAjv/sAioAj//sAioAkP/OP54Akf/iQLYAkv/OP54Ak//OP54AlP/OP54Alf/OP54Alv/sPQoAlwAUAh4AmAAUAh4AmQAUAh4AmgAUAh4AnP/sPQoAnf/OP54Anv/OP54An//OP54AoP/OP54Aof/OP54Aov/OP54Ao//OP54ApP/2P54Apv/sPiwAp//sPiwAqP/sPiwAqf/sPiwAqgAAQMgAqwAAQMgArP+wP8QArf+wP8QArv+wP8QAr/+wP8QAsP+wP8QAsf+wP8QAsv+wP8QAswAAQJIAugAFQHQAuwAFQHQAvAAFQHQAvQAFQHQAvwAAQJIAwAAAQJIAwQAAQJIAwgAAQJIAwwAAQJIAxAAAQJIAxQAAQJIAywAUQJ4AAgAmgAAAAgASgAAAAgA2gAAASwABAAA9XAACAAA9XAAE//s+SgAFAAA9XAAG//s+SgAI//s8CAAJ//s8CAALABQ8AgAR//s+SgATAAA9XAAWAAoBxAAYABQ+mAAZABQ+bgAaAAo9YgAbAB49XAAcABQvOgAd/848pgAfAAA+SgAjAAA+SgAl/+w+RAAm/9MxPAArAAA+SgAtAAA+SgAw//Y+RAAyAAA9YgAzAAU+SgA0/+I9lAA1//E+SgA2/+w+hgCJAAA9XACKAAA9XACLAAA9XACMAAA9XACNAAA9XACOAAA9XACPAAA9XACQ//s+SgCRAAA9XACS//s+SgCT//s+SgCU//s+SgCV//s+SgCXABQ8AgCYABQ8AgCZABQ8AgCaABQ8AgCd//s+SgCe//s+SgCf//s+SgCg//s+SgCh//s+SgCi//s+SgCj//s+SgCqAB49XACrAB49XACs/848pgCt/848pgCu/848pgCv/848pgCw/848pgCx/848pgCy/848pgCzAAA+SgC6/+w+RAC7/+w+RAC8/+w+RAC9/+w+RAC/AAA+SgDAAAA+SgDBAAA+SgDCAAA+SgDDAAA+SgDEAAA+SgDFAAA+SgDL//E+SgACAQGAAABCAAIAADuSAAQAADykAAUAADuSAAYAADykAAgAAAGUAAkAAAGUAAsAFDo4ABEAADykABMAADuSABYAFBsQABgAFDk0ABkAFDuGABoACjuYABsAHi1wABwAFDrcAB3/zgGOAB//+zx6ACP/+zx6ACX/9jx6ACb/0yzeACv/+zx6AC3/+zx6ADAABTkiADMADzykADT/+zyAADUAADzOADYAADbsAJAAADykAJEAADuSAJIAADykAJMAADykAJQAADykAJUAADykAJcAFDo4AJgAFDo4AJkAFDo4AJoAFDo4AJ0AADykAJ4AADykAJ8AADykAKAAADykAKEAADykAKIAADykAKMAADykAKoAHi1wAKsAHi1wAKz/zgGOAK3/zgGOAK7/zgGOAK//zgGOALD/zgGOALH/zgGOALL/zgGOALP/+zx6ALr/9jx6ALv/9jx6ALz/9jx6AL3/9jx6AL//+zx6AMD/+zx6AMH/+zx6AML/+zx6AMP/+zx6AMT/+zx6AMX/+zx6AMsAADzOAAIBNoAAAAIAVYAAACwAAQAFOUIACAAAOjAACQAAOjAACwAUOJ4AFQAAOuAAFgAUOgoAGAAZN7IAGQAeOwoAGgAKOuYAGwAeOewAHAAUNBQAHf/YOwoAJf/7OuAAJv/dAQoAMAAKOwoAMgAPJyQAMwAUIsoANP/7OuYANQAAOwoAiQAFOUIAigAFOUIAiwAFOUIAjAAFOUIAjQAFOUIAjgAFOUIAjwAFOUIAlwAUOJ4AmAAUOJ4AmQAUOJ4AmgAUOJ4AqgAeOewAqwAeOewArP/YOwoArf/YOwoArv/YOwoAr//YOwoAsP/YOwoAsf/YOwoAsv/YOwoAuv/7OuAAu//7OuAAvP/7OuAAvf/7OuAAywAAOwoAAgFAgAAARgABAAA46AACAAA46AAEAAA46AAFAAA46AAGAAA46AAHAAo2eAAI//Y5IAAJ//Y5IAALAA850AAMABQBpgARAAA46AATAAA46AAWAAogcgAZABQ47gAbABQ51gAcAAo51gAf//s50AAj//s50AAlAAA3jgAm/9gqNAAr//s50AAt//s50AAvAAA5+gAwAAo2eAAyABQ46AAzABQ6AAA0AAA53AA1AAA6JACIAAo2eACJAAA46ACKAAA46ACLAAA46ACMAAA46ACNAAA46ACOAAA46ACPAAA46ACQAAA46ACRAAA46ACSAAA46ACTAAA46ACUAAA46ACVAAA46ACXAA850ACYAA850ACZAA850ACaAA850ACbABQBpgCdAAA46ACeAAA46ACfAAA46ACgAAA46AChAAA46ACiAAA46ACjAAA46ACkAAo2eACqABQ51gCrABQ51gCz//s50AC6AAA3jgC7AAA3jgC8AAA3jgC9AAA3jgC///s50ADA//s50ADB//s50ADC//s50ADD//s50ADE//s50ADF//s50ADLAAA6JAACACGAAAAvAAEAADhOAAcACjTMAAgAADgkAAkAADgkAAsAGTgkABUAADd0ABYACjTMABkAGThOABoAADh4ABsAFDhOABwACjhOAB3/4jhOACUAADgkACb/2DaGAC8AADhOADAACjTMADIAFDhOADMAFDhOADQAADhOADUAADaSAIgACjTMAIkAADhOAIoAADhOAIsAADhOAIwAADhOAI0AADhOAI4AADhOAI8AADhOAJcAGTgkAJgAGTgkAJkAGTgkAJoAGTgkAKQACjTMAKoAFDhOAKsAFDhOAKz/4jhOAK3/4jhOAK7/4jhOAK//4jhOALD/4jhOALH/4jhOALL/4jhOALoAADgkALsAADgkALwAADgkAL0AADgkAMsAADaSAC4ABwAFM54ACAAAM54ACQAAM54ACwAANlgAFQAANlgAFgAKNlgAGAAKM7AAGwAAHaoAHf/YNzIAH//7NwgAI//7NwgAJf/sNwgAJv/EJ2wAK//7NwgALf/7NwgALwAANWoANf/iNlgANv/sNiwAiAAFM54AlwAANlgAmAAANlgAmQAANlgAmgAANlgApAAFM54AqgAAHaoAqwAAHaoArP/YNzIArf/YNzIArv/YNzIAr//YNzIAsP/YNzIAsf/YNzIAsv/YNzIAs//7NwgAuv/sNwgAu//sNwgAvP/sNwgAvf/sNwgAv//7NwgAwP/7NwgAwf/7NwgAwv/7NwgAw//7NwgAxP/7NwgAxf/7NwgAy//iNlgAOAABAAA2HAAC/+wegAAE//s1+AAF/+wegAAG//s1+AAHAAouVgAI//swZAAJ//swZAAR//s1+AAT/+wegAAWAAoylAAbABQzsAAcABQ2HAAd/842HAAl//s1QgAm/842HAAwAAo1HAAyABQ2HAAzABk0VAA0//s1+AA2AAA2NACIAAouVgCJAAA2HACKAAA2HACLAAA2HACMAAA2HACNAAA2HACOAAA2HACPAAA2HACQ//s1+ACR/+wegACS//s1+ACT//s1+ACU//s1+ACV//s1+ACd//s1+ACe//s1+ACf//s1+ACg//s1+ACh//s1+ACi//s1+ACj//s1+ACkAAouVgCqABQzsACrABQzsACs/842HACt/842HACu/842HACv/842HACw/842HACx/842HACy/842HAC6//s1QgC7//s1QgC8//s1QgC9//s1QgBoAAEAADFaAAIADzSmAAQADzSmAAUADzSmAAYADzSmAA8AADT0ABAAADT0ABEADzSmABIAADT0ABMADzSmABQAADT0ABUACjSmABcAADT0ABgACiDqABkACgKWABr/+zTKABsACgKWABwAADToAB3/7CDqACb/3QKQADL/6QKKADP//QKKADT/3gKEADX/5QJ+AEEAADToAEIACjT0AEb/fjOsAEf/2AJ4AEj/2AJ4AEr/2AJ4AEwAADO4AE0AADO4AE4AAC8SAE8AADTiAFAAAC8SAFEAADTiAFL/2AJ4AFP/2AJ4AFQAHjFaAFUABTSmAFYAHjFaAFcABTSmAF0AADJeAGL/2AJyAGwAAByEAHEAADO4AHIAADO4AHMAADO4AIkAADFaAIoAADFaAIsAADFaAIwAADFaAI0AADFaAI4AADFaAI8AADFaAJAADzSmAJEADzSmAJIADzSmAJMADzSmAJQADzSmAJUADzSmAJYAADT0AJwAADT0AJ0ADzSmAJ4ADzSmAJ8ADzSmAKAADzSmAKEADzSmAKIADzSmAKMADzSmAKYAADT0AKcAADT0AKgAADT0AKkAADT0AKoACgKWAKsACgKWAKz/7CDqAK3/7CDqAK7/7CDqAK//7CDqALD/7CDqALH/7CDqALL/2DTKAMv/5QJ+AM0ACjOsAM4AADFaAM8AChM8ANAAADFaANEACjFaANIAADFaANMAADToANT/7CDqANUABTToANb/8Sm2ANcAADFaANgAADFaANkAABtyANoAACm2ANv/8SDqANwAADFaAN3/9jOsAN4ACjFaAN8AACDqAOAAADT0AAIBR4AAAAIAEIAAAAIBCYAAAAIBDoAAAAIBI4AAAAIBSIAAAAIBHIAAAG8AAQAKMkYAAgAAMRYABAAAMRYABQAAMRYABgAAMRYABwAALHAACAAALqwACQAALqwAEQAAMRYAEwAAMRYAFgAAMRwAGP/7L8IAGf/7MfgAGgAAL8IAG//7L8IAHQAKMkYAHwAAMkYAIwAAMkYAJQAAMkYAKwAAMkYALQAAMkYALwAAMRwAMP/sL8IAMQAALtAAMv/2MigAM//2MgoANf/sMlgANgAALqwAQ//2MVQARP/2MVQARf/2MVQARwAUApwASAAUApwASgAUApwATAAAMhYATQAAMhYATv/sMSgAT//sMRwAUP/sMSgAUf/sMRwAUgAUApwAUwAUApwAVAAeBmgAVgAeBmgAWgAKMSgAW//2LHAAbP/xMigAbf/iLqwAbv/2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GMgA3v/iGM4A3//2HHQA4P/iGM4AYwAB//YYhAAC/+wcBgAE/+wYbAAF/+wcBgAG/+wYbAAHAAARigAI/90CkAAJ/90CkAAR/+wYbAAS//YbpgAT/+wcBgAV//YYhAAWAAARigAYAAADlgAZAAUb+gAa//ERigAbAAADlgAcAAAYbAAd/9MCigAm/9gMFgAvAAAChAAyAAAYhAAzAAUMEAA0//EH5AA1AAACfgA2/+ccAABB/+IcBgBC//YYbABG/34bxABH/5wZcABI/5wZcABK/5wZcABMAAUDlgBNAAUDlgBOABQb0ABPABQMEABQABQb0ABRABQMEABS/5wZcABT/5wZcABVAAAb+gBXAAAb+gBbAAADlgBi/84CeABsAAACcgBtAAob9ABxAAUDlgByAAUDlgBzAAUDlgCIAAARigCJ//YYhACK//YYhACL//YYhACM//YYhACN//YYhACO//YYhACP//YYhACQ/+wYbACR/+wcBgCS/+wYbACT/+wYbACU/+wYbACV/+wYbACd/+wYbACe/+wYbACf/+wYbACg/+wYbACh/+wYbACi/+wYbACj/+wYbACkAAARigCqAAADlgCrAAADlgCs/9MCigCt/9MCigCu/9MCigCv/9MCigCw/9MCigCx/9MCigCy/7gCbADLAAACfgDNAAoYnADOAAoChADRAAoCZgDSAAoDlgDTAAoYbADUAAUDlgDVAAocBgDWAAoQwgDX/84cBgDY/84aIADZ/84YnADa/9gbuADb/5wCYADc/8QCWgDd/6sCVADe/+wcAADf/8kaIADg/84QyAACANSAAAACAT2AAAACABSAAAACAUmAAAACAQiAAAAAAB6AAAACATWAAAACAUKAAAACAUSAAAACAO6AAAACAS6AAAATADL/9AB0ADT/8Rk6AEEAABkQAEb/sBkuAFsAABleAGL/9gZCAGz/+xlqALL/7BJQAM//+xkcAND/+xkcANT/9hlGANb/9hbaANn/9hkcANr/+xkcANz/+xkcAN3/+xlAAN7/+xkcAN//9hkcAOD/+xkcAAIAYoAAABYAGP/OFVwAGgAKGPYAMv/CAJIAQf/2FxAAQv/sATAARgAeF64AW//TFwQAXQAAFVwAYgAZAIwAbP+SAIYAz/+6GMwA0P/EGMwA0v/EEdYA1P/EEdYA1v+rGKIA2AAU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EloA1wAAATQA3gAAEloA3wAAEloAAgCLgAAAAgD0gAAAAgDFgAAAAQAQgAAAAgDLgAAAAQATgAAAGwAY/+wRLAAaAAARSgAy/9cAtgA0AAURUABB//YNvABC//sPZABGAA8RVgBb//YAsABiAAANvABs/8QRLABt/7ULdADN/84RLADO/9gAqgDP/+IBZgDQ/9gQJgDR/9gApADS/84KNgDT/84RFADV/84RJgDW/8QRRADXABQRLADYAA8RCADZABQRLADaABQRLADeAAAOwADfAAARAgDg//sRAgACAO2AAAACARGAAAACACCAAAACAQSAAAAbABgAABCaADL/9hCaADQAChCaAEH/9hCaAEL/+xBMAEYACgVWAGIAAA0AAGwAGRCaAG0AChCaAM0AFBBwAM4AAA4EAM8AChBwANAAChBwANEAKACqANIAFBBwANMAFACkANQAAA9SANUAFA6oANYAABBMANcAChBwANgAChBwANkAFBBwANsAFAl6ANwAChBwAN0AChBwAN4AABBwAN8AChBwAAIBOIAAAAIBQYAAABYAQf/sDq4AQv/2D+oARv+wDFAAYv/7CgIAbAAoD8AAbQAUCggAzQAUDVQAzgAADgQAzwAUCMoA0AAUDVQA0gAeAIwA0wAeDq4A1AAFAIYA1QAUD+oA1gAPD94A2P/sD5wA2//iD6gA3P/nD5YA3f/iD9gA3v/2D5YA3//nDVoA4P/sD8AAAgEfgAAAAgEUgAAAPwAC//QONAAE//QONAAF//QONAAG//QONAAR//QONAAT//QONAAV//wMGAAdAAAPTAAmAAANZgAw/84MvAAz//YPUgA0AAAPWAA1/+wPNABB/+wPLgBC//YPLgBMAAoOIgBNAAoOIgBOAAULxABPABQPLgBQAAULxABRABQPLgBU//YPUgBW//YPUgBtAAoJdgBxAAoOIgByAAoOIgBzAAoOIgCQ//QONACR//QONACS//QONACT//QONACU//QONACV//QONACd//QONACe//QONACf//QONACg//QONACh//QONACi//QONACj//QONACsAAAPTACtAAAPTACuAAAPTACvAAAPTACwAAAPTACxAAAPTACyAAAPTADL/+wPNADRABQPLgDSAAoPLgDTAAoOIgDUAAAPWADVAAoPLgDWAAAMwgDXAAAOHADZ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`,`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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+RF+AAAAAP/nHFz/5xRg/+ccXAAAF6D/8RQ8AAAAAP/2FHgAAAAA//YAAAAAAAD/8RFm//YUeAAAFHj/+xP6AAAAAP/2GcYAAAAA/+wT+v/2HFz/7Bxc/+wTgv/2FHgAABegAAoAAAAAAAD/8RP6AAAAAP/7FE4AAAAA//sUTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEWAAAAAAABQRWgAUEWAAAAAAABQRYP/7E5QAABnGAAAAAAAAAAAADxFUABQRTgAKEUgAAAAAAAoZzAAUEWAAAAAAAAIADgABAAMAAABBAEUAAwBHAEwACABOAFkADgBbAGcAGgBpAHIAJwB0AH0AMQB/AJ8AOwChALEAXAC0AL8AbQDBAMEAeQDGAMkAegDLANQAfgDWAPIAiAACAI+AAAACAF2AAAACAI6AAAABABCAAAACADKAAAACALiAAAACAF6AAAACAHSAAAACAJKAAAACAJWAAAACAC2AAAACALOAAAACAHmAAAACAJOAAAACAIiAAAACALmAAAAAAA2AAAACAKaAAAACALeAAAACAGuAAAACAKKAAAACAHyAAAACAMKAAAACAJGAAAACAIOAAAACAFSAAAACAJmAAAACAL6AAAACABGAAAABAAGAAAACAGSAAAACAKuAAAACADiAAAACACyAAAACAHOAAAACALWAAAACAG2AAAACALCAAAACAFmAAAACAImAAAACAFqAAAACAIuAAAACAKWAAAACAEWAAAABAASAAAACAJSAAAACAJCAAAACAKiAAAACALGAAAACAK+AAAACALuAAAACAMGAAAACAJqAAAACAHCAAAACAL+AAAAAAAmAAAACAJ+AAAACAHiAAAACAJuAAAABAA2AAAACAIqAAAACAG6AAAACAJaAAAACAKOAAAACAF+AAAACAHuAAAACAJ6AAAACAIGAAAACACuAAAACAG+AAAACAGqAAAACAECAAAABAAuAAAACAHqAAAACALKAAAAAAAeAAAACAGCAAAAAAAaAAAACAIeAAAACAGOAAAACAGiAAAACAJyAAAACAH2AAAACAEmAAAACAFCAAAAAAAGAAAACAFKAAAACAHKAAAACAJiAAAACAH6AAAACAC+AAAAAAAWAAAACAFaAAAACAMSAAAACALSAAAACAK2AAAACALqAAAACAFOAAAAAAAqAAAACAMOAAAABAAqAAAAAAASAAAACAL2AAAACADCAAAACAJeAAAACAICAAAACAHaAAAABAAiAAAABAAaAAAAAAAuAAAACAFiAAAABAAmAAAACAKeAAAACAH+AAAACAEyAAAACAIWAAAACAIaAAAACAE2AAAACAKGAAAACAI2AAAAAABSAAAAAAA+AAAAAAA6AAAACAGmAAAACAISAAAACAFWAAAACAIyAAAAAABKAAAACALaAAAACAIKAAAACAEeAAAACAEaAAAACAKyAAAACAHeAAAAAAAOAAAABAAeAAAACAKCAAAACACoAAQABAAUAAgACAAMAAwADAA8AQQBFAAUARwBHAAUASABLAAEATABNAAMATgBTAAEAVABXABAAWABZAA8AWwBgAAoAYQBiABkAYwBjAA8AZABkAAkAZQBpAA0AagBsAAkAbgBuAAkAbwByAAEAdAB1AAEAdgB4AAkAeQB9ABEAfgB+ABQAfwCCABUAgwCOAAcAjwCSABYAkwCXAAwAmACaABgAmwCfAAQAoQChAAQAogClAAIArQCxAAIAtAC5AAgAugC6AAYAuwC7ABoAxgDJAAIAywDMAAIA0ADUAA4A1gDZABIA2gDlAAYA5gDpABMA6gDvAAsA8ADyABcAAgA1AAEAAQACAAMAAwAjAEEARQACAEcARwAFAEgASwASAEwATAAnAE4AUgAFAFMAUwAGAFQAVwATAFgAWQALAFsAXwAJAGAAYgAKAGMAZAAkAGUAZQAbAGYAZgAnAGcAZwAbAGkAaQAbAGoAbgALAG8AcgAGAHQAdAAGAHUAdQAUAHYAeAAhAHkAfQAVAH8AggAcAIoAigAWAI8AkgAdAJMAlwANAJgAmgAiAJsAnwABAKEAoQADAKIApQAOAKYApwAeAKgArAADAK0ArQAEAK4AsQAXALQAuQAIALoAugAHALsAuwAlALwAvAAmAL0AvwAYAMEAwQAYAMYAyQAEAMsAywAEAMwAzAAPAM0AzwAfANAA1AAQANYA2QAZANoA4AAHAOEA4QARAOIA5QAHAOYA6QAaAOoA7wAMAPAA8gAgAAEAAgAAAAgAAQBsAEQAAAAxBT4FEgS2BJAERgQ4A5QDhgOGA3gDagNcAzYDFgN4A3gDeAN4A3gBKAEaARoBGgEaA2oDagNqA2oDagNqA2oBDANqA2oDagNqAP4A/gD+AP4A3gDeAN4A3gDeAN4AvgC+AL4AAgANAFsAWwAAAF0AXQABAF8AYAACAGIAYgAEAGkAaQAFAIAAgAAGAKYApwAHAK0ArQAJALoAvAAKAL4AvgANAMYAyQAOAMsAywASANUA8gATAAQAWwAUABoAXQAUABoAXwAUABoAYgAUBNYAAAARgAAABABbAB4EtgBdAB4EWgBfACgELgCh/7AAGgACAK6AAAABAKH/3QAIAAIABYAAAAEAof/pAAgAAgDAgAAAAQCh/6sACAACALyAAABJAAEAAAHoAAIAAAHoAEEAAAHoAEIAAAHoAEMAAAHoAEQAAAHoAEUAAAHoAEcAAAHoAEgAAAHoAEkAAAHoAEoAAAHoAEsAAAHoAEwAAAHoAE0AAAHoAE4AAAHoAE8AAAHoAFAAAAHoAFEAAAHoAFIAAAHoAFMAAAHoAG8AAAHoAHAAAAHoAHEAAAHoAHIAAAHoAHQAAAHoAHUAAAHoAI//9gHiAJD/9gHiAJH/9gHiAJL/9gHiAJP/9gHiAJT/9gHiAJX/9gHiAJb/9gHiAJf/9gHiAKIAAAHcAKMAAAHcAKQAAAHcAKUAAAHcAK0AAAHcAK4AAAHcAK8AAAHcALAAAAHcALEAAAHcALsAAAHWAMYAAAHcAMcAAAHcAMgAAAHcAMkAAAHcAMsAAAHcAMwAAAHcANAAAAHQANEAAAHQANIAAAHQANMAAAHQANQAAAHQANYAAAHKANcAAAHKANgAAAHKANkAAAHKAOYAAAHEAOcAAAHEAOgAAAHEAOkAAAHEAOoAAAG+AOsAAAG+AOwAAAG+AO0AAAG+AO4AAAG+AO8AAAG+APAAAAG4APEAAAG4APIAAAG4AAAAAoAAAAIAToAAAAIAUYAAAAEAAoAAAAEAA4AA/////4AAAAEADoAAAAIApIAAAAEADIAAAAQA1v/YABoA1//YABoA2P/YABoA2f/YABoAAgAXgAAAAwBbAAAAIABdAAAAGgBfAAAAFAACAMeAAAAAABWAAAAAABOAAAABAKH/5gAIAAAAEIAAAAEAof/pAAgAAAAIgAAAAQCh//EACAACAKqAAAABAKH/6gAIAAIAcYAAABYAAwAAAJ4AWAAAAJ4AWQAAAJ4AWwAAAJgAXAAAAJgAXQAAAJgAXgAAAJgAXwAAAJgAYAAAAJgAYQAAAJgAYgAAAJgAYwAAAJ4AZQAAAJIAZgAAAJIAZwAAAJIAaAAAAJIAaQAAAJIAfv/2AIwAf//3AIYAgP/3AIYAgf/3AIYAgv/3AIYAAgBKgAAAAgBbgAAAAQARgAAAAQASgAAAAQATgAAAAQBpAAoACAACAAiAAAAKAOYAKABEAOcAKABEAOgAKABEAOkAKABEAOoAHgA+AOsAHgA+AOwAHgA+AO0AHgA+AO4AHgA+AO8AHgA+AAIAxYAAAAIAxoAAAAYA6v/sAHwA6//sAHwA7P/sAHwA7f/sAHwA7v/sAHwA7//sAHwADgDWACgAVgDXACgAVgDYACgAVgDZACgAVgDmACgAVgDnACgAVgDoACgAVgDpACgAVgDqACgAVgDrACgAVgDsACgAVgDtACgAVgDuACgAVgDvACgAVgABAAWAAAAGAOoAHgAmAOsAHgAmAOwAHgAmAO0AHgAmAO4AHgAmAO8AHgAmAAIAnYAAAA4A1gAZAGIA1wAZAGIA2AAZAGIA2QAZAGIA5gAoAFwA5wAoAFwA6AAoAFwA6QAoAFwA6gAeAFYA6wAeAFYA7AAeAFYA7QAeAFYA7gAeAFYA7wAeAFYAAAAMgAAAAQAAgAAAAgAGgAAAAQACAAAACAABADQABAAAABUAiAB2AHYAdgB2AHYAdgBkAGQAZABkAFYAVgBWAFYAUABQAFAAUABQAFAAAgAEAEQARAAAALQAuQABANYA2QAHAOYA7wALAAEAYgAjAAMAWwAoAF8AKABiACgABABbACgAXQAoAF8AKABiACgABABbABQAXQAUAF8AFABiABQAAgBhABQAYgAUAAAAAQABAD4AjgDAAAAADgABAAAAAAABAAAAIgAAABAAAQAAAAEAAwAAAAwAAAABAAAAAQAAAAYAAQAAwADnGAAEREZMVABCY3lybABCZ3JlawBCbGF0bgAaACwAAk1PTCAAHFJPTSAAEAAA//8AAwAAAAIAAwAA//8AAwAAAAEAAwAEAAAAAP//AAIAAAADAARjY21wACpsb2NsACRsb2NsAB5ydnJuABoAAAAAAAAAAQACAAAAAQABAAAAAgADAAQABgDKAKgAqAB4ACQADgABAAAAAQAIAAIAKAAEAR4BHwEhASIABgAAAAEACAADAAEAHgABABIAAAABAAAABQABAAQBCwEOARABEQABABUAngCnAKwArQCwALIAuAC8AL4AvwDEAMUAzADPANIA1ADWANgA3gDhAOsABAAAAAEACAABACIAAQAIAAMAFAAOAAgBEQACAQcBEAACAQoBDgACAQkAAQABAQgAAQAAAAEACAACAA4ABAB9AIEA1ADYAAEABAB7AIIA0gDZAAEAAAABAAgAAQAGAAEAAQACAC8AMgABAAAAAAE8AAAAFAAAAAAAAAAAAAYBJEU4Nzc0NzNDPS0tESg9KyAiCz0KBQYOPjonGDUdCAEfNRxAEjweLgcjFEkaRjAyFhaBAgKAMQQbKhU/L0JIRyEPODg4ODhERDQ0NDQQNzMzMzMzM0NDQ0NBPS0tLS0tLRMtLRERKCQoACk9PT0DPSsrKyslJSsgICAiIiIiIhkMDQsLPT09PT09PT09PT09CgoKCgUFBQUFBgYGDg4ODg4JCT4+Pj46OycnJycnHBgYGBg2NR0dHR0dHTkIAR8fHx8XNTU1NRwcHBwcHBxAQEASEhISEiwmPDw8Hh4eHh4eHh4eHh4eLi4uLgcHBwcHByMjI0VFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUUAAQAAAL4AAgAAACAAAAAQAAIAAQACAAEAAACS/AC0BgBKAAAAAgAAAAGuWsI+zEfOS9BD0SPRNtE40jHSPdVJ1yDXItcl1yzaFtpP2zLeK95G3xvg9+FQ4iDjGOMi40Hk/OQG5CDmEOYd5iXmJucR5xvpVuoE6gzqGOsf6yTrRuwE7B/tJO1S7uvu9e788PPwDfAO8RHxFfEc8SPyC/Ma8xz0DPQc9R72EPYi9xz6/Pwf/QAAAAP/BQUGGAniAAEAAsAAwAAAAAAAQABAAAAAAAEAAAAAAAgABQA0c3RybwAAAANzdHJzAAAAAXVuZG8AAAAAdW5kcwAAAAF4aGd0AAAAAgABAAAAHgABAAAADAAEAAAAAgAAAAGnHdQo9gn9AgABAALAAMAAAAAAAEAAQAAAAAAEAj0BkAAFAAACvAKKAAAAjAK8AooAAAHdADwBMAgBAgsFAwUCAwACA6AAAG8AAAAKAAAAAAAAAABJQk0gAMAAICETBAH+7QAABGABEyAAAZ8AAAAAAgQCugAAACAAAgABAAAAAAABAAjAAMAA1VXPJ+qr5xgAAAAACqsMORVVG1Qqqy0fQABAAAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAKmAAAATABAAAUADAAgAGIAoAEwAVEBfwGPAZIBoQGwAdwB/wIbAjcCWQK8AscC3QMBAwQDCQMjHoUenh75ICAgoSCkIKYgqyCuILIgtSC6IL0gvyET//8AAAAgAGEAoAEAATIBVAGPAZIBoAGvAc0B+gIYAjcCWQK8AscC3QMAAwMDCAMjHoAenh7yICAgoSCkIKYgqCCtILEgtCC4IL0gvyET//8BAwAAAIQAAAAAAAD/Hv6aAAAAAAAAAAAAAP4q/fr+Sf43/hwAAP4DAAD96QAA4jcAAOAK34zfit+JAADfid+H34bfhN+C34HfGAABAAAASgAAAEoAqgDoAAAAAAE6ATwBPgFcAWYAAAAAAAAAAAAAAWIAAAFiAAABYgAAAWoAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAABAAMAnQBDAJsAQQCeAEQAogBIAKQASgClAEsAowBJAKYATACnAE0AqwBRAKgATgCqAFAArABSAKkATwCvAFUArgBUALEAVwCwAFYAswBZALIAWAC5AF8AtwBdALQAWwC4AF4AtgC6AGAAuwBiALwAYwBkAL0AZQC/AGcAvgBmAMAAaADBAGkAwgBqAMQAbADDAGsAbQDFAG4AyQByAMYAbwDIAHEAzQB2AM8AeADOAHcA0AB5ANMAfADSAHsA0QB6ANkAggDXAIAA1gB/AOAAiQDdAIYA2gCDAN8AiADcAIUA3gCHAOcAkADqAJMA7ADwAJgA8gCaAPEAmQB+AMwAdQDhAIoAnABCALUAXADHAHAA2wCEAOIAiwDjAIwA5QCOAOQAjQCfAEUAoQBHAMsAdADUAH0A2ACBAQoBCQEIAQsA6QCSAOYAjwDoAJEA7QCVAOsAlADuAJYA7wCXADEAMgA0ADUAAAABAAAAEAACAAEAFAAHAAp3Z2h0AGQAAAGQAAACvAAAAAABAAECAAAAZAAAAQMBBAAAAMgAAAEFAQYAAAEsAAABBwACAAABkAAAAQgBCwAAAfQAAAEMAQ0AAAJYAAABDgEPAAACvAAAARAAAAABAAAAAQAAAAACYAElAAAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADM3XUS9HAXw889QgKA+gAAAAA1hRQ0gAAAADjpsVq/1j/CwOTBF8AAAAGAAIAAAAAAAAAAQAABAH+7QAAA7j/WP9YA5MD6AAAAAAAAAAAAAAAAAAAASQB2AAgAhYALAJEADICRABVAfcALwJEADICJQAvAhMAKwI4AFUA+gBMAPoAAQIPAFUBEABVAjgAVQIwAC8BbwBVAecAJAFfAB0COABQAwAAHwHzABEB0AAhAoEAFwJtADoCnwBdAkcAXQK3ADoCwwBdAZAAPAH+ABwCegBdAfUAXQLDAF0CxAA6AoAAXQJFACoCPAAWAqYAWAN7ABQCUQANAkQAJAERACwCKAAyAegAIgHl//0CdAA6AlMAPAK4AA8CuAAPAskAXQO4ACUDuAAlAwIAXQJEAEcCaQAKAmAAKAJ0AB4CpAA6AnQALgJ0ADoCYAAoAl0ANQJeAA0CbwAeAoMAXAIWACwCFgAsAhYALAIWACwCFgAsA2AALANgACwB9wAvAfcALwH3AC8B9wAvAlsAMgJHADICJQAvAiUALwIlAC8CJQAvAiUALwIlAC8CEwArAhMAKwITACsCEwArAjgAFQI4/94A+gBVAPr/5QD6/9wA+v/xAPoAAwD6/+MB8ABMAPoAAQD6/9wCDwBVAg8AVQEQAFABEgBVARAAVQFmAFUBFgASAjgAVQI4AFUCOABVAysALAI4AFUCMAAvAjAALwIwAC8CMAAvAjgAIwI4ACMCMAAvAW8AVQFvADoBbwA8AecAJAHnACQB5wAkAecAJAHnACQBFgAdAWUAIAFfAB0BXwAdAV8AHQI4AFACOABQAjgAUAI4AFACOABQAjgAUAI4AFACOABQAjgAUAI4AFACOABQAjgAUAMAAB8DAAAfAwAAHwMAAB8B8wARAfMAEQHzABEB8wARAfMAEQHQACEB0AAhAdAAIQKBABcCgQAXAoEAFwKBABcCgQAXA4sABAOLAAQCbQA6Am0AOgJtADoCbQA6Ap8AXQKiABECRwBdAkcAXQJHAF0CRwBdAkcAXQLEADoCtwA6ArcAOgK3ADoCtwA6AskAGwLDAF0BkAAwAZAAJwGQADwBkAA8AZAAPAGQACAChQBYAf4AHAJ6AF0B9QBaAfUAXQH1AF0B9QBdAfz/+QLDAF0CwwBdAsMAXQLDAF0CxAA6AsQAOgLEADoCxAA6AsQAOgLEADoCxAA6AoAAXQKAAF0CgABdAkUAKgJFACoCRQAqAkUAKgJFACoCvABdAkYAGwI8ABYCPAAWAjwAFgKmAFgCpgBYAqYAWAKmAFgCpgBYAqYAWAKmAFgCpgBYAqYAWAKmAFgCpgBYAqYAWAN7ABQDewAUA3sAFAN7ABQCUQANAlEADQJRAA0CUQANAlEADQJRAA0CRAAkAkQAJAJEACQCWACEAlgAkgJYAKACWACgAlgA+QJYAJ4CWACzAlgA/wJYALsCWACLAlgAiwJYAIsCWACLAlgAlAJYAJQCWAC4AlgAuAJYAPoCWAEsAAD/WAAA/3QAAP9yAAD/0wAA/48AAP+sAAD/zQAA/70AAP9sAAD/YAAA/2wAAP9sAlgAhAJYAKACWAD0AlgAnQJYALMCWAD/AlgAuwJYAIsCWACLAlgAlAJYALgCWAC4AAD/rAAA/2sAAP9gAAD/awAA/2sA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABJQBRAAQAZQAFAAIAEAAvAJoAAAFCD4MAAgAB`,`AAEAAAAQAQAABAAAR0RFRgAAAAAAAAEMAAACREdQT1MAAAAAAAADUAAAOzhHU1VCAAAAAAAAPogAAACcSFZBUgAAAAAAAD8kAAABqk1WQVIAAAAAAABA0AAAAGJPUy8yAAAAAAAAQTQAAABgYXZhcgAAAAAAAEGUAAAAKmNtYXAAAAAAAABBwAAAAShmdmFyAAAAAAAAQugAAABqZ2x5ZgAAAAAAAENUAAAAAGd2YXIAAAAAAABDVAAAAWxoZWFkAAAAAAAARMAAAAA2aGhlYQAAAAAAAET4AAAAJGhtdHgAAAAAAABFHAAAAqpsb2NhAAAAAAAAR8gAAAFYbWF4cAAAAAAAAEkgAAAAIAABAAMAEgAAAAAAAAAAAAAAKAACAAMAAQADAAEAIgCfAAEApACkAAMAAQAAAgwAAwAAAe8AAAHYAAAAFADdAAAAAgAAAAHV89js2ArbDuHr4SLhKOIK4g/lHuYd5h7mKucZ6BrpEeoV6hfs7Ozx7Pbs++wK7A/sFOwW7B7tFe4M7hrv9u8S7zDx5/H78QnxDPEQ8RTxFvEZ8SHyA/IQ8h3z/PMP9Pn0DfQO9Qj1C/bs9vb2+/b99gH2BfYG9gf2CvYU9hf3CfcM9w33Efjz+AP4B/gI+An4C/gM+C75A/kH+Qj5Evkk+vr6/voG+hT75/vx+/j7+/v8+/37/vsC+wX7CvsL+w/88fz//AH8BPwF/Ab8C/32/QP9EP72/vv+Av4D//z/Af8CAf4B/wLiAvwC/QL+A/wD/QMCAwkDCgT7BPwEBAQGBAkF7wXxBfUF9gX6BfsF/AX9BQIFAwUFBQoG+Qb6Bv8GAQYMB/gH+Qf7BwMHBwj2CPcI+AgCCA8J9wrkCucK7ArxCvYK+woFCgcKCgoPChQKIgv1CwcM7AzyDPMM9Az9DfENHg7wD+8P8Q8KEO4Q+RAGEekR7RHuEfMS7BPrFOoU7RTxFPYU/hQFFAoUFBQeFugW6RfnGOYZ5RnsGfYZBRkPGuMc4h3hHuIe8R72IPQj2yMZKPYo/igoAA8AAAABAAHT7PH29/j7/v8BAgMFChQAFQAAAAEAAM7e4uzx9vv+/wECBQgKDxASFBYZHgABAALAAMAAAAAAAEAAQAAAAQAAAAoAWgCOAARERkxUAEJjeXJsADRncmVrAChsYXRuABoABAAAAAD//wACAAEAAwAEAAAAAP//AAEAAwAEAAAAAP//AAIAAAADAAQAAAAA//8AAgACAAMABGtlcm4ALmtlcm4AKGtlcm4AIG1hcmsAGgAAAAEAAgAAAAIAAAABAAAAAQABAAAAAQAAAAMDxANqAAgACQAAAAEACAABAAQAAAAIAAEDTALmAAEDQAAMACsCygK6AsoCqgKaAooCegJqAloCSgJAAjACGgIKAfoB6gHaAcoBugGqAZoBigF6AXABZgFWAUwBPAEsARwBEgECAPIA4gDYAMgAuACoAJgAiAB4AGgAWAADAQcCugAKAAAAAgAGgAAAAwDIAroACgAAAAIAJYAAAAMBIAK6AAoAAAACABmAAAADAO4CHAAKAAAAAgAkgAAAAwG1AroACgAAAAIAC4AAAAMBMQK6AAoAAAACACeAAAADATMCugAKAAAAAgAJgAAAAwEzAroACgAAAAIASIAAAAMBHgK6N14AAAADAVICugAKAAAAAgBCgAAAAwEiAroACgAAAAIAqIAAAAMBYgK6AAoAAAACACqAAAADAWICujCOAAAAAwGWAroACgAAAAIARIAAAAMBQQK6AAoAAAACACmAAAADAWACugAKAAAAAgBJgAAAAwEgArorjAAAAAMB6QK6AAoAAAACAAOAAAADATACugDEAAAAAwEYAroqcgAAAAMBMwK6AAoAAAACAEqAAAADAUICugAKAAAAAgAPgAAAAwFqAhwACgAAAAIADIAAAAMA+wIcAAoAAAACACyAAAADAP4CHAAKAAAAAgAdgAAAAwD6AhwACgAAAAIAEIAAAAMBtgIcAAoAAAACAJGAAAADARQCHAAKAAAAAgBRgAAAAwE0AhwACgAAAAIAI4AAAAMBIAIcAAoAAAACAGaAAAADASACHAAQAAoAAAABgAAAAgBegAAAAwEYAhwACgAAAAIAOIAAAAMBFwIcM3AAAAADARoCHAAKAAAAAgBBgAAAAwEnAhwACgAAAAIAQIAAAAMA5gIcAAoAAAACALGAAAADAYECHAAKAAAAAgAggAAAAwEXAhwACgAAAAIAMoAAAAMBFgIcAAoAAAACAFOAAAADAPkCHAAKAAAAAgCDgAAAAwEXAhwACgAAAAIAT4AAAAMA/AIcAAoAAAACAGmAAAABACsAAQACACIAJgApACoAKwAtAC8AMAAzADkAOgA7ADwAPQA/AEAAQwBG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BQ4AbgAABQ4AAgCbgAAAAQAOgAAAAgC1gAAACgAjAAAErAAoABADNABB//UARABQ//sEAgBTAAAErABt//sElAB3//MDQACGAAAErACH//4EJgCY/98APgACALCAAAACAGOAAAANACMABQRKACcAAARiACgAAARiACz/7ABWAC7/+wGyADb/+APKAEwAAARiAFQAAARiAFoAAARiAF3/4gRuAHr/7ARiAIb/+gBQAJj/4gRQAAIAcoAAAAIAxoAAAAgAa//YA3QAbP/iA0QAcf/2A/oAdP/EADgAev/xADIAl//iA0QAnv/YA3QAn//YA3QAAgBXgAAAAgAHgAAAEAAj//4DQgAnAAADyAAoABQDsAAsAAADyAAuAAoAegA2AAoAdABBAAADyABM/+wDHgBPAAADyABQAAUDHgBZAA0DQgBt//kAbgB3//sDHgCG//sDyACLABEAaACY/9YAYgACAMiAAAACAB+AAAACAJOAAAACAD6AAAACAD2AAAAVACIAAAKGACUAAANIACz/9gCYAC4AAANIADYABQMwAEMAAANIAEYAAANIAFT/+wNCAFUAAANIAF3/9gKeAF4AAANIAGQAAANIAGv/2ACSAGz/2ACMAG8AAANIAHEAAACGAHT/zgCAAHr/9gM8AJf/2ACMAJ7/2ACSAJ//2ACSAAIAF4AAAAAAA4AAAAIAxYAAAAIA3IAAAAAAC4AAAAoAIwAOAeIAKP/fAEoAQf/2Ap4AUP/7AgAAU//zAT4AWf/YApgAhgAJAEQAh//7AgAAmP/2ApgAnf/WAD4AAgCtgAAAAgA/gAAAAgB4gAAAGAAiAAACWgAsAAACWgAu//YCZgA2//gBwgBAAAACWgBDAAACWgBGAAACWgBMAAACWgBUAAAAmABVAAACWgBa//YBzgBd/+wBzgBeAAACWgBkAAACWgBrAAACWgBsAAACWgBvAAACWgBxAAACWgB0/+wAkgB6//YBmACFAAACWgCXAAACWgCeAAACWgCfAAACWgACAF2AAAABAAWAAAALACgAAAG8AFD/+ABQAFP/+wESAFn/9gGwAHf/9gGwAHn/8ABKAIb/+AEeAIf/9gGwAJj/1ABEAJn/+wESAJ3/9gGwAAIAsoAAAAIAK4AAAAIATYAAABgAIwAFAU4AJwAAAWYAKP/+AOAALP/sANoALv/7ANQANv/4AM4AQQACAMgATP/zAMIAUP/7ALwAVAAAALYAWv/2ALAAXf/iAXIAa//bAOAAbP/gAOAAdP/tAKoAd//7ALwAef/7ALwAev/2AKQAhv/6AJ4AigAGAJgAl//gAOAAmP/0AJIAnv/bAOAAn//bAOAAAgBDgAAAAgBSgAAAAgCOgAAAAAAFgAAAAgAEgAAAAQANgAAAAQADgAAAAgBcgAAAAgBLgAAAAgBtgAAAAAAMgAAAAAAGgAAAAgClgAAAAgB1gAAAEAAjAAUAkgAlAAAAjAAoABcAhgAsAAoAgAA2ABQAegBM/+wAdABPAAAAgABTAAAAgABUAAAAgABZAAoAbgBaAAoAgABdAAAAgACG//sAaACLAAAAgACY/84AYgCdABIAhgACANWAAAACAIaAAAACAKGAAAACADyAAAABAAaAAP////+AAAACALuAAAAAAA2AAAACAJiAAAABAAIAAAAIAAEAQgAEAAAAHAFcAVYBUAFQAVABUAFQAVABUAFQAUYBUAFQAVABUAFQAVAA6AFcAVYBVgFQAVAA4gFQAVAAhAB+AAEAHAAmACoALwAwADEAMgA1ADcAOAA6ADwARgBHAEgATQBTAFQAawB7AH0AfgCAAIEAhwCIAIkAkgCdAAEAb//xABcAJAAAACYAAAAvAAAAMQAAADMAAAA3AAAAOAAAADoAAAA7AAAAPwAAAEQAAABHAAAASQAAAE0AAABOAAAAUQAAAHsAAAB8AAAAgAAAAIIAAACEAAAAiAAAAIkAAAABAIb/9gAXACT/0wAm/9MAL//TADH/0wAz/9MAN//TADj/0wA6/9MAO//TADz/0wA//9MARP/TAEf/0wBJ/9MATf/TAE7/0wBR/9MAe//TAHz/0wCA/9MAgv/TAIT/0wCI/9MAAgCb//sAnP/7AAEAIwAAAAEAmf/2AAEAmQAAAAEAAAAKAEQAUgAEREZMVAAwY3lybAAeZ3JlawAabGF0bgAaAAAAAAAAAAFCR1IgAAoAAP//AAEAAAAEAAAAAP//AAAAAWxvY2wACAAAAAEAAAABAAQAAQAAAAEACAABAAYAAQABABoAJAAmACgAKwAtAC8AMQAzADUAOgA+AEEARABHAEkASwBOAFEAUwBZAFwAYQBjAG0AeQCAAAEAAAAAAMIAAAAUAAAAAAAAAAAABgCqWkRDQ0A/Qzc3XUozQytKGw0VGUwuQigSPiZLHUgIO1A3F0QyUjpeJwxDPx4DVCFJSklKIwYqE0dJM1NKQ0BgXQ0tIhs2NDw4XSBYV1sLTVxGDg89TxUfGV8EHC4BADlCQhECFBc+QiZBS0xILyQlCDAsCgVCCTUxB05ZXl4/P0ZJSiMYKQ0WK1U3NzdRUF9fLi4xQhEaVi8QHUEoKBJFRVpaWlpaWlpaWloAAQAAANgAAQAAAAwAYQAAAAIAAAABkFi2HLghxFjFWcVkyDHJOMk8yzrMSsxVzz3RI9Ep0TPRONIN0jHSM9M31yzYLtkq2TraDtsh2zXcQd4r32DhFeE34hfiJOIp4jziRuQG5AnkIOYl5i7nEegh6TbqGOok6irrKOwD7ATsH+wg7SHtJO0u7g/vIO8h7yjvMvAH8A3wDvEQ8RHxHPEj8hXyGPIe9Az0GPQc9DL1HvUp9ib2Ovcc9yL4EvkY+R76GfwD/jH/Gf85AAABOwQ5BhUHCQcPBxQAAQACwADAAAAAAABAAEAAAAAAAQAAAAAACAAFADRzdHJvAAAAA3N0cnMAAAABdW5kbwAAAAB1bmRzAAAAAXhoZ3QAAAACAAEAAAAeAAEAAAAMAAQAAAACAAAAAacd1Cj2Cf0CAAEAAsAAwAAAAAAAQABAAAAAAAQCYwGQAAUAAAK8AooAAACMArwCigAAAd0APAEwCAECCwUDBQIDAAIDAAACQwAAAAgAAAAAAAAAAElCTSAAwAAgIRYEAf7tAAAEYAETIAABnwAAAAACBAK6AAAAIAACAAEAAAAAAAEACMAAwADVVc8n6qvnGAAAAAAKqww5FVUbVCqrLR9AAEAAAAAAAAACAAAAAwAAABQAAwABAAAAFAAEARQAAAAYABAAAwAIACAAYgCgAwEEGwQkBC8EXwSRBLEhFv//AAAAIABhAKADAQQABBwEJQQwBJAEsCEW//8AiQAAAAr9owAA/En8SgAAAAAAAN8IAAEAAAAWAAAAAAAUAAAAAABGAKQApgAAAAAAAQADAJAAkQCeAI4AkgCZAJsAnACdAJUAlgCfAJQAkwCXAJoAVQBWAFcAWABZAFsAXABeAF8AYABhAGMAIgAjACQAJgAoACoAKwAtAC8AMQAzADUANwA4ADkAOgA8AD0APgBAAEEAQwBEAEYARwBJAEsATQBOAFAAUQBTAH0AfgCMAHsAfwCHAIkAigCLAIMAhACNAIIAgACFAIgAjwB8AJgAhgABAAAAEAACAAEAFAAHAAp3Z2h0AGQAAAGQAAACvAAAAAABAAECAAAAZAAAAQMBBAAAAMgAAAEFAQYAAAEsAAABBwACAAABkAAAAQgBCwAAAfQAAAEMAQ0AAAJYAAABDgEPAAACvAAAARAAAAABAAAAAQAAAAABbACrAAAAAAFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMzdQeRQ+tfDzz1CAoD6AAAAADWFFDSAAAAAOOmxWr/0/8sA+UDtQAAAAYAAgAAAAAAAAABAAAEAf7tAAAEDf/T/48D5QPoAAAAAAAAAAAAAAAAAAAAqgHYACACFgAsAkQAMgJEAFUB9wAvAiUALwJEADIA+gBMAPoAAQNpAFUCOABVAjAALwJEAFUB5wAkAjgAUAH7ABUB8wARAoEAFwKNAF0CbQA6AkcAXQLDAF0BkAA8Af4AHAMsAF0CxAA6Al4AXQJFACoCPAAWAmUAGAQDAF0COAAVAPoAVQJ1ABcCFgAsAjQAMwIuAFUCHAA4AbMAVQHtADgCVQAIAkQAMgIlAC8DAgAoAtkAGgH1ABwB1gAAAkwAVQI4AFACTABVAjgAUAImAFUCCgBVAjUACAH2ABQCuABVAkwAVQIwAC8CPQBVAjgAVQJEAFUB9wAvAdgAFANpAFUB8wARAu4AMwLYAC8B+wAVAlgAVQJZAFACGgAyAx4AVQNpAFADOQBVA4kAUAJOABQCQwAKAtQAVQIIAFUB+ABGAf8AHAMNAFUC+QBVAhcAJwIPACICgQAXAnwAXQKNAF0B8wBdAtYACgK6ABQCRwBdA9IAKgO5ACQCUQAlAsMAXQLDAF0ClgBdAogAXQKsAAoCdQAXAywAXQLDAF0CxAA6ArUAXQJeAF0CbQA6AjwAFgJTABQDTAAyA0wAMgJlABgC2gBdAoUAOgO8AF0D4QBdAuUAFgNrAF0CdgBdAncAJQPAAF0CgAApAncANgGzAFUBswBVAiUALwIlAC8B/wAvAkwAVQI4AFACJgBVAyUACANAAFUB8wARAewAEgHnACQCPQBVAPoATAD6/+8A+gABAjgAFQI4ABUB8wBdAfMAXQJHAF0CRwBdAncAOgLDAF0ClgBdA/YACgQNAF0CUwAUAlEADQJFACoCtQBdAZAAPAGQADkB/gAcAxIAFgMcABYCWACeAlgA/wJYALsCWACPAAD/0wJYAJ0CWAD/AlgAuwJYAI8A7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACrAEYABABAAAQAAgAQAC8AmgAAAUIPgwACAAE=`,`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DHAAQv/sAZQAQ//YAY4ARP/YAY4ARf/YAY4ARv/YDZAASP/2EZoASf/OEWgATP/OEWgATf/nD4YATv/JCBoAT//JCBoAUP+wAYgAVf/9D1QAVv/9D1QAV//9D1QAWf/yC2YAWv/yC2YAYQAFAYIAZf/iEVYAZv/iEVYAZ//iEVYAav/iEVYAawAFAXwAbAAFAXwAbQAAEbIAbgAAEbIAbwAAEbIAcAAAEbIAcgAAEbIAcwAAEbIAdAAAEbIAeP/iEVYAe//iEVYAAgCLgAAAAgCMgAAAAgB/gAAAAgCJgAAAAgBpgAAAAgCGgAAACQAf/+cAUAAj/9QK0AAq/+kASgAs/+IARABB/+gJxgBI//sPzgBN/+wNogBQ/6YAPgBb//YAOAACAGiAAAACAJeAAAABAACAAAACAAmAAAACAAaAAAAHACz/+wA4AEEAAA+8AE3/8QyYAFAAAAAyAFgAAA+8AFsAAAAsAHD/+w94AAEACIAAAAIAMIAAAAIATYAAAAgALAAACrgAQf/+Dr4AUP/sADIAWAAAD34AW//xD34AYv/7DFQAcP/iDyIAfAAADVIAAgCKgAAADgAf/94AgAAg/94AgAAj/78OngAl/8kAegAq/+gAdAAs/4gAbgA2/8oAaABB/9gOkgBN/90AYgBQ/6cAXABYAAAPRgBb//YPRgBiAAUAVgBwAAkFAAACABeAAAACAJWAAAACAC6AAAACAAKAAAACAJGAAAACAAGAAAACAAOAAAACAACAAAAJACP/+w58ACwAAA5eAEH/5Q30AE3/8QBEAFAABQ58AFv/+wuQAGL/8QA+AHD/1wA4AHz/8Q52AAIAdYAAAAEACYAAAAEAA4AAAAMAI//7DjIAQf/+DbYATf/2DnYAMwAfAAALMgAgAAALMgAhAAALMgAlAAALMgAm//YICgAn//YICgAo//YICgAq//YICgAr//YICgAs//YOYgA2AAALMgA3AAALMgA4AAALMgA7AAALMgA8//YJhAA9//YJhAA+//sLOAA///sLOABA//sLOABC//YBTABD//sLLABE//sLLABF//sLLABJAAALMgBMAAALMgBO//sBRgBP//sBRgBV//EBQABW//EBQABX//EBQABZ//YLMgBa//YLMgBbAAABOgBiAAAJhABlAAABNABmAAABNABnAAABNABqAAABNABrAAALOABsAAALOABt//YF4ABu//YF4ABv//YF4ABx//sLLABy//sLLABz//sLLAB0//sLLAB4AAABNAB5AAAJhAB6AAAJhAB7AAABNAABABGAAAABAAuAAAACAFmAAAACAFSAAAACAFaAAAAKACMABQzMACz/+ABKAEH//gxQAE3/+wnaAFD/+QxEAFgAAA0QAFv/+wBEAGL/+wnaAHD/6gA+AHz/+Ay6AAIAeYAAAAIAU4AAAAIARoAAAA0AWQAADMAAWgAADMAAZQAADMAAZgAADMAAZwAADMAAagAADMAAawAADMAAbAAADMAAcgAADMAAcwAADMAAdAAADMAAeAAADMAAewAADMAACAAj//YMcABB/+wLngBN/+cAMgBQABAHLgBbAAAHkgBi//YJRgBw/+wLngB8//YGGAACAICAAAAIACP/9gw4ACz/4gw+AEH/5gb8AE3/2AA4AFv/+wkOAGL/+wAyAHD//QnaAHz/+wvWAAIAIoAAAAIAj4AAAAYAIwAFC7YAQf/xACYASP/9CZwATf/xCYoAcP/KBrgAfP/nCygAAgB9gAAAQAAf/8ELLAAg/8ELLAAh/8ELLAAi/8kLJgAj/8kLJgAk/8kLJgAl/7sLIAAm/9MLigAn/9MLigAo/9MLigAq/8sLLAAr/8sLLAAu/8kLJgAv/8kLJgAw/8kLJgAx/8kLJgAy/9UBoAA0/8kLJgA1/8kLJgA2/7sLIAA3/7sLIAA4/7sLIAA5/8kLJgA7/7sLIAA8/9UBoAA9/9UBoAA+/98LLAA//98LLABA/98LLABB/98LLABC/9gLzgBD/80LCABE/80LCABF/80LCABG/8kLJgBJ/9QBmgBM/7sLIABN/90DTABO/8UGjABP/8UGjABQ/6wJ7ABV//wBlABW//wBlABX//wBlABZ//sLzgBa//sLzgBc//UBjgBhABkLigBl/+wLigBm/+wLigBn/+wLigBq/+wLigBrABcLAgBsABcLAgBtAAYBlABuAAYBlABvAAYBlABwAAkBiABx//wBlAByAAkBggBzAAkBggB0AAkBggB4/+wLigB7/+wLigACAF+AAAACAISAAAACAHaAAAACAEyAAAACAAWAAAACABSAAAAEACz/sAb4AE3/3QAgAFv/8Qb+AGIAAAAaAAIAEIAAAAIANIAAAAYAI//7Cb4ALP/2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`,`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FDAAPP/ODogAQP/6FDAARAAAISAARQAAISAARv/4IpwARwAAG6QASf/4IPAASv/sFkgAS//kAUYATAAAGaIATf/2ISAATv/2GbQAT//2ASgAUP/sFkgAUf/xEeYAUv/xEeYAU//xEeYAVP/sFkgAXAAAISAAAgDRgAAAAgCxgAAAAQABgAAAAgBggAAAAgDjgAAAAgB/gAAAAgDygAAALAAV//YilAAW/90IGAAZ//EilAAa//Yb7gAb/+IGxgAc//EilAAd/+cb7gAe//EKfgAf//YfzgAg/+cbhgAh//YYUAAjAAAiPAAl/+IGxgAm//gWkAAn//EilAAo//YYUAApAAAhegAq/+wiJAAr//EilAAs/90GxgAt//EilAAu//EilAAv/+cPiAAw//EilAAx//EilAAyAAUiJAA1AAUiJAA5//EaUgA8AAUiJABA//EaUgBG/+QB8ABIAAAaUgBJ//gCggBK//EilABL/+cb7gBM//YfzgBN//YYUABOAAAijgBPAA8YaABQ//EilABR//EilABS//EilABT//EilABU//EilAAmABkAACEaABr/+CAiABsAAB6UABwAACEaAB3/+yBSAB7/9hrkAB8AACEaACAAACEaACP/7B7EACUAAB6UACb/+CAiACcAACEaACgAACEaACoAACEaACsAACEaAC4AACEaAC8AACGKADEAACEaADL/8QwyADX/8QwyADf/7gxEADkAACEaADr/+AemADz/8QwyAD///AluAEAAACEaAEP/+gDsAET/4hrkAEX/2gF4AEf/5ADmAEj/+CBAAEoAACEaAEv/+yBSAEwAACEaAFAAACEaAFQAACEaAFn/+AemAFz/2gF4AAIA4YAAAAIAaoAAABUAFv/YGG4AGv/nDZIAHP/ODpgAHv/yIDQAIP/sGZAAI//uAJ4AJgAAIJ4AKP/0AJgAKf/JFlQAKv/JFlQALP/kAJIALv/OEaAAL//sAIwAMP/iIAoAP//sG1wAQwAFEp4ARAAFAeQARv/aAIYASAAAHdIATgAeFmAATwAtAIAAAgACgAAAAgBmgAAAAgDkgAAAAgD3gAAAAgDWgAAAAgDegAAAMwAZ/78fsAAa/+oa4gAb/+IauAAc/9YBWAAd/78BUgAe//AY/gAf/+cVyAAg//EY8gAh/84evAAi/9MfsAAj//gBTAAk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AAIAyIAAAAIAu4AAAAIAh4AAAAAAEIAAAAIAuYAAAAEAEIAAABEAFgAAAKQAHP/4AJ4AHv/0AJgAIAAAAyYAI//kAJIAJv/4AIwAKAAMAIYAKf/2AIAAKv/4AJ4ALAAQAHoALv/4AHQALwAMAG4ANwAAAyYAQwAAAtAARP/dAGgARwAAA3AASAAAAKQAAgBYgAAAAgDagAAAAAAUgAAAAgCFgAAAAgCXgAAAAgCGgAAAAgC2gAAAAgD4gAAAAgCsgAAAAAAPgAAAAAAVgAAANQAVAAABrAAW/90CIAAZAAABpgAa//oBoAAb//ABmgAcAAABlAAdAAABjgAe//sBiAAfAAABggAg//sBfAAhAAACfAAi//oBoAAj//wCOAAk//oBoAAl//ABmgAnAAABpgAo//gBdgApAAACfAArAAABpgAs//IBcAAt//gBagAuAAACfAAv//IBZAAw//gBagAxAAACfAAy//gBXgA1//gBXgA3//YCugA5//gBWAA6//YBUgA8//gBXgA///gBWABA//gBWABD//sBpgBE//ABTABF/90BRgBG//sBiABH/+wBQABI//ICOABJ//oBoABKAAABpgBLAAABjgBMAAABggBNAAACfABOAAACfABPAAACfABQAAABpgBR//gBagBS//gBagBT//gBagBUAAACfABZ//YBUgBc/90BRgACAOiAAAACAQyAAAACAPSAAAACAH2AAAACALqAAAACALeAAAACAOCAAAACAICAAAACAKiAAAACALiAAAACAJaAAAABAASAAAACAJiAAAAAAAiAAAABAAeAAAACAPWAAAACAKmAAAABAAaAAAABAAOAAAARABb/7AC2ABz/9ACwAB7/9ACqACD/+wCkACMAAACeACb/9ACwACgAAACYACkAAACSACr/9ACwACwAAACMAC7/9ACGAC8AAACAADD/+AB6AEMAAAB0AET/2ABuAEYAAAB0AEj/9gBoAAAADYAAAAEAC4AAAAAAB4AAAAIAb4AAAAIAUYAAAAIAiIAAAAIALYAAAAIARoAAAAIAVIAAAAAAEYAAAAIAYYAAAAIAeYAAAAEABYAAAAEAD4AAAAIAIAAAAA4ASAAAAA7/////gAAACAAe//YARAAm//YARABH//YAPgBI//YAOABYAAAAMgBaAAAAMgBbAAAAMgBdAAAAMgAAABmAAAACAMyAAAACAJOAAAAAAAqAAAABAAIAAAAIAAEAMAAEAAAAEwDIAL4AuACqAKQAngCYAHoAdABqAJgAYAC+AL4AWgC4AJgAdAB0AAEAEwAVACEAJwApAC8ANAA2ADcAOgA7AD8ARABNAE4ATwBQAFYAWABZAAEAFv/YAAIAFf/YABb/2AACACL/9gAk//YAAQAc//sABwAZ//sAHP/7ACf/+wAr//sALv/7AEr/+wBQ//sAAQAq//YAAQAW/84AAQAkAAAAAwA6//sAP//2AFn/+wABAD//9gACABb/2AA/AAAAAQBE/9gACQAIAAEACAABAAIAAAAIAAIAFAAEAAAAIgAaAAEAAgAAAAAAAQABABUAAQAVAAEAAQACAAAAAAABAAAACgAyADIABERGTFQAHmN5cmwAGmdyZWsAGmxhdG4AGgAAAAAABAAAAAD//wAAAAAAAQAAAAAAfgAAABQAAAAAAAAAAAAFAGYxKikpIQgMICcaACUnGC0sAQMeFRUVFQQjLigTIToyLyscDwcwBTghFCQ2ETcfDQsSDggMOQYgHicZGgAKJScXGCYtNSwDGwEJMy46LxwcHCEfHx8OCB0iEBoWAgM0OSYxMTExMTEAAQAAAIwAAQAAAAwAOwAAAAIAAAABwj7JPM100TjVKdYd1ijXHdcs2DLZKtkx2g7aOtsi2zXcYN8D3yHfJuAh4CbgLOMV5AbkEOQg5vzmIuZe5xvqDuoY7ATtV+4I7xnwB/EQ8RHxGfEc8SPyDvQM9DL3F/kl/iYAAAAKAv4CKQMqBBgFFwfxBw8ICgABAALAAMAAAAAAAEAAQAAAAAABAAAAAAAIAAUANHN0cm8AAAADc3RycwAAAAF1bmRvAAAAAHVuZHMAAAABeGhndAAAAAIAAQAAAB4AAQAAAAwABAAAAAIAAAABpx3UKPYJ/QIAAQACwADAAAAAAABAAEAAAAAABAI+AZAABQAAArwCigAAAIwCvAKKAAAB3QA8ATAIAQILBQMFAgMAAgMAAACDAAAAAAAAAAAAAAAASUJNIADAACADzgQB/u0AAARgARMgAAGfAAAAAAIEAroAAAAgAAIAAQAAAAAAAQAIwADAANVVzyfqq+cYAAAAAAqrDDkVVRtUKqstH0AAQAAAAAAAAAIAAAADAAAAFAADAAEAAAAUAAQAqAAAABoAEAADAAoAIABiAKADfgOKA4wDkAOhA6kDsAPJA87//wAAACAAYQCgA34DhAOMA44DkQOjA6oDsQPK//8ARQAA/8b8lwAA/M4AAPyh/KAAAPxoAAAAAQAAABgAAAAAABYAAAAgAAAAAAAgAAAAKgAAAAEAAwBhAGIAVQAWAFYAVwBYAFsAXQBPAFkAXABKAEsATABNAFMATgBSAFAAUQBUAAEAAAAQAAIAAQAUAAcACndnaHQAZAAAAZAAAAK8AAAAAAEAAQIAAABkAAABAwEEAAAAyAAAAQUBBgAAASwAAAEHAAIAAAGQAAABCAELAAAB9AAAAQwBDQAAAlgAAAEOAQ8AAAK8AAABEAAAAAEAAAABAAAAAADkAGcAAAAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADM3UYVHVuXw889QgKA+gAAAAA1hRQ0gAAAADjpsVq/+f/OAMeA34AAAAGAAIAAAAAAAAAAQAABAH+7QAAA1T/5//8Ax4D6AAAAAAAAAAAAAAAAAAAAGYB2AAgAhYALAJEADICRABVAjAALwKBABcCjQBdAkcAXQLDAF0BkAA8AnoAXQMsAF0CwwBdAsQAOgJeAF0CPAAWAmUAGAJRAA0CRAAkARAASwEQACcBJAAxASQAVQKDACwCzAA6AoQAMgJIAFUB9gAKAjAALwIGADwBrAAvAj0AHwIyADgBJwBVAg8AVQH9AAYCQgBVAf8ACgHIAC0CMAAvAm4AGAIoADoB4wAvAkcALwHdABQCOABQAssAMgHwAAwC1gBQAuAANAKBABcCjQBdAfMAXQKCACwCRwBdAkQAJALDAF0CxAA6AZAAPAJ6AF0CdQAXAywAXQLDAF0CSABAAsQAOgK1AF0CXgBdAjkAKAI8ABYCUQANA1QANgJlABgDFgBEAswAOgKEADICBgA8Aj0AHwEnAFUBJ//2ASf/5wIwAC8COABQAjgAUAI4AFAC4AA0AoEAFwJh/+cC3f/nAcv/5wGQADkCyP/nAqX/5wJRAA0CzP/nAfMAXQK1AF0CWACeAlgBFwJYAIoCWACdAlgBFwDsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAZwA3AAMANgAEAAIAEAAvAJoAAAFCD4MAAgAB`];let Ba=null;const Va=/* @__PURE__ */ new Map;function decodeBase64(e){let t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}function loadFaces(){return za.map(e=>{let t=Jn(decodeBase64(e));if(!(`layout`in t))throw Error(`Font collections are not supported`);return t})}function facesForWeight(e){let t=Va.get(e);return t||(Ba??=loadFaces(),t=Ba.map(t=>{let r=t.variationAxes.wght;return r&&r.default!==e?t.getVariation({wght:e}):t}),Va.set(e,t)),t}const Ha=/[​-‍]|\p{Variation_Selector}/u,Ua=/\p{Extended_Pictographic}/u,Wa=/[\p{scx=Han}\p{scx=Hiragana}\p{scx=Katakana}\p{scx=Hangul} -〿＀-⦆¢-₩]/u;function fallbackEm(e){switch(!0){case Ha.test(e):return 0;case Ua.test(e):return 1.23;case Wa.test(e):return 1;default:return .6}}function measureTextWidth(e,t,r=400){let a=facesForWeight(r),o=0,s=``,l=null,flush=()=>{s&&l&&(o+=l.layout(s).advanceWidth*t/l.unitsPerEm),s=``};for(let r of e){let e=r.codePointAt(0),p=a.find(t=>t.hasGlyphForCodePoint(e))??null;p?(p!==l&&(flush(),l=p),s+=r):(flush(),l=null,o+=fallbackEm(r)*t)}return flush(),o}const Ga=/(?:(bold|\d{3})\s+)?(\d+(?:\.\d+)?)px/;function parseCanvasFont(e){let t=Ga.exec(e);if(!t)return{size:10,weight:400};let r=t[1]===`bold`?700:t[1]?parseInt(t[1],10):400;return{size:parseFloat(t[2]),weight:r}}var FontkitContext2D=class{font=`10px sans-serif`;measureText(e){let{size:t,weight:r}=parseCanvasFont(this.font);return{width:measureTextWidth(e,t,r)}}},FontkitOffscreenCanvas=class{width;height;constructor(e,t){this.width=e,this.height=t}getContext(){return new FontkitContext2D}};function withFontMetrics(e){let t=globalThis,r=Object.prototype.hasOwnProperty.call(t,`OffscreenCanvas`),a=t.OffscreenCanvas;t.OffscreenCanvas=FontkitOffscreenCanvas;try{return e()}finally{r?t.OffscreenCanvas=a:delete t.OffscreenCanvas}}function canvasFont(e,t=400){return`${t===400?``:`${t} `}${e}px "IBM Plex Sans"`}function balancedWidth(e,t,{maxWidth:r,lineHeight:a,font:o}){let s=qn(t,r,a).lineCount;if(s<=1)return r;let l=Math.max(...e.split(/\s+/).map(e=>e?Kn(Wn(e,o)):0));if(l>=r)return r;let p=l,g=r;if(qn(t,p,a).lineCount===s)return p;for(;g-p>1;){let e=(p+g)/2;qn(t,e,a).lineCount>s?p=e:g=e}return g}function wrapText(e,{font:t,maxWidth:r,lineHeight:a,maxLines:o,balance:s=!1}){return withFontMetrics(()=>{let l=[];for(let o of e.trim().split(/\r?\n/)){if(!o.trim()){l.push(``);continue}let e=Un(o,t),p=s?balancedWidth(o,e,{maxWidth:r,lineHeight:a,font:t}):r;for(let t of Gn(e,p,a).lines)l.push(t.text.trim())}o!==void 0&&(l=l.slice(0,o));let p=Math.max(0,...l.map(e=>e?Kn(Wn(e,t)):0));return{lines:l,width:p}})}function wrapEdgeLabel(e,{maxWidth:t=_r.maxTextWidth,maxLines:r=_r.label.maxLines}={}){let{fontSize:a,lineHeight:o}=_r.label,s=a*o,{lines:l,width:p}=wrapText(e,{font:canvasFont(a),maxWidth:t,lineHeight:s,maxLines:r,balance:!0});return{lines:l,width:p,height:l.length*s}}function measureLine(e,t){return withFontMetrics(()=>Kn(Wn(e,canvasFont(t))))}function computeEdgeLabelBox(e,t){if(!e&&!t)return null;let{technology:r,gap:a,paddingBlock:o,paddingInline:s}=_r,l=e?wrapEdgeLabel(e):{lines:[],width:0,height:0},p=l.width,g=l.height;return t&&(p=Math.max(p,measureLine(`[ ${t} ]`,r.fontSize)),g+=(l.lines.length>0?a:0)+r.fontSize*r.lineHeight),{label:l.lines.length>0?l.lines.join(`
27
+ `):null,width:Math.ceil(p+2*s),height:Math.ceil(g+2*o)}}const Ka=/* @__PURE__ */ new Map;function edgeLabelBox({label:e,technology:t}){let r=`${e??``}\u0000${t??``}`,a=Ka.get(r);return a===void 0&&(a=computeEdgeLabelBox(e?.trim()||null,t?.trim()||null),Ka.set(r,a)),a}function elementNodeBox(e,t){if(e.style.sizing===`fixed`)return null;let r=vr,{sizes:{size:a},values:o}=t.nodeSizes(e.style),{textSize:s,iconSize:l,padding:p}=o,{width:g,height:_}=o.sizes;switch(e.shape){case`queue`:_-=8;break;case`component`:g+=10}let v=Er(e.shape,p),b=!!e.icon&&e.icon!==`none`,x=e.style.iconPosition??t.defaults.iconPosition??`left`,S=b&&(x===`left`||x===`right`),C=g-v.left-v.right-(S?l+r.iconGapHorizontal:0),w=[],T=s*r.title.lineHeight,ee=wrapText(e.title,{font:canvasFont(s,r.title.fontWeight),maxWidth:C,lineHeight:T,maxLines:r.title.maxLines[a],balance:!0}).lines;w.push(ee.length*T);let te=[],ne=e.technology?.trim();if(ne&&r.technology.maxLines[a]>0){let e=s*r.technology.fontSizeRatio,t=e*r.technology.lineHeight;te=wrapText(ne,{font:canvasFont(e,r.technology.fontWeight),maxWidth:C,lineHeight:t,maxLines:r.technology.maxLines[a]}).lines,w.push(te.length*t)}let re=[],ie=e.description?Ar.from(e.description):null,ae=ie?.text?.trim();if(ie&&ae&&r.description.maxLines[a]>0){let e=s*r.description.fontSizeRatio,t=e*r.description.lineHeight;re=wrapText(ae,{font:canvasFont(e,r.description.fontWeight),maxWidth:C,lineHeight:t,maxLines:r.description.maxLines[a]}).lines;let o=re.length*t;ie.isMarkdown&&(o=Math.min(o,128)),w.push(o)}let E=te.length>0&&re.length>0?r.contentGapDense:r.contentGap,oe=w.reduce((e,t)=>e+t,0)+Math.max(0,w.length-1)*E;return b&&(oe=S?Math.max(oe,l):oe+l+r.iconGapVertical),{width:g,height:Math.max(_,Math.ceil(oe+v.top+v.bottom)),title:ee,technology:te,description:re}}var qa=/* @__PURE__ */ t(Ra(),1);function isCompound(e){return e.children.length>0}function toArrowType(e){switch(e){case`open`:return`vee`;default:return e}}function pointToPx(e){return Array.isArray(e)?[pointToPx(e[0]),pointToPx(e[1])]:(Pi(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const inchToPx=e=>(Pi(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),pxToInch=e=>Math.ceil(e/72*1e3)/1e3,pxToPoints=e=>Math.ceil(e);pxToPoints(40).toString();function compoundColor(e,t){return Xn(Zn(e,{l:-35-5*t,s:-15-5*t}))}function compoundLabelColor(e){return Xn(Yn(e,.3))}function sanitize(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function wrap(e,{maxchars:t,maxLines:r,sanitize:a=Jt(),cut:o=!1}){let s=(0,qa.default)(e,{width:t,indent:``,escape:a,cut:o}).split(`
28
+ `);return Vt(r)&&r>0&&s.length>r&&(s=s.slice(0,r)),s}function wrapWithFont({text:e,maxchars:t,fontsize:r,maxLines:a,bold:o,color:s,cut:l}){let p=wrap(e,{maxchars:t,maxLines:a,sanitize,cut:l}).join(`<BR/>`);o&&(p=`<B>${p}</B>`);let g=s?` COLOR="${s}"`:``;return`<FONT POINT-SIZE="${pxToPoints(r)}"${g}>${p}</FONT>`}function fontLines(e,t,r){let a=r?` COLOR="${r}"`:``;return`<FONT POINT-SIZE="${pxToPoints(t)}"${a}>${e.map(sanitize).join(`<BR/>`)}</FONT>`}function measuredNodeLines(e,t,r){let{technology:a,description:o}=vr;return[fontLines(e.title,t),...e.technology.length>0?[fontLines(e.technology,t*a.fontSizeRatio,r)]:[],...e.description.length>0?[fontLines(e.description,t*o.fontSizeRatio,r)]:[]]}function maxchars(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:Vi(e)}}function nodeLabel(e,t,r=null){let{sizes:{size:a},values:o}=t.nodeSizes(e.style),s=t.colors(e.color).elements,l=[`sm`,`xs`].includes(a),p=P(e.icon),g=e.style.iconPosition??`left`,_=p&&(g===`left`||g===`right`),v=e.style.sizing===`fixed`,b=v?t.fitNodeContent(e):null,x=b?.textSize??o.textSize,S=b?.iconSize??o.iconSize,C=r?measuredNodeLines(r,x,s.loContrast):[wrapWithFont({text:e.title,fontsize:x,maxchars:b?.maxchars??maxchars(a),maxLines:b?.maxLines??(l?1:3),cut:v})],secondaryMaxchars=e=>{let t=Math.ceil(x*e);return v?Math.max(1,Math.floor((b?.maxchars??1)*x/t)):_?35:45};if(!r&&a!==`xs`){P(e.technology?.trim())&&C.push(wrapWithFont({text:e.technology,fontsize:Math.ceil(x*.65),maxchars:secondaryMaxchars(.65),maxLines:1,cut:v,color:s.loContrast}));let t=Jr.from(e.description).text;t&&C.push(wrapWithFont({text:t,fontsize:Math.ceil(x*.75),maxchars:secondaryMaxchars(.75),maxLines:v?1:l?3:5,cut:v,color:s.loContrast}))}if(C.length===1&&p===!1)return`<${C[0]}>`;let w=_?(t,r,a)=>{let o=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(r===0){let t=a.length>1?` ROWSPAN="${a.length}"`:``,r=Math.ceil(S+16);(e.shape===`queue`||e.shape===`mobile`)&&(r+=20),g===`right`?(o=`<TD${t} WIDTH="16"> </TD>${o}`,o=`${o}<TD${t} WIDTH="${r}"> </TD>`):(o=`<TD${t} WIDTH="${r}"> </TD>${o}`,o=`${o}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${o}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,T=C.map(w).join(``);if(p&&(g===`top`||g===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(S+8)}"> </TD></TR>`;T=g===`top`?`${e}${T}`:`${T}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${T}</TABLE>>`}function compoundLabel(e,t){let r=wrapWithFont({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return r.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${r}</TD></TR></TABLE>>`:`<${r}>`}const Ja=`BGCOLOR="${Gr.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:e,technology:t}){let r=edgeLabelBox({label:e,technology:t});if(!r)return null;let{label:a,technology:o}=_r,s=[];if(r.label){let e=r.label.split(`
29
+ `).map(sanitize).join(`<BR/>`);s.push(`<FONT POINT-SIZE="${pxToPoints(a.fontSize)}">${e}</FONT>`)}P(t?.trim())&&s.push(`<FONT POINT-SIZE="${pxToPoints(o.fontSize)}">${sanitize(`[ ${t} ]`)}</FONT>`);let l=s.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``);return`<<TABLE FIXEDSIZE="TRUE" WIDTH="${pxToPoints(r.width)}" HEIGHT="${pxToPoints(r.height)}" BORDER="0" CELLPADDING="0" CELLSPACING="0" ${Ja}>${l}</TABLE>>`}function stepEdgeLabel(e,t){let r=`<TABLE BORDER="0" CELLPADDING="6" ${Ja}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return P(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${r}</TD>`,`<TD ${Ja} CELLPADDING="3">`,wrapWithFont({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${r}>`}const Ya=`Arial`,Xa=createLogger(`dot`);var DotPrinter=class{view;styles;ids=/* @__PURE__ */ new Set;subgraphs=/* @__PURE__ */ new Map;nodes=/* @__PURE__ */ new Map;edges=/* @__PURE__ */ new Map;compoundIds;edgesWithCompounds;viewNodes=new bi(e=>Bi(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`));logger=Xa;graphology=new Qi({allowSelfLoops:!0,multi:!0,type:`directed`});G;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(isCompound).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),r=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||r===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),r=this.graphology.getNodeAttribute(t.target,`modelRef`));let a=-1;e!==null&&r!==null&&(a=Mi(e,r)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:a,weight:1}),a>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:a}),a>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:a})}this.graphology.forEachEdge((e,{hierarchyDistance:t},r,a,o,s)=>{let l=Math.max(o.maxConnectedHierarchyDistance,s.maxConnectedHierarchyDistance);if(l>t)this.graphology.mergeEdgeAttributes(e,{weight:l-t+1});else{let o=this.graphology.directedDegree(r),s=this.graphology.directedDegree(a);o===1&&s===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let r=this.G=this.createGraph();this.applyNodeAttributes(r.attributes.node),this.applyEdgeAttributes(r.attributes.edge)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}selectViewNodes(){return this.view.nodes}selectViewEdges(){return this.view.edges}build(){let e=this.G,t=[];for(let r of this.selectViewNodes())if(isCompound(r))L(r.parent)&&t.push(r);else{let t=this.generateGraphvizId(r),a=this.elementToNode(r,e.node(t));this.nodes.set(r.id,a)}let traverseClusters=(e,t)=>{let r=this.generateGraphvizId(e),a=this.elementToSubgraph(e,t.subgraph(r));this.subgraphs.set(e.id,a);for(let t of e.children){let e=this.computedNode(t);if(isCompound(e))traverseClusters(e,a);else{let t=this.getGraphNode(e.id);t&&a.node(t.id)}}};for(let r of t)traverseClusters(r,e);for(let t of this.selectViewEdges()){let r=this.addEdge(t,e);r&&this.edges.set(t.id,r)}return this}print(){return this.build(),this.postBuild(this.G),O(this.G,{print:{indentStyle:`space`,indentSize:2}})}enableNewRankIfNeeded(){return this.G.subgraphs.some(e=>!!e.get(J.rank))&&this.G.set(J.newrank,!0),this}get isOrtho(){return this.view.routing===`ortho`}edgeLabelAttr(e){return e||this.isOrtho?J.xlabel:J.label}createGraph(){let e=this.view.autoLayout,t=e.direction,r=La({[J.likec4_viewId]:this.view.id,[J.bgcolor]:`transparent`,[J.layout]:`dot`,[J.compound]:!0,[J.rankdir]:t,[J.TBbalance]:`min`,[J.splines]:this.isOrtho?`ortho`:`spline`,[J.outputorder]:`nodesfirst`,[J.nodesep]:pxToInch(e.nodeSep??110),[J.ranksep]:pxToInch(e.rankSep??120),[J.pad]:pxToInch(15),[J.fontname]:Ya});return r.attributes.graph.apply({[J.fontsize]:pxToPoints(this.styles.fontSize()),[J.labeljust]:t===`RL`?`r`:`l`,[J.labelloc]:t===`BT`?`b`:`t`,[J.margin]:50.1}),r}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[J.fontname]:Ya,[J.shape]:`rect`,[J.fillcolor]:t.fill,[J.fontcolor]:t.hiContrast,[J.color]:t.stroke,[J.style]:`filled`,[J.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[J.arrowsize]:.75,[J.fontname]:Ya,[J.fontsize]:pxToPoints(14),[J.penwidth]:pxToPoints(2),[J.color]:t.line,[J.fontcolor]:t.label,[J.style]:this.$defaults.relationship.line})}reserveNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),!this.ids.has(e)&&(this.ids.add(e),e)}generateGraphvizId(e){let t=isCompound(e),r=zi(e.id).toLowerCase(),a=this.reserveNodeId(r,t),o=1;for(;a===!1;)a=this.reserveNodeId(r+`_`+o++,t);return a}elementToSubgraph(e,t){Pi(isCompound(e),`node should be compound`),Pi(jt(e.depth),`node.depth should be defined`);let r=this.styles.colors(e.color).elements,a=compoundLabelColor(r.loContrast);return t.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.likec4_depth]:e.depth,[J.fillcolor]:compoundColor(r.fill,e.depth),[J.color]:compoundColor(r.stroke,e.depth),[J.style]:`filled`,[J.margin]:pxToPoints(e.children.length>1?40:32)}),N(e.title.trim())||t.set(J.label,compoundLabel(e,a)),t}elementToNode(e,t){Pi(!isCompound(e),`node should not be compound`);let r=P(e.icon),{values:{padding:a,sizes:{width:o,height:s}}}=this.styles.nodeSizes(e.style),l=this.measureNode(e),p=r?8:a;t.attributes.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.label]:nodeLabel(e,this.styles,l),[J.margin]:`${pxToInch(p)},${pxToInch(a)}`}),t.attributes.set(J.width,pxToInch(l?.width??o)),t.attributes.set(J.height,pxToInch(l?.height??s));let g=e.style.sizing===`fixed`||!!l;if(g&&t.attributes.set(J.fixedsize,!0),!this.styles.isDefaultColor(e.color)){let r=this.styles.colors(e.color).elements;t.attributes.apply({[J.fillcolor]:r.fill,[J.fontcolor]:r.hiContrast,[J.color]:r.stroke})}switch(e.shape){case`cylinder`:case`storage`:t.attributes.apply({[J.margin]:`${pxToInch(p)},${pxToInch(0)}`,[J.penwidth]:pxToPoints(2),[J.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[J.margin]:`${pxToInch(r?p:p+4)},${pxToInch(a+6)}`});break;case`mobile`:t.attributes.apply({[J.margin]:`${pxToInch(r?p:p+4)},${pxToInch(a)}`});break;case`queue`:t.attributes.apply({...!g&&{[J.width]:pxToInch(o),[J.height]:pxToInch(s-8)},[J.margin]:`${pxToInch(r?p:p+4)},${pxToInch(a)}`});break;case`component`:t.attributes.apply({...!g&&{[J.width]:pxToInch(o+10)},[J.margin]:`${pxToInch(p+20)},${pxToInch(a)}`})}return t}measureNode(e){return elementNodeBox(e,this.styles)}leafElements(e){return e===null?M([...this.selectViewNodes()],e=>!isCompound(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return isCompound(t)?this.leafElements(t.id):[t]})}descendants(e){return e===null?[...this.selectViewNodes()]:this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return this.viewNodes.get(e)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let r=this.computedNode(e),a=this.getGraphNode(e),o;return a?[r,a,void 0]:(Pi(isCompound(r),`endpoint node should be compound`),o=this.getSubgraph(e)?.id,Pi(o,`subgraph ${e} not found`),r=Bi(t(this.leafElements(e)),`leaf element in ${e} not found`),a=Bi(this.getGraphNode(r.id),`source graphviz node ${r.id} not found`),[r,a,o])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return I(this.descendants(e),zt(e=>vn(e.inEdges,e.outEdges)),_n(),pn(vn(t.inEdges,t.outEdges)),V(e=>this.view.edges.find(t=>t.id===e)),M(P))}assignGroups(){let e=I(this.view.nodes,M(isCompound),V(e=>e.id),mn(wi),yn(),V(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),M(({edges:e})=>e.length>1&&e.length<8),$t(4)),t=/* @__PURE__ */ new Set;for(let r of e){let e=r.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let a of e)try{let e=Bi(this.getGraphNode(a.source),`Graphviz Node not found for ${a.source}`),o=Bi(this.getGraphNode(a.target),`Graphviz Node not found for ${a.target}`);t.add(a.source),t.add(a.target),e.attributes.set(J.group,r.id),o.attributes.set(J.group,r.id)}catch(e){Xa.error(`Failed to assign group to edge ${a.id}`,{error:e})}}return this}},AiLayoutViewPrinter=class extends DotPrinter{aiHints;constructor(e,t,r){super(e,t),this.aiHints=r}createGraph(){let e=super.createGraph();return e.delete(J.TBbalance),e}selectViewNodes(){if(!this.aiHints.nodeOrder)return this.view.nodes;let e=[...this.view.nodes],t=[];for(let r of this.aiHints.nodeOrder){let a=e.findIndex(e=>e.id===r);a!==-1&&t.push(...e.splice(a,1))}return t.push(...e),t}selectViewEdges(){if(!this.aiHints.edgeOrder)return this.view.edges;let e=[...this.view.edges],t=[];for(let r of this.aiHints.edgeOrder){let a=e.findIndex(e=>e.id===r);a!==-1&&t.push(...e.splice(a,1))}return t.push(...e),t}postBuild(e){this.applyNodeRanks().addInvisibleEdges().enableNewRankIfNeeded()}applyNodeRanks(){let e=this.G;for(let t of this.aiHints.ranks){let r=[...new Set(t.nodes)].map(e=>this.getGraphNode(e)).filter(Ut);if(r.length===0||t.rank===`same`&&r.length===1)continue;let a=e.createSubgraph({[J.rank]:t.rank});for(let e of r)a.node(e.id)}return this}addEdge(e,t){let r=this.aiHints.reverseRank?.includes(e.id)??!1,[a,o]=r?[e.target,e.source]:[e.source,e.target],[,s,l]=this.edgeEndpoint(a,qt()),[,p,g]=this.edgeEndpoint(o,Xt()),_=t.edge([s,p],{[J.likec4_id]:e.id});e.line&&e.line!==`dashed`&&_.attributes.set(J.style,e.line),g&&_.attributes.set(J.lhead,g),l&&_.attributes.set(J.ltail,l);let v=Ut(g)||Ut(l),b=edgelabel(e);if(b&&_.attributes.set(this.edgeLabelAttr(v),b),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;_.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let x=this.aiHints.edgeWeight[e.id];x!==void 0&&x!==1&&_.attributes.set(J.weight,x);let S=this.aiHints.edgeMinlen[e.id];return S!==void 0&&S!==1&&_.attributes.set(J.minlen,S),this.aiHints.excludeFromRanking?.includes(e.id)&&_.attributes.set(J.constraint,!1),r&&_.attributes.set(J.dir,`back`),_}addInvisibleEdges(){if(!this.aiHints.invisibleEdges)return this;let e=this.G;for(let{source:t,target:r,...a}of this.aiHints.invisibleEdges){let o=this.getGraphNode(t),s=this.getGraphNode(r);if(!o||!s)continue;let l=`invisible_${t}->${r}`;if(this.edges.has(l)){this.logger.trace`invisible edge ${t} -> ${r} already exists with id ${l}, skipping creation`;continue}this.graphology.addEdgeWithKey(l,t,r,{hierarchyDistance:0,origin:`invisible`,weight:a.weight??1});let p=e.edge([o,s],{[J.style]:`invis`});this.edges.set(l,p),a.minlen!==void 0&&a.minlen!==1&&p.attributes.set(J.minlen,a.minlen),a.weight!==void 0&&a.weight!==1&&p.attributes.set(J.weight,a.weight)}return this}reduceDefaultRankSeparation(){let e=this.view.autoLayout,t=this.G;return jt(e.rankSep)||!(an(this.aiHints.edgeMinlen).some(([e,t])=>t>1)||(this.aiHints.invisibleEdges?.some(e=>e.minlen&&e.minlen>1)??!1))||t.set(J.ranksep,pxToInch(80)),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(J.TBbalance),e.apply({[J.nodesep]:pxToInch(t.nodeSep??130),[J.ranksep]:pxToInch(t.rankSep??130)}),e}postBuild(){let e=this.G;return I(this.view.nodes,V(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),Yt(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),xn(),V(e=>e),gn(t=>{t.length<2||e.subgraph({[J.rank]:`same`},e=>{for(let{graphvizNode:r}of t)e.node(Bi(r).id)})}),cn(()=>{e.set(J.newrank,!0),e.set(J.clusterrank,`global`),e.delete(J.pack),e.delete(J.packmode)})),this}elementToSubgraph(e,t){let r=super.elementToSubgraph(e,t);return e.children.length>1&&r.set(J.margin,pxToPoints(50)),r}addEdge(e,t){let[r,a]=[e.source,e.target],[o,s,l]=this.edgeEndpoint(r,qt()),[p,g,_]=this.edgeEndpoint(a,Xt()),v=Ut(_)||Ut(l),b=t.edge([s,g],{[J.likec4_id]:e.id,[J.style]:e.line??`dashed`});_&&b.attributes.set(J.lhead,_),l&&b.attributes.set(J.ltail,l);let x=this.graphology.getEdgeAttribute(e.id,`weight`);x>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&b.attributes.set(J.weight,x);let S=edgelabel(e);if(S&&b.attributes.set(this.edgeLabelAttr(v),S),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;b.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let[C,w]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return C===`none`&&w===`none`?(b.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`}),b):e.dir===`both`?(b.attributes.apply({[J.arrowhead]:toArrowType(C),[J.arrowtail]:toArrowType(e.tail??C),[J.dir]:`both`}),!v&&o.modelRef!==p.modelRef&&b.attributes.set(J.constraint,!1),b):(C&&b.attributes.set(J.arrowhead,toArrowType(C)),w!==`none`&&b.attributes.set(J.arrowtail,toArrowType(w)),b)}},DynamicViewPrinter=class extends DotPrinter{postBuild(e){e.delete(J.TBbalance),e.set(J.ordering,`in`)}addEdge(e,t){let{nodes:r}=this.view,[a,o]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[s,l,p]=this.edgeEndpoint(a,qt()),[g,_,v]=this.edgeEndpoint(o,Xt()),b=t.edge([l,_],{[J.likec4_id]:e.id});if(e.line&&e.line!==this.$defaults.relationship.line&&b.attributes.set(J.style,e.line),v&&b.attributes.set(J.lhead,v),p&&b.attributes.set(J.ltail,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;b.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let x=[e.label?.trim(),e.technology?.trim()].filter(P).join(`
30
+ `),S=stepEdgeLabel(this.view.edges.indexOf(e),x);b.attributes.set(this.edgeLabelAttr(!1),S);let C=r.findIndex(e=>e.id===a);r.findIndex(e=>e.id===o)<C&&e.dir!==`back`&&b.attributes.apply({[J.minlen]:0});let[w,T]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(b.attributes.apply({[J.arrowtail]:toArrowType(w),[J.dir]:`back`}),T!==`none`&&b.attributes.apply({[J.arrowhead]:toArrowType(T),[J.minlen]:0}),b):w===`none`&&T===`none`||w!==`none`&&T!==`none`?(b.attributes.apply({[J.arrowhead]:toArrowType(w),[J.arrowtail]:toArrowType(T),[J.dir]:`both`}),b):w===`none`?(b.attributes.delete(J.arrowhead),b.attributes.apply({[J.arrowtail]:toArrowType(T),[J.minlen]:0,[J.dir]:`back`}),b):(b.attributes.set(J.arrowhead,toArrowType(w)),b)}};const Za=createLogger(`dot.rank`);var ElementViewPrinter=class extends DotPrinter{postBuild(){this.assignGroups().tileNodesWithoutEdges().applyExplicitRankBlocks().enableNewRankIfNeeded()}tileNodesWithoutEdges(){let e=/* @__PURE__ */ new Set,t=this.view.nodes.reduce((t,r)=>(isCompound(r)&&(e.add(r.id),t.push(r)),t),[]);for(let e of t){let t=I(e.children,M(e=>!this.compoundIds.has(e)&&this.graphology.degree(e)===0),V(e=>this.computedNode(e)));if(t.length<=2)continue;let r=2;switch(!0){case t.length>11:r=4;break;case t.length>4:r=3}let a=Bi(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),o=null;en(t,r).forEach(e=>{let t=e.length>1?a.createSubgraph({[J.rank]:`same`}):null;e.forEach((e,r)=>{let s=this.getGraphNode(e.id);s&&(t?.node(s.id),r===0&&(o&&a.edge([o,s],{[J.style]:`invis`}),o=s))})})}return this}applyExplicitRankBlocks(){let e=this.view.ranks??[];if(e.length===0)return this;let t=0;for(let r of e){let e=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(e.length===0)continue;let a=this.G.createSubgraph({[J.rank]:r.type});e.forEach(e=>a.node(e.id)),t+=1,Za.trace`rank ${r.type} => ${e.map(e=>e.id).join(`, `)}`}return t>0&&this.G.set(`likec4_rankBlocks`,t),this}addEdge(e,t){let[r,a]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[o,s,l]=this.edgeEndpoint(r,qt()),[p,g,_]=this.edgeEndpoint(a,Xt()),v=e.parent,b=this.graphology.getEdgeAttributes(e.id),x=t.edge([s,g],{[J.likec4_id]:e.id});e.line&&e.line!==this.$defaults.relationship.line&&x.attributes.set(J.style,e.line),_&&x.attributes.set(J.lhead,_),l&&x.attributes.set(J.ltail,l);let S=Ut(_)||Ut(l),C=edgelabel(e);if(C&&x.attributes.set(this.edgeLabelAttr(S),C),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;x.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}!this.graphology.hasDirectedEdge(e.target,e.source)&&b.weight>1&&x.attributes.set(J.weight,b.weight);let[w,T]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return x.attributes.apply({[J.arrowtail]:toArrowType(w),[J.dir]:`back`}),T!==`none`&&x.attributes.apply({[J.arrowhead]:toArrowType(T),[J.dir]:`both`,[J.minlen]:0}),x;if(w===`none`&&T===`none`)return x.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`,[J.minlen]:0,[J.constraint]:!1}),x;if(w!==`none`&&T!==`none`)return x.attributes.apply({[J.arrowhead]:toArrowType(w),[J.arrowtail]:toArrowType(T),[J.dir]:`both`}),x;if(x.attributes.set(J.arrowhead,toArrowType(w)),T!==`none`&&x.attributes.set(J.arrowtail,toArrowType(T)),this.view.edges.length===1)return x;let ee;return ee=v===null&&o.parent==null&&p.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let r=this.computedNode(t.source),a=this.computedNode(t.target);return isCompound(r)||isCompound(a)?!1:r.parent==null&&a.parent==null}):this.findInternalEdges(v).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),ee.length===0&&(v===null||this.leafElements(v).length<=3)&&x.attributes.set(J.minlen,0),x}};function placeEdgeLabels(e,t){let r=ea(e.map(e=>({id:e.id,segments:ta(na(e.points)),labelBBox:e.labelBBox??null})),t.filter(e=>!isCompound(e)));return e.map(e=>{let t=r.get(e.id);return t?{...e,labelBBox:t}:e})}function parseBB(e){let[t,r,a,o]=e?e.split(`,`).map(e=>pointToPx(+e)):[0,0,0,0],s=Math.round(a-t),l=Math.round(r-o);return{x:Math.round(t),y:Math.round(o),width:s,height:l}}function parsePos(e){try{let[t,r]=e.split(`,`);return{x:pointToPx(parseFloat(t)),y:pointToPx(parseFloat(r))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function parseNode(e){let{x:t,y:r}=parsePos(e.pos),a=inchToPx(parseFloat(e.width)),o=inchToPx(parseFloat(e.height));return{x:t-Math.round(a/2),y:r-Math.round(o/2),width:a,height:o}}function parseLabelBbox(e,[t,r]=[0,0]){if(!e||e.length===0)return null;let a=1/0,o=1/0,s=-1/0,l=-1/0,p=13;try{for(let g of e)if(g.op===`F`)p=pointToPx(g.size);else if(g.op===`T`){let e=pointToPx(g.pt[0])-t,_=pointToPx(g.width);switch(g.align){case`r`:e-=_;break;case`c`:e-=Math.round(_/2)}a=Math.min(a,e),s=Math.max(s,e+_);let v=pointToPx(g.pt[1])-r;o=Math.min(o,Math.round(v-p)),l=Math.max(l,v)}}catch(t){return Aa.warn(`Failed on parsing label draw ops:
31
+ {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return a===1/0?null:{x:a-2,y:o-2,width:s-a+4,height:l-o+4}}function parseEdgePoints({_draw_:e,likec4_id:t=`???`},r=`<unknown view>`){try{let a=e.filter(e=>e.op.toLowerCase()===`b`);Pi(R(a,1),`view ${r} edge ${t} should have at least one bezier draw op`),a.length>1&&Aa.warn(`view ${r} edge ${t} has more than one bezier draw op, using the first one only`);let o=a[0].points.map(e=>pointToPx(e));return Pi(R(o,2),`view ${r} edge ${t} should have at least two points`),o}catch(a){throw Error(`failed on parsing view ${r} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:a})}}function parseGraphvizEdge(e,{id:t,source:r,target:a,dir:o,label:s,description:l,...p},g,_){let v=e.dir===`back`||o===`back`,b=_?edgeLabelBox({label:s,technology:p.technology}):null,x=e.lp??e.xlp,S;if(b&&x){let{x:e,y:t}=parsePos(x);S={x:Math.round(e-b.width/2),y:Math.round(t-b.height/2),width:b.width,height:b.height},s=b.label}else S=parseLabelBbox(e._ldraw_??e._tldraw_??e._hldraw_),s=s&&S?wrap(s,{maxchars:40,maxLines:5}).join(`
32
+ `):null;return{id:t,source:r,target:a,label:s,...P(l)&&{description:l},points:parseEdgePoints(e,g),labelBBox:S,...v?{dir:`back`}:{},...p}}function parseGraphvizJson(e,t){let r=parseBB(e.bb),{nodes:a,edges:o,hasManualLayout:s,...l}=t,p=[],g=[],_;if(_=l._type===`dynamic`?{...l,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],subflows:[],steps:[],bounds:r},[Zr]:`layouted`,bounds:r,nodes:p,edges:g}:{...l,[Zr]:`layouted`,bounds:r,nodes:p,edges:g},s){let e=_;e[Xr]=`auto`}let v=e.objects??[];for(let e of a){let t=v.find(t=>t.likec4_id===e.id);Pi(t,`View ${l.id} node ${e.id} not found in graphviz output`);try{let{x:r,y:a,width:o,height:s}=`bb`in t?parseBB(t.bb):parseNode(t),l=[r,a];p.push({...e,x:r,y:a,width:o,height:s,labelBBox:parseLabelBbox(t._ldraw_,l)??{x:r,y:a,width:o,height:s}})}catch(r){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:r})}}let b=e.edges??[];for(let e of o){let t=b.find(t=>t.likec4_id===e.id);t?g.push(parseGraphvizEdge(t,e,l.id,l._type!==`dynamic`)):Aa.warn`View ${l.id} edge ${e.id} not found in graphviz output, skipping`}if(l.routing===`ortho`){let e=placeEdgeLabels(g,p);_={..._,edges:e,bounds:$i.merge(r,...e.flatMap(e=>e.labelBBox?[e.labelBBox]:[]))}}return _}function parseGraphvizJsonOfProjectsView(e,t){return parseGraphvizJson(e,t)}var Qa=class ProjectsViewPrinter extends DotPrinter{static toDot(e){return new ProjectsViewPrinter(e).print()}constructor(e){super(e,br.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[J.nodesep]:pxToInch(100),[J.ranksep]:pxToInch(100)}),e.delete(J.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[J.likec4_id]:e.id,[J.likec4_project]:e.projectId}),super.elementToNode(e,t)}measureNode(){return null}addEdge(e,t){let r=Bi(this.getGraphNode(e.source),`Node not found for ${e.source}`),a=Bi(this.getGraphNode(e.target),`Node not found for ${e.target}`),o=this.graphology.getEdgeAttributes(e.id),s=t.edge([r,a],{[J.likec4_id]:e.id,[J.likec4_project]:e.projectId});e.line&&e.line!==this.$defaults.relationship.line&&s.attributes.set(J.style,e.line),!this.graphology.hasDirectedEdge(e.target,e.source)&&o.weight>1&&s.attributes.set(J.weight,o.weight);let l=edgelabel(e);if(l&&s.attributes.set(J.label,l),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;s.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}return s}};const $a=Qn(1);var eo=class GraphvizWasmAdapter{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){ra.unload()}[Symbol.dispose](){this.dispose()}async attempt(e,t,r){return await $a(async()=>{let a=Aa.getChild([`layouter`,`wasm`,e,`_`,un(4).toLowerCase()]);try{a.trace`execute`;let e=await r();return++GraphvizWasmAdapter.opsCount>=20&&(GraphvizWasmAdapter.opsCount=0,a.trace`reached 20 operations, unloading wasm`,ra.unload()),e}catch(e){a.trace(`FAILED DOT
33
+ `+t);let r=loggable(e);if(r.includes(`syntax error`))throw e;a.warn(r),GraphvizWasmAdapter.opsCount=0,ra.unload()}return a.warn(`Retrying...`),await Di(30,300),await r()})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await ra.load()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await ra.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await ra.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await ra.load()).layout(e,`svg`))}};const getPrinter=({view:e,styles:t})=>{switch(!0){case li(e):return new DynamicViewPrinter(e,t);case ci(e):return new DeploymentViewPrinter(e,t);case ui(e):return new ElementViewPrinter(e,t);default:Vi(e)}},to=Aa.getChild(`layouter`);function normalizeDot(e){return e.split(`
36
34
  `).filter(e=>!(e.includes(`margin`)&&e.includes(`50.1`))).join(`
37
- `)}var GraphvizLayouter=class{graphviz;constructor(e){this.graphviz=e??new kc,Ac.trace`created with port ${this.graphviz.name}`}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e,Ac.trace`change port to ${this.graphviz.name}`}printToDot(e,t){return normalizeDot((t?new AiLayoutViewPrinter(e.view,e.styles,t):getPrinter(e)).print())}newScopedLogger(e){return Ac.getChild([e,`_`,Sn(4).toLowerCase()])}async dotToJson(e){let t=this.newScopedLogger(`dotToJson`),r;try{r=await this.graphviz.layoutJson(e)}catch(r){throw t.error(loggable(r)),t.error(`Failed to convert DOT to JSON:
38
- `+e),r}try{return JSON.parse(r)}catch(o){throw t.error(loggable(o)),t.error`Failed to parse JSON:\n${r}\n. Generated from DOT:\n${e}`,o}}async layout(e){let t=this.newScopedLogger(`layout`);try{t.trace`layouting view ${e.view.id}...`;let r=await this.dot(e),{view:o}=e,s=parseGraphvizJson(await this.dotToJson(r),o);return qr(s)&&Object.assign(s,{sequenceLayout:v(s)}),r=normalizeDot(r),t.trace`layouting view ${e.view.id} done`,{dot:r,diagram:s}}catch(r){throw t.warn(loggable(r)),wrapError(r,`Error during layout: ${e.view.id}`)}}async aiLayout({view:e,styles:t},r){let o=this.newScopedLogger(`ai-layout`);try{o.trace`layouting view ${e.id} using AI hints...`;let s=new AiLayoutViewPrinter(e,t,r).print(),c=parseGraphvizJson(await this.dotToJson(s),e);return qr(c)&&Object.assign(c,{sequenceLayout:v(c)}),s=normalizeDot(s),o.trace`layouting view ${e.id} done`,{dot:s,diagram:c}}catch(t){throw o.warn(loggable(t)),wrapError(t,`Error during AI layout: ${e.id}`)}}async svg(e){let t=await this.dot(e);return t=normalizeDot(t),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=this.newScopedLogger(`dot`);t.trace`generating dot for view ${e.view.id}`;let r=getPrinter(e).print();if(!Jr(e.view))return normalizeDot(r);try{t.trace`unflattening dot`,r=await this.graphviz.unflatten(r)}catch(r){t.warn(`Error during unflatten: ${e.view.id}`,{error:r})}return normalizeDot(r)}async layoutProjectsView(e){let t=this.newScopedLogger(`layoutProjectsView`);t.debug`layouting projects overview...`;let r=new Dc(e).print();try{r=await this.graphviz.unflatten(r)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let o=await this.dotToJson(r);return t.debug`layouting ${`projects overview`}`,parseGraphvizJsonOfProjectsView(o,e)}};const jc=K.getChild([`layouter-queue`]);var QueueGraphvizLayoter=class extends GraphvizLayouter{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new Gn({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=jc.getChild([`run`,Sn(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await Si(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),jc.trace`add task to queue`,await this.queue.add(e))}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,jc.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){let t=await this.runInQueue(async()=>await super.layout(e));if(!t)throw Error(`QueueGraphvizLayoter: layout failed`);return t}async layoutProjectsView(e){let t=await this.runInQueue(async()=>await super.layoutProjectsView(e));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){let t=jc.getChild([`batch`,Sn(3)]);if(this.isProcessingBatch)return t.trace`wait for previous layouts to finish`,await this.queue.onIdle(),await Si(),e.cancelToken?.isCancellationRequested?(t.trace`cancellation requested`,[]):(t.trace`retry`,await this.batchLayout(e));let r=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${r}`,this.isProcessingBatch=!0;let o=[];try{for(let s of e.batch)if(t.trace`add task for view ${s.view.id}`,this.queue.add(async()=>(r<=2&&await Si(),await super.layout(s))).then(t=>{if(!t){e.onError?.(s,Error(`Layout queue returned null for view ${s.view.id}`));return}o.push(t),e.onSuccess?.(s,t)}).catch(r=>{t.error(`Fail layout view ${s.view.id}`,{err:r}),e.onError?.(s,r)}),await this.waitForQueueToShrink(r,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}let s=this.queue.pending+this.queue.size;s>0&&(t.trace`waiting ${s} tasks to finish`,await this.queue.onIdle())}finally{t.debug`batch layout done`,this.isProcessingBatch=!1}return o}async waitForQueueToShrink(e=this.queue.concurrency,t=jc){this.queue.size>e+2&&(t.trace`limit reached. queue size: ${this.queue.size}, running: ${this.queue.pending}, waiting shrink to ${e}`,await this.queue.onSizeLessThan(e+1))}dispose(){this.queue.clear(),super.dispose()}},Mc=e(Kn(),1);const Nc=K.getChild([`graphviz`,`binary`]);var GraphvizBinaryAdapter=class{_dotpath;_unflattenpath;constructor(e,t){this._dotpath=e,this._unflattenpath=t}get name(){return`binary`}dispose(){}[Symbol.dispose](){}get concurrency(){return Math.max(1,Fi.availableParallelism()-2)}get dotpath(){return this._dotpath??gi(this,`_dotpath`,()=>{let e=Mc.default.sync(`dot`);return Nc.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??gi(this,`_unflattenpath`,()=>{let e=Mc.default.sync(`unflatten`);return Nc.debug`Found ${e}`,e})}async unflatten(e){let t,r=Nc.getChild([`unflatten`,Sn(4)]);try{let o=await Ni(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=o.stdout,N(o.stderr)?r.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):r.warn(`{command} has stderr:
39
- `+o.stderr,{command:o.command})}catch(o){r.debug(`FAILED DOT`,{dot:e}),r.error(loggable(o)),o instanceof Pi&&!N(o.stdout)&&(r.warn(`{command} returned result but failed with exitcode {exitCode}:
40
- {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),t=o.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=Nc.getChild([`layoutJson`,Sn(4)]),r;try{let o=await Ni(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});r=o.stdout,N(o.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):t.warn(`{command} has stderr:
41
- `+o.stderr,{command:o.command})}catch(o){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(o)),o instanceof Pi&&!N(o.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
42
- {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),r=o.stdout;else throw o}return r}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=Nc.getChild([`svg`,Sn(4)]),r;try{let o=await Ni(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});r=o.stdout,N(o.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):t.warn(`{command} has stderr:
43
- `+o.stderr,{command:o.command})}catch(o){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(o)),o instanceof Pi&&!N(o.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
44
- {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),r=o.stdout;else throw o}return r}};const Y=K.getChild(`server`);function logWarnError(e){Y.warn(loggable(e))}function getTelemetrySink(e){let t=getMessageOnlyFormatter();return r=>{try{switch(r.level){case`error`:case`fatal`:{let o=r.category.join(`.`);if(o===`likec4.config`)break;let s=errorFromLogRecord(r);s?e.telemetry.logEvent({eventName:`error`,message:`${s.name}: ${s.message}`,category:o,...s.stack&&{stack:s.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(r),category:o});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function configureLanguageServerLogger({lspConnection:e,enableTelemetry:t=!!e,useStdErr:r=!1,logLevel:o=zi?`debug`:`warning`,nonBlocking:s=!1,colors:c=Ri}={}){let u=!!e&&t&&!zi;configureLogger$1({reset:!0,sinks:{console:r?getConsoleStderrSink():getConsoleSink({formatter:c?getAnsiColorFormatter():getTextFormatter(),nonBlocking:s}),...u&&{telemetry:getTelemetrySink(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...u?[`telemetry`]:[]],lowestLevel:o}]}),Y.trace(`logger configured`)}const Pc=Lt.pick({extends:!0,styles:!0}).loose(),normalizeExtends=e=>e?Array.isArray(e)?e:[e]:[],parseJsonConfig=async e=>{let t=await Zn.readFile(e,`utf-8`),r;try{r=bt.parse(t.trim()||`{}`)}catch(t){throw wrapError(t,`${e}:`)}if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`${e}: Config must be a JSON object`);let o=Pc.safeParse(r);if(!o.success)throw Error(`${e}: Invalid config\n`+Et.prettifyError(o.error));return o.data},loadJsonConfigs=async(e,t)=>{if(t.includes(e)){let r=t.indexOf(e),o=[...t.slice(r),e].join(` -> `);throw Error(`Config extends cycle detected: ${o}`)}let r=await parseJsonConfig(e),o=normalizeExtends(r.extends),s=[...t,e],c=[];for(let t of o){let r=ir(tr(e),t);c.push(...await loadJsonConfigs(r,s))}return[...c,r]};async function loadConfig(e){e=typeof e==`string`?e:e.fsPath,K.getChild(`config`).trace`Loading config: ${rr(Hi(),e)}`;let t=tr(e),r=er(e),o={name:er(t)};if(Ft(r)){let t=await loadJsonConfigs(ir(e),[]);U(M(t,1),`Expect at least one config`);let r=dn(Fn(t),[`extends`,`styles`]),s=t.map(e=>e.styles).filter(I),c=s.length>0?_({},...s.reverse()):void 0;return Nt({...o,...r,...c?{styles:c}:{}})}U(It(r),`Invalid name for config file: ${e}`);let{mod:s}=await Bi({filepath:e,cwd:t,esbuildOptions:{resolveExtensions:[`.ts`,`.mts`,`.cts`,`.mjs`,`.js`,`.cjs`],plugins:[{name:`likec4-config`,setup(e){e.onResolve({filter:/^@?likec4\/config$/},e=>({path:e.path,namespace:`likec4-config`})),e.onEnd(e=>{let t=Vi(e.errors,{kind:`error`});for(let e of t)K.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
45
- // Mock implementation to allow loading config files without bundling @likec4/config
46
- function mock(x) { return x }
47
- export {
48
- mock as defineConfig,
49
- mock as defineGenerators,
50
- mock as defineStyle,
51
- mock as defineTheme,
52
- mock as defineThemeColor,
53
- }`,loader:`js`}))}}]}});return Nt(Object.assign(o,s?.default??s))}const Fc={aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)},Ic=Object.keys(Fc),Lc=Fc,Rc=[`likec4lib {`,` icons {`,...[...Object.entries(Fc)].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
54
- `),zc=`likec4builtin`,Bc=`${zc}:///likec4/lib/icons.c4`;function isLikeC4Builtin(e){return(`uri`in e?e.uri:e).scheme===zc}function isNotLikeC4Builtin(e){return!isLikeC4Builtin(e)}const Vc=ui(`/`),compareByUri=(e,t)=>Vc(ft(e.uri.path),ft(t.uri.path)),Hc=ui(`/`,!0),compareByUriDeepFirst=(e,t)=>Hc(ft(e.uri.path),ft(t.uri.path));var ADisposable=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){logWarnError(e)}}throwIfDisposed(){this.isDisposed&&Y.warn(`this has already been disposed`)}};const Uc=`AnyProperty`;function isAnyProperty(e){return X.isInstance(e,Uc)}const Wc=`ColorLiteral`;function isColorLiteral(e){return X.isInstance(e,Wc)}const Gc=`DeploymentElement`;function isDeploymentElement(e){return X.isInstance(e,Gc)}const Kc=`DeploymentNodeOrElementKind`,qc=`DeploymentViewRule`;function isDeploymentViewRule(e){return X.isInstance(e,qc)}const Jc=`DynamicViewProperty`,Yc=`DynamicViewRule`;function isDynamicViewRule(e){return X.isInstance(e,Yc)}const Xc=`ElementProperty`;function isElementProperty(e){return X.isInstance(e,Xc)}const Zc=`ExpressionV2`;function isExpressionV2(e){return X.isInstance(e,Zc)}const Qc=`ExtendElementOrRelation`;function isExtendElementOrRelation(e){return X.isInstance(e,Qc)}const $c=`FqnExpr`;function isFqnExpr(e){return X.isInstance(e,$c)}const el=`FqnExprOrWhere`;function isFqnExprOrWhere(e){return X.isInstance(e,el)}const tl=`FqnExprOrWith`;function isFqnExprOrWith(e){return X.isInstance(e,tl)}const nl=`FqnReferenceable`,rl=`LikeC4View`;function isLikeC4View(e){return X.isInstance(e,rl)}const il=`MetadataProperty`;function isMetadataProperty(e){return X.isInstance(e,il)}const al=`MetadataValue`,ol=`ModelElement`,sl=`Referenceable`,cl=`RelationExpr`;function isRelationExpr(e){return X.isInstance(e,cl)}const ll=`RelationExprOrWhere`;function isRelationExprOrWhere(e){return X.isInstance(e,ll)}const ul=`RelationExprOrWith`;function isRelationExprOrWith(e){return X.isInstance(e,ul)}const dl=`RelationProperty`,fl=`RelationshipStyleProperty`;function isRelationshipStyleProperty(e){return X.isInstance(e,fl)}const pl=`SizeProperty`;function isSizeProperty(e){return X.isInstance(e,pl)}const ml=`StepOrSeries`;function isStepOrSeries(e){return X.isInstance(e,ml)}const hl=`StepStatement`;function isStepStatement(e){return X.isInstance(e,hl)}const gl=`StringProperty`;function isStringProperty(e){return X.isInstance(e,gl)}const _l=`StyleProperty`;function isStyleProperty(e){return X.isInstance(e,_l)}const vl=`TryStep`;function isTryStep(e){return X.isInstance(e,vl)}const yl=`ViewProperty`;function isViewProperty(e){return X.isInstance(e,yl)}const bl=`ViewRule`;function isViewRule(e){return X.isInstance(e,bl)}const xl=`ViewRuleStyleOrGlobalRef`;function isViewRuleStyleOrGlobalRef(e){return X.isInstance(e,xl)}const Sl=`WhereElement`;function isWhereElement(e){return X.isInstance(e,Sl)}const Cl=`WhereElementExpression`;function isWhereElementExpression(e){return X.isInstance(e,Cl)}const wl=`WhereExpression`,Tl=`WhereKindEqual`;function isWhereKindEqual(e){return X.isInstance(e,Tl)}const El=`WhereMetadataEqual`;function isWhereMetadataEqual(e){return X.isInstance(e,El)}const Dl=`WhereRelation`;function isWhereRelation(e){return X.isInstance(e,Dl)}const Ol=`WhereRelationExpression`;function isWhereRelationExpression(e){return X.isInstance(e,Ol)}const kl=`WhereTagEqual`;function isWhereTagEqual(e){return X.isInstance(e,kl)}const Al=`AbstractStep`,jl=`AltSteps`;function isAltSteps(e){return X.isInstance(e,jl)}const Ml=`ArrowProperty`;function isArrowProperty(e){return X.isInstance(e,Ml)}const Nl=`BorderProperty`;function isBorderProperty(e){return X.isInstance(e,Nl)}const Pl=`CatchBlock`;function isCatchBlock(e){return X.isInstance(e,Pl)}const Fl=`ColorProperty`;function isColorProperty(e){return X.isInstance(e,Fl)}const Il=`CustomColor`,Ll=`CustomElementProperties`;function isCustomElementProperties(e){return X.isInstance(e,Ll)}const Rl=`CustomRelationProperties`;function isCustomRelationProperties(e){return X.isInstance(e,Rl)}const zl=`DeployedInstance`;function isDeployedInstance(e){return X.isInstance(e,zl)}const Bl=`DeployedInstanceBody`;function isDeployedInstanceBody(e){return X.isInstance(e,Bl)}const Vl=`DeploymentNode`;function isDeploymentNode$1(e){return X.isInstance(e,Vl)}t(isDeploymentNode$1,`isDeploymentNode`);const Hl=`DeploymentNodeBody`;function isDeploymentNodeBody(e){return X.isInstance(e,Hl)}const Ul=`DeploymentNodeKind`;function isDeploymentNodeKind(e){return X.isInstance(e,Ul)}const Wl=`DeploymentRelation`;function isDeploymentRelation(e){return X.isInstance(e,Wl)}const Gl=`DeploymentRelationBody`;function isDeploymentRelationBody(e){return X.isInstance(e,Gl)}const Kl=`DeploymentView`;function isDeploymentView$1(e){return X.isInstance(e,Kl)}t(isDeploymentView$1,`isDeploymentView`);const ql=`DeploymentViewBody`;function isDeploymentViewBody(e){return X.isInstance(e,ql)}const Jl=`DeploymentViewRulePredicate`;function isDeploymentViewRulePredicate(e){return X.isInstance(e,Jl)}const Yl=`DeploymentViewRuleStyle`;function isDeploymentViewRuleStyle(e){return X.isInstance(e,Yl)}const Xl=`DirectedRelationExpr`;function isDirectedRelationExpr(e){return X.isInstance(e,Xl)}const Zl=`DynamicView`;function isDynamicView$1(e){return X.isInstance(e,Zl)}t(isDynamicView$1,`isDynamicView`);const Ql=`DynamicViewBody`;function isDynamicViewBody(e){return X.isInstance(e,Ql)}const $l=`DynamicViewDisplayVariantProperty`;function isDynamicViewDisplayVariantProperty(e){return X.isInstance(e,$l)}const eu=`DynamicViewGlobalPredicateRef`;function isDynamicViewGlobalPredicateRef(e){return X.isInstance(e,eu)}const tu=`DynamicViewIncludePredicate`;function isDynamicViewIncludePredicate(e){return X.isInstance(e,tu)}const nu=`DynamicViewRef`,ru=`Element`;function isElement(e){return X.isInstance(e,ru)}const iu=`ElementBody`;function isElementBody(e){return X.isInstance(e,iu)}const au=`ElementKind`;function isElementKind(e){return X.isInstance(e,au)}const ou=`ElementKindExpression`;function isElementKindExpression(e){return X.isInstance(e,ou)}const su=`ElementRef`;function isElementRef(e){return X.isInstance(e,su)}const cu=`ElementStringProperty`;function isElementStringProperty(e){return X.isInstance(e,cu)}const lu=`ElementStyleProperty`;function isElementStyleProperty(e){return X.isInstance(e,lu)}const uu=`ElementTagExpression`;function isElementTagExpression(e){return X.isInstance(e,uu)}const du=`ElementView`;function isElementView$1(e){return X.isInstance(e,du)}t(isElementView$1,`isElementView`);const fu=`ElementViewBody`;function isElementViewBody(e){return X.isInstance(e,fu)}const pu=`ElementViewRef`,mu=`Expressions`;function isExpressions(e){return X.isInstance(e,mu)}const hu=`ExtendDeployment`;function isExtendDeployment(e){return X.isInstance(e,hu)}const gu=`ExtendDeploymentBody`;function isExtendDeploymentBody(e){return X.isInstance(e,gu)}const _u=`ExtendElement`;function isExtendElement(e){return X.isInstance(e,_u)}const vu=`ExtendElementBody`;function isExtendElementBody(e){return X.isInstance(e,vu)}const yu=`ExtendRelation`;function isExtendRelation(e){return X.isInstance(e,yu)}const bu=`ExtendRelationBody`;function isExtendRelationBody(e){return X.isInstance(e,bu)}const xu=`FinallyBlock`;function isFinallyBlock(e){return X.isInstance(e,xu)}const Su=`FqnExpressions`;function isFqnExpressions(e){return X.isInstance(e,Su)}const Cu=`FqnExprWhere`;function isFqnExprWhere(e){return X.isInstance(e,Cu)}const wu=`FqnExprWith`;function isFqnExprWith(e){return X.isInstance(e,wu)}const Tu=`FqnRef`;function isFqnRef(e){return X.isInstance(e,Tu)}const Eu=`FqnRefExpr`;function isFqnRefExpr(e){return X.isInstance(e,Eu)}const Du=`GlobalDynamicPredicateGroup`;function isGlobalDynamicPredicateGroup(e){return X.isInstance(e,Du)}const Ou=`GlobalPredicateGroup`;function isGlobalPredicateGroup(e){return X.isInstance(e,Ou)}const ku=`Globals`;function isGlobals(e){return X.isInstance(e,ku)}const Au=`GlobalStyle`;function isGlobalStyle(e){return X.isInstance(e,Au)}const ju=`GlobalStyleGroup`;function isGlobalStyleGroup(e){return X.isInstance(e,ju)}const Mu=`GlobalStyleId`,Nu=`HexColor`;function isHexColor(e){return X.isInstance(e,Nu)}const Pu=`IconColorProperty`;function isIconColorProperty(e){return X.isInstance(e,Pu)}const Fu=`IconPositionProperty`;function isIconPositionProperty(e){return X.isInstance(e,Fu)}const Iu=`IconProperty`;function isIconProperty(e){return X.isInstance(e,Iu)}const Lu=`IconSizeProperty`;function isIconSizeProperty(e){return X.isInstance(e,Lu)}const Ru=`Imported`;function isImported(e){return X.isInstance(e,Ru)}const zu=`ImportsFromPoject`;function isImportsFromPoject(e){return X.isInstance(e,zu)}const Bu=`IncomingRelationExpr`;function isIncomingRelationExpr(e){return X.isInstance(e,Bu)}const Vu=`InOutRelationExpr`;function isInOutRelationExpr(e){return X.isInstance(e,Vu)}const Hu=`LibIcon`;function isLibIcon(e){return X.isInstance(e,Hu)}const Uu=`LikeC4Grammar`;function isLikeC4Grammar(e){return X.isInstance(e,Uu)}const Wu=`LikeC4Lib`;function isLikeC4Lib(e){return X.isInstance(e,Wu)}const Gu=`LineProperty`;function isLineProperty(e){return X.isInstance(e,Gu)}const Ku=`LinkProperty`;function isLinkProperty(e){return X.isInstance(e,Ku)}const qu=`MarkdownOrString`;function isMarkdownOrString(e){return X.isInstance(e,qu)}const Ju=`MetadataArray`;function isMetadataArray(e){return X.isInstance(e,Ju)}const Yu=`MetadataAttribute`;function isMetadataAttribute(e){return X.isInstance(e,Yu)}const Xu=`MetadataBody`;function isMetadataBody(e){return X.isInstance(e,Xu)}const Zu=`Model`;function isModel(e){return X.isInstance(e,Zu)}const Qu=`ModelDeployments`;function isModelDeployments(e){return X.isInstance(e,Qu)}const $u=`ModelViews`;function isModelViews(e){return X.isInstance(e,$u)}const ed=`MultipleProperty`;function isMultipleProperty(e){return X.isInstance(e,ed)}const td=`NavigateToProperty`;function isNavigateToProperty(e){return X.isInstance(e,td)}const nd=`NotationProperty`;function isNotationProperty(e){return X.isInstance(e,nd)}const rd=`NotesProperty`;function isNotesProperty(e){return X.isInstance(e,rd)}const id=`OpacityProperty`;function isOpacityProperty(e){return X.isInstance(e,id)}const ad=`OutgoingRelationExpr`;function isOutgoingRelationExpr(e){return X.isInstance(e,ad)}const od=`PaddingSizeProperty`;function isPaddingSizeProperty(e){return X.isInstance(e,od)}const sd=`Relation`;function isRelation(e){return X.isInstance(e,sd)}const cd=`RelationBody`;function isRelationBody(e){return X.isInstance(e,cd)}const ld=`RelationExprWhere`;function isRelationExprWhere(e){return X.isInstance(e,ld)}const ud=`RelationExprWith`;function isRelationExprWith(e){return X.isInstance(e,ud)}const dd=`RelationKindDotRef`;function isRelationKindDotRef(e){return X.isInstance(e,dd)}const fd=`RelationNavigateToProperty`;function isRelationNavigateToProperty(e){return X.isInstance(e,fd)}const pd=`RelationshipKind`;function isRelationshipKind(e){return X.isInstance(e,pd)}const md=`RelationStringProperty`;function isRelationStringProperty(e){return X.isInstance(e,md)}const hd=`RelationStyleProperty`;function isRelationStyleProperty(e){return X.isInstance(e,hd)}const gd=`RGBAColor`;function isRGBAColor(e){return X.isInstance(e,gd)}const _d=`ShapeProperty`;function isShapeProperty(e){return X.isInstance(e,_d)}const vd=`ShapeSizeProperty`;function isShapeSizeProperty(e){return X.isInstance(e,vd)}const yd=`SpecificationColor`;function isSpecificationColor(e){return X.isInstance(e,yd)}const bd=`SpecificationDeploymentNodeKind`;function isSpecificationDeploymentNodeKind(e){return X.isInstance(e,bd)}const xd=`SpecificationElementKind`;function isSpecificationElementKind(e){return X.isInstance(e,xd)}const Sd=`SpecificationElementStringProperty`;function isSpecificationElementStringProperty(e){return X.isInstance(e,Sd)}const Cd=`SpecificationRelationshipKind`;function isSpecificationRelationshipKind(e){return X.isInstance(e,Cd)}const wd=`SpecificationRelationshipStringProperty`;function isSpecificationRelationshipStringProperty(e){return X.isInstance(e,wd)}const Td=`SpecificationRule`;function isSpecificationRule(e){return X.isInstance(e,Td)}const Ed=`SpecificationTag`;function isSpecificationTag(e){return X.isInstance(e,Ed)}const Dd=`StepsBlock`;function isStepsBlock(e){return X.isInstance(e,Dd)}const Od=`StrictFqnElementRef`;function isStrictFqnElementRef(e){return X.isInstance(e,Od)}const kd=`StrictFqnRef`;function isStrictFqnRef(e){return X.isInstance(e,kd)}function isTag(e){return X.isInstance(e,`Tag`)}const Ad=`TagRef`;function isTagRef(e){return X.isInstance(e,Ad)}const jd=`Tags`;function isTags(e){return X.isInstance(e,jd)}const Md=`TextSizeProperty`;function isTextSizeProperty(e){return X.isInstance(e,Md)}const Nd=`ViewOrderProperty`;function isViewOrderProperty(e){return X.isInstance(e,Nd)}const Pd=`ViewRef`,Fd=`ViewRuleAncestors`;function isViewRuleAncestors(e){return X.isInstance(e,Fd)}const Id=`ViewRuleAutoLayout`;function isViewRuleAutoLayout(e){return X.isInstance(e,Id)}const Ld=`ViewRuleGlobalPredicateRef`;function isViewRuleGlobalPredicateRef(e){return X.isInstance(e,Ld)}const Rd=`ViewRuleGlobalStyle`;function isViewRuleGlobalStyle(e){return X.isInstance(e,Rd)}const zd=`ViewRuleGroup`;function isViewRuleGroup(e){return X.isInstance(e,zd)}const Bd=`ViewRulePredicate`;function isViewRulePredicate(e){return X.isInstance(e,Bd)}const Vd=`ViewRuleRank`;function isViewRuleRank(e){return X.isInstance(e,Vd)}const Hd=`ViewRuleStyle`;function isViewRuleStyle(e){return X.isInstance(e,Hd)}const Ud=`ViewStringProperty`;function isViewStringProperty(e){return X.isInstance(e,Ud)}const Wd=`WhereBinaryExpression`;function isWhereBinaryExpression(e){return X.isInstance(e,Wd)}const Gd=`WhereElementKind`;function isWhereElementKind(e){return X.isInstance(e,Gd)}const Kd=`WhereElementMetadata`;function isWhereElementMetadata(e){return X.isInstance(e,Kd)}const qd=`WhereElementNegation`;function isWhereElementNegation(e){return X.isInstance(e,qd)}const Jd=`WhereElementTag`;function isWhereElementTag(e){return X.isInstance(e,Jd)}const Yd=`WhereRelationKind`;function isWhereRelationKind(e){return X.isInstance(e,Yd)}const Xd=`WhereRelationMetadata`;function isWhereRelationMetadata(e){return X.isInstance(e,Xd)}const Zd=`WhereRelationNegation`;function isWhereRelationNegation(e){return X.isInstance(e,Zd)}const Qd=`WhereRelationParticipantKind`;function isWhereRelationParticipantKind(e){return X.isInstance(e,Qd)}const $d=`WhereRelationParticipantMetadata`;function isWhereRelationParticipantMetadata(e){return X.isInstance(e,$d)}const ef=`WhereRelationParticipantTag`;function isWhereRelationParticipantTag(e){return X.isInstance(e,ef)}const tf=`WhereRelationTag`;function isWhereRelationTag(e){return X.isInstance(e,tf)}const nf=`WildcardExpression`;function isWildcardExpression(e){return X.isInstance(e,nf)}const rf=`Step`;function isStep(e){return X.isInstance(e,rf)}const af=`StepSeries`;function isStepSeries(e){return X.isInstance(e,af)}const of=`SubflowStep`;function isSubflowStep(e){return X.isInstance(e,of)}const sf=`TryBlock`;function isTryBlock(e){return X.isInstance(e,sf)}var LikeC4AstReflection=class extends ct{getAllTypes(){return[Al,jl,Uc,Ml,Nl,Pl,Wc,Fl,Il,Ll,Rl,zl,Bl,Gc,Vl,Hl,Ul,Kc,Wl,Gl,Kl,ql,qc,Jl,Yl,Xl,Zl,Ql,$l,eu,tu,Jc,nu,Yc,ru,iu,au,ou,Xc,su,cu,lu,uu,du,fu,pu,Zc,mu,hu,gu,_u,vu,Qc,`ExtendElementProperty`,yu,bu,`ExtendRelationProperty`,xu,$c,el,tl,Cu,wu,Su,Tu,Eu,nl,Du,Ou,Au,ju,Mu,ku,Nu,Pu,Fu,Iu,Lu,Ru,zu,Vu,Bu,Hu,Uu,Wu,rl,Gu,Ku,qu,Ju,Yu,Xu,il,al,Zu,Qu,ol,`ModelReferenceable`,$u,ed,td,nd,rd,id,ad,od,gd,sl,sd,cd,cl,ll,ul,ld,ud,dd,fd,dl,md,hd,pd,fl,_d,vd,pl,yd,bd,xd,Sd,Cd,wd,Td,Ed,rf,ml,af,hl,Dd,Od,kd,gl,_l,of,`Tag`,Ad,jd,Md,sf,vl,Nd,yl,Pd,bl,Fd,Id,Ld,Rd,zd,Bd,Vd,Hd,xl,Ud,Wd,Sl,Cl,Gd,Kd,qd,Jd,wl,Tl,El,Dl,Ol,Yd,Xd,Zd,Qd,$d,ef,tf,kl,nf]}computeIsSubtype(e,t){switch(e){case jl:case ml:case vl:return this.isSubtype(hl,t);case Ml:case Gu:return this.isSubtype(fl,t);case Nl:case Pu:case Fu:case ed:case id:case _d:return this.isSubtype(_l,t);case Pl:case xu:return this.isSubtype(vl,t);case Fl:return this.isSubtype(`RelationshipStyleProperty`,t)||this.isSubtype(`StyleProperty`,t);case zl:case Vl:return this.isSubtype(`DeploymentElement`,t)||this.isSubtype(`Referenceable`,t);case Ul:case au:return this.isSubtype(Kc,t);case Kl:case Zl:case du:return this.isSubtype(rl,t);case Jl:case Yl:case Fd:return this.isSubtype(qc,t);case Xl:case Bu:case Vu:case ad:return this.isSubtype(cl,t);case $l:return this.isSubtype(Jc,t);case eu:case tu:return this.isSubtype(Yc,t);case Jc:case Xc:case td:case dl:case fl:case gl:case _l:return this.isSubtype(Uc,t);case ru:return this.isSubtype(`FqnReferenceable`,t)||this.isSubtype(`ModelElement`,t)||this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case ou:case uu:case Eu:case nf:return this.isSubtype($c,t);case cu:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StringProperty`,t);case lu:return this.isSubtype(Xc,t);case hu:case sl:return this.isSubtype(nl,t);case _u:return this.isSubtype(`ExtendElementOrRelation`,t)||this.isSubtype(`FqnReferenceable`,t);case Qc:case sd:return this.isSubtype(ol,t);case yu:return this.isSubtype(Qc,t);case $c:case Cu:return this.isSubtype(el,t);case el:case wu:return this.isSubtype(tl,t);case tl:case ul:return this.isSubtype(Zc,t);case Nu:case gd:return this.isSubtype(Wc,t);case Iu:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StyleProperty`,t);case Lu:case od:case vd:case Md:return this.isSubtype(`SizeProperty`,t)||this.isSubtype(`StyleProperty`,t);case Ru:return this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case Ku:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t)||this.isSubtype(`ViewProperty`,t);case qu:case Ju:return this.isSubtype(al,t);case Yu:case nd:case rd:case Sd:case wd:return this.isSubtype(gl,t);case Xu:return this.isSubtype(il,t);case il:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t);case cl:case ld:return this.isSubtype(ll,t);case ll:case ud:return this.isSubtype(ul,t);case fd:case hd:return this.isSubtype(dl,t);case md:return this.isSubtype(`RelationProperty`,t)||this.isSubtype(`StringProperty`,t);case rf:case af:return this.isSubtype(`AbstractStep`,t)||this.isSubtype(`StepOrSeries`,t);case of:return this.isSubtype(`StepStatement`,t)||this.isSubtype(`StepsBlock`,t);case sf:return this.isSubtype(`StepsBlock`,t)||this.isSubtype(`TryStep`,t);case Nd:return this.isSubtype(yl,t);case yl:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`DynamicViewProperty`,t);case Id:return this.isSubtype(`DeploymentViewRule`,t)||this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case Ld:case zd:case Bd:case Vd:return this.isSubtype(bl,t);case Rd:case Hd:return this.isSubtype(xl,t);case xl:return this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case Ud:return this.isSubtype(`StringProperty`,t)||this.isSubtype(`ViewProperty`,t);case Wd:return this.isSubtype(`WhereElementExpression`,t)||this.isSubtype(`WhereRelationExpression`,t);case Sl:case qd:return this.isSubtype(Cl,t);case Cl:case Ol:return this.isSubtype(wl,t);case Gd:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereKindEqual`,t);case Kd:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereMetadataEqual`,t);case Jd:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereTagEqual`,t);case Dl:case Zd:return this.isSubtype(Ol,t);case Yd:case Qd:return this.isSubtype(`WhereKindEqual`,t)||this.isSubtype(`WhereRelation`,t);case Xd:case $d:return this.isSubtype(`WhereMetadataEqual`,t)||this.isSubtype(`WhereRelation`,t);case ef:case tf:return this.isSubtype(`WhereRelation`,t)||this.isSubtype(`WhereTagEqual`,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractStep:kind`:case`DeploymentRelation:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`Step:kind`:case`StepSeries:kind`:case`WhereRelationKind:value`:return pd;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:case`SpecificationTag:customColor`:return Il;case`DeploymentNode:kind`:return Ul;case`DynamicViewGlobalPredicateRef:predicate`:return Du;case`DynamicViewRef:view`:return Zl;case`Element:kind`:case`ElementKindExpression:kind`:return au;case`ElementViewRef:view`:return du;case`FqnRef:value`:case`StrictFqnRef:value`:return sl;case`IconProperty:libicon`:return Hu;case`Imported:imported`:case`StrictFqnElementRef:el`:return ru;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return rl;case`ViewRuleGlobalPredicateRef:predicate`:return Ou;case`ViewRuleGlobalStyle:style`:return Mu;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Kc;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Al:return{name:Al,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case jl:return{name:jl,properties:[{name:`branches`,defaultValue:[]},{name:`title`}]};case Ml:return{name:Ml,properties:[{name:`key`},{name:`value`}]};case Nl:return{name:Nl,properties:[{name:`key`},{name:`value`}]};case Pl:return{name:Pl,properties:[{name:`catch`},{name:`title`},{name:`try`}]};case Fl:return{name:Fl,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Il:return{name:Il,properties:[{name:`name`}]};case Ll:return{name:Ll,properties:[{name:`props`,defaultValue:[]}]};case Rl:return{name:Rl,properties:[{name:`props`,defaultValue:[]}]};case zl:return{name:zl,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Bl:return{name:Bl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Vl:return{name:Vl,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Hl:return{name:Hl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Ul:return{name:Ul,properties:[{name:`name`}]};case Wl:return{name:Wl,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Gl:return{name:Gl,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Kl:return{name:Kl,properties:[{name:`body`},{name:`name`}]};case ql:return{name:ql,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Jl:return{name:Jl,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case Yl:return{name:Yl,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Xl:return{name:Xl,properties:[{name:`source`},{name:`target`}]};case Zl:return{name:Zl,properties:[{name:`body`},{name:`name`}]};case Ql:return{name:Ql,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case $l:return{name:$l,properties:[{name:`key`},{name:`value`}]};case eu:return{name:eu,properties:[{name:`predicate`}]};case tu:return{name:tu,properties:[{name:`exprs`}]};case nu:return{name:nu,properties:[{name:`view`}]};case ru:return{name:ru,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case iu:return{name:iu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case au:return{name:au,properties:[{name:`name`}]};case ou:return{name:ou,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case su:return{name:su,properties:[{name:`modelElement`}]};case cu:return{name:cu,properties:[{name:`key`},{name:`value`}]};case lu:return{name:lu,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case uu:return{name:uu,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case du:return{name:du,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case fu:return{name:fu,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case pu:return{name:pu,properties:[{name:`view`}]};case mu:return{name:mu,properties:[{name:`prev`},{name:`value`}]};case hu:return{name:hu,properties:[{name:`body`},{name:`deploymentNode`}]};case gu:return{name:gu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case _u:return{name:_u,properties:[{name:`body`},{name:`element`}]};case vu:return{name:vu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case yu:return{name:yu,properties:[{name:`body`},{name:`dotKind`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case bu:return{name:bu,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case xu:return{name:xu,properties:[{name:`finally`},{name:`title`},{name:`tryCatch`}]};case Su:return{name:Su,properties:[{name:`prev`},{name:`value`}]};case Cu:return{name:Cu,properties:[{name:`subject`},{name:`where`}]};case wu:return{name:wu,properties:[{name:`custom`},{name:`subject`}]};case Tu:return{name:Tu,properties:[{name:`parent`},{name:`value`}]};case Eu:return{name:Eu,properties:[{name:`ref`},{name:`selector`}]};case Du:return{name:Du,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Ou:return{name:Ou,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case ku:return{name:ku,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Au:return{name:Au,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case ju:return{name:ju,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Mu:return{name:Mu,properties:[{name:`name`}]};case Nu:return{name:Nu,properties:[{name:`hex`}]};case Pu:return{name:Pu,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Fu:return{name:Fu,properties:[{name:`key`},{name:`value`}]};case Iu:return{name:Iu,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Lu:return{name:Lu,properties:[{name:`key`},{name:`value`}]};case Ru:return{name:Ru,properties:[{name:`imported`},{name:`prev`}]};case zu:return{name:zu,properties:[{name:`imports`},{name:`project`}]};case Bu:return{name:Bu,properties:[{name:`to`}]};case Vu:return{name:Vu,properties:[{name:`inout`}]};case Hu:return{name:Hu,properties:[{name:`name`}]};case Uu:return{name:Uu,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Wu:return{name:Wu,properties:[{name:`icons`,defaultValue:[]}]};case Gu:return{name:Gu,properties:[{name:`key`},{name:`value`}]};case Ku:return{name:Ku,properties:[{name:`key`},{name:`title`},{name:`value`}]};case qu:return{name:qu,properties:[{name:`markdown`},{name:`text`}]};case Ju:return{name:Ju,properties:[{name:`values`,defaultValue:[]}]};case Yu:return{name:Yu,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case Xu:return{name:Xu,properties:[{name:`props`,defaultValue:[]}]};case Zu:return{name:Zu,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Qu:return{name:Qu,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case $u:return{name:$u,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case ed:return{name:ed,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case td:return{name:td,properties:[{name:`key`},{name:`value`}]};case nd:return{name:nd,properties:[{name:`key`},{name:`value`}]};case rd:return{name:rd,properties:[{name:`key`},{name:`value`}]};case id:return{name:id,properties:[{name:`key`},{name:`value`}]};case ad:return{name:ad,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case od:return{name:od,properties:[{name:`key`},{name:`value`}]};case sd:return{name:sd,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case cd:return{name:cd,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ld:return{name:ld,properties:[{name:`subject`},{name:`where`}]};case ud:return{name:ud,properties:[{name:`custom`},{name:`subject`}]};case dd:return{name:dd,properties:[{name:`kind`}]};case fd:return{name:fd,properties:[{name:`key`},{name:`value`}]};case pd:return{name:pd,properties:[{name:`name`}]};case md:return{name:md,properties:[{name:`key`},{name:`value`}]};case hd:return{name:hd,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case gd:return{name:gd,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case _d:return{name:_d,properties:[{name:`key`},{name:`value`}]};case vd:return{name:vd,properties:[{name:`key`},{name:`value`}]};case yd:return{name:yd,properties:[{name:`color`},{name:`name`}]};case bd:return{name:bd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case xd:return{name:xd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case Sd:return{name:Sd,properties:[{name:`key`},{name:`value`}]};case Cd:return{name:Cd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case wd:return{name:wd,properties:[{name:`key`},{name:`value`}]};case Td:return{name:Td,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case Ed:return{name:Ed,properties:[{name:`color`},{name:`customColor`},{name:`tag`},{name:`themeColor`}]};case Dd:return{name:Dd,properties:[{name:`steps`,defaultValue:[]}]};case Od:return{name:Od,properties:[{name:`el`},{name:`parent`}]};case kd:return{name:kd,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Ad:return{name:Ad,properties:[{name:`tag`}]};case jd:return{name:jd,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Md:return{name:Md,properties:[{name:`key`},{name:`value`}]};case Nd:return{name:Nd,properties:[{name:`key`},{name:`value`}]};case Pd:return{name:Pd,properties:[{name:`view`}]};case Fd:return{name:Fd,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Id:return{name:Id,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case Ld:return{name:Ld,properties:[{name:`predicate`}]};case Rd:return{name:Rd,properties:[{name:`style`}]};case zd:return{name:zd,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Bd:return{name:Bd,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case Vd:return{name:Vd,properties:[{name:`targets`},{name:`value`}]};case Hd:return{name:Hd,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Ud:return{name:Ud,properties:[{name:`key`},{name:`value`}]};case Wd:return{name:Wd,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case Gd:return{name:Gd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Kd:return{name:Kd,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case qd:return{name:qd,properties:[{name:`value`}]};case Jd:return{name:Jd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Yd:return{name:Yd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Xd:return{name:Xd,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Zd:return{name:Zd,properties:[{name:`value`}]};case Qd:return{name:Qd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case $d:return{name:$d,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case ef:return{name:ef,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case tf:return{name:tf,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case nf:return{name:nf,properties:[{name:`isWildcard`,defaultValue:!1}]};case rf:return{name:rf,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case af:return{name:af,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case of:return{name:of,properties:[{name:`kind`},{name:`steps`,defaultValue:[]},{name:`title`}]};case sf:return{name:sf,properties:[{name:`steps`,defaultValue:[]},{name:`title`}]};default:return{name:e,properties:[]}}}};const X=new LikeC4AstReflection;let cf;const LikeC4Grammar=()=>cf??=ot(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelElement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementOrRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendRelation"}},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendElement"}},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]}}]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@1"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","returnType":{"$ref":"#/interfaces@3"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@3"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RelationConnector","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"]<->"}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}},{"$type":"Assignment","feature":"boolValue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@48"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewOrderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"order"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@135"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@136"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@137"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@192"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@5"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataFilterValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepStatement","returnType":{"$ref":"#/types@10"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"StepsBlockFragment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SubflowKind","returnType":{"$ref":"#/types@11"},"definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SubflowStep","returnType":{"$ref":"#/interfaces@5"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepsBlock","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Represents a block of step statements, i.e. { ... }\\n */"},{"$type":"ParserRule","name":"TryStep","returnType":{"$ref":"#/types@12"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FinallyBlock","returnType":{"$ref":"#/interfaces@8"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@8"},"feature":"tryCatch","operator":"="},{"$type":"Keyword","value":"finally"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"finally","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CatchBlock","returnType":{"$ref":"#/interfaces@7"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@7"},"feature":"try","operator":"="},{"$type":"Keyword","value":"catch"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"catch","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TryBlock","returnType":{"$ref":"#/interfaces@6"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"try"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"AltSteps","returnType":{"$ref":"#/interfaces@9"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"branches","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"StepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepSeries","returnType":{"$ref":"#/interfaces@12"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@12"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Step","returnType":{"$ref":"#/interfaces@11"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@126/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@126/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAncestors","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"includeAncestors"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"ColorRef","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@198"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@195"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewFlowKeyword","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"},{"$type":"Keyword","value":"try"},{"$type":"Keyword","value":"catch"},{"$type":"Keyword","value":"finally"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@201"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@198"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@193"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@204"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"},{"$type":"Keyword","value":"relationship"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HashId","dataType":"string","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@193"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@196"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@196"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/([a-zA-Z]|_+[a-zA-Z0-9])[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"ElementRef","attributes":[{"$type":"TypeAttribute","name":"modelElement","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnElementRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}}},{"$type":"TypeAttribute","name":"el","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@3"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StepsBlock","attributes":[{"$type":"TypeAttribute","name":"steps","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@10"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"SubflowStep","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"kind","type":{"$type":"SimpleType","typeRef":{"$ref":"#/types@11"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"TryBlock","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"CatchBlock","attributes":[{"$type":"TypeAttribute","name":"try","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"catch","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FinallyBlock","attributes":[{"$type":"TypeAttribute","name":"tryCatch","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}}]},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"finally","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AltSteps","attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"branches","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AbstractStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@163"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}}}],"superTypes":[]},{"$type":"Interface","name":"Step","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}],"$comment":"/**\\n * A single step in a dynamic view flow\\n * source -> target\\n */"},{"$type":"Interface","name":"StepSeries","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]},"isOptional":false}],"$comment":"/**\\n * A series of steps in a dynamic view flow\\n * source -> target1 -> target2 -> ...\\n */"}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@120"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@48"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@128"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@57"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@38"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@42"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@73"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@74"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@54"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@161"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@157"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@5/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@4/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@1/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereMetadataEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@3/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@0/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@93"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@100"}}]}},{"$type":"Type","name":"StepStatement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@13"}},{"$type":"SimpleType","typeRef":{"$ref":"#/types@12"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@9"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}]}},{"$type":"Type","name":"SubflowKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","stringType":"opt"},{"$type":"SimpleType","stringType":"par"},{"$type":"SimpleType","stringType":"parallel"},{"$type":"SimpleType","stringType":"loop"},{"$type":"SimpleType","stringType":"when"},{"$type":"SimpleType","stringType":"if"},{"$type":"SimpleType","stringType":"else"},{"$type":"SimpleType","stringType":"break"}]}},{"$type":"Type","name":"TryStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@8"}}]}},{"$type":"Type","name":"StepOrSeries","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@120"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@25/definition/elements@1/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@124"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@154"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@155"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@156"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@147"}}]}}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),lf={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},uf={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},df={AstReflection:()=>new LikeC4AstReflection},ff={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>lf,parser:{ParserConfig:()=>uf}},pf=Symbol.for(`idattr`),mf={writeId(e,t){return e[pf]=t,e},readId(e){return e[pf]}},hf={writeId(e,t){return L(t)?e[pf]=void 0:e[pf]=t,e},readId(e){return e[pf]}};function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===lf.languageId}function isLikeC4UserDocument(e){return isLikeC4LangiumDocument(e)&&isNotLikeC4Builtin(e)}function parseMarkdownAsString(e){return e?.markdown||e?.text}function parseAstPercent(e){let t=parseFloat(e);return isNaN(t)?100:An(t,{min:0,max:100})}function parseAstOpacityProperty({value:e}){return parseAstPercent(e)}function parseAstSizeValue({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:yi(e)}}function parseAstIconPositionValue({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:yi(e)}}function toRelationshipStyle(e,t){let r={};if(!e||e.length===0)return r;for(let o of e)if(t(o))switch(!0){case isColorProperty(o):{let e=toColor(o);z(e)&&(r.color=e);break}case isLineProperty(o):r.line=o.value;break;case isArrowProperty(o):switch(o.key){case`head`:r.head=o.value;break;case`tail`:r.tail=o.value;break;default:yi(o)}break;default:yi(o)}return r}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(e){let t=e.rankSep,r=e.nodeSep,o;switch(e.direction){case`TopBottom`:o=`TB`;break;case`BottomTop`:o=`BT`;break;case`LeftRight`:o=`LR`;break;case`RightLeft`:o=`RL`;break;default:yi(e.direction)}return{direction:o,...r&&{nodeSep:r},...t&&{rankSep:t}}}function toAstViewLayoutDirection(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:yi(e)}}function getViewRulePredicateContainer(e){return Be(e,e=>isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)||isDynamicViewIncludePredicate(e))}const _isModel=e=>isModel(e)||isElementBody(e)||isExtendElementBody(e)||isElementViewBody(e)||isDynamicViewBody(e)||isElementRef(e),gf=t(e=>isModelDeployments(e)||isDeploymentViewBody(e)||isDeploymentNodeBody(e)||isExtendDeploymentBody(e)||isDeployedInstanceBody(e),`_isDeployment`);function isFqnRefInsideGlobals(e){for(;;){if(gf(e)||_isModel(e))return!1;if(isGlobals(e)||isModelViews(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideModel(e){for(;;){if(gf(e))return!1;if(_isModel(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideDeployment(e){for(;;){if(_isModel(e))return!1;if(gf(e))return!0;if(e.$container)e=e.$container;else return!1}}function elementRef(e){try{let t=isStrictFqnElementRef(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function readStrictFqn(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],r=e.parent;for(;r;)t.push(r.$type===`StrictFqnRef`?r.value.$refText:r.el.$refText),r=r.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function referenceableParent(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function instanceRef(e){let t;for(;t=e.value?.ref;){if(isDeploymentNode$1(t))return null;if(isDeployedInstance(t))return t;if(L(e.parent))return null;e=e.parent}return null}function importsRef(e){let t=referenceableParent(e);return t?.$type===`Imported`?t:null}function isReferenceToDeploymentModel(e){let t;for(;t=e.value?.ref;){if(isDeploymentElement(t))return!0;if(L(e.parent))return!1;e=e.parent}return!1}var IndexManager=class extends me{services;constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}projectElements(e,t,r){let o=this.services.workspace.ProjectsManager;return it(this.symbolIndex.keys()).filter(t=>r&&!r.has(t)?!1:o.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}},LangiumDocuments=class extends lt{services;constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e));let r=[...this.documentMap.values()],o=r.at(-1);if(!o||compareByUri(o,e)<=0){this.documentMap.set(t,e);return}r.push(e),r.sort(compareByUri),this.documentMap.clear();for(let e of r)this.documentMap.set(e.uri.toString(),e)}getDocument(e){let t=super.getDocument(e);return isLikeC4UserDocument(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return it(this.documentMap.values()).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return it(this.documentMap.values()).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return it(this.documentMap.values()).filter(r=>isLikeC4UserDocument(r)&&t.isIncluded(e,r)?(r.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return R(this.userDocuments.toArray(),F(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),Jt(Nn(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,isLikeC4UserDocument(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},_f=e(Jn(),1);const Z=Y.getChild(`projects`);function isLangiumDocument(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function normalizeUri(e){return isLangiumDocument(e)?e.uri.toString():typeof e==`string`?_t(e,{acceptRelative:!1,strict:!0})?e:C.file(e).toString():e.toString()}const vf=/^\/?([A-Za-z]):(?=\/|$)/;function normalizeWindowsDrivePath(e){return e.replace(vf,(e,t)=>`/${t.toLowerCase()}:`)}function uriPathForMatcher(e){return C.isUri(e)?normalizeWindowsDrivePath(e.path):normalizeWindowsDrivePath(C.parse(e).path)}const yf=ui(`/`,!0),compareUri=(e,t)=>yf(ft(e.path),ft(t.path));function isParentFolderFor(e){return t=>e.startsWith(hi(t)?t:t.folder)}function _overlaps(e,t){let r=hi(e)?e:e.folder,o=hi(t)?t:t.folder;return r===o||r.startsWith(o)||o.startsWith(r)}function sameFolder(e,t){return(hi(e)?e:e.folder)===(hi(t)?t:t.folder)}function hasAmbiguousIncludePathOverlap(e,t){return _overlaps(e,t)&&!sameFolder(e,t)}function overlaps(...e){return Dn(_overlaps,e)}function _includes(e,t){return t.startsWith(e.folder)||e.includePaths?.some(isParentFolderFor(t))?!_excludes(e,t):!1}function _isInScope(e,t){return t.startsWith(e.folder)||(e.includePaths?.some(isParentFolderFor(t))??!1)}function _excludes(e,t){return e.exclude?.(uriPathForMatcher(t))??!1}function includes(...e){return Dn(_includes,e)}function isInScope(...e){return Dn(_isInScope,e)}function excludes(...e){return Dn(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),mt(e)}const compareProjectByFolder=(e,t)=>compareUri(e.folderUri,t.folderUri);function ensureProjectsOrder(e){return e.length<=1?e:En(e,compareProjectByFolder)}const bf={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,_f.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return bf.exclude(uriPathForMatcher(e))}function parseRegisterOptions(e){if(`configUri`in e){G(!en(e.configUri),`configUri is emptyish`);let t=C.isUri(e.configUri)?e.configUri:C.parse(normalizeUri(e.configUri)),r=ProjectFolder(T.dirname(t));return{configUri:t,folder:r,folderUri:C.parse(r)}}G(!en(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),r=C.parse(t);return{configUri:T.joinPath(r,`likec4.config.json`),folder:t,folderUri:r}}var xf=class ProjectsManager extends ADisposable{services;static DefaultProjectId=bf.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new ii(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),r=T.joinPath(t,`likec4.config.json`),o=ProjectFolder(t);return{id:e,config:bf.config,folder:o,folderUri:C.parse(o),configUri:r,exclude:bf.exclude,includeConfig:{...bf.includeConfig}}}return vi(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new ii(e=>{if(this.isExcludedByWorkspace(e))return!0;let t=this.findOwnerProject(e);return t?excludes(t,e)?!this.#r.some(includes(e)):!1:this.#r.some(isInScope(e))?!this.#r.some(includes(e)):isExcludedByDefault(e)});#o=new ii(e=>this.findOwnerProject(e)??null);constructor(e){super(),this.services=e,this.onDispose(S.create(()=>{this.#e.length=0})),Z.trace`created`}isExcludedByWorkspace(e){return this.#n?(C.isUri(e)&&(e=normalizeUri(e)),this.#n(uriPathForMatcher(e))):!1}setWorkspaceExcludePatterns(e){try{if(!Array.isArray(e)){this.#n=void 0;return}let t=R(e,P(z),F(e=>(e=normalizeWindowsDrivePath(e),!zt(e)&&!e.startsWith(`**`)&&(e=gt(`**`,e)),e)));if(!M(t,1)){this.#n=void 0;return}Z.debug`set workspace exclude patterns: ${t}`,this.#n=(0,_f.default)(t,{dot:!0}),this.clearCaches()}catch(e){Z.warn(`Failed to set workspace exclude patterns`,{error:e}),this.#n=void 0}}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return M(this.#r,1)?this.#r[0].id:ProjectsManager.DefaultProjectId}set defaultProjectId(e){if(e!==this.#t){if(this.#t=void 0,!e||e===ProjectsManager.DefaultProjectId){Z.debug`reset default project ID`;return}G(this.#r.find(t=>t.id===e),`Project "${e}" not found`),Z.debug`set default project ID to ${e}`,this.#t=e}}get default(){return this.#i.get(this.defaultProjectId??ProjectsManager.DefaultProjectId)}get all(){if(M(this.#r,1)){let e=[...F(this.#r,Nn(`id`)),bf.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);t>0&&(e.splice(t,1),e.unshift(this.#t))}return e}return[bf.id]}getProject(e){let t=typeof e==`string`?e:this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){if(this.#r.length===0)return[];let t=overlaps(ProjectFolder(e)),isInsideOrIncludes=e=>t(e)||!!e.includePaths&&!!ln(e.includePaths,t);return this.#r.filter(isInsideOrIncludes)}ensureProjectId(e){return e===ProjectsManager.DefaultProjectId?this.defaultProjectId??ProjectsManager.DefaultProjectId:e?(G(this.#r.some(t=>e===t.id),`Project ID ${e} is not registered`),e):vi(this.defaultProjectId,()=>`Specify exact project, known: [${F(this.#r,Nn(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return isLangiumDocument(t)&&isLikeC4Builtin(t)?!0:e.length===1?this.#a.get(normalizeUri(t)):excludes(this.#i.get(e[0]),normalizeUri(t))}isIncluded(e,t){let r=normalizeUri(t);return this.isExcludedByWorkspace(r)?!1:M(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(r)&&!this.#a.get(r):includes(this.#i.get(e),r):!isExcludedByDefault(r)}async registerConfigFile(e,t){if(this.isExcludedByWorkspace(e))throw Error(`Skipping project config, path ${e.fsPath} is excluded by editor settings`);if(isExcludedByDefault(normalizeUri(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by default: ${bf.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let r=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:r,configUri:e},t)}catch(t){if(!re(t))throw wrapError(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let r=Mt.validate(e.config),{configUri:o,folder:s,folderUri:c}=parseRegisterOptions(e),u=Mt.normalizeInclude(r.include),d=this.#r.find(e=>e.folder===s);return d?(d.config.name!==r.name&&(Z.info`project name changed from ${d.config.name} to ${r.name}`,Z.info`remove ${d.id}`,d.id=this.uniqueProjectId(r.name),Z.info`add ${d.id}`),this.warnIfConfigOverride(d,o),d.config=r,d.folder=s,d.folderUri=c,d.configUri=o,d.includeConfig=u):(d={id:this.uniqueProjectId(r.name),config:r,folder:s,configUri:o,folderUri:c,includeConfig:u},this.#r=ensureProjectsOrder([...this.#r,d]),Z.info`add ${d.id}`),safeCall(()=>this.updateIncludesExcludes(d)),this.isInitiatingOrReloading?d:(this.clearCaches(),this.notifyListeners(),await this.rebuildProject(d.id,t).catch(e=>re(e)?Promise.reject(e):(Z.warn(`Failed to rebuild project {projectId} after config change`,{projectId:d.id,error:e}),Promise.resolve())),d)}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}findOwnerProject(e){if(this.#r.length===0)return;let t=isParentFolderFor(e);return this.#r.find(t)??this.#r.find(includes(e))??void 0}relativePath(e){let t=normalizeUri(e),r=this.#o.get(t);return r?T.relative(r.folderUri,C.parse(t)):t}get isInitiatingOrReloading(){return!!this.#s||!this.services.workspace.WorkspaceManager.isReady}#s=null;async reloadProjects(e){return this.#s?(Z.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(Z.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(re(e)||Z.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Z.warn(`Failed to reloadProjects, no workspace folders found`);return}Z.debug`start reload projects`;let r=[];for(let e of t){let t=C.parse(e.uri);Z.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let o of e)Z.debug`found config ${T.relative(t,o.uri)}`,r.push(o.uri)}catch(e){Z.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(r.length===0){if(this.#r.length===0){Z.warning(`No config files found`);return}Z.warning(`no config files found, but {count} projects were registered before`,{count:this.#r.length}),Z.warning(`reset`)}r.sort(compareUri);let o=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of r)try{await this.registerConfigFile(e)}catch(t){Z.warn(loggable(t));let r=o.get(e.toString());r&&(Z.debug`Update failed, restore project ${r.id}`,await this.registerProject(r).catch(e=>{Z.warn(`fail to restore project ${r.id}, ignoring`,{error:e})}))}this.clearCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(F(this.#r,Nn(`id`))),r=e;if(!t.has(r))return r;Z.warn`Project "${e}" already exists, generating unique ID`;let o=1;for(;t.has(r);)r=`${e}-${o++}`;return r}clearCaches(){Z.trace(`clearCaches`),this.#t&&!this.#r.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(e,t){let r=this.#r.find(t=>t.id===e);if(!r)return e===ProjectsManager.DefaultProjectId?Z.info`Rebuilding all documents `:Z.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let o=Z.getChild(r.id),_includes=e=>includes(r,normalizeUri(e)),s=this.services.workspace.LangiumDocuments.userDocuments.filter(_includes).map(e=>e.uri).toArray();if(s.length===0){o.trace`no documents found for project ${r.id}, skipping rebuild`;return}o.info`rebuild project documents: ${s.length}`,this.clearCaches(),await this.services.workspace.DocumentBuilder.update(s,[],t).catch(e=>{o.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let r of t.includePaths)e.push({projectId:t.id,includePath:r.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),S.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return Z.warn(`Failed to get workspace URI, using default folder`,{error:e}),C.file(`/`)}}notifyListeners(){for(let e of[...this.#e])try{e()}catch(e){Z.warn(loggable(e))}}updateIncludesExcludes(e){let t=e.config;delete e.includePaths,delete e.exclude;let r=e.includeConfig.paths;M(r,1)&&(e.includePaths=F(r,t=>{let r=T.resolvePath(e.folderUri,t);return{uri:r,folder:ProjectFolder(r)}}),Z.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`);let o=t.exclude;if(L(o))e.exclude=bf.exclude;else if(M(o,1)){let t=[e.folderUri,...F(e.includePaths??[],Nn(`uri`))].flatMap(e=>F(o,t=>(!pt(t)&&!t.startsWith(`**`)&&(t=gt(`**`,t)),vt(ut(uriPathForMatcher(e),t)))));e.exclude=(0,_f.default)(t,{contains:!0,dot:!0})}if(!e.includePaths)return e;for(let t of e.includePaths)for(let r of this.#r)r.id!==e.id&&(overlaps(t,r)&&Z.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:r.id}),r.includePaths?.forEach(o=>{hasAmbiguousIncludePathOverlap(t,o)&&Z.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:r.id,otherIncludePath:o.folder})}));return e}warnIfConfigOverride(e,t){try{let[r,o]=F([e.configUri,t],T.basename);r!==o&&Z.warn`config ${o} overrides ${r} in folder ${e.folder}`}catch{}}},Sf=class TimeoutError extends Error{name=`TimeoutError`;constructor(e,t){super(e,t),Error.captureStackTrace?.(this,TimeoutError)}};const getAbortedReason=e=>e.reason??new DOMException(`This operation was aborted.`,`AbortError`);function pTimeout(e,t){let{milliseconds:r,fallback:o,message:s,customTimers:c={setTimeout,clearTimeout},signal:u}=t,d,abortHandler,p=new Promise((t,p)=>{if(typeof r!=`number`||Math.sign(r)!==1)throw TypeError(`Expected \`milliseconds\` to be a positive number, got \`${r}\``);if(u?.aborted){p(getAbortedReason(u));return}if(u&&(abortHandler=()=>{p(getAbortedReason(u))},u.addEventListener(`abort`,abortHandler,{once:!0})),e.then(t,p),r===1/0)return;let m=new Sf;d=c.setTimeout.call(void 0,()=>{if(o){try{t(o())}catch(e){p(e)}return}typeof e.cancel==`function`&&e.cancel(),s===!1?t():s instanceof Error?p(s):(m.message=s??`Promise timed out after ${r} milliseconds`,p(m))},r)}).finally(()=>{p.clear(),abortHandler&&u&&u.removeEventListener(`abort`,abortHandler)});return p.clear=()=>{c.clearTimeout.call(void 0,d),d=void 0},p}var LikeC4WorkspaceManager=class extends at{services;fileSystemProvider;#e=Y.getChild(`workspace`);#t=!1;#n=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.fileSystemProvider=e.workspace.FileSystemProvider}get documentFactory(){return this.services.workspace.LangiumDocumentFactory}get isReady(){return this.#t}async performStartup(e){this.#t&&this.#e.warn`workspace already initialized, invalid performStartup call`;try{this.#t=!1,await this.readExcludeConfig(),this.folders??=e;let t=e.map(e=>C.parse(e.uri)),r=[],o=[];for(let e of t){this.#e.debug`scanning folder ${e.fsPath} for likec4`;try{let t=await this.fileSystemProvider.scanProjectFiles(e);r.push(...t)}catch(t){this.#e.warn(`Failed to scan workspace folder {folder} for project config files`,{folder:e.fsPath,error:t})}try{o.push(...await this.fileSystemProvider.readDirectory(e,{recursive:!0}))}catch(t){this.#e.warn(`Failed to read workspace folder {folder} for likec4 files`,{folder:e.fsPath,error:t})}this.services.workspace.FileSystemWatcher.watch(e.fsPath)}let s=this.services.workspace.ProjectsManager,c=0;for(let e of r)try{await s.registerConfigFile(e.uri),c++}catch(t){this.#e.warn(`Failed to register config file {config}`,{config:e.uri.fsPath,error:t})}r.length===c?c>0&&this.#e.info`loaded ${c} projects`:this.#e.warn`loaded ${c} projects out of ${r.length}`,c>0&&o.push(...await this.scanProjectIncludePaths());let u=await this.loadDocuments(o);M(u,1)?this.#e.debug`found ${u.length} likec4 documents`:this.#e.warn(`No likec4 documents found in workspace`),u.push(this.documentFactory.fromString(Rc,C.parse(Bc)));for(let e of u)this.saveAddDocument(e);return u}finally{this.#t=!0,this._ready.resolve()}}async scanProjectIncludePaths(){let e=this.services.workspace.ProjectsManager.getAllIncludePaths();if(!M(e,1))return[];let t=Vt(e=>this.services.workspace.ProjectsManager.isExcludedByWorkspace(e.uri)),r=[];for(let{projectId:o,includePath:s,includeConfig:c}of e)try{this.#e.debug`scanning include path ${s.fsPath} for project ${o}`;let e=R(await this.fileSystemProvider.readDirectory(s,{recursive:!0,maxDepth:c.maxDepth}),P(t));r.push(...e),e.length===0?this.#e.trace`no files found in include path ${s.fsPath}`:(this.#e.debug`loaded ${e.length} files from include path ${s.fsPath}`,e.length>c.fileThreshold&&this.#e.warn(`Loaded ${e.length} files from include path ${s.fsPath} (project: ${o}) (threshold: ${c.fileThreshold}).\nLarge include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`))}catch(e){this.#e.warn(`Failed to scan include path ${s.fsPath}`,{error:e})}return r}async loadDocuments(e){let t=R(e,wn(e=>e.uri.path),En(compareByUri)),r=[];for(let e of t)try{r.push(await this.documentFactory.fromUri(e.uri))}catch(t){this.#e.warn(`Failed to load document ${e.uri}`,{error:t})}return r}saveAddDocument(e){this.langiumDocuments.hasDocument(e.uri)||this.langiumDocuments.addDocument(e)}workspace(){return this.folders&&M(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();this.#e.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){return $r(this,`workspaceUri`,()=>{let e=this.workspace();return U(e,`Workspace not initialized`),C.parse(e.uri)})}relativePath(e){return T.relative(this.workspaceUri,e)}get workspaceURL(){return $r(this,`workspaceURL`,()=>{let e=this.workspace();return U(e,`Workspace not initialized`),new URL(e.uri)})}forceCleanCaches(){for(let e of[...this.#n])e();this.services.workspace.ProjectsManager.clearCaches(),this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#n.push(e),S.create(()=>{let t=this.#n.indexOf(e);t!==-1&&this.#n.splice(t,1)})}async readExcludeConfig(){if(!this.services.lsp.Connection){this.#e.debug`no LSP connection, skipping initial configuration read`;return}let e=this.services.workspace.ConfigurationProvider,wait=e=>pTimeout(e,{milliseconds:1e3,message:!1});try{this.#e.trace`waiting for ConfigurationProvider ready...`,await wait(e.ready),this.#e.trace`ConfigurationProvider ready, reading exclude patterns...`;let t=await wait(e.getConfiguration(`likec4`,`exclude`));t?(this.#e.trace`exclude configuration found ${t}`,this.services.workspace.ProjectsManager.setWorkspaceExcludePatterns(t)):this.#e.trace(`no initial exclude configuration found`)}catch(e){this.#e.warn(`Failed to read initial exclude configuration`,{error:e})}}};function projectIdFrom(e){if(isImported(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;U(isImportsFromPoject(e))}if(isImportsFromPoject(e))return e.project;let t=Ce(e)?nt(e):e;return t.likec4ProjectId?t.likec4ProjectId:(Y.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,xf.DefaultProjectId)}function stringHash$1(...e){var t=e.length>1?e.join(`:::`):e[0];return Ti(t)}t(stringHash$1,`stringHash`);function safeCall(e){try{return e()}catch(e){Y.trace(`Safe call failed`,{error:e});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let e=performanceNow();return{get ms(){return performanceNow()-e},get pretty(){return qn(performanceNow()-e)}}}const Cf=Y.getChild(`manual-layouts`),wf=`.likec4.snap`,isManualLayoutFile=e=>e!==wf&&e.endsWith(wf);function fileName(e){return`${e}${wf}`}function viewIdFromURI(e){let t=T.basename(e);return isManualLayoutFile(t)?t.slice(0,-12):null}function getManualLayoutsOutDir(e){return T.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const Tf={manualLayouts:e=>new DefaultLikeC4ManualLayouts(e)},Ef=`file://./`;var DefaultLikeC4ManualLayouts=class extends ADisposable{services;cache;listeners=[];#e=pLimit(1);constructor(e){super(),this.services=e,this.cache=new b,this.onDispose(S.create(()=>{this.listeners.length=0,this.cache.clear()})),bi(()=>{this.onDispose(e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()}))})}async handleFileSystemUpdate(e){let t=e.update??e.delete,r=viewIdFromURI(t)??void 0,o=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(o),`delete`in e){this.triggerUpdate(Br({removed:t,projectId:o,viewId:r}));return}let s=this.services.workspace.ProjectsManager.getProject(o);if(!r){let e=await this.readSnapshot(t,s);e?r=e.id:(Cf.error(`Snapshot ${t.fsPath} does not exist or is invalid`),r=`index`)}this.triggerUpdate({updated:t,projectId:o,viewId:r})}onManualLayoutUpdate(e){return this.listeners.push(e),{dispose:()=>{let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}}}async readManualLayouts(e){let t=Cf.getChild(e.id),r=this.services.workspace.FileSystemProvider,o=getManualLayoutsOutDir(e),s=[],c=`${o.toString()}`;try{let u=await r.scanDirectory(o,isManualLayoutFile);if(u.length===0)return null;u.sort((e,t)=>e.uri.path.localeCompare(t.uri.path));for(let o of u)try{let t=await r.readFile(o.uri),u=bt.parse(t);c=Ti(c+o.uri.toString()+t);let d=this.resolveIconPathsAfterRead(u,e.folderUri);s.push({...d,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${o.uri.fsPath}`,{err:e})}s.length&&t.trace`read manual layouts for ${e.id}, found ${s.length}`}catch(r){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:r})}if(s.length===0)return null;let u=rn(s,Nn(`id`));return{hash:c,views:u}}async readSnapshot(e,t){let r=this.services.workspace.FileSystemProvider;try{let o=await r.readFile(e),s=bt.parse(o);if(!t){let r=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(r)}return{...this.resolveIconPathsAfterRead(s,t.folderUri),_layout:`manual`}}catch(t){return Cf.warn(`Failed to read view snapshot ${e.fsPath}`,{err:t}),null}}async read(e){return await this.#e(async()=>{let t=this.cache.get(e.id);if(t!==void 0)return Cf.trace`cache hit project ${e.id}`,t;let r=await this.readManualLayouts(e);return this.cache.set(e.id,r),r})}async write(e,t){this.cache.delete(e.id);let r=Cf.getChild(e.id),o=getManualLayoutsOutDir(e),s=T.joinPath(o,fileName(t.id));if(`manualLayout`in t){let{manualLayout:e,...r}=t;t=r}let c=bt.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),u={uri:s.toString(),range:de.create(ye.create(0,0),ye.create(c.split(`
55
- `).length-1,1))};r.debug`write snapshot of ${t.id} in project ${e.id} to ${s.fsPath}`;let d=this.services.workspace.FileSystemProvider;try{await d.writeFile(s,c+`
56
- `),this.triggerUpdate({updated:s,projectId:e.id,viewId:t.id})}catch(e){r.warn(`Failed to write snapshot ${t.id} to ${s.fsPath}`,{err:e})}return u}async remove(e,t){this.cache.delete(e.id);let r=Cf.getChild(e.id),o=getManualLayoutsOutDir(e),s=T.joinPath(o,fileName(t));r.debug`delete snapshot of ${t} in project ${e.id}. File: ${s.fsPath}`;let c={uri:s.toString(),range:de.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(s))return r.warn`Snapshot ${t} did not exist at ${s.fsPath}`,null;this.triggerUpdate({removed:s,projectId:e.id,viewId:t})}catch(e){r.warn(`Failed to delete snapshot ${t} from ${s.fsPath}`,{err:e})}return c}clearCaches(){Cf.trace`clear caches`,this.cache.clear()}triggerUpdate(e){let t=[...this.listeners];for(let r of t)safeCall(()=>r(e))}normalizeIconPathsForWrite(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let r=C.parse(e.icon),o=T.relative(t,r);return o.startsWith(`..`)?e:{...e,icon:`${Ef}${o}`}}return e});return{...e,nodes:r}}resolveIconPathsAfterRead(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(Ef)){let r=e.icon.substring(9),o=T.joinPath(t,r);return{...e,icon:o.toString()}}return e});return{...e,nodes:r}}};function hasLikeC4Ext(e){return lf.fileExtensions.some(t=>e!==t&&e.endsWith(t))}const Df=[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`];function isNodeModulesOrRepo(e){return Df.includes(e)}function insideNodeModulesOrRepo(e){for(let t of Df)if(e.includes(t))return!0;return!1}const Of=Y.getChild(`chokidar`),kf={fileSystemWatcher:e=>new ChokidarFileSystemWatcher(e)},isAnyLikeC4File=e=>{let t=er(e);return hasLikeC4Ext(t)||Rt(t)||isManualLayoutFile(t)};var ChokidarFileSystemWatcher=class{services;watcher;queue=new Gn({concurrency:1,timeout:5e3});constructor(e){this.services=e,Of.trace`ChokidarFileSystemWatcher created`}watch(e){if(this.watcher){Of.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0;try{await e.close()}catch{}}}createWatcher(e){Of.debug`create watcher for folder: ${e}`;let t=Wi.watch(e,{ignored:[e=>insideNodeModulesOrRepo(e),(e,t)=>!!t&&t.isFile()&&!isAnyLikeC4File(e),e=>this.services.workspace.ProjectsManager.isExcluded(C.file(e))],followSymlinks:!0,ignoreInitial:!0}),onAddOrChange=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})},onRemove=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})};return t.on(`add`,onAddOrChange).on(`change`,onAddOrChange).on(`unlink`,onRemove).on(`unlinkDir`,e=>{this.enqueueFileOp(`removeDir: `+e,async()=>{await this.onRemoveDir(e)})}),t}enqueueFileOp(e,t){this.queue.add(async()=>{try{await t()}catch(t){Of.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Of.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,r=er(e),o=C.file(e);switch(!0){case Rt(r):Of.debug`project config changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(o);break;case isManualLayoutFile(r):Of.debug`manual layout file changed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({update:o});break;case hasLikeC4Ext(r):Of.debug`file changed: ${e}`,await t.DocumentBuilder.update([o],[]);break;default:Of.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,r=er(e),o=C.file(e);switch(!0){case Rt(r):Of.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case hasLikeC4Ext(r):Of.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[o]);break;case isManualLayoutFile(r):Of.debug`manual layout file removed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({delete:o});break;default:Of.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Of.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(Rc);throw Error(`No file system is available (${e.toString()})`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},NoopFileSystemWatcher=class{constructor(){Y.debug`NoopFileSystemWatcher created`}watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{constructor(){Y.debug`NoopLikeC4ManualLayouts created`}handleFileSystemUpdate(){return Promise.resolve()}readSnapshot(){return Promise.resolve(null)}read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}onManualLayoutUpdate(){return{dispose:()=>{}}}dispose(){}};const Af={fileSystemWatcher:()=>new NoopFileSystemWatcher},jf={fileSystemProvider:()=>new NoopFileSystemProvider,...Af},Mf={manualLayouts:()=>new NoopLikeC4ManualLayouts};function isLikeC4ConfigFile(e,t=!1){return!t&&Rt(er(e))}function isLikeC4File(e,t=!1){return!t&&hasLikeC4Ext(er(e))}const WithFileSystem=(e=!1)=>({fileSystemProvider:e=>new SymLinkTraversingFileSystemProvider(e),...e?kf:Af});var SymLinkTraversingFileSystemProvider=class extends $e{services;#e=Y.getChild(`filesystem`);constructor(e){super(),this.services=e}isExcluded(e){return this.services.workspace.ProjectsManager.isExcludedByWorkspace(C.file(e))}excludeDirectory=(e,t)=>isNodeModulesOrRepo(e)||this.isExcluded(t);async readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(Rc);try{return await super.readFile(e)}catch(t){return this.#e.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){if(this.isExcluded(e.fsPath))return[];let r=t?.recursive??!0,o=t?.maxDepth??1/0,s=[];try{let t=new Ui().withSymlinks({resolvePaths:!1}).exclude(this.excludeDirectory).withFullPaths().filter(e=>isLikeC4File(e)&&!this.isExcluded(e));r?o!==1/0&&(t=t.withMaxDepth(o)):t=t.withMaxDepth(1);let c=await t.crawl(e.fsPath).withPromise();for(let e of c)s.push({isFile:!0,isDirectory:!1,uri:C.file(e)});return s.sort(compareByUri)}catch(t){return this.#e.warn(`Failed to read directory ${e.fsPath}`,{error:t}),[]}}async scanProjectFiles(e){let t=await this.scanDirectory(e,isLikeC4ConfigFile);return t.length<=1?t:t.sort(compareByUriDeepFirst)}async scanDirectory(e,t){if(this.isExcluded(e.fsPath))return[];let r=[];try{let o=await new Ui().withSymlinks({resolvePaths:!1}).exclude(this.excludeDirectory).withFullPaths().filter((e,r)=>!this.isExcluded(e)&&t(e,r)).crawl(e.fsPath).withPromise();for(let e of o)r.push({isFile:!0,isDirectory:!1,uri:C.file(e)})}catch(t){this.#e.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return r}async loadProjectConfig(e){return await loadConfig(e)}async writeFile(e,t){let r=tr(e.fsPath),o=Li(r,{throwIfNoEntry:!1});if(o?.isFile())throw Error(`Cannot create directory ${r} because a file with the same name exists.`);return o||(this.#e.debug(`creating directory {path}`,{path:r}),Ii(r,{recursive:!0})),this.#e.debug(`writing file {path}`,{path:e.fsPath}),await $n(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,r=Li(t,{throwIfNoEntry:!1});return r?.isFile()||r?.isSymbolicLink()?(await Qn(t),this.#e.debug(`deleted file {path}`,{path:t}),!0):(this.#e.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){this.#e.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}},LikeC4DocumentationProvider=class extends ee{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!isDeploymentNode$1(e)&&!isDeployedInstance(e)&&!isElement(e))return super.getDocumentation(e);try{let t=nt(e);if(t.state<x.Linked)return super.getDocumentation(e);let r=this.parser.forDocument(t);switch(!0){case isDeploymentNode$1(e):{let t=r.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case isDeployedInstance(e):{let o=r.parseDeployedInstance(e);if(!o)return;let[s,c]=H.isImportRef(o.element)?[o.element.project,o.element.model]:[t.likec4ProjectId,o.element.model],u=s?this.locator.getParsedElement(c,s):this.locator.getParsedElement(c),d=[`_instance of_ \`${c}\``];return u&&d.push(`**${u.element.title}**`),d.join(`
35
+ `)}var GraphvizLayouter=class{graphviz;constructor(e){this.graphviz=e??new eo,to.trace`created with port ${this.graphviz.name}`}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e,to.trace`change port to ${this.graphviz.name}`}printToDot(e,t){return normalizeDot((t?new AiLayoutViewPrinter(e.view,e.styles,t):getPrinter(e)).print())}newScopedLogger(e){return to.getChild([e,`_`,un(4).toLowerCase()])}async dotToJson(e){let t=this.newScopedLogger(`dotToJson`),r;try{r=await this.graphviz.layoutJson(e)}catch(r){throw t.error(loggable(r)),t.error(`Failed to convert DOT to JSON:
36
+ `+e),r}try{return JSON.parse(r)}catch(a){throw t.error(loggable(a)),t.error`Failed to parse JSON:\n${r}\n. Generated from DOT:\n${e}`,a}}async layout(e){let t=this.newScopedLogger(`layout`);try{t.trace`layouting view ${e.view.id}...`;let r=await this.dot(e),{view:a}=e,o=parseGraphvizJson(await this.dotToJson(r),a);return li(o)&&Object.assign(o,{sequenceLayout:x(o)}),r=normalizeDot(r),t.trace`layouting view ${e.view.id} done`,{dot:r,diagram:o}}catch(r){throw t.warn(loggable(r)),wrapError(r,`Error during layout: ${e.view.id}`)}}async aiLayout({view:e,styles:t},r){let a=this.newScopedLogger(`ai-layout`);try{a.trace`layouting view ${e.id} using AI hints...`;let o=new AiLayoutViewPrinter(e,t,r).print(),s=parseGraphvizJson(await this.dotToJson(o),e);return li(s)&&Object.assign(s,{sequenceLayout:x(s)}),o=normalizeDot(o),a.trace`layouting view ${e.id} done`,{dot:o,diagram:s}}catch(t){throw a.warn(loggable(t)),wrapError(t,`Error during AI layout: ${e.id}`)}}async svg(e){let t=await this.dot(e);return t=normalizeDot(t),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=this.newScopedLogger(`dot`);t.trace`generating dot for view ${e.view.id}`;let r=getPrinter(e).print();if(!ui(e.view))return normalizeDot(r);try{t.trace`unflattening dot`,r=await this.graphviz.unflatten(r)}catch(r){t.warn(`Error during unflatten: ${e.view.id}`,{error:r})}return normalizeDot(r)}async layoutProjectsView(e){let t=this.newScopedLogger(`layoutProjectsView`);t.debug`layouting projects overview...`;let r=new Qa(e).print();try{r=await this.graphviz.unflatten(r)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let a=await this.dotToJson(r);return t.debug`layouting ${`projects overview`}`,parseGraphvizJsonOfProjectsView(a,e)}},QueueGraphvizLayoter=class extends GraphvizLayouter{queue;isProcessingBatch=!1;#e=Aa.getChild([`layouter-queue`]);constructor(e){super(e?.graphviz),this.queue=new $n({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=this.#e.getChild([`run`,un(3).toLowerCase()]);return await this.waitForQueueToShrink(this.queue.concurrency,t),t.trace`add task to queue`,await this.queue.add(async()=>(await Gi(),t.trace`task started`,await e()),{throwOnTimeout:!0})}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,this.#e.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){return await this.runInQueue(()=>super.layout(e))}async layoutProjectsView(e){return await this.runInQueue(()=>super.layoutProjectsView(e))}async batchLayout(e,t=this.#e.getChild([`batch`,un(3).toLowerCase()])){if(e.batch.length===0)return t.trace`empty batch`,[];let r=sn(e.batch);if(r)return t.trace`only one task in batch, adding to queue`,await this.queue.add(async()=>{await Gi();try{let t=await super.layout(r);return e.onSuccess?.(r,t),[t]}catch(a){if(t.warn(`layout view ${r.view.id} failed`,{error:a}),e.onError)return e.onError(r,a);throw a}},{throwOnTimeout:!0});if(this.isProcessingBatch)return t.trace`wait for previous layouts to finish`,await this.queue.onIdle(),e.cancelToken?.isCancellationRequested?(t.trace`cancellation requested`,[]):(t.trace`retry`,await this.batchLayout(e));try{this.isProcessingBatch=!0;let r=this.queue.concurrency;await this.waitForQueueToShrink(r,t),t.trace`starting, batch size: ${e.batch.length}, concurrency: ${r}`;let a=[],o=0,s=Math.max(r+1,4),l=s>=e.batch.length?[e.batch]:en(e.batch,s);for(let r of l)if(o++,l.length>1&&t.trace`processing chunk ${o} of ${l.length} (chunk size: ${r.length})`,await this.queue.addAll(r.map(r=>async({signal:o})=>{if(await Gi(),o?.aborted)t.warn`layout view ${r.view.id} cancelled due to timeout`,e.onError?.(r,/* @__PURE__ */ Error(`Timeout`));else try{let t=await super.layout(r);return a.push(t),e.onSuccess?.(r,t),t}catch(a){if(t.warn(`layout view ${r.view.id} failed`,{error:a}),e.onError)return e.onError(r,a);throw a}}),{throwOnTimeout:!0}),e.cancelToken?.isCancellationRequested)return t.trace`cancellation requested`,a;return t.trace`batch layout done`,a}catch(e){throw t.error(`Batch layout failed`,{error:e}),e}finally{this.isProcessingBatch=!1}}async waitForQueueToShrink(e=this.queue.concurrency,t=this.#e){this.queue.size>e+2&&(t.trace`limit reached. queue size: ${this.queue.size}, running: ${this.queue.pending}, waiting shrink to ${e}`,await this.queue.onSizeLessThan(e+1))}dispose(){this.queue.clear(),super.dispose()}},no=/* @__PURE__ */ t(er(),1);const ro=Aa.getChild([`graphviz`,`binary`]);var GraphvizBinaryAdapter=class{_dotpath;_unflattenpath;concurrency=4;constructor(e,t){this._dotpath=e,this._unflattenpath=t}get name(){return`binary`}dispose(){}[Symbol.dispose](){}get dotpath(){return this._dotpath??Ri(this,`_dotpath`,()=>{let e=no.default.sync(`dot`);return ro.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??Ri(this,`_unflattenpath`,()=>{let e=no.default.sync(`unflatten`);return ro.debug`Found ${e}`,e})}async unflatten(e){let t,r=ro.getChild([`unflatten`,un(4)]);try{let a=await sa(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=a.stdout,N(a.stderr)?r.trace(`{command} succeeded in {durationMs}ms`,{command:a.command,durationMs:Math.round(a.durationMs)}):r.warn(`{command} has stderr:
37
+ `+a.stderr,{command:a.command})}catch(a){r.debug(`FAILED DOT`,{dot:e}),r.error(loggable(a)),a instanceof ca&&!N(a.stdout)&&(r.warn(`{command} returned result but failed with exitcode {exitCode}:
38
+ {stderr}`,{command:a.command,exitCode:a.exitCode,stderr:a.stderr}),t=a.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=ro.getChild([`layoutJson`,un(4)]),r;try{let a=await sa(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});r=a.stdout,N(a.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:a.command,durationMs:Math.round(a.durationMs)}):t.warn(`{command} has stderr:
39
+ `+a.stderr,{command:a.command})}catch(a){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(a)),a instanceof ca&&!N(a.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
40
+ {stderr}`,{command:a.command,exitCode:a.exitCode,stderr:a.stderr}),r=a.stdout;else throw a}return r}async acyclic(e){return Promise.reject(/* @__PURE__ */ Error(`Method not implemented.`))}async svg(e){let t=ro.getChild([`svg`,un(4)]),r;try{let a=await sa(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});r=a.stdout,N(a.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:a.command,durationMs:Math.round(a.durationMs)}):t.warn(`{command} has stderr:
41
+ `+a.stderr,{command:a.command})}catch(a){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(a)),a instanceof ca&&!N(a.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
42
+ {stderr}`,{command:a.command,exitCode:a.exitCode,stderr:a.stderr}),r=a.stdout;else throw a}return r}};const Y=Aa.getChild(`server`);function logWarnError(e){Y.warn(loggable(e))}function getTelemetrySink(e){let t=getMessageOnlyFormatter();return r=>{try{switch(r.level){case`error`:case`fatal`:{let a=r.category.join(`.`);if(a===`likec4.config`)break;let o=errorFromLogRecord(r);o?e.telemetry.logEvent({eventName:`error`,message:`${o.name}: ${o.message}`,category:a,...o.stack&&{stack:o.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(r),category:a});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function configureLanguageServerLogger({lspConnection:e,enableTelemetry:t=!!e,useStdErr:r=!1,logLevel:a=ua?`debug`:`warning`,nonBlocking:o=!1,colors:s=la}={}){let l=!!e&&t&&!ua;configureLogger$1({reset:!0,sinks:{console:r?getConsoleStderrSink():getConsoleSink({formatter:s?getAnsiColorFormatter():getTextFormatter(),nonBlocking:o}),...l&&{telemetry:getTelemetrySink(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...l?[`telemetry`]:[]],lowestLevel:a}]}),Y.trace(`logger configured`)}const io=kt.pick({extends:!0,styles:!0}).loose(),normalizeExtends=e=>e?Array.isArray(e)?e:[e]:[],parseJsonConfig=async e=>{let t=await or.readFile(e,`utf-8`),r;try{r=wt.parse(t.trim()||`{}`)}catch(t){throw wrapError(t,`${e}:`)}if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`${e}: Config must be a JSON object`);let a=io.safeParse(r);if(!a.success)throw Error(`${e}: Invalid config\n`+ar.prettifyError(a.error));return a.data},rebaseCustomCssPaths=(e,t,r)=>{let a=e.styles?.customCss;return a?.paths?{...e,styles:{...e.styles,customCss:{...a,paths:a.paths.map(e=>pr(r,mr(t,e)).split(hr).join(`/`))}}}:e},loadJsonConfigs=async(e,t,r)=>{if(t.includes(e)){let r=t.indexOf(e),a=[...t.slice(r),e].join(` -> `);throw Error(`Config extends cycle detected: ${a}`)}let a=rebaseCustomCssPaths(await parseJsonConfig(e),dr(e),r),o=normalizeExtends(a.extends),s=[...t,e],l=[];for(let t of o){let a=mr(dr(e),t);l.push(...await loadJsonConfigs(a,s,r))}return[...l,a]},identity=e=>e,ao={defineConfig:identity,defineGenerators:identity,defineStyle:identity,defineTheme:identity,defineThemeColor:identity},loadCustomCss=async(e,t)=>{let r=e.styles?.customCss;if(!r?.paths?.length)return e;let a=await Promise.all(r.paths.map(async e=>{try{return await or.readFile(mr(t,e),`utf-8`)}catch(t){return Aa.getChild(`config`).warn(`Failed to read styles.customCss file "${e}": ${t}`),null}}));return{...e,styles:{...e.styles,customCss:{...r,content:a.filter(Ut).join(`
43
+ `)}}}};async function loadConfig(e){e=typeof e==`string`?e:e.fsPath,Aa.getChild(`config`).trace`Loading config: ${pr(fa(),e)}`;let t=dr(e),r=ur(e),a={name:ur(t)};if(Dt(r)){let r=await loadJsonConfigs(mr(e),[],mr(t));W(R(r,1),`Expect at least one config`);let o=Sn(qt(r),[`extends`,`styles`]),s=r.map(e=>e.styles).filter(Ut),l=s.length>0?b({},...s.reverse()):void 0;return await loadCustomCss(Et({...a,...o,...l?{styles:l}:{}}),t)}W(Ot(r),`Invalid name for config file: ${e}`);let o=da(e,{moduleCache:!1,fsCache:!1,virtualModules:{"@likec4/config":ao,"likec4/config":ao}}),s;try{s=await o.import(e,{default:!0})}catch(t){throw t instanceof Error&&t.message.includes(e)?t:wrapError(t,`${e}:`)}return await loadCustomCss(Et(Object.assign(a,s)),t)}const oo={aws:/* @__PURE__ */ `activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:/* @__PURE__ */ `abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:/* @__PURE__ */ `access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),md:/* @__PURE__ */ `10k-fill.10k.10mp-fill.10mp.11mp-fill.11mp.123-fill.123.12mp-fill.12mp.13mp-fill.13mp.14mp-fill.14mp.15mp-fill.15mp.16mp-fill.16mp.17mp-fill.17mp.18-up-rating-fill.18-up-rating.18mp-fill.18mp.19mp-fill.19mp.1k-fill.1k-plus-fill.1k-plus.1k.1x-mobiledata-badge-fill.1x-mobiledata-badge.1x-mobiledata-fill.1x-mobiledata.20mp-fill.20mp.21mp-fill.21mp.22mp-fill.22mp.23mp-fill.23mp.24fps-select-fill.24fps-select.24mp-fill.24mp.2d-2-fill.2d-2.2d-fill.2d.2k-fill.2k-plus-fill.2k-plus.2k.2mp-fill.2mp.30fps-fill.30fps-select-fill.30fps-select.30fps.360-fill.360.3d-2-fill.3d-2.3d-fill.3d-rotation-fill.3d-rotation.3d.3g-mobiledata-badge-fill.3g-mobiledata-badge.3g-mobiledata-fill.3g-mobiledata.3k-fill.3k-plus-fill.3k-plus.3k.3mp-fill.3mp.3p-fill.3p.4g-mobiledata-badge-fill.4g-mobiledata-badge.4g-mobiledata-fill.4g-mobiledata.4g-plus-mobiledata-fill.4g-plus-mobiledata.4k-fill.4k-plus-fill.4k-plus.4k.4mp-fill.4mp.50mp-fill.50mp.5g-fill.5g-mobiledata-badge-fill.5g-mobiledata-badge.5g.5k-fill.5k-plus-fill.5k-plus.5k.5mp-fill.5mp.6-ft-apart-fill.6-ft-apart.60fps-fill.60fps-select-fill.60fps-select.60fps.6k-fill.6k-plus-fill.6k-plus.6k.6mp-fill.6mp.7k-fill.7k-plus-fill.7k-plus.7k.7mp-fill.7mp.8k-fill.8k-plus-fill.8k-plus.8k.8mp-fill.8mp.9k-fill.9k-plus-fill.9k-plus.9k.9mp-fill.9mp.abc-fill.abc.ac-unit-fill.ac-unit.accessibility-fill.accessibility-new-fill.accessibility-new.accessibility.accessible-fill.accessible-forward-fill.accessible-forward.accessible-menu-fill.accessible-menu.accessible.account-balance-fill.account-balance-wallet-fill.account-balance-wallet.account-balance.account-box-fill.account-box.account-child-fill.account-child-invert-fill.account-child-invert.account-child.account-circle-fill.account-circle-off-fill.account-circle-off.account-circle.account-tree-fill.account-tree.action-key-fill.action-key.activity-zone-fill.activity-zone.acupuncture-fill.acupuncture.acute-fill.acute.ad-fill.ad-group-fill.ad-group-off-fill.ad-group-off.ad-group.ad-off-fill.ad-off.ad.adaptive-audio-mic-fill.adaptive-audio-mic-off-fill.adaptive-audio-mic-off.adaptive-audio-mic.adb-fill.adb.add-2-fill.add-2.add-a-photo-fill.add-a-photo.add-ad-fill.add-ad.add-alert-fill.add-alert.add-box-fill.add-box.add-business-fill.add-business.add-call-fill.add-call.add-card-fill.add-card.add-chart-fill.add-chart.add-circle-fill.add-circle.add-column-left-fill.add-column-left.add-column-right-fill.add-column-right.add-comment-fill.add-comment.add-diamond-fill.add-diamond.add-fill.add-home-fill.add-home-work-fill.add-home-work.add-home.add-link-fill.add-link.add-location-alt-fill.add-location-alt.add-location-fill.add-location.add-moderator-fill.add-moderator.add-notes-fill.add-notes.add-photo-alternate-fill.add-photo-alternate.add-reaction-fill.add-reaction.add-road-fill.add-road.add-row-above-fill.add-row-above.add-row-below-fill.add-row-below.add-shopping-cart-fill.add-shopping-cart.add-task-fill.add-task.add-to-drive-fill.add-to-drive.add-to-queue-fill.add-to-queue.add-triangle-fill.add-triangle.add.adf-scanner-fill.adf-scanner.adjust-fill.adjust.admin-meds-fill.admin-meds.admin-panel-settings-fill.admin-panel-settings.ads-click-fill.ads-click.agender-fill.agender.agriculture-fill.agriculture.air-fill.air-freshener-fill.air-freshener.air-purifier-fill.air-purifier-gen-fill.air-purifier-gen.air-purifier.air.airline-seat-flat-angled-fill.airline-seat-flat-angled.airline-seat-flat-fill.airline-seat-flat.airline-seat-individual-suite-fill.airline-seat-individual-suite.airline-seat-legroom-extra-fill.airline-seat-legroom-extra.airline-seat-legroom-normal-fill.airline-seat-legroom-normal.airline-seat-legroom-reduced-fill.airline-seat-legroom-reduced.airline-seat-recline-extra-fill.airline-seat-recline-extra.airline-seat-recline-normal-fill.airline-seat-recline-normal.airline-stops-fill.airline-stops.airlines-fill.airlines.airplane-ticket-fill.airplane-ticket.airplanemode-inactive-fill.airplanemode-inactive.airplay-fill.airplay.airport-shuttle-fill.airport-shuttle.airwave-fill.airwave.alarm-add-fill.alarm-add.alarm-fill.alarm-off-fill.alarm-off.alarm-on-fill.alarm-on.alarm-pause-fill.alarm-pause.alarm-smart-wake-fill.alarm-smart-wake.alarm.album-fill.album.align-center-fill.align-center.align-end-fill.align-end.align-flex-center-fill.align-flex-center.align-flex-end-fill.align-flex-end.align-flex-start-fill.align-flex-start.align-horizontal-center-fill.align-horizontal-center.align-horizontal-left-fill.align-horizontal-left.align-horizontal-right-fill.align-horizontal-right.align-items-stretch-fill.align-items-stretch.align-justify-center-fill.align-justify-center.align-justify-flex-end-fill.align-justify-flex-end.align-justify-flex-start-fill.align-justify-flex-start.align-justify-space-around-fill.align-justify-space-around.align-justify-space-between-fill.align-justify-space-between.align-justify-space-even-fill.align-justify-space-even.align-justify-stretch-fill.align-justify-stretch.align-self-stretch-fill.align-self-stretch.align-space-around-fill.align-space-around.align-space-between-fill.align-space-between.align-space-even-fill.align-space-even.align-start-fill.align-start.align-stretch-fill.align-stretch.align-vertical-bottom-fill.align-vertical-bottom.align-vertical-center-fill.align-vertical-center.align-vertical-top-fill.align-vertical-top.all-inbox-fill.all-inbox.all-inclusive-fill.all-inclusive.all-match-fill.all-match.all-out-fill.all-out.allergies-fill.allergies.allergy-fill.allergy.alt-route-fill.alt-route.alternate-email-fill.alternate-email.altitude-fill.altitude.ambulance-fill.ambulance.amend-fill.amend.amp-stories-fill.amp-stories.analytics-fill.analytics.anchor-fill.anchor.android-cell-4-bar-alert-fill.android-cell-4-bar-alert.android-cell-4-bar-fill.android-cell-4-bar-off-fill.android-cell-4-bar-off.android-cell-4-bar-plus-fill.android-cell-4-bar-plus.android-cell-4-bar.android-cell-5-bar-alert-fill.android-cell-5-bar-alert.android-cell-5-bar-fill.android-cell-5-bar-off-fill.android-cell-5-bar-off.android-cell-5-bar-plus-fill.android-cell-5-bar-plus.android-cell-5-bar.android-cell-dual-4-bar-alert-fill.android-cell-dual-4-bar-alert.android-cell-dual-4-bar-fill.android-cell-dual-4-bar-plus-fill.android-cell-dual-4-bar-plus.android-cell-dual-4-bar.android-cell-dual-5-bar-alert-fill.android-cell-dual-5-bar-alert.android-cell-dual-5-bar-fill.android-cell-dual-5-bar-plus-fill.android-cell-dual-5-bar-plus.android-cell-dual-5-bar.android-fill.android-wifi-3-bar-alert-fill.android-wifi-3-bar-alert.android-wifi-3-bar-fill.android-wifi-3-bar-lock-fill.android-wifi-3-bar-lock.android-wifi-3-bar-off-fill.android-wifi-3-bar-off.android-wifi-3-bar-plus-fill.android-wifi-3-bar-plus.android-wifi-3-bar-question-fill.android-wifi-3-bar-question.android-wifi-3-bar.android-wifi-4-bar-alert-fill.android-wifi-4-bar-alert.android-wifi-4-bar-fill.android-wifi-4-bar-lock-fill.android-wifi-4-bar-lock.android-wifi-4-bar-off-fill.android-wifi-4-bar-off.android-wifi-4-bar-plus-fill.android-wifi-4-bar-plus.android-wifi-4-bar-question-fill.android-wifi-4-bar-question.android-wifi-4-bar.android.animated-images-fill.animated-images.animation-fill.animation.antigravity-fill.antigravity.aod-tablet-fill.aod-tablet.aod-watch-fill.aod-watch.apartment-fill.apartment.api-fill.api.apk-document-fill.apk-document.apk-install-fill.apk-install.app-badging-fill.app-badging.app-registration-fill.app-registration.apparel-fill.apparel.approval-delegation-fill.approval-delegation-off-fill.approval-delegation-off.approval-delegation.approval-fill.approval.apps-fill.apps-outage-fill.apps-outage.apps-plus-fill.apps-plus.apps.aq-fill.aq-indoor-fill.aq-indoor.aq.ar-on-you-fill.ar-on-you.ar-stickers-fill.ar-stickers.architecture-fill.architecture.archive-fill.archive.area-chart-fill.area-chart.arming-countdown-fill.arming-countdown.arrow-and-edge-fill.arrow-and-edge.arrow-back-2-fill.arrow-back-2.arrow-back-fill.arrow-back-ios-fill.arrow-back-ios-new-fill.arrow-back-ios-new.arrow-back-ios.arrow-back.arrow-circle-down-fill.arrow-circle-down.arrow-circle-left-fill.arrow-circle-left.arrow-circle-right-fill.arrow-circle-right.arrow-circle-up-fill.arrow-circle-up.arrow-cool-down-fill.arrow-cool-down.arrow-downward-alt-fill.arrow-downward-alt.arrow-downward-fill.arrow-downward.arrow-drop-down-circle-fill.arrow-drop-down-circle.arrow-drop-down-fill.arrow-drop-down.arrow-drop-up-fill.arrow-drop-up.arrow-forward-fill.arrow-forward-ios-fill.arrow-forward-ios.arrow-forward.arrow-insert-fill.arrow-insert.arrow-left-alt-fill.arrow-left-alt.arrow-left-fill.arrow-left.arrow-menu-close-fill.arrow-menu-close.arrow-menu-open-fill.arrow-menu-open.arrow-or-edge-fill.arrow-or-edge.arrow-outward-fill.arrow-outward.arrow-range-fill.arrow-range.arrow-right-alt-fill.arrow-right-alt.arrow-right-fill.arrow-right.arrow-selector-tool-fill.arrow-selector-tool.arrow-shape-up-fill.arrow-shape-up-stack-2-fill.arrow-shape-up-stack-2.arrow-shape-up-stack-fill.arrow-shape-up-stack.arrow-shape-up.arrow-split-fill.arrow-split.arrow-top-left-fill.arrow-top-left.arrow-top-right-fill.arrow-top-right.arrow-upload-progress-fill.arrow-upload-progress.arrow-upload-ready-fill.arrow-upload-ready.arrow-upward-alt-fill.arrow-upward-alt.arrow-upward-fill.arrow-upward.arrow-warm-up-fill.arrow-warm-up.arrows-input-fill.arrows-input.arrows-left-right-circle-fill.arrows-left-right-circle.arrows-more-down-fill.arrows-more-down.arrows-more-up-fill.arrows-more-up.arrows-output-fill.arrows-output.arrows-outward-fill.arrows-outward.arrows-up-down-circle-fill.arrows-up-down-circle.art-track-fill.art-track.article-fill.article-person-fill.article-person.article-shortcut-fill.article-shortcut.article.artist-fill.artist.aspect-ratio-fill.aspect-ratio.assignment-add-fill.assignment-add.assignment-fill.assignment-globe-fill.assignment-globe.assignment-ind-fill.assignment-ind.assignment-late-fill.assignment-late.assignment-return-fill.assignment-return.assignment-returned-fill.assignment-returned.assignment-turned-in-fill.assignment-turned-in.assignment.assist-walker-fill.assist-walker.assistant-device-fill.assistant-device.assistant-direction-fill.assistant-direction.assistant-navigation-fill.assistant-navigation.assistant-on-hub-fill.assistant-on-hub.assured-workload-fill.assured-workload.asterisk-fill.asterisk.atm-fill.atm.atr-fill.atr.attach-email-fill.attach-email.attach-file-add-fill.attach-file-add.attach-file-fill.attach-file-off-fill.attach-file-off.attach-file.attach-money-fill.attach-money.attachment-fill.attachment.attractions-fill.attractions.attribution-fill.attribution.audio-capture-fill.audio-capture.audio-description-fill.audio-description.audio-file-fill.audio-file.audio-video-receiver-fill.audio-video-receiver.auto-awesome-mosaic-fill.auto-awesome-mosaic.auto-awesome-motion-fill.auto-awesome-motion.auto-delete-fill.auto-delete.auto-read-pause-fill.auto-read-pause.auto-read-play-fill.auto-read-play.auto-stories-fill.auto-stories-off-fill.auto-stories-off.auto-stories.auto-towing-fill.auto-towing.auto-transmission-fill.auto-transmission.autofps-select-fill.autofps-select.automation-fill.automation.autopause-fill.autopause.autoplay-fill.autoplay.autorenew-fill.autorenew.autostop-fill.autostop.av-timer-fill.av-timer.av1-fill.av1.avc-fill.avc.avg-pace-fill.avg-pace.avg-time-fill.avg-time.avocado-bean-fill.avocado-bean.award-meal-fill.award-meal.award-star-fill.award-star.azm-fill.azm.b-circle-fill.b-circle.baby-changing-station-fill.baby-changing-station.back-hand-fill.back-hand.back-to-tab-fill.back-to-tab.background-dot-large-fill.background-dot-large.background-dot-small-fill.background-dot-small.background-grid-small-fill.background-grid-small.background-replace-fill.background-replace.backlight-high-fill.backlight-high-off-fill.backlight-high-off.backlight-high.backlight-low-fill.backlight-low.backpack-fill.backpack.backspace-fill.backspace.backup-fill.backup-table-fill.backup-table.backup.badge-critical-battery-fill.badge-critical-battery.badge-fill.badge.badminton-fill.badminton.bakery-dining-fill.bakery-dining.balance-fill.balance.balcony-fill.balcony.ballot-fill.ballot.bar-chart-4-bars-fill.bar-chart-4-bars.bar-chart-fill.bar-chart-off-fill.bar-chart-off.bar-chart.barcode-fill.barcode-reader-fill.barcode-reader.barcode-scanner-fill.barcode-scanner.barcode.barefoot-fill.barefoot.batch-prediction-fill.batch-prediction.bath-bedrock-fill.bath-bedrock.bath-outdoor-fill.bath-outdoor.bath-private-fill.bath-private.bath-public-large-fill.bath-public-large.bath-soak-fill.bath-soak.bathroom-fill.bathroom.bathtub-fill.bathtub.battery-0-bar-fill.battery-0-bar.battery-1-bar-fill.battery-1-bar.battery-2-bar-fill.battery-2-bar.battery-3-bar-fill.battery-3-bar.battery-4-bar-fill.battery-4-bar.battery-5-bar-fill.battery-5-bar.battery-6-bar-fill.battery-6-bar.battery-alert-fill.battery-alert.battery-android-0-fill.battery-android-0.battery-android-1-fill.battery-android-1.battery-android-2-fill.battery-android-2.battery-android-3-fill.battery-android-3.battery-android-4-fill.battery-android-4.battery-android-5-fill.battery-android-5.battery-android-6-fill.battery-android-6.battery-android-alert-fill.battery-android-alert.battery-android-bolt-fill.battery-android-bolt.battery-android-frame-1-fill.battery-android-frame-1.battery-android-frame-2-fill.battery-android-frame-2.battery-android-frame-3-fill.battery-android-frame-3.battery-android-frame-4-fill.battery-android-frame-4.battery-android-frame-5-fill.battery-android-frame-5.battery-android-frame-6-fill.battery-android-frame-6.battery-android-frame-alert-fill.battery-android-frame-alert.battery-android-frame-bolt-fill.battery-android-frame-bolt.battery-android-frame-full-fill.battery-android-frame-full.battery-android-frame-plus-fill.battery-android-frame-plus.battery-android-frame-question-fill.battery-android-frame-question.battery-android-frame-share-fill.battery-android-frame-share.battery-android-frame-shield-fill.battery-android-frame-shield.battery-android-full-fill.battery-android-full.battery-android-plus-fill.battery-android-plus.battery-android-question-fill.battery-android-question.battery-android-share-fill.battery-android-share.battery-android-shield-fill.battery-android-shield.battery-change-fill.battery-change.battery-charging-20-2-fill.battery-charging-20-2.battery-charging-20-fill.battery-charging-20.battery-charging-30-2-fill.battery-charging-30-2.battery-charging-30-fill.battery-charging-30.battery-charging-50-2-fill.battery-charging-50-2.battery-charging-50-fill.battery-charging-50.battery-charging-60-2-fill.battery-charging-60-2.battery-charging-60-fill.battery-charging-60.battery-charging-80-2-fill.battery-charging-80-2.battery-charging-80-fill.battery-charging-80.battery-charging-90-fill.battery-charging-90.battery-charging-full-2-fill.battery-charging-full-2.battery-charging-full-fill.battery-charging-full.battery-error-fill.battery-error.battery-full-alt-fill.battery-full-alt.battery-full-fill.battery-full.battery-horiz-000-fill.battery-horiz-000.battery-horiz-050-fill.battery-horiz-050.battery-horiz-075-fill.battery-horiz-075.battery-low-fill.battery-low.battery-plus-fill.battery-plus.battery-profile-fill.battery-profile.battery-share-fill.battery-share.battery-status-good-fill.battery-status-good.battery-unknown-fill.battery-unknown.battery-very-low-fill.battery-very-low.beach-access-fill.beach-access.bed-fill.bed.bedroom-baby-fill.bedroom-baby.bedroom-child-fill.bedroom-child.bedroom-parent-fill.bedroom-parent.bedtime-fill.bedtime-off-fill.bedtime-off.bedtime.beenhere-fill.beenhere.beer-meal-fill.beer-meal.bento-fill.bento.bia-fill.bia.bid-landscape-disabled-fill.bid-landscape-disabled.bid-landscape-fill.bid-landscape.bigtop-updates-fill.bigtop-updates.bike-dock-fill.bike-dock.bike-lane-fill.bike-lane.bike-scooter-fill.bike-scooter.biotech-fill.biotech.blanket-fill.blanket.blender-fill.blender.blind-fill.blind.blinds-2-closed-fill.blinds-2-closed.blinds-2-fill.blinds-2.blinds-closed-fill.blinds-closed.blinds-fill.blinds.block-fill.block.blood-pressure-fill.blood-pressure.bloodtype-fill.bloodtype.bluetooth-connected-fill.bluetooth-connected.bluetooth-disabled-fill.bluetooth-disabled.bluetooth-drive-fill.bluetooth-drive.bluetooth-fill.bluetooth-searching-fill.bluetooth-searching.bluetooth.blur-circular-fill.blur-circular.blur-linear-fill.blur-linear.blur-medium-fill.blur-medium.blur-off-fill.blur-off.blur-on-fill.blur-on.blur-short-fill.blur-short.boat-bus-fill.boat-bus.boat-railway-fill.boat-railway.body-fat-fill.body-fat.body-system-fill.body-system.bolt-boost-fill.bolt-boost.bolt-fill.bolt.bomb-fill.bomb.book-2-fill.book-2.book-3-fill.book-3.book-4-fill.book-4.book-5-fill.book-5.book-6-fill.book-6.book-fill.book-ribbon-fill.book-ribbon.book.bookmark-add-fill.bookmark-add.bookmark-added-fill.bookmark-added.bookmark-bag-fill.bookmark-bag.bookmark-check-fill.bookmark-check.bookmark-fill.bookmark-flag-fill.bookmark-flag.bookmark-heart-fill.bookmark-heart.bookmark-manager-fill.bookmark-manager.bookmark-remove-fill.bookmark-remove.bookmark-stacks-fill.bookmark-stacks.bookmark-star-fill.bookmark-star.bookmark.bookmarks-fill.bookmarks.books-movies-and-music-fill.books-movies-and-music.border-all-fill.border-all.border-bottom-fill.border-bottom.border-clear-fill.border-clear.border-color-fill.border-color.border-horizontal-fill.border-horizontal.border-inner-fill.border-inner.border-left-fill.border-left.border-outer-fill.border-outer.border-right-fill.border-right.border-style-fill.border-style.border-top-fill.border-top.border-vertical-fill.border-vertical.borg-fill.borg.bottom-app-bar-fill.bottom-app-bar.bottom-drawer-fill.bottom-drawer.bottom-navigation-fill.bottom-navigation.bottom-panel-close-fill.bottom-panel-close.bottom-panel-open-fill.bottom-panel-open.bottom-right-click-fill.bottom-right-click.bottom-sheets-fill.bottom-sheets.box-add-fill.box-add.box-edit-fill.box-edit.box-fill.box.boy-fill.boy.brand-awareness-fill.brand-awareness.brand-family-fill.brand-family.branding-watermark-fill.branding-watermark.breakfast-dining-fill.breakfast-dining.breaking-news-alt-1-fill.breaking-news-alt-1.breaking-news-fill.breaking-news.breastfeeding-fill.breastfeeding.brick-fill.brick.briefcase-meal-fill.briefcase-meal.brightness-1-fill.brightness-1.brightness-2-fill.brightness-2.brightness-3-fill.brightness-3.brightness-4-fill.brightness-4.brightness-5-fill.brightness-5.brightness-6-fill.brightness-6.brightness-7-fill.brightness-7.brightness-alert-fill.brightness-alert.brightness-auto-fill.brightness-auto.brightness-empty-fill.brightness-empty.brightness-medium-fill.brightness-medium.bring-your-own-ip-fill.bring-your-own-ip.broadcast-on-home-fill.broadcast-on-home.broadcast-on-personal-fill.broadcast-on-personal.broken-image-fill.broken-image.browse-activity-fill.browse-activity.browse-fill.browse-gallery-fill.browse-gallery.browse.browser-updated-fill.browser-updated.brunch-dining-fill.brunch-dining.brush-fill.brush.bubble-chart-fill.bubble-chart.bubble-fill.bubble.bubbles-fill.bubbles.bucket-check-fill.bucket-check.bug-report-fill.bug-report.build-circle-fill.build-circle.build-fill.build.bullet-chart-fill.bullet-chart.bungalow-fill.bungalow.burst-mode-fill.burst-mode.bus-alert-fill.bus-alert.bus-map-pin-fill.bus-map-pin.bus-railway-fill.bus-railway.business-center-fill.business-center.business-chip-fill.business-chip.business-messages-fill.business-messages.buttons-alt-fill.buttons-alt.cabin-fill.cabin.cable-car-fill.cable-car.cable-fill.cable.cached-fill.cached.cadence-fill.cadence.cake-add-fill.cake-add.cake-fill.cake.calculate-fill.calculate.calendar-add-on-fill.calendar-add-on.calendar-apps-script-fill.calendar-apps-script.calendar-check-fill.calendar-check.calendar-clock-fill.calendar-clock.calendar-lock-fill.calendar-lock.calendar-meal-2-fill.calendar-meal-2.calendar-meal-fill.calendar-meal.calendar-month-fill.calendar-month.calendar-today-fill.calendar-today.calendar-view-day-fill.calendar-view-day.calendar-view-month-fill.calendar-view-month.calendar-view-week-fill.calendar-view-week.call-end-fill.call-end.call-fill.call-log-fill.call-log.call-made-fill.call-made.call-merge-fill.call-merge.call-missed-fill.call-missed-outgoing-fill.call-missed-outgoing.call-missed.call-quality-fill.call-quality.call-received-fill.call-received.call-split-fill.call-split.call-to-action-fill.call-to-action.call.camera-fill.camera-indoor-fill.camera-indoor.camera-outdoor-fill.camera-outdoor.camera-roll-fill.camera-roll.camera-video-fill.camera-video.camera.cameraswitch-fill.cameraswitch.campaign-fill.campaign.camping-fill.camping.cancel-fill.cancel-presentation-fill.cancel-presentation.cancel-schedule-send-fill.cancel-schedule-send.cancel.candle-fill.candle.candlestick-chart-fill.candlestick-chart.cannabis-fill.cannabis.captive-portal-fill.captive-portal.capture-fill.capture.car-crash-fill.car-crash.car-defrost-left-fill.car-defrost-left.car-defrost-low-left-fill.car-defrost-low-left.car-defrost-low-right-fill.car-defrost-low-right.car-defrost-mid-left-fill.car-defrost-mid-left.car-defrost-mid-low-left-fill.car-defrost-mid-low-left.car-defrost-mid-low-right-fill.car-defrost-mid-low-right.car-defrost-mid-right-fill.car-defrost-mid-right.car-defrost-right-fill.car-defrost-right.car-fan-low-left-fill.car-fan-low-left.car-fan-low-mid-left-fill.car-fan-low-mid-left.car-fan-low-right-fill.car-fan-low-right.car-fan-mid-left-fill.car-fan-mid-left.car-fan-mid-low-right-fill.car-fan-mid-low-right.car-fan-mid-right-fill.car-fan-mid-right.car-fan-recirculate-2-fill.car-fan-recirculate-2.car-fan-recirculate-fill.car-fan-recirculate.car-gear-fill.car-gear.car-lock-fill.car-lock.car-mirror-heat-fill.car-mirror-heat.car-rental-fill.car-rental.car-repair-fill.car-repair.car-seat-off-fill.car-seat-off.car-tag-fill.car-tag.card-membership-fill.card-membership.card-travel-fill.card-travel.cardio-load-fill.cardio-load.cardiology-fill.cardiology.cards-fill.cards-stack-fill.cards-stack.cards-star-fill.cards-star.cards.carpenter-fill.carpenter.carry-on-bag-checked-fill.carry-on-bag-checked.carry-on-bag-fill.carry-on-bag-inactive-fill.carry-on-bag-inactive.carry-on-bag-question-fill.carry-on-bag-question.carry-on-bag.cases-fill.cases.casino-fill.casino.cast-connected-fill.cast-connected.cast-fill.cast-for-education-fill.cast-for-education.cast-pause-fill.cast-pause.cast-warning-fill.cast-warning.cast.castle-fill.castle.category-fill.category-search-fill.category-search.category.celebration-fill.celebration.cell-merge-fill.cell-merge.cell-tower-fill.cell-tower.cell-wifi-fill.cell-wifi.center-focus-strong-fill.center-focus-strong.center-focus-weak-fill.center-focus-weak.chair-alt-fill.chair-alt.chair-counter-fill.chair-counter.chair-fill.chair-fireplace-fill.chair-fireplace.chair-umbrella-fill.chair-umbrella.chair.chalet-fill.chalet.change-circle-fill.change-circle.change-history-fill.change-history.charger-fill.charger.chart-data-fill.chart-data.chat-add-on-fill.chat-add-on.chat-apps-script-fill.chat-apps-script.chat-bubble-fill.chat-bubble-off-fill.chat-bubble-off.chat-bubble.chat-dashed-fill.chat-dashed.chat-display-fill.chat-display.chat-error-fill.chat-error.chat-fill.chat-info-fill.chat-info.chat-paste-go-2-fill.chat-paste-go-2.chat-paste-go-fill.chat-paste-go.chat.check-alert-fill.check-alert.check-box-fill.check-box-outline-blank-fill.check-box-outline-blank.check-box.check-circle-fill.check-circle-unread-fill.check-circle-unread.check-circle.check-fill.check-in-out-fill.check-in-out.check-indeterminate-small-fill.check-indeterminate-small.check-small-fill.check-small.check.checkbook-fill.checkbook.checked-bag-fill.checked-bag-question-fill.checked-bag-question.checked-bag.checklist-fill.checklist-rtl-fill.checklist-rtl.checklist.checkroom-fill.checkroom.cheer-fill.cheer.chef-hat-fill.chef-hat.chess-bishop-2-fill.chess-bishop-2.chess-bishop-fill.chess-bishop.chess-fill.chess-king-2-fill.chess-king-2.chess-king-fill.chess-king.chess-knight-fill.chess-knight.chess-pawn-2-fill.chess-pawn-2.chess-pawn-fill.chess-pawn.chess-queen-fill.chess-queen.chess-rook-fill.chess-rook.chess.chevron-backward-fill.chevron-backward.chevron-forward-fill.chevron-forward.chevron-left-fill.chevron-left.chevron-line-up-fill.chevron-line-up.chevron-right-fill.chevron-right.child-care-fill.child-care.child-friendly-fill.child-friendly.child-hat-fill.child-hat.chip-extraction-fill.chip-extraction.chips-fill.chips.chrome-reader-mode-fill.chrome-reader-mode.chromecast-2-fill.chromecast-2.chromecast-device-fill.chromecast-device.chronic-fill.chronic.church-fill.church.cinematic-blur-fill.cinematic-blur.circle-circle-fill.circle-circle.circle-fill.circle-notifications-fill.circle-notifications.circle.circles-ext-fill.circles-ext.circles-fill.circles.clarify-fill.clarify.clean-hands-fill.clean-hands.cleaning-bucket-fill.cleaning-bucket.cleaning-fill.cleaning-services-fill.cleaning-services.cleaning.clear-all-fill.clear-all.clear-day-fill.clear-day.climate-mini-split-fill.climate-mini-split.clinical-notes-fill.clinical-notes.clock-arrow-down-fill.clock-arrow-down.clock-arrow-up-fill.clock-arrow-up.clock-loader-10-fill.clock-loader-10.clock-loader-20-fill.clock-loader-20.clock-loader-40-fill.clock-loader-40.clock-loader-60-fill.clock-loader-60.clock-loader-80-fill.clock-loader-80.clock-loader-90-fill.clock-loader-90.close-fill.close-fullscreen-fill.close-fullscreen.close-small-fill.close-small.close.closed-caption-add-fill.closed-caption-add.closed-caption-disabled-fill.closed-caption-disabled.closed-caption-display-fill.closed-caption-display.closed-caption-fill.closed-caption.cloud-alert-fill.cloud-alert.cloud-circle-fill.cloud-circle.cloud-done-fill.cloud-done.cloud-download-fill.cloud-download.cloud-fill.cloud-lock-fill.cloud-lock.cloud-off-fill.cloud-off.cloud-sync-fill.cloud-sync.cloud-upload-fill.cloud-upload.cloud.co-present-fill.co-present.co2-fill.co2.code-blocks-fill.code-blocks.code-fill.code-off-fill.code-off.code-xml-fill.code-xml.code.coffee-fill.coffee-maker-fill.coffee-maker.coffee.cognition-2-fill.cognition-2.cognition-fill.cognition.collapse-all-fill.collapse-all.collapse-content-fill.collapse-content.collections-bookmark-fill.collections-bookmark.colorize-fill.colorize.colors-fill.colors.combine-columns-fill.combine-columns.comedy-mask-fill.comedy-mask.comic-bubble-fill.comic-bubble.comment-bank-fill.comment-bank.comment-fill.comment.comments-disabled-fill.comments-disabled.commit-fill.commit.communication-fill.communication.communities-fill.communities.commute-fill.commute.compare-arrows-fill.compare-arrows.compare-fill.compare.compass-calibration-fill.compass-calibration.component-exchange-fill.component-exchange.compost-fill.compost.compress-fill.compress.computer-arrow-up-fill.computer-arrow-up.computer-cancel-fill.computer-cancel.computer-fill.computer-sound-fill.computer-sound.computer.concierge-fill.concierge.conditions-fill.conditions.confirmation-number-fill.confirmation-number.congenital-fill.congenital.connect-without-contact-fill.connect-without-contact.connected-tv-fill.connected-tv.connecting-airports-fill.connecting-airports.construction-fill.construction.contact-emergency-fill.contact-emergency.contact-mail-fill.contact-mail.contact-page-fill.contact-page.contact-phone-fill.contact-phone.contact-support-fill.contact-support.contactless-fill.contactless-off-fill.contactless-off.contactless.contacts-fill.contacts-product-fill.contacts-product.contacts.content-copy-fill.content-copy.content-cut-fill.content-cut.content-paste-fill.content-paste-go-fill.content-paste-go.content-paste-off-fill.content-paste-off.content-paste-search-fill.content-paste-search.content-paste.contextual-token-add-fill.contextual-token-add.contextual-token-fill.contextual-token.contract-delete-fill.contract-delete.contract-edit-fill.contract-edit.contract-fill.contract.contrast-circle-fill.contrast-circle.contrast-fill.contrast-rtl-off-fill.contrast-rtl-off.contrast-square-fill.contrast-square.contrast.control-camera-fill.control-camera.control-point-duplicate-fill.control-point-duplicate.controller-gen-fill.controller-gen.conversation-fill.conversation.conversion-path-fill.conversion-path-off-fill.conversion-path-off.conversion-path.convert-to-text-fill.convert-to-text.conveyor-belt-fill.conveyor-belt.cookie-fill.cookie-off-fill.cookie-off.cookie.cooking-fill.cooking.cool-to-dry-fill.cool-to-dry.copy-all-fill.copy-all.copyright-fill.copyright.coronavirus-fill.coronavirus.corporate-fare-fill.corporate-fare.cottage-fill.cottage.counter-0-fill.counter-0.counter-1-fill.counter-1.counter-2-fill.counter-2.counter-3-fill.counter-3.counter-4-fill.counter-4.counter-5-fill.counter-5.counter-6-fill.counter-6.counter-7-fill.counter-7.counter-8-fill.counter-8.counter-9-fill.counter-9.countertops-fill.countertops.create-new-folder-fill.create-new-folder.credit-card-clock-fill.credit-card-clock.credit-card-fill.credit-card-gear-fill.credit-card-gear.credit-card-heart-fill.credit-card-heart.credit-card-off-fill.credit-card-off.credit-card.credit-score-fill.credit-score.crib-fill.crib.crisis-alert-fill.crisis-alert.crop-16-9-fill.crop-16-9.crop-2-3-fill.crop-2-3.crop-21-9-fill.crop-21-9.crop-3-2-fill.crop-3-2.crop-5-4-fill.crop-5-4.crop-7-5-fill.crop-7-5.crop-9-16-fill.crop-9-16.crop-fill.crop-free-fill.crop-free.crop-landscape-fill.crop-landscape.crop-portrait-fill.crop-portrait.crop-rotate-fill.crop-rotate.crop-square-fill.crop-square.crop.crossword-fill.crossword.crowdsource-fill.crowdsource.crown-fill.crown.cruelty-free-fill.cruelty-free.css-fill.css.csv-fill.csv.currency-bitcoin-fill.currency-bitcoin.currency-exchange-fill.currency-exchange.currency-franc-fill.currency-franc.currency-lira-fill.currency-lira.currency-pound-fill.currency-pound.currency-ruble-fill.currency-ruble.currency-rupee-circle-fill.currency-rupee-circle.currency-rupee-fill.currency-rupee.currency-yen-fill.currency-yen.currency-yuan-fill.currency-yuan.curtains-closed-fill.curtains-closed.curtains-fill.curtains.custom-typography-fill.custom-typography.cycle-fill.cycle.cyclone-fill.cyclone.dangerous-fill.dangerous.dark-mode-fill.dark-mode.dashboard-2-add-fill.dashboard-2-add.dashboard-2-edit-fill.dashboard-2-edit.dashboard-2-fill.dashboard-2-gear-fill.dashboard-2-gear.dashboard-2.dashboard-customize-fill.dashboard-customize.dashboard-fill.dashboard.data-alert-fill.data-alert.data-array-fill.data-array.data-check-fill.data-check.data-exploration-fill.data-exploration.data-info-alert-fill.data-info-alert.data-loss-prevention-fill.data-loss-prevention.data-object-fill.data-object.data-saver-on-fill.data-saver-on.data-table-fill.data-table.data-thresholding-fill.data-thresholding.data-usage-fill.data-usage.database-fill.database-off-fill.database-off.database-search-fill.database-search.database-upload-fill.database-upload.database.dataset-fill.dataset-linked-fill.dataset-linked.dataset.date-range-fill.date-range.deblur-fill.deblur.deceased-fill.deceased.decimal-decrease-fill.decimal-decrease.decimal-increase-fill.decimal-increase.deck-fill.deck.dehaze-fill.dehaze.delete-fill.delete-forever-fill.delete-forever.delete-history-fill.delete-history.delete-sweep-fill.delete-sweep.delete.delivery-truck-bolt-fill.delivery-truck-bolt.delivery-truck-speed-fill.delivery-truck-speed.demography-fill.demography.density-large-fill.density-large.density-medium-fill.density-medium.density-small-fill.density-small.dentistry-fill.dentistry.departure-board-fill.departure-board.deployed-code-account-fill.deployed-code-account.deployed-code-alert-fill.deployed-code-alert.deployed-code-fill.deployed-code-history-fill.deployed-code-history.deployed-code-update-fill.deployed-code-update.deployed-code.dermatology-fill.dermatology.description-fill.description.deselect-fill.deselect.design-services-fill.design-services.desk-fill.desk.deskphone-fill.deskphone.desktop-access-disabled-fill.desktop-access-disabled.desktop-cloud-fill.desktop-cloud-stack-fill.desktop-cloud-stack.desktop-cloud.desktop-landscape-add-fill.desktop-landscape-add.desktop-landscape-fill.desktop-landscape.desktop-mac-fill.desktop-mac.desktop-portrait-fill.desktop-portrait.desktop-windows-fill.desktop-windows.destruction-fill.destruction.details-fill.details.detection-and-zone-fill.detection-and-zone-off-fill.detection-and-zone-off.detection-and-zone.detector-alarm-fill.detector-alarm.detector-battery-fill.detector-battery.detector-co-fill.detector-co.detector-fill.detector-offline-fill.detector-offline.detector-smoke-fill.detector-smoke.detector-status-fill.detector-status.detector.developer-board-fill.developer-board-off-fill.developer-board-off.developer-board.developer-guide-fill.developer-guide.developer-mode-tv-fill.developer-mode-tv.device-band-fill.device-band.device-hub-fill.device-hub.device-swoosh-star-fill.device-swoosh-star.device-thermostat-fill.device-thermostat.devices-fill.devices-fold-2-fill.devices-fold-2.devices-fold-fill.devices-fold.devices-off-fill.devices-off.devices-other-fill.devices-other.devices-wearables-fill.devices-wearables.devices.dew-point-fill.dew-point.diagnosis-fill.diagnosis.diagonal-line-fill.diagonal-line.dialer-sip-fill.dialer-sip.dialogs-fill.dialogs.dialpad-fill.dialpad.diamond-fill.diamond-shine-fill.diamond-shine.diamond.dictionary-fill.dictionary.difference-fill.difference.digital-out-of-home-fill.digital-out-of-home.digital-wellbeing-fill.digital-wellbeing.dine-heart-fill.dine-heart.dine-in-fill.dine-in.dine-lamp-fill.dine-lamp.dining-fill.dining.dinner-dining-fill.dinner-dining.directions-alt-fill.directions-alt-off-fill.directions-alt-off.directions-alt.directions-bike-fill.directions-bike.directions-boat-fill.directions-boat.directions-bus-fill.directions-bus.directions-car-fill.directions-car.directions-fill.directions-off-fill.directions-off.directions-railway-2-fill.directions-railway-2.directions-railway-fill.directions-railway.directions-run-fill.directions-run.directions-subway-fill.directions-subway.directions-walk-fill.directions-walk.directions.directory-sync-fill.directory-sync.dirty-lens-fill.dirty-lens.disabled-by-default-fill.disabled-by-default.disabled-visible-fill.disabled-visible.disc-full-fill.disc-full.discover-tune-fill.discover-tune.dishwasher-fill.dishwasher-gen-fill.dishwasher-gen.dishwasher.display-add-fill.display-add.display-external-input-fill.display-external-input.display-group-fill.display-group.display-settings-fill.display-settings.distance-fill.distance.diversity-1-fill.diversity-1.diversity-2-fill.diversity-2.diversity-3-fill.diversity-3.diversity-4-fill.diversity-4.dns-fill.dns.do-not-disturb-off-fill.do-not-disturb-off.do-not-disturb-on-fill.do-not-disturb-on-total-silence-fill.do-not-disturb-on-total-silence.do-not-disturb-on.do-not-step-fill.do-not-step.do-not-touch-fill.do-not-touch.dock-to-bottom-fill.dock-to-bottom.dock-to-left-fill.dock-to-left.dock-to-right-fill.dock-to-right.docs-add-on-fill.docs-add-on.docs-apps-script-fill.docs-apps-script.docs-fill.docs.document-scanner-fill.document-scanner.document-search-fill.document-search.document-share-fill.document-share.domain-add-fill.domain-add.domain-disabled-check-fill.domain-disabled-check.domain-disabled-fill.domain-disabled.domain-fill.domain-verification-fill.domain-verification-off-fill.domain-verification-off.domain-verification.domain.domino-mask-fill.domino-mask.done-all-fill.done-all.done-outline-fill.done-outline.donut-large-fill.donut-large.donut-small-fill.donut-small.door-back-fill.door-back.door-front-fill.door-front.door-open-fill.door-open.door-sensor-fill.door-sensor.door-sliding-fill.door-sliding.doorbell-3p-fill.doorbell-3p.doorbell-chime-fill.doorbell-chime.doorbell-fill.doorbell.double-arrow-fill.double-arrow.downhill-skiing-fill.downhill-skiing.download-2-fill.download-2.download-done-fill.download-done.download-fill.download-for-offline-fill.download-for-offline.download.downloading-fill.downloading.draft-fill.draft-orders-fill.draft-orders.draft.drafts-fill.drafts.drag-click-fill.drag-click.drag-handle-fill.drag-handle.drag-indicator-fill.drag-indicator.drag-pan-fill.drag-pan.draw-abstract-fill.draw-abstract.draw-collage-fill.draw-collage.draw-fill.draw.dresser-fill.dresser.drive-export-fill.drive-export.drive-file-move-fill.drive-file-move.drive-file-rename-fill.drive-file-rename.drive-folder-upload-fill.drive-folder-upload.drone-2-fill.drone-2.drone-fill.drone.dropdown-fill.dropdown-menu-fill.dropdown-menu.dropdown.dropper-eye-fill.dropper-eye.dry-cleaning-fill.dry-cleaning.dry-fill.dry.dual-screen-fill.dual-screen.duo-fill.duo.dvr-fill.dvr.dynamic-feed-fill.dynamic-feed.dynamic-form-fill.dynamic-form.e-mobiledata-badge-fill.e-mobiledata-badge.e-mobiledata-fill.e-mobiledata.e911-avatar-fill.e911-avatar.e911-emergency-fill.e911-emergency.ear-sound-fill.ear-sound.earbud-case-fill.earbud-case.earbud-left-fill.earbud-left.earbud-right-fill.earbud-right.earbuds-2-fill.earbuds-2.earbuds-battery-fill.earbuds-battery.earbuds-fill.earbuds.early-on-fill.early-on.earthquake-fill.earthquake.east-fill.east.ecg-fill.ecg-heart-fill.ecg-heart.ecg.eco-fill.eco.eda-fill.eda.edit-arrow-down-fill.edit-arrow-down.edit-arrow-up-fill.edit-arrow-up.edit-attributes-fill.edit-attributes.edit-audio-fill.edit-audio.edit-calendar-fill.edit-calendar.edit-document-fill.edit-document.edit-fill.edit-line-fill.edit-line.edit-location-alt-fill.edit-location-alt.edit-location-fill.edit-location.edit-note-fill.edit-note.edit-notifications-fill.edit-notifications.edit-off-fill.edit-off.edit-road-fill.edit-road.edit-square-fill.edit-square.edit.editor-choice-fill.editor-choice.egg-alt-fill.egg-alt.egg-fill.egg.eject-fill.eject.elderly-fill.elderly-woman-fill.elderly-woman.elderly.electric-bike-fill.electric-bike.electric-bolt-fill.electric-bolt.electric-car-fill.electric-car.electric-meter-fill.electric-meter.electric-moped-fill.electric-moped.electric-rickshaw-fill.electric-rickshaw.electric-scooter-fill.electric-scooter.electrical-services-fill.electrical-services.elevation-fill.elevation.elevator-fill.elevator.emergency-fill.emergency-heat-2-fill.emergency-heat-2.emergency-heat-fill.emergency-heat.emergency-home-fill.emergency-home.emergency-recording-fill.emergency-recording.emergency-share-fill.emergency-share-off-fill.emergency-share-off.emergency-share.emergency.emoji-food-beverage-fill.emoji-food-beverage.emoji-language-fill.emoji-language.emoji-nature-fill.emoji-nature.emoji-objects-fill.emoji-objects.emoji-people-fill.emoji-people.emoji-symbols-fill.emoji-symbols.emoji-transportation-fill.emoji-transportation.emoticon-fill.emoticon.empty-dashboard-fill.empty-dashboard.enable-fill.enable.encrypted-add-circle-fill.encrypted-add-circle.encrypted-add-fill.encrypted-add.encrypted-fill.encrypted-minus-circle-fill.encrypted-minus-circle.encrypted-off-fill.encrypted-off.encrypted.endocrinology-fill.endocrinology.energy-fill.energy-program-saving-fill.energy-program-saving.energy-program-time-used-fill.energy-program-time-used.energy-savings-leaf-fill.energy-savings-leaf.energy.engineering-fill.engineering.enhanced-encryption-fill.enhanced-encryption.ent-fill.ent.enterprise-fill.enterprise-off-fill.enterprise-off.enterprise.equal-fill.equal.equalizer-fill.equalizer.eraser-size-1-fill.eraser-size-1.eraser-size-2-fill.eraser-size-2.eraser-size-3-fill.eraser-size-3.eraser-size-4-fill.eraser-size-4.eraser-size-5-fill.eraser-size-5.error-fill.error-med-fill.error-med.error.escalator-fill.escalator-warning-fill.escalator-warning.escalator.euro-fill.euro-symbol-fill.euro-symbol.euro.ev-mobiledata-badge-fill.ev-mobiledata-badge.ev-shadow-add-fill.ev-shadow-add.ev-shadow-fill.ev-shadow-minus-fill.ev-shadow-minus.ev-shadow.ev-station-fill.ev-station.event-available-fill.event-available.event-busy-fill.event-busy.event-fill.event-list-fill.event-list.event-note-fill.event-note.event-repeat-fill.event-repeat.event-seat-fill.event-seat.event-upcoming-fill.event-upcoming.event.exclamation-fill.exclamation.exercise-fill.exercise.exit-to-app-fill.exit-to-app.expand-all-fill.expand-all.expand-circle-down-fill.expand-circle-down.expand-circle-right-fill.expand-circle-right.expand-circle-up-fill.expand-circle-up.expand-content-fill.expand-content.expand-fill.expand.expansion-panels-fill.expansion-panels.experiment-fill.experiment.explicit-fill.explicit.explore-fill.explore-nearby-fill.explore-nearby.explore-off-fill.explore-off.explore.explosion-fill.explosion.export-notes-fill.export-notes.exposure-fill.exposure-neg-1-fill.exposure-neg-1.exposure-neg-2-fill.exposure-neg-2.exposure-plus-1-fill.exposure-plus-1.exposure-plus-2-fill.exposure-plus-2.exposure-zero-fill.exposure-zero.exposure.extension-fill.extension-off-fill.extension-off.extension.eye-tracking-fill.eye-tracking.eyebrow-fill.eyebrow.eyeglasses-2-fill.eyeglasses-2-sound-fill.eyeglasses-2-sound.eyeglasses-2.eyeglasses-3-fill.eyeglasses-3.eyeglasses-fill.eyeglasses.face-2-fill.face-2.face-3-fill.face-3.face-4-fill.face-4.face-5-fill.face-5.face-6-fill.face-6.face-down-fill.face-down.face-fill.face-left-fill.face-left.face-nod-fill.face-nod.face-retouching-off-fill.face-retouching-off.face-right-fill.face-right.face-shake-fill.face-shake.face-up-fill.face-up.face.fact-check-fill.fact-check.factory-fill.factory.falling-fill.falling.familiar-face-and-zone-fill.familiar-face-and-zone.family-group-fill.family-group.family-history-fill.family-history.family-home-fill.family-home.family-link-fill.family-link.family-restroom-fill.family-restroom.family-star-fill.family-star.fan-focus-fill.fan-focus.fan-indirect-fill.fan-indirect.farsight-digital-fill.farsight-digital.fast-forward-fill.fast-forward.fast-rewind-fill.fast-rewind.fastfood-fill.fastfood.faucet-fill.faucet.favorite-fill.favorite.fax-fill.fax.feature-search-fill.feature-search.featured-play-list-fill.featured-play-list.featured-seasonal-and-gifts-fill.featured-seasonal-and-gifts.featured-video-fill.featured-video.feedback-fill.feedback.female-fill.female.femur-alt-fill.femur-alt.femur-fill.femur.fence-fill.fence.fertile-fill.fertile.festival-fill.festival.fiber-dvr-fill.fiber-dvr.fiber-manual-record-fill.fiber-manual-record.fiber-new-fill.fiber-new.fiber-pin-fill.fiber-pin.fiber-smart-record-fill.fiber-smart-record.file-copy-fill.file-copy-off-fill.file-copy-off.file-copy.file-download-off-fill.file-download-off.file-export-fill.file-export.file-json-fill.file-json.file-map-stack-fill.file-map-stack.file-open-fill.file-open.file-png-fill.file-png.file-present-fill.file-present.file-save-fill.file-save-off-fill.file-save-off.file-save.file-upload-off-fill.file-upload-off.files-fill.files.filter-1-fill.filter-1.filter-2-fill.filter-2.filter-3-fill.filter-3.filter-4-fill.filter-4.filter-5-fill.filter-5.filter-6-fill.filter-6.filter-7-fill.filter-7.filter-8-fill.filter-8.filter-9-fill.filter-9-plus-fill.filter-9-plus.filter-9.filter-alt-fill.filter-alt-off-fill.filter-alt-off.filter-alt.filter-arrow-right-fill.filter-arrow-right.filter-b-and-w-fill.filter-b-and-w.filter-cancel-fill.filter-cancel.filter-center-focus-fill.filter-center-focus.filter-drama-fill.filter-drama.filter-fill.filter-frames-fill.filter-frames.filter-list-fill.filter-list-off-fill.filter-list-off.filter-list.filter-none-fill.filter-none.filter-plus-fill.filter-plus.filter-retrolux-fill.filter-retrolux.filter-tilt-shift-fill.filter-tilt-shift.filter-vintage-fill.filter-vintage.filter.finance-chip-fill.finance-chip.finance-fill.finance-mode-fill.finance-mode.finance.find-in-page-fill.find-in-page.find-replace-fill.find-replace.fingerprint-fill.fingerprint-off-fill.fingerprint-off.fingerprint.fire-check-fill.fire-check.fire-extinguisher-fill.fire-extinguisher.fire-hydrant-fill.fire-hydrant.fire-truck-fill.fire-truck.fireplace-fill.fireplace.first-page-fill.first-page.fit-page-fill.fit-page-height-fill.fit-page-height.fit-page-width-fill.fit-page-width.fit-page.fit-screen-fill.fit-screen.fit-width-fill.fit-width.fitness-center-fill.fitness-center.fitness-tracker-fill.fitness-tracker.fitness-trackers-fill.fitness-trackers.flag-2-fill.flag-2.flag-check-fill.flag-check.flag-circle-fill.flag-circle.flag-fill.flag.flaky-fill.flaky.flare-fill.flare.flash-auto-fill.flash-auto.flash-off-fill.flash-off.flash-on-fill.flash-on.flashlight-off-fill.flashlight-off.flashlight-on-fill.flashlight-on.flatware-fill.flatware.flex-direction-fill.flex-direction.flex-no-wrap-fill.flex-no-wrap.flex-wrap-fill.flex-wrap.flight-class-fill.flight-class.flight-fill.flight-land-fill.flight-land.flight-takeoff-fill.flight-takeoff.flight.flights-and-hotels-fill.flights-and-hotels.flip-camera-android-fill.flip-camera-android.flip-camera-ios-fill.flip-camera-ios.flip-fill.flip-to-back-fill.flip-to-back.flip-to-front-fill.flip-to-front.flip.float-landscape-2-fill.float-landscape-2.float-portrait-2-fill.float-portrait-2.flood-fill.flood.floor-fill.floor-lamp-fill.floor-lamp.floor.flowchart-fill.flowchart.flowsheet-fill.flowsheet.fluid-balance-fill.fluid-balance.fluid-fill.fluid-med-fill.fluid-med.fluid.fluorescent-fill.fluorescent.flutter-dash-fill.flutter-dash.flutter-fill.flutter.flyover-fill.flyover.fmd-bad-fill.fmd-bad.foggy-fill.foggy.folded-hands-fill.folded-hands.folder-check-2-fill.folder-check-2.folder-check-fill.folder-check.folder-code-fill.folder-code.folder-copy-fill.folder-copy.folder-data-fill.folder-data.folder-delete-fill.folder-delete.folder-eye-fill.folder-eye.folder-fill.folder-info-fill.folder-info.folder-limited-fill.folder-limited.folder-managed-fill.folder-managed.folder-match-fill.folder-match.folder-off-fill.folder-off.folder-open-fill.folder-open.folder-shared-fill.folder-shared.folder-special-fill.folder-special.folder-supervised-fill.folder-supervised.folder-zip-fill.folder-zip.folder.follow-the-signs-fill.follow-the-signs.font-download-fill.font-download-off-fill.font-download-off.font-download.food-bank-fill.food-bank.foot-bones-fill.foot-bones.footprint-fill.footprint.for-you-fill.for-you.forest-fill.forest.fork-chart-fill.fork-chart.fork-left-fill.fork-left.fork-right-fill.fork-right.fork-spoon-fill.fork-spoon.forklift-fill.forklift.format-align-center-fill.format-align-center.format-align-justify-fill.format-align-justify.format-align-left-fill.format-align-left.format-align-right-fill.format-align-right.format-bold-fill.format-bold.format-clear-fill.format-clear.format-color-fill-fill.format-color-fill.format-color-reset-fill.format-color-reset.format-color-text-fill.format-color-text.format-h1-fill.format-h1.format-h2-fill.format-h2.format-h3-fill.format-h3.format-h4-fill.format-h4.format-h5-fill.format-h5.format-h6-fill.format-h6.format-image-back-fill.format-image-back.format-image-break-left-fill.format-image-break-left.format-image-break-right-fill.format-image-break-right.format-image-front-fill.format-image-front.format-image-inline-left-fill.format-image-inline-left.format-image-inline-right-fill.format-image-inline-right.format-image-left-fill.format-image-left.format-image-right-fill.format-image-right.format-indent-decrease-fill.format-indent-decrease.format-indent-increase-fill.format-indent-increase.format-ink-highlighter-fill.format-ink-highlighter.format-italic-fill.format-italic.format-letter-spacing-2-fill.format-letter-spacing-2.format-letter-spacing-fill.format-letter-spacing-standard-fill.format-letter-spacing-standard.format-letter-spacing-wide-fill.format-letter-spacing-wide.format-letter-spacing-wider-fill.format-letter-spacing-wider.format-letter-spacing.format-line-spacing-fill.format-line-spacing.format-list-bulleted-add-fill.format-list-bulleted-add.format-list-bulleted-fill.format-list-bulleted.format-list-numbered-fill.format-list-numbered-rtl-fill.format-list-numbered-rtl.format-list-numbered.format-overline-fill.format-overline.format-paint-fill.format-paint-off-fill.format-paint-off.format-paint.format-paragraph-fill.format-paragraph.format-quote-fill.format-quote-off-fill.format-quote-off.format-quote.format-shapes-fill.format-shapes.format-size-fill.format-size.format-strikethrough-fill.format-strikethrough.format-text-clip-fill.format-text-clip.format-text-overflow-fill.format-text-overflow.format-text-wrap-fill.format-text-wrap.format-textdirection-l-to-r-fill.format-textdirection-l-to-r.format-textdirection-r-to-l-fill.format-textdirection-r-to-l.format-textdirection-vertical-fill.format-textdirection-vertical.format-underlined-fill.format-underlined-squiggle-fill.format-underlined-squiggle.format-underlined.forms-add-on-fill.forms-add-on.forms-apps-script-fill.forms-apps-script.fort-fill.fort.forum-fill.forum.forward-10-fill.forward-10.forward-30-fill.forward-30.forward-5-fill.forward-5.forward-circle-fill.forward-circle.forward-fill.forward-media-fill.forward-media.forward-to-inbox-fill.forward-to-inbox.forward.foundation-fill.foundation.fragrance-fill.fragrance.frame-bug-fill.frame-bug.frame-exclamation-fill.frame-exclamation.frame-inspect-fill.frame-inspect.frame-person-fill.frame-person-mic-fill.frame-person-mic.frame-person-off-fill.frame-person-off.frame-person.frame-reload-fill.frame-reload.frame-source-fill.frame-source.free-cancellation-fill.free-cancellation.front-hand-fill.front-hand.front-loader-fill.front-loader.full-coverage-fill.full-coverage.full-hd-fill.full-hd.full-stacked-bar-chart-fill.full-stacked-bar-chart.fullscreen-exit-fill.fullscreen-exit.fullscreen-fill.fullscreen-portrait-fill.fullscreen-portrait.fullscreen.function-fill.function-search-fill.function-search.function.functions-fill.functions.funicular-fill.funicular.g-mobiledata-badge-fill.g-mobiledata-badge.g-mobiledata-fill.g-mobiledata.g-translate-fill.g-translate.gallery-thumbnail-fill.gallery-thumbnail.game-bumper-left-fill.game-bumper-left.game-bumper-right-fill.game-bumper-right.game-button-l-fill.game-button-l.game-button-l1-fill.game-button-l1.game-button-l2-fill.game-button-l2.game-button-r-fill.game-button-r.game-button-r1-fill.game-button-r1.game-button-r2-fill.game-button-r2.game-button-zl-fill.game-button-zl.game-button-zr-fill.game-button-zr.game-stick-l3-fill.game-stick-l3.game-stick-left-fill.game-stick-left.game-stick-r3-fill.game-stick-r3.game-stick-right-fill.game-stick-right.game-trigger-left-fill.game-trigger-left.game-trigger-right-fill.game-trigger-right.gamepad-circle-down-fill.gamepad-circle-down.gamepad-circle-left-fill.gamepad-circle-left.gamepad-circle-right-fill.gamepad-circle-right.gamepad-circle-up-fill.gamepad-circle-up.gamepad-down-fill.gamepad-down.gamepad-fill.gamepad-left-fill.gamepad-left.gamepad-right-fill.gamepad-right.gamepad-up-fill.gamepad-up.gamepad.garage-check-fill.garage-check.garage-door-fill.garage-door-open-fill.garage-door-open.garage-door.garage-fill.garage-home-fill.garage-home.garage-money-fill.garage-money.garage.garden-cart-fill.garden-cart.gas-meter-fill.gas-meter.gastroenterology-fill.gastroenterology.gate-fill.gate.gavel-fill.gavel.general-device-fill.general-device.genetics-fill.genetics.genres-fill.genres.gesture-fill.gesture-select-fill.gesture-select.gesture.gif-2-fill.gif-2.gif-box-fill.gif-box.gif-fill.gif.girl-fill.girl.gite-fill.gite.glass-cup-fill.glass-cup.globe-2-cancel-fill.globe-2-cancel.globe-2-question-fill.globe-2-question.globe-asia-fill.globe-asia.globe-book-fill.globe-book.globe-clock-fill.globe-clock.globe-fill.globe-location-pin-fill.globe-location-pin.globe-uk-fill.globe-uk.globe.glucose-fill.glucose.glyphs-fill.glyphs.go-to-line-fill.go-to-line.golf-course-fill.golf-course.gondola-lift-fill.gondola-lift.google-home-devices-fill.google-home-devices.google-tv-remote-fill.google-tv-remote.google-wifi-fill.google-wifi.gpp-bad-fill.gpp-bad.gpp-maybe-fill.gpp-maybe.gradient-fill.gradient.grading-fill.grading.grain-fill.grain.graph-1-fill.graph-1.graph-2-fill.graph-2.graph-3-fill.graph-3.graph-4-fill.graph-4.graph-5-fill.graph-5.graph-6-fill.graph-6.graph-7-fill.graph-7.graph-8-fill.graph-8.graphic-eq-fill.graphic-eq-off-fill.graphic-eq-off.graphic-eq.grass-fill.grass.grid-3x3-fill.grid-3x3-off-fill.grid-3x3-off.grid-3x3.grid-4x4-fill.grid-4x4.grid-goldenratio-fill.grid-goldenratio.grid-guides-fill.grid-guides.grid-layout-side-fill.grid-layout-side.grid-off-fill.grid-off.grid-on-fill.grid-on.grid-view-fill.grid-view.grocery-fill.grocery.group-add-fill.group-add.group-eye-fill.group-eye.group-fill.group-off-fill.group-off.group-remove-fill.group-remove.group-search-fill.group-search.group-work-fill.group-work.group.grouped-bar-chart-fill.grouped-bar-chart.groups-2-fill.groups-2.groups-3-fill.groups-3.groups-fill.groups.guardian-fill.guardian.gynecology-fill.gynecology.h-mobiledata-badge-fill.h-mobiledata-badge.h-mobiledata-fill.h-mobiledata.h-plus-mobiledata-badge-fill.h-plus-mobiledata-badge.h-plus-mobiledata-fill.h-plus-mobiledata.hail-fill.hail.hallway-fill.hallway.hanami-dango-fill.hanami-dango.hand-bones-fill.hand-bones.hand-gesture-fill.hand-gesture-off-fill.hand-gesture-off.hand-gesture.hand-meal-fill.hand-meal.hand-package-fill.hand-package.handheld-controller-fill.handheld-controller.handshake-fill.handshake.handyman-fill.handyman.hangout-video-fill.hangout-video-off-fill.hangout-video-off.hangout-video.hard-disk-fill.hard-disk.hard-drive-2-fill.hard-drive-2.hard-drive-fill.hard-drive.hardware-fill.hardware.hd-fill.hd.hdr-auto-fill.hdr-auto-select-fill.hdr-auto-select.hdr-auto.hdr-enhanced-select-fill.hdr-enhanced-select.hdr-off-fill.hdr-off-select-fill.hdr-off-select.hdr-off.hdr-on-fill.hdr-on-select-fill.hdr-on-select.hdr-on.hdr-plus-fill.hdr-plus-off-fill.hdr-plus-off.hdr-plus.hdr-strong-fill.hdr-strong.hdr-weak-fill.hdr-weak.head-mounted-device-fill.head-mounted-device.headphones-battery-fill.headphones-battery.headphones-fill.headphones.headset-mic-fill.headset-mic.headset-off-fill.headset-off.healing-fill.healing.health-and-beauty-fill.health-and-beauty.health-and-safety-fill.health-and-safety.health-cross-fill.health-cross.health-metrics-fill.health-metrics.heap-snapshot-large-fill.heap-snapshot-large.heap-snapshot-multiple-fill.heap-snapshot-multiple.heap-snapshot-thumbnail-fill.heap-snapshot-thumbnail.hearing-aid-disabled-fill.hearing-aid-disabled-left-fill.hearing-aid-disabled-left.hearing-aid-disabled.hearing-aid-fill.hearing-aid-left-fill.hearing-aid-left.hearing-aid.hearing-disabled-fill.hearing-disabled.hearing-fill.hearing.heart-broken-fill.heart-broken.heart-check-fill.heart-check.heart-minus-fill.heart-minus.heart-plus-fill.heart-plus.heart-smile-fill.heart-smile.heat-fill.heat-pump-balance-fill.heat-pump-balance.heat-pump-fill.heat-pump.heat.height-fill.height.helicopter-fill.helicopter.help-center-fill.help-center.help-clinic-fill.help-clinic.help-fill.help.hematology-fill.hematology.hevc-fill.hevc.hexagon-fill.hexagon.hide-fill.hide-image-fill.hide-image.hide-source-fill.hide-source.hide.high-chair-fill.high-chair.high-density-fill.high-density.high-quality-fill.high-quality-off-fill.high-quality-off.high-quality.high-res-fill.high-res.highlight-fill.highlight-keyboard-focus-fill.highlight-keyboard-focus.highlight-mouse-cursor-fill.highlight-mouse-cursor.highlight-text-cursor-fill.highlight-text-cursor.highlight.highlighter-size-1-fill.highlighter-size-1.highlighter-size-2-fill.highlighter-size-2.highlighter-size-3-fill.highlighter-size-3.highlighter-size-4-fill.highlighter-size-4.highlighter-size-5-fill.highlighter-size-5.hiking-fill.hiking.history-2-fill.history-2.history-edu-fill.history-edu.history-fill.history-off-fill.history-off.history-toggle-off-fill.history-toggle-off.history.hive-fill.hive.hls-fill.hls-off-fill.hls-off.hls.holiday-village-fill.holiday-village.home-and-garden-fill.home-and-garden.home-app-logo-fill.home-app-logo.home-fill.home-health-fill.home-health.home-improvement-and-tools-fill.home-improvement-and-tools.home-iot-device-fill.home-iot-device.home-max-dots-fill.home-max-dots.home-max-fill.home-max.home-mini-fill.home-mini.home-pin-fill.home-pin.home-repair-service-fill.home-repair-service.home-speaker-fill.home-speaker.home-storage-fill.home-storage-gear-fill.home-storage-gear.home-storage.home-work-fill.home-work.home.horizontal-align-center-fill.horizontal-align-center.horizontal-align-left-fill.horizontal-align-left.horizontal-align-right-fill.horizontal-align-right.horizontal-distribute-fill.horizontal-distribute.horizontal-rule-fill.horizontal-rule.horizontal-split-fill.horizontal-split.host-fill.host.hot-tub-fill.hot-tub.hotel-class-fill.hotel-class.hotel-fill.hotel.hourglass-arrow-down-fill.hourglass-arrow-down.hourglass-arrow-up-fill.hourglass-arrow-up.hourglass-bottom-fill.hourglass-bottom.hourglass-check-fill.hourglass-check.hourglass-disabled-fill.hourglass-disabled.hourglass-empty-fill.hourglass-empty.hourglass-fill.hourglass-pause-fill.hourglass-pause.hourglass-top-fill.hourglass-top.hourglass.house-fill.house-siding-fill.house-siding.house-with-shield-fill.house-with-shield.house.houseboat-fill.houseboat.household-supplies-fill.household-supplies.hov-fill.hov.how-to-reg-fill.how-to-reg.how-to-vote-fill.how-to-vote.hr-resting-fill.hr-resting.html-fill.html.http-fill.http.hub-fill.hub.humerus-alt-fill.humerus-alt.humerus-fill.humerus.humidity-high-fill.humidity-high.humidity-indoor-fill.humidity-indoor.humidity-low-fill.humidity-low.humidity-mid-fill.humidity-mid.humidity-percentage-fill.humidity-percentage.hvac-fill.hvac-max-defrost-fill.hvac-max-defrost.hvac.ice-skating-fill.ice-skating.icecream-fill.icecream.id-card-2-fill.id-card-2.id-card-fill.id-card.identity-aware-proxy-fill.identity-aware-proxy.identity-platform-fill.identity-platform.ifl-fill.ifl.iframe-fill.iframe-off-fill.iframe-off.iframe.image-arrow-up-fill.image-arrow-up.image-aspect-ratio-fill.image-aspect-ratio.image-fill.image-inset-fill.image-inset.image-search-fill.image-search.image.imagesearch-roller-fill.imagesearch-roller.imagesmode-fill.imagesmode.immunology-fill.immunology.import-contacts-fill.import-contacts.important-devices-fill.important-devices.in-home-mode-fill.in-home-mode.inactive-order-fill.inactive-order.inbox-customize-fill.inbox-customize.inbox-fill.inbox-text-asterisk-fill.inbox-text-asterisk.inbox-text-fill.inbox-text-person-fill.inbox-text-person.inbox-text-share-fill.inbox-text-share.inbox-text.inbox.incomplete-circle-fill.incomplete-circle.indeterminate-check-box-fill.indeterminate-check-box.indeterminate-question-box-fill.indeterminate-question-box.info-fill.info-i-fill.info-i.info.infrared-fill.infrared.ink-eraser-fill.ink-eraser-off-fill.ink-eraser-off.ink-eraser.ink-highlighter-fill.ink-highlighter-move-fill.ink-highlighter-move.ink-highlighter-off-fill.ink-highlighter-off.ink-highlighter.ink-marker-fill.ink-marker.ink-pen-fill.ink-pen.ink-selection-fill.ink-selection.inpatient-fill.inpatient.input-circle-fill.input-circle.input-fill.input.insert-chart-fill.insert-chart.insert-page-break-fill.insert-page-break.insert-text-fill.insert-text.install-desktop-fill.install-desktop.instant-mix-fill.instant-mix.integration-instructions-fill.integration-instructions.interactive-space-fill.interactive-space.interests-fill.interests.interpreter-mode-fill.interpreter-mode.inventory-2-fill.inventory-2.inventory-fill.inventory.invert-colors-fill.invert-colors-off-fill.invert-colors-off.invert-colors.ios-fill.ios-share-fill.ios-share.ios.iron-fill.iron.jamboard-kiosk-fill.jamboard-kiosk.japanese-curry-fill.japanese-curry.japanese-flag-fill.japanese-flag.javascript-fill.javascript.jewelry-fill.jewelry.join-fill.join-inner-fill.join-inner.join-left-fill.join-left.join-right-fill.join-right.join.joystick-fill.joystick.jump-to-element-fill.jump-to-element.kanji-alcohol-fill.kanji-alcohol.kayaking-fill.kayaking.kebab-dining-fill.kebab-dining.keep-fill.keep-off-fill.keep-off.keep-public-fill.keep-public.keep.kettle-fill.kettle.key-fill.key-off-fill.key-off.key-vertical-fill.key-vertical.key-visualizer-fill.key-visualizer.key.keyboard-alt-fill.keyboard-alt.keyboard-arrow-down-fill.keyboard-arrow-down.keyboard-arrow-left-fill.keyboard-arrow-left.keyboard-arrow-right-fill.keyboard-arrow-right.keyboard-arrow-up-fill.keyboard-arrow-up.keyboard-backspace-fill.keyboard-backspace.keyboard-capslock-badge-fill.keyboard-capslock-badge.keyboard-capslock-fill.keyboard-capslock.keyboard-command-key-fill.keyboard-command-key.keyboard-control-key-fill.keyboard-control-key.keyboard-double-arrow-down-fill.keyboard-double-arrow-down.keyboard-double-arrow-left-fill.keyboard-double-arrow-left.keyboard-double-arrow-right-fill.keyboard-double-arrow-right.keyboard-double-arrow-up-fill.keyboard-double-arrow-up.keyboard-external-input-fill.keyboard-external-input.keyboard-fill.keyboard-full-fill.keyboard-full.keyboard-hide-fill.keyboard-hide.keyboard-keys-fill.keyboard-keys.keyboard-lock-fill.keyboard-lock-off-fill.keyboard-lock-off.keyboard-lock.keyboard-off-fill.keyboard-off.keyboard-onscreen-fill.keyboard-onscreen.keyboard-option-key-fill.keyboard-option-key.keyboard-previous-language-fill.keyboard-previous-language.keyboard-return-fill.keyboard-return.keyboard-tab-fill.keyboard-tab-rtl-fill.keyboard-tab-rtl.keyboard-tab.keyboard.kid-star-fill.kid-star.king-bed-fill.king-bed.kitchen-fill.kitchen.kitesurfing-fill.kitesurfing.lab-panel-fill.lab-panel.lab-profile-fill.lab-profile.lab-research-fill.lab-research.label-fill.label-important-fill.label-important.label-off-fill.label-off.label.labs-fill.labs.lan-fill.lan.landscape-2-edit-fill.landscape-2-edit.landscape-2-fill.landscape-2-off-fill.landscape-2-off.landscape-2.landscape-fill.landscape.landslide-fill.landslide.language-chinese-array-fill.language-chinese-array.language-chinese-cangjie-fill.language-chinese-cangjie.language-chinese-dayi-fill.language-chinese-dayi.language-chinese-pinyin-fill.language-chinese-pinyin.language-chinese-quick-fill.language-chinese-quick.language-chinese-wubi-fill.language-chinese-wubi.language-fill.language-french-fill.language-french.language-gb-english-fill.language-gb-english.language-international-fill.language-international.language-japanese-kana-fill.language-japanese-kana.language-korean-latin-fill.language-korean-latin.language-pinyin-fill.language-pinyin.language-spanish-fill.language-spanish.language-us-colemak-fill.language-us-colemak.language-us-dvorak-fill.language-us-dvorak.language-us-fill.language-us.language.laps-fill.laps.laptop-car-fill.laptop-car.laptop-chromebook-fill.laptop-chromebook.laptop-mac-fill.laptop-mac.laptop-windows-fill.laptop-windows.lasso-select-fill.lasso-select.last-page-fill.last-page.laundry-fill.laundry.layers-clear-fill.layers-clear.layers-fill.layers.lda-fill.lda.leaderboard-fill.leaderboard.leak-add-fill.leak-add.leak-remove-fill.leak-remove.left-click-fill.left-click.left-panel-close-fill.left-panel-close.left-panel-open-fill.left-panel-open.legend-toggle-fill.legend-toggle.lens-blur-fill.lens-blur.letter-switch-fill.letter-switch.library-add-check-fill.library-add-check.library-add-fill.library-add.library-books-fill.library-books.library-music-fill.library-music.license-fill.license.lift-to-talk-fill.lift-to-talk.light-fill.light-group-2-fill.light-group-2.light-group-fill.light-group.light-mode-auto-fill.light-mode-auto.light-mode-fill.light-mode.light-off-fill.light-off.light.lightbulb-2-fill.lightbulb-2.lightbulb-circle-fill.lightbulb-circle.lightbulb-fill.lightbulb.lightning-stand-fill.lightning-stand.lightstrip-fill.lightstrip.line-axis-fill.line-axis.line-curve-fill.line-curve.line-end-arrow-fill.line-end-arrow-notch-fill.line-end-arrow-notch.line-end-arrow.line-end-circle-fill.line-end-circle.line-end-diamond-fill.line-end-diamond.line-end-fill.line-end-square-fill.line-end-square.line-end.line-start-arrow-fill.line-start-arrow-notch-fill.line-start-arrow-notch.line-start-arrow.line-start-circle-fill.line-start-circle.line-start-diamond-fill.line-start-diamond.line-start-fill.line-start-square-fill.line-start-square.line-start.line-style-fill.line-style.line-weight-fill.line-weight.linear-scale-fill.linear-scale.link-2-fill.link-2.link-fill.link-off-fill.link-off.link.linked-camera-fill.linked-camera.linked-services-fill.linked-services.lips-fill.lips.liquor-fill.liquor.list-2-fill.list-2.list-alt-add-fill.list-alt-add.list-alt-check-fill.list-alt-check.list-alt-fill.list-alt.list-arrow-fill.list-arrow.list-fill.list.lists-fill.lists.live-help-fill.live-help.live-tv-fill.live-tv.living-fill.living.local-activity-fill.local-activity.local-atm-fill.local-atm.local-bar-fill.local-bar.local-cafe-fill.local-cafe.local-car-wash-fill.local-car-wash.local-convenience-store-fill.local-convenience-store.local-dining-fill.local-dining.local-drink-fill.local-drink.local-fire-department-fill.local-fire-department.local-florist-fill.local-florist.local-gas-station-fill.local-gas-station.local-hospital-fill.local-hospital.local-laundry-service-fill.local-laundry-service.local-library-fill.local-library.local-mall-fill.local-mall.local-parking-fill.local-parking.local-pharmacy-fill.local-pharmacy.local-pizza-fill.local-pizza.local-police-fill.local-police.local-post-office-fill.local-post-office.local-see-fill.local-see.local-shipping-fill.local-shipping.local-taxi-fill.local-taxi.location-away-fill.location-away.location-chip-fill.location-chip.location-city-fill.location-city.location-disabled-fill.location-disabled.location-home-fill.location-home.location-off-fill.location-off.location-on-fill.location-on.location-searching-fill.location-searching.lock-clock-fill.lock-clock.lock-fill.lock-open-circle-fill.lock-open-circle.lock-open-fill.lock-open-right-fill.lock-open-right.lock-open.lock-person-fill.lock-person.lock-reset-fill.lock-reset.lock.login-fill.login.logo-dev-fill.logo-dev.logout-fill.logout.looks-0-fill.looks-0.looks-3-fill.looks-3.looks-4-fill.looks-4.looks-5-fill.looks-5.looks-6-fill.looks-6.looks-7-fill.looks-7.looks-8-fill.looks-8.looks-9-fill.looks-9.looks-fill.looks-one-fill.looks-one.looks-two-fill.looks-two.looks.loupe-fill.loupe.low-density-fill.low-density.low-priority-fill.low-priority.lowercase-fill.lowercase.loyalty-fill.loyalty.lte-mobiledata-badge-fill.lte-mobiledata-badge.lte-mobiledata-fill.lte-mobiledata.lte-plus-mobiledata-badge-fill.lte-plus-mobiledata-badge.lte-plus-mobiledata-fill.lte-plus-mobiledata.luggage-fill.luggage.lunch-dining-fill.lunch-dining.lyrics-fill.lyrics.macro-auto-fill.macro-auto.macro-off-fill.macro-off.magnification-large-fill.magnification-large.magnification-small-fill.magnification-small.magnify-docked-fill.magnify-docked.magnify-fullscreen-fill.magnify-fullscreen.mail-asterisk-fill.mail-asterisk.mail-fill.mail-lock-fill.mail-lock.mail-off-fill.mail-off.mail-shield-fill.mail-shield.mail.male-fill.male.man-2-fill.man-2.man-3-fill.man-3.man-4-fill.man-4.man-fill.man.manage-accounts-fill.manage-accounts.manage-history-fill.manage-history.manage-search-fill.manage-search.manga-fill.manga.manufacturing-fill.manufacturing.map-fill.map-pin-heart-fill.map-pin-heart.map-pin-review-fill.map-pin-review.map-search-fill.map-search.map.maps-ugc-fill.maps-ugc.margin-fill.margin.mark-as-unread-fill.mark-as-unread.mark-chat-read-fill.mark-chat-read.mark-chat-unread-fill.mark-chat-unread.mark-email-read-fill.mark-email-read.mark-email-unread-fill.mark-email-unread.mark-unread-chat-alt-fill.mark-unread-chat-alt.markdown-convert-fill.markdown-convert.markdown-copy-fill.markdown-copy.markdown-document-fill.markdown-document.markdown-fill.markdown-paste-fill.markdown-paste.markdown.markunread-mailbox-fill.markunread-mailbox.masked-transitions-add-fill.masked-transitions-add.masked-transitions-fill.masked-transitions.masks-fill.masks.massage-fill.massage.match-case-fill.match-case-off-fill.match-case-off.match-case.match-word-fill.match-word.matter-fill.matter.maximize-fill.maximize.meal-dinner-fill.meal-dinner.meal-lunch-fill.meal-lunch.measuring-tape-fill.measuring-tape.media-bluetooth-off-fill.media-bluetooth-off.media-bluetooth-on-fill.media-bluetooth-on.media-link-fill.media-link.media-output-fill.media-output-off-fill.media-output-off.media-output.mediation-fill.mediation.medical-information-fill.medical-information.medical-mask-fill.medical-mask.medical-services-fill.medical-services.medication-fill.medication-liquid-fill.medication-liquid.medication.meeting-room-fill.meeting-room.memory-alt-fill.memory-alt.memory-fill.memory.menstrual-health-fill.menstrual-health.menu-book-2-fill.menu-book-2.menu-book-fill.menu-book.menu-fill.menu-open-fill.menu-open.menu.merge-fill.merge-type-fill.merge-type.merge.metabolism-fill.metabolism.metro-fill.metro.mfg-nest-yale-lock-fill.mfg-nest-yale-lock.mic-alert-fill.mic-alert.mic-double-fill.mic-double.mic-external-off-fill.mic-external-off.mic-external-on-fill.mic-external-on.mic-fill.mic-gear-fill.mic-gear.mic-off-fill.mic-off.mic.microbiology-fill.microbiology.microwave-fill.microwave-gen-fill.microwave-gen.microwave.military-tech-fill.military-tech.mimo-disconnect-fill.mimo-disconnect.mimo-fill.mimo.mindfulness-fill.mindfulness.minimize-fill.minimize.minor-crash-fill.minor-crash.mintmark-fill.mintmark.missed-video-call-fill.missed-video-call.missing-controller-fill.missing-controller.mist-fill.mist.mitre-fill.mitre.mixture-med-fill.mixture-med.mms-fill.mms.mobile-2-fill.mobile-2.mobile-3-fill.mobile-3.mobile-alert-fill.mobile-alert.mobile-arrow-down-fill.mobile-arrow-down.mobile-arrow-right-fill.mobile-arrow-right.mobile-arrow-up-right-fill.mobile-arrow-up-right.mobile-block-fill.mobile-block.mobile-camera-fill.mobile-camera-front-fill.mobile-camera-front.mobile-camera-rear-fill.mobile-camera-rear.mobile-camera.mobile-cancel-fill.mobile-cancel.mobile-cast-fill.mobile-cast.mobile-charge-fill.mobile-charge.mobile-chat-fill.mobile-chat.mobile-check-fill.mobile-check.mobile-code-fill.mobile-code.mobile-dock-fill.mobile-dock.mobile-dots-fill.mobile-dots.mobile-fill.mobile-gear-fill.mobile-gear.mobile-hand-fill.mobile-hand-left-fill.mobile-hand-left-off-fill.mobile-hand-left-off.mobile-hand-left.mobile-hand-off-fill.mobile-hand-off.mobile-hand.mobile-info-fill.mobile-info.mobile-landscape-fill.mobile-landscape.mobile-layout-fill.mobile-layout.mobile-lock-landscape-fill.mobile-lock-landscape.mobile-lock-portrait-fill.mobile-lock-portrait.mobile-loupe-fill.mobile-loupe.mobile-menu-fill.mobile-menu.mobile-off-fill.mobile-off.mobile-question-fill.mobile-question.mobile-rotate-fill.mobile-rotate-lock-fill.mobile-rotate-lock.mobile-rotate.mobile-screensaver-fill.mobile-screensaver.mobile-sensor-hi-fill.mobile-sensor-hi.mobile-sensor-lo-fill.mobile-sensor-lo.mobile-share-fill.mobile-share-stack-fill.mobile-share-stack.mobile-share.mobile-sound-2-fill.mobile-sound-2.mobile-sound-fill.mobile-sound-off-fill.mobile-sound-off.mobile-sound.mobile-speaker-fill.mobile-speaker.mobile-tap-fill.mobile-tap.mobile-text-2-fill.mobile-text-2.mobile-text-fill.mobile-text.mobile-theft-fill.mobile-theft.mobile-ticket-fill.mobile-ticket.mobile-unlock-fill.mobile-unlock.mobile-vibrate-fill.mobile-vibrate.mobile-wrench-fill.mobile-wrench.mobile.mobiledata-arrows-fill.mobiledata-arrows.mobiledata-off-fill.mobiledata-off.mode-comment-fill.mode-comment.mode-cool-fill.mode-cool-off-fill.mode-cool-off.mode-cool.mode-dual-fill.mode-dual.mode-fan-2-fill.mode-fan-2.mode-fan-fill.mode-fan-off-fill.mode-fan-off.mode-fan.mode-heat-cool-fill.mode-heat-cool.mode-heat-fill.mode-heat-off-fill.mode-heat-off.mode-heat.mode-night-fill.mode-night.mode-of-travel-fill.mode-of-travel.mode-off-on-fill.mode-off-on.mode-standby-fill.mode-standby.model-training-fill.model-training.modeling-fill.modeling.money-bag-fill.money-bag.money-fill.money-off-fill.money-off.money-range-fill.money-range.money.monitor-fill.monitor-heart-fill.monitor-heart.monitor-weight-fill.monitor-weight-gain-fill.monitor-weight-gain.monitor-weight-loss-fill.monitor-weight-loss.monitor-weight.monitor.monitoring-fill.monitoring.monochrome-photos-fill.monochrome-photos.monorail-fill.monorail.mood-bad-fill.mood-bad.mood-fill.mood-heart-fill.mood-heart.mood.moon-stars-fill.moon-stars.mop-fill.mop.moped-fill.moped-package-fill.moped-package.moped.more-down-fill.more-down.more-fill.more-horiz-fill.more-horiz.more-time-fill.more-time.more-up-fill.more-up.more-vert-fill.more-vert.more.mosque-fill.mosque.motion-blur-fill.motion-blur.motion-mode-fill.motion-mode.motion-photos-auto-fill.motion-photos-auto.motion-photos-on-fill.motion-photos-on.motion-photos-paused-fill.motion-photos-paused.motion-play-fill.motion-play.motion-sensor-active-fill.motion-sensor-active.motion-sensor-alert-fill.motion-sensor-alert.motion-sensor-idle-fill.motion-sensor-idle.motion-sensor-urgent-fill.motion-sensor-urgent.motorcycle-fill.motorcycle.mountain-flag-fill.mountain-flag.mountain-steam-fill.mountain-steam.mouse-fill.mouse-lock-fill.mouse-lock-off-fill.mouse-lock-off.mouse-lock.mouse.move-down-fill.move-down.move-fill.move-group-fill.move-group.move-item-fill.move-item.move-location-fill.move-location.move-selection-down-fill.move-selection-down.move-selection-left-fill.move-selection-left.move-selection-right-fill.move-selection-right.move-selection-up-fill.move-selection-up.move-to-inbox-fill.move-to-inbox.move-up-fill.move-up.move.moved-location-fill.moved-location.movie-edit-fill.movie-edit-off-fill.movie-edit-off.movie-edit.movie-fill.movie-info-fill.movie-info.movie-off-fill.movie-off.movie-speaker-fill.movie-speaker.movie.moving-beds-fill.moving-beds.moving-fill.moving-ministry-fill.moving-ministry.moving.mp-fill.mp.multicooker-fill.multicooker.multiline-chart-fill.multiline-chart.multimodal-hand-eye-fill.multimodal-hand-eye.multiple-airports-fill.multiple-airports.multiple-stop-fill.multiple-stop.museum-fill.museum.music-cast-fill.music-cast.music-history-fill.music-history.music-note-2-fill.music-note-2.music-note-add-fill.music-note-add.music-note-fill.music-note.music-off-fill.music-off.music-video-fill.music-video.my-location-fill.my-location.mystery-fill.mystery.nat-fill.nat.nature-fill.nature-people-fill.nature-people.nature.navigation-fill.navigation.near-me-disabled-fill.near-me-disabled.near-me-fill.near-me.nearby-error-fill.nearby-error.nearby-fill.nearby-off-fill.nearby-off.nearby.nephrology-fill.nephrology.nest-audio-fill.nest-audio.nest-cam-floodlight-fill.nest-cam-floodlight.nest-cam-indoor-fill.nest-cam-indoor.nest-cam-iq-fill.nest-cam-iq-outdoor-fill.nest-cam-iq-outdoor.nest-cam-iq.nest-cam-magnet-mount-fill.nest-cam-magnet-mount.nest-cam-outdoor-fill.nest-cam-outdoor.nest-cam-stand-fill.nest-cam-stand.nest-cam-wall-mount-fill.nest-cam-wall-mount.nest-cam-wired-stand-fill.nest-cam-wired-stand.nest-clock-farsight-analog-fill.nest-clock-farsight-analog.nest-clock-farsight-digital-fill.nest-clock-farsight-digital.nest-connect-fill.nest-connect.nest-detect-fill.nest-detect.nest-display-fill.nest-display-max-fill.nest-display-max.nest-display.nest-doorbell-visitor-fill.nest-doorbell-visitor.nest-eco-leaf-fill.nest-eco-leaf.nest-farsight-cool-fill.nest-farsight-cool.nest-farsight-dual-fill.nest-farsight-dual.nest-farsight-eco-fill.nest-farsight-eco.nest-farsight-heat-fill.nest-farsight-heat.nest-farsight-seasonal-fill.nest-farsight-seasonal.nest-farsight-weather-fill.nest-farsight-weather.nest-found-savings-fill.nest-found-savings.nest-heat-link-e-fill.nest-heat-link-e.nest-heat-link-gen-3-fill.nest-heat-link-gen-3.nest-hello-doorbell-fill.nest-hello-doorbell.nest-mini-fill.nest-mini.nest-multi-room-fill.nest-multi-room.nest-protect-fill.nest-protect.nest-remote-comfort-sensor-fill.nest-remote-comfort-sensor.nest-secure-alarm-fill.nest-secure-alarm.nest-sunblock-fill.nest-sunblock.nest-tag-fill.nest-tag.nest-thermostat-e-eu-fill.nest-thermostat-e-eu.nest-thermostat-fill.nest-thermostat-gen-3-fill.nest-thermostat-gen-3.nest-thermostat-sensor-eu-fill.nest-thermostat-sensor-eu.nest-thermostat-sensor-fill.nest-thermostat-sensor.nest-thermostat-zirconium-eu-fill.nest-thermostat-zirconium-eu.nest-thermostat.nest-true-radiant-fill.nest-true-radiant.nest-wake-on-approach-fill.nest-wake-on-approach.nest-wake-on-press-fill.nest-wake-on-press.nest-wifi-point-fill.nest-wifi-point.nest-wifi-pro-2-fill.nest-wifi-pro-2.nest-wifi-pro-fill.nest-wifi-pro.nest-wifi-router-fill.nest-wifi-router.network-cell-fill.network-cell.network-check-fill.network-check.network-intel-node-fill.network-intel-node.network-intelligence-fill.network-intelligence-history-fill.network-intelligence-history.network-intelligence-update-fill.network-intelligence-update.network-intelligence.network-locked-fill.network-locked.network-manage-fill.network-manage.network-node-fill.network-node.network-ping-fill.network-ping.network-wifi-1-bar-fill.network-wifi-1-bar-locked-fill.network-wifi-1-bar-locked.network-wifi-1-bar.network-wifi-2-bar-fill.network-wifi-2-bar-locked-fill.network-wifi-2-bar-locked.network-wifi-2-bar.network-wifi-3-bar-fill.network-wifi-3-bar-locked-fill.network-wifi-3-bar-locked.network-wifi-3-bar.network-wifi-fill.network-wifi-locked-fill.network-wifi-locked.network-wifi.neurology-fill.neurology.new-label-fill.new-label.new-window-fill.new-window.news-fill.news.newsmode-fill.newsmode.newspaper-fill.newspaper.newsstand-fill.newsstand.next-plan-fill.next-plan.next-week-fill.next-week.nfc-fill.nfc-off-fill.nfc-off.nfc.night-shelter-fill.night-shelter.night-sight-auto-fill.night-sight-auto-off-fill.night-sight-auto-off.night-sight-auto.night-sight-max-fill.night-sight-max.nightlife-fill.nightlife.nightlight-fill.nightlight.no-accounts-fill.no-accounts.no-adult-content-fill.no-adult-content.no-backpack-fill.no-backpack.no-crash-fill.no-crash.no-drinks-fill.no-drinks.no-encryption-fill.no-encryption.no-flash-fill.no-flash.no-food-fill.no-food.no-luggage-fill.no-luggage.no-meals-fill.no-meals.no-meeting-room-fill.no-meeting-room.no-photography-fill.no-photography.no-sim-fill.no-sim.no-sound-fill.no-sound.no-stroller-fill.no-stroller.no-transfer-fill.no-transfer.noise-aware-fill.noise-aware.noise-control-off-fill.noise-control-off.noise-control-on-fill.noise-control-on.nordic-walking-fill.nordic-walking.north-east-fill.north-east.north-fill.north-west-fill.north-west.north.not-accessible-fill.not-accessible-forward-fill.not-accessible-forward.not-accessible.not-listed-location-fill.not-listed-location.not-started-fill.not-started.note-add-fill.note-add.note-alt-fill.note-alt.note-stack-add-fill.note-stack-add.note-stack-fill.note-stack.notes-fill.notes.notification-add-fill.notification-add.notification-audio-fill.notification-audio-off-fill.notification-audio-off.notification-audio.notification-important-fill.notification-important.notification-multiple-fill.notification-multiple.notification-settings-fill.notification-settings.notification-sound-fill.notification-sound.notifications-active-fill.notifications-active.notifications-fill.notifications-off-fill.notifications-off.notifications-paused-fill.notifications-paused.notifications-unread-fill.notifications-unread.notifications.numbers-fill.numbers.nutrition-fill.nutrition.ods-fill.ods.odt-fill.odt.offline-pin-fill.offline-pin-off-fill.offline-pin-off.offline-pin.oil-barrel-fill.oil-barrel.okonomiyaki-fill.okonomiyaki.on-device-training-fill.on-device-training.on-hub-device-fill.on-hub-device.oncology-fill.oncology.online-prediction-fill.online-prediction.onsen-fill.onsen.opacity-fill.opacity.open-in-browser-fill.open-in-browser.open-in-full-fill.open-in-full.open-in-new-down-fill.open-in-new-down.open-in-new-fill.open-in-new-off-fill.open-in-new-off.open-in-new.open-jam-fill.open-jam.open-run-fill.open-run.open-with-fill.open-with.ophthalmology-fill.ophthalmology.oral-disease-fill.oral-disease.orbit-fill.orbit.order-approve-fill.order-approve.order-play-fill.order-play.orders-fill.orders.orthopedics-fill.orthopedics.other-admission-fill.other-admission.other-houses-fill.other-houses.outbound-fill.outbound.outbox-alt-fill.outbox-alt.outbox-fill.outbox.outdoor-garden-fill.outdoor-garden.outdoor-grill-fill.outdoor-grill.outgoing-mail-fill.outgoing-mail.outlet-fill.outlet.outpatient-fill.outpatient-med-fill.outpatient-med.outpatient.output-circle-fill.output-circle.output-fill.output.oven-fill.oven-gen-fill.oven-gen.oven.overview-fill.overview-key-fill.overview-key.overview.owl-fill.owl.oxygen-saturation-fill.oxygen-saturation.p2p-fill.p2p.pace-fill.pace.pacemaker-fill.pacemaker.package-2-fill.package-2.package-fill.package.padding-fill.padding.padel-fill.padel.page-control-fill.page-control.page-footer-fill.page-footer.page-header-fill.page-header.page-info-fill.page-info.page-menu-ios-fill.page-menu-ios.pageless-fill.pageless.pages-fill.pages.pageview-fill.pageview.paid-fill.paid.palette-fill.palette.pallet-fill.pallet.pan-tool-alt-fill.pan-tool-alt.pan-tool-fill.pan-tool.pan-zoom-fill.pan-zoom.panorama-fill.panorama-horizontal-fill.panorama-horizontal.panorama-photosphere-fill.panorama-photosphere.panorama-vertical-fill.panorama-vertical.panorama-wide-angle-fill.panorama-wide-angle.panorama.paragliding-fill.paragliding.parent-child-dining-fill.parent-child-dining.park-fill.park.parking-meter-fill.parking-meter.parking-sign-fill.parking-sign.parking-valet-fill.parking-valet.partly-cloudy-day-fill.partly-cloudy-day.partly-cloudy-night-fill.partly-cloudy-night.partner-exchange-fill.partner-exchange.partner-heart-fill.partner-heart.partner-reports-fill.partner-reports.party-mode-fill.party-mode.passkey-fill.passkey.passport-fill.passport.password-2-fill.password-2-off-fill.password-2-off.password-2.password-fill.password.patient-list-fill.patient-list.pattern-fill.pattern.pause-circle-fill.pause-circle.pause-fill.pause-presentation-fill.pause-presentation.pause.payment-arrow-down-fill.payment-arrow-down.payment-card-fill.payment-card.payments-fill.payments.pedal-bike-fill.pedal-bike.pediatrics-fill.pediatrics.pen-size-1-fill.pen-size-1.pen-size-2-fill.pen-size-2.pen-size-3-fill.pen-size-3.pen-size-4-fill.pen-size-4.pen-size-5-fill.pen-size-5.pending-actions-fill.pending-actions.pending-fill.pending.pentagon-fill.pentagon.people-size-decrease-fill.people-size-decrease.people-size-increase-fill.people-size-increase.percent-discount-fill.percent-discount.percent-fill.percent.pergola-fill.pergola.perm-camera-mic-fill.perm-camera-mic.perm-contact-calendar-fill.perm-contact-calendar.perm-data-setting-fill.perm-data-setting.perm-media-fill.perm-media.perm-phone-msg-fill.perm-phone-msg.perm-scan-wifi-fill.perm-scan-wifi.person-2-fill.person-2.person-3-fill.person-3.person-4-fill.person-4.person-add-disabled-fill.person-add-disabled.person-add-fill.person-add.person-alert-fill.person-alert.person-apron-fill.person-apron.person-book-fill.person-book.person-cancel-fill.person-cancel.person-celebrate-fill.person-celebrate.person-check-fill.person-check.person-edit-fill.person-edit.person-fill.person-heart-fill.person-heart.person-off-fill.person-off.person-pin-circle-fill.person-pin-circle.person-pin-fill.person-pin.person-play-fill.person-play.person-raised-hand-fill.person-raised-hand.person-remove-fill.person-remove.person-search-fill.person-search.person-shield-fill.person-shield.person-text-fill.person-text.person.personal-bag-fill.personal-bag-off-fill.personal-bag-off.personal-bag-question-fill.personal-bag-question.personal-bag.personal-injury-fill.personal-injury.personal-places-fill.personal-places.pest-control-fill.pest-control-rodent-fill.pest-control-rodent.pest-control.pet-supplies-fill.pet-supplies.pets-fill.pets.phishing-fill.phishing.phone-bluetooth-speaker-fill.phone-bluetooth-speaker.phone-callback-fill.phone-callback.phone-cancel-fill.phone-cancel.phone-disabled-fill.phone-disabled.phone-enabled-fill.phone-enabled.phone-forwarded-fill.phone-forwarded.phone-in-talk-fill.phone-in-talk.phone-locked-fill.phone-locked.phone-missed-fill.phone-missed.phone-paused-fill.phone-paused.photo-album-fill.photo-album.photo-auto-merge-fill.photo-auto-merge.photo-camera-back-fill.photo-camera-back.photo-camera-fill.photo-camera-front-fill.photo-camera-front.photo-camera.photo-fill.photo-frame-fill.photo-frame.photo-library-fill.photo-library.photo-prints-fill.photo-prints.photo-size-select-large-fill.photo-size-select-large.photo-size-select-small-fill.photo-size-select-small.photo.php-fill.php.physical-therapy-fill.physical-therapy.piano-fill.piano-off-fill.piano-off.piano.pickleball-fill.pickleball.picture-as-pdf-fill.picture-as-pdf.picture-in-picture-alt-fill.picture-in-picture-alt.picture-in-picture-center-fill.picture-in-picture-center.picture-in-picture-fill.picture-in-picture-large-fill.picture-in-picture-large.picture-in-picture-medium-fill.picture-in-picture-medium.picture-in-picture-mobile-fill.picture-in-picture-mobile.picture-in-picture-off-fill.picture-in-picture-off.picture-in-picture-small-fill.picture-in-picture-small.picture-in-picture.pie-chart-fill.pie-chart.pill-fill.pill-off-fill.pill-off.pill.pin-drop-fill.pin-drop.pin-end-fill.pin-end.pin-fill.pin-history-fill.pin-history.pin-invoke-fill.pin-invoke.pin-road-2-fill.pin-road-2.pin-road-fill.pin-road.pin.pinboard-fill.pinboard-unread-fill.pinboard-unread.pinboard.pinch-fill.pinch-zoom-in-fill.pinch-zoom-in.pinch-zoom-out-fill.pinch-zoom-out.pinch.pip-exit-fill.pip-exit.pip-fill.pip.pivot-table-chart-fill.pivot-table-chart.place-item-fill.place-item.plagiarism-fill.plagiarism.plane-contrails-fill.plane-contrails.planet-fill.planet.planner-banner-ad-pt-fill.planner-banner-ad-pt.planner-review-fill.planner-review.play-arrow-fill.play-arrow.play-circle-fill.play-circle.play-disabled-fill.play-disabled.play-for-work-fill.play-for-work.play-lesson-fill.play-lesson.play-pause-fill.play-pause.playground-2-fill.playground-2.playground-fill.playground.playing-cards-fill.playing-cards.playlist-add-check-circle-fill.playlist-add-check-circle.playlist-add-check-fill.playlist-add-check.playlist-add-circle-fill.playlist-add-circle.playlist-add-fill.playlist-add.playlist-play-fill.playlist-play.playlist-remove-fill.playlist-remove.plug-connect-fill.plug-connect.plumbing-fill.plumbing.podcasts-fill.podcasts.podiatry-fill.podiatry.podium-fill.podium.point-of-sale-fill.point-of-sale.point-scan-fill.point-scan.poker-chip-fill.poker-chip.policy-alert-fill.policy-alert.policy-fill.policy.polyline-fill.polyline.polymer-fill.polymer.pool-fill.pool.portable-wifi-off-fill.portable-wifi-off.position-bottom-left-fill.position-bottom-left.position-bottom-right-fill.position-bottom-right.position-top-right-fill.position-top-right.post-add-fill.post-add.post-fill.post.potted-plant-fill.potted-plant.power-fill.power-input-fill.power-input.power-off-fill.power-off.power-settings-circle-fill.power-settings-circle.power-settings-new-fill.power-settings-new.power.prayer-times-fill.prayer-times.precision-manufacturing-fill.precision-manufacturing.pregnancy-fill.pregnancy.pregnant-woman-fill.pregnant-woman.preliminary-fill.preliminary.prescriptions-fill.prescriptions.present-to-all-fill.present-to-all.preview-fill.preview-off-fill.preview-off.preview.price-change-fill.price-change.price-check-fill.price-check.print-add-fill.print-add.print-connect-fill.print-connect.print-disabled-fill.print-disabled.print-error-fill.print-error.print-fill.print-lock-fill.print-lock.print.priority-fill.priority-high-fill.priority-high.priority.privacy-fill.privacy-tip-fill.privacy-tip.privacy.private-connectivity-fill.private-connectivity.problem-fill.problem.procedure-fill.procedure.process-chart-fill.process-chart.production-quantity-limits-fill.production-quantity-limits.productivity-fill.productivity.progress-activity-fill.progress-activity.prompt-suggestion-fill.prompt-suggestion.propane-fill.propane-tank-fill.propane-tank.propane.psychiatry-fill.psychiatry.psychology-alt-fill.psychology-alt.psychology-fill.psychology.public-fill.public-off-fill.public-off.public.publish-fill.publish.published-with-changes-fill.published-with-changes.pulmonology-fill.pulmonology.pulse-alert-fill.pulse-alert.punch-clock-fill.punch-clock.qr-code-2-add-fill.qr-code-2-add.qr-code-2-fill.qr-code-2.qr-code-fill.qr-code-scanner-fill.qr-code-scanner.qr-code.query-stats-fill.query-stats.question-exchange-fill.question-exchange.question-mark-fill.question-mark.queue-music-fill.queue-music.queue-play-next-fill.queue-play-next.quick-phrases-fill.quick-phrases.quick-reference-all-fill.quick-reference-all.quick-reference-fill.quick-reference.quick-reorder-fill.quick-reorder.quickreply-fill.quickreply.quiz-fill.quiz.r-mobiledata-fill.r-mobiledata.radar-fill.radar.radio-button-checked-fill.radio-button-checked.radio-button-partial-fill.radio-button-partial.radio-button-unchecked-fill.radio-button-unchecked.radio-fill.radio.radiology-fill.radiology.railway-alert-2-fill.railway-alert-2.railway-alert-fill.railway-alert.rainy-fill.rainy-heavy-fill.rainy-heavy.rainy-light-fill.rainy-light.rainy-snow-fill.rainy-snow.rainy.ramen-dining-fill.ramen-dining.ramp-left-fill.ramp-left.ramp-right-fill.ramp-right.range-hood-fill.range-hood.rate-review-fill.rate-review.raven-fill.raven.raw-off-fill.raw-off.raw-on-fill.raw-on.read-more-fill.read-more.readiness-score-fill.readiness-score.real-estate-agent-fill.real-estate-agent.rear-camera-fill.rear-camera.rebase-edit-fill.rebase-edit.rebase-fill.rebase.receipt-fill.receipt-long-fill.receipt-long-off-fill.receipt-long-off.receipt-long.receipt.recent-actors-fill.recent-actors.recent-patient-fill.recent-patient.recenter-fill.recenter.recommend-fill.recommend.record-voice-over-fill.record-voice-over.rectangle-add-fill.rectangle-add.rectangle-fill.rectangle.recycling-fill.recycling.redeem-fill.redeem.redo-fill.redo.reduce-capacity-fill.reduce-capacity.refresh-fill.refresh.regular-expression-fill.regular-expression.relax-fill.relax.release-alert-fill.release-alert.remember-me-fill.remember-me.reminder-fill.reminder.remote-gen-fill.remote-gen.remove-done-fill.remove-done.remove-fill.remove-from-queue-fill.remove-from-queue.remove-moderator-fill.remove-moderator.remove-road-fill.remove-road.remove-selection-fill.remove-selection.remove-shopping-cart-fill.remove-shopping-cart.remove.reopen-window-fill.reopen-window.reorder-fill.reorder.repartition-fill.repartition.repeat-fill.repeat-on-fill.repeat-on.repeat-one-fill.repeat-one-on-fill.repeat-one-on.repeat-one.repeat.replace-audio-fill.replace-audio.replace-image-fill.replace-image.replace-video-fill.replace-video.replay-10-fill.replay-10.replay-30-fill.replay-30.replay-5-fill.replay-5.replay-fill.replay.reply-all-fill.reply-all.reply-fill.reply.report-fill.report-off-fill.report-off.report.request-page-fill.request-page.request-quote-fill.request-quote.reset-brightness-fill.reset-brightness.reset-colors-fill.reset-colors.reset-exposure-fill.reset-exposure.reset-focus-fill.reset-focus.reset-image-fill.reset-image.reset-iso-fill.reset-iso.reset-settings-fill.reset-settings.reset-shadow-fill.reset-shadow.reset-shutter-speed-fill.reset-shutter-speed.reset-tv-fill.reset-tv.reset-white-balance-fill.reset-white-balance.reset-wrench-fill.reset-wrench.resize-fill.resize-window-fill.resize-window.resize.respiratory-rate-fill.respiratory-rate.responsive-layout-fill.responsive-layout.rest-area-fill.rest-area.restart-alt-fill.restart-alt.restaurant-fill.restaurant.restore-from-trash-fill.restore-from-trash.restore-page-fill.restore-page.resume-fill.resume.reviews-fill.reviews.rewarded-ads-fill.rewarded-ads.rheumatology-fill.rheumatology.rib-cage-fill.rib-cage.rice-bowl-fill.rice-bowl.right-click-fill.right-click.right-panel-close-fill.right-panel-close.right-panel-open-fill.right-panel-open.ring-volume-fill.ring-volume.ripples-fill.ripples.road-fill.road.robot-2-fill.robot-2.robot-fill.robot.rocket-fill.rocket-launch-fill.rocket-launch.rocket.roller-shades-closed-fill.roller-shades-closed.roller-shades-fill.roller-shades.roller-skating-fill.roller-skating.roofing-fill.roofing.room-preferences-fill.room-preferences.room-service-fill.room-service.rotate-90-degrees-ccw-fill.rotate-90-degrees-ccw.rotate-90-degrees-cw-fill.rotate-90-degrees-cw.rotate-auto-fill.rotate-auto.rotate-left-fill.rotate-left.rotate-right-fill.rotate-right.roundabout-left-fill.roundabout-left.roundabout-right-fill.roundabout-right.rounded-corner-fill.rounded-corner.route-fill.route.router-fill.router-off-fill.router-off.router.routine-fill.routine.rowing-fill.rowing.rss-feed-fill.rss-feed.rsvp-fill.rsvp.rtt-fill.rtt.rubric-fill.rubric.rule-fill.rule-folder-fill.rule-folder.rule-settings-fill.rule-settings.rule.run-circle-fill.run-circle.running-with-errors-fill.running-with-errors.rv-hookup-fill.rv-hookup.safety-check-fill.safety-check-off-fill.safety-check-off.safety-check.safety-divider-fill.safety-divider.sailing-fill.sailing.salinity-fill.salinity.sanitizer-fill.sanitizer.satellite-alt-fill.satellite-alt.satellite-fill.satellite.sauna-fill.sauna.save-as-fill.save-as.save-clock-fill.save-clock.save-fill.save.saved-search-fill.saved-search.savings-fill.savings.scale-fill.scale.scan-delete-fill.scan-delete.scan-fill.scan.scanner-fill.scanner.scatter-plot-fill.scatter-plot.scene-fill.scene.schedule-fill.schedule-send-fill.schedule-send.schedule.schema-fill.schema.school-fill.school.science-fill.science-off-fill.science-off.science.scooter-fill.scooter.score-fill.score.scoreboard-fill.scoreboard.screen-record-fill.screen-record.screen-rotation-alt-fill.screen-rotation-alt.screen-rotation-up-fill.screen-rotation-up.screen-search-desktop-fill.screen-search-desktop.screen-share-fill.screen-share.screenshot-frame-2-fill.screenshot-frame-2.screenshot-frame-fill.screenshot-frame.screenshot-keyboard-fill.screenshot-keyboard.screenshot-monitor-fill.screenshot-monitor.screenshot-region-fill.screenshot-region.screenshot-tablet-fill.screenshot-tablet.script-fill.script.scrollable-header-fill.scrollable-header.scuba-diving-fill.scuba-diving.sd-card-alert-fill.sd-card-alert.sd-card-fill.sd-card.sd-fill.sd.sdk-fill.sdk.search-activity-fill.search-activity.search-check-2-fill.search-check-2.search-check-fill.search-check.search-fill.search-gear-fill.search-gear.search-hands-free-fill.search-hands-free.search-insights-fill.search-insights.search-off-fill.search-off.search.seat-cool-left-fill.seat-cool-left.seat-cool-right-fill.seat-cool-right.seat-heat-left-fill.seat-heat-left.seat-heat-right-fill.seat-heat-right.seat-read-fill.seat-read.seat-vent-left-fill.seat-vent-left.seat-vent-right-fill.seat-vent-right.seat-window-fill.seat-window.security-fill.security-key-fill.security-key.security.segment-fill.segment.select-all-fill.select-all.select-check-box-fill.select-check-box.select-fill.select-to-speak-fill.select-to-speak.select-window-2-fill.select-window-2.select-window-fill.select-window-off-fill.select-window-off.select-window.select.self-care-fill.self-care.self-improvement-fill.self-improvement.sell-cloud-fill.sell-cloud.sell-fill.sell.send-and-archive-fill.send-and-archive.send-fill.send-money-fill.send-money.send-time-extension-fill.send-time-extension.send.sensor-door-fill.sensor-door.sensor-occupied-fill.sensor-occupied.sensor-window-fill.sensor-window.sensors-fill.sensors-krx-fill.sensors-krx-off-fill.sensors-krx-off.sensors-krx.sensors-off-fill.sensors-off.sensors.sentiment-calm-fill.sentiment-calm.sentiment-content-fill.sentiment-content.sentiment-dissatisfied-fill.sentiment-dissatisfied.sentiment-excited-fill.sentiment-excited.sentiment-extremely-dissatisfied-fill.sentiment-extremely-dissatisfied.sentiment-frustrated-fill.sentiment-frustrated.sentiment-neutral-fill.sentiment-neutral.sentiment-sad-fill.sentiment-sad.sentiment-satisfied-fill.sentiment-satisfied.sentiment-stressed-fill.sentiment-stressed.sentiment-very-dissatisfied-fill.sentiment-very-dissatisfied.sentiment-very-satisfied-fill.sentiment-very-satisfied.sentiment-worried-fill.sentiment-worried.serif-fill.serif.server-person-fill.server-person.service-toolbox-fill.service-toolbox.set-meal-fill.set-meal.settings-accessibility-fill.settings-accessibility.settings-account-box-fill.settings-account-box.settings-alert-fill.settings-alert.settings-applications-fill.settings-applications.settings-b-roll-fill.settings-b-roll.settings-backup-restore-fill.settings-backup-restore.settings-bluetooth-fill.settings-bluetooth.settings-brightness-fill.settings-brightness.settings-cinematic-blur-fill.settings-cinematic-blur.settings-ethernet-fill.settings-ethernet.settings-fill.settings-heart-fill.settings-heart.settings-input-antenna-fill.settings-input-antenna.settings-input-component-fill.settings-input-component.settings-input-hdmi-fill.settings-input-hdmi.settings-input-svideo-fill.settings-input-svideo.settings-motion-mode-fill.settings-motion-mode.settings-night-sight-fill.settings-night-sight.settings-overscan-fill.settings-overscan.settings-panorama-fill.settings-panorama.settings-phone-fill.settings-phone.settings-photo-camera-fill.settings-photo-camera.settings-power-fill.settings-power.settings-remote-fill.settings-remote.settings-screen-fill.settings-screen.settings-seating-fill.settings-seating.settings-slow-motion-fill.settings-slow-motion.settings-system-daydream-fill.settings-system-daydream.settings-timelapse-fill.settings-timelapse.settings-video-camera-fill.settings-video-camera.settings-voice-fill.settings-voice.settings.settop-component-fill.settop-component.severe-cold-fill.severe-cold.shades-closed-fill.shades-closed.shades-fill.shades.shadow-add-fill.shadow-add.shadow-fill.shadow-minus-fill.shadow-minus.shadow.shape-line-fill.shape-line.shapes-fill.shapes.share-eta-fill.share-eta.share-fill.share-location-fill.share-location.share-off-fill.share-off.share-reviews-fill.share-reviews.share-windows-fill.share-windows.share.shaved-ice-fill.shaved-ice.sheets-column-swap-fill.sheets-column-swap.sheets-rtl-fill.sheets-rtl.shelf-auto-hide-fill.shelf-auto-hide.shelf-position-fill.shelf-position.shelves-fill.shelves.shield-card-fill.shield-card.shield-fill.shield-lock-fill.shield-lock.shield-locked-fill.shield-locked.shield-moon-fill.shield-moon.shield-person-fill.shield-person.shield-question-fill.shield-question.shield-radar-fill.shield-radar.shield-toggle-fill.shield-toggle.shield-watch-fill.shield-watch.shield-with-heart-fill.shield-with-heart.shield-with-house-fill.shield-with-house.shield.shift-fill.shift-lock-fill.shift-lock-off-fill.shift-lock-off.shift-lock.shift.shoe-cleats-fill.shoe-cleats.shop-fill.shop-two-fill.shop-two.shop.shopping-bag-fill.shopping-bag-speed-fill.shopping-bag-speed.shopping-bag.shopping-basket-fill.shopping-basket.shopping-cart-checkout-fill.shopping-cart-checkout.shopping-cart-fill.shopping-cart-off-fill.shopping-cart-off.shopping-cart.shoppingmode-fill.shoppingmode.short-stay-fill.short-stay.short-text-fill.short-text.show-chart-fill.show-chart.shower-fill.shower.shuffle-fill.shuffle-on-fill.shuffle-on.shuffle.shutter-speed-add-fill.shutter-speed-add.shutter-speed-fill.shutter-speed-minus-fill.shutter-speed-minus.shutter-speed.sick-fill.sick.side-navigation-fill.side-navigation.sign-language-fill.sign-language-off-fill.sign-language-off.sign-language.signal-cellular-0-bar-fill.signal-cellular-0-bar.signal-cellular-1-bar-fill.signal-cellular-1-bar.signal-cellular-2-bar-fill.signal-cellular-2-bar.signal-cellular-3-bar-fill.signal-cellular-3-bar.signal-cellular-4-bar-fill.signal-cellular-4-bar.signal-cellular-add-fill.signal-cellular-add.signal-cellular-alt-1-bar-fill.signal-cellular-alt-1-bar.signal-cellular-alt-2-bar-fill.signal-cellular-alt-2-bar.signal-cellular-alt-fill.signal-cellular-alt-off-fill.signal-cellular-alt-off.signal-cellular-alt.signal-cellular-connected-no-internet-0-bar-fill.signal-cellular-connected-no-internet-0-bar.signal-cellular-connected-no-internet-4-bar-fill.signal-cellular-connected-no-internet-4-bar.signal-cellular-nodata-fill.signal-cellular-nodata.signal-cellular-null-fill.signal-cellular-null.signal-cellular-off-fill.signal-cellular-off.signal-cellular-pause-fill.signal-cellular-pause.signal-disconnected-fill.signal-disconnected.signal-wifi-0-bar-fill.signal-wifi-0-bar.signal-wifi-4-bar-fill.signal-wifi-4-bar.signal-wifi-bad-fill.signal-wifi-bad.signal-wifi-off-fill.signal-wifi-off.signal-wifi-statusbar-not-connected-fill.signal-wifi-statusbar-not-connected.signal-wifi-statusbar-null-fill.signal-wifi-statusbar-null.signature-fill.signature.signpost-fill.signpost.sim-card-download-fill.sim-card-download.sim-card-fill.sim-card-lock-fill.sim-card-lock.sim-card.simulation-fill.simulation.single-arrow-fill.single-arrow.single-bed-fill.single-bed.sip-fill.sip.siren-check-fill.siren-check.siren-fill.siren-open-fill.siren-open.siren-question-fill.siren-question.siren.skateboarding-fill.skateboarding.skeleton-fill.skeleton.skillet-cooktop-fill.skillet-cooktop.skillet-fill.skillet.skip-next-fill.skip-next.skip-previous-fill.skip-previous.skull-fill.skull-list-fill.skull-list.skull.slab-serif-fill.slab-serif.sledding-fill.sledding.sleep-score-fill.sleep-score.slide-library-fill.slide-library.sliders-fill.sliders.slideshow-fill.slideshow.slow-motion-video-fill.slow-motion-video.smart-card-reader-fill.smart-card-reader-off-fill.smart-card-reader-off.smart-card-reader.smart-display-fill.smart-display.smart-outlet-fill.smart-outlet.smart-toy-fill.smart-toy.smb-share-fill.smb-share.smoke-free-fill.smoke-free.smoking-rooms-fill.smoking-rooms.sms-fill.sms.snail-fill.snail.snippet-folder-fill.snippet-folder.snooze-fill.snooze.snowboarding-fill.snowboarding.snowflake-fill.snowflake.snowing-fill.snowing-heavy-fill.snowing-heavy.snowing.snowmobile-fill.snowmobile.snowshoeing-fill.snowshoeing.soap-fill.soap.soba-fill.soba.social-distance-fill.social-distance.social-leaderboard-fill.social-leaderboard.solar-power-fill.solar-power.solo-dining-fill.solo-dining.sort-by-alpha-fill.sort-by-alpha.sort-fill.sort.sos-fill.sos.sound-detection-dog-barking-fill.sound-detection-dog-barking.sound-detection-glass-break-fill.sound-detection-glass-break.sound-detection-loud-sound-fill.sound-detection-loud-sound.sound-sampler-fill.sound-sampler.soundbar-fill.soundbar.soup-kitchen-fill.soup-kitchen.source-environment-fill.source-environment.source-notes-fill.source-notes.south-america-fill.south-america.south-east-fill.south-east.south-fill.south-west-fill.south-west.south.spa-fill.spa.space-bar-fill.space-bar.space-dashboard-2-fill.space-dashboard-2.space-dashboard-fill.space-dashboard.spatial-audio-fill.spatial-audio-off-fill.spatial-audio-off.spatial-audio.spatial-gallery-fill.spatial-gallery.spatial-speaker-fill.spatial-speaker.spatial-tracking-fill.spatial-tracking.speaker-2-fill.speaker-2.speaker-3-fill.speaker-3.speaker-fill.speaker-group-fill.speaker-group.speaker-notes-fill.speaker-notes-off-fill.speaker-notes-off.speaker-notes.speaker-phone-fill.speaker-phone.speaker.special-character-fill.special-character.specific-gravity-fill.specific-gravity.speech-to-text-2-fill.speech-to-text-2.speech-to-text-fill.speech-to-text.speed-0-25-fill.speed-0-25.speed-0-2x-fill.speed-0-2x.speed-0-5-fill.speed-0-5.speed-0-5x-fill.speed-0-5x.speed-0-75-fill.speed-0-75.speed-0-7x-fill.speed-0-7x.speed-1-2-fill.speed-1-2.speed-1-25-fill.speed-1-25.speed-1-2x-fill.speed-1-2x.speed-1-5-fill.speed-1-5.speed-1-5x-fill.speed-1-5x.speed-1-75-fill.speed-1-75.speed-1-7x-fill.speed-1-7x.speed-2-fill.speed-2.speed-2x-fill.speed-2x.speed-3-fill.speed-3.speed-4-fill.speed-4.speed-camera-fill.speed-camera.speed-fill.speed.spellcheck-fill.spellcheck.split-scene-2-fill.split-scene-2.split-scene-down-fill.split-scene-down.split-scene-fill.split-scene-left-fill.split-scene-left.split-scene-right-fill.split-scene-right.split-scene-up-fill.split-scene-up.split-scene.splitscreen-add-fill.splitscreen-add.splitscreen-bottom-fill.splitscreen-bottom.splitscreen-fill.splitscreen-landscape-add-fill.splitscreen-landscape-add.splitscreen-landscape-fill.splitscreen-landscape.splitscreen-left-fill.splitscreen-left.splitscreen-portrait-fill.splitscreen-portrait.splitscreen-right-fill.splitscreen-right.splitscreen-top-fill.splitscreen-top.splitscreen-vertical-add-fill.splitscreen-vertical-add.splitscreen.spo2-fill.spo2.spoke-fill.spoke.sports-and-outdoors-fill.sports-and-outdoors.sports-bar-fill.sports-bar.sports-baseball-fill.sports-baseball.sports-basketball-fill.sports-basketball.sports-cricket-fill.sports-cricket.sports-esports-fill.sports-esports.sports-fill.sports-football-fill.sports-football.sports-golf-fill.sports-golf.sports-gymnastics-fill.sports-gymnastics.sports-handball-fill.sports-handball.sports-hockey-fill.sports-hockey.sports-kabaddi-fill.sports-kabaddi.sports-martial-arts-fill.sports-martial-arts.sports-mma-fill.sports-mma.sports-motorsports-fill.sports-motorsports.sports-rugby-fill.sports-rugby.sports-score-fill.sports-score.sports-soccer-fill.sports-soccer.sports-tennis-fill.sports-tennis.sports-volleyball-fill.sports-volleyball.sports.sprinkler-fill.sprinkler.sprint-fill.sprint.sql-fill.sql.square-circle-fill.square-circle.square-dot-fill.square-dot.square-fill.square-foot-fill.square-foot.square.ssid-chart-fill.ssid-chart.stack-fill.stack-group-fill.stack-group.stack-hexagon-fill.stack-hexagon.stack-off-fill.stack-off.stack-star-fill.stack-star.stack.stacked-bar-chart-fill.stacked-bar-chart.stacked-email-fill.stacked-email.stacked-inbox-fill.stacked-inbox.stacked-line-chart-fill.stacked-line-chart.stacks-fill.stacks.stadia-controller-fill.stadia-controller.stadium-fill.stadium.stairs-2-fill.stairs-2.stairs-fill.stairs.star-fill.star-half-fill.star-half.star-rate-fill.star-rate-half-fill.star-rate-half.star-rate.star-shine-fill.star-shine.star.stars-2-fill.stars-2.stars-fill.stars.start-fill.start.stat-0-fill.stat-0.stat-1-fill.stat-1.stat-2-fill.stat-2.stat-3-fill.stat-3.stat-minus-1-fill.stat-minus-1.stat-minus-2-fill.stat-minus-2.stat-minus-3-fill.stat-minus-3.steering-wheel-cool-fill.steering-wheel-cool.steering-wheel-heat-fill.steering-wheel-heat.step-fill.step-into-fill.step-into.step-out-fill.step-out.step-over-fill.step-over.step.steppers-fill.steppers.steps-fill.steps.stethoscope-arrow-fill.stethoscope-arrow.stethoscope-check-fill.stethoscope-check.stethoscope-fill.stethoscope.sticker-add-fill.sticker-add.sticker-fill.sticker.sticky-note-2-fill.sticky-note-2.sticky-note-fill.sticky-note.stock-media-fill.stock-media.stockpot-fill.stockpot.stop-circle-fill.stop-circle.stop-fill.stop-screen-share-fill.stop-screen-share.stop.storage-fill.storage.store-fill.store.storefront-fill.storefront.storm-fill.storm.straight-fill.straight.straighten-fill.straighten.strategy-fill.strategy.stream-fill.stream.streetview-fill.streetview.stress-management-fill.stress-management.strikethrough-s-fill.strikethrough-s.stroke-full-fill.stroke-full.stroke-partial-fill.stroke-partial.stroller-fill.stroller.style-fill.style.styler-fill.styler.stylus-brush-fill.stylus-brush.stylus-fill.stylus-fountain-pen-fill.stylus-fountain-pen.stylus-highlighter-fill.stylus-highlighter.stylus-laser-pointer-fill.stylus-laser-pointer.stylus-note-fill.stylus-note.stylus-pen-fill.stylus-pen.stylus-pencil-fill.stylus-pencil.stylus.subdirectory-arrow-left-fill.subdirectory-arrow-left.subdirectory-arrow-right-fill.subdirectory-arrow-right.subheader-fill.subheader.subject-fill.subject.subscript-fill.subscript.subscriptions-fill.subscriptions.subtitles-fill.subtitles-gear-fill.subtitles-gear.subtitles-off-fill.subtitles-off.subtitles.subway-fill.subway-walk-fill.subway-walk.subway.subwoofer-fill.subwoofer.summarize-fill.summarize.sunny-fill.sunny-snowing-fill.sunny-snowing.sunny.superscript-fill.superscript.supervised-user-circle-fill.supervised-user-circle-off-fill.supervised-user-circle-off.supervised-user-circle.supervisor-account-fill.supervisor-account.support-agent-fill.support-agent.support-fill.support.surfing-fill.surfing.surgical-fill.surgical.surround-sound-fill.surround-sound.swap-calls-fill.swap-calls.swap-driving-apps-fill.swap-driving-apps-wheel-fill.swap-driving-apps-wheel.swap-driving-apps.swap-horiz-fill.swap-horiz.swap-horizontal-circle-fill.swap-horizontal-circle.swap-vert-fill.swap-vert.swap-vertical-circle-fill.swap-vertical-circle.sweep-fill.sweep.swipe-down-alt-fill.swipe-down-alt.swipe-down-fill.swipe-down.swipe-fill.swipe-left-2-fill.swipe-left-2.swipe-left-alt-fill.swipe-left-alt.swipe-left-fill.swipe-left.swipe-right-2-fill.swipe-right-2.swipe-right-alt-fill.swipe-right-alt.swipe-right-fill.swipe-right.swipe-up-alt-fill.swipe-up-alt.swipe-up-fill.swipe-up.swipe-vertical-fill.swipe-vertical.swipe.switch-access-2-fill.switch-access-2.switch-access-3-fill.switch-access-3.switch-access-fill.switch-access-shortcut-add-fill.switch-access-shortcut-add.switch-access-shortcut-fill.switch-access-shortcut.switch-access.switch-account-fill.switch-account.switch-camera-fill.switch-camera.switch-fill.switch-left-fill.switch-left.switch-off-fill.switch-off.switch-right-fill.switch-right.switch-video-fill.switch-video.switch.switches-fill.switches.sword-rose-fill.sword-rose.swords-fill.swords.symptoms-fill.symptoms.synagogue-fill.synagogue.sync-alt-fill.sync-alt.sync-arrow-down-fill.sync-arrow-down.sync-arrow-up-fill.sync-arrow-up.sync-desktop-fill.sync-desktop.sync-disabled-fill.sync-disabled.sync-fill.sync-lock-fill.sync-lock.sync-problem-fill.sync-problem.sync-saved-locally-fill.sync-saved-locally-off-fill.sync-saved-locally-off.sync-saved-locally.sync.syringe-fill.syringe.system-update-alt-fill.system-update-alt.tab-close-fill.tab-close-inactive-fill.tab-close-inactive.tab-close-right-fill.tab-close-right.tab-close.tab-duplicate-fill.tab-duplicate.tab-fill.tab-group-fill.tab-group.tab-inactive-fill.tab-inactive.tab-move-fill.tab-move.tab-new-right-fill.tab-new-right.tab-recent-fill.tab-recent.tab-search-fill.tab-search.tab-unselected-fill.tab-unselected.tab.table-bar-fill.table-bar.table-chart-fill.table-chart-view-fill.table-chart-view.table-chart.table-convert-fill.table-convert.table-edit-fill.table-edit.table-eye-fill.table-eye.table-fill.table-lamp-fill.table-lamp.table-large-fill.table-large.table-restaurant-fill.table-restaurant.table-rows-fill.table-rows-narrow-fill.table-rows-narrow.table-rows.table-sign-fill.table-sign.table-view-fill.table-view.table.tablet-android-fill.tablet-android.tablet-camera-fill.tablet-camera.tablet-fill.tablet-mac-fill.tablet-mac.tablet.tabs-fill.tabs.tactic-fill.tactic.tag-fill.tag.takeout-dining-2-fill.takeout-dining-2.takeout-dining-fill.takeout-dining.tamper-detection-off-fill.tamper-detection-off.tamper-detection-on-fill.tamper-detection-on.tapas-fill.tapas.target-check-fill.target-check.target-fill.target.task-alt-fill.task-alt.task-fill.task.tatami-seat-fill.tatami-seat.taunt-fill.taunt.taxi-alert-fill.taxi-alert.team-dashboard-fill.team-dashboard.temp-preferences-eco-fill.temp-preferences-eco.temple-buddhist-fill.temple-buddhist.temple-hindu-fill.temple-hindu.tenancy-fill.tenancy.terminal-2-fill.terminal-2.terminal-add-fill.terminal-add.terminal-fill.terminal.text-ad-fill.text-ad-off-fill.text-ad-off.text-ad.text-compare-fill.text-compare.text-decrease-fill.text-decrease.text-fields-alt-fill.text-fields-alt.text-fields-fill.text-fields.text-format-fill.text-format.text-increase-fill.text-increase.text-rotate-up-fill.text-rotate-up.text-rotate-vertical-fill.text-rotate-vertical.text-rotation-angledown-fill.text-rotation-angledown.text-rotation-angleup-fill.text-rotation-angleup.text-rotation-down-fill.text-rotation-down.text-rotation-none-fill.text-rotation-none.text-select-end-fill.text-select-end.text-select-jump-to-beginning-fill.text-select-jump-to-beginning.text-select-jump-to-end-fill.text-select-jump-to-end.text-select-move-back-character-fill.text-select-move-back-character.text-select-move-back-word-fill.text-select-move-back-word.text-select-move-down-fill.text-select-move-down.text-select-move-forward-character-fill.text-select-move-forward-character.text-select-move-forward-word-fill.text-select-move-forward-word.text-select-move-up-fill.text-select-move-up.text-select-start-fill.text-select-start.text-snippet-fill.text-snippet.text-to-speech-fill.text-to-speech.text-up-fill.text-up.texture-add-fill.texture-add.texture-fill.texture-minus-fill.texture-minus.texture.theater-comedy-fill.theater-comedy.theaters-fill.theaters.thermometer-add-fill.thermometer-add.thermometer-alert-fill.thermometer-alert.thermometer-fill.thermometer-gain-fill.thermometer-gain.thermometer-loss-fill.thermometer-loss.thermometer-minus-fill.thermometer-minus.thermometer.thermostat-arrow-down-fill.thermostat-arrow-down.thermostat-arrow-up-fill.thermostat-arrow-up.thermostat-auto-fill.thermostat-auto.thermostat-carbon-fill.thermostat-carbon.thermostat-fill.thermostat.things-to-do-fill.things-to-do.thread-unread-fill.thread-unread.threat-intelligence-fill.threat-intelligence.thumb-down-fill.thumb-down.thumb-up-fill.thumb-up.thumbnail-bar-fill.thumbnail-bar.thumbs-up-double-fill.thumbs-up-double.thumbs-up-down-fill.thumbs-up-down.thunderstorm-fill.thunderstorm.tibia-alt-fill.tibia-alt.tibia-fill.tibia.tile-large-fill.tile-large.tile-medium-fill.tile-medium.tile-small-fill.tile-small.tilt-arrow-down-fill.tilt-arrow-down.tilt-arrow-up-fill.tilt-arrow-up.time-auto-fill.time-auto.timelapse-fill.timelapse.timeline-fill.timeline.timer-1-fill.timer-1.timer-10-alt-1-fill.timer-10-alt-1.timer-10-fill.timer-10-select-fill.timer-10-select.timer-10.timer-2-fill.timer-2.timer-3-alt-1-fill.timer-3-alt-1.timer-3-fill.timer-3-select-fill.timer-3-select.timer-3.timer-5-fill.timer-5-shutter-fill.timer-5-shutter.timer-5.timer-arrow-down-fill.timer-arrow-down.timer-arrow-up-fill.timer-arrow-up.timer-fill.timer-off-fill.timer-off.timer-pause-fill.timer-pause.timer-play-fill.timer-play.timer.tire-repair-fill.tire-repair.title-fill.title.titlecase-fill.titlecase.toast-fill.toast.toc-fill.toc.today-fill.today.toggle-off-fill.toggle-off.toggle-on-fill.toggle-on.token-fill.token.toll-fill.toll.tonality-2-fill.tonality-2.tonality-fill.tonality.toolbar-fill.toolbar.tools-flat-head-fill.tools-flat-head.tools-installation-kit-fill.tools-installation-kit.tools-ladder-fill.tools-ladder.tools-level-fill.tools-level.tools-phillips-fill.tools-phillips.tools-pliers-wire-stripper-fill.tools-pliers-wire-stripper.tools-power-drill-fill.tools-power-drill.tooltip-2-fill.tooltip-2.tooltip-fill.tooltip.top-panel-close-fill.top-panel-close.top-panel-open-fill.top-panel-open.topic-fill.topic.tornado-fill.tornado.total-dissolved-solids-fill.total-dissolved-solids.touch-app-fill.touch-app.touch-double-2-fill.touch-double-2.touch-double-fill.touch-double.touch-long-fill.touch-long.touch-triple-fill.touch-triple.touchpad-mouse-fill.touchpad-mouse-off-fill.touchpad-mouse-off.touchpad-mouse.tour-fill.tour.toys-and-games-fill.toys-and-games.toys-fan-fill.toys-fan.toys-fill.toys.track-changes-fill.track-changes.trackpad-input-2-fill.trackpad-input-2.trackpad-input-3-fill.trackpad-input-3.trackpad-input-fill.trackpad-input.traffic-fill.traffic-jam-fill.traffic-jam.traffic.trail-length-fill.trail-length-medium-fill.trail-length-medium.trail-length-short-fill.trail-length-short.trail-length.train-fill.train.tram-fill.tram.transfer-within-a-station-fill.transfer-within-a-station.transform-fill.transform.transgender-fill.transgender.transit-enterexit-fill.transit-enterexit.transit-ticket-fill.transit-ticket.transition-chop-fill.transition-chop.transition-dissolve-fill.transition-dissolve.transition-fade-fill.transition-fade.transition-push-fill.transition-push.transition-slide-fill.transition-slide.translate-fill.translate-indic-fill.translate-indic.translate.transportation-fill.transportation.travel-explore-fill.travel-explore.travel-fill.travel-luggage-and-bags-fill.travel-luggage-and-bags.travel.trending-down-fill.trending-down.trending-flat-fill.trending-flat.trending-up-fill.trending-up.triangle-circle-fill.triangle-circle.trip-fill.trip-origin-fill.trip-origin.trip.trolley-cable-car-fill.trolley-cable-car.trolley-fill.trolley.trophy-fill.trophy.troubleshoot-fill.troubleshoot.tsunami-fill.tsunami.tsv-fill.tsv.tty-fill.tty.tune-fill.tune.turn-left-fill.turn-left.turn-right-fill.turn-right.turn-sharp-left-fill.turn-sharp-left.turn-sharp-right-fill.turn-sharp-right.turn-slight-left-fill.turn-slight-left.turn-slight-right-fill.turn-slight-right.tv-displays-fill.tv-displays.tv-fill.tv-gen-fill.tv-gen.tv-guide-fill.tv-guide.tv-next-fill.tv-next.tv-off-fill.tv-off.tv-options-edit-channels-fill.tv-options-edit-channels.tv-options-input-settings-fill.tv-options-input-settings.tv-remote-fill.tv-remote.tv-signin-fill.tv-signin.tv-with-assistant-fill.tv-with-assistant.tv.two-pager-fill.two-pager-store-fill.two-pager-store.two-pager.two-wheeler-fill.two-wheeler.type-specimen-fill.type-specimen.u-turn-left-fill.u-turn-left.u-turn-right-fill.u-turn-right.udon-fill.udon.ulna-radius-alt-fill.ulna-radius-alt.ulna-radius-fill.ulna-radius.umbrella-fill.umbrella.unarchive-fill.unarchive.undereye-fill.undereye.undo-fill.undo.unfold-less-double-fill.unfold-less-double.unfold-less-fill.unfold-less.unfold-more-double-fill.unfold-more-double.unfold-more-fill.unfold-more.ungroup-fill.ungroup.universal-currency-alt-fill.universal-currency-alt.universal-currency-fill.universal-currency.universal-local-fill.universal-local.unknown-2-fill.unknown-2.unknown-5-fill.unknown-5.unknown-document-fill.unknown-document.unknown-med-fill.unknown-med.unlicense-fill.unlicense.unpaved-road-fill.unpaved-road.unpublished-fill.unpublished.unsubscribe-fill.unsubscribe.upcoming-fill.upcoming.update-disabled-fill.update-disabled.update-fill.update.upgrade-fill.upgrade.upi-pay-fill.upi-pay.upload-2-fill.upload-2.upload-file-fill.upload-file.upload-fill.upload.uppercase-fill.uppercase.urology-fill.urology.usb-fill.usb-off-fill.usb-off.usb.user-attributes-fill.user-attributes.vaccines-fill.vaccines.vacuum-2-fill.vacuum-2-on-fill.vacuum-2-on.vacuum-2.vacuum-fill.vacuum.valve-fill.valve.vape-free-fill.vape-free.vaping-rooms-fill.vaping-rooms.variable-add-fill.variable-add.variable-insert-fill.variable-insert.variable-remove-fill.variable-remove.variables-fill.variables.ventilator-fill.ventilator.verified-fill.verified-off-fill.verified-off.verified-user-fill.verified-user.verified.vertical-align-bottom-fill.vertical-align-bottom.vertical-align-center-fill.vertical-align-center.vertical-align-top-fill.vertical-align-top.vertical-distribute-fill.vertical-distribute.vertical-shades-closed-fill.vertical-shades-closed.vertical-shades-fill.vertical-shades.vertical-split-fill.vertical-split.video-call-fill.video-call.video-camera-back-add-fill.video-camera-back-add.video-camera-back-fill.video-camera-back.video-camera-front-fill.video-camera-front-off-fill.video-camera-front-off.video-camera-front.video-chat-fill.video-chat.video-file-fill.video-file.video-frame-copy-fill.video-frame-copy.video-frame-save-fill.video-frame-save.video-label-fill.video-label.video-library-fill.video-library.video-search-fill.video-search.video-settings-fill.video-settings.video-stable-fill.video-stable.video-template-fill.video-template.videocam-alert-fill.videocam-alert.videocam-fill.videocam-off-fill.videocam-off.videocam.videogame-asset-fill.videogame-asset-off-fill.videogame-asset-off.videogame-asset.view-agenda-fill.view-agenda.view-apps-fill.view-apps.view-array-fill.view-array.view-carousel-fill.view-carousel.view-column-2-fill.view-column-2.view-column-fill.view-column.view-comfy-alt-fill.view-comfy-alt.view-comfy-fill.view-comfy.view-compact-alt-fill.view-compact-alt.view-compact-fill.view-compact.view-cozy-fill.view-cozy.view-day-fill.view-day.view-headline-fill.view-headline.view-in-ar-fill.view-in-ar-off-fill.view-in-ar-off.view-in-ar.view-kanban-fill.view-kanban.view-list-fill.view-list.view-module-fill.view-module.view-object-track-fill.view-object-track.view-quilt-fill.view-quilt.view-real-size-fill.view-real-size.view-sidebar-fill.view-sidebar.view-stream-fill.view-stream.view-timeline-fill.view-timeline.view-week-fill.view-week.vignette-2-fill.vignette-2.vignette-fill.vignette.villa-fill.villa.visibility-fill.visibility-lock-fill.visibility-lock.visibility-off-fill.visibility-off.visibility.vital-signs-fill.vital-signs.vo2-max-fill.vo2-max.voice-chat-fill.voice-chat-off-fill.voice-chat-off.voice-chat.voice-over-off-fill.voice-over-off.voice-selection-fill.voice-selection-off-fill.voice-selection-off.voice-selection.voicemail-2-fill.voicemail-2.voicemail-fill.voicemail.volcano-fill.volcano.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.volunteer-activism-fill.volunteer-activism.voting-chip-fill.voting-chip.vpn-key-alert-fill.vpn-key-alert.vpn-key-fill.vpn-key-off-fill.vpn-key-off.vpn-key.vpn-lock-2-fill.vpn-lock-2.vpn-lock-fill.vpn-lock.vr180-create2d-fill.vr180-create2d-off-fill.vr180-create2d-off.vr180-create2d.vrpano-fill.vrpano.walk-bike-fill.walk-bike.wall-art-fill.wall-art.wall-lamp-fill.wall-lamp.wallet-fill.wallet.wallpaper-fill.wallpaper-slideshow-fill.wallpaper-slideshow.wallpaper.wand-shine-fill.wand-shine.wand-stars-fill.wand-stars.ward-fill.ward.warehouse-fill.warehouse.warning-fill.warning-off-fill.warning-off.warning.wash-fill.wash.washoku-fill.washoku.watch-alert-fill.watch-alert.watch-arrow-down-fill.watch-arrow-down.watch-arrow-fill.watch-arrow.watch-button-fill.watch-button-press-fill.watch-button-press.watch-button.watch-check-fill.watch-check.watch-fill.watch-lock-fill.watch-lock.watch-off-fill.watch-off.watch-screentime-fill.watch-screentime.watch-vibration-fill.watch-vibration.watch-wake-fill.watch-wake.watch.water-bottle-fill.water-bottle-large-fill.water-bottle-large.water-bottle.water-damage-fill.water-damage.water-do-fill.water-do.water-drop-fill.water-drop.water-drops-fill.water-drops.water-ec-fill.water-ec.water-fill.water-full-fill.water-full.water-heater-fill.water-heater.water-lock-fill.water-lock.water-loss-fill.water-loss.water-lux-fill.water-lux.water-medium-fill.water-medium.water-orp-fill.water-orp.water-ph-fill.water-ph.water-pump-fill.water-pump.water-voc-fill.water-voc.water.waterfall-chart-fill.waterfall-chart.waves-fill.waves.waving-hand-fill.waving-hand.wb-auto-fill.wb-auto.wb-incandescent-fill.wb-incandescent.wb-iridescent-fill.wb-iridescent.wb-shade-fill.wb-shade.wb-sunny-fill.wb-sunny.wb-twilight-2-fill.wb-twilight-2.wb-twilight-fill.wb-twilight.wc-fill.wc.weather-hail-fill.weather-hail.weather-mix-fill.weather-mix.weather-snowy-fill.weather-snowy.web-asset-fill.web-asset-off-fill.web-asset-off.web-asset.web-fill.web-stories-fill.web-stories.web-traffic-fill.web-traffic.web.webhook-fill.webhook.weekend-fill.weekend.weight-fill.weight.west-fill.west.whatshot-fill.whatshot.wheat-fill.wheat.wheelchair-pickup-fill.wheelchair-pickup.where-to-vote-fill.where-to-vote.widget-medium-fill.widget-medium.widget-menu-fill.widget-menu.widget-small-fill.widget-small.widget-width-fill.widget-width.widgets-fill.widgets.width-full-fill.width-full.width-normal-fill.width-normal.width-wide-fill.width-wide.wifi-1-bar-fill.wifi-1-bar.wifi-2-bar-fill.wifi-2-bar.wifi-add-fill.wifi-add.wifi-calling-bar-1-fill.wifi-calling-bar-1.wifi-calling-bar-2-fill.wifi-calling-bar-2.wifi-calling-bar-3-fill.wifi-calling-bar-3.wifi-calling-fill.wifi-calling.wifi-channel-fill.wifi-channel.wifi-device-fill.wifi-device.wifi-fill.wifi-find-fill.wifi-find.wifi-home-fill.wifi-home.wifi-lock-fill.wifi-lock.wifi-notification-fill.wifi-notification.wifi-off-fill.wifi-off.wifi-password-fill.wifi-password.wifi-protected-setup-fill.wifi-protected-setup.wifi-proxy-fill.wifi-proxy.wifi-tethering-error-fill.wifi-tethering-error.wifi-tethering-fill.wifi-tethering-off-fill.wifi-tethering-off.wifi-tethering.wifi.wind-power-fill.wind-power.window-closed-fill.window-closed.window-fill.window-open-fill.window-open.window-sensor-fill.window-sensor.window.windshield-defrost-auto-fill.windshield-defrost-auto.windshield-defrost-front-fill.windshield-defrost-front.windshield-defrost-rear-fill.windshield-defrost-rear.windshield-heat-front-fill.windshield-heat-front.wine-bar-fill.wine-bar.woman-2-fill.woman-2.woman-fill.woman.work-alert-fill.work-alert.work-fill.work-history-fill.work-history.work-update-fill.work-update.work.workspace-premium-fill.workspace-premium.workspaces-fill.workspaces.wounds-injuries-fill.wounds-injuries.wrap-text-fill.wrap-text.wrist-fill.wrist.wrong-location-fill.wrong-location.wysiwyg-fill.wysiwyg.x-circle-fill.x-circle.y-circle-fill.y-circle.yakitori-fill.yakitori.yard-fill.yard.yoshoku-fill.yoshoku.your-trips-fill.your-trips.youtube-searched-for-fill.youtube-searched-for.zone-person-alert-fill.zone-person-alert.zone-person-idle-fill.zone-person-idle.zone-person-urgent-fill.zone-person-urgent.zoom-in-fill.zoom-in-map-fill.zoom-in-map.zoom-in.zoom-out-fill.zoom-out-map-fill.zoom-out-map.zoom-out`.split(`.`),tech:/* @__PURE__ */ `100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:/* @__PURE__ */ `0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)},so=`
44
+ likec4lib {
45
+ icons {
46
+ aws:bundle // @likec4/icons/aws
47
+ azure:bundle // @likec4/icons/azure
48
+ gcp:bundle // @likec4/icons/gcp
49
+ md:bundle // @likec4/icons/md
50
+ tech:bundle // @likec4/icons/tech
51
+ bootstrap:bundle // @likec4/icons/bootstrap
52
+ }
53
+ }
54
+ `,co=Object.keys(oo);function isBundledIconGroup(e){return typeof e==`string`&&co.includes(e)}function isBundledIcon(e){if(typeof e!=`string`||!e.includes(`:`))return!1;let[t,r,...a]=e.split(`:`);return a.length===0&&(oo[t]?.includes(r)??!1)}const lo=oo,uo=`likec4builtin`,fo=`${uo}:///likec4/lib/icons.c4`;function isLikeC4Builtin(e){return(`uri`in e?e.uri:e).scheme===uo}function isNotLikeC4Builtin(e){return!isLikeC4Builtin(e)}const po=Ei(`/`),compareByUri=(e,t)=>po(gt(e.uri.path),gt(t.uri.path)),mo=Ei(`/`,!0),compareByUriDeepFirst=(e,t)=>mo(gt(e.uri.path),gt(t.uri.path));var ADisposable=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e=[...this.toDispose];this.toDispose.length=0;for(let t of e)try{t.dispose()}catch(e){logWarnError(e)}}throwIfDisposed(){this.isDisposed&&Y.warn(`this has already been disposed`)}};const ho={$type:`AbstractStep`,custom:`custom`,dotKind:`dotKind`,kind:`kind`,target:`target`,title:`title`},go={$type:`AltSteps`,branches:`branches`,title:`title`};function isAltSteps(e){return X.isInstance(e,go.$type)}const _o={$type:`AnyProperty`};function isAnyProperty(e){return X.isInstance(e,_o.$type)}const vo={$type:`ArrowProperty`,key:`key`,value:`value`};function isArrowProperty(e){return X.isInstance(e,vo.$type)}const yo={$type:`BorderProperty`,key:`key`,value:`value`};function isBorderProperty(e){return X.isInstance(e,yo.$type)}const bo={$type:`CatchBlock`,catch:`catch`,title:`title`,try:`try`};function isCatchBlock(e){return X.isInstance(e,bo.$type)}const xo={$type:`ColorLiteral`};function isColorLiteral(e){return X.isInstance(e,xo.$type)}const So={$type:`ColorProperty`,customColor:`customColor`,key:`key`,themeColor:`themeColor`};function isColorProperty(e){return X.isInstance(e,So.$type)}const Co={$type:`CustomColor`,name:`name`},wo={$type:`CustomElementProperties`,props:`props`};function isCustomElementProperties(e){return X.isInstance(e,wo.$type)}const To={$type:`CustomRelationProperties`,props:`props`};function isCustomRelationProperties(e){return X.isInstance(e,To.$type)}const Eo={$type:`DeployedInstance`,body:`body`,name:`name`,summary:`summary`,target:`target`,title:`title`};function isDeployedInstance(e){return X.isInstance(e,Eo.$type)}const Do={$type:`DeployedInstanceBody`,elements:`elements`,props:`props`,tags:`tags`};function isDeployedInstanceBody(e){return X.isInstance(e,Do.$type)}const Oo={$type:`DeploymentElement`};function isDeploymentElement(e){return X.isInstance(e,Oo.$type)}const ko={$type:`DeploymentNode`,body:`body`,kind:`kind`,name:`name`,summary:`summary`,title:`title`};function isDeploymentNode$1(e){return X.isInstance(e,ko.$type)}e(isDeploymentNode$1,`isDeploymentNode`);const Ao={$type:`DeploymentNodeBody`,elements:`elements`,props:`props`,tags:`tags`};function isDeploymentNodeBody(e){return X.isInstance(e,Ao.$type)}const jo={$type:`DeploymentNodeKind`,name:`name`};function isDeploymentNodeKind(e){return X.isInstance(e,jo.$type)}const Mo={$type:`DeploymentNodeOrElementKind`},No={$type:`DeploymentRelation`,body:`body`,description:`description`,dotKind:`dotKind`,isBidirectional:`isBidirectional`,kind:`kind`,source:`source`,tags:`tags`,target:`target`,technology:`technology`,title:`title`};function isDeploymentRelation(e){return X.isInstance(e,No.$type)}const Po={$type:`DeploymentRelationBody`,props:`props`,tags:`tags`};function isDeploymentRelationBody(e){return X.isInstance(e,Po.$type)}const Fo={$type:`DeploymentView`,body:`body`,name:`name`};function isDeploymentView$1(e){return X.isInstance(e,Fo.$type)}e(isDeploymentView$1,`isDeploymentView`);const Io={$type:`DeploymentViewBody`,props:`props`,rules:`rules`,tags:`tags`};function isDeploymentViewBody(e){return X.isInstance(e,Io.$type)}const Lo={$type:`DeploymentViewRule`};function isDeploymentViewRule(e){return X.isInstance(e,Lo.$type)}const Ro={$type:`DeploymentViewRuleGroup`,groupRules:`groupRules`,props:`props`,title:`title`};function isDeploymentViewRuleGroup(e){return X.isInstance(e,Ro.$type)}const zo={$type:`DeploymentViewRulePredicate`,expr:`expr`,isInclude:`isInclude`};function isDeploymentViewRulePredicate(e){return X.isInstance(e,zo.$type)}const Bo={$type:`DeploymentViewRuleStyle`,props:`props`,targets:`targets`};function isDeploymentViewRuleStyle(e){return X.isInstance(e,Bo.$type)}const Vo={$type:`DescriptionFileProperty`,key:`key`,value:`value`};function isDescriptionFileProperty(e){return X.isInstance(e,Vo.$type)}const Ho={$type:`DiffAdd`,elements:`elements`};function isDiffAdd(e){return X.isInstance(e,Ho.$type)}const Uo={$type:`DiffRemove`,entries:`entries`};function isDiffRemove(e){return X.isInstance(e,Uo.$type)}const Wo={$type:`DiffRemoveEntry`,dotKind:`dotKind`,isBidirectional:`isBidirectional`,kind:`kind`,source:`source`,target:`target`,title:`title`};function isDiffRemoveEntry(e){return X.isInstance(e,Wo.$type)}const Go={$type:`DiffStringProperty`,key:`key`,value:`value`};function isDiffStringProperty(e){return X.isInstance(e,Go.$type)}const Ko={$type:`DirectedRelationExpr`,source:`source`,target:`target`};function isDirectedRelationExpr(e){return X.isInstance(e,Ko.$type)}const qo={$type:`DynamicView`,body:`body`,name:`name`};function isDynamicView$1(e){return X.isInstance(e,qo.$type)}e(isDynamicView$1,`isDynamicView`);const Jo={$type:`DynamicViewBody`,props:`props`,rules:`rules`,steps:`steps`,tags:`tags`};function isDynamicViewBody(e){return X.isInstance(e,Jo.$type)}const Yo={$type:`DynamicViewDisplayVariantProperty`,key:`key`,value:`value`};function isDynamicViewDisplayVariantProperty(e){return X.isInstance(e,Yo.$type)}const Xo={$type:`DynamicViewGlobalPredicateRef`,predicate:`predicate`};function isDynamicViewGlobalPredicateRef(e){return X.isInstance(e,Xo.$type)}const Zo={$type:`DynamicViewIncludePredicate`,exprs:`exprs`};function isDynamicViewIncludePredicate(e){return X.isInstance(e,Zo.$type)}const Qo={$type:`DynamicViewProperty`},$o={$type:`DynamicViewRef`,view:`view`},es={$type:`DynamicViewRule`};function isDynamicViewRule(e){return X.isInstance(e,es.$type)}const ts={$type:`Element`,body:`body`,kind:`kind`,name:`name`,props:`props`};function isElement(e){return X.isInstance(e,ts.$type)}const ns={$type:`ElementBody`,elements:`elements`,props:`props`,tags:`tags`};function isElementBody(e){return X.isInstance(e,ns.$type)}const rs={$type:`ElementKind`,name:`name`};function isElementKind(e){return X.isInstance(e,rs.$type)}const is={$type:`ElementKindExpression`,isEqual:`isEqual`,kind:`kind`};function isElementKindExpression(e){return X.isInstance(e,is.$type)}const as={$type:`ElementProperty`};function isElementProperty(e){return X.isInstance(e,as.$type)}const os={$type:`ElementRef`,modelElement:`modelElement`};function isElementRef(e){return X.isInstance(e,os.$type)}const ss={$type:`ElementStringProperty`,key:`key`,value:`value`};function isElementStringProperty(e){return X.isInstance(e,ss.$type)}const cs={$type:`ElementStyleProperty`,key:`key`,props:`props`};function isElementStyleProperty(e){return X.isInstance(e,cs.$type)}const ls={$type:`ElementTagExpression`,isEqual:`isEqual`,tag:`tag`};function isElementTagExpression(e){return X.isInstance(e,ls.$type)}const us={$type:`ElementView`,body:`body`,extends:`extends`,name:`name`,viewOf:`viewOf`};function isElementView$1(e){return X.isInstance(e,us.$type)}e(isElementView$1,`isElementView`);const ds={$type:`ElementViewBody`,props:`props`,rules:`rules`,tags:`tags`};function isElementViewBody(e){return X.isInstance(e,ds.$type)}const fs={$type:`ElementViewRef`,view:`view`},ps={$type:`Expressions`,prev:`prev`,value:`value`};function isExpressions(e){return X.isInstance(e,ps.$type)}const ms={$type:`ExpressionV2`};function isExpressionV2(e){return X.isInstance(e,ms.$type)}const hs={$type:`ExtendDeployment`,body:`body`,deploymentNode:`deploymentNode`};function isExtendDeployment(e){return X.isInstance(e,hs.$type)}const gs={$type:`ExtendDeploymentBody`,elements:`elements`,props:`props`,tags:`tags`};function isExtendDeploymentBody(e){return X.isInstance(e,gs.$type)}const _s={$type:`ExtendElement`,body:`body`,element:`element`};function isExtendElement(e){return X.isInstance(e,_s.$type)}const vs={$type:`ExtendElementBody`,elements:`elements`,props:`props`,tags:`tags`};function isExtendElementBody(e){return X.isInstance(e,vs.$type)}const ys={$type:`ExtendElementOrRelation`};function isExtendElementOrRelation(e){return X.isInstance(e,ys.$type)}const bs={$type:`ExtendElementProperty`},xs={$type:`ExtendRelation`,body:`body`,dotKind:`dotKind`,isBidirectional:`isBidirectional`,kind:`kind`,source:`source`,target:`target`,title:`title`};function isExtendRelation(e){return X.isInstance(e,xs.$type)}const Ss={$type:`ExtendRelationBody`,props:`props`,tags:`tags`};function isExtendRelationBody(e){return X.isInstance(e,Ss.$type)}const Cs={$type:`ExtendRelationProperty`},ws={$type:`FinallyBlock`,finally:`finally`,title:`title`,tryCatch:`tryCatch`};function isFinallyBlock(e){return X.isInstance(e,ws.$type)}const Ts={$type:`FqnExpr`};function isFqnExpr(e){return X.isInstance(e,Ts.$type)}const Es={$type:`FqnExpressions`,prev:`prev`,value:`value`};function isFqnExpressions(e){return X.isInstance(e,Es.$type)}const Ds={$type:`FqnExprOrWhere`};function isFqnExprOrWhere(e){return X.isInstance(e,Ds.$type)}const Os={$type:`FqnExprOrWith`};function isFqnExprOrWith(e){return X.isInstance(e,Os.$type)}const ks={$type:`FqnExprWhere`,subject:`subject`,where:`where`};function isFqnExprWhere(e){return X.isInstance(e,ks.$type)}const As={$type:`FqnExprWith`,custom:`custom`,subject:`subject`};function isFqnExprWith(e){return X.isInstance(e,As.$type)}const js={$type:`FqnRef`,parent:`parent`,value:`value`};function isFqnRef(e){return X.isInstance(e,js.$type)}const Ms={$type:`FqnReferenceable`},Ns={$type:`FqnRefExpr`,ref:`ref`,selector:`selector`};function isFqnRefExpr(e){return X.isInstance(e,Ns.$type)}const Ps={$type:`GlobalDynamicPredicateGroup`,name:`name`,predicates:`predicates`};function isGlobalDynamicPredicateGroup(e){return X.isInstance(e,Ps.$type)}const Fs={$type:`GlobalPredicateGroup`,name:`name`,predicates:`predicates`};function isGlobalPredicateGroup(e){return X.isInstance(e,Fs.$type)}const Is={$type:`Globals`,name:`name`,predicates:`predicates`,styles:`styles`};function isGlobals(e){return X.isInstance(e,Is.$type)}const Ls={$type:`GlobalStyle`,id:`id`,props:`props`,targets:`targets`};function isGlobalStyle(e){return X.isInstance(e,Ls.$type)}const Rs={$type:`GlobalStyleGroup`,id:`id`,styles:`styles`};function isGlobalStyleGroup(e){return X.isInstance(e,Rs.$type)}const zs={$type:`GlobalStyleId`,name:`name`},Bs={$type:`HexColor`,hex:`hex`};function isHexColor(e){return X.isInstance(e,Bs.$type)}const Vs={$type:`IconColorProperty`,customColor:`customColor`,key:`key`,themeColor:`themeColor`};function isIconColorProperty(e){return X.isInstance(e,Vs.$type)}const Hs={$type:`IconPositionProperty`,key:`key`,value:`value`};function isIconPositionProperty(e){return X.isInstance(e,Hs.$type)}const Us={$type:`IconProperty`,key:`key`,libicon:`libicon`,value:`value`};function isIconProperty(e){return X.isInstance(e,Us.$type)}const Ws={$type:`IconSizeProperty`,key:`key`,value:`value`};function isIconSizeProperty(e){return X.isInstance(e,Ws.$type)}const Gs={$type:`Imported`,imported:`imported`,prev:`prev`};function isImported(e){return X.isInstance(e,Gs.$type)}const Ks={$type:`ImportsFromPoject`,imports:`imports`,project:`project`};function isImportsFromPoject(e){return X.isInstance(e,Ks.$type)}const qs={$type:`IncomingRelationExpr`,to:`to`};function isIncomingRelationExpr(e){return X.isInstance(e,qs.$type)}const Js={$type:`InOutRelationExpr`,inout:`inout`};function isInOutRelationExpr(e){return X.isInstance(e,Js.$type)}const Ys={$type:`LibIcon`,name:`name`};function isLibIcon(e){return X.isInstance(e,Ys.$type)}const Xs={$type:`LikeC4Grammar`,deployments:`deployments`,diffs:`diffs`,globals:`globals`,imports:`imports`,likec4lib:`likec4lib`,models:`models`,specifications:`specifications`,views:`views`};function isLikeC4Grammar(e){return X.isInstance(e,Xs.$type)}const Zs={$type:`LikeC4Lib`,icons:`icons`};function isLikeC4Lib(e){return X.isInstance(e,Zs.$type)}const Qs={$type:`LikeC4View`};function isLikeC4View(e){return X.isInstance(e,Qs.$type)}const $s={$type:`LineProperty`,key:`key`,value:`value`};function isLineProperty(e){return X.isInstance(e,$s.$type)}const ec={$type:`LinkProperty`,key:`key`,title:`title`,value:`value`};function isLinkProperty(e){return X.isInstance(e,ec.$type)}const tc={$type:`MarkdownOrString`,markdown:`markdown`,text:`text`};function isMarkdownOrString(e){return X.isInstance(e,tc.$type)}const nc={$type:`MetadataArray`,values:`values`};function isMetadataArray(e){return X.isInstance(e,nc.$type)}const rc={$type:`MetadataAttribute`,boolValue:`boolValue`,key:`key`,value:`value`};function isMetadataAttribute(e){return X.isInstance(e,rc.$type)}const ic={$type:`MetadataBody`,props:`props`};function isMetadataBody(e){return X.isInstance(e,ic.$type)}const ac={$type:`MetadataProperty`};function isMetadataProperty(e){return X.isInstance(e,ac.$type)}const oc={$type:`MetadataValue`},sc={$type:`Model`,elements:`elements`,name:`name`};function isModel(e){return X.isInstance(e,sc.$type)}const cc={$type:`ModelDeployments`,elements:`elements`,name:`name`};function isModelDeployments(e){return X.isInstance(e,cc.$type)}const lc={$type:`ModelDiff`,adds:`adds`,name:`name`,props:`props`,removes:`removes`,title:`title`};function isModelDiff(e){return X.isInstance(e,lc.$type)}const uc={$type:`ModelElement`},dc={$type:`ModelReferenceable`},fc={$type:`ModelViews`,folder:`folder`,name:`name`,styles:`styles`,views:`views`};function isModelViews(e){return X.isInstance(e,fc.$type)}const pc={$type:`MultipleProperty`,key:`key`,value:`value`};function isMultipleProperty(e){return X.isInstance(e,pc.$type)}const mc={$type:`NavigateToProperty`,key:`key`,value:`value`};function isNavigateToProperty(e){return X.isInstance(e,mc.$type)}const hc={$type:`NotationProperty`,key:`key`,value:`value`};function isNotationProperty(e){return X.isInstance(e,hc.$type)}const gc={$type:`NotesProperty`,key:`key`,value:`value`};function isNotesProperty(e){return X.isInstance(e,gc.$type)}const _c={$type:`OpacityProperty`,key:`key`,value:`value`};function isOpacityProperty(e){return X.isInstance(e,_c.$type)}const vc={$type:`OutgoingRelationExpr`,dotKind:`dotKind`,from:`from`,isBidirectional:`isBidirectional`,kind:`kind`};function isOutgoingRelationExpr(e){return X.isInstance(e,vc.$type)}const yc={$type:`PaddingSizeProperty`,key:`key`,value:`value`};function isPaddingSizeProperty(e){return X.isInstance(e,yc.$type)}const bc={$type:`Referenceable`},xc={$type:`Relation`,body:`body`,description:`description`,dotKind:`dotKind`,isBidirectional:`isBidirectional`,kind:`kind`,source:`source`,tags:`tags`,target:`target`,technology:`technology`,title:`title`};function isRelation(e){return X.isInstance(e,xc.$type)}const Sc={$type:`RelationBody`,props:`props`,tags:`tags`};function isRelationBody(e){return X.isInstance(e,Sc.$type)}const Cc={$type:`RelationExpr`};function isRelationExpr(e){return X.isInstance(e,Cc.$type)}const wc={$type:`RelationExprOrWhere`};function isRelationExprOrWhere(e){return X.isInstance(e,wc.$type)}const Tc={$type:`RelationExprOrWith`};function isRelationExprOrWith(e){return X.isInstance(e,Tc.$type)}const Ec={$type:`RelationExprWhere`,subject:`subject`,where:`where`};function isRelationExprWhere(e){return X.isInstance(e,Ec.$type)}const Dc={$type:`RelationExprWith`,custom:`custom`,subject:`subject`};function isRelationExprWith(e){return X.isInstance(e,Dc.$type)}const Oc={$type:`RelationKindDotRef`,kind:`kind`};function isRelationKindDotRef(e){return X.isInstance(e,Oc.$type)}const kc={$type:`RelationNavigateToProperty`,key:`key`,value:`value`};function isRelationNavigateToProperty(e){return X.isInstance(e,kc.$type)}const Ac={$type:`RelationProperty`},jc={$type:`RelationshipKind`,name:`name`};function isRelationshipKind(e){return X.isInstance(e,jc.$type)}const Mc={$type:`RelationshipStyleProperty`};function isRelationshipStyleProperty(e){return X.isInstance(e,Mc.$type)}const Nc={$type:`RelationStringProperty`,key:`key`,value:`value`};function isRelationStringProperty(e){return X.isInstance(e,Nc.$type)}const Pc={$type:`RelationStyleProperty`,key:`key`,props:`props`};function isRelationStyleProperty(e){return X.isInstance(e,Pc.$type)}const Fc={$type:`RGBAColor`,alpha:`alpha`,blue:`blue`,green:`green`,red:`red`};function isRGBAColor(e){return X.isInstance(e,Fc.$type)}const Ic={$type:`ShapeProperty`,key:`key`,value:`value`};function isShapeProperty(e){return X.isInstance(e,Ic.$type)}const Lc={$type:`ShapeSizeProperty`,key:`key`,value:`value`};function isShapeSizeProperty(e){return X.isInstance(e,Lc.$type)}const Rc={$type:`SizeProperty`};function isSizeProperty(e){return X.isInstance(e,Rc.$type)}const zc={$type:`SizingProperty`,key:`key`,value:`value`};function isSizingProperty(e){return X.isInstance(e,zc.$type)}const Bc={$type:`SpecificationColor`,color:`color`,name:`name`};function isSpecificationColor(e){return X.isInstance(e,Bc.$type)}const Vc={$type:`SpecificationDeploymentNodeKind`,kind:`kind`,props:`props`,tags:`tags`};function isSpecificationDeploymentNodeKind(e){return X.isInstance(e,Vc.$type)}const Hc={$type:`SpecificationElementKind`,kind:`kind`,props:`props`,tags:`tags`};function isSpecificationElementKind(e){return X.isInstance(e,Hc.$type)}const Uc={$type:`SpecificationElementStringProperty`,key:`key`,value:`value`};function isSpecificationElementStringProperty(e){return X.isInstance(e,Uc.$type)}const Wc={$type:`SpecificationRelationshipKind`,kind:`kind`,props:`props`,tags:`tags`};function isSpecificationRelationshipKind(e){return X.isInstance(e,Wc.$type)}const Gc={$type:`SpecificationRelationshipStringProperty`,key:`key`,value:`value`};function isSpecificationRelationshipStringProperty(e){return X.isInstance(e,Gc.$type)}const Kc={$type:`SpecificationRule`,colors:`colors`,deploymentNodes:`deploymentNodes`,elements:`elements`,name:`name`,relationships:`relationships`,tags:`tags`};function isSpecificationRule(e){return X.isInstance(e,Kc.$type)}const qc={$type:`SpecificationTag`,color:`color`,customColor:`customColor`,tag:`tag`,themeColor:`themeColor`};function isSpecificationTag(e){return X.isInstance(e,qc.$type)}const Jc={$type:`Step`,custom:`custom`,dotKind:`dotKind`,isBackward:`isBackward`,kind:`kind`,source:`source`,target:`target`,title:`title`};function isStep(e){return X.isInstance(e,Jc.$type)}const Yc={$type:`StepOrSeries`};function isStepOrSeries(e){return X.isInstance(e,Yc.$type)}const Xc={$type:`StepsBlock`,steps:`steps`};function isStepsBlock(e){return X.isInstance(e,Xc.$type)}const Zc={$type:`StepSeries`,custom:`custom`,dotKind:`dotKind`,kind:`kind`,source:`source`,target:`target`,title:`title`};function isStepSeries(e){return X.isInstance(e,Zc.$type)}const Qc={$type:`StepStatement`};function isStepStatement(e){return X.isInstance(e,Qc.$type)}const $c={$type:`StrictFqnElementRef`,el:`el`,parent:`parent`};function isStrictFqnElementRef(e){return X.isInstance(e,$c.$type)}const el={$type:`StrictFqnRef`,parent:`parent`,value:`value`};function isStrictFqnRef(e){return X.isInstance(e,el.$type)}const tl={$type:`StringProperty`};function isStringProperty(e){return X.isInstance(e,tl.$type)}const nl={$type:`StyleProperty`};function isStyleProperty(e){return X.isInstance(e,nl.$type)}const rl={$type:`SubflowStep`,kind:`kind`,steps:`steps`,title:`title`};function isSubflowStep(e){return X.isInstance(e,rl.$type)}const il={$type:`Tag`,name:`name`};function isTag(e){return X.isInstance(e,il.$type)}const al={$type:`TagRef`,tag:`tag`};function isTagRef(e){return X.isInstance(e,al.$type)}const ol={$type:`Tags`,prev:`prev`,values:`values`};function isTags(e){return X.isInstance(e,ol.$type)}const sl={$type:`TextSizeProperty`,key:`key`,value:`value`};function isTextSizeProperty(e){return X.isInstance(e,sl.$type)}const cl={$type:`TryBlock`,steps:`steps`,title:`title`};function isTryBlock(e){return X.isInstance(e,cl.$type)}const ll={$type:`TryStep`};function isTryStep(e){return X.isInstance(e,ll.$type)}const ul={$type:`ViewOrderProperty`,key:`key`,value:`value`};function isViewOrderProperty(e){return X.isInstance(e,ul.$type)}const dl={$type:`ViewProperty`};function isViewProperty(e){return X.isInstance(e,dl.$type)}const fl={$type:`ViewRef`,view:`view`},pl={$type:`ViewRoutingProperty`,key:`key`,value:`value`};function isViewRoutingProperty(e){return X.isInstance(e,pl.$type)}const ml={$type:`ViewRule`};function isViewRule(e){return X.isInstance(e,ml.$type)}const hl={$type:`ViewRuleAncestors`,key:`key`,value:`value`};function isViewRuleAncestors(e){return X.isInstance(e,hl.$type)}const gl={$type:`ViewRuleAutoLayout`,direction:`direction`,nodeSep:`nodeSep`,rankSep:`rankSep`,routing:`routing`};function isViewRuleAutoLayout(e){return X.isInstance(e,gl.$type)}const _l={$type:`ViewRuleGlobalPredicateRef`,predicate:`predicate`};function isViewRuleGlobalPredicateRef(e){return X.isInstance(e,_l.$type)}const vl={$type:`ViewRuleGlobalStyle`,style:`style`};function isViewRuleGlobalStyle(e){return X.isInstance(e,vl.$type)}const yl={$type:`ViewRuleGroup`,groupRules:`groupRules`,props:`props`,title:`title`};function isViewRuleGroup(e){return X.isInstance(e,yl.$type)}const bl={$type:`ViewRulePredicate`,exprs:`exprs`,isInclude:`isInclude`};function isViewRulePredicate(e){return X.isInstance(e,bl.$type)}const xl={$type:`ViewRuleRank`,targets:`targets`,value:`value`};function isViewRuleRank(e){return X.isInstance(e,xl.$type)}const Sl={$type:`ViewRuleStyle`,props:`props`,targets:`targets`};function isViewRuleStyle(e){return X.isInstance(e,Sl.$type)}const Cl={$type:`ViewRuleStyleOrGlobalRef`};function isViewRuleStyleOrGlobalRef(e){return X.isInstance(e,Cl.$type)}const wl={$type:`ViewStringProperty`,key:`key`,value:`value`};function isViewStringProperty(e){return X.isInstance(e,wl.$type)}const Tl={$type:`WhereBinaryExpression`,left:`left`,operator:`operator`,right:`right`};function isWhereBinaryExpression(e){return X.isInstance(e,Tl.$type)}const El={$type:`WhereElement`};function isWhereElement(e){return X.isInstance(e,El.$type)}const Dl={$type:`WhereElementExpression`};function isWhereElementExpression(e){return X.isInstance(e,Dl.$type)}const Ol={$type:`WhereElementKind`,not:`not`,operator:`operator`,value:`value`};function isWhereElementKind(e){return X.isInstance(e,Ol.$type)}const kl={$type:`WhereElementMetadata`,key:`key`,not:`not`,operator:`operator`,value:`value`};function isWhereElementMetadata(e){return X.isInstance(e,kl.$type)}const Al={$type:`WhereElementNegation`,value:`value`};function isWhereElementNegation(e){return X.isInstance(e,Al.$type)}const jl={$type:`WhereElementTag`,not:`not`,operator:`operator`,value:`value`};function isWhereElementTag(e){return X.isInstance(e,jl.$type)}const Ml={$type:`WhereExpression`},Nl={$type:`WhereKindEqual`};function isWhereKindEqual(e){return X.isInstance(e,Nl.$type)}const Pl={$type:`WhereMetadataEqual`};function isWhereMetadataEqual(e){return X.isInstance(e,Pl.$type)}const Fl={$type:`WhereRelation`};function isWhereRelation(e){return X.isInstance(e,Fl.$type)}const Il={$type:`WhereRelationExpression`};function isWhereRelationExpression(e){return X.isInstance(e,Il.$type)}const Ll={$type:`WhereRelationKind`,not:`not`,operator:`operator`,value:`value`};function isWhereRelationKind(e){return X.isInstance(e,Ll.$type)}const Rl={$type:`WhereRelationMetadata`,key:`key`,not:`not`,operator:`operator`,value:`value`};function isWhereRelationMetadata(e){return X.isInstance(e,Rl.$type)}const zl={$type:`WhereRelationNegation`,value:`value`};function isWhereRelationNegation(e){return X.isInstance(e,zl.$type)}const Bl={$type:`WhereRelationParticipantKind`,not:`not`,operator:`operator`,participant:`participant`,value:`value`};function isWhereRelationParticipantKind(e){return X.isInstance(e,Bl.$type)}const Vl={$type:`WhereRelationParticipantMetadata`,key:`key`,not:`not`,operator:`operator`,participant:`participant`,value:`value`};function isWhereRelationParticipantMetadata(e){return X.isInstance(e,Vl.$type)}const Hl={$type:`WhereRelationParticipantTag`,not:`not`,operator:`operator`,participant:`participant`,value:`value`};function isWhereRelationParticipantTag(e){return X.isInstance(e,Hl.$type)}const Ul={$type:`WhereRelationTag`,not:`not`,operator:`operator`,value:`value`};function isWhereRelationTag(e){return X.isInstance(e,Ul.$type)}const Wl={$type:`WhereTagEqual`};function isWhereTagEqual(e){return X.isInstance(e,Wl.$type)}const Gl={$type:`WildcardExpression`,isWildcard:`isWildcard`};function isWildcardExpression(e){return X.isInstance(e,Gl.$type)}var LikeC4AstReflection=class extends Ve{types={AbstractStep:{name:ho.$type,properties:{custom:{name:ho.custom,optional:!0},dotKind:{name:ho.dotKind,optional:!0},kind:{name:ho.kind,referenceType:jc.$type,optional:!0},target:{name:ho.target},title:{name:ho.title,optional:!0}},superTypes:[]},AltSteps:{name:go.$type,properties:{branches:{name:go.branches,defaultValue:[]},title:{name:go.title,optional:!0}},superTypes:[Qc.$type]},AnyProperty:{name:_o.$type,properties:{},superTypes:[]},ArrowProperty:{name:vo.$type,properties:{key:{name:vo.key},value:{name:vo.value}},superTypes:[Mc.$type]},BorderProperty:{name:yo.$type,properties:{key:{name:yo.key},value:{name:yo.value}},superTypes:[nl.$type]},CatchBlock:{name:bo.$type,properties:{catch:{name:bo.catch},title:{name:bo.title,optional:!0},try:{name:bo.try}},superTypes:[ll.$type]},ColorLiteral:{name:xo.$type,properties:{},superTypes:[]},ColorProperty:{name:So.$type,properties:{customColor:{name:So.customColor,referenceType:Co.$type,optional:!0},key:{name:So.key},themeColor:{name:So.themeColor,optional:!0}},superTypes:[Mc.$type,nl.$type]},CustomColor:{name:Co.$type,properties:{name:{name:Co.name}},superTypes:[]},CustomElementProperties:{name:wo.$type,properties:{props:{name:wo.props,defaultValue:[],optional:!0}},superTypes:[]},CustomRelationProperties:{name:To.$type,properties:{props:{name:To.props,defaultValue:[],optional:!0}},superTypes:[]},DeployedInstance:{name:Eo.$type,properties:{body:{name:Eo.body,optional:!0},name:{name:Eo.name,optional:!0},summary:{name:Eo.summary,optional:!0},target:{name:Eo.target},title:{name:Eo.title,optional:!0}},superTypes:[Oo.$type,bc.$type]},DeployedInstanceBody:{name:Do.$type,properties:{elements:{name:Do.elements,defaultValue:[],optional:!0},props:{name:Do.props,defaultValue:[],optional:!0},tags:{name:Do.tags,optional:!0}},superTypes:[]},DeploymentElement:{name:Oo.$type,properties:{},superTypes:[]},DeploymentNode:{name:ko.$type,properties:{body:{name:ko.body,optional:!0},kind:{name:ko.kind,referenceType:jo.$type},name:{name:ko.name},summary:{name:ko.summary,optional:!0},title:{name:ko.title,optional:!0}},superTypes:[Oo.$type,bc.$type]},DeploymentNodeBody:{name:Ao.$type,properties:{elements:{name:Ao.elements,defaultValue:[],optional:!0},props:{name:Ao.props,defaultValue:[],optional:!0},tags:{name:Ao.tags,optional:!0}},superTypes:[]},DeploymentNodeKind:{name:jo.$type,properties:{name:{name:jo.name}},superTypes:[Mo.$type]},DeploymentNodeOrElementKind:{name:Mo.$type,properties:{},superTypes:[]},DeploymentRelation:{name:No.$type,properties:{body:{name:No.body,optional:!0},description:{name:No.description,optional:!0},dotKind:{name:No.dotKind,optional:!0},isBidirectional:{name:No.isBidirectional,defaultValue:!1,optional:!0},kind:{name:No.kind,referenceType:jc.$type,optional:!0},source:{name:No.source,optional:!0},tags:{name:No.tags,optional:!0},target:{name:No.target},technology:{name:No.technology,optional:!0},title:{name:No.title,optional:!0}},superTypes:[]},DeploymentRelationBody:{name:Po.$type,properties:{props:{name:Po.props,defaultValue:[],optional:!0},tags:{name:Po.tags,optional:!0}},superTypes:[]},DeploymentView:{name:Fo.$type,properties:{body:{name:Fo.body,optional:!0},name:{name:Fo.name}},superTypes:[Qs.$type]},DeploymentViewBody:{name:Io.$type,properties:{props:{name:Io.props,defaultValue:[],optional:!0},rules:{name:Io.rules,defaultValue:[],optional:!0},tags:{name:Io.tags,optional:!0}},superTypes:[]},DeploymentViewRule:{name:Lo.$type,properties:{},superTypes:[]},DeploymentViewRuleGroup:{name:Ro.$type,properties:{groupRules:{name:Ro.groupRules,defaultValue:[],optional:!0},props:{name:Ro.props,defaultValue:[],optional:!0},title:{name:Ro.title,optional:!0}},superTypes:[Lo.$type]},DeploymentViewRulePredicate:{name:zo.$type,properties:{expr:{name:zo.expr},isInclude:{name:zo.isInclude,defaultValue:!1,optional:!0}},superTypes:[Lo.$type]},DeploymentViewRuleStyle:{name:Bo.$type,properties:{props:{name:Bo.props,defaultValue:[],optional:!0},targets:{name:Bo.targets}},superTypes:[Lo.$type]},DescriptionFileProperty:{name:Vo.$type,properties:{key:{name:Vo.key},value:{name:Vo.value}},superTypes:[as.$type,Ac.$type,dl.$type]},DiffAdd:{name:Ho.$type,properties:{elements:{name:Ho.elements,defaultValue:[],optional:!0}},superTypes:[]},DiffRemove:{name:Uo.$type,properties:{entries:{name:Uo.entries,defaultValue:[],optional:!0}},superTypes:[]},DiffRemoveEntry:{name:Wo.$type,properties:{dotKind:{name:Wo.dotKind,optional:!0},isBidirectional:{name:Wo.isBidirectional,defaultValue:!1,optional:!0},kind:{name:Wo.kind,referenceType:jc.$type,optional:!0},source:{name:Wo.source},target:{name:Wo.target,optional:!0},title:{name:Wo.title,optional:!0}},superTypes:[]},DiffStringProperty:{name:Go.$type,properties:{key:{name:Go.key},value:{name:Go.value}},superTypes:[]},DirectedRelationExpr:{name:Ko.$type,properties:{source:{name:Ko.source},target:{name:Ko.target}},superTypes:[Cc.$type]},DynamicView:{name:qo.$type,properties:{body:{name:qo.body,optional:!0},name:{name:qo.name}},superTypes:[Qs.$type]},DynamicViewBody:{name:Jo.$type,properties:{props:{name:Jo.props,defaultValue:[],optional:!0},rules:{name:Jo.rules,defaultValue:[],optional:!0},steps:{name:Jo.steps,defaultValue:[],optional:!0},tags:{name:Jo.tags,optional:!0}},superTypes:[]},DynamicViewDisplayVariantProperty:{name:Yo.$type,properties:{key:{name:Yo.key},value:{name:Yo.value}},superTypes:[Qo.$type]},DynamicViewGlobalPredicateRef:{name:Xo.$type,properties:{predicate:{name:Xo.predicate,referenceType:Ps.$type}},superTypes:[es.$type]},DynamicViewIncludePredicate:{name:Zo.$type,properties:{exprs:{name:Zo.exprs}},superTypes:[es.$type]},DynamicViewProperty:{name:Qo.$type,properties:{},superTypes:[_o.$type]},DynamicViewRef:{name:$o.$type,properties:{view:{name:$o.view,referenceType:qo.$type}},superTypes:[]},DynamicViewRule:{name:es.$type,properties:{},superTypes:[]},Element:{name:ts.$type,properties:{body:{name:ts.body,optional:!0},kind:{name:ts.kind,referenceType:rs.$type},name:{name:ts.name},props:{name:ts.props,defaultValue:[],optional:!0}},superTypes:[Ms.$type,uc.$type,dc.$type,bc.$type]},ElementBody:{name:ns.$type,properties:{elements:{name:ns.elements,defaultValue:[],optional:!0},props:{name:ns.props,defaultValue:[],optional:!0},tags:{name:ns.tags,optional:!0}},superTypes:[]},ElementKind:{name:rs.$type,properties:{name:{name:rs.name}},superTypes:[Mo.$type]},ElementKindExpression:{name:is.$type,properties:{isEqual:{name:is.isEqual,defaultValue:!1,optional:!0},kind:{name:is.kind,referenceType:rs.$type}},superTypes:[Ts.$type]},ElementProperty:{name:as.$type,properties:{},superTypes:[_o.$type]},ElementRef:{name:os.$type,properties:{modelElement:{name:os.modelElement}},superTypes:[]},ElementStringProperty:{name:ss.$type,properties:{key:{name:ss.key},value:{name:ss.value}},superTypes:[as.$type,tl.$type]},ElementStyleProperty:{name:cs.$type,properties:{key:{name:cs.key},props:{name:cs.props,defaultValue:[],optional:!0}},superTypes:[as.$type]},ElementTagExpression:{name:ls.$type,properties:{isEqual:{name:ls.isEqual,defaultValue:!1,optional:!0},tag:{name:ls.tag}},superTypes:[Ts.$type]},ElementView:{name:us.$type,properties:{body:{name:us.body,optional:!0},extends:{name:us.extends,optional:!0},name:{name:us.name,optional:!0},viewOf:{name:us.viewOf,optional:!0}},superTypes:[Qs.$type]},ElementViewBody:{name:ds.$type,properties:{props:{name:ds.props,defaultValue:[],optional:!0},rules:{name:ds.rules,defaultValue:[],optional:!0},tags:{name:ds.tags,optional:!0}},superTypes:[]},ElementViewRef:{name:fs.$type,properties:{view:{name:fs.view,referenceType:us.$type}},superTypes:[]},ExpressionV2:{name:ms.$type,properties:{},superTypes:[]},Expressions:{name:ps.$type,properties:{prev:{name:ps.prev,optional:!0},value:{name:ps.value}},superTypes:[]},ExtendDeployment:{name:hs.$type,properties:{body:{name:hs.body},deploymentNode:{name:hs.deploymentNode}},superTypes:[Ms.$type]},ExtendDeploymentBody:{name:gs.$type,properties:{elements:{name:gs.elements,defaultValue:[],optional:!0},props:{name:gs.props,defaultValue:[],optional:!0},tags:{name:gs.tags,optional:!0}},superTypes:[]},ExtendElement:{name:_s.$type,properties:{body:{name:_s.body},element:{name:_s.element}},superTypes:[ys.$type,Ms.$type]},ExtendElementBody:{name:vs.$type,properties:{elements:{name:vs.elements,defaultValue:[],optional:!0},props:{name:vs.props,defaultValue:[],optional:!0},tags:{name:vs.tags,optional:!0}},superTypes:[]},ExtendElementOrRelation:{name:ys.$type,properties:{},superTypes:[uc.$type]},ExtendElementProperty:{name:bs.$type,properties:{},superTypes:[]},ExtendRelation:{name:xs.$type,properties:{body:{name:xs.body},dotKind:{name:xs.dotKind,optional:!0},isBidirectional:{name:xs.isBidirectional,defaultValue:!1,optional:!0},kind:{name:xs.kind,referenceType:jc.$type,optional:!0},source:{name:xs.source},target:{name:xs.target},title:{name:xs.title,optional:!0}},superTypes:[ys.$type]},ExtendRelationBody:{name:Ss.$type,properties:{props:{name:Ss.props,defaultValue:[],optional:!0},tags:{name:Ss.tags,optional:!0}},superTypes:[]},ExtendRelationProperty:{name:Cs.$type,properties:{},superTypes:[]},FinallyBlock:{name:ws.$type,properties:{finally:{name:ws.finally},title:{name:ws.title,optional:!0},tryCatch:{name:ws.tryCatch}},superTypes:[ll.$type]},FqnExpr:{name:Ts.$type,properties:{},superTypes:[Ds.$type]},FqnExprOrWhere:{name:Ds.$type,properties:{},superTypes:[Os.$type]},FqnExprOrWith:{name:Os.$type,properties:{},superTypes:[ms.$type]},FqnExprWhere:{name:ks.$type,properties:{subject:{name:ks.subject},where:{name:ks.where,optional:!0}},superTypes:[Ds.$type]},FqnExprWith:{name:As.$type,properties:{custom:{name:As.custom,optional:!0},subject:{name:As.subject}},superTypes:[Os.$type]},FqnExpressions:{name:Es.$type,properties:{prev:{name:Es.prev,optional:!0},value:{name:Es.value}},superTypes:[]},FqnRef:{name:js.$type,properties:{parent:{name:js.parent,optional:!0},value:{name:js.value,referenceType:bc.$type}},superTypes:[]},FqnRefExpr:{name:Ns.$type,properties:{ref:{name:Ns.ref},selector:{name:Ns.selector,optional:!0}},superTypes:[Ts.$type]},FqnReferenceable:{name:Ms.$type,properties:{},superTypes:[]},GlobalDynamicPredicateGroup:{name:Ps.$type,properties:{name:{name:Ps.name},predicates:{name:Ps.predicates,defaultValue:[],optional:!0}},superTypes:[]},GlobalPredicateGroup:{name:Fs.$type,properties:{name:{name:Fs.name},predicates:{name:Fs.predicates,defaultValue:[],optional:!0}},superTypes:[]},GlobalStyle:{name:Ls.$type,properties:{id:{name:Ls.id},props:{name:Ls.props,defaultValue:[],optional:!0},targets:{name:Ls.targets}},superTypes:[]},GlobalStyleGroup:{name:Rs.$type,properties:{id:{name:Rs.id},styles:{name:Rs.styles,defaultValue:[],optional:!0}},superTypes:[]},GlobalStyleId:{name:zs.$type,properties:{name:{name:zs.name}},superTypes:[]},Globals:{name:Is.$type,properties:{name:{name:Is.name},predicates:{name:Is.predicates,defaultValue:[],optional:!0},styles:{name:Is.styles,defaultValue:[],optional:!0}},superTypes:[]},HexColor:{name:Bs.$type,properties:{hex:{name:Bs.hex}},superTypes:[xo.$type]},IconColorProperty:{name:Vs.$type,properties:{customColor:{name:Vs.customColor,referenceType:Co.$type,optional:!0},key:{name:Vs.key},themeColor:{name:Vs.themeColor,optional:!0}},superTypes:[nl.$type]},IconPositionProperty:{name:Hs.$type,properties:{key:{name:Hs.key},value:{name:Hs.value}},superTypes:[nl.$type]},IconProperty:{name:Us.$type,properties:{key:{name:Us.key},libicon:{name:Us.libicon,referenceType:Ys.$type,optional:!0},value:{name:Us.value,optional:!0}},superTypes:[as.$type,nl.$type]},IconSizeProperty:{name:Ws.$type,properties:{key:{name:Ws.key},value:{name:Ws.value}},superTypes:[Rc.$type,nl.$type]},Imported:{name:Gs.$type,properties:{imported:{name:Gs.imported,referenceType:ts.$type},prev:{name:Gs.prev,optional:!0}},superTypes:[dc.$type,bc.$type]},ImportsFromPoject:{name:Ks.$type,properties:{imports:{name:Ks.imports},project:{name:Ks.project}},superTypes:[]},InOutRelationExpr:{name:Js.$type,properties:{inout:{name:Js.inout}},superTypes:[Cc.$type]},IncomingRelationExpr:{name:qs.$type,properties:{to:{name:qs.to}},superTypes:[Cc.$type]},LibIcon:{name:Ys.$type,properties:{name:{name:Ys.name}},superTypes:[]},LikeC4Grammar:{name:Xs.$type,properties:{deployments:{name:Xs.deployments,defaultValue:[],optional:!0},diffs:{name:Xs.diffs,defaultValue:[],optional:!0},globals:{name:Xs.globals,defaultValue:[],optional:!0},imports:{name:Xs.imports,defaultValue:[],optional:!0},likec4lib:{name:Xs.likec4lib,defaultValue:[],optional:!0},models:{name:Xs.models,defaultValue:[],optional:!0},specifications:{name:Xs.specifications,defaultValue:[],optional:!0},views:{name:Xs.views,defaultValue:[],optional:!0}},superTypes:[]},LikeC4Lib:{name:Zs.$type,properties:{icons:{name:Zs.icons,defaultValue:[]}},superTypes:[]},LikeC4View:{name:Qs.$type,properties:{},superTypes:[]},LineProperty:{name:$s.$type,properties:{key:{name:$s.key},value:{name:$s.value}},superTypes:[Mc.$type]},LinkProperty:{name:ec.$type,properties:{key:{name:ec.key},title:{name:ec.title,optional:!0},value:{name:ec.value}},superTypes:[as.$type,bs.$type,Cs.$type,Ac.$type,dl.$type]},MarkdownOrString:{name:tc.$type,properties:{markdown:{name:tc.markdown,optional:!0},text:{name:tc.text,optional:!0}},superTypes:[oc.$type]},MetadataArray:{name:nc.$type,properties:{values:{name:nc.values,defaultValue:[]}},superTypes:[oc.$type]},MetadataAttribute:{name:rc.$type,properties:{boolValue:{name:rc.boolValue,defaultValue:!1,optional:!0},key:{name:rc.key},value:{name:rc.value,optional:!0}},superTypes:[tl.$type]},MetadataBody:{name:ic.$type,properties:{props:{name:ic.props,defaultValue:[],optional:!0}},superTypes:[ac.$type]},MetadataProperty:{name:ac.$type,properties:{},superTypes:[as.$type,bs.$type,Cs.$type,Ac.$type]},MetadataValue:{name:oc.$type,properties:{},superTypes:[]},Model:{name:sc.$type,properties:{elements:{name:sc.elements,defaultValue:[],optional:!0},name:{name:sc.name}},superTypes:[]},ModelDeployments:{name:cc.$type,properties:{elements:{name:cc.elements,defaultValue:[],optional:!0},name:{name:cc.name}},superTypes:[]},ModelDiff:{name:lc.$type,properties:{adds:{name:lc.adds,defaultValue:[],optional:!0},name:{name:lc.name},props:{name:lc.props,defaultValue:[],optional:!0},removes:{name:lc.removes,defaultValue:[],optional:!0},title:{name:lc.title,optional:!0}},superTypes:[]},ModelElement:{name:uc.$type,properties:{},superTypes:[]},ModelReferenceable:{name:dc.$type,properties:{},superTypes:[]},ModelViews:{name:fc.$type,properties:{folder:{name:fc.folder,optional:!0},name:{name:fc.name},styles:{name:fc.styles,defaultValue:[],optional:!0},views:{name:fc.views,defaultValue:[],optional:!0}},superTypes:[]},MultipleProperty:{name:pc.$type,properties:{key:{name:pc.key},value:{name:pc.value,defaultValue:!1}},superTypes:[nl.$type]},NavigateToProperty:{name:mc.$type,properties:{key:{name:mc.key},value:{name:mc.value}},superTypes:[_o.$type]},NotationProperty:{name:hc.$type,properties:{key:{name:hc.key},value:{name:hc.value}},superTypes:[tl.$type]},NotesProperty:{name:gc.$type,properties:{key:{name:gc.key},value:{name:gc.value}},superTypes:[tl.$type]},OpacityProperty:{name:_c.$type,properties:{key:{name:_c.key},value:{name:_c.value}},superTypes:[nl.$type]},OutgoingRelationExpr:{name:vc.$type,properties:{dotKind:{name:vc.dotKind,optional:!0},from:{name:vc.from},isBidirectional:{name:vc.isBidirectional,defaultValue:!1,optional:!0},kind:{name:vc.kind,referenceType:jc.$type,optional:!0}},superTypes:[Cc.$type]},PaddingSizeProperty:{name:yc.$type,properties:{key:{name:yc.key},value:{name:yc.value}},superTypes:[Rc.$type,nl.$type]},RGBAColor:{name:Fc.$type,properties:{alpha:{name:Fc.alpha,optional:!0},blue:{name:Fc.blue},green:{name:Fc.green},red:{name:Fc.red}},superTypes:[xo.$type]},Referenceable:{name:bc.$type,properties:{},superTypes:[Ms.$type]},Relation:{name:xc.$type,properties:{body:{name:xc.body,optional:!0},description:{name:xc.description,optional:!0},dotKind:{name:xc.dotKind,optional:!0},isBidirectional:{name:xc.isBidirectional,defaultValue:!1,optional:!0},kind:{name:xc.kind,referenceType:jc.$type,optional:!0},source:{name:xc.source,optional:!0},tags:{name:xc.tags,optional:!0},target:{name:xc.target},technology:{name:xc.technology,optional:!0},title:{name:xc.title,optional:!0}},superTypes:[uc.$type]},RelationBody:{name:Sc.$type,properties:{props:{name:Sc.props,defaultValue:[],optional:!0},tags:{name:Sc.tags,optional:!0}},superTypes:[]},RelationExpr:{name:Cc.$type,properties:{},superTypes:[wc.$type]},RelationExprOrWhere:{name:wc.$type,properties:{},superTypes:[Tc.$type]},RelationExprOrWith:{name:Tc.$type,properties:{},superTypes:[ms.$type]},RelationExprWhere:{name:Ec.$type,properties:{subject:{name:Ec.subject},where:{name:Ec.where,optional:!0}},superTypes:[wc.$type]},RelationExprWith:{name:Dc.$type,properties:{custom:{name:Dc.custom,optional:!0},subject:{name:Dc.subject}},superTypes:[Tc.$type]},RelationKindDotRef:{name:Oc.$type,properties:{kind:{name:Oc.kind,referenceType:jc.$type}},superTypes:[]},RelationNavigateToProperty:{name:kc.$type,properties:{key:{name:kc.key},value:{name:kc.value}},superTypes:[Ac.$type]},RelationProperty:{name:Ac.$type,properties:{},superTypes:[_o.$type]},RelationStringProperty:{name:Nc.$type,properties:{key:{name:Nc.key},value:{name:Nc.value}},superTypes:[Ac.$type,tl.$type]},RelationStyleProperty:{name:Pc.$type,properties:{key:{name:Pc.key},props:{name:Pc.props,defaultValue:[],optional:!0}},superTypes:[Ac.$type]},RelationshipKind:{name:jc.$type,properties:{name:{name:jc.name}},superTypes:[]},RelationshipStyleProperty:{name:Mc.$type,properties:{},superTypes:[_o.$type]},ShapeProperty:{name:Ic.$type,properties:{key:{name:Ic.key},value:{name:Ic.value}},superTypes:[nl.$type]},ShapeSizeProperty:{name:Lc.$type,properties:{key:{name:Lc.key},value:{name:Lc.value}},superTypes:[Rc.$type,nl.$type]},SizeProperty:{name:Rc.$type,properties:{},superTypes:[]},SizingProperty:{name:zc.$type,properties:{key:{name:zc.key},value:{name:zc.value}},superTypes:[nl.$type]},SpecificationColor:{name:Bc.$type,properties:{color:{name:Bc.color},name:{name:Bc.name}},superTypes:[]},SpecificationDeploymentNodeKind:{name:Vc.$type,properties:{kind:{name:Vc.kind},props:{name:Vc.props,defaultValue:[],optional:!0},tags:{name:Vc.tags,optional:!0}},superTypes:[]},SpecificationElementKind:{name:Hc.$type,properties:{kind:{name:Hc.kind},props:{name:Hc.props,defaultValue:[],optional:!0},tags:{name:Hc.tags,optional:!0}},superTypes:[]},SpecificationElementStringProperty:{name:Uc.$type,properties:{key:{name:Uc.key},value:{name:Uc.value}},superTypes:[tl.$type]},SpecificationRelationshipKind:{name:Wc.$type,properties:{kind:{name:Wc.kind},props:{name:Wc.props,defaultValue:[],optional:!0},tags:{name:Wc.tags,optional:!0}},superTypes:[]},SpecificationRelationshipStringProperty:{name:Gc.$type,properties:{key:{name:Gc.key},value:{name:Gc.value}},superTypes:[tl.$type]},SpecificationRule:{name:Kc.$type,properties:{colors:{name:Kc.colors,defaultValue:[],optional:!0},deploymentNodes:{name:Kc.deploymentNodes,defaultValue:[],optional:!0},elements:{name:Kc.elements,defaultValue:[],optional:!0},name:{name:Kc.name},relationships:{name:Kc.relationships,defaultValue:[],optional:!0},tags:{name:Kc.tags,defaultValue:[],optional:!0}},superTypes:[]},SpecificationTag:{name:qc.$type,properties:{color:{name:qc.color,optional:!0},customColor:{name:qc.customColor,referenceType:Co.$type,optional:!0},tag:{name:qc.tag},themeColor:{name:qc.themeColor,optional:!0}},superTypes:[]},Step:{name:Jc.$type,properties:{custom:{name:Jc.custom,optional:!0},dotKind:{name:Jc.dotKind,optional:!0},isBackward:{name:Jc.isBackward,defaultValue:!1,optional:!0},kind:{name:Jc.kind,referenceType:jc.$type,optional:!0},source:{name:Jc.source},target:{name:Jc.target},title:{name:Jc.title,optional:!0}},superTypes:[ho.$type,Yc.$type]},StepOrSeries:{name:Yc.$type,properties:{},superTypes:[Qc.$type]},StepSeries:{name:Zc.$type,properties:{custom:{name:Zc.custom,optional:!0},dotKind:{name:Zc.dotKind,optional:!0},kind:{name:Zc.kind,referenceType:jc.$type,optional:!0},source:{name:Zc.source},target:{name:Zc.target},title:{name:Zc.title,optional:!0}},superTypes:[ho.$type,Yc.$type]},StepStatement:{name:Qc.$type,properties:{},superTypes:[]},StepsBlock:{name:Xc.$type,properties:{steps:{name:Xc.steps,defaultValue:[]}},superTypes:[]},StrictFqnElementRef:{name:$c.$type,properties:{el:{name:$c.el,referenceType:ts.$type},parent:{name:$c.parent,optional:!0}},superTypes:[]},StrictFqnRef:{name:el.$type,properties:{parent:{name:el.parent,optional:!0},value:{name:el.value,referenceType:bc.$type}},superTypes:[]},StringProperty:{name:tl.$type,properties:{},superTypes:[_o.$type]},StyleProperty:{name:nl.$type,properties:{},superTypes:[_o.$type]},SubflowStep:{name:rl.$type,properties:{kind:{name:rl.kind},steps:{name:rl.steps,defaultValue:[]},title:{name:rl.title,optional:!0}},superTypes:[Xc.$type,Qc.$type]},Tag:{name:il.$type,properties:{name:{name:il.name}},superTypes:[]},TagRef:{name:al.$type,properties:{tag:{name:al.tag,referenceType:il.$type}},superTypes:[]},Tags:{name:ol.$type,properties:{prev:{name:ol.prev,optional:!0},values:{name:ol.values,defaultValue:[]}},superTypes:[]},TextSizeProperty:{name:sl.$type,properties:{key:{name:sl.key},value:{name:sl.value}},superTypes:[Rc.$type,nl.$type]},TryBlock:{name:cl.$type,properties:{steps:{name:cl.steps,defaultValue:[]},title:{name:cl.title,optional:!0}},superTypes:[Xc.$type,ll.$type]},TryStep:{name:ll.$type,properties:{},superTypes:[Qc.$type]},ViewOrderProperty:{name:ul.$type,properties:{key:{name:ul.key},value:{name:ul.value}},superTypes:[dl.$type]},ViewProperty:{name:dl.$type,properties:{},superTypes:[_o.$type,Qo.$type]},ViewRef:{name:fl.$type,properties:{view:{name:fl.view,referenceType:Qs.$type}},superTypes:[]},ViewRoutingProperty:{name:pl.$type,properties:{key:{name:pl.key},value:{name:pl.value}},superTypes:[dl.$type]},ViewRule:{name:ml.$type,properties:{},superTypes:[]},ViewRuleAncestors:{name:hl.$type,properties:{key:{name:hl.key},value:{name:hl.value,defaultValue:!1}},superTypes:[Lo.$type]},ViewRuleAutoLayout:{name:gl.$type,properties:{direction:{name:gl.direction},nodeSep:{name:gl.nodeSep,optional:!0},rankSep:{name:gl.rankSep,optional:!0},routing:{name:gl.routing,optional:!0}},superTypes:[Lo.$type,es.$type,ml.$type]},ViewRuleGlobalPredicateRef:{name:_l.$type,properties:{predicate:{name:_l.predicate,referenceType:Fs.$type}},superTypes:[ml.$type]},ViewRuleGlobalStyle:{name:vl.$type,properties:{style:{name:vl.style,referenceType:zs.$type}},superTypes:[Cl.$type]},ViewRuleGroup:{name:yl.$type,properties:{groupRules:{name:yl.groupRules,defaultValue:[],optional:!0},props:{name:yl.props,defaultValue:[],optional:!0},title:{name:yl.title,optional:!0}},superTypes:[ml.$type]},ViewRulePredicate:{name:bl.$type,properties:{exprs:{name:bl.exprs},isInclude:{name:bl.isInclude,defaultValue:!1,optional:!0}},superTypes:[ml.$type]},ViewRuleRank:{name:xl.$type,properties:{targets:{name:xl.targets},value:{name:xl.value,optional:!0}},superTypes:[ml.$type]},ViewRuleStyle:{name:Sl.$type,properties:{props:{name:Sl.props,defaultValue:[],optional:!0},targets:{name:Sl.targets}},superTypes:[Cl.$type]},ViewRuleStyleOrGlobalRef:{name:Cl.$type,properties:{},superTypes:[es.$type,ml.$type]},ViewStringProperty:{name:wl.$type,properties:{key:{name:wl.key},value:{name:wl.value}},superTypes:[tl.$type,dl.$type]},WhereBinaryExpression:{name:Tl.$type,properties:{left:{name:Tl.left},operator:{name:Tl.operator},right:{name:Tl.right}},superTypes:[Dl.$type,Il.$type]},WhereElement:{name:El.$type,properties:{},superTypes:[Dl.$type]},WhereElementExpression:{name:Dl.$type,properties:{},superTypes:[Ml.$type]},WhereElementKind:{name:Ol.$type,properties:{not:{name:Ol.not,defaultValue:!1,optional:!0},operator:{name:Ol.operator},value:{name:Ol.value,referenceType:Mo.$type}},superTypes:[El.$type,Nl.$type]},WhereElementMetadata:{name:kl.$type,properties:{key:{name:kl.key},not:{name:kl.not,defaultValue:!1,optional:!0},operator:{name:kl.operator,optional:!0},value:{name:kl.value,optional:!0}},superTypes:[El.$type,Pl.$type]},WhereElementNegation:{name:Al.$type,properties:{value:{name:Al.value}},superTypes:[Dl.$type]},WhereElementTag:{name:jl.$type,properties:{not:{name:jl.not,defaultValue:!1,optional:!0},operator:{name:jl.operator},value:{name:jl.value}},superTypes:[El.$type,Wl.$type]},WhereExpression:{name:Ml.$type,properties:{},superTypes:[]},WhereKindEqual:{name:Nl.$type,properties:{},superTypes:[]},WhereMetadataEqual:{name:Pl.$type,properties:{},superTypes:[]},WhereRelation:{name:Fl.$type,properties:{},superTypes:[Il.$type]},WhereRelationExpression:{name:Il.$type,properties:{},superTypes:[Ml.$type]},WhereRelationKind:{name:Ll.$type,properties:{not:{name:Ll.not,defaultValue:!1,optional:!0},operator:{name:Ll.operator},value:{name:Ll.value,referenceType:jc.$type}},superTypes:[Nl.$type,Fl.$type]},WhereRelationMetadata:{name:Rl.$type,properties:{key:{name:Rl.key},not:{name:Rl.not,defaultValue:!1,optional:!0},operator:{name:Rl.operator,optional:!0},value:{name:Rl.value,optional:!0}},superTypes:[Pl.$type,Fl.$type]},WhereRelationNegation:{name:zl.$type,properties:{value:{name:zl.value}},superTypes:[Il.$type]},WhereRelationParticipantKind:{name:Bl.$type,properties:{not:{name:Bl.not,defaultValue:!1,optional:!0},operator:{name:Bl.operator},participant:{name:Bl.participant},value:{name:Bl.value,referenceType:Mo.$type}},superTypes:[Nl.$type,Fl.$type]},WhereRelationParticipantMetadata:{name:Vl.$type,properties:{key:{name:Vl.key},not:{name:Vl.not,defaultValue:!1,optional:!0},operator:{name:Vl.operator,optional:!0},participant:{name:Vl.participant},value:{name:Vl.value,optional:!0}},superTypes:[Pl.$type,Fl.$type]},WhereRelationParticipantTag:{name:Hl.$type,properties:{not:{name:Hl.not,defaultValue:!1,optional:!0},operator:{name:Hl.operator},participant:{name:Hl.participant},value:{name:Hl.value}},superTypes:[Fl.$type,Wl.$type]},WhereRelationTag:{name:Ul.$type,properties:{not:{name:Ul.not,defaultValue:!1,optional:!0},operator:{name:Ul.operator},value:{name:Ul.value}},superTypes:[Fl.$type,Wl.$type]},WhereTagEqual:{name:Wl.$type,properties:{},superTypes:[]},WildcardExpression:{name:Gl.$type,properties:{isWildcard:{name:Gl.isWildcard,defaultValue:!1}},superTypes:[Ts.$type]}}};const X=new LikeC4AstReflection;let Kl;const LikeC4Grammar=()=>Kl??=lt(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]}},{"$type":"Assignment","feature":"diffs","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ModelElement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@208"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false,"isMulti":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ExtendElementOrRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendRelation"}},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendElement"}},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]}}]}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementRef","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"StrictFqnElementRef","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@1"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"FqnRef","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"StrictFqnRef","returnType":{"$ref":"#/interfaces@3"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@3"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"?"}]},"entry":false,"fragment":false},{"$type":"ParserRule","fragment":true,"name":"RelationConnector","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"]<->"}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}},{"$type":"Assignment","feature":"boolValue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false,"isMulti":false}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false,"isMulti":false}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@48"},"deprecatedSyntax":false,"isMulti":false}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewOrderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"order"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@213"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRoutingProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"routing"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EdgeRoutingValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"spline"},{"$type":"Keyword","value":"ortho"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@143"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@144"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@145"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@213"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@213"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"routing","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@192"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@192"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false,"isMulti":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}]},"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Keyword","value":"]->"}]}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]}}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@5"},"deprecatedSyntax":false,"isMulti":false}}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"MetadataFilterValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]}}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@205"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"StepStatement","returnType":{"$ref":"#/types@10"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"StepsBlockFragment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"SubflowKind","returnType":{"$ref":"#/types@11"},"definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SubflowStep","returnType":{"$ref":"#/interfaces@5"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"StepsBlock","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},"entry":false,"fragment":false,"parameters":[],"$comment":"/**\\n * Represents a block of step statements, i.e. { ... }\\n */"},{"$type":"ParserRule","name":"TryStep","returnType":{"$ref":"#/types@12"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"FinallyBlock","returnType":{"$ref":"#/interfaces@8"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@8"},"feature":"tryCatch","operator":"="},{"$type":"Keyword","value":"finally"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"finally","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"CatchBlock","returnType":{"$ref":"#/interfaces@7"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@7"},"feature":"try","operator":"="},{"$type":"Keyword","value":"catch"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"catch","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"TryBlock","returnType":{"$ref":"#/interfaces@6"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"try"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"AltSteps","returnType":{"$ref":"#/interfaces@9"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"branches","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"StepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},"cardinality":"?"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"StepSeries","returnType":{"$ref":"#/interfaces@12"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@12"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]}],"cardinality":"*"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Step","returnType":{"$ref":"#/interfaces@11"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@208"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@208"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@128/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@128/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},"cardinality":"?"}]},"entry":false,"fragment":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ViewRuleAncestors","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"includeAncestors"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ModelDiff","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"diff"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]}},{"$type":"Assignment","feature":"removes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]}},{"$type":"Assignment","feature":"adds","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DiffStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DiffRemove","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"remove"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DiffRemoveEntry","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DiffAdd","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"add"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]}]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DescriptionFileProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"descriptionFile"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"ColorRef","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@209"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SizingValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"auto"},{"$type":"Keyword","value":"fixed"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"SizingProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"sizing"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@206"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"DynamicViewFlowKeyword","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"},{"$type":"Keyword","value":"try"},{"$type":"Keyword","value":"catch"},{"$type":"Keyword","value":"finally"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"},{"$type":"Keyword","value":"agent"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@213"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@213"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@213"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@212"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@213"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@209"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@204"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@215"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@213"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@214"},"arguments":[]},{"$type":"Keyword","value":"add"}]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@198"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@201"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@210"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@211"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@214"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"diff"},{"$type":"Keyword","value":"add"},{"$type":"Keyword","value":"remove"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@214"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"},{"$type":"Keyword","value":"relationship"},{"$type":"Keyword","value":"diff"},{"$type":"Keyword","value":"add"},{"$type":"Keyword","value":"remove"},{"$type":"Keyword","value":"routing"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"HashId","dataType":"string","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@204"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@208"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@207"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@208"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@207"},"arguments":[]}]},"entry":false,"parameters":[]},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t \\\\uFEFF]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|md|tech):[-\\\\w]*/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"},"parenthesized":false},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"},"parenthesized":false},"parenthesized":false}],"parenthesized":false},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""},"parenthesized":false},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""},"parenthesized":false},"parenthesized":false}],"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/([a-zA-Z]|_+[a-zA-Z0-9])[-\\\\w]*/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"ElementRef","attributes":[{"$type":"TypeAttribute","name":"modelElement","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnElementRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}}},{"$type":"TypeAttribute","name":"el","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},"isMulti":false},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},"isMulti":false},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@3"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},"isMulti":false},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StepsBlock","attributes":[{"$type":"TypeAttribute","name":"steps","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@10"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"SubflowStep","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"kind","type":{"$type":"SimpleType","typeRef":{"$ref":"#/types@11"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"TryBlock","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"CatchBlock","attributes":[{"$type":"TypeAttribute","name":"try","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"catch","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FinallyBlock","attributes":[{"$type":"TypeAttribute","name":"tryCatch","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}}]},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"finally","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AltSteps","attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"branches","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AbstractStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}},"isMulti":false}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@174"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@78"}}}],"superTypes":[]},{"$type":"Interface","name":"Step","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}],"$comment":"/**\\n * A single step in a dynamic view flow\\n * source -> target\\n */"},{"$type":"Interface","name":"StepSeries","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]},"isOptional":false}],"$comment":"/**\\n * A series of steps in a dynamic view flow\\n * source -> target1 -> target2 -> ...\\n */"}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@124"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@48"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@130"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@57"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@38"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@42"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@75"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@54"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@172"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@79"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@168"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@100/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@5/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@100/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@4/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@1/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereMetadataEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@100/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@3/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@0/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@95"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@102"}}]}},{"$type":"Type","name":"StepStatement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@13"}},{"$type":"SimpleType","typeRef":{"$ref":"#/types@12"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@9"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}]}},{"$type":"Type","name":"SubflowKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","stringType":"opt"},{"$type":"SimpleType","stringType":"par"},{"$type":"SimpleType","stringType":"parallel"},{"$type":"SimpleType","stringType":"loop"},{"$type":"SimpleType","stringType":"when"},{"$type":"SimpleType","stringType":"if"},{"$type":"SimpleType","stringType":"else"},{"$type":"SimpleType","stringType":"break"}]}},{"$type":"Type","name":"TryStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@8"}}]}},{"$type":"Type","name":"StepOrSeries","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@124"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@25/definition/elements@1/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@126"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@163"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@164"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@165"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@156"}}]}}],"imports":[]}`),ql={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},Jl={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},Yl={AstReflection:()=>new LikeC4AstReflection},Xl={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>ql,parser:{ParserConfig:()=>Jl}},Zl=Symbol.for(`idattr`),Ql={writeId(e,t){return e[Zl]=t,e},readId(e){return e[Zl]}},$l={writeId(e,t){return L(t)?e[Zl]=void 0:e[Zl]=t,e},readId(e){return e[Zl]}},eu=[`c4Specification`,`c4Elements`,`c4ExtendElements`,`c4ExtendDeployments`,`c4ExtendRelations`,`c4Relations`,`c4Globals`,`c4Views`,`c4Deployments`,`c4DeploymentRelations`,`c4Imports`,`c4Diffs`,`c4DescriptionFiles`,`likec4Parser`];function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===ql.languageId}function isLikeC4UserDocument(e){return isLikeC4LangiumDocument(e)&&isNotLikeC4Builtin(e)}function isParsedLikeC4LangiumDocument(e){return isLikeC4LangiumDocument(e)&&e.state>=E.Linked&&!!e.likec4Parser&&!!e.c4Specification&&!!e.c4Elements&&!!e.c4ExtendElements&&!!e.c4ExtendDeployments&&!!e.c4ExtendRelations&&!!e.c4Relations&&!!e.c4Views&&!!e.c4Deployments&&!!e.c4DeploymentRelations&&!!e.c4Imports&&!!e.c4Diffs&&!!e.c4DescriptionFiles}function isValidatedLikeC4LangiumDocument(e){return!isParsedLikeC4LangiumDocument(e)||e.state!==E.Validated?!1:(e.diagnostics??=[],!0)}function isErrorDiagnostic$1(e){return e.severity===at.Error}e(isErrorDiagnostic$1,`isErrorDiagnostic`);function calcValidationHash(e){return I(e.diagnostics??[],M(isErrorDiagnostic$1),V(e=>`${Me.getMessageString(e)}|${e.node?.$type??``}`),nn((e,t,r)=>stringHash$1(`${e}|${t}|${r}`),``))}function isValidationStateChanged(e,t){return calcValidationHash(e)!==t.validationHash}function parseMarkdownAsString(e){return e?.markdown||e?.text}function parseAstPercent(e){let t=parseFloat(e);return isNaN(t)?100:ln(t,{min:0,max:100})}function parseAstOpacityProperty({value:e}){return parseAstPercent(e)}function parseAstSizeValue({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:Vi(e)}}function parseAstIconPositionValue({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:Vi(e)}}function parseAstSizingValue({value:e}){switch(e){case`auto`:case`fixed`:return e;default:Vi(e)}}function toRelationshipStyle(e,t){let r={};if(!e||e.length===0)return r;for(let a of e)if(t(a))switch(!0){case isColorProperty(a):{let e=toColor(a);P(e)&&(r.color=e);break}case isLineProperty(a):r.line=a.value;break;case isArrowProperty(a):switch(a.key){case`head`:r.head=a.value;break;case`tail`:r.tail=a.value;break;default:Vi(a)}break;default:Vi(a)}return r}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(e){let t=e.rankSep,r=e.nodeSep,a;switch(e.direction){case`TopBottom`:a=`TB`;break;case`BottomTop`:a=`BT`;break;case`LeftRight`:a=`LR`;break;case`RightLeft`:a=`RL`;break;default:Vi(e.direction)}return{direction:a,...r&&{nodeSep:r},...t&&{rankSep:t}}}function getViewRulePredicateContainer(e){return ut(e,e=>isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)||isDynamicViewIncludePredicate(e))}const _isModel=e=>isModel(e)||isModelDiff(e)||isElementBody(e)||isExtendElementBody(e)||isElementViewBody(e)||isDynamicViewBody(e)||isElementRef(e),tu=/* @__PURE__ */ e(e=>isModelDeployments(e)||isDeploymentViewBody(e)||isDeploymentNodeBody(e)||isExtendDeploymentBody(e)||isDeployedInstanceBody(e),`_isDeployment`);function isFqnRefInsideGlobals(e){for(;;){if(tu(e)||_isModel(e))return!1;if(isGlobals(e)||isModelViews(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideModel(e){for(;;){if(tu(e))return!1;if(_isModel(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideDeployment(e){for(;;){if(_isModel(e))return!1;if(tu(e))return!0;if(e.$container)e=e.$container;else return!1}}function resolveDescriptionFile(e,t){if(It(e.value)||xt(e.value))return null;try{return t??=A(e),D.joinPath(t.uri,`..`,e.value)}catch{return null}}function elementRef(e){try{let t=isStrictFqnElementRef(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function readStrictFqn(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],r=e.parent;for(;r;)t.push(r.$type===`StrictFqnRef`?r.value.$refText:r.el.$refText),r=r.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function referenceableParent(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function instanceRef(e){let t;for(;t=e.value?.ref;){if(isDeploymentNode$1(t))return null;if(isDeployedInstance(t))return t;if(L(e.parent))return null;e=e.parent}return null}function importsRef(e){let t=referenceableParent(e);return t?.$type===`Imported`?t:null}function isReferenceToDeploymentModel(e){let t;for(;t=e.value?.ref;){if(isDeploymentElement(t))return!0;if(L(e.parent))return!1;e=e.parent}return!1}function unescapeWithSpans(e,t){let r=e.slice(2,-2),a=t+2,o=[],s=``;for(let e=1;e<r.length-1;e++){let t=a+e,l=r.charAt(e);l===`\\`?(s+=convertEscapeCharacter(r.charAt(++e)),o.push({start:t,end:a+e+1})):(s+=l,o.push({start:t,end:t+1}))}return{text:s,spans:o}}function convertEscapeCharacter(e){switch(e){case`b`:return`\b`;case`f`:return`\f`;case`n`:return`
55
+ `;case`r`:return`\r`;case`t`:return` `;case`v`:return`\v`;case`0`:return`\0`;default:return e}}function alignSubsequence(e,t){let r=[],a=0;for(let o=0;o<e.length;o++){for(;a<t.length&&t[a]!==e[o];)a++;if(a>=t.length)return null;r.push(a++)}return r}function markdownRefsOf(e,t){if(!Ft(e.markdown)||!e.markdown.includes(`[[`))return[];let r=Le(e.$cstNode,`markdown`);return r?markdownRefsOfLeaf(r,e.markdown,t??A(e)):[]}function markdownRefsOfLeaf(e,t,r){let{text:a,spans:o}=unescapeWithSpans(e.text,e.offset);if(a!==t)return[];let s=Pn(a).trim(),l=ki(s);if(l.length===0)return[];let p=alignSubsequence(s,a);if(!p)return[];let g=r.textDocument,startOf=e=>o[p[e]].start,endOf=e=>o[p[e-1]].end,toRange=(e,t)=>({start:g.positionAt(e),end:g.positionAt(t)});return l.map(e=>{let t=startOf(e.range.start),r=endOf(e.range.end);return{ref:e,offset:{start:t,end:r},range:toRange(t,r),targetRange:toRange(startOf(e.targetRange.start),endOf(e.targetRange.end)),namespaceRange:e.namespace===null?null:toRange(startOf(e.range.start+2),endOf(e.targetRange.start-1))}})}var LikeC4DocumentBuilder=class extends He{services;#e=Y.getChild(`document-builder`);stateResetListeners=new be;validationChangedListeners=/* @__PURE__ */ new Map;constructor(e){super(e),this.services=e,this.documentPhaseListeners.add(E.Validated,e=>{if(isValidatedLikeC4LangiumDocument(e)&&isNotLikeC4Builtin(e))for(let[t,r]of this.validationChangedListeners){let a=r[e.textDocument.uri],o=e.diagnostics.some(isErrorDiagnostic$1),s=t.select({validationHash:calcValidationHash(e),doc:e,hasErrors:o,isValid:!o});nr(a,s)||t.listener({firstTime:a===void 0,doc:e,current:s,previous:a,hasErrors:o,isValid:!o})}})}get currentPhase(){return this.currentState}onDocumentResetBelow(e,t){return this.stateResetListeners.add(e,t),C.create(()=>this.stateResetListeners.delete(e,t))}onDocumentValidationChanged(e){let t={select:({doc:e})=>({validationHash:calcValidationHash(e)}),...e};return this.validationChangedListeners.set(t,{}),C.create(()=>this.validationChangedListeners.delete(t))}notifyStateResetListeners(e,t){this.stateResetListeners.has(e)&&this.stateResetListeners.get(e).forEach(e=>e(t))}#t=!1;resetToState(e,t){W(!this.#t,`received resetToState while rese of ${this.#t} is in progress`),this.#t=e.uri;let r=e.state;if(r===E.Validated)for(let[t,r]of this.validationChangedListeners)try{let a=e.diagnostics?.some(isErrorDiagnostic$1)??!1;r[e.textDocument.uri]=t.select({doc:e,validationHash:calcValidationHash(e),hasErrors:a,isValid:!a})}catch(t){this.#e.warn`Error on calculating validation state for document ${e.uri}: ${t}`}try{if(super.resetToState(e,t),t<r&&isLikeC4LangiumDocument(e)){let a={doc:e,resetTo:t,previous:r};for(let e=r-1;e>=t;e--){W(e>=0,`notifyState must not be negative`);try{this.notifyStateResetListeners(e,a)}catch(t){this.#e.error(`Error notifying state reset listener for state {notifyState}`,{notifyState:e,error:t})}}}}finally{this.#t=!1}}},IndexManager=class extends pe{services;constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}isAffected(e,t){if(super.isAffected(e,t))return!0;if(t.size===0||!e.textDocument.getText().includes(`[[`))return!1;let r=this.services.workspace.ProjectsManager,a=e.likec4ProjectId??r.ownerProjectId(e);for(let e of t)if(r.isIncluded(a,e))return!0;return!1}projectElements(e,t,r){let a=this.services.workspace.ProjectsManager;return w(this.symbolIndex.keys()).filter(t=>r&&!r.has(t)?!1:a.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}},LangiumDocuments=class extends xe{services;constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}sortedDocuments=null;get sorted(){return this.sortedDocuments??=this.documentTrie.all().sort(compareByUri)}addDocument(e){isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),super.addDocument(e),this.sortedDocuments=null}deleteDocument(e){return this.sortedDocuments=null,super.deleteDocument(e)}deleteDocuments(e){return this.sortedDocuments=null,super.deleteDocuments(e)}getDocument(e){let t=super.getDocument(e);return isLikeC4UserDocument(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return w(this.sorted).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return w(this.sorted).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return w(this.sorted).filter(r=>isLikeC4UserDocument(r)&&t.isIncluded(e,r)?(r.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return I(this.userDocuments.toArray(),V(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),Yt(z(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.sorted)delete t.likec4ProjectId,isLikeC4UserDocument(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}};const Z=Y.getChild(`projects`);function isTextDocument(e){return typeof e==`object`&&`uri`in e&&`languageId`in e&&`getText`in e&&typeof e.getText==`function`}function isLangiumDocument(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function normalizeUri(e){return typeof e==`string`?xt(e,{acceptRelative:!1,strict:!0})?e:j.file(e).toString():isLangiumDocument(e)?e.uri.toString():isTextDocument(e)?e.uri:e.toString()}const nu=/^\/?([A-Za-z]):(?=\/|$)/;function normalizeWindowsDrivePath(e){return e.replace(nu,(e,t)=>`/${t.toLowerCase()}:`)}function uriPathForMatcher(e){return j.isUri(e)?normalizeWindowsDrivePath(e.path):normalizeWindowsDrivePath(j.parse(e).path)}const ru=Ei(`/`,!0),compareUri=(e,t)=>ru(gt(e.path),gt(t.path));function isParentFolderFor(e){return t=>e.startsWith(Li(t)?t:t.folder)}function _overlaps(e,t){let r=Li(e)?e:e.folder,a=Li(t)?t:t.folder;return r===a||r.startsWith(a)||a.startsWith(r)}function sameFolder(e,t){return(Li(e)?e:e.folder)===(Li(t)?t:t.folder)}function hasAmbiguousIncludePathOverlap(e,t){return _overlaps(e,t)&&!sameFolder(e,t)}function overlaps(...e){return bn(_overlaps,e)}function _includes(e,t){return t.startsWith(e.folder)||e.includePaths?.some(isParentFolderFor(t))?!_excludes(e,t):!1}function _isInScope(e,t){return t.startsWith(e.folder)||(e.includePaths?.some(isParentFolderFor(t))??!1)}function _excludes(e,t){return e.exclude?.(uriPathForMatcher(t))??!1}function includes(...e){return bn(_includes,e)}function isInScope(...e){return bn(_isInScope,e)}function excludes(...e){return bn(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),vt(e)}const compareProjectByFolder=(e,t)=>compareUri(e.folderUri,t.folderUri);function ensureProjectsOrder(e){return e.length<=1?e:mn(e,compareProjectByFolder)}const iu={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:ma(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return iu.exclude(uriPathForMatcher(e))}function parseRegisterOptions(e){if(`configUri`in e){Pi(!It(e.configUri),`configUri is emptyish`);let t=j.isUri(e.configUri)?e.configUri:j.parse(normalizeUri(e.configUri)),r=ProjectFolder(D.dirname(t));return{configUri:t,folder:r,folderUri:j.parse(r)}}Pi(!It(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),r=j.parse(t);return{configUri:D.joinPath(r,`likec4.config.json`),folder:t,folderUri:r}}var au=class ProjectsManager extends ADisposable{services;static DefaultProjectId=iu.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new bi(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),r=D.joinPath(t,`likec4.config.json`),a=ProjectFolder(t);return{id:e,config:iu.config,folder:a,folderUri:j.parse(a),configUri:r,exclude:iu.exclude,includeConfig:{...iu.includeConfig},hash:Ji(a||`default`)}}return Bi(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new bi(e=>{if(this.isExcludedByWorkspace(e))return!0;let t=this.findOwnerProject(e);return t?excludes(t,e)?!this.#r.some(includes(e)):!1:this.#r.some(isInScope(e))?!this.#r.some(includes(e)):isExcludedByDefault(e)});#o=new bi(e=>this.findOwnerProject(e)??null);constructor(e){super(),this.services=e,this.onDispose(C.create(async()=>{this.cancelScheduledReloads(),this.#l.pending&&await this.#l.onIdle(),this.clearCaches(),this.#r.length=0,this.#e.length=0})),Ui(()=>this.onDispose(e.lsp.DocumentUpdateHandler.onWatchedFilesChangeBy(({uri:e,type:t})=>At(e)||t===q.FileChangeType.Deleted&&this.hasProjectsInside(e),e=>{if(!this.isInitiatingOrReloading)for(let t of e){if(t.type===q.FileChangeType.Deleted){this.cancelScheduledReloads(),this.reloadProjects();return}this.scheduleReloadProject(t.uri)}}))),Z.trace`created`}isExcludedByWorkspace(e){return this.#n?this.#n(uriPathForMatcher(normalizeUri(e))):!1}setWorkspaceExcludePatterns(e){try{if(!Array.isArray(e)){this.#n=void 0;return}let t=I(e,M(P),V(e=>(e=normalizeWindowsDrivePath(e),!Dn(e)&&!e.startsWith(`**`)&&(e=bt(`**`,e)),e)));if(!R(t,1)){this.#n=void 0;return}Z.debug`set workspace exclude patterns: ${t}`,this.#n=ma(t,{dot:!0}),this.clearCaches()}catch(e){Z.warn(`Failed to set workspace exclude patterns`,{error:e}),this.#n=void 0}}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return R(this.#r,1)?this.#r[0].id:ProjectsManager.DefaultProjectId}set defaultProjectId(e){e!==this.#t&&(this.#t=void 0,!e||e===ProjectsManager.DefaultProjectId?Z.debug`reset default project ID`:(Pi(this.#r.find(t=>t.id===e),`Project "${e}" not found`),Z.debug`set default project ID to ${e}`,this.#t=e))}get default(){return this.#i.get(this.defaultProjectId??ProjectsManager.DefaultProjectId)}get all(){if(R(this.#r,1)){let e=[...V(this.#r,z(`id`)),iu.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);t>0&&(e.splice(t,1),e.unshift(this.#t))}return e}return[iu.id]}getProject(e){let t=typeof e==`string`?e:this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){if(this.#r.length===0)return[];let t=overlaps(ProjectFolder(e)),isInsideOrIncludes=e=>t(e)||!!e.includePaths&&!!Gt(e.includePaths,t);return this.#r.filter(isInsideOrIncludes)}ensureProjectId(e){return e===ProjectsManager.DefaultProjectId?this.defaultProjectId??ProjectsManager.DefaultProjectId:e?(Pi(this.#r.some(t=>e===t.id),`Project ID ${e} is not registered`),e):Bi(this.defaultProjectId,()=>`Specify exact project, known: [${V(this.#r,z(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return isLangiumDocument(t)&&isLikeC4Builtin(t)?!0:e.length===1?this.#a.get(normalizeUri(t)):excludes(this.#i.get(e[0]),normalizeUri(t))}isIncluded(e,t){if(isLangiumDocument(t)&&isLikeC4Builtin(t))return!1;let r=normalizeUri(t);return this.isExcludedByWorkspace(r)?!1:R(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(r)&&!this.#a.get(r):includes(this.#i.get(e),r):!isExcludedByDefault(r)}async registerConfigFile(e,t){if(this.isExcludedByWorkspace(e))throw Error(`Skipping project config, path ${e.fsPath} is excluded by editor settings`);if(isExcludedByDefault(normalizeUri(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by default: ${iu.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let r=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:r,configUri:e},t)}catch(t){if(!Se(t))throw wrapError(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let r=Tt.validate(e.config),{configUri:a,folder:o,folderUri:s}=parseRegisterOptions(e),l=Tt.normalizeInclude(r.include),p=this.#r.find(e=>e.folder===o);if(!p)p=withProjectHash({id:this.uniqueProjectId(r.name),config:r,folder:o,configUri:a,folderUri:s,includeConfig:l}),this.#r=ensureProjectsOrder([...this.#r,p]),Z.info`add ${p.id}`;else{if(p.config.name!==r.name)Z.info`project name changed from ${p.config.name} to ${r.name}`,Z.info`remove ${p.id}`,p.id=this.uniqueProjectId(r.name),Z.info`add ${p.id}`;else{let e=computeProjectHash({id:p.id,config:r,includeConfig:l,configUri:a,folder:o});if(p.hash===e)return p.config=r,Z.trace`project ${p.id} has no structural changes, skipping reload`,p}this.warnIfConfigOverride(p,a),p.config=r,p.folder=o,p.folderUri=s,p.configUri=a,p.includeConfig=l,p.hash=computeProjectHash(p)}return safeCall(()=>this.updateIncludesExcludes(p)),this.isInitiatingOrReloading||(this.clearCaches(),this.notifyListeners(),await this.rebuildProject(p.id,t).catch(e=>Se(e)?Promise.reject(e):(Z.warn(`Failed to rebuild project {projectId} after config change`,{projectId:p.id,error:e}),Promise.resolve()))),p}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}findOwnerProject(e){if(this.#r.length===0)return;let t=isParentFolderFor(e);return this.#r.find(t)??this.#r.find(includes(e))??void 0}relativePath(e){let t=normalizeUri(e),r=this.#o.get(t);return r?D.relative(r.folderUri,j.parse(t)):t}get isInitiatingOrReloading(){return!!this.#s||!this.services.workspace.WorkspaceManager.isReady}#s=null;async reloadProjects(e){return this.#s?(Z.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(Z.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(Se(e)||Z.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Z.warn(`Failed to reloadProjects, no workspace folders found`);return}Z.debug`start reload projects`;let r=[];for(let e of t){let t=j.parse(e.uri);Z.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let a of e)Z.debug`found config ${D.relative(t,a.uri)}`,r.push(a.uri)}catch(e){Z.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(r.length===0){if(this.#r.length===0){Z.warning(`No config files found`);return}Z.warning(`no config files found, but {count} projects were registered before`,{count:this.#r.length}),Z.warning(`reset`)}r.sort(compareUri);let a=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of r)try{await this.registerConfigFile(e)}catch(t){Z.warn(loggable(t));let r=a.get(e.toString());r&&(Z.debug`Update failed, restore project ${r.id}`,await this.registerProject(r).catch(e=>{Z.warn(`fail to restore project ${r.id}, ignoring`,{error:e})}))}this.clearCaches(),this.notifyListeners(),this.services.workspace.WorkspaceManager.isReady&&await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(V(this.#r,z(`id`))),r=e;if(!t.has(r))return r;Z.warn`Project "${e}" already exists, generating unique ID`;let a=1;for(;t.has(r);)r=`${e}-${a++}`;return r}clearCaches(){Z.trace(`clearCaches`),this.#t&&!this.#r.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(e,t){let r=this.#r.find(t=>t.id===e);if(!r)return e===ProjectsManager.DefaultProjectId?Z.info`Rebuilding all documents `:Z.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let a=Z.getChild(r.id),_includes=e=>includes(r,normalizeUri(e)),o=this.services.workspace.LangiumDocuments.userDocuments.filter(_includes).map(e=>e.uri).toArray();o.length===0?a.trace`no documents found for project ${r.id}, skipping rebuild`:(a.info`rebuild project (documents: ${o.length})`,this.clearCaches(),await this.services.workspace.DocumentBuilder.update(o,[],t).catch(e=>{a.warn(`Failed to rebuild project`,{error:e})}))}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let r of t.includePaths)e.push({projectId:t.id,includePath:r.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),C.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return Z.warn(`Failed to get workspace URI, using default folder`,{error:e}),j.file(`/`)}}notifyListeners(){let e=[...this.#e];for(let t of e)try{t()}catch(e){Z.warn(loggable(e))}}updateIncludesExcludes(e){let t=e.config;delete e.includePaths,delete e.exclude;let r=e.includeConfig.paths;R(r,1)&&(e.includePaths=V(r,t=>{let r=D.resolvePath(e.folderUri,t);return{uri:r,folder:ProjectFolder(r)}}),Z.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`);let a=t.exclude;if(L(a))e.exclude=iu.exclude;else if(R(a,1)){let t=[e.folderUri,...V(e.includePaths??[],z(`uri`))].flatMap(e=>V(a,t=>(!_t(t)&&!t.startsWith(`**`)&&(t=bt(`**`,t)),St(mt(uriPathForMatcher(e),t)))));e.exclude=ma(t,{contains:!0,dot:!0})}if(!e.includePaths)return e;for(let t of e.includePaths)for(let r of this.#r)r.id!==e.id&&(overlaps(t,r)&&Z.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:r.id}),r.includePaths?.forEach(a=>{hasAmbiguousIncludePathOverlap(t,a)&&Z.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:r.id,otherIncludePath:a.folder})}));return e}warnIfConfigOverride(e,t){try{let[r,a]=V([e.configUri,t],D.basename);r!==a&&Z.warn`config ${a} overrides ${r} in folder ${e.folder}`}catch{}}#c=/* @__PURE__ */ new Set;#l=new $n({concurrency:1});#u=new AbortController;scheduleReloadProject(e){if(this.#c.has(e))return;this.#c.add(e);let t=this.#c.size===1?250:50,r=this.#u.signal;this.#l.add(async()=>{r.aborted||await Di(t)}),this.#l.add(async()=>{if(!r.aborted)try{await this.services.workspace.WorkspaceLock.write(async t=>{this.#c.delete(e),await this.registerConfigFile(j.parse(e),t)})}catch(e){Z.warn(loggable(e))}})}hasProjectsInside(e){let t=ProjectFolder(e);return this.#r.some(e=>e.folder.startsWith(t)||(e.includePaths?.some(e=>e.folder.startsWith(t))??!1))}cancelScheduledReloads(){this.#u.abort(),this.#u=new AbortController,this.#c.clear()}};function computeProjectHash(e){return Hi([e.id+e.folder+e.configUri.toString(),Sn(e.config,[`generators`,`include`]),e.includeConfig])}function withProjectHash(e){return{...e,hash:computeProjectHash(e)}}var ou=class TimeoutError extends Error{name=`TimeoutError`;constructor(e,t){super(e,t),Error.captureStackTrace?.(this,TimeoutError)}};const getAbortedReason=e=>e.reason??new DOMException(`This operation was aborted.`,`AbortError`);function pTimeout(e,t){let{milliseconds:r,fallback:a,message:o,customTimers:s={setTimeout,clearTimeout},signal:l}=t,p,abortHandler,g=new Promise((t,g)=>{if(typeof r!=`number`||Math.sign(r)!==1)throw TypeError(`Expected \`milliseconds\` to be a positive number, got \`${r}\``);if(l?.aborted){g(getAbortedReason(l)),e.then(t,g);return}if(l&&(abortHandler=()=>{g(getAbortedReason(l))},l.addEventListener(`abort`,abortHandler,{once:!0})),e.then(t,g),r===1/0)return;let _=new ou;p=s.setTimeout.call(void 0,()=>{if(a)try{t(a())}catch(e){g(e)}else typeof e.cancel==`function`&&e.cancel(),o===!1?t():o instanceof Error?g(o):(_.message=o??`Promise timed out after ${r} milliseconds`,g(_))},r)}).finally(()=>{g.clear(),abortHandler&&l&&l.removeEventListener(`abort`,abortHandler)});return g.clear=()=>{s.clearTimeout.call(void 0,p),p=void 0},g}var LikeC4WorkspaceManager=class extends te{services;fileSystemProvider;#e=Y.getChild(`workspace`);#t=!1;#n=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.fileSystemProvider=e.workspace.FileSystemProvider}get documentFactory(){return this.services.workspace.LangiumDocumentFactory}get isReady(){return this.#t}async performStartup(e){this.#t&&this.#e.error`workspace already initialized, invalid performStartup call`;try{this.#t=!1,await this.readExcludeConfig(),this.folders&&this.folders.length!==0||(this.folders=e);let t=e.map(e=>j.parse(e.uri)),r=[],a=[];for(let e of t){this.#e.debug`scanning folder ${e.fsPath} for likec4`;let t=!1;try{let a=await this.fileSystemProvider.scanProjectFiles(e);t=a.length>0,r.push(...a)}catch(t){this.#e.warn(`Failed to scan workspace folder {folder} for project config files`,{folder:e.fsPath,error:t})}try{let r=await this.fileSystemProvider.readDirectory(e,{recursive:!0});t||=r.length>0,a.push(...r)}catch(t){this.#e.warn(`Failed to read workspace folder {folder} for likec4 files`,{folder:e.fsPath,error:t})}t?this.services.workspace.FileSystemWatcher.watch(e.fsPath):this.#e.trace`no likec4 files found in folder ${e.fsPath}`}let o=this.services.workspace.ProjectsManager,s=0;for(let e of r)try{await o.registerConfigFile(e.uri),s++}catch(t){this.#e.warn(`Failed to register config file {config}`,{config:e.uri.fsPath,error:t})}r.length===s?s>0&&this.#e.info`loaded ${s} projects`:this.#e.warn`loaded ${s} projects out of ${r.length}`,s>0&&a.push(...await this.scanProjectIncludePaths());let l=await this.loadDocuments(a);R(l,1)?this.#e.debug`found ${l.length} likec4 documents`:this.#e.warn(`No likec4 documents found in workspace`),l.push(this.documentFactory.fromString(so,j.parse(fo)));for(let e of l)this.saveAddDocument(e);return l}finally{this.#t=!0,this._ready.resolve()}}async traverseFolder(e,t){try{let r=await this.fileSystemProvider.readDirectory(e,{recursive:!0});t.push(...I(r,M(e=>e.isFile),V(e=>e.uri)))}catch(t){console.error(`Failure to read directory content of `+e.toString(!0),t)}}async scanProjectIncludePaths(){let e=this.services.workspace.ProjectsManager.getAllIncludePaths();if(!R(e,1))return[];let t=Ht(e=>this.services.workspace.ProjectsManager.isExcludedByWorkspace(e.uri)),r=[];for(let{projectId:a,includePath:o,includeConfig:s}of e)try{this.#e.debug`scanning include path ${o.fsPath} for project ${a}`;let e=I(await this.fileSystemProvider.readDirectory(o,{recursive:!0,maxDepth:s.maxDepth}),M(t));r.push(...e),e.length===0?this.#e.trace`no files found in include path ${o.fsPath}`:(this.#e.debug`loaded ${e.length} files from include path ${o.fsPath}`,e.length>s.fileThreshold&&this.#e.warn(`Loaded ${e.length} files from include path ${o.fsPath} (project: ${a}) (threshold: ${s.fileThreshold}).\nLarge include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`))}catch(e){this.#e.warn(`Failed to scan include path ${o.fsPath}`,{error:e})}return r}async loadDocuments(e){let t=I(e,fn(e=>e.uri.path),mn(compareByUri)),r=[];for(let e of t)try{if(this.langiumDocuments.hasDocument(e.uri)){r.push(this.langiumDocuments.getDocument(e.uri));continue}r.push(await this.documentFactory.fromUri(e.uri))}catch(t){this.#e.warn(`Failed to load document ${e.uri}`,{error:t})}return r}saveAddDocument(e){this.langiumDocuments.hasDocument(e.uri)||this.langiumDocuments.addDocument(e)}workspace(){return this.folders&&R(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();this.#e.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){return this.#t?hi(this,`workspaceUri`,()=>{let e=this.workspace();return W(e,`Workspace not initialized`),j.parse(e.uri)}):(this.#e.warn(`Workspace not initialized, returning empty URI`),j.parse(`file:///`))}relativePath(e){return this.#t?D.relative(this.workspaceUri,e):(this.#e.warn(`Workspace not initialized, returning empty string`),``)}isInsideWorkspace(e){if(!this.#t)return this.#e.warn(`Workspace not initialized, returning false`),!1;if(e=j.isUri(e)?e:j.parse(e),e.scheme!==this.workspaceUri.scheme)return!1;let t=pathSegments(this.workspaceUri),r=pathSegments(D.resolvePath(e));return t.every((e,t)=>isSamePathSegment(e,r[t]))}get workspaceURL(){return this.#t?hi(this,`workspaceURL`,()=>{let e=this.workspace();return W(e,`Workspace not initialized`),new URL(e.uri)}):(this.#e.warn(`Workspace not initialized, returning empty URL`),new URL(`file:///`))}forceCleanCaches(){let e=[...this.#n];for(let t of e)try{t()}catch(e){this.#e.warn(`Error in cache evicter`,{error:e})}this.services.workspace.ProjectsManager.clearCaches(),this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#n.push(e),C.create(()=>{let t=this.#n.indexOf(e);t!==-1&&this.#n.splice(t,1)})}async readExcludeConfig(){if(!this.services.lsp.Connection){this.#e.debug`no LSP connection, skipping initial configuration read`;return}let e=this.services.workspace.ConfigurationProvider,wait=e=>pTimeout(e,{milliseconds:1e3,message:!1});try{this.#e.trace`waiting for ConfigurationProvider ready...`,await wait(e.ready),this.#e.trace`ConfigurationProvider ready, reading exclude patterns...`;let t=await wait(e.getConfiguration(`likec4`,`exclude`));t?(this.#e.trace`exclude configuration found ${t}`,this.services.workspace.ProjectsManager.setWorkspaceExcludePatterns(t)):this.#e.trace(`no initial exclude configuration found`)}catch(e){this.#e.warn(`Failed to read initial exclude configuration`,{error:e})}}};const su=/^[a-zA-Z]:$/;function pathSegments(e){return e.path.split(`/`).filter(e=>e.length>0)}function isSamePathSegment(e,t){return e===t||t!==void 0&&su.test(e)&&su.test(t)&&e.toLowerCase()===t.toLowerCase()}function projectIdFrom(e){if(isImported(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;W(isImportsFromPoject(e))}if(isImportsFromPoject(e))return e.project;let t=de(e)?A(e):e;return t.likec4ProjectId?t.likec4ProjectId:(Y.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,au.DefaultProjectId)}function stringHash$1(...e){var t=e.length>1?e.join(`:::`):e[0];return Ji(t)}e(stringHash$1,`stringHash`);function safeCall(e){try{return e()}catch(e){Y.trace(`Safe call failed`,{error:e});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let e=performanceNow();return{get ms(){return performanceNow()-e},get pretty(){return tr(performanceNow()-e)}}}st();const cu=Y.getChild(`manual-layouts`),isManualLayoutFile=e=>e!==`.likec4.snap`&&e.endsWith(`.likec4.snap`);function fileName(e){return`${e}.likec4.snap`}function viewIdFromURI(e){let t=D.basename(e);return isManualLayoutFile(t)?t.slice(0,-12):null}function getManualLayoutsOutDir(e){return D.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const lu={manualLayouts:e=>new DefaultLikeC4ManualLayouts(e)},uu=`file://./`;var DefaultLikeC4ManualLayouts=class extends ADisposable{services;cache;listeners=[];#e=Qn(1);constructor(e){super(),this.services=e,this.onDispose(this.cache=new ae,C.create(()=>{this.triggerUpdate.cancel(),this.#e.clearQueue(),this.listeners.length=0})),Ui(()=>{this.onDispose(e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()}),e.lsp.DocumentUpdateHandler.onWatchedFilesChangeBy(({uri:e,type:t})=>isManualLayoutFile(On(e))||t===q.FileChangeType.Deleted&&this.projectsWithSnapshotsIn(j.parse(e)).length>0,e=>{cu.trace`onWatchedFilesChangeBy\n${e.map(e=>e.uri)}`;for(let t of e)isManualLayoutFile(On(t.uri))?this.onSnapshotFileChange(t).catch(e=>{cu.warn(`Error handling snapshot change {change}`,{change:t,error:e})}):this.onSnapshotsFolderDelete(j.parse(t.uri))}))})}projectsWithSnapshotsIn(e){let t=this.services.workspace.ProjectsManager,r=vt(e.toString());return t.all.filter(e=>{let a=vt(getManualLayoutsOutDir(t.getProject(e)).toString());return a.startsWith(r)||r.startsWith(a)})}onSnapshotsFolderDelete(e){for(let t of this.projectsWithSnapshotsIn(e))cu.debug`snapshots folder deleted in project ${t}: ${e.fsPath}`,this.cache.delete(t),this.triggerUpdate.call({removed:e,projectId:t})}async onSnapshotFileChange(e){let t=j.parse(e.uri),r=viewIdFromURI(t)??void 0,a=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(a),e.type===q.FileChangeType.Deleted)this.triggerUpdate.call(ri({removed:t,projectId:a,viewId:r}));else{if(!r){let e=this.services.workspace.ProjectsManager.getProject(a),o=await this.readSnapshot(t,e);o?r=o.id:(cu.warn(`Snapshot ${t.fsPath} does not exist or is invalid`),r=`index`)}this.triggerUpdate.call({updated:t,projectId:a,viewId:r})}}onManualLayoutUpdate(e){return this.listeners.push(e),{dispose:()=>{let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}}}async readManualLayouts(e){let t=cu.getChild(e.id),r=this.services.workspace.FileSystemProvider,a=getManualLayoutsOutDir(e),o=[],s=Ji(e.id);try{let l=await r.scanDirectory(a,isManualLayoutFile);if(l.length===0)return null;t.trace`found ${l.length} manual layouts in ${this.services.workspace.WorkspaceManager.relativePath(a)}`,l.sort(compareByUri);for(let a of l){let l=D.relative(e.folderUri,a.uri);try{t.trace`read snapshot ${l}`;let p=await r.readFile(a.uri),g=wt.parse(p);s=Hi({basename:On(a.uri.path),content:p,hash:s});let _=this.resolveIconPathsAfterRead(g,e.folderUri);o.push({..._,_layout:`manual`})}catch(e){t.warn(`Failed to read snapshot {relativePath}`,{relativePath:l,err:e})}}}catch(r){t.warn(`Failed to read snapshots for ${e.folderUri.fsPath}`,{err:r})}if(o.length===0)return null;t.trace`loaded ${o.length} manual layouts, hash: ${s}`;let l=Mt(o,z(`id`));return{hash:s,views:l}}async readSnapshot(e,t){let r=this.services.workspace.FileSystemProvider;try{let a=await r.readFile(e),o=wt.parse(a);if(!t){let r=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(r)}return{...this.resolveIconPathsAfterRead(o,t.folderUri),_layout:`manual`}}catch(t){return cu.warn(`Failed to read view snapshot ${e.fsPath}`,{err:t}),null}}async read(e){return await this.#e(async()=>{let t=this.cache.get(e.id);if(t!==void 0)return cu.trace`cache hit project ${e.id}`,t;let r=await this.readManualLayouts(e);return this.cache.set(e.id,r),r})}async write(e,t){return await this.#e(async()=>{let r=cu.getChild(e.id),a=getManualLayoutsOutDir(e),o=D.joinPath(a,fileName(t.id)),s=this.services.workspace.WorkspaceManager.relativePath(o);if(`manualLayout`in t){let{manualLayout:e,...r}=t;t=r}let l=wt.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),p={uri:o.toString(),range:De.create(ze.create(0,0),ze.create(l.split(`
56
+ `).length-1,1))};r.debug`write snapshot of ${t.id} to ${s}`;let g=this.services.workspace.FileSystemProvider;try{await g.writeFile(o,l+`
57
+ `),this.cache.delete(e.id),this.triggerUpdate.call({updated:o,projectId:e.id,viewId:t.id})}catch(e){r.warn(`Failed to write snapshot {viewId} to {workspaceRelativePath}`,{viewId:t.id,workspaceRelativePath:s,err:e})}return p})}async remove(e,t){return await this.#e(()=>this.removeSnapshot(e,t))}async removeSnapshot(e,t){let r=cu.getChild(e.id),a=getManualLayoutsOutDir(e),o=D.joinPath(a,fileName(t)),s=this.services.workspace.WorkspaceManager.relativePath(o);r.debug`delete snapshot of ${t} in project ${e.id}. File: ${s}`;let l={uri:o.toString(),range:De.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(o))return r.warn`Snapshot ${t} did not exist at ${s}`,null;this.cache.delete(e.id),this.triggerUpdate.call({removed:o,projectId:e.id,viewId:t})}catch(e){r.warn(`Failed to delete snapshot {viewId} from {workspaceRelativePath}`,{viewId:t,workspaceRelativePath:s,err:e})}return l}clearCaches(){cu.trace`clear caches`,this.cache.clear()}triggerUpdate=Lt(e=>{let t=[...this.listeners];for(let r of t)for(let t of e.values())safeCall(()=>r(t))},{maxBurstDurationMs:100,minQuietPeriodMs:30,reducer(e,t){let r=`updated`in t?t.updated.toString():t.removed.toString();return e??=/* @__PURE__ */ new Map,e.set(`${t.projectId}|${r}`,t),e}});normalizeIconPathsForWrite(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let r=j.parse(e.icon),a=D.relative(t,r);return a.startsWith(`..`)?e:{...e,icon:`${uu}${a}`}}return e});return{...e,nodes:r}}resolveIconPathsAfterRead(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(uu)){let r=e.icon.substring(9),a=D.joinPath(t,r);return{...e,icon:a.toString()}}return e});return{...e,nodes:r}}};function hasLikeC4Ext(e){return ql.fileExtensions.some(t=>e!==t&&e.endsWith(t))}const du=[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`];function isNodeModulesOrRepo(e){return du.includes(e)}function insideNodeModulesOrRepo(e){for(let t of du)if(e.includes(t))return!0;return!1}const fu=Y.getChild(`chokidar`),pu={fileSystemWatcher:e=>new ChokidarFileSystemWatcher(e)},isAnyLikeC4File=e=>{let t=ur(e);return hasLikeC4Ext(t)||At(t)||isManualLayoutFile(t)};var ChokidarFileSystemWatcher=class{services;watcher;notifyChanges=Lt(e=>{this.services.lsp.DocumentUpdateHandler.didChangeWatchedFiles({changes:[...e.values()]})},{minQuietPeriodMs:50,maxBurstDurationMs:250,reducer(e,t){return e??=/* @__PURE__ */ new Map,e.delete(t.uri),e.set(t.uri,t),e}});constructor(e){this.services=e,fu.trace`ChokidarFileSystemWatcher created`}watch(e){this.watcher?(fu.debug`add watching folder: ${e}`,this.watcher.add(e)):this.watcher=this.createWatcher(e)}isWatchedFile(e){return isAnyLikeC4File(e)||En(e)===`.md`}async dispose(){if(this.notifyChanges.cancel(),this.watcher){let e=this.watcher;this.watcher=void 0;try{await e.close()}catch{}}}createWatcher(e){fu.debug`create watcher for folder: ${e}`;let t=ha.watch(e,{ignored:[e=>insideNodeModulesOrRepo(e),(e,t)=>!!t&&t.isFile()&&!this.isWatchedFile(e),e=>this.services.workspace.ProjectsManager.isExcluded(j.file(e))],followSymlinks:!0,ignoreInitial:!0}),notify=e=>(t,r)=>{r?.isDirectory()||this.notifyChanges.call({uri:j.file(t).toString(),type:e})};return t.on(`add`,notify(q.FileChangeType.Created)).on(`change`,notify(q.FileChangeType.Changed)).on(`unlink`,notify(q.FileChangeType.Deleted)).on(`unlinkDir`,e=>{this.notifyChanges.call({uri:j.file(e).toString(),type:q.FileChangeType.Deleted})}),t}},NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}stat(){throw Error(`No file system is available.`)}statSync(){throw Error(`No file system is available.`)}exists(){return Promise.resolve(!1)}existsSync(){return!1}readBinary(e){throw Error(`No file system is available (${e.toString()})`)}readBinarySync(e){throw Error(`No file system is available (${e.toString()})`)}readFileSync(e){if(isLikeC4Builtin(e))return so;throw Error(`No file system is available (${e.toString()})`)}readDirectorySync(){return[]}readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(so);throw Error(`No file system is available (${e.toString()})`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},NoopFileSystemWatcher=class{constructor(){Y.debug`NoopFileSystemWatcher created`}watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{constructor(){Y.debug`NoopLikeC4ManualLayouts created`}readSnapshot(){return Promise.resolve(null)}read(){return Promise.resolve(null)}write(){return Promise.reject(/* @__PURE__ */ Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}onManualLayoutUpdate(){return{dispose:()=>{}}}dispose(){}};const mu={fileSystemWatcher:()=>new NoopFileSystemWatcher},hu={fileSystemProvider:()=>new NoopFileSystemProvider,...mu},gu={manualLayouts:()=>new NoopLikeC4ManualLayouts};function isLikeC4ConfigFile(e,t=!1){return!t&&At(ur(e))}function isLikeC4File(e,t=!1){return!t&&hasLikeC4Ext(ur(e))}const WithFileSystem=(e=!1)=>({fileSystemProvider:e=>new SymLinkTraversingFileSystemProvider(e),...e?pu:mu});var SymLinkTraversingFileSystemProvider=class extends it{services;#e=Y.getChild(`filesystem`);constructor(e){super(),this.services=e}isExcluded(e){return this.services.workspace.ProjectsManager.isExcludedByWorkspace(j.file(e))}excludeDirectory=(e,t)=>isNodeModulesOrRepo(e)||this.isExcluded(t);async readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(so);try{return await sr(e.fsPath,`utf-8`)}catch(t){return this.#e.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){if(this.isExcluded(e.fsPath))return[];let r=t?.recursive??!0,a=t?.maxDepth??1/0,o=[];try{let t=new pa().withSymlinks({resolvePaths:!1}).exclude(this.excludeDirectory).withFullPaths().filter(e=>isLikeC4File(e)&&!this.isExcluded(e));r?a!==1/0&&(t=t.withMaxDepth(a)):t=t.withMaxDepth(1);let s=await t.crawl(e.fsPath).withPromise();for(let e of s)o.push({isFile:!0,isDirectory:!1,uri:j.file(e)});return o.sort(compareByUri)}catch(t){return this.#e.warn(`Failed to read directory ${e.fsPath}`,{error:t}),[]}}async scanProjectFiles(e){let t=await this.scanDirectory(e,isLikeC4ConfigFile);return t.length<=1?t:t.sort(compareByUriDeepFirst)}async scanDirectory(e,t){if(this.isExcluded(e.fsPath))return[];let r=[];try{let a=await new pa().withSymlinks({resolvePaths:!1}).exclude(this.excludeDirectory).withFullPaths().filter((e,r)=>t(e,r)&&!this.isExcluded(e)).crawl(e.fsPath).withPromise();for(let e of a)r.push({isFile:!0,isDirectory:!1,uri:j.file(e)})}catch(t){this.#e.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return r}async loadProjectConfig(e){return await loadConfig(e)}async writeFile(e,t){let r=dr(e.fsPath),a=Zi(r,{throwIfNoEntry:!1});if(a?.isFile())throw Error(`Cannot create directory ${r} because a file with the same name exists.`);return a||(this.#e.debug(`creating directory {path}`,{path:r}),Xi(r,{recursive:!0})),this.#e.debug(`writing file {path}`,{path:e.fsPath}),await lr(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,r=Zi(t,{throwIfNoEntry:!1});return r?.isFile()||r?.isSymbolicLink()?(await cr(t),this.#e.debug(`deleted file {path}`,{path:t}),!0):(this.#e.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){this.#e.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}},LikeC4DocumentationProvider=class extends re{parser;locator;projects;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.projects=e.shared.workspace.ProjectsManager}getDocumentation(e){if(!(isDeploymentNode$1(e)||isDeployedInstance(e)||isElement(e)))return super.getDocumentation(e);let t=A(e);if(t.state<E.Linked)return super.getDocumentation(e);try{let r=this.parser.forDocument(t);switch(!0){case isDeploymentNode$1(e):return`**${r.parseDeploymentNode(e).title}**`;case isDeployedInstance(e):{let a=r.parseDeployedInstance(e),[o,s]=U.isImportRef(a.element)?[a.element.project,a.element.model]:[t.likec4ProjectId??this.projects.ownerProjectId(t),a.element.model],l=o?this.locator.getParsedElement(s,o):this.locator.getParsedElement(s),p=[`_instance of_ \`${s}\``];return l&&p.push(`**${l.element.title}**`),p.join(`
57
58
  `)}case isElement(e):{let t=r.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
58
- `):void 0}default:return e}}catch(e){logWarnError(e)}}},Nf=qe(),Pf=ke();function areOverlap(e,t){return[e,t]=compareRanges(e,t)>0?[t,e]:[e,t],isInRagne(e.range,t.range.start)}function compareRanges(e,t){let r=e.range.start.line-t.range.start.line;return r===0?e.range.start.character-t.range.start.character:r}function isInRagne(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function isMultiline(e){return!!e&&e.range.start.line!=e.range.end.line}function isSameLine(e,t){if(!e||!t)return!1;let[r,o]=e.range.start.line<t.range.start.line?[e,t]:[t,e];return r.range.end.line===o.range.start.line}const Q={newLine:Xe.newLine({allowMore:!0}),oneSpace:Xe.oneSpace(),noSpace:Xe.noSpace(),indent:Xe.indent({allowMore:!0}),noIndent:Xe.noIndent()};var LikeC4Formatter=class extends Ue{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,r){this.extendedFormattingCommands=[];let o=super.doDocumentFormat(e,t,r);return this.doExtendedFormatting(o),o}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatSteps(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,isTags,(e,t)=>{let r=Ke(e.$cstNode,`values`).filter(z).slice(1);t.cst(r).prepend(Q.oneSpace),t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatDeploymentRelation(e){this.on(e,isDeploymentRelation,(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...P([e.target,e.tags],z)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)})}formatExtendDeployment(e){this.on(e,isExtendDeployment,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatRelation(e){this.on(e,e=>isRelation(e)||isDeploymentRelation(e),(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`,`]<->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...P([e.target,e.tags],z)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)}),this.on(e,isStepOrSeries,(e,t)=>{t.keywords(`->`,`<-`).surround(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.properties(`title`).prepend(Q.oneSpace),(isStepSeries(e)&&isMultiline(e.$cstNode)||isStep(e)&&isStepSeries(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(Xe.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(Xe.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&isMultiline(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){isLikeC4Grammar(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Q.noIndent)}indentContentInBraces(e){if(isLikeC4Lib(e)||isSpecificationRule(e)||isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e)||isGlobals(e)||isGlobalStyle(e)||isGlobalStyleGroup(e)||isGlobalPredicateGroup(e)||isGlobalDynamicPredicateGroup(e)||isGlobalStyleGroup(e)||isModel(e)||isElementBody(e)||isExtendElementBody(e)||isRelationBody(e)||isRelationStyleProperty(e)||isMetadataBody(e)||isModelViews(e)||isElementViewBody(e)||isDynamicViewBody(e)||isDeploymentViewBody(e)||isViewRuleStyle(e)||isViewRuleGroup(e)||isCustomElementProperties(e)||isCustomRelationProperties(e)||isElementStyleProperty(e)||isStepsBlock(e)||isAltSteps(e)||isModelDeployments(e)||isDeploymentNodeBody(e)||isDeploymentRelationBody(e)||isDeployedInstanceBody(e)||isExtendDeploymentBody(e)){let t=this.getNodeFormatter(e),r=t.keywords(`{`);r.prepend(Q.noIndent).prepend(Q.oneSpace);let o=isMultiline(e.$cstNode),s=t.keywords(`}`),c=t.interior(r,s),u=null;for(let e of c.nodes){if(!o){t.cst([e]).surround(Q.oneSpace);continue}(!u||!areOverlap(u,e))&&t.cst([e]).prepend(Xe.newLine({allowMore:!0})).prepend(Q.indent),u=e}o?s.prepend(Q.noIndent).prepend(Xe.newLine({allowMore:!0})):s.prepend(Xe.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,isElementKind)?.keywords(`element`).append(Q.oneSpace)}formatView(e){this.on(e,isElementView$1,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Q.oneSpace),t.keywords(`of`,`extends`).surround(Q.oneSpace)}),this.on(e,isDynamicView$1)?.keywords(`dynamic`,`view`).append(Q.oneSpace),this.on(e,isDeploymentView$1)?.keywords(`deployment`,`view`).append(Q.oneSpace)}formatLeafProperty(e){if(isElementStringProperty(e)||isRelationStringProperty(e)||isViewStringProperty(e)||isViewOrderProperty(e)||isNotationProperty(e)||isNotesProperty(e)||isSpecificationElementStringProperty(e)||isSpecificationRelationshipStringProperty(e)||isColorProperty(e)||isLineProperty(e)||isArrowProperty(e)||isIconProperty(e)||isShapeProperty(e)||isBorderProperty(e)||isOpacityProperty(e)||isMultipleProperty(e)||isIconColorProperty(e)||isIconSizeProperty(e)||isIconPositionProperty(e)||isShapeSizeProperty(e)||isPaddingSizeProperty(e)||isTextSizeProperty(e)){let t=this.getNodeFormatter(e),r=t.keyword(`:`),o=t.keywords(`title`,`description`,`order`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);r.nodes.length===0?o.append(Q.oneSpace):r.prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)}}formatLinkProperty(e){this.on(e,isLinkProperty,(e,t)=>{t.keyword(`link`).append(Q.oneSpace),t.property(`value`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatNavigateToProperty(e){this.on(e,isNavigateToProperty)?.property(`key`).append(Q.oneSpace)}formatAutolayoutProperty(e){this.on(e,isViewRuleAutoLayout,(e,t)=>{t.keyword(`autoLayout`).append(Q.oneSpace),t.property(`rankSep`).prepend(Q.oneSpace),t.property(`nodeSep`).prepend(Q.oneSpace)})}formatMetadataProperty(e){this.on(e,isMetadataAttribute,(e,t)=>{t.property(`key`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatElementDeclaration(e){this.on(e,isElement,(e,t)=>{let r=Se(e.$cstNode,`kind`),o=Se(e.$cstNode,`name`);o&&r&&(compareRanges(o,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([o]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`props`).prepend(Q.oneSpace)})}formatExtendElement(e){this.on(e,isExtendElementOrRelation,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatGlobals(e){this.on(e,isGlobalStyle,(e,t)=>{t.keyword(`style`).append(Q.oneSpace),t.property(`id`).append(Q.oneSpace)}),this.on(e,isGlobalStyleGroup,(e,t)=>{t.keyword(`styleGroup`).append(Q.oneSpace)}),this.on(e,isGlobalPredicateGroup,(e,t)=>{t.keyword(`predicateGroup`).append(Q.oneSpace)}),this.on(e,isGlobalDynamicPredicateGroup,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Q.oneSpace)})}formatImports(e){this.on(e,isImportsFromPoject,(e,t)=>{t.keyword(`import`).append(Q.oneSpace),t.keywords(`{`,`}`,`from`).surround(Q.oneSpace)}),this.on(e,isImported,(e,t)=>{t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatSpecificationRule(e){if((isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationTag(e)||isSpecificationDeploymentNodeKind(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Q.oneSpace),isSpecificationColor(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Q.oneSpace),t.property(`name`).append(Q.oneSpace)}}formatWithPredicate(e){(isFqnExprWith(e)||isRelationExprWith(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Q.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,isDeploymentNode$1,(e,t)=>{let r=Se(e.$cstNode,`kind`),o=Se(e.$cstNode,`name`);o&&r&&(compareRanges(o,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([o]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`title`).prepend(Q.oneSpace)})}formatDeployedInstance(e){this.on(e,isDeployedInstance,(e,t)=>{let r=e.$cstNode?.content.find(e=>e.text===`=`);r&&t.cst([r]).surround(Q.oneSpace),t.keyword(`instanceOf`).append(Q.oneSpace),t.property(`title`).prepend(Q.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,isViewRuleGlobalStyle,(e,t)=>{t.keywords(`global`,`style`).append(Q.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(isViewRuleGlobalPredicateRef(e)||isDynamicViewGlobalPredicateRef(e))&&t.keywords(`global`,`predicate`).append(Q.oneSpace)}formatViewRuleGroup(e){this.on(e,isViewRuleGroup,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)})}formatViewRuleStyle(e){this.on(e,isViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isDeploymentViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace),this.on(e,isFqnExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace)}formatWhereExpression(e){(isRelationExprWhere(e)||isFqnExprWhere(e))&&this.getNodeFormatter(e).keyword(`where`).append(Q.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,isWhereRelationExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereRelationNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereRelation(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,isWhereElementExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereElementNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereElement(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatIncludeExcludeExpressions(e){if(isDynamicViewRule(e)||isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(Q.oneSpace)}if(isExpressions(e)){let t=this.getNodeFormatter(e),r=this.findPredicateExpressionRoot(e),o=r?.$cstNode&&isMultiline(r?.$cstNode);o&&t.property(`value`).prepend(Q.indent),t.keyword(`,`).prepend(Q.noSpace).append(o?Q.newLine:Q.oneSpace)}}formatRelationExpression(e){this.on(e,isIncomingRelationExpr,(e,t)=>{t.keyword(`->`).append(Q.oneSpace)}),this.on(e,isInOutRelationExpr,(e,t)=>{t.keyword(`->`).prepend(Q.oneSpace)}),this.on(e,isOutgoingRelationExpr,(e,t)=>{t.keywords(`->`,`<->`).prepend(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace)}),this.on(e,isDirectedRelationExpr,(e,t)=>{t.property(`target`).prepend(Q.oneSpace)})}formatSteps(e){this.on(e,Wr(isAltSteps,isTryBlock,isCatchBlock,isFinallyBlock),(e,t)=>{if(t.keywords(`try`,`alt`).append(Q.oneSpace),t.property(`title`).surround(Q.oneSpace),isCatchBlock(e)){let r=t.keyword(`catch`);isSameLine(e.try.$cstNode,r.nodes[0])?r.prepend(Q.oneSpace):r.prepend(Xe.newLine()),r.append(Q.oneSpace)}if(isFinallyBlock(e)){let r=t.keyword(`finally`);isSameLine(e.tryCatch.$cstNode,r.nodes[0])?r.prepend(Q.oneSpace):r.prepend(Xe.newLine()),r.append(Q.oneSpace)}}),this.on(e,isSubflowStep,(e,t)=>{t.property(`kind`).append(Q.oneSpace),t.property(`title`).surround(Q.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||isDynamicViewRule(t)||isViewRulePredicate(t)||isDeploymentViewRulePredicate(t))return t;t=t.$container}}on(e,t,r){let o=t(e)?this.getNodeFormatter(e):void 0;try{r&&o&&r(e,o)}catch(t){Y.warn(`Error formatting node ${e.$type}`,{error:t})}return o}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let r of this.extendedFormattingCommands)switch(r.type){case`normalizeQuotes`:t(r,e);break;default:W(r.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;if(isMetadataAttribute(e)){let r=e.value;isMetadataArray(r)?t=this.getNodeFormatter(r).nodes(...r.values):r&&(t=this.getNodeFormatter(e).property(`value`))}else t=this.on(e,isStringProperty)?.property(`value`);t??=this.on(e,isElement)?.properties(`props`),t??=this.on(e,isImportsFromPoject)?.properties(`project`),t??=this.on(e,isRelation)?.properties(`title`,`technology`),t??=this.on(e,isViewRuleGroup)?.properties(`title`),t??=this.on(e,isStepStatement)?.properties(`title`),t??=this.on(e,isDeploymentNode$1)?.properties(`title`),t??=this.on(e,isDeployedInstance)?.properties(`title`),t??=this.on(e,isDeploymentRelation)?.properties(`title`,`technology`),t??=this.on(e,isLinkProperty)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,r)=>{let o=t===`single`?`"`:`'`,s=t===`single`?`'`:`"`,c=s.repeat(3),u=s,d=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?c:u;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),o,s)+t}});r.push(...d)}}escapeQuotesInternalQuotes(e,t,r){let o=``,s=0;for(;s>=0;){let t=e.indexOf(r,s);if(t<0){o+=e.slice(s);break}o+=e.slice(s,t),s=t+1;let c=!1;for(;t>0&&e[t-1]==`\\`;)c=!c,t--;o+=c?r:`\\${r}`}return o}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};Ze();const Ff=Y.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===ve.Error;var DefaultLikeC4LanguageServices=class{services;builder;editor;projectsManager;workspaceManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.workspaceManager=e.shared.workspace.WorkspaceManager,this.editor=e.likec4.ModelChanges}get views(){return this.services.likec4.Views}get workspaceUri(){try{return this.workspaceManager.workspaceUri}catch(e){return Ff.warn(`Failed to get workspace URI, using default folder`,{error:e}),C.file(`/`)}}get workspacePath(){return this.workspaceUri.fsPath}projects(){let e=this.services.shared.workspace.ProjectsManager,t=R(this.services.shared.workspace.LangiumDocuments.groupedByProject(),nn(),F(([t,r])=>{let o=t,{folderUri:s,config:c}=e.getProject(o);return{id:o,folder:s,path:this.workspaceManager.relativePath(s),title:c.title??c.name,documents:F(r,Nn(`uri`)),config:c}}));if(M(t,2)&&e.defaultProjectId){let r=t.findIndex(t=>t.id===e.defaultProjectId);if(r>0){let[e]=t.splice(r,1);return[e,...t]}return t}if(M(t,1))return t;let{id:r,folderUri:o,config:s}=e.default;return[{id:r,folder:o,path:this.workspaceManager.relativePath(o),title:s.title??s.name,documents:[],config:s}]}project(e){let{id:t,folderUri:r,config:o}=this.projectsManager.ensureProject(e),s=F(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Nn(`uri`));return{id:t,folder:r,path:this.workspaceManager.relativePath(r),title:o.title??o.name,documents:s,config:o}}async diagrams(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(r,t)}async computedModel(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(r,t)}async layoutedModel(e,t){let r=this.projectsManager.ensureProjectId(e),o=await this.builder.computeModel(r,t);if(!o)throw Error(`Failed to compute model, empty project?`);let s=await this.views.layoutAllViews(r,t);return Ai.create({...o.$data,_stage:`layouted`,views:R(s,F(Nn(`diagram`)),rn(Nn(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,r=[];for(let o of t){let t=await this.builder.computeModel(o,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Ai.EMPTY){Ff.debug(`Project ${o} is empty, skipping`);continue}r.push(t)}if(!M(r,1))throw Error(`No models found`);let o=Ki(r);return await this.views.layouter.layoutProjectsView(o)}getErrors(){return R(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),Zt(e=>R(e.diagnostics??[],P(isErrorDiagnostic),F(({message:t,range:r})=>({message:t,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:W(e)}}documentText(e){return this.services.shared.workspace.LangiumDocuments.getDocument(C.parse(e))?.textDocument.getText()}async format(e){let t=this.services.shared.workspace.LangiumDocuments,r=this.services.lsp.Formatter,o=buildFormattingOptions(e),s=this.collectDocumentsToFormat(t,e);s.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let c=new Map;for(let e of s){let t=e.uri.toString(),s=await r.formatDocument(e,{options:o,textDocument:{uri:t}}),u=s.length===0?e.textDocument.getText():he.applyEdits(e.textDocument,s);c.set(t,u)}return c}collectDocumentsToFormat(e,t){let r=t?.projectIds??[],o=t?.documentUris??[],s=new Map;if(r.length>0)for(let t of r)for(let r of e.projectDocuments(t))s.set(r.uri.toString(),r);else if(o.length===0)for(let t of this.projectsManager.all)for(let r of e.projectDocuments(t))s.set(r.uri.toString(),r);for(let t of o){if(s.has(t))continue;let r;try{r=e.getDocument(C.parse(t))}catch{Ff.warn(`format: skipping unknown document ${t}`);continue}if(!isLikeC4LangiumDocument(r)){Ff.warn(`format: skipping unknown document ${t}`);continue}s.set(t,r)}return[...s.values()]}async dispose(){try{Ff.debug(`disposing LikeC4LanguageServices`),this.services.likec4.FqnIndex.dispose(),this.services.likec4.DeploymentsIndex.dispose(),this.services.likec4.ModelParser.dispose(),this.services.likec4.ModelBuilder.dispose(),this.services.likec4.Views.dispose(),this.services.likec4.LastSeen.dispose(),this.services.Rpc.dispose(),this.services.shared.workspace.ManualLayouts.dispose(),this.services.shared.workspace.ProjectsManager.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){Ff.error(loggable(e))}finally{Ff.debug(`LikeC4LanguageServices disposed`)}}};function buildFormattingOptions(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var LikeC4CodeLensProvider=class{services;constructor(e){this.services=e}async provideCodeLens(e,t,r){if(isLikeC4LangiumDocument(e))return e.state<x.Linked&&(Y.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(x.Linked,e.uri,r),Y.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=mf.readId(e),r=e.$cstNode?.range;if(!r||!t)return[];let o=projectIdFrom(e);return{range:{start:r.start,end:{line:r.start.line,character:r.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,o],title:`open preview`}}})}};Ze();function isCompletionForPojectName(e,t){return Pe(t.feature)&&t.property===`project`&&isImportsFromPoject(e.node)}const If=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
59
+ `):void 0}default:return e}}catch(t){return Y.debug(`Failed to get documentation for node {nodeType}`,{error:t,nodeType:e.$type}),super.getDocumentation(e)}}},_u=Ie();function areOverlap(e,t){return[e,t]=compareRanges(e,t)>0?[t,e]:[e,t],isInRagne(e.range,t.range.start)}function compareRanges(e,t){let r=e.range.start.line-t.range.start.line;return r===0?e.range.start.character-t.range.start.character:r}function isInRagne(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function isMultiline(e){return!!e&&e.range.start.line!=e.range.end.line}function isSameLine(e,t){if(!e||!t)return!1;let[r,a]=e.range.start.line<t.range.start.line?[e,t]:[t,e];return r.range.end.line===a.range.start.line}const Q={newLine:et.newLine({allowMore:!0}),oneSpace:et.oneSpace(),noSpace:et.noSpace(),indent:et.indent({allowMore:!0}),noIndent:et.noIndent()};var LikeC4Formatter=class extends Je{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,r){this.extendedFormattingCommands=[];let a=super.doDocumentFormat(e,t,r);return this.doExtendedFormatting(a),a}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatSteps(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatDescriptionFileProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,isTags,(e,t)=>{let r=Fe(e.$cstNode,`values`).filter(P).slice(1);t.cst(r).prepend(Q.oneSpace),t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatDeploymentRelation(e){this.on(e,isDeploymentRelation,(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...M([e.target,e.tags],P)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)})}formatExtendDeployment(e){this.on(e,isExtendDeployment,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatRelation(e){this.on(e,e=>isRelation(e)||isDeploymentRelation(e),(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`,`]<->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...M([e.target,e.tags],P)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)}),this.on(e,isStepOrSeries,(e,t)=>{t.keywords(`->`,`<-`).surround(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.properties(`title`).prepend(Q.oneSpace),(isStepSeries(e)&&isMultiline(e.$cstNode)||isStep(e)&&isStepSeries(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(et.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(et.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&isMultiline(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){isLikeC4Grammar(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`,`diff`).prepend(Q.noIndent)}indentContentInBraces(e){if(isLikeC4Lib(e)||isSpecificationRule(e)||isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e)||isGlobals(e)||isGlobalStyle(e)||isGlobalStyleGroup(e)||isGlobalPredicateGroup(e)||isGlobalDynamicPredicateGroup(e)||isGlobalStyleGroup(e)||isModel(e)||isModelDiff(e)||isDiffRemove(e)||isDiffAdd(e)||isElementBody(e)||isExtendElementBody(e)||isRelationBody(e)||isRelationStyleProperty(e)||isMetadataBody(e)||isModelViews(e)||isElementViewBody(e)||isDynamicViewBody(e)||isDeploymentViewBody(e)||isViewRuleStyle(e)||isViewRuleGroup(e)||isDeploymentViewRuleGroup(e)||isCustomElementProperties(e)||isCustomRelationProperties(e)||isElementStyleProperty(e)||isStepsBlock(e)||isAltSteps(e)||isModelDeployments(e)||isDeploymentNodeBody(e)||isDeploymentRelationBody(e)||isDeployedInstanceBody(e)||isExtendDeploymentBody(e)){let t=this.getNodeFormatter(e),r=t.keywords(`{`);r.prepend(Q.noIndent).prepend(Q.oneSpace);let a=isMultiline(e.$cstNode),o=t.keywords(`}`),s=t.interior(r,o),l=null;for(let e of s.nodes)a?(l&&areOverlap(l,e)||t.cst([e]).prepend(et.newLine({allowMore:!0})).prepend(Q.indent),l=e):t.cst([e]).surround(Q.oneSpace);a?o.prepend(Q.noIndent).prepend(et.newLine({allowMore:!0})):o.prepend(et.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,isElementKind)?.keywords(`element`).append(Q.oneSpace)}formatView(e){this.on(e,isElementView$1,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Q.oneSpace),t.keywords(`of`,`extends`).surround(Q.oneSpace)}),this.on(e,isDynamicView$1)?.keywords(`dynamic`,`view`).append(Q.oneSpace),this.on(e,isDeploymentView$1)?.keywords(`deployment`,`view`).append(Q.oneSpace)}formatLeafProperty(e){if(isElementStringProperty(e)||isRelationStringProperty(e)||isViewStringProperty(e)||isViewOrderProperty(e)||isViewRoutingProperty(e)||isNotationProperty(e)||isNotesProperty(e)||isSpecificationElementStringProperty(e)||isSpecificationRelationshipStringProperty(e)||isColorProperty(e)||isLineProperty(e)||isArrowProperty(e)||isIconProperty(e)||isShapeProperty(e)||isBorderProperty(e)||isOpacityProperty(e)||isMultipleProperty(e)||isIconColorProperty(e)||isIconSizeProperty(e)||isIconPositionProperty(e)||isShapeSizeProperty(e)||isPaddingSizeProperty(e)||isTextSizeProperty(e)||isSizingProperty(e)){let t=this.getNodeFormatter(e),r=t.keyword(`:`),a=t.keywords(`title`,`description`,`descriptionFile`,`order`,`routing`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`,`sizing`);r.nodes.length===0?a.append(Q.oneSpace):r.prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)}}formatLinkProperty(e){this.on(e,isLinkProperty,(e,t)=>{t.keyword(`link`).append(Q.oneSpace),t.property(`value`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatDescriptionFileProperty(e){this.on(e,isDescriptionFileProperty,(e,t)=>{let r=t.keyword(`:`);r.nodes.length===0?t.keyword(`descriptionFile`).append(Q.oneSpace):r.prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.oneSpace).append(Q.newLine)})}formatNavigateToProperty(e){this.on(e,isNavigateToProperty)?.property(`key`).append(Q.oneSpace)}formatAutolayoutProperty(e){this.on(e,isViewRuleAutoLayout,(e,t)=>{t.keyword(`autoLayout`).append(Q.oneSpace),t.property(`rankSep`).prepend(Q.oneSpace),t.property(`nodeSep`).prepend(Q.oneSpace),t.property(`routing`).prepend(Q.oneSpace)})}formatMetadataProperty(e){this.on(e,isMetadataAttribute,(e,t)=>{t.property(`key`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatElementDeclaration(e){this.on(e,isElement,(e,t)=>{let r=Le(e.$cstNode,`kind`),a=Le(e.$cstNode,`name`);a&&r&&(compareRanges(a,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([a]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`props`).prepend(Q.oneSpace)})}formatExtendElement(e){this.on(e,isExtendElementOrRelation,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatGlobals(e){this.on(e,isGlobalStyle,(e,t)=>{t.keyword(`style`).append(Q.oneSpace),t.property(`id`).append(Q.oneSpace)}),this.on(e,isGlobalStyleGroup,(e,t)=>{t.keyword(`styleGroup`).append(Q.oneSpace)}),this.on(e,isGlobalPredicateGroup,(e,t)=>{t.keyword(`predicateGroup`).append(Q.oneSpace)}),this.on(e,isGlobalDynamicPredicateGroup,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Q.oneSpace)})}formatImports(e){this.on(e,isImportsFromPoject,(e,t)=>{t.keyword(`import`).append(Q.oneSpace),t.keywords(`{`,`}`,`from`).surround(Q.oneSpace)}),this.on(e,isImported,(e,t)=>{t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatSpecificationRule(e){if((isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationTag(e)||isSpecificationDeploymentNodeKind(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Q.oneSpace),isSpecificationColor(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Q.oneSpace),t.property(`name`).append(Q.oneSpace)}}formatWithPredicate(e){(isFqnExprWith(e)||isRelationExprWith(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Q.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,isDeploymentNode$1,(e,t)=>{let r=Le(e.$cstNode,`kind`),a=Le(e.$cstNode,`name`);a&&r&&(compareRanges(a,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([a]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`title`).prepend(Q.oneSpace)})}formatDeployedInstance(e){this.on(e,isDeployedInstance,(e,t)=>{let r=e.$cstNode?.content.find(e=>e.text===`=`);r&&t.cst([r]).surround(Q.oneSpace),t.keyword(`instanceOf`).append(Q.oneSpace),t.property(`title`).prepend(Q.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,isViewRuleGlobalStyle,(e,t)=>{t.keywords(`global`,`style`).append(Q.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(isViewRuleGlobalPredicateRef(e)||isDynamicViewGlobalPredicateRef(e))&&t.keywords(`global`,`predicate`).append(Q.oneSpace)}formatViewRuleGroup(e){this.on(e,isViewRuleGroup,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)}),this.on(e,isDeploymentViewRuleGroup,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)})}formatViewRuleStyle(e){this.on(e,isViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isDeploymentViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace),this.on(e,isFqnExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace)}formatWhereExpression(e){(isRelationExprWhere(e)||isFqnExprWhere(e))&&this.getNodeFormatter(e).keyword(`where`).append(Q.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,isWhereRelationExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereRelationNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereRelation(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,isWhereElementExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereElementNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereElement(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatIncludeExcludeExpressions(e){if(isDynamicViewRule(e)||isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)){let t=this.getNodeFormatter(e);e.$cstNode&&isMultiline(e.$cstNode)||t.keywords(`include`,`exclude`).append(Q.oneSpace)}if(isExpressions(e)){let t=this.getNodeFormatter(e),r=this.findPredicateExpressionRoot(e),a=r?.$cstNode&&isMultiline(r?.$cstNode);a&&t.property(`value`).prepend(Q.indent),t.keyword(`,`).prepend(Q.noSpace).append(a?Q.newLine:Q.oneSpace)}}formatRelationExpression(e){this.on(e,isIncomingRelationExpr,(e,t)=>{t.keyword(`->`).append(Q.oneSpace)}),this.on(e,isInOutRelationExpr,(e,t)=>{t.keyword(`->`).prepend(Q.oneSpace)}),this.on(e,isOutgoingRelationExpr,(e,t)=>{t.keywords(`->`,`<->`).prepend(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace)}),this.on(e,isDirectedRelationExpr,(e,t)=>{t.property(`target`).prepend(Q.oneSpace)})}formatSteps(e){this.on(e,oi(isAltSteps,isTryBlock,isCatchBlock,isFinallyBlock),(e,t)=>{if(t.keywords(`try`,`alt`).append(Q.oneSpace),t.property(`title`).surround(Q.oneSpace),isCatchBlock(e)){let r=t.keyword(`catch`);isSameLine(e.try.$cstNode,r.nodes[0])?r.prepend(Q.oneSpace):r.prepend(et.newLine()),r.append(Q.oneSpace)}if(isFinallyBlock(e)){let r=t.keyword(`finally`);isSameLine(e.tryCatch.$cstNode,r.nodes[0])?r.prepend(Q.oneSpace):r.prepend(et.newLine()),r.append(Q.oneSpace)}}),this.on(e,isSubflowStep,(e,t)=>{t.property(`kind`).append(Q.oneSpace),t.property(`title`).surround(Q.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||isDynamicViewRule(t)||isViewRulePredicate(t)||isDeploymentViewRulePredicate(t))return t;t=t.$container}}on(e,t,r){let a=t(e)?this.getNodeFormatter(e):void 0;try{r&&a&&r(e,a)}catch(t){Y.warn(`Error formatting node ${e.$type}`,{error:t})}return a}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let r of this.extendedFormattingCommands)switch(r.type){case`normalizeQuotes`:t(r,e);break;default:G(r.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;if(isMetadataAttribute(e)){let r=e.value;isMetadataArray(r)?t=this.getNodeFormatter(r).nodes(...r.values):r&&(t=this.getNodeFormatter(e).property(`value`))}else t=this.on(e,isStringProperty)?.property(`value`);t??=this.on(e,isElement)?.properties(`props`),t??=this.on(e,isImportsFromPoject)?.properties(`project`),t??=this.on(e,isRelation)?.properties(`title`,`technology`),t??=this.on(e,isViewRuleGroup)?.properties(`title`),t??=this.on(e,isDeploymentViewRuleGroup)?.properties(`title`),t??=this.on(e,isStepStatement)?.properties(`title`),t??=this.on(e,isDeploymentNode$1)?.properties(`title`),t??=this.on(e,isDeployedInstance)?.properties(`title`),t??=this.on(e,isDeploymentRelation)?.properties(`title`,`technology`),t??=this.on(e,isLinkProperty)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,r)=>{let a=t===`single`?`"`:`'`,o=t===`single`?`'`:`"`,s=o.repeat(3),l=o,p=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?s:l;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),a,o)+t}});r.push(...p)}}escapeQuotesInternalQuotes(e,t,r){let a=``,o=0;for(;o>=0;){let t=e.indexOf(r,o);if(t<0){a+=e.slice(o);break}a+=e.slice(o,t),o=t+1;let s=!1;for(;t>0&&e[t-1]==`\\`;)s=!s,t--;a+=s?r:`\\${r}`}return a}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};st();const vu=Y.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===at.Error;var DefaultLikeC4LanguageServices=class{services;builder;editor;projectsManager;workspaceManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.workspaceManager=e.shared.workspace.WorkspaceManager,this.editor=e.likec4.ModelChanges}get views(){return this.services.likec4.Views}get modelDiffs(){return this.services.likec4.ModelDiffs}get removalImpact(){return this.services.likec4.RemovalImpact}get workspaceUri(){try{return this.workspaceManager.workspaceUri}catch(e){return vu.warn(`Failed to get workspace URI, using default folder`,{error:e}),j.file(`/`)}}get workspacePath(){return this.workspaceUri.fsPath}projects(){let e=this.services.shared.workspace.ProjectsManager,t=I(this.services.shared.workspace.LangiumDocuments.groupedByProject(),an(),V(([t,r])=>{let a=t,{folderUri:o,config:s}=e.getProject(a);return{id:a,folder:o,path:this.workspaceManager.relativePath(o),title:s.title??s.name,documents:V(r,z(`uri`)),config:s}}));if(R(t,2)&&e.defaultProjectId){let r=t.findIndex(t=>t.id===e.defaultProjectId);if(r>0){let[e]=t.splice(r,1);return[e,...t]}return t}if(R(t,1))return t;let{id:r,folderUri:a,config:o}=e.default;return[{id:r,folder:a,path:this.workspaceManager.relativePath(a),title:o.title??o.name,documents:[],config:o}]}project(e){let{id:t,folderUri:r,config:a}=this.projectsManager.ensureProject(e),o=V(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),z(`uri`));return{id:t,folder:r,path:this.workspaceManager.relativePath(r),title:a.title??a.name,documents:o,config:a}}async diagrams(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(r,t)}async computedModel(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(r,t)}async layoutedModel(e,t){let r=this.projectsManager.ensureProjectId(e),a=await this.builder.computeModel(r,t);if(!a)throw Error(`Failed to compute model, empty project?`);let o=await this.views.layoutAllViews(r,t);return ia.create({...a.$data,_stage:`layouted`,views:I(o,V(z(`diagram`)),Mt(z(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,r=[];for(let a of t){let t=await this.builder.computeModel(a,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);t===ia.EMPTY?vu.debug(`Project ${a} is empty, skipping`):r.push(t)}if(!R(r,1))throw Error(`No models found`);let a=va(r);return await this.views.layouter.layoutProjectsView(a)}getErrors(){return I(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),zt(e=>I(e.diagnostics??[],M(isErrorDiagnostic),V(({message:t,range:r})=>({message:typeof t==`string`?t:t.value,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId,e.property);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId,e.property);default:G(e)}}documentText(e){return this.services.shared.workspace.LangiumDocuments.getDocument(j.parse(e))?.textDocument.getText()}async format(e){let t=this.services.shared.workspace.LangiumDocuments,r=this.services.lsp.Formatter,a=buildFormattingOptions(e),o=this.collectDocumentsToFormat(t,e);o.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let s=/* @__PURE__ */ new Map;for(let e of o){let t=e.uri.toString(),o=await r.formatDocument(e,{options:a,textDocument:{uri:t}}),l=o.length===0?e.textDocument.getText():ce.applyEdits(e.textDocument,o);s.set(t,l)}return s}collectDocumentsToFormat(e,t){let r=t?.projectIds??[],a=t?.documentUris??[],o=/* @__PURE__ */ new Map;if(r.length>0)for(let t of r)for(let r of e.projectDocuments(t))o.set(r.uri.toString(),r);else if(a.length===0)for(let t of this.projectsManager.all)for(let r of e.projectDocuments(t))o.set(r.uri.toString(),r);for(let t of a){if(o.has(t))continue;let r;try{r=e.getDocument(j.parse(t))}catch{vu.warn(`format: skipping unknown document ${t}`);continue}isLikeC4LangiumDocument(r)?o.set(t,r):vu.warn(`format: skipping unknown document ${t}`)}return[...o.values()]}async dispose(){try{vu.debug(`disposing LikeC4LanguageServices`),this.services.likec4.FqnIndex.dispose(),this.services.likec4.DeploymentsIndex.dispose(),this.services.likec4.ModelParser.dispose(),this.services.likec4.ModelBuilder.dispose(),this.services.likec4.Views.dispose(),this.services.likec4.DescriptionFiles.dispose(),this.services.likec4.LastSeen.dispose(),this.services.Rpc.dispose(),this.services.shared.workspace.ManualLayouts.dispose(),this.services.shared.workspace.ProjectsManager.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){vu.error(loggable(e))}finally{vu.debug(`LikeC4LanguageServices disposed`)}}};function buildFormattingOptions(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var LikeC4CodeLensProvider=class{services;constructor(e){this.services=e}async provideCodeLens(e,t,r){if(!isLikeC4LangiumDocument(e))return;let a=e.parseResult.value.views.flatMap(e=>e.views);return a.length===0?[]:(r&&await Ce(r),a.flatMap(e=>{let t=Ql.readId(e),r=e.$cstNode?.range;if(!r||!t)return[];let a=projectIdFrom(e),o={start:r.start,end:{line:r.start.line,character:r.start.character+4}};return[{range:o,command:{command:`likec4.open-preview`,arguments:[t,a],title:`open preview`}},{range:o,command:{command:`likec4.save-as-png`,arguments:[t,a],title:`save png`}}]}))}};const yu=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function tryOrLogFn(t,r,a){try{let o=e(t,r,a);Pt(o)&&await o;return}catch(e){let a=e instanceof Error?e.message:String(e);r(`error`,`Validation failed: ${a}`,{node:t}),Y.debug(`Validation failed: ${a}`,{error:e})}}}const{getDocument:bu}=ee,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,a)=>{let o=r.getName(e);if(!o){a(`error`,`DeploymentNode must be named`,{node:e});return}let s=_i(r.getNameNode(e),`name CstNode not found`).range;yu.includes(o)&&a(`error`,`Reserved word: ${o}`,{node:e,range:s});let l=projectIdFrom(e),p=t.getFqn(e);t.byFqn(l,p).limit(2).toArray().length>1&&a(`error`,`Duplicate node name "${p}"`,{node:e,range:s})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,a)=>{let o=r.getName(e);if(!o){a(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let s=_i(r.getNameNode(e),`name CstNode not found`).range;yu.includes(o)&&a(`error`,`Reserved word: ${o}`,{node:e,range:s});let l=projectIdFrom(e),p=t.getFqn(e);t.byFqn(l,p).limit(2).toArray().length>1&&a(`error`,`Duplicate instance name "${p}"`,{node:e,range:s})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{if(!e.target?.value?.ref){r(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let a=bu(e),o=t.forDocument(a),s;try{s=o._resolveDeploymentRelationSource(e)}catch(t){Y.warn(loggable(t)),r(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(U.isImportRef(s)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(U.isModelRef(s)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let l=o.parseFqnRef(e.target);U.isImportRef(l)?r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`}):U.isModelRef(l)?r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`}):mi(s.deployment,l.deployment)&&r(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let r=e.deploymentNode.value.ref;r&&isDeploymentNode$1(r)||t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})});function relationFingerprint({source:e,target:t,kind:r,title:a,isBidirectional:o}){let s=H.flatten(e),l=H.flatten(t);if(o&&l<s){let e=l;l=s,s=e}return stringHash$1(`extend-relation`,s,l,r??`default`,a??``,o?`bidirectional`:`directed`)}function relationLabel(e){let t=e.title?` '${e.title}'`:``;return`${H.flatten(e.source)} -> ${H.flatten(e.target)}${t}`}function footprintOf(e){let t=e.flatMap(e=>e.elements),r=e.flatMap(e=>e.relations),a=e.flatMap(e=>e.extendElements),o=/* @__PURE__ */ new Map;for(let e of a)e.metadata&&o.set(e.id,{...o.get(e.id),...e.metadata});return{id:e[0].id,removes:e.flatMap(e=>e.removeElements.map(z(`fqn`))),removedRelations:new Set(e.flatMap(e=>e.removeRelations.map(z(`fingerprint`)))),adds:new Set(t.map(z(`id`))),addedRelations:new Map(r.map(e=>[relationFingerprint(e),relationLabel(e)])),uses:/* @__PURE__ */ new Set([...a.map(z(`id`)),...r.flatMap(e=>[H.flatten(e.source),H.flatten(e.target)]),...t.map(e=>Wi(e.id)).filter(Ut)]),metadata:o}}function removedBy(e,t){return[e,...Ci(e)].find(e=>t.includes(e))}function bothChange(e,t,r){return[...t.removes.filter(t=>removedBy(t,e.removes)).map(e=>`both remove ${e}`),...e.removes.filter(e=>!t.removes.includes(e)&&removedBy(e,t.removes)).map(e=>`both remove ${e}`),...[...e.removedRelations].filter(e=>t.removedRelations.has(e)).map(e=>`both remove ${r.get(e)??`the same relationship`}`),...[...e.adds].filter(e=>t.adds.has(e)).map(e=>`both add ${e}`),...[...e.addedRelations].filter(([e])=>t.addedRelations.has(e)).map(([,e])=>`both add ${e}`),...[...e.metadata].flatMap(([e,r])=>{let a=t.metadata.get(e)??{};return Object.keys(r).filter(e=>e in a&&!Rt(r[e],a[e])).map(t=>`both set metadata '${t}' of ${e}`)})]}function affects(e,t,r){return[...t.uses].filter(e=>!t.adds.has(e)).flatMap(a=>{let o=removedBy(a,e.removes);switch(!0){case!!o:return[`${e.id} removes ${o}, ${t.id} uses ${o===a?`it`:a}`];case!r.has(a)&&e.adds.has(a):return[`${t.id} uses ${a}, which only ${e.id} adds`];default:return[]}})}function findDiffOverlaps(e){let t=new Set(e.flatMap(e=>e.c4Elements.map(z(`id`)))),r=new Map(e.flatMap(e=>e.c4Relations.map(e=>[relationFingerprint(e),relationLabel(e)]))),a=xn(Yt(e.flatMap(e=>e.c4Diffs),z(`id`))).map(footprintOf);return a.flatMap((e,o)=>a.slice(o+1).flatMap(a=>_n([...bothChange(e,a,r),...affects(e,a,t),...affects(a,e,t)]).map(t=>({diffs:[e.id,a.id],message:t}))))}function overlapsOf(e,t){return e.flatMap(({diffs:[e,r],message:a})=>e===t?[`${r}: ${a}`]:r===t?[`${e}: ${a}`]:[])}const modelDiffChecks=e=>{let t=new se(e.shared,E.Linked),overlapsIn=r=>t.get(r,()=>findDiffOverlaps(e.likec4.ModelParser.documents(r).toArray()));return tryOrLog((e,t)=>{e.removes.length===0&&e.adds.length===0&&t(`warning`,`Diff has no changes`,{node:e,property:`name`});for(let r of e.adds.flatMap(e=>e.elements).filter(isExtendRelation))t(`error`,`Diff cannot extend relations. Remove the relation and add a new one instead`,{node:r});let r=projectIdFrom(A(e));for(let a of overlapsOf(overlapsIn(r),Vr(e.name)))t(`warning`,`Overlaps with diff ${a}. Agree on it with the owners of both diffs`,{node:e,property:`name`})})},diffRemoveEntryChecks=e=>{let t=e.likec4.ModelParser,r=new se(e.shared,E.Linked);function getProjectFingerprints(t){return r.get(t,()=>new Set(e.shared.workspace.LangiumDocuments.projectDocuments(t).flatMap(e=>e.c4Relations??[]).map(relationFingerprint)))}return tryOrLog((e,r)=>{if(!e.target){let t=e.source.value.ref;if(!t)return;if(!isElement(t)){r(`error`,`Only model elements can be removed`,{node:e,property:`source`});return}let a=ut(t,isModelDiff);a&&r(`error`,`Element is added by diff "${a.name}", it cannot be removed`,{node:e,property:`source`});return}let a=A(e),o=t.forDocument(a),s=safeCall(()=>o.parseFqnRef(e.source)),l=safeCall(()=>e.target?o.parseFqnRef(e.target):null);if(!s||!l)return;if(!U.isElementRef(s)||!U.isElementRef(l)){r(`error`,`Source and target must reference model elements`,{node:e});return}let p=o.parseRemoveEntry(e);`fingerprint`in p&&!getProjectFingerprints(projectIdFrom(a)).has(p.fingerprint)&&r(`error`,`No relation matches (by source, kind, target, title and direction). The model may have changed since the diff was written`,{node:e})})},stepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let a=elementRef(e.source),o=a&&t.getFqn(a);o||r(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let s=elementRef(e.target),l=s&&t.getFqn(s);l||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),o&&l&&mi(o,l)&&o!==l&&r(`error`,`Invalid parent-child relationship`,{node:e})})},stepSeries=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let a=e.source;isStep(a)&&a.isBackward&&r(`error`,`Invalid chain after backward step`,{node:e});let o=elementRef(e.target);o&&t.getFqn(o)||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},subflowStep=e=>{let isParallel=e=>e.kind===`par`||e.kind===`parallel`,isAltBranch=e=>e.kind===`else`||e.kind===`if`||e.kind===`when`;return tryOrLog((e,t)=>{isParallel(e)&&isSubflowStep(e.$container)&&isParallel(e.$container)&&t(`error`,`Nested parallel blocks are not allowed`,{node:e,property:`kind`}),isAltBranch(e)?isAltSteps(e.$container)||t(`error`,`"${e.kind}" alternative branch must be inside "alt"`,{node:e,property:`kind`}):isAltSteps(e.$container)&&t(`error`,`"${e.kind}" can not be used as an alternative branch, only "if", "when" or "else" are allowed`,{node:e,property:`kind`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{N(e.value)||e.value!==`diagram`&&e.value!==`sequence`?t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`}):ie(e,isDynamicViewBody)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getContainerOfType:xu,getDocument:Su}=ee,checkElement=e=>{let t=e.likec4.FqnIndex,r=e.workspace.AstNodeLocator,a=e.shared.workspace.LangiumDocuments;return tryOrLog((e,o)=>{let s=t.getFqn(e);if(!s){o(`error`,`Not indexed element`,{node:e,property:`name`});return}yu.includes(e.name)&&o(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let l=Su(e),p=l.uri,g=r.getAstNodePath(e),_=xu(e,isModelDiff)?.name,diffOf=(e,t)=>{let o=a.getDocument(e);return o&&xu(r.getAstNode(o.parseResult.value,t),isModelDiff)?.name},v=t.byFqn(projectIdFrom(l),s).filter(e=>e.documentUri!==p||e.path!==g).filter(e=>!_||[_,void 0].includes(diffOf(e.documentUri,e.path))).head();if(v){let t=v.documentUri!==p;o(`error`,`Duplicate element name ${e.name===s?e.name:e.name+` (`+s+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:v.nameSegment?.range??v.selectionSegment?.range,uri:v.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:Cu}=ee,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,r)=>{if(!t.all.includes(e.project)){r(`error`,`Imported project not found`,{node:e,property:`project`});return}let a=projectIdFrom(Cu(e));e.project===a&&r(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`})})},markdownRefsChecks=e=>{let t=e.likec4.FqnIndex,r=e.shared.workspace.IndexManager;return tryOrLog((e,a)=>{if(!Pr(e,`markdown`))return;let o=A(e),s=markdownRefsOf(e,o);if(s.length===0)return;let l=projectIdFrom(o);for(let{ref:o,targetRange:p,namespaceRange:g,range:_}of s)switch(o.kind){case`element`:t.byFqn(l,Or(o.target)).isEmpty()&&a(`warning`,`Element '${o.target}' not found`,{node:e,range:p});break;case`view`:r.projectElements(l,Qs.$type).some(e=>e.name===o.target)||a(`warning`,`View '${o.target}' not found`,{node:e,range:p});break;case`unknown`:a(`warning`,`Unknown link namespace '${o.namespace}'`,{node:e,range:g??_})}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let r=parseFloat(e.value);(isNaN(r)||r<0||r>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let r=e.$container;r.props.some(t=>isIconProperty(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),isElementStyleProperty(r)&&isElementBody(r.$container)&&r.$container.props.some(e=>isIconProperty(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},colorLiteralRuleChecks=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||Ft(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let r=jt(e.hex)?e.hex.toString().length:e.hex.length;r!==6&&r!==3&&r!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`})}else if(e.$type===`RGBAColor`){if((!jt(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!jt(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!jt(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),jt(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),Ft(e.alpha)){let r=parseFloat(e.alpha);(r<0||r>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}}else G(e)};function hasInlineDescription(e){return!!e&&`description`in e&&typeof e.description==`string`&&e.description.trim()!==``}const descriptionFileRuleChecks=e=>{let t=e.likec4.DescriptionFiles;return tryOrLog(async(r,a)=>{let o=r.value?.trim();if(!o){a(`error`,`File name is empty`,{node:r,property:`value`});return}let s=resolveDescriptionFile(r);if(!s){a(`error`,`File "${o}" cannot be resolved`,{node:r,property:`value`});return}if(!e.shared.workspace.WorkspaceManager.isInsideWorkspace(s)){a(`error`,`File "${o}" is outside of the workspace`,{node:r,property:`value`});return}let l=t.read(s);if(t.hasError(l)){a(`error`,l.content.error,{node:r,property:`value`});return}if(l.content.md.trimEnd()===``){a(`error`,`File "${o}" is empty`,{node:r,property:`value`});return}let p=r.$container;(hasInlineDescription(p)||hasInlineDescription(p.$container)||p.props.some(e=>isStringProperty(e)&&e.key===`description`))&&a(`error`,`Only one of "description" and "descriptionFile" is allowed`,{node:r,property:`key`})})},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let a=t.forDocument(A(e)),o=safeCall(()=>a._resolveRelationSource(e));if(!o){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let s=safeCall(()=>a.parseFqnRef(e.target));s?(U.isImportRef(o)&&(U.isImportRef(s)?r(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):r(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),mi(U.flatten(o),U.flatten(s))&&r(`error`,`Invalid parent-child relationship`,{node:e})):r(`error`,`Target not resolved`,{node:e,property:`target`})})},checkRelationBody=e=>tryOrLog((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),extendRelationChecks=e=>{let t=e.likec4.ModelParser,r=new se(e.shared,E.Linked);function getProjectFingerprints(t){return r.get(t,()=>new Set(I(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),zt(e=>e.c4Relations??[]),V(e=>relationFingerprint(e)))))}return tryOrLog((e,r)=>{let a=A(e),o=t.forDocument(a),s=safeCall(()=>o.parseFqnRef(e.source));if(!s){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let l=safeCall(()=>o.parseFqnRef(e.target));if(!l){r(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!U.isModelRef(s)&&!U.isImportRef(s)){r(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!U.isModelRef(l)&&!U.isImportRef(l)){r(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let p=projectIdFrom(a),g=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:_=``}=o.parseBaseProps({},{title:e.title}),v=relationFingerprint({source:s,target:l,kind:g,title:_,isBidirectional:e.isBidirectional||void 0});getProjectFingerprints(p).has(v)||r(`warning`,`This extend does not match any relation (by source, kind, target, title, and directionality)`,{node:e})})},checkSpecificationRule=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),checkModel=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),checkGlobals=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),checkElementKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{yu.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=projectIdFrom(e),o=t.projectElements(a,rs.$type).filter(t=>t.name===e.name&&t.node!==e).head();if(o){let t=o.documentUri!==A(e).uri;r(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:o.nameSegment.range,uri:o.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{yu.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=projectIdFrom(e),o=t.projectElements(a,jo.$type).filter(t=>t.name===e.name&&t.node!==e).head();if(o){let t=o.documentUri!==A(e).uri;r(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:o.nameSegment.range,uri:o.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let a=e.name,o=projectIdFrom(e),s=t.projectElements(o,il.$type).filter(t=>t.name===a&&t.node!==e).head();if(s){let t=s.documentUri!==A(e).uri;r(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{yu.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=projectIdFrom(e);t.projectElements(a,jc.$type).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let a=projectIdFrom(e),o=t.projectElements(a,Fs.$type),s=t.projectElements(a,Ps.$type);o.concat(s).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let a=projectIdFrom(e);t.projectElements(a,zs.$type).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{if(!e.name)return;yu.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=projectIdFrom(e);t.projectElements(a,Qs.$type).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})},viewOrderChecks=e=>tryOrLog((e,t)=>{(!Number.isSafeInteger(e.value)||e.value<0)&&t(`error`,`View order must be a non-negative safe integer`,{node:e,property:`value`})}),viewRuleAutoLayoutChecks=e=>tryOrLog((e,t)=>{e.routing&&(ut(e,isLikeC4View)?.body?.props??[]).some(isViewRoutingProperty)&&t(`warning`,`The view "routing" property overrides this autoLayout routing value.`,{node:e,property:`routing`})});function collectFqnExprs(e){let t=[],r=e;for(;r;)r.value&&t.push(r.value),r=r.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let r=collectFqnExprs(e.targets);r.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let a=r.filter(isFqnRefExpr),o=a[0]?.ref?.parent;for(let r=1;r<a.length;r++){let s=a[r];e.value===`same`&&!areSame(o,s?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function areSame(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:areSame(e.parent,t.parent)}const checkFqnExprWith=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let a=getViewRulePredicateContainer(e);if(a?.$type!==`DynamicViewIncludePredicate`&&a?.isInclude!==!0){r(`error`,`Invalid usage inside "exclude"`,{node:e});return}let o=a.$type===`DynamicViewIncludePredicate`,s=t.forDocument(A(a)),l=kr.unwrap(s.parseFqnExprWith(e).custom.expr);switch(!0){case kr.isWildcard(l)&&o:case kr.isElementKindExpr(l)&&o:case kr.isElementTagExpr(l)&&o:r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case kr.isWildcard(l):case kr.isModelRef(l):case kr.isDeploymentRef(l):return;case kr.isElementKindExpr(l):case kr.isElementTagExpr(l):r(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:Vi(l)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let a=t.forDocument(A(e)).parseFqnRefExpr(e),o=getViewRulePredicateContainer(e),s=isFqnRefInsideDeployment(e)&&!ie(e,e=>isDeploymentViewRuleStyle(e)||isViewRuleStyle(e));if(o?.$type===`DeploymentViewRulePredicate`||s){if(!ie(e,isRelationExpr)){if(kr.isModelRef(a)){r(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(kr.isDeploymentRef(a)&&H.isInsideInstanceRef(a.ref)){r(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}P(e.selector)&&!isDeploymentNode$1(e.ref.value?.ref)&&r(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`})}else if(o?.$type===`DynamicViewIncludePredicate`)switch(!0){case kr.isElementKindExpr(a):case kr.isElementTagExpr(a):case kr.isWildcard(a):r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{if(e.to.$type===`WildcardExpression`&&!isInOutRelationExpr(e.$container)){let r=ut(e,isElementView$1);L(r?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(getViewRulePredicateContainer(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let r=ut(e,isElementView$1);r&&L(r.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let a=ut(e,isDeploymentViewRulePredicate);if(!a||a.isInclude!==!0)return;let o=A(e),s=t.forDocument(o),l=qr.unwrap(s.parseRelationExpr(e)),p=`Model reference is allowed in exclude predicate only`;if(qr.isDirect(l)){(Ur.isModelRef(l.source)||Ur.isModelRef(l.target))&&r(`error`,p,{node:e});return}let g;g=qr.isIncoming(l)?l.incoming:qr.isOutgoing(l)?l.outgoing:l.inout,Ur.isModelRef(g)&&r(`error`,p,{node:e})})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let r=getViewRulePredicateContainer(e);r&&r.$type!=`DynamicViewIncludePredicate`&&(r.isInclude||t(`error`,`Invalid usage inside "exclude"`,{node:e}))});var LikeC4DocumentValidator=class extends ue{services;constructor(e){super(e),this.services=e}toDiagnostic(e,t,r){let a=super.toDiagnostic(e,t,r);return r.node&&Object.defineProperty(a,"node",{value:r.node,enumerable:!1,writable:!1,configurable:!0}),a}async validateDocument(e,t,r){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,r)}};st();const wu=Fr(isImportsFromPoject,isImported,isGlobals,isGlobalPredicateGroup,isGlobalDynamicPredicateGroup,isGlobalStyle,isGlobalStyleGroup,isFqnExprWith,isRelationExprWith,isFqnExpr,isRelationExpr,isStepStatement,isDeploymentViewRule,isDeploymentViewRulePredicate,isExpressionV2,isRelationExpr,isFqnRefExpr,isViewProperty,isStyleProperty,isTags,isViewRule,isDynamicViewRule,isLikeC4View,isViewRuleStyleOrGlobalRef,isDeployedInstance,isDeploymentNode$1,isDeploymentRelation,isRelationshipStyleProperty,isDynamicViewDisplayVariantProperty,isMetadataBody,isMetadataProperty,isRelation,isRelationBody,isElementProperty,isStringProperty,isNavigateToProperty,isElement,isElementBody,isElementStyleProperty,isElementRef,isExtendElement,isExtendElementBody,isExtendDeployment,isExtendDeploymentBody,isExtendRelation,isExtendRelationBody,isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind,isSpecificationTag,isSpecificationColor,isSpecificationRule,isExpressions,isColorLiteral,isModelDiff,isDiffStringProperty,isDiffRemoveEntry),findInvalidContainer=e=>{let t=e;for(;t&&!isLikeC4Grammar(t);){if(wu(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=E.Validated?e.diagnostics?.filter(e=>e.severity===at.Error)??[]:[],r=/* @__PURE__ */ new WeakSet;for(let{node:e}of t)if(!(L(e)||r.has(e))&&(r.add(e),!wu(e))){let t=findInvalidContainer(e);t&&r.add(t)}return{isValid:e=>!!e&&!r.has(e),isInvalid:e=>r.has(e),invalidNodes:r}}function registerValidationChecks(e){Y.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(e),DeploymentNodeKind:checkDeploymentNodeKind(e),DeploymentNode:deploymentNodeChecks(e),DeploymentRelation:deploymentRelationChecks(e),ExtendDeployment:extendDeploymentChecks(e),ExtendRelation:extendRelationChecks(e),FqnRefExpr:checkFqnRefExpr(e),RelationExpr:checkRelationExpr(e),OpacityProperty:opacityPropertyRuleChecks(e),IconProperty:iconPropertyRuleChecks(e),DescriptionFileProperty:descriptionFileRuleChecks(e),SpecificationRule:checkSpecificationRule(e),Model:checkModel(e),Globals:checkGlobals(e),GlobalPredicateGroup:checkGlobalPredicate(e),GlobalDynamicPredicateGroup:checkGlobalPredicate(e),GlobalStyleId:checkGlobalStyleId(e),Step:stepSingle(e),StepSeries:stepSeries(e),SubflowStep:subflowStep(e),LikeC4View:viewChecks(e),Element:checkElement(e),ElementRef:checkElementRef(e),ElementKind:checkElementKind(e),Relation:relationChecks(e),RelationBody:checkRelationBody(e),Tag:checkTag(e),FqnExprWith:checkFqnExprWith(e),RelationExprWith:checkRelationExprWith(e),RelationshipKind:checkRelationshipKind(e),IncomingRelationExpr:checkIncomingRelationExpr(e),OutgoingRelationExpr:checkOutgoingRelationExpr(e),ImportsFromPoject:checkImportsFromPoject(e),ColorLiteral:colorLiteralRuleChecks(e),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(e),ViewRuleRank:viewRuleRankChecks(e),ViewOrderProperty:viewOrderChecks(e),ModelDiff:modelDiffChecks(e),DiffRemoveEntry:diffRemoveEntryChecks(e),ViewRuleAutoLayout:viewRuleAutoLayoutChecks(e),MarkdownOrString:markdownRefsChecks(e)});let t=e.shared.lsp.Connection;t&&Ui(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,r)=>{for(let e of r)Y.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>Y.error(loggable(e)))})})}const Tu=Y.getChild(`parser`),Eu={b:`\b`,f:`\f`,n:`
60
+ `,r:`\r`,t:` `,v:`\v`,0:`\0`};function unescapeKeepingSlash(e){let t=``;for(let r=1;r<e.length-1;r++){let a=e[r];if(a===`\\`){let a=e[++r]??``;t+=a===`/`?`\\/`:Eu[a]??a}else t+=a}return t}function parseTitleKeepingEscapedSlash(e){if(!e||!Ft(e.text))return;let t=e.$cstNode?.text;return t?unescapeKeepingSlash(t):e.text}function parseInlineTitleKeepingEscapedSlash(e,t,r=0){let a=Le(e?.$cstNode,t,r)?.text;return a?unescapeKeepingSlash(a):void 0}function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return Ft(t)?t.split(`
61
+ `).join(` `):`md`in t?{md:t.md.split(`
62
+ `).join(` `)}:{txt:t.txt.split(`
63
+ `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case Ft(e):return Pn(e).trim();case isMarkdownOrString(e)&&Ft(e.markdown):return{md:Pn(e.markdown).trim()};case isMarkdownOrString(e)&&Ft(e.text):return{txt:Pn(e.text).trim()};case isMarkdownOrString(e):return{txt:``};default:return}}function parseViewOrder(e){if(e&&!/^\s*order\b\s*-/.test(e.$cstNode?.text??``))return Number.isSafeInteger(e.value)&&e.value>=0?e.value:void 0}function parseViewRouting(e,t){return e.find(isViewRoutingProperty)?.value??Zt(t,isViewRuleAutoLayout)?.routing}var BaseParser=class{services;doc;project;isValid;isInvalid;docUri;docPathInProject;hash;validationHash;constructor(e,t,r){this.services=e,this.doc=t,this.project=r,this.validationHash=calcValidationHash(t),this.hash=``;let a=checksFromDiagnostics(t);this.isValid=a.isValid,this.isInvalid=a.isInvalid,this.docUri=t.uri.toString(),this.docPathInProject=D.relative(r.folderUri,t.uri)}dispose(){try{delete this.doc.likec4Parser,this.services=void 0,this.doc=void 0,this.project=void 0,this.isValid=void 0,this.isInvalid=void 0}catch(e){console.error(`Error disposing parser`,e)}}logError(e,t,r){let a=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(de(t)){let e=ye(t)?t.name:void 0;e=e?`"${e}" (${t.$type})`:`${t.$type}`;let r=t.$cstNode,o=r?`:${r.range.start.line+1}:${r.range.start.character+1}`:``;a+=`\n\tat ${e} (${this.doc.uri.fsPath}${o})`}else t&&`$refText`in t&&(a+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);r&&r!==`base`?Tu.getChild(r).debug(a):Tu.debug(a)}tryParse(e,t,r){try{return!t||!this.isValid(t)?void 0:r(t)}catch(r){this.logError(r,t,e);return}}tryMap(e,t,r){let a=0;return zt(t,t=>{try{if(!t||!this.isValid(t))return[];let e=r(t,a);return e===void 0?[]:(a++,e)}catch(r){return this.logError(r,t,e),[]}})}resolveFqn(e){if(isImported(e)){let t=projectIdFrom(e),r=this.resolveFqn(_i(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,r),Wr(t,r)}return isExtendElement(e)?readStrictFqn(e.element):isExtendDeployment(e)?readStrictFqn(e.deploymentNode):isDeploymentElement(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||N(e.props))return;let extractValues=e=>{if(isMarkdownOrString(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return P(t)?[t]:[];{let e=t.md||t.txt;return P(e)?[e]:[]}}return isMetadataArray(e)?e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(P):[]},t=I(e.props,zt(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),M(([e,t])=>P(t)));if(N(t))return;let r=I(t,Yt(([e])=>e),wn(e=>e.map(([e,t])=>t))),a={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(a[e]=t.length===1?t[0]:t);return N(a)?void 0:a}descriptionFileProp(e){if(e)return e.filter(isDescriptionFileProperty).at(-1)}parseDescriptionFile(e){if(!e)return{};let t;if(t=isDescriptionFileProperty(e)?e:this.descriptionFileProp(e.props),!t||!t.value)return{};let r={value:t.value,uri:resolveDescriptionFile(t,this.doc)?.toString()??null};return r.uri&&this.doc.c4DescriptionFiles.add(r.uri),this.isValid(t)?{descriptionFile:r}:{}}parseMarkdownOrString(e){if(isMarkdownOrString(e))return removeIndent(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let r=[];for(;t;)r.push(...this.tryMap(`base`,t.values,e=>_i(e.tag.ref,`Tag reference is not resolved`).name).filter(P)),t=t.prev;return fi(r)?_n(r):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,M(e.props,isLinkProperty),e=>{let t=e.value;if(It(t))return;let r=P(e.title)?toSingleLine(e.title):void 0,a=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return ri({url:t,title:r,relative:a&&a!==t?a:void 0})});return fi(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:r}=e;switch(!0){case!!t:{let r=t.$refText;if(!isBundledIcon(r)){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return r}case r&&r===`none`:return r;case r&&xt(r):if(r.startsWith(`file:`)){this.logError(`Icon property '${r}' used the 'file' protocol which is not supported`,e);return}return r;case r&&r.startsWith(`@`):return this.parseImageAlias(r);case r&&_t(r):return mt(this.doc.uri.toString(),`../`,r);case r&&yt(r):return bt(this.project.folderUri.toString(),r);default:this.logError(`Icon property '${r}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),r=t>0?e.substring(0,t):e,a=t>0?e.substring(t+1):``,o={"@":`./images`,...this.project.config.imageAliases}[r];if(!o){Tu.warn(`Image alias "${r}" not found in project configuration`);return}let s=a?bt(o,a):o;return bt(this.project.folderUri.toString(),s)}parseColorLiteral(e){if(this.isValid(e)){if(isHexColor(e))return`#${e.hex}`;if(isRGBAColor(e)){let t=jt(e.alpha)?e.alpha:void 0;return Ft(e.alpha)&&(t=parseAstPercent(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}G(e)}}parseElementStyle(e){if(!e)return{};if(Tn(e)){let t=this.parseStyleProps(e.find(isElementStyleProperty)?.props);try{let r=this.parseIconProperty(e.find(isIconProperty));r&&(t.icon=r)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let r of e)if(this.isValid(r))try{switch(!0){case isBorderProperty(r):P(r.value)&&(t.border=r.value);break;case isColorProperty(r):{let e=toColor(r);P(e)&&(t.color=e);break}case isShapeProperty(r):P(r.value)&&(t.shape=r.value);break;case isIconProperty(r):{let e=this.parseIconProperty(r);P(e)&&(t.icon=e);break}case isIconColorProperty(r):{let e=toColor(r);P(e)&&(t.iconColor=e);break}case isIconSizeProperty(r):P(r.value)&&(t.iconSize=parseAstSizeValue(r));break;case isIconPositionProperty(r):P(r.value)&&(t.iconPosition=parseAstIconPositionValue(r));break;case isOpacityProperty(r):t.opacity=parseAstOpacityProperty(r);break;case isMultipleProperty(r):t.multiple=Kt(r.value)?r.value:!1;break;case isShapeSizeProperty(r):P(r.value)&&(t.size=parseAstSizeValue(r));break;case isPaddingSizeProperty(r):P(r.value)&&(t.padding=parseAstSizeValue(r));break;case isTextSizeProperty(r):P(r.value)&&(t.textSize=parseAstSizeValue(r));break;case isSizingProperty(r):P(r.value)&&(t.sizing=parseAstSizingValue(r));break;default:G(r)}}catch(e){this.logError(e,r)}return ri(t)}parseBaseProps(e,t){let r=removeIndent(t?.title??parseMarkdownAsString(e.title)),a=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description),o=t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),s=toSingleLine(t?.technology)??removeIndent(parseMarkdownAsString(e.technology));return ri({title:r,summary:o,description:a,technology:s})}};st();function isCompletionForPojectName(e,t){return _e(t.feature)&&t.property===`project`&&isImportsFromPoject(e.node)}const Du=[`[`,`:`],Ou=/(?<!\\\\)\[\[([\w.:-]*)$/,ku=/^[^\s[\]|\\]*/,Au=/^(?:\]\]|\\*\|)/,ju=`view:`,Mu=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
59
64
  title 'Untitled'
60
65
 
61
66
  include \${0:*}
62
- }`;var LikeC4CompletionProvider=class extends Ee{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,r){switch(!0){case He(t.feature):return this.completionForKeyword(e,t.feature,r);case Je(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,r);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,r)}}completionForKeyword(e,t,r){if(!this.filterKeyword(e,t))return;let acceptReplacing=(o,s)=>{let c=this.buildCompletionTextEdit(e,t.value,s);c&&r(e,{label:t.value,insertTextFormat:_e.Snippet,...o,textEdit:c})},acceptProperty=e=>{acceptReplacing({detail:`Insert ${t.value} property`,kind:w.Property},`${t.value} ${e}`)},acceptSnippet=({insertText:e,...r})=>{acceptReplacing({detail:`Insert ${t.value}`,kind:w.Snippet,...r},`${t.value} ${e}`)},acceptPropertyAndSuggest=e=>{acceptProperty(`\${1|${e.join(`,`)}|}$0`)};switch(!0){case t.value===`import`:acceptSnippet({insertText:`{ $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&De(e.node,isModelViews):acceptSnippet({detail:`Insert deployment view`,kind:w.Class,insertText:`view ${If}`});break;case t.value===`dynamic`&&De(e.node,isModelViews):acceptSnippet({detail:`Insert dynamic view`,kind:w.Class,insertText:["view view_${CURRENT_MINUTE}_${CURRENT_SECOND} {",` title 'Untitled'`,` `,` $0`,`}`].join(`
63
- `)});break;case t.value===`view`&&De(e.node,isModelViews):acceptSnippet({detail:`Insert element view`,kind:w.Class,insertText:If});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(or);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(fr);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(dr);break;case t.value===`border`:acceptPropertyAndSuggest(ar);break;case t.value===`autoLayout`:acceptPropertyAndSuggest([`TopBottom`,`BottomTop`,`LeftRight`,`RightLeft`]);break;case[`title`,`description`,`technology`,`summary`,`notes`,`notation`].includes(t.value):acceptProperty(`'$0'`);break;case t.value===`metadata`:acceptProperty(`{
67
+ }`;var LikeC4CompletionProvider=class extends Ke{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`,...Du],allCommitCharacters:[` `,` `,`
68
+ `]};async getCompletion(e,t,r){let a=this.findMarkdownRefContext(e,t);return a===void 0?t.context?.triggerKind===q.CompletionTriggerKind.TriggerCharacter&&Du.includes(t.context.triggerCharacter??``)?S.create([],!1):super.getCompletion(e,t,r):a===null?S.create([],!1):this.completionForMarkdownRef(projectIdFrom(e),a)}findMarkdownRefContext(e,t){let r=e.parseResult.value.$cstNode;if(!r)return;let a=e.textDocument,o=a.offsetAt(t.position),s=ft(r,o);if(!s||s.tokenType.name!==`MarkdownString`)return;let l=s.text,p=o-s.offset;if(p<3||p>l.length-3)return;let g=l.slice(3,p),_=g.lastIndexOf(`
69
+ `)+1,v=g.slice(_),b=Ou.exec(v);if(!b||isInsideCode(g.slice(0,_),v.slice(0,b.index)))return null;let x=l.slice(p,l.length-3),S=ku.exec(x)?.[0]??``,C=!Au.test(x.slice(S.length)),w=a.positionAt(o+S.length),T=b[1]??``,ee=o-T.length,te={start:a.positionAt(ee),end:t.position};switch(!0){case T.startsWith(ju):return{kind:`view`,typed:T.slice(5),range:{start:a.positionAt(ee+5),end:t.position},refRange:te,replaceEnd:w,needsClosing:C};case T.includes(`:`):return null;default:return{kind:`element`,typed:T,range:te,refRange:te,replaceEnd:w,needsClosing:C}}}completionForMarkdownRef(e,t){let r=t.needsClosing?`]]`:``,a=t.typed.toLowerCase(),o=[],s=/* @__PURE__ */ new Set,l=0,accept=(e,p,g)=>{if(s.has(p))return;s.add(p);let _=p.toLowerCase().indexOf(a);if(_<0)return;let v=_===0?0:p[_-1]===`.`?1:2;o.push({label:p,kind:this.nodeKindProvider.getCompletionItemKind(e),...g&&{detail:g},filterText:p.slice(_),sortText:`${v}_${String(l++).padStart(6,`0`)}`,textEdit:insertReplaceEdit(p+r,t.range,t.replaceEnd),commitCharacters:[]})};if(t.kind===`view`){let t=this.services.shared.workspace.IndexManager.projectElements(e,Qs.$type);for(let e of t)accept(e,e.name,viewDetail(e));return S.create(o,!0)}for(let t of this.services.likec4.FqnIndex.elements(e))accept(t,t.id,elementDetail(t));return ju.startsWith(a)&&o.push({label:ju,kind:k.Keyword,detail:`Link to a view`,filterText:ju,sortText:`9_`,textEdit:insertReplaceEdit(ju,t.refRange,t.replaceEnd),commitCharacters:[],command:{title:`Suggest views`,command:`editor.action.triggerSuggest`}}),S.create(o,!0)}completionFor(e,t,r){switch(!0){case dt(t.feature):return this.completionForKeyword(e,t.feature,r);case Oe(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,r);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,r)}}completionForKeyword(e,t,r){if(!this.filterKeyword(e,t))return;let acceptReplacing=(a,o)=>{let s=this.buildCompletionTextEdit(e,t.value,o);s&&r(e,{label:t.value,insertTextFormat:tt.Snippet,...a,textEdit:s})},acceptProperty=e=>{acceptReplacing({detail:`Insert ${t.value} property`,kind:k.Property},`${t.value} ${e}`)},acceptSnippet=({insertText:e,...r})=>{acceptReplacing({detail:`Insert ${t.value}`,kind:k.Snippet,...r},`${t.value} ${e}`)},acceptPropertyAndSuggest=e=>{acceptProperty(`\${1|${e.join(`,`)}|}$0`)};switch(!0){case t.value===`import`:acceptSnippet({insertText:`{ $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&ie(e.node,isModelViews):acceptSnippet({detail:`Insert deployment view`,kind:k.Class,insertText:`view ${Mu}`});break;case t.value===`dynamic`&&ie(e.node,isModelViews):acceptSnippet({detail:`Insert dynamic view`,kind:k.Class,insertText:`view ${Mu}`});break;case t.value===`view`&&ie(e.node,isModelViews):acceptSnippet({detail:`Insert element view`,kind:k.Class,insertText:Mu});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(yr);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(Cr);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(xr);break;case t.value===`sizing`:acceptPropertyAndSuggest(Sr);break;case t.value===`border`:acceptPropertyAndSuggest(gr);break;case t.value===`autoLayout`:acceptPropertyAndSuggest([`TopBottom`,`BottomTop`,`LeftRight`,`RightLeft`]);break;case[`title`,`description`,`technology`,`summary`,`notes`,`notation`].includes(t.value):acceptProperty(`'$0'`);break;case t.value===`metadata`:acceptProperty(`{
70
+ $0
71
+ }`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:k.Module,insertText:`{
64
72
  $0
65
- }`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:w.Module,insertText:`{
73
+ }`});break;case t.value===`group`:acceptSnippet({kind:k.Module,insertText:`'\${1:Title}' {
66
74
  $0
67
- }`});break;case t.value===`group`:acceptSnippet({kind:w.Module,insertText:`'\${1:Title}' {
75
+ }`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:k.Module,insertText:`{
68
76
  $0
69
- }`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:w.Module,insertText:`{
77
+ }`});break;case t.value===`try`&&ie(e.node,isDynamicViewBody):acceptSnippet({detail:`Insert try-catch flow`,kind:k.Module,insertText:`'critical-path' {
70
78
  $0
71
- }`});break;case t.value===`style`&&e.node&&De(e.node,isGlobalStyle):acceptSnippet({kind:w.Module,insertText:`\${1:name} \${2:*} {
79
+ } catch 'handling' {
80
+ } finally 'cleanup' {
81
+ }`});break;case t.value===`alt`&&ie(e.node,isDynamicViewBody):acceptSnippet({detail:`Insert alternative flow`,kind:k.Module,insertText:`{
82
+ when 'condition' {
83
+ $0
84
+ }
85
+ }`});break;case t.value===`style`&&e.node&&ie(e.node,isGlobalStyle):acceptSnippet({kind:k.Module,insertText:`\${1:name} \${2:*} {
72
86
  $0
73
- }`});break;case t.value===`style`&&e.node&&De(e.node,pn([isModelViews,isGlobalStyleGroup])):acceptSnippet({kind:w.Module,insertText:`\${1:*} {
87
+ }`});break;case t.value===`style`&&e.node&&ie(e.node,hn([isModelViews,isGlobalStyleGroup])):acceptSnippet({kind:k.Module,insertText:`\${1:*} {
74
88
  $0
75
- }`});break;case t.value===`style`:acceptSnippet({kind:w.Module,insertText:`{
89
+ }`});break;case t.value===`style`:acceptSnippet({kind:k.Module,insertText:`{
76
90
  $0
77
- }`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:w.Class,insertText:`$1 {
91
+ }`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:k.Class,insertText:`$1 {
78
92
  $0
79
- }`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):acceptReplacing({kind:w.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:_e.PlainText},`${t.value} `);break;default:r(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let r=this.services.shared.workspace.ProjectsManager,o=e.document.textDocument,s={start:o.positionAt(e.tokenOffset),end:o.positionAt(e.tokenEndOffset)},c=o.getText(s),u=N(c)?`'`:c.substring(0,1);for(let o of r.all){let r=u+o+u;t(e,{label:o,kind:w.Folder,insertText:r,filterText:r,textEdit:We.replace(s,r),detail:`Project`,sortText:`0_`+o})}}},LikeC4DocumentHighlightProvider=class extends tt{createDocumentHighlight(e){return Pf.DocumentHighlight.create(e.segment.range,Pf.DocumentHighlightKind.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,r){return!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:Ae(e.parseResult.value).filter(isLinkProperty).map(t=>{try{let r=Se(t.$cstNode,`value`)?.range,o=r&&this.resolveLink(e,t.value);if(o&&_t(o))return{range:r,target:o}}catch(e){logWarnError(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(_t(t)||ht(t))return t;if(pt(t))return ut(e.uri.toString(),`../`,t);let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return ut(r.toString(),t)}relativeLink(e,t){if(ht(t))return dt(t);if(pt(t)){let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),o=new URL(e.uri.toString()),s=new URL(t,o).toString();return dt(yt(s,r))}return null}};Ze();const Lf=Y.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{services;nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,r){if(!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<x.Linked&&(Lf.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(x.Linked,e.uri,r),Lf.debug(`document is Linked`));let{parseResult:{value:{specifications:o,models:s,deployments:c,views:u,likec4lib:d}}}=e;return[...d.map(e=>()=>this.getLikec4LibSymbol(e)),...o.map(e=>()=>this.getSpecSymbol(e)),...s.map(e=>()=>this.getModelSymbol(e)),...c.map(e=>()=>this.getDeploymentModelSymbol(e)),...u.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return logWarnError(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.icons.map(e=>this.getLibIconSymbol(e)).filter(z);return r.length===0?[]:[{kind:et.Namespace,name:`icons`,range:t.range,selectionRange:Ie(t,`icons`)?.range??t.range,children:r}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=Se(t,`name`);if(!r)return[];let o=R([...e.elements,...e.tags,...e.relationships],F(e=>{try{if(isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e))return this.getKindSymbol(e);if(isSpecificationTag(e))return this.getTagSymbol(e)}catch(e){return logWarnError(e),null}W(e)}),P(z));return o.length===0?[]:[{kind:et.Namespace,name:e.name,range:t.range,selectionRange:r.range,children:o}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Se(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>isExtendRelation(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Se(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e,t){try{if(isExtendElement(e))return this.getExtendElementSymbol(e);if(isElement(e))return this.getElementSymbol(e)}catch(e){logWarnError(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,r=e.element.$cstNode,o=e.body;return!t||!r?[]:[{kind:this.symbolKind(e),name:readStrictFqn(e.element),range:t.range,selectionRange:r.range,children:o.elements.flatMap(t=>this.getElementsSymbol(t,readStrictFqn(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,r=Se(t,`name`);if(!r||!t)return[];let o=e.name,s=`(${e.kind.$refText})`;return[{kind:this.symbolKind(e),name:o,range:t.range,selectionRange:r.range,detail:s,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,r=Se(t,`name`);return!r||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||N(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||N(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||N(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.name?Se(t,`name`):null;return r?[{kind:this.symbolKind(e),name:r.text,range:t.range,selectionRange:r.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(isDeploymentNode$1(e))return this.getDeploymentNodeSymbol(e);if(isDeployedInstance(e))return this.getDeployedInstanceSymbol(e);if(isExtendDeployment(e))return[]}catch(e){logWarnError(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let o=this.nameProvider.getNameStrict(e),s=`(${e.kind.$refText})`;return[{kind:this.symbolKind(e),name:o,range:t.range,selectionRange:r.range,detail:s,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let o=nt(e),s=this.parser.forDocument(o).parseDeployedInstance(e),c=this.nameProvider.getNameStrict(e),u=`instance of `+s.element.model;return[{kind:this.symbolKind(e),name:c,range:t.range,selectionRange:r.range,detail:u,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Rf=`
93
+ }`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):acceptReplacing({kind:k.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:tt.PlainText},`${t.value} `);break;default:r(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let r=this.services.shared.workspace.ProjectsManager,a=e.document.textDocument,o={start:a.positionAt(e.tokenOffset),end:a.positionAt(e.tokenEndOffset)},s=a.getText(o),l=N(s)?`'`:s.substring(0,1);for(let a of r.all){let r=l+a+l;t(e,{label:a,kind:k.Folder,insertText:r,filterText:r,textEdit:Ge.replace(o,r),detail:`Project`,sortText:`0_`+a})}}};function isInsideCode(e,t){return e.split(`
94
+ `).filter(e=>/^\s*(```|~~~)/.test(e)).length%2==1||(t.match(/(?<!\\)`/g)?.length??0)%2==1}function readTitle(e){if(e===void 0)return;let t=toSingleLine(e);return typeof t==`string`?t||void 0:(`md`in t?t.md:t.txt)||void 0}function insertReplaceEdit(e,t,r){return Ye.create(e,t,{start:t.start,end:r})}function elementDetail(e){let t=e.node;if(!isElement(t))return;let r=t.kind.$refText,a=t.body?.props.find(e=>isElementStringProperty(e)&&e.key===`title`),o=isElementStringProperty(a)?readTitle(a.value):readTitle(t.props[0]);return o?`${o} (${r})`:r}function viewDetail(e){let t=e.node;if(!isLikeC4View(t))return;let r=t.body?.props.find(e=>isViewStringProperty(e)&&e.key===`title`),a=isViewStringProperty(r)?readTitle(r.value):void 0,o;switch(!0){case isDynamicView$1(t):o=`dynamic view`;break;case isDeploymentView$1(t):o=`deployment view`;break;default:o=`view`}return a?`${a} (${o})`:o}var LikeC4DefinitionProvider=class extends Qe{services;langiumDocuments;astNodeLocator;constructor(e){super(e),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator}getDefinition(e,t,r){let a=this.findMarkdownRef(e,t);if(a){let t=this.markdownRefLinks(e,a);return t.length>0?t:void 0}return super.getDefinition(e,t,r)}findMarkdownRef(e,t){let r=e.parseResult.value.$cstNode;if(!r)return;let a=e.textDocument.offsetAt(t.position),o=ft(r,a);if(o&&o.tokenType.name===`MarkdownString`&&isMarkdownOrString(o.astNode))return markdownRefsOf(o.astNode,e).find(e=>e.offset.start<=a&&a<=e.offset.end)}markdownRefLinks(e,{ref:t,targetRange:r}){let a=projectIdFrom(e),o;switch(t.kind){case`element`:o=this.services.likec4.FqnIndex.byFqn(a,Or(t.target)).toArray();break;case`view`:o=this.services.shared.workspace.IndexManager.projectElements(a,Qs.$type).filter(e=>e.name===t.target).toArray();break;case`unknown`:o=[]}return o.flatMap(e=>{let t=e.nameSegment?.range;if(!t)return[];let a=this.langiumDocuments.getDocument(e.documentUri),o=(e.node??(a?this.astNodeLocator.getAstNode(a.parseResult.value,e.path):void 0))?.$cstNode?.range??t;return _u.LocationLink.create(e.documentUri.toString(),o,t,r)})}},LikeC4DocumentHighlightProvider=class extends Ne{createDocumentHighlight(e){return _u.DocumentHighlight.create(e.segment.range,_u.DocumentHighlightKind.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,r=_u.CancellationToken.None){if(!isLikeC4UserDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return Promise.resolve([]);let a=[];for(let t of ne(e.parseResult.value).filter(Fi(isLinkProperty,isDescriptionFileProperty)))try{let r=Le(t.$cstNode,`value`)?.range;if(!r)continue;let o=isDescriptionFileProperty(t)?resolveDescriptionFile(t,e)?.toString():this.resolveLink(e,t.value);o&&xt(o)&&a.push({range:r,target:o})}catch(e){logWarnError(e)}return await Ce(r),a}resolveLink(e,t){if(xt(t)||yt(t))return t;if(_t(t))return mt(D.dirname(e.uri).toString(),t);let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString();return mt(r,t)}relativeLink(e,t){if(yt(t))return ht(t);if(_t(t)){let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),a=new URL(e.uri.toString()),o=new URL(t,a).toString();return ht(Ct(o,r))}return null}};st();var LikeC4DocumentSymbolProvider=class{services;nodeKindProvider;nameProvider;parser;locator;logger=Y.getChild(`DocumentSymbolProvider`);constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,r=_u.CancellationToken.None){if(!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];let{parseResult:{value:{specifications:a,models:o,deployments:s,views:l,likec4lib:p}}}=e,g=[],_=[...p.map(e=>()=>this.getLikec4LibSymbol(e)),...a.map(e=>()=>this.getSpecSymbol(e)),...o.map(e=>()=>this.getModelSymbol(e)),...s.map(e=>()=>this.getDeploymentModelSymbol(e)),...l.map(e=>()=>this.getModelViewsSymbol(e))];for(let e of _){await Ce(r);try{let t=e();t&&g.push(...t)}catch(e){this.logger.warn(loggable(e))}}return g}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.icons.map(e=>this.getLibIconSymbol(e)).filter(P);return r.length===0?[]:[{kind:ke.Namespace,name:`icons`,range:t.range,selectionRange:qe(t,`icons`)?.range??t.range,children:r}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=Le(t,`name`);if(!r)return[];let a=I([...e.elements,...e.deploymentNodes,...e.tags,...e.relationships],V(e=>{try{if(isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e))return this.getKindSymbol(e);if(isSpecificationTag(e))return this.getTagSymbol(e)}catch(e){return this.logger.warn(loggable(e)),null}G(e)}),M(P));return a.length===0?[]:[{kind:ke.Namespace,name:e.name,range:t.range,selectionRange:r.range,children:a}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Le(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>isExtendRelation(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Le(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e,t){try{if(isExtendElement(e))return this.getExtendElementSymbol(e);if(isElement(e))return this.getElementSymbol(e)}catch(e){this.logger.getChild(`getElementsSymbol`).warn(loggable(e))}return[]}getExtendElementSymbol(e){let t=e.$cstNode,r=e.element.$cstNode,a=e.body;return!t||!r?[]:[{kind:this.symbolKind(e),name:readStrictFqn(e.element),range:t.range,selectionRange:r.range,children:a.elements.flatMap(t=>this.getElementsSymbol(t,readStrictFqn(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,r=Le(t,`name`);if(!r||!t)return[];let a=e.name,o=`(${e.kind.$refText})`;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:r.range,detail:o,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,r=Le(t,`name`);return!r||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||N(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||N(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||N(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.name?Le(t,`name`):null;return r?[{kind:this.symbolKind(e),name:r.text,range:t.range,selectionRange:r.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(isDeploymentNode$1(e))return this.getDeploymentNodeSymbol(e);if(isDeployedInstance(e))return this.getDeployedInstanceSymbol(e);if(isExtendDeployment(e))return[]}catch(e){this.logger.getChild(`getDeploymentElementSymbol`).warn(loggable(e))}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let a=this.nameProvider.getNameStrict(e),o=`(${e.kind.$refText})`;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:r.range,detail:o,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let a=A(e),o=this.parser.forDocument(a).parseDeployedInstance(e),s=this.nameProvider.getNameStrict(e),l=`instance of `+o.element.model;return[{kind:this.symbolKind(e),name:s,range:t.range,selectionRange:r.range,detail:l,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Nu=`
80
95
  ---
81
- `;var LikeC4HoverProvider=class extends ze{services;parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(isTag(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(isElementKind(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(isDeploymentNodeKind(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(isRelationshipKind(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(isElement(e))return this.getElementHover(e);if(isDeploymentNode$1(e))return this.getDeploymentNodeHover(e);if(isDeployedInstance(e))return this.getDeployedInstanceHover(e)}catch(e){Y.debug(loggable(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let r=t.element,o=[`<sup>\`${r.id}\`</sup> `,`### ${r.title} `],s=ni(r);s&&o.push(``,(s.md??s.txt).split(`
96
+ `;var LikeC4HoverProvider=class extends ot{services;parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}async getAstNodeHoverContent(e){let t=(await this.getAstNodeHover(e))?.contents;return typeof t==`object`&&`value`in t?t.value:void 0}getAstNodeHover(e){if(isTag(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(isElementKind(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(isDeploymentNodeKind(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(isRelationshipKind(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(isElement(e))return this.getElementHover(e);if(isDeploymentNode$1(e))return this.getDeploymentNodeHover(e);if(isDeployedInstance(e))return this.getDeployedInstanceHover(e)}catch(e){Y.debug(loggable(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let r=t.element,a=[`<sup>\`${r.id}\`</sup> `,`### ${r.title} `],o=vi(r);o&&a.push(``,(o.md??o.txt).split(`
82
97
  `).join(`
83
- `));let c=this.services.likec4.LastSeen.model(t.projectId)?.findElement(r.id),u=c&&this.getElementModelHover(c,t.projectId);return o.push(u||`
84
- <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:o.join(`
85
- `)}}}getElementModelHover(e,t){let r=[],o=[...e.incoming(`direct`)].length,s=[...e.outgoing(`direct`)].length;(o>0||s>0)&&r.push(Rf,`<small>**${o}** incoming, **${s}** outgoing relationships</small> `);let printViewLink=e=>{let r=[e.id,t],o=C.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(r))}`);return` - [${e.titleOrId}](${o})`},c=[...e.scopedViews()].map(printViewLink);c.length>0&&r.push(Rf,`<small>Element views:</small>`,...c);let u=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(I);if(u.length>0){let e=c.length>0?`Also appears in views:`:`Appears in views:`;r.push(c.length>0?``:Rf,`<small>${e}</small>`,...u,` `)}return r.length>0?r.join(`
86
- `):void 0}getDeploymentNodeHover(e){let t=nt(e),r=this.parser.forDocument(t).parseDeploymentNode(e),o=[r.id+` `];r.title!==e.name&&o.push(`### ${r.title}`),o.push("deployment node `"+r.kind+"` ");let s=ni(r);return s&&o.push(``,s.md??s.txt),{contents:{kind:`markdown`,value:o.join(`
87
- `)}}}getDeployedInstanceHover(e){let t=nt(e),r=this.parser.forDocument(t).parseDeployedInstance(e),[o,s]=H.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],c=o?this.locator.getParsedElement(s,o):this.locator.getParsedElement(s),u=[r.id+` `,`instance of \`${H.flatten(r.element)}\``];return c&&u.push(`### ${c.element.title}`,"element kind `"+c.element.kind+"` "),{contents:{kind:`markdown`,value:u.join(`
88
- `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};Ze();const zf=Y.getChild(`SemanticTokenProvider`),Bf={...Oe},Vf={...y};function createSemanticTypeMethods(e){let t=[],r=new Proxy({},{get(o,s){if(s===`modifier`)return e=>(t.push(e),r);if(s in Vf)return t.push(Vf[s]),r;if(s in Bf)return()=>e(Bf[s],t);throw Error(`Unknown semantic token type or modifier: ${s}`)}});return r}const Hf=`Stop Highlighting`,stopHighlight=()=>{throw Hf};var LikeC4SemanticTokenProvider=class extends we{services;rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let r={predicate:e,highlightFn:t};this.rules.push(r)};when(isRelationshipKind,e=>{e.property(`name`).function()}),when(xr(isRelation,isOutgoingRelationExpr,isDeploymentRelation),e=>{e.property(`kind`).function()}),when(isLibIcon,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(xr(isNavigateToProperty,isRelationNavigateToProperty),e=>{e.property(`value`).readonly.definition.interface()}),when(isWildcardExpression,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(isFqnRefExpr,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(isTagRef,e=>{e.cst().type()}),when(isRelationKindDotRef,e=>{e.cst().function()}),when(isWhereRelationKind,e=>{z(e.node.value?.$refText)&&e.property(`value`).function()}),when(xr(isWhereElementMetadata,isWhereRelationMetadata,isWhereRelationParticipantMetadata),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(xr(isWhereElementTag,isWhereElementKind,isWhereRelationTag,isWhereRelationKind),e=>{z(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(xr(isWhereRelationParticipantKind,isWhereRelationParticipantTag,isWhereRelationParticipantMetadata),e=>{e.property(`participant`).keyword()}),when(isElementKindExpression,e=>{z(e.node.kind)&&e.property(`kind`).definition.type()}),when(xr(isGlobalStyleGroup,isGlobalStyle),e=>{e.property(`id`).readonly.definition.variable()}),when(isViewRuleGlobalStyle,e=>{e.property(`style`).readonly.definition.variable()}),when(xr(isGlobalPredicateGroup,isGlobalDynamicPredicateGroup),e=>{e.property(`name`).readonly.definition.variable()}),when(isViewRuleGlobalPredicateRef,e=>{e.property(`predicate`).readonly.definition.variable()}),when(isElementTagExpression,e=>{z(e.node.tag)&&e.property(`tag`).definition.type()}),when(xr(isFqnRef,isStrictFqnRef),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),when(isStrictFqnElementRef,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(isSpecificationColor,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(isSpecificationTag,e=>{(z(e.node.color)||z(e.node.themeColor)||z(e.node.customColor))&&e.keyword(`color`).property(),z(e.node.customColor)&&e.property(`customColor`).enum(),z(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(xr(isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind),e=>{e.property(`kind`).readonly.declaration.type()}),when(isTag,e=>{e.property(`name`).definition.type()}),when(isOpacityProperty,e=>{e.property(`value`).number()}),when(isIconProperty,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(isLinkProperty,e=>{z(e.node.value)&&e.property(`value`).string()}),when(xr(isColorProperty,isIconColorProperty),e=>{z(e.node.customColor)&&e.property(`customColor`).enum(),z(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>isAnyProperty(e)&&!xr(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(e)&&z(e.key),e=>e.property(`key`).property()),when(xr(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isIconSizeProperty,isDynamicViewDisplayVariantProperty),e=>{z(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(xr(isElement,isDeploymentNode$1,isDeployedInstance)(e))return this.highlightNameAndKind(e);if(isLikeC4View(e))return this.highlightView(e);let r;for(let{predicate:t,highlightFn:o}of this.rules)if(t(e))try{r??=this.mark(e),o(r)}catch(t){if(t===Hf)return`prune`;zf.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),isDeployedInstance(e)||this.mark(e).property(`kind`).keyword(),isElement(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){let cst=t=>createSemanticTypeMethods((r,o)=>this.highlightToken({range:vi(t??e.$cstNode,`AST node has no CST node`).range,type:r,modifier:o})),keyword=t=>createSemanticTypeMethods((r,o)=>this.highlightKeyword({node:e,keyword:t,type:r,modifier:o})),property=(t,r)=>createSemanticTypeMethods((o,s)=>this.highlightProperty({node:e,property:t,type:o,modifier:s,...r===void 0?{}:{index:r}}));return{node:e,cst,keyword,property}}};const Uf=xr(isElement,isExtendElement);var FqnIndex=class extends ADisposable{services;projects;langiumDocuments;documentCache;workspaceCache;logger=Y.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new ai(e=>this.createDocumentIndex(e)),this.workspaceCache=new Le(e.shared,x.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(x.IndexedContent,e=>{isLikeC4UserDocument(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=x.IndexedContent)}get(e){return e.state<x.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:T.basename(e.uri),state:e.state,expect:x.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){U(isElement(e)||isDeploymentElement(e));let t=hf.readId(e);if(z(t))return t;let r=nt(e);return r.state<x.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:T.basename(r.uri)}),U(isLikeC4LangiumDocument(r)),this.get(r),ti(hf.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return it(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return it(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new oi;for(let r of this.documents(e))for(let e of this.get(r).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return it(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let r=new oi;for(let o of this.documents(e))for(let e of this.get(o).children(t))r.set(e.name,e);return uniqueByName(r)}))}uniqueDescedants(e,t){return it(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let r=new oi,o=new oi;for(let s of this.documents(e)){let e=this.get(s);for(let o of e.children(t))r.set(o.name,o);for(let r of e.descendants(t))o.set(r.name,r)}let s=uniqueByName(r),c=[...o.associations()].flatMap(([e,t])=>t.length===1&&!r.has(e)?t:[]);return[...s,...Ci(c)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Uf));if(t.length===0)return Wf.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),o=[],s=new oi,c=new oi,u=new oi,d=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,o,s)=>{let c=Object.assign(d.createDescription(t,o,e),{id:s,likec4ProjectId:r});return hf.writeId(t,s),u.set(s,c),c};function traverseElement(e,t){let r=hr(e.name,t),u=createAndSaveDescription(e,e.name,r);t?s.set(t,u):o.push(u);let d=P(e.body?.elements??[],Uf);if(!M(d,1))return[u];let p=Zt(d,e=>traverseElement(e,r));for(let e of p)c.set(r,e);return[u,...p]}function traverseExtendElement(e){let t=readStrictFqn(e.element),r=R(e.body?.elements??[],P(isElement),Zt(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...si(t)])for(let t of r)c.set(e,t)}for(let r of t)try{if(isExtendElement(r)){traverseExtendElement(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:T.basename(e.uri),error:t})}return new Wf(o,s,c,u,r)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>li(e.name,t.name))}var Wf=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new oi,new oi,new oi,xf.DefaultProjectId);constructor(e,t,r,o,s){this._rootElements=e,this._children=t,this._descendants=r,this._byfqn=o,this.projectId=s}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const Gf=Wr(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{services;Names;logger=Y.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(Gf));if(t.length===0)return Wf.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),o=[],s=new oi,c=new oi,u=new oi,d=this.Names,p=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,o,s)=>{let c={...p.createDescription(t,o,e),id:s,likec4ProjectId:r};return hf.writeId(t,s),u.set(s,c),c};function traverseElement(e,t){let r=d.getName(e);if(!z(r))return[];let u=Er(r,t),p=createAndSaveDescription(e,r,u);if(t?s.set(t,p):o.push(p),isDeployedInstance(e))return[p];let m=P(e.body?.elements??[],Gf);if(!M(m,1))return[p];let h=Zt(m,e=>traverseElement(e,u));for(let e of h)c.set(u,e);return[p,...h]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),r=R(e.body?.elements??[],P(Gf),Zt(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...Ir(t)])for(let t of r)c.set(e,t)}for(let r of t)try{if(isExtendDeployment(r)){traverseExtend(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:T.basename(e.uri),error:t})}return new Wf(o,s,c,u,r)}};const Kf=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Kf.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}function applyBidirectional(e,t){return t?{...e,isBidirectional:t,tail:e.tail??e.head??`normal`}:e}var MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new oi(Set);projectId;inferTechFromIcon;constructor(e,t){let r={},o=[];for(let t of e){let{c4Specification:e,c4Globals:s,c4Imports:c}=t,u=t.likec4ProjectId;I(u)&&(o.length===0||o[0]!==u)&&o.push(t.likec4ProjectId),Object.assign(r,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,s.predicates),Object.assign(this.globals.dynamicPredicates,s.dynamicPredicates),Object.assign(this.globals.styles,s.styles);for(let[e,t]of c)this.imports.set(e,t)}this.tags=pr(r),this.projectId=Cn(o),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:r,id:o,kind:s,title:c,description:u,technology:d,summary:p,metadata:m})=>{try{let h=this.specs.elements[s];if(!h)return Y.warn`No kind '${s}' found for ${o}`,null;d??=h.technology,u??=h.description,p??=h.summary,t??=h.links,en(c)&&(c=h.title||_i(o)),h.tags&&mi(h.tags)&&(e=e?kn([...h.tags,...e]):h.tags);let g=br({...h.style,...r});return!d&&this.inferTechFromIcon&&(d=deriveTechnologyFromIcon(g.icon)),br({metadata:m&&!N(m)?m:void 0,notation:h.notation,style:g,links:t,tags:e,summary:p,technology:d,description:u,title:c,kind:s,id:o})}catch(e){logWarnError(e)}return null};toModelRelation=({astPath:e,source:t,target:r,kind:o,links:s,id:c,title:u,tags:d,isBidirectional:p,...m})=>{if(I(o)&&this.specs.relationships[o]){let{multiple:e,tags:h,...g}=this.specs.relationships[o];return h&&mi(h)&&(d=d?kn([...h,...d]):h),applyBidirectional({...g,...m,...s&&{links:s},...d&&{tags:d},title:en(u)?g.title??u:u,source:t,target:r,kind:o,id:c},p)}return applyBidirectional({...s&&{links:s},...m,...d&&{tags:d},source:t,target:r,id:c,title:u},p)};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:_r.flatten(e.element)};if(`element`in e)return Y.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return Y.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:r,style:o,title:s,...c}=e;return s=s===_i(e.id)&&t.title?t.title:s,br({...t,...c,title:s,style:br({...t.style,...o}),id:r})}catch(e){logWarnError(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:r,kind:o,links:s,id:c,tags:u,isBidirectional:d,...p})=>{if(I(o)&&this.specs.relationships[o]){let{multiple:e,tags:m,...h}=this.specs.relationships[o];return m&&mi(m)&&(u=u?kn([...m,...u]):m),applyBidirectional({...h,...p,...s&&{links:s},...u&&{tags:u},source:t,target:r,kind:o,id:c},d)}return applyBidirectional({...s&&{links:s},...p,...u&&{tags:u},source:t,target:r,id:c},d)}},LastSeenArtifacts=class extends ADisposable{#e=new Map;#t=new Map;#n=new Map;constructor(e){super();let clearCache=()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()};this.onDispose(e.shared.workspace.WorkspaceManager.onForceCleanCache(clearCache),S.create(clearCache))}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,r=e.$styles,o=this.#t.get(t);return(!o||!o.equals(r))&&this.#t.set(t,r),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=new Map;for(let r of e)if(Jr(r)&&r.viewOf&&L(r.extends)){let e=t.get(r.viewOf)??[];e.push(r.id),t.set(r.viewOf,e)}for(let{id:r,nodes:o}of e)for(let e of o){let o=e.modelRef;if(e.navigateTo||!o)continue;let s=ln(t.get(o)??[],e=>e!==r);s&&(e.navigateTo=s)}return e}function relationFingerprint({source:e,target:t,kind:r,title:o,isBidirectional:s}){let c=_r.flatten(e),u=_r.flatten(t);if(s&&u<c){let e=u;u=c,c=e}return stringHash$1(`extend-relation`,c,u,r??`default`,o??``,s?`bidirectional`:`directed`)}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let r={...e};for(let[e,o]of Object.entries(t)){let t=r[e];if(t===void 0){r[e]=o;continue}let s=Array.isArray(t)?t:[t],c=Array.isArray(o)?o:[o],u=kn([...s,...c]);r[e]=u.length===1?u[0]:u}return r}merge(e){for(let t of e){let{id:e,links:r,tags:o,metadata:s}=t,c=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};r&&c.links.push(...r),o&&(c.tags=kn([...c.tags,...o])),s&&(c.metadata=this.mergeMetadata(c.metadata,s)),this.mergedData.set(e,c)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let r=t.links;e.links&&e.links.length>0&&(r=[...e.links,...r]);let o=t.tags;e.tags&&e.tags.length>0&&(o=kn([...e.tags,...o]));let s=t.metadata;return e.metadata&&(s=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:M(o,1)?o:null,links:M(r,1)?r:null,...!N(s)&&{metadata:s}}}};function buildModelData(e,t,r){let o=new MergedSpecification(r,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});o.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(o);let s=Pn(o.specs.colors,e=>mr(e.color)),c=new Set,u=new MergedExtends,d=new MergedExtends,p=r.flatMap(e=>e.c4ExtendRelations),m=new Set,scanMetadataKeys=e=>{e?.metadata&&an(e.metadata).forEach(e=>c.add(e))},h=R(r,Zt(e=>(u.merge(e.c4ExtendElements),F(e.c4Elements,o.toModelElement))),P(z),wi,mn((e,t)=>{let r=xi(t.id);return r&&L(e[r])?(Y.debug`No parent found for ${t.id}`,e):(e[t.id]=u.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),g=R(r,Zt(e=>F(e.c4Relations,o.toModelRelation)),P(e=>{if(!e)return!1;let t=_r.flatten(e.source),r=_r.flatten(e.target);return L(h[t])&&!Yr(t)||L(h[r])&&!Yr(r)?(Y.debug`Invalid relation ${e.id}
89
- source: ${t} resolved: ${!!h[t]}
90
- target: ${r} resolved: ${!!h[r]}\n`,!1):!0}),F(e=>{let t=relationFingerprint(e),r=p.filter(e=>e.id===t);if(r.length===0)return e;r.forEach(e=>m.add(e.astPath));let o=e.tags?[...e.tags]:[],s=e.links?[...e.links]:[],c=e.metadata?{...e.metadata}:{};for(let e of r){if(e.tags&&o.push(...e.tags),e.links)for(let t of e.links)s.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||s.push(t);if(e.metadata)for(let[t,r]of Object.entries(e.metadata)){let e=c[t];if(e===void 0)c[t]=r;else{let o=Array.isArray(e)?e:[e],s=Array.isArray(r)?r:[r],u=kn([...o,...s]);c[t]=u.length===1?u[0]:u}}}let u=kn(o),d=s;return{...e,...M(u,1)&&{tags:u},...M(d,1)&&{links:d},...!N(c)&&{metadata:c}}}),qt(scanMetadataKeys),rn(Nn(`id`))),_=R(r,Zt(e=>(d.merge(e.c4ExtendDeployments),F(e.c4Deployments,o.toDeploymentElement))),P(z),wi,mn((e,t)=>{let r=xi(t.id);return r&&L(e[r])?(Y.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=Gr(t)?d.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),v=R(r,Zt(e=>F(e.c4DeploymentRelations,o.toDeploymentRelation)),P(e=>e?L(_[e.source.deployment])||L(_[e.target.deployment])?(Y.debug`Invalid deployment relation ${e.id}
91
- source: ${e.source.deployment} resolved: ${!!_[e.source.deployment]}
92
- target: ${e.target.deployment} resolved: ${!!_[e.target.deployment]}\n`,!1):!0:!1),mn((e,t)=>Kt(e[t.id])?(Y.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let r=e.uri.toString();return e=>{let{id:o,title:s,description:c,astPath:u,...d}=e;return e[yr]===`element`&&L(s)&&`viewOf`in e&&(s=h[e.viewOf]?.title??null),L(s)&&o===`index`&&(s=`Landscape view`),{...vn(d,e=>e===void 0),[vr]:`parsed`,sourcePath:T.relative(t.folderUri,r),docUri:r,description:c,title:s,id:o}}}let y=r.flatMap(e=>F(e.c4Views,toC4View(e)));if(y.some(e=>e.id===`index`)||y.unshift({[vr]:`parsed`,[yr]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of y)t[yr]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(y.map(e=>e.id));for(let r of an(h)){if(e.has(r)||Yr(r))continue;let o=`__`+r.replaceAll(`.`,`_`);t.has(o)||(t.add(o),y.push({[vr]:`parsed`,[yr]:`element`,id:o,viewOf:r,title:`Auto / ${(h[r]?.title??r).replaceAll(`
93
- `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let b=R(y,rn(Nn(`id`)));y.some(Sr)&&(b=Ji(b));for(let e of p)m.has(e.astPath)||Y.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);let x=Pn(h,e=>e.title.includes(`\\/`)?{...e,title:e.title.replaceAll(`\\/`,`/`)}:e);return{data:{[vr]:`parsed`,projectId:t.id,project:br({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,contactPerson:t.config.contactPerson,metadata:t.config.metadata,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:o.tags,elements:o.specs.elements,relationships:Pn(o.specs.relationships,({notation:e,technology:t,...r})=>({...e&&{notation:e},...t&&{technology:t},style:r})),deployments:o.specs.deployments,...c.size>0&&{metadataKeys:[...c].sort(li)},customColors:s},elements:x,relations:g,globals:o.globals,views:b,deployments:{elements:_,relations:v},imports:{}},imports:o.imports}}const qf=Y.getChild(`builder`);function isRequestedImportedElement(e,t){for(let r of e)if(t.id===r||t.id.startsWith(`${r}.`))return!0;return!1}function importedElementTitles(e){let t=new Map;for(let[r,o]of nn(e))for(let e of o)t.set(Or(r,e.id),e.title);return t}function withImportedScopedViewTitles(e,t){let r=importedElementTitles(t);return r.size===0?e:Pn(e,e=>{if(e[Fr]===`element`&&e.title===null&&e.viewOf){let t=r.get(e.viewOf);if(t!==void 0)return{...e,title:t}}return e})}var DefaultLikeC4ModelBuilder=class extends ADisposable{services;projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(e){super(),this.services=e,this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.cache=new ProjectModelCache(e),this.onDispose(this.cache,S.create(()=>{this.listeners.length=0}),this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}));let t=hn(Ln(),P(e=>isNotLikeC4Builtin(e)&&!this.projects.isExcluded(e)),F(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(x.Validated,(e,r)=>{let o=t(e);o.length>0&&this.notifyListeners(o)})),qf.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=qf.getChild(e);try{let r=this.projects.getProject(e),o=this.documents(e);return o.length===0?(t.trace`unsafeSyncParseModelData: ${`skipped due to no documents`}`,null):(t.trace`unsafeSyncParseModelData: ${`completed`}`,buildModelData(this.services,r,o))}catch(t){return qf.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=qf.getChild(e),r=this.unsafeSyncParseModelData(e);if(!r)return null;if(r.imports.size===0)return t.trace(`unsafeSyncJoinedModelData: no imports`),r.data;t.debug(`unsafeSyncJoinedModelData: processing imports`);let o=[...r.imports.associations()].reduce((e,[t,r])=>{if(r.size===0)return e;let o=this.unsafeSyncParseModelData(t);if(o){let s=Mn(o.data.elements).filter(e=>isRequestedImportedElement(r,e));M(s,1)&&(e[t]=structuredClone(s))}return e},{});return{...r.data,imports:o,views:withImportedScopedViewTitles(r.data.views,o)}})}async parseModel(e,t){return e=this.projects.ensureProjectId(e),await this.mutex.read(async()=>(t?.isCancellationRequested&&await ge(t),this.cache.parsedModel(e,()=>{let t=qf.getChild(e),r=this.unsafeSyncJoinedModelData(e);return r?Ai.create(r):(t.debug`parseModel: returning EMPTY`,Ai.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let r=qf.getChild(e),o=this.unsafeSyncJoinedModelData(e);if(!o)return e!==xf.DefaultProjectId&&r.warn`unsafeSyncComputeModel: returning EMPTY`,Ai.EMPTY.asComputed;let s=performanceMark(),c=Ai.create(o),u=[];for(let e of Mn(o.views)){let o=qi(e,c);if(!o.isSuccess){r.warn(loggable(o.error));continue}t?.views[e.id]&&Object.assign(o.view,{hasManualLayout:!0}),u.push(o.view)}assignNavigateTo(u);let d={...o,manualLayouts:{...t?.views},[Pr]:`computed`,views:rn(u,Nn(`id`))};return r.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${s.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(Ai.create(d))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let r=qf.getChild(e);return await this.mutex.read(async()=>{t?.isCancellationRequested&&await ge(t);let o=this.projects.getProject(e),s=await this.manualLayouts.read(o),c=this.unsafeSyncComputeModel(e,s);return c===Ai.EMPTY&&e!==xf.DefaultProjectId&&r.warn(`computeModel returned EMPTY`),c})}onModelParsed(e){return this.listeners.push(e),S.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){qf.debug(`clear all caches`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){if(this.listeners.length===0)return;let t;if(Qt(e)){if(t=R(e,Jt(e=>this.projects.ownerProjectId(e)),nn()),en(t))return}else t=[[e,[]]];for(let e of[...this.listeners])for(let[r,o]of t)try{e(r,o)}catch(e){qf.warn(loggable(e))}}},ProjectModelCache=class extends Re{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(x.Validated,t=>{let r=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(r)}),e.shared.workspace.DocumentBuilder.onUpdate((t,r)=>{if(r.length>0){let t=e.shared.workspace.ProjectsManager,o=kn(F(r,t.ownerProjectId.bind(t)));if(!M(o,1))return;qf.trace`clear project caches for: ${o} (on delete ${r.map(e=>e.fsPath)})`;for(let e of o)this.clear(e)}}))}parsedData(e,t){let r=`parsed-data`,o=this.get(e,r);if(o!==void 0)return qf.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),qf.trace`cache miss project ${e} key: ${r}`,s}parsedJoinedData(e,t){let r=`parsed-joined-data`,o=this.get(e,r);if(o!==void 0)return qf.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),qf.trace`cache miss project ${e} key: ${r}`,s}parsedModel(e,t){let r=`parsed-model`,o=this.get(e,r);if(o!==void 0)return qf.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),qf.trace`cache miss project ${e} key: ${r}`,s}computedModel(e,t,r){let o=t?`computed-model-${t.hash}`:`computed-model`,s=this.get(e,o);if(s!==void 0)return qf.trace`cache hit project ${e} key: ${o}`,s;let c=r();return this.set(e,o,c),qf.trace`cache miss project ${e} key: ${o}`,c}};const{findNodeForKeyword:Jf,findNodeForProperty:Yf}=Qe,{getDocument:Xf,streamAllContents:Zf}=Te,Qf=Y.getChild(`locator`);var LikeC4ModelLocator=class{services;fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,r;if(e.length===2?(t=e[0],r=e[1]):(t=e[0],r=on(t)?this.projects.ensureProjectId():projectIdFrom(t)),on(t)){let e=t,o=this.fqnIndex.byFqn(r,e).head();if(!o)return null;let s=this.langiumDocuments.getDocument(o.documentUri),c=this.findParsedElementByFqnIn(e,s);return c&&s?{projectId:r,element:c,document:s}:null}let o=this.fqnIndex.getFqn(t),s=Xf(t),c=this.findParsedElementByFqnIn(o,s);return c&&s?{projectId:r,element:c,document:s}:null}catch(e){return Qf.debug(loggable(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[r,o]=ri(e);r??=this.projects.ensureProjectId(t);let s=this.fqnIndex.byFqn(r,o).head(),c=s?.nameSegment??s?.selectionSegment;return!s||!c?null:{uri:s.documentUri.toString(),range:c.range}}locateDeploymentElement(e,t){let r=this.projects.ensureProjectId(t),o=e,s=this.deploymentsIndex.byFqn(r,o).head(),c=s?.nameSegment??s?.selectionSegment;return!s||!c?null:{uri:s.documentUri.toString(),range:c.range}}locateRelation(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!r)continue;let o=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(!isRelation(o)&&!isDeploymentRelation(o))continue;let s=o.kind?Yf(o.$cstNode,`kind`):void 0;if(s??=o.dotKind?Yf(o.$cstNode,`dotKind`):void 0,s??=Jf(o.$cstNode,`->`),s??=Yf(o.$cstNode,`title`),s??=Yf(o.$cstNode,`target`),s??=o.$cstNode,s)return{uri:t.uri.toString(),range:{start:s.range.start,end:s.range.start}}}return null}locateViewAst(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Views.find(t=>t.id===e);if(!r)continue;let o=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(isLikeC4View(o))return{doc:t,view:r,viewAst:o}}return null}locateView(e,t){let r=this.locateViewAst(e,t);if(!r)return null;let o=r.viewAst,s=o.name?Yf(o.$cstNode,`name`):void 0;return s??=Jf(o.$cstNode,`view`),s??=o.$cstNode,s?{uri:r.doc.uri.toString(),range:{start:s.range.start,end:s.range.start}}:null}async locateDocumentTags(e,t){let r=this.langiumDocuments.getDocument(e);if(!r||!r.likec4ProjectId)return null;r.state<x.Linked&&(Qf.debug(`Waiting for document ${r.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(x.Linked,r.uri,t));let o=projectIdFrom(r);Qf.trace`locate document tags for ${r.uri.fsPath} in project ${o}`;try{let e=this.services.likec4.LastSeen.specification(o)?.tags,t=this.services.likec4.LastSeen.styles(o)??cr.DEFAULT;if(!e)return Qf.trace(`No specification or styles found for project ${o}, cannot locate tags for document ${r.uri.fsPath}`),null;let s=R(Zf(r.parseResult.value),pi(e=>isTag(e)||isTagRef(e)),Ei(),Zt(r=>{let o,s;try{isTag(r)?(o=r.name,s=r.$cstNode):(o=r.tag.$refText,s=r.tag.$refNode);let c=e[o];return G(c,`Tag ${o} not found in merged specification`),G(s,`Tag ${o} does not have a $cstNode`),{name:o,color:t.tagColor(c.color).fill,range:s.range,isSpecification:isTag(r)}}catch(e){return Qf.warn(`Fail on tag ${o}`,{err:e}),[]}}));return Qf.debug(`Found ${s.length} tags in document ${r.uri.path}`),s}catch(e){return Qf.warn(loggable(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:r}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!r)return null;if(!isDynamicView$1(r)||!r.body)return Qf.warn(`View ${e.view} is not a dynamic view`),null;let o=this.services.workspace.AstNodeLocator.getAstNodePath(r.body)+e.astPath,s=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,o);if(!s||!isStepOrSeries(s))return Qf.warn(`Failed to locate dynamic view step ${o} in view ${e.view}`),null;let c=s.kind?Yf(s.$cstNode,`kind`):void 0;return c??=s.dotKind?Yf(s.$cstNode,`dotKind`):void 0,c??=Jf(s.$cstNode,`->`),c??=Jf(s.$cstNode,`<-`),c??=Yf(s.$cstNode,`title`),c??=Yf(s.$cstNode,`target`),c??=s.$cstNode,c?{uri:t.uri.toString(),range:{start:c.range.start,end:c.range.start}}:null}};const $f=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function tryOrLogFn(t,r,o){try{let s=e(t,r,o);Gt(s)&&await s;return}catch(e){let o=e instanceof Error?e.message:String(e);r(`error`,`Validation failed: ${o}`,{node:t}),Y.debug(`Validation failed: ${o}`,{error:e})}}}const{getDocument:ep}=Te,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,o)=>{let s=r.getName(e);if(!s){o(`error`,`DeploymentNode must be named`,{node:e});return}let c=ti(r.getNameNode(e),`name CstNode not found`).range;$f.includes(s)&&o(`error`,`Reserved word: ${s}`,{node:e,range:c});let u=projectIdFrom(e),d=t.getFqn(e);t.byFqn(u,d).limit(2).toArray().length>1&&o(`error`,`Duplicate node name "${d}"`,{node:e,range:c})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,o)=>{let s=r.getName(e);if(!s){o(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let c=ti(r.getNameNode(e),`name CstNode not found`).range;$f.includes(s)&&o(`error`,`Reserved word: ${s}`,{node:e,range:c});let u=projectIdFrom(e),d=t.getFqn(e);t.byFqn(u,d).limit(2).toArray().length>1&&o(`error`,`Duplicate instance name "${d}"`,{node:e,range:c})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{if(!e.target?.value?.ref){r(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let o=ep(e),s=t.forDocument(o),c;try{c=s._resolveDeploymentRelationSource(e)}catch(t){Y.warn(loggable(t)),r(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(H.isImportRef(c)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(H.isModelRef(c)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let u=s.parseFqnRef(e.target);if(H.isImportRef(u)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(H.isModelRef(u)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Qr(c.deployment,u.deployment)&&r(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let r=e.deploymentNode.value.ref;(!r||!isDeploymentNode$1(r))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),stepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let o=elementRef(e.source),s=o&&t.getFqn(o);s||r(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let c=elementRef(e.target),u=c&&t.getFqn(c);u||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),s&&u&&Qr(s,u)&&s!==u&&r(`error`,`Invalid parent-child relationship`,{node:e})})},stepSeries=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let o=e.source;isStep(o)&&o.isBackward&&r(`error`,`Invalid chain after backward step`,{node:e});let s=elementRef(e.target);s&&t.getFqn(s)||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},subflowStep=e=>{let isParallel=e=>e.kind===`par`||e.kind===`parallel`,isAltBranch=e=>e.kind===`else`||e.kind===`if`||e.kind===`when`;return tryOrLog((e,t)=>{isParallel(e)&&isSubflowStep(e.$container)&&isParallel(e.$container)&&t(`error`,`Nested parallel blocks are not allowed`,{node:e,property:`kind`}),isAltBranch(e)?isAltSteps(e.$container)||t(`error`,`"${e.kind}" alternative branch must be inside "alt"`,{node:e,property:`kind`}):isAltSteps(e.$container)&&t(`error`,`"${e.kind}" can not be used as an alternative branch, only "if", "when" or "else" are allowed`,{node:e,property:`kind`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(N(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}De(e,isDynamicViewBody)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:tp}=Te,checkElement=e=>{let t=e.likec4.FqnIndex,r=e.workspace.AstNodeLocator;return tryOrLog((e,o)=>{let s=t.getFqn(e);if(!s){o(`error`,`Not indexed element`,{node:e,property:`name`});return}$f.includes(e.name)&&o(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let c=tp(e),u=c.uri,d=r.getAstNodePath(e),p=t.byFqn(projectIdFrom(c),s).filter(e=>e.documentUri!==u||e.path!==d).head();if(p){let t=p.documentUri!==u;o(`error`,`Duplicate element name ${e.name===s?e.name:e.name+` (`+s+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:p.nameSegment?.range??p.selectionSegment?.range,uri:p.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:np}=Te,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,r)=>{if(!t.all.includes(e.project)){r(`error`,`Imported project not found`,{node:e,property:`project`});return}let o=projectIdFrom(np(e));if(e.project===o){r(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let r=parseFloat(e.value);(isNaN(r)||r<0||r>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let r=e.$container;r.props.some(t=>isIconProperty(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),isElementStyleProperty(r)&&isElementBody(r.$container)&&r.$container.props.some(e=>isIconProperty(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},colorLiteralRuleChecks=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||on(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let r=tn(e.hex)?e.hex.toString().length:e.hex.length;r!==6&&r!==3&&r!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!tn(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!tn(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!tn(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),tn(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),on(e.alpha)){let r=parseFloat(e.alpha);(r<0||r>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}W(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=t.forDocument(nt(e)),s=safeCall(()=>o._resolveRelationSource(e));if(!s){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=safeCall(()=>o.parseFqnRef(e.target));if(!c){r(`error`,`Target not resolved`,{node:e,property:`target`});return}H.isImportRef(s)&&(H.isImportRef(c)?r(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):r(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),Qr(H.flatten(s),H.flatten(c))&&r(`error`,`Invalid parent-child relationship`,{node:e})})},checkRelationBody=e=>tryOrLog((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),extendRelationChecks=e=>{let t=e.likec4.ModelParser,r=new Le(e.shared,x.Linked);function getProjectFingerprints(t){return r.get(t,()=>new Set(R(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Zt(e=>e.c4Relations??[]),F(e=>relationFingerprint(e)))))}return tryOrLog((e,r)=>{let o=nt(e),s=t.forDocument(o),c=safeCall(()=>s.parseFqnRef(e.source));if(!c){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let u=safeCall(()=>s.parseFqnRef(e.target));if(!u){r(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!H.isModelRef(c)&&!H.isImportRef(c)){r(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!H.isModelRef(u)&&!H.isImportRef(u)){r(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let d=projectIdFrom(o),p=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:m=``}=s.parseBaseProps({},{title:e.title}),h=relationFingerprint({source:c,target:u,kind:p,title:m,isBidirectional:e.isBidirectional||void 0});getProjectFingerprints(d).has(h)||r(`warning`,`This extend does not match any relation (by source, kind, target, title, and directionality)`,{node:e})})},checkSpecificationRule=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),checkModel=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),checkGlobals=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),checkElementKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{$f.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e),s=t.projectElements(o,au).filter(t=>t.name===e.name&&t.node!==e).head();if(s){let t=s.documentUri!==nt(e).uri;r(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{$f.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e),s=t.projectElements(o,Ul).filter(t=>t.name===e.name&&t.node!==e).head();if(s){let t=s.documentUri!==nt(e).uri;r(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=e.name,s=projectIdFrom(e),c=t.projectElements(s,`Tag`).filter(t=>t.name===o&&t.node!==e).head();if(c){let t=c.documentUri!==nt(e).uri;r(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{$f.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e);t.projectElements(o,`RelationshipKind`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=projectIdFrom(e),s=t.projectElements(o,Ou),c=t.projectElements(o,Du);s.concat(c).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=projectIdFrom(e);t.projectElements(o,`GlobalStyleId`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},rp=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=Me(e.$cstNode,[`BLOCK_COMMENT`]);if(o&&rp.test(o.text)&&r(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:o.range}),!e.name)return;$f.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e);t.projectElements(s,`LikeC4View`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})},viewOrderChecks=e=>tryOrLog((e,t)=>{(!Number.isSafeInteger(e.value)||e.value<0)&&t(`error`,`View order must be a non-negative safe integer`,{node:e,property:`value`})});function collectFqnExprs(e){let t=[],r=e;for(;r;)r.value&&t.push(r.value),r=r.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let r=collectFqnExprs(e.targets);r.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let o=r.filter(isFqnRefExpr),s=o[0]?.ref?.parent;for(let r=1;r<o.length;r++){let c=o[r];e.value===`same`&&!areSame(s,c?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function areSame(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:areSame(e.parent,t.parent)}const checkFqnExprWith=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=getViewRulePredicateContainer(e);if(o?.$type!==`DynamicViewIncludePredicate`&&o?.isInclude!==!0){r(`error`,`Invalid usage inside "exclude"`,{node:e});return}let s=o.$type===`DynamicViewIncludePredicate`,c=t.forDocument(nt(o)),u=gr.unwrap(c.parseFqnExprWith(e).custom.expr);switch(!0){case gr.isWildcard(u)&&s:case gr.isElementKindExpr(u)&&s:case gr.isElementTagExpr(u)&&s:r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case gr.isWildcard(u):case gr.isModelRef(u):case gr.isDeploymentRef(u):return;case gr.isElementKindExpr(u):case gr.isElementTagExpr(u):r(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:yi(u)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=t.forDocument(nt(e)).parseFqnRefExpr(e),s=getViewRulePredicateContainer(e),c=isFqnRefInsideDeployment(e)&&!De(e,e=>isDeploymentViewRuleStyle(e)||isViewRuleStyle(e));if(s?.$type===`DeploymentViewRulePredicate`||c){if(!De(e,isRelationExpr)){if(gr.isModelRef(o)){r(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(gr.isDeploymentRef(o)&&_r.isInsideInstanceRef(o.ref)){r(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}z(e.selector)&&!isDeploymentNode$1(e.ref.value?.ref)&&r(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(s?.$type===`DynamicViewIncludePredicate`)switch(!0){case gr.isElementKindExpr(o):case gr.isElementTagExpr(o):case gr.isWildcard(o):r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{if(e.to.$type===`WildcardExpression`&&!isInOutRelationExpr(e.$container)){let r=Be(e,isElementView$1);L(r?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(getViewRulePredicateContainer(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let r=Be(e,isElementView$1);r&&L(r.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=Be(e,isDeploymentViewRulePredicate);if(!o||o.isInclude!==!0)return;let s=nt(e),c=t.forDocument(s),u=jr.unwrap(c.parseRelationExpr(e)),d=`Model reference is allowed in exclude predicate only`;if(jr.isDirect(u)){(Dr.isModelRef(u.source)||Dr.isModelRef(u.target))&&r(`error`,d,{node:e});return}let p;if(p=jr.isIncoming(u)?u.incoming:jr.isOutgoing(u)?u.outgoing:u.inout,Dr.isModelRef(p)){r(`error`,d,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let r=getViewRulePredicateContainer(e);if(r&&r.$type!=`DynamicViewIncludePredicate`&&!r.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends te{services;constructor(e){super(e),this.services=e}async validateDocument(e,t,r){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,r)}};Ze();const ip=xr(isImportsFromPoject,isImported,isGlobals,isGlobalPredicateGroup,isGlobalDynamicPredicateGroup,isGlobalStyle,isGlobalStyleGroup,isFqnExprWith,isRelationExprWith,isFqnExpr,isRelationExpr,isStepStatement,isDeploymentViewRule,isDeploymentViewRulePredicate,isExpressionV2,isRelationExpr,isFqnRefExpr,isViewProperty,isStyleProperty,isTags,isViewRule,isDynamicViewRule,isLikeC4View,isViewRuleStyleOrGlobalRef,isDeployedInstance,isDeploymentNode$1,isDeploymentRelation,isRelationshipStyleProperty,isDynamicViewDisplayVariantProperty,isMetadataBody,isMetadataProperty,isRelation,isRelationBody,isElementProperty,isStringProperty,isNavigateToProperty,isElement,isElementBody,isElementStyleProperty,isElementRef,isExtendElement,isExtendElementBody,isExtendDeployment,isExtendDeploymentBody,isExtendRelation,isExtendRelationBody,isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind,isSpecificationTag,isSpecificationColor,isSpecificationRule,isExpressions,isColorLiteral),findInvalidContainer=e=>{let t=e;for(;t&&!isLikeC4Grammar(t);){if(ip(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=x.Validated?e.diagnostics?.filter(e=>e.severity===ve.Error)??[]:[],r=new WeakSet;for(let{node:e}of t)if(!(L(e)||r.has(e))&&(r.add(e),!ip(e))){let t=findInvalidContainer(e);t&&r.add(t)}let isValid=e=>!r.has(e);return{isValid,invalidNodes:r}}function registerValidationChecks(e){Y.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(e),DeploymentNodeKind:checkDeploymentNodeKind(e),DeploymentNode:deploymentNodeChecks(e),DeploymentRelation:deploymentRelationChecks(e),ExtendDeployment:extendDeploymentChecks(e),ExtendRelation:extendRelationChecks(e),FqnRefExpr:checkFqnRefExpr(e),RelationExpr:checkRelationExpr(e),OpacityProperty:opacityPropertyRuleChecks(e),IconProperty:iconPropertyRuleChecks(e),SpecificationRule:checkSpecificationRule(e),Model:checkModel(e),Globals:checkGlobals(e),GlobalPredicateGroup:checkGlobalPredicate(e),GlobalDynamicPredicateGroup:checkGlobalPredicate(e),GlobalStyleId:checkGlobalStyleId(e),Step:stepSingle(e),StepSeries:stepSeries(e),SubflowStep:subflowStep(e),LikeC4View:viewChecks(e),Element:checkElement(e),ElementRef:checkElementRef(e),ElementKind:checkElementKind(e),Relation:relationChecks(e),RelationBody:checkRelationBody(e),Tag:checkTag(e),FqnExprWith:checkFqnExprWith(e),RelationExprWith:checkRelationExprWith(e),RelationshipKind:checkRelationshipKind(e),IncomingRelationExpr:checkIncomingRelationExpr(e),OutgoingRelationExpr:checkOutgoingRelationExpr(e),ImportsFromPoject:checkImportsFromPoject(e),ColorLiteral:colorLiteralRuleChecks(e),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(e),ViewRuleRank:viewRuleRankChecks(e),ViewOrderProperty:viewOrderChecks(e)});let t=e.shared.lsp.Connection;t&&bi(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,r)=>{for(let e of r)Y.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>Y.error(loggable(e)))})})}const ap=Y.getChild(`parser`),op={b:`\b`,f:`\f`,n:`
94
- `,r:`\r`,t:` `,v:`\v`,0:`\0`};function unescapeKeepingSlash(e){let t=``;for(let r=1;r<e.length-1;r++){let o=e[r];if(o===`\\`){let o=e[++r]??``;t+=o===`/`?`\\/`:op[o]??o}else t+=o}return t}function parseTitleKeepingEscapedSlash(e){if(!e||!on(e.text))return;let t=e.$cstNode?.text;return t?unescapeKeepingSlash(t):e.text}function parseInlineTitleKeepingEscapedSlash(e,t,r=0){let o=Se(e?.$cstNode,t,r)?.text;return o?unescapeKeepingSlash(o):void 0}function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return on(t)?t.split(`
95
- `).join(` `):`md`in t?{md:t.md.split(`
96
- `).join(` `)}:{txt:t.txt.split(`
97
- `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case on(e):return dedent(e).trim();case isMarkdownOrString(e)&&on(e.markdown):return{md:dedent(e.markdown).trim()};case isMarkdownOrString(e)&&on(e.text):return{txt:dedent(e.text).trim()};case isMarkdownOrString(e):return{txt:``};default:return}}function parseViewOrder(e){if(e&&!/^\s*order\b\s*-/.test(e.$cstNode?.text??``))return Number.isSafeInteger(e.value)&&e.value>=0?e.value:void 0}var BaseParser=class{services;doc;project;isValid;docUri;docPathInProject;constructor(e,t,r){this.services=e,this.doc=t,this.project=r,this.isValid=checksFromDiagnostics(t).isValid,this.docUri=t.uri.toString(),this.docPathInProject=T.relative(r.folderUri,t.uri)}logError(e,t,r){let o=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Ce(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let r=t.$cstNode,s=r?`:${r.range.start.line+1}:${r.range.start.character+1}`:``;o+=`\n\tat ${e} (${this.doc.uri.fsPath}${s})`}else t&&`$refText`in t&&(o+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);r&&r!==`base`?ap.getChild(r).debug(o):ap.debug(o)}tryParse(e,t,r){try{return!t||!this.isValid(t)?void 0:r(t)}catch(r){this.logError(r,t,e);return}}tryMap(e,t,r){let o=0;return Zt(t,t=>{try{if(!t||!this.isValid(t))return[];let e=r(t,o);return e===void 0?[]:(o++,e)}catch(r){return this.logError(r,t,e),[]}})}resolveFqn(e){if(isImported(e)){let t=projectIdFrom(e),r=this.resolveFqn(ti(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,r),Or(t,r)}return isExtendElement(e)?readStrictFqn(e.element):isExtendDeployment(e)?readStrictFqn(e.deploymentNode):isDeploymentElement(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||N(e.props))return;let extractValues=e=>{if(isMarkdownOrString(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return z(t)?[t]:[];{let e=t.md||t.txt;return z(e)?[e]:[]}}return isMetadataArray(e)?e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(z):[]},t=R(e.props,Zt(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),P(([e,t])=>z(t)));if(N(t))return;let r=R(t,Jt(([e])=>e),Pn(e=>e.map(([e,t])=>t))),o={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(o[e]=t.length===1?t[0]:t);return N(o)?void 0:o}parseMarkdownOrString(e){if(isMarkdownOrString(e))return removeIndent(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let r=[];for(;t;)r.push(...this.tryMap(`base`,t.values,e=>ti(e.tag.ref,`Tag reference is not resolved`).name).filter(z)),t=t.prev;return Xr(r)?kn(r):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,P(e.props,isLinkProperty),e=>{let t=e.value;if(en(t))return;let r=z(e.title)?toSingleLine(e.title):void 0,o=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return Br({url:t,title:r,relative:o&&o!==t?o:void 0})});return Xr(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:r}=e;switch(!0){case!!t:{let r=t.ref?.name;if(!r){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return r}case r&&r===`none`:return r;case r&&_t(r):if(r.startsWith(`file:`)){this.logError(`Icon property '${r}' used the 'file' protocol which is not supported`,e);return}return r;case r&&r.startsWith(`@`):return this.parseImageAlias(r);case r&&pt(r):return ut(this.doc.uri.toString(),`../`,r);case r&&ht(r):return gt(this.project.folderUri.toString(),r);default:this.logError(`Icon property '${r}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),r=t>0?e.substring(0,t):e,o=t>0?e.substring(t+1):``,s={"@":`./images`,...this.project.config.imageAliases}[r];if(!s){ap.warn(`Image alias "${r}" not found in project configuration`);return}let c=o?gt(s,o):s;return gt(this.project.folderUri.toString(),c)}parseColorLiteral(e){if(this.isValid(e)){if(isHexColor(e))return`#${e.hex}`;if(isRGBAColor(e)){let t=tn(e.alpha)?e.alpha:void 0;return on(e.alpha)&&(t=parseAstPercent(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}W(e)}}parseElementStyle(e){if(!e)return{};if(Qt(e)){let t=this.parseStyleProps(e.find(isElementStyleProperty)?.props);try{let r=this.parseIconProperty(e.find(isIconProperty));r&&(t.icon=r)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let r of e)if(this.isValid(r))try{switch(!0){case isBorderProperty(r):z(r.value)&&(t.border=r.value);break;case isColorProperty(r):{let e=toColor(r);z(e)&&(t.color=e);break}case isShapeProperty(r):z(r.value)&&(t.shape=r.value);break;case isIconProperty(r):{let e=this.parseIconProperty(r);z(e)&&(t.icon=e);break}case isIconColorProperty(r):{let e=toColor(r);z(e)&&(t.iconColor=e);break}case isIconSizeProperty(r):z(r.value)&&(t.iconSize=parseAstSizeValue(r));break;case isIconPositionProperty(r):z(r.value)&&(t.iconPosition=parseAstIconPositionValue(r));break;case isOpacityProperty(r):t.opacity=parseAstOpacityProperty(r);break;case isMultipleProperty(r):t.multiple=Yt(r.value)?r.value:!1;break;case isShapeSizeProperty(r):z(r.value)&&(t.size=parseAstSizeValue(r));break;case isPaddingSizeProperty(r):z(r.value)&&(t.padding=parseAstSizeValue(r));break;case isTextSizeProperty(r):z(r.value)&&(t.textSize=parseAstSizeValue(r));break;default:W(r)}}catch(e){this.logError(e,r)}return Br(t)}parseBaseProps(e,t){let r=removeIndent(t?.title??parseMarkdownAsString(e.title)),o=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description),s=t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),c=toSingleLine(t?.technology)??removeIndent(parseMarkdownAsString(e.technology));return Br({title:r,summary:s,description:o,technology:c})}};function*streamDeploymentModel(e){let t=Ar.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),r=[],o;for(;o=t.shift();){if(isDeploymentRelation(o)){r.push(o);continue}if(o.body&&o.body.elements.length>0)for(let e of o.body.elements)t.push(e);yield o}yield*r}function DeploymentModelParser(e){return class DeploymentModelParser extends e{parseDeployment(){let e=this.doc;for(let t of streamDeploymentModel(e))try{switch(!0){case isDeploymentRelation(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case isDeployedInstance(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case isDeploymentNode$1(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case isExtendDeployment(t):{let r=this.parseExtendDeployment(t);r&&e.c4ExtendDeployments.push(r);break}default:W(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,r=this.resolveFqn(e),o=ti(e.kind.ref,`DeploymentKind not resolved`).name,s=this.parseTags(e.body)??void 0,c=this.parseLinks(e.body),u=this.parseElementStyle(e.body?.props),d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=R(e.body?.props??[],P(t),P(isElementStringProperty),In(e=>[e.key,e.value])),{title:m,...h}=this.parseBaseProps(p,{title:e.title,summary:e.summary});return Br({id:r,kind:o,title:m??ei(r),...h,tags:s,links:c,style:u,metadata:d})}parseDeployedInstance(e){let t=this.isValid,r=this.resolveFqn(e),o=this.parseFqnRef(e.target.modelElement);U(H.isModelRef(o)||H.isImportRef(o),`Target must be a model reference`);let s=this.parseTags(e.body)??void 0,c=this.parseElementStyle(e.body?.props),u=this.getMetadata(e.body?.props.find(isMetadataProperty)),d=R(e.body?.props??[],P(t),P(isElementStringProperty),In(e=>[e.key,e.value])),p=this.parseBaseProps(d,{title:e.title,summary:e.summary}),m=this.parseLinks(e.body);return Br({id:r,element:o,tags:s,links:m,...p,style:c,metadata:u})}parseExtendDeployment(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),o=this.parseLinks(e.body);if(!t&&N(r??{})&&!o)return null;let s=this.resolveFqn(e),c=this.getAstNodePath(e);return Br({id:s,astPath:c,metadata:r,tags:t,links:o})}_resolveDeploymentRelationSource(e){if(Kt(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,r=this.getAstNodePath(e),o=this._resolveDeploymentRelationSource(e);U(H.isDeploymentRef(o),`Invalid source for deployment relation`);let s=this.parseFqnRef(e.target);U(H.isDeploymentRef(s),`Invalid target for deployment relation`);let c=this.convertTags(e)??this.convertTags(e.body)??void 0,u=this.convertLinks(e.body),d=(e.kind??e.dotKind?.kind)?.ref?.name,p=this.getMetadata(e.body?.props.find(isMetadataProperty)),m=R(e.body?.props??[],P(isRelationStringProperty),P(e=>z(e.value)),In(e=>[e.key,e.value])),h=R(e.body?.props??[],P(isRelationNavigateToProperty),Xt())?.value.view.ref?.name,g=this.parseBaseProps(m,{title:e.title}),_=e.body?.props.find(isRelationStyleProperty),v=stringHash$1(`deployment`,this.docUri,r,o.deployment,s.deployment);return Br({id:v,source:o,target:s,isBidirectional:e.isBidirectional||void 0,...g,metadata:p,kind:d,tags:c,links:u,...toRelationshipStyle(_?.props,t),navigateTo:h,astPath:r})}}}function DeploymentViewParser(e){return class DeploymentViewParser extends e{parseDeploymentView(e){let t=e.body;U(t,`DynamicElementView body is not defined`);let r=t.props.filter(this.isValid),o=this.getAstNodePath(e),s=e.name;s||=`deployment_`+stringHash$1(this.doc.uri.toString(),o);let c=R(r,P(isViewStringProperty),In(e=>[e.key,e.value])),{title:u=null,description:d=null}=this.parseBaseProps(c,{title:parseTitleKeepingEscapedSlash(c.title)}),p=this.convertTags(t),m=this.convertLinks(t),h=parseViewOrder(r.find(isViewOrderProperty));return mf.writeId(e,s),{[V._type]:`deployment`,id:s,astPath:o,title:toSingleLine(u)??null,description:d,...h!==void 0&&{order:h},tags:p,links:Xr(m)?m:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(isDeploymentViewRulePredicate(e))return this.parseDeploymentViewRulePredicate(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleAncestors(e))return{includeAncestors:e.value};if(isDeploymentViewRuleStyle(e))return this.parseDeploymentViewRuleStyle(e);W(e)}parseDeploymentViewRulePredicate(e){let t=[],r=e.expr;for(;r;){try{let e=r.value;I(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){logWarnError(e)}r=r.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(isStyleProperty)),r=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...r&&{notation:r}}}}}const parseMetadataEquals=({operator:e,not:t},r)=>e?.startsWith(`!=`)?{neq:r}:e?.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r},parseEquals=({operator:e,not:t},r)=>e.startsWith(`!=`)?{neq:r}:e.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r};function parseParticipant(e){return!isWhereRelationParticipantKind(e)&&!isWhereRelationParticipantTag(e)&&!isWhereRelationParticipantMetadata(e)?null:e.participant}function parseWhereClause(e){switch(!0){case isWhereTagEqual(e):{let t=e.value.tag.ref?.name,r=parseParticipant(e);U(t,`Expected tag name`);let o={tag:parseEquals(e,t)};return r?{participant:r,operator:o}:o}case isWhereKindEqual(e):{let t=e.value?.ref?.name,r=parseParticipant(e);U(t,`Expected kind name`);let o={kind:parseEquals(e,t)};return r?{participant:r,operator:o}:o}case isWhereMetadataEqual(e):{let t=e.key,r=parseParticipant(e);U(t,`Expected metadata key`);let o={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return r?{participant:r,operator:o}:o}case isWhereElementNegation(e)||isWhereRelationNegation(e):return{not:parseWhereClause(e.value)};case isWhereBinaryExpression(e):{let t=parseWhereClause(e.left),r=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,r)}default:W(e)}}function createBinaryOperator(e,t,r){if(r===null)return t;switch(e){case`and`:{let e=[Ur(t)?t.and:t,Ur(r)?r.and:r].flat();return U(Xr(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[Zr(t)?t.or:t,Zr(r)?r.or:r].flat();return U(Xr(e),`Expected non-empty array`),{or:e}}default:W(e)}}function ExpressionV2Parser(e){return class ExpressionV2Parser extends e{parseFqnRef(e){let t=ti(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(isImported(t)){let e={project:projectIdFrom(t),model:this.resolveFqn(ti(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(isElement(t)){let r=importsRef(e);if(r){let e={project:projectIdFrom(r),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let o=instanceRef(e);return o?{deployment:this.resolveFqn(o),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(isDeploymentElement(t))return{deployment:this.resolveFqn(t)};W(t)}parseExpressionV2(e){if(isFqnExprOrWith(e))return this.parseFqnExprOrWith(e);if(isRelationExprOrWith(e))return this.parseRelationExprOrWith(e);W(e)}parseFqnExprOrWith(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);W(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(isNavigateToProperty(t)){let r=t.value.view.$refText;return z(r)&&(e.custom.navigateTo=r),e}if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom[t.key]=r),e}if(isElementStringProperty(t)){if(t.key===`description`||t.key===`summary`){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return Kt(r)&&(e.custom[t.key]=r),e}if(isIconProperty(t)){let r=this.parseIconProperty(t);return Kt(r)&&(e.custom[t.key]=r),e}if(isColorProperty(t)){let r=toColor(t);return Kt(r)&&(e.custom[t.key]=r),e}if(isShapeProperty(t)||isBorderProperty(t))return Kt(t.value)&&(e.custom[t.key]=t.value),e;if(isOpacityProperty(t))return Kt(t.value)&&(e.custom[t.key]=parseAstOpacityProperty(t)),e;if(isIconColorProperty(t)){let r=toColor(t);return Kt(r)&&(e.custom[t.key]=r),e}if(isNotationProperty(t)){let r=z(t.value)?removeIndent(parseMarkdownAsString(t.value)):void 0;return r&&(e.custom[t.key]=r),e}if(isMultipleProperty(t))return Yt(t.value)&&(e.custom[t.key]=t.value),e;if(isShapeSizeProperty(t)||isTextSizeProperty(t)||isPaddingSizeProperty(t)||isIconSizeProperty(t))return z(t.value)&&(e.custom[t.key]=parseAstSizeValue(t)),e;if(isIconPositionProperty(t))return z(t.value)&&(e.custom[t.key]=t.value),e;W(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(isFqnExprWhere(e))return this.parseFqnExprWhere(e);if(isFqnExpr(e))return this.parseFqnExpr(e);W(e)}parseFqnExprWhere(e){return U(!isFqnExprWhere(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?parseWhereClause(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(isWildcardExpression(e))return{wildcard:!0};if(isElementKindExpression(e))return U(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(isElementTagExpression(e))return U(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.ref.name,isEqual:e.isEqual};if(isFqnRefExpr(e))return this.parseFqnRefExpr(e);W(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],r=e;for(;r;){try{I(r.value)&&this.isValid(r.value)&&t.push(this.parseFqnExpr(r.value))}catch(e){this.logError(e,r.value,`fqnref`)}r=r.prev}return t.reverse()}parseRelationExprOrWith(e){if(isRelationExprWith(e))return this.parseRelationExprWith(e);if(isRelationExprOrWhere(e))return this.parseRelationExprOrWhere(e);W(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e[t.key]=r),e}if(isRelationStringProperty(t)||isNotationProperty(t)){if(t.key===`description`){let r=this.parseMarkdownOrString(t.value);return r&&(e.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return Kt(r)&&(e[t.key]=r),e}if(isArrowProperty(t))return z(t.value)&&(e[t.key]=t.value),e;if(isColorProperty(t)){let r=toColor(t);return z(r)&&(e[t.key]=r),e}if(isLineProperty(t))return z(t.value)&&(e[t.key]=t.value),e;if(isRelationNavigateToProperty(t)){let r=t.value.view.ref?.name;return z(r)&&(e[t.key]=r),e}if(isMultipleProperty(t))return Yt(t.value)&&(e[t.key]=t.value),e;W(t)},{})}parseRelationExprOrWhere(e){if(isRelationExprWhere(e))return this.parseRelationExprWhere(e);if(isRelationExpr(e))return this.parseRelationExpr(e);W(e)}parseRelationExprWhere(e){U(!isRelationExprWhere(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),r=t.where?.expr??t,o=t.where?.condition,s=e.where?parseWhereClause(e.where):null,c;return c=s&&o?createBinaryOperator(`and`,o,s):s??o??{kind:{neq:`--always-true--`}},{where:{expr:r,condition:c}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:W(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function GlobalsParser(e){return class GlobalsParser extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,r=this.isValid,o=e.value.globals.filter(r),s=o.flatMap(e=>e.predicates.filter(r));for(let e of s)try{let r=e.name;if(!z(r))continue;if(r in t.predicates){this.logError(`Global predicate named "${r}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,r,t)}catch(t){this.logError(t,e,`globals`)}let c=o.flatMap(e=>e.styles.filter(r));for(let e of c)try{let r=e.id.name;if(!z(r))continue;if(r in t.styles){this.logError(`Global style named "${r}" is already defined`,e,`globals`);continue}let o=this.parseGlobalStyleOrGroup(e);M(o,1)&&(t.styles[r]=o)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,r){if(isGlobalPredicateGroup(e)){let o=this.parseGlobalPredicateGroup(e);M(o,1)&&(r.predicates[t]=o);return}if(isGlobalDynamicPredicateGroup(e)){let o=this.parseGlobalDynamicPredicateGroup(e);M(o,1)&&(r.dynamicPredicates[t]=o);return}W(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(isGlobalStyle(e))return[this.parseViewRuleStyle(e)];if(isGlobalStyleGroup(e))return e.styles.map(e=>this.parseViewRuleStyle(e));W(e)}}}function ImportsParser(e){return class ImportsParser extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,r=t.imports;for(;r;){try{this.doc.c4Imports.set(e,this.resolveFqn(ti(r.imported.ref,`ElementRef is empty of imported: ${r.imported.$refText}`)))}catch(e){this.logError(e,r,`imports`)}r=r.prev}}}}}function*streamModel(e){let t=Ar.from(e.parseResult.value.models.flatMap(e=>e.elements)),r=[],o;for(;o=t.shift();){if(isRelation(o)){r.push(o);continue}if(isExtendRelation(o)){r.push(o);continue}if(o.body?.elements&&M(o.body.elements,1))for(let e of o.body.elements)t.push(e);yield o}yield*r}function ModelParser(e){return class ModelParser extends e{parseModel(){let e=this.doc;for(let t of streamModel(e))try{if(isElement(t)){e.c4Elements.push(this.parseElement(t));continue}if(isRelation(t)){e.c4Relations.push(this.parseRelation(t));continue}if(isExtendElement(t)){let r=this.parseExtendElement(t);r&&e.c4ExtendElements.push(r);continue}if(isExtendRelation(t)){let r=this.parseExtendRelation(t);r&&e.c4ExtendRelations.push(r);continue}W(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,r=this.resolveFqn(e),o=ti(e.kind.ref,`Element kind is not resolved`).name,s=this.parseTags(e.body),c=this.parseElementStyle(e.body?.props),u=this.getMetadata(e.body?.props.find(isMetadataProperty)),d=this.getAstNodePath(e),[p,m,h]=e.props??[],g=R(e.body?.props??[],P(t),P(isElementStringProperty),In(e=>[e.key,e.value])),{title:_,...v}=this.parseBaseProps(g,{title:Kt(p)?parseInlineTitleKeepingEscapedSlash(e,`props`,0)??p:parseTitleKeepingEscapedSlash(g.title),summary:m,technology:h});return br({id:r,kind:o,astPath:d,title:_,metadata:u,tags:s??void 0,links:this.parseLinks(e.body),...v,style:c})}parseExtendElement(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),o=this.parseLinks(e.body);if(!t&&en(r)&&!o)return null;let s=this.getAstNodePath(e),c=this.resolveFqn(e);return br({id:c,astPath:s,metadata:r,tags:t,links:o})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),r=this.parseFqnRef(e.target);U(_r.isModelRef(t)||_r.isImportRef(t),`Source must be a model reference`),U(_r.isModelRef(r)||_r.isImportRef(r),`Target must be a model reference`);let o=this.parseTags(e.body),s=this.getMetadata(e.body?.props.find(isMetadataProperty)),c=this.getAstNodePath(e),u=this.parseLinks(e.body);if(!o&&N(s??{})&&!u)return null;let d=(e.kind??e.dotKind?.kind)?.ref?.name,{title:p=``}=this.parseBaseProps({},{title:e.title}),m=relationFingerprint({source:t,target:r,kind:d,title:p,isBidirectional:e.isBidirectional||void 0});return br({id:m,astPath:c,isBidirectional:e.isBidirectional||void 0,metadata:s,tags:o,links:u})}_resolveRelationSource(e){if(Kt(e.source)){let t=this.parseFqnRef(e.source);return U(_r.isModelRef(t)||_r.isImportRef(t),`Relation source must be a model reference`),t}if(isElementBody(e.$container)||isExtendElementBody(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,r=this._resolveRelationSource(e),o=this.parseFqnRef(e.target);U(_r.isModelRef(o)||_r.isImportRef(o),`Target must be a model reference`);let s=this.parseTags(e)??this.parseTags(e.body)??void 0,c=this.parseLinks(e.body),u=(e.kind??e.dotKind?.kind)?.ref?.name,d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=this.getAstNodePath(e),m=R(e.body?.props??[],P(isRelationStringProperty),P(e=>z(e.value)),In(e=>[e.key,e.value])),h=R(e.body?.props??[],P(isRelationNavigateToProperty),F(e=>e.value.view.ref?.name),P(z),Xt()),{title:g=``,description:_,technology:v}=this.parseBaseProps(m,{title:e.title,description:e.description,technology:e.technology}),y=e.body?.props.find(isRelationStyleProperty),b=stringHash$1(this.docUri,p,_r.flatten(r),_r.flatten(o));return br({id:b,astPath:p,source:r,target:o,isBidirectional:e.isBidirectional||void 0,title:g,metadata:d,kind:u,tags:s,links:c,navigateTo:h,description:_,technology:v,...toRelationshipStyle(y?.props,t)})}}}function PredicatesParser(e){return class PredicatesParser extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);W(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function SpecificationParser(e){return class SpecificationParser extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,r=this.isValid;for(let o of e.flatMap(e=>e.elements.filter(r)))try{Object.assign(t.elements,this.parseElementSpecificationNode(o))}catch(e){this.logError(e,o,`specification`)}for(let o of e.flatMap(e=>e.deploymentNodes.filter(r)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(o))}catch(e){this.logError(e,o,`specification`)}let o=e.flatMap(e=>e.relationships.filter(this.isValid));for(let e of o){let{kind:r,props:o}=e;try{let s=r.name;if(!z(s))continue;if(s in t.relationships){this.logError(`Relationship kind "${s}" is already defined`,r,`specification`);continue}let c=this.parseTags(e),u=this.parseLinks(e),d=R(o.filter(isSpecificationRelationshipStringProperty)??[],P(e=>this.isValid(e)),In(e=>[e.key,e.value])),{summary:p,...m}=this.parseBaseProps(d),h=removeIndent(parseMarkdownAsString(d.notation)),g=o.filter(isMultipleProperty);g.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${s}", using the first one`,r,`specification`);let _=g[0];t.relationships[s]=Br({...m,notation:h,tags:c??void 0,...u&&V.isNonEmptyArray(u)&&{links:u},...toRelationshipStyle(o.filter(isRelationshipStyleProperty),this.isValid),..._&&{multiple:_.value}})}catch(e){this.logError(e,r,`specification`)}}let s=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of s)try{let r=e.tag.name,o=this.getAstNodePath(e.tag),s=toColor(e)??(e.color&&this.parseColorLiteral(e.color));if(r in t.tags){this.logError(`Tag ${r} is already defined, skipping duplicate`,e,`specification`);continue}z(r)&&(t.tags[r]={astPath:o,...s?{color:s}:{}})}catch(t){this.logError(t,e,`specification`)}let c=e.flatMap(e=>e.colors.filter(r));for(let{name:e,color:r}of c)try{let o=e.name;if(o in t.colors){this.logError(`Custom color "${o}" is already defined`,e,`specification`);continue}t.colors[o]={color:vi(this.parseColorLiteral(r),`Color "${o}" is not valid`)}}catch(e){this.logError(e,r,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:r}=e,o=t.name;if(!z(o))throw Error(`DeploymentNodeKind name is not resolved`);let s=this.parseTags(e),c=this.parseElementStyle(r.find(isElementStyleProperty)),u=this.parseLinks(e),d=R(r.filter(isSpecificationElementStringProperty)??[],P(e=>this.isValid(e)),In(e=>[e.key,e.value])),p=this.parseBaseProps(d),m=removeIndent(parseMarkdownAsString(d.notation));return{[o]:Br({...p,notation:m,tags:s??void 0,...u&&V.isNonEmptyArray(u)&&{links:u},style:c})}}}}function ViewsParser(e){return class ViewsParser extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let r=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),o=t.folder&&!N(t.folder.trim())?toSingleLine(t.folder):null;for(let s of t.views)try{if(!e(s))continue;switch(!0){case isElementView$1(s):this.doc.c4Views.push(this.parseElementView(s,r));break;case isDynamicView$1(s):this.doc.c4Views.push(this.parseDynamicElementView(s,r));break;case isDeploymentView$1(s):this.doc.c4Views.push(this.parseDeploymentView(s));break;default:W(s)}if(o){let e=this.doc.c4Views.at(-1);e.title=o+` / `+(e.title||e.id)}}catch(e){this.logError(e,s,`views`)}}}parseElementView(e,t){let r=e.body;U(r,`ElementView body is not defined`);let o=r.props.filter(this.isValid),s=this.getAstNodePath(e),c=null,u=e.viewOf;if(u){let t=safeCall(()=>this.parseModelElementRef(u,`Invalid reference to viewOf`));if(t)c=t;else{let t=e.name??`unnamed`,r=u.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${r}`,u)}}let d=e.name;d||=`view_`+stringHash$1(this.doc.uri.toString(),s,c??``);let p=R(o,P(isViewStringProperty),In(e=>[e.key,e.value])),{title:m=null,description:h=null}=this.parseBaseProps(p,{title:parseTitleKeepingEscapedSlash(p.title)}),g=this.convertTags(r),_=this.convertLinks(r),v=parseViewOrder(o.find(isViewOrderProperty)),y={[V._type]:`element`,id:d,astPath:s,title:toSingleLine(m)??null,description:h,...v!==void 0&&{order:v},tags:g,links:Xr(_)?_:null,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseElementViewRule(e))],...c&&{viewOf:c}};if(mf.writeId(e,y.id),`extends`in e){let t=e.extends.view.ref;return U(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(y,{extends:t.name})}return y}parseElementViewRule(e){if(isViewRulePredicate(e))return this.parseViewRulePredicate(e);if(isViewRuleGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleGroup(e))return this.parseViewRuleGroup(e);if(isViewRuleRank(e))return this.parseViewRuleRank(e);W(e)}parseViewRulePredicate(e){let t=[],r=e.exprs;for(;r;){let{value:e,prev:o}=r;if(this.tryParse(`views`,e,()=>{let r=this.parsePredicate(e);t.unshift(r)}),!o)break;r=o}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(isViewRuleStyle(e))return this.parseViewRuleStyle(e);if(isViewRuleGlobalStyle(e))return this.parseViewRuleGlobalStyle(e);W(e)}parseViewRuleGroup(e){let t=[];for(let r of e.groupRules)try{if(!this.isValid(r))continue;if(isViewRulePredicate(r)){t.push(this.parseViewRulePredicate(r));continue}if(isViewRuleGlobalPredicateRef(r)){t.push(this.parseViewRuleGlobalPredicateRef(r));continue}if(isViewRuleGroup(r)){t.push(this.parseViewRuleGroup(r));continue}W(r)}catch(e){this.logError(e,r,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>V.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>V.ModelExpression.isFqnExpr(e)),r=this.parseStyleProps(e.props.filter(isStyleProperty)),o=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:t,style:r,...o&&{notation:o}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let r=e.body;U(r,`DynamicElementView body is not defined`);let o=this.isValid,s=r.props.filter(o),c=this.getAstNodePath(e),u=e.name;u||=`dynamic_`+stringHash$1(this.doc.uri.toString(),c);let d=R(s,P(isViewStringProperty),In(e=>[e.key,e.value])),{title:p=null,description:m=null}=this.parseBaseProps(d,{title:parseTitleKeepingEscapedSlash(d.title)}),h=this.convertTags(r),g=this.convertLinks(r),_=parseViewOrder(s.find(isViewOrderProperty));mf.writeId(e,u);let v=ln(s,isDynamicViewDisplayVariantProperty)?.value;return{[V._type]:`dynamic`,id:u,astPath:c,title:toSingleLine(p)??null,description:m,..._!==void 0&&{order:_},tags:h,links:Xr(g)?g:null,variant:v,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseDynamicViewRule(e))],steps:this.parseSteps(r.steps)}}parseDynamicViewRule(e){if(isDynamicViewIncludePredicate(e))return this.parseDynamicViewIncludePredicate(e);if(isDynamicViewGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);W(e)}parseDynamicViewIncludePredicate(e){let t=[],r=e.exprs;for(;r;)this.tryParse(`views`,r.value,e=>{if(isFqnExprOrWith(e)){let r=this.parseElementPredicate(e);t.unshift(r)}}),r=r.prev;return{include:t}}parseSteps(e){return this.tryMap(`views`,e,e=>this.parseStepStatement(e))}parseStepStatement(e){switch(!0){case isSubflowStep(e):return this.parseSubflowStep(e);case isTryStep(e):return this.parseTryStep(e);case isAltSteps(e):return this.parseAltSteps(e);case isStepSeries(e):return this.parseStepSeries(e);case isStep(e):return this.parseStep(e);default:W(e)}}parseStepSeries(e){let t=this.recursiveParseStepSeries(e);return U(Xr(t),`Dynamic step chain must have at least one step`),{[V._type]:`series`,steps:t}}recursiveParseStepSeries(e,t){if(isStep(e.source)){if(!this.isValid(e.source))return[];let r=this.parseStep(e.source);if(r.isBackward)return[];let o={...this.parseAbstractDynamicStep(e),source:r.target};return o.target===r.source?o.isBackward=!0:t&&(t.push([r.source,r.target]),t.push([o.source,o.target])),[r,o]}t??=[];let r=this.recursiveParseStepSeries(e.source,t);if(!Xr(r)||!this.isValid(e))return[];let o=Fn(r),s={...this.parseAbstractDynamicStep(e),source:o.target},c=t.findIndex(([e,t])=>e===s.target&&t===s.source);return c===-1?t.push([s.source,s.target]):(s.isBackward=!0,t.splice(c,t.length-c)),[...r,s]}parseStep(e){let t={...this.parseAbstractDynamicStep(e),source:this.parseDynamicStepEndpoint(e.source,`source`)};return e.isBackward&&(t={...t,source:t.target,target:t.source,isBackward:!0}),t}parseAbstractDynamicStep(e){let t=pathInsideDynamicView(e),r={target:this.parseDynamicStepEndpoint(e.target,`target`),astPath:t},o=removeIndent(e.title);o&&(r.title=o);let s=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;s&&(r.kind=s);for(let t of e.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(t):{let e=t.value.view.ref?.name;z(e)&&(r.navigateTo=e);break}case isRelationStringProperty(t):case isNotationProperty(t):if(Kt(t.value)){if(t.key===`description`){let e=removeIndent(t.value);e&&(r.description=e)}else r[t.key]=removeIndent(parseMarkdownAsString(t.value))??``}break;case isNotesProperty(t):Kt(t.value)&&(r[t.key]=removeIndent(t.value));break;case isArrowProperty(t):Kt(t.value)&&(r[t.key]=t.value);break;case isColorProperty(t):{let e=toColor(t);Kt(e)&&(r[t.key]=e);break}case isLineProperty(t):Kt(t.value)&&(r[t.key]=t.value);break;case isMultipleProperty(t):break;default:W(t)}}catch(e){this.logError(e,t,`views`)}return r}parseModelElementRef(e,t){let r=this.parseFqnRef(e.modelElement);if(!V.FqnRef.isModelRef(r))throw Error(t);return V.FqnRef.flatten(r)}parseDynamicStepEndpoint(e,t){return this.parseModelElementRef(e,`Invalid reference to ${t}`)}parseSubflowStep(e){let t=e.kind===`parallel`?`par`:e.kind;switch(t){case`break`:case`loop`:case`opt`:case`par`:{let r=this.parseSteps(e.steps);return U(Xr(r),`Parallel steps must have at least one step`),V.exact({[V._type]:t,title:e.title,steps:r})}case`else`:case`if`:case`when`:throw Error(`Unsupported kind: ${t}`);default:W(t)}}parseTryStep(e){if(U(this.isValid(e)),isFinallyBlock(e)){let t=this.parseTryStep(e.tryCatch),r=this.parseSteps(e.finally.steps);return Xr(r)?{...t,finally:V.exact({title:e.title,steps:r})}:t}if(isCatchBlock(e)){let t=this.parseTryStep(e.try),r=this.parseSteps(e.catch.steps);return Xr(r)?{...t,catch:V.exact({title:e.title,steps:r})}:t}let t=this.parseSteps(e.steps);return U(Xr(t),`Try steps must have at least one step`),{[V._type]:`try`,try:V.exact({title:e.title,steps:t})}}parseAltSteps(e){let t=this.tryMap(`views`,e.branches,e=>{let t=e.kind;U(t===`if`||t===`else`||t===`when`,`Expected "if", "else", or "when", got "${t}"`);let r=this.parseSteps(e.steps);return U(Xr(r),`Branch steps must have at least one step`),V.exact({[V._type]:t,title:e.title,steps:r})});return U(Xr(t),`Alt must have at least one branch`),V.exact({[V._type]:`alt`,title:e.title,branches:t})}}}function pathInsideDynamicView(e){let t=e,r=[];for(;!isDynamicViewBody(t);)tn(t.$containerIndex)&&r.unshift(`@${t.$containerIndex}`),r.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return r.join(``)}Ze();const sp=R(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends sp{};const cp=Y.getChild(`parser`),isError=e=>e.severity===ve.Error;var LikeC4ModelParser=class extends ADisposable{services;cachedParsers=new ai(e=>this.createParser(e));constructor(e){super(),this.services=e,this.onDispose(S.create(()=>{this.cachedParsers.clear()}),e.shared.workspace.DocumentBuilder.onDocumentPhase(x.Linked,async e=>{this.cachedParsers.has(e)&&(cp.trace(`project {project}, Linked: clear cached parser {doc}`,{projectId:e.likec4ProjectId,doc:T.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(x.Linked,async e=>{for(let t of e)if(isLikeC4UserDocument(t))try{this.parse(t)}catch(e){logWarnError(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(x.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(cp.trace(`project {project}, Validated: clear cached parser {doc} because of errors`,{project:e.likec4ProjectId,doc:T.basename(e.uri)}),this.cachedParsers.delete(e))}))}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){G(isLikeC4LangiumDocument(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),r=T.relative(t.folderUri,e.uri);cp.trace(`project {project}, create parser {doc}`,{project:t.id,doc:r}),e.state<x.Linked&&cp.debug(`Document {doc} is not linked, state is {state}`,{doc:r,state:e.state});let o={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new oi(Set)};e=Object.assign(e,o);let s=new DocumentParser(this.services,e,t);try{s.parseSpecification(),s.parseImports(),s.parseModel(),s.parseDeployment(),s.parseGlobals(),s.parseViews()}catch(e){throw Error(`Error parsing document ${r}`,{cause:e})}return s}},LikeC4ValueConverter=class extends ae{runConverter(e,t,r){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Ye.convertString(t)):super.runConverter(e,t,r)}};Ze();const{findNodeForKeyword:lp}=Qe,asViewStyleRule=(e,t,r=0)=>{let o=r>0?` `.repeat(r):``;return[o+`style ${e} {`,...nn(t).map(([e,t])=>o+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),o+`}`]},isMatchingViewRule=(e,t)=>r=>{if(!isViewRuleStyle(r)&&!isDeploymentViewRuleStyle(r))return!1;let o=r.targets.value;if(!o||z(r.targets.prev)||o.$type!==`FqnRefExpr`||z(o.selector))return!1;let s=o.ref?.value?.ref;return(s?t.resolve(s):null)===e};function changeElementStyle(e,{view:t,viewAst:r,targets:o,style:s}){U(r.body,`View ${t.id} has no body`);let c=ti(r.$cstNode,`cant find view cst node`),u=ti(r.body.$cstNode,`cant find view body cst node`),d=ti(lp(u,`}`),`cant find closing brace`);U(d.container,`Closing brace has no container`);let p=d.container.content,m=Fn(r.body.rules)?.$cstNode??p[p.indexOf(d)-1];U(m,`anchor is not defined`);let h=m.range.end,g=d.range.start.line===h.line?`
98
- `+` `.repeat(c.range.start.character):``,_=c.range.start.character+2,v=[],y=e.likec4.FqnIndex,b=P(r.body.rules,e=>isViewRuleStyle(e)||isDeploymentViewRuleStyle(e)),x=t[Fr]===`element`?t.viewOf??null:null,ee=[],te=[];o.forEach(e=>{let t=un(b,isMatchingViewRule(e,y)),r=x&&Hr(x,e)?e.substring(x.length+1):e;t?ee.push({fqn:r,rule:t}):te.push({fqn:r})});let S={start:h,end:h},includeRange=e=>{e.start.line<=S.start.line&&(e.start.line==S.start.line?S.start.character=Math.min(e.start.character,S.start.character):S.start=e.start),e.end.line>=S.end.line&&(e.end.line==S.end.line?S.end.character=Math.max(e.end.character,S.end.character):S.end=e.end)};if(te.length>0){let e=te.flatMap(({fqn:e})=>asViewStyleRule(e,s,_));v.push(We.insert(h,`
98
+ `));let s=this.services.likec4.LastSeen.model(t.projectId)?.findElement(r.id),l=s&&this.getElementModelHover(s,t.projectId);return a.push(l||`
99
+ <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:a.join(`
100
+ `)}}}getElementModelHover(e,t){let r=[],a=[...e.incoming(`direct`)].length,o=[...e.outgoing(`direct`)].length;(a>0||o>0)&&r.push(Nu,`<small>**${a}** incoming, **${o}** outgoing relationships</small> `);let printViewLink=e=>{let r=[e.id,t],a=j.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(r))}`);return` - [${e.titleOrId}](${a})`},s=[...e.scopedViews()].map(printViewLink);s.length>0&&r.push(Nu,`<small>Element views:</small>`,...s);let l=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(Ut);if(l.length>0){let e=s.length>0?`Also appears in views:`:`Appears in views:`;r.push(s.length>0?``:Nu,`<small>${e}</small>`,...l,` `)}return r.length>0?r.join(`
101
+ `):void 0}getDeploymentNodeHover(e){let t=A(e),r=this.parser.forDocument(t).parseDeploymentNode(e),a=[r.id+` `];r.title!==e.name&&a.push(`### ${r.title}`),a.push("deployment node `"+r.kind+"` ");let o=vi(r);return o&&a.push(``,o.md??o.txt),{contents:{kind:`markdown`,value:a.join(`
102
+ `)}}}getDeployedInstanceHover(e){let t=A(e),r=this.parser.forDocument(t).parseDeployedInstance(e),[a,o]=U.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],s=a?this.locator.getParsedElement(o,a):this.locator.getParsedElement(o),l=[r.id+` `,`instance of \`${U.flatten(r.element)}\``];return s&&l.push(`### ${s.element.title}`,"element kind `"+s.element.kind+"` "),{contents:{kind:`markdown`,value:l.join(`
103
+ `)}}}};st();const Pu=Y.getChild(`model-diff`),Fu=/* @__PURE__ */ new WeakMap;function trackClientCapabilities(e){e.lsp.LanguageServer.onInitialize(t=>{Fu.set(e,t)})}function clientPreviewsRemovalImpact(e){let t=Fu.get(e)?.initializationOptions;return Wt(t)&&t.removalImpactPreview===!0}const Iu=`likec4.confirm`;function withConfirmation(e,t){return{documentChanges:Object.entries(e.changes??{}).map(([e,t])=>({textDocument:{uri:e,version:null},edits:t.map(e=>({...e,annotationId:Iu}))})),changeAnnotations:{[Iu]:{label:t,needsConfirmation:!0}}}}function errorsOf(e){return(e.diagnostics??[]).filter(e=>e.severity===at.Error)}function diagnosticText(e){return typeof e==`string`?e:e.value}function errorKey(e,{range:t,message:r}){return`${e.uri.toString()}|${t.start.line}:${t.start.character}|${diagnosticText(r)}`}function errorKeys(e){return new Set(e.shared.workspace.LangiumDocuments.all.toArray().flatMap(e=>errorsOf(e).map(t=>errorKey(e,t))))}function diffAt(e,t){let r=e.parseResult.value.$cstNode,a=r&&ft(r,e.textDocument.offsetAt(t.start))?.astNode,o=ut(a,isModelDiff);return o?Vr(o.name):void 0}function collectErrors(e,t,r){let a=new Set(t.map(e=>e.toString()));return e.shared.workspace.LangiumDocuments.all.toArray().flatMap(e=>errorsOf(e).filter(t=>a.has(e.uri.toString())||!r.has(errorKey(e,t))).map(t=>{let r=diffAt(e,t.range);return{uri:e.uri.toString(),range:t.range,message:diagnosticText(t.message),...r&&{diffId:r}}}))}function waitForRebuild(e,t,r=5e3){let a=e.shared.workspace,isRebuilt=()=>[...t].every(([e,t])=>{let r=a.LangiumDocuments.getDocument(j.parse(e));return!r||r.textDocument.version!==t&&r.state>=E.Validated});return isRebuilt()?Promise.resolve():new Promise(e=>{let t=a.DocumentBuilder.onBuildPhase(E.Validated,()=>{isRebuilt()&&(clearTimeout(o),t.dispose(),e())}),o=setTimeout(()=>{Pu.warn`documents were not rebuilt in ${r}ms after the edit`,t.dispose(),e()},r);typeof o==`object`&&o.unref()})}async function writeFiles(e,t,r){let a=[];try{for(let o of t){let t=ce.applyEdits(o.textDocument,r.changes?.[o.uri.toString()]??[]);await e.writeFile(o.uri,t),a.push(o)}return null}catch(t){let r=[];for(let t of a)try{await e.writeFile(t.uri,t.textDocument.getText())}catch{r.push(t.uri.fsPath)}let o=`The edit was not applied: ${t instanceof Error?t.message:String(t)}`;return r.length>0?`${o}. Restore failed, check ${r.join(`, `)}`:o}}async function applyDocumentEdits(e,t,r){let a=e.shared,o=a.workspace,s=t.toWorkspaceEdit(),l=t.documents,p=l.map(e=>e.uri),g=a.lsp.Connection,_=errorKeys(e);if(!g){let t=await writeFiles(o.FileSystemProvider,l,s);return t?{applied:!1,remaining:[],error:t}:(await o.DocumentBuilder.update(p,[]),{applied:!0,remaining:collectErrors(e,p,_)})}let v=new Map(l.map(e=>[e.uri.toString(),e.textDocument.version])),b=!!Fu.get(a)?.capabilities.workspace?.workspaceEdit?.changeAnnotationSupport,x=await g.workspace.applyEdit({label:r,edit:b?withConfirmation(s,r):s});return x.applied?(await waitForRebuild(e,v),Pu.debug`applied ${r} to ${p.map(e=>D.basename(e)).join(`, `)}`,{applied:!0,remaining:collectErrors(e,p,_)}):(Pu.debug`edit ${r} was not applied: ${x.failureReason}`,{applied:!1,remaining:[],error:x.failureReason??`The edit was not applied`})}function sourceOf(e){let t=A(e);return{document:t,text:t.textDocument.getText()}}function lineStart(e,t){return e.lastIndexOf(`
104
+ `,t-1)+1}function nextLineStart(e,t){let r=e.indexOf(`
105
+ `,t);return r===-1?e.length:r+1}function indentAt(e,t){return/^[ \t]*/.exec(e.slice(lineStart(e,t),t))?.[0]??``}function isFirstOnLine(e,t){return e.slice(lineStart(e,t),t).trim()===``}function isLastOnLine(e,t){return e.slice(t,nextLineStart(e,t)).trim()===``}function linesOf(e,t){let r=e.$cstNode;if(!r)return[];let a=indentAt(sourceOf(e).text,r.offset);return r.text.split(`
106
+ `).map((e,r)=>{let o=r===0?e:e.startsWith(a)?e.slice(a.length):e.trimStart();return o.trim()===``?``:t+o})}var Inserter=class{edits;source;constructor(e,t){this.edits=e,this.source=t}at(e,t){let r=this.source.document.textDocument.positionAt(e);this.edits.add(this.source.document,{range:{start:r,end:r},newText:t})}linesAfter(e,t){let{text:r}=this.source;if(!isLastOnLine(r,e)){this.at(e,`
107
+ `+t.join(`
108
+ `)+`
109
+ `+indentAt(r,e));return}let a=nextLineStart(r,e),o=a===r.length&&!r.endsWith(`
110
+ `);this.at(a,(o?`
111
+ `:``)+t.join(`
112
+ `)+(o?``:`
113
+ `))}linesBefore(e,t){let{text:r}=this.source;isFirstOnLine(r,e)?this.at(lineStart(r,e),t.join(`
114
+ `)+`
115
+ `):this.at(e,`
116
+ `+t.join(`
117
+ `)+`
118
+ `+indentAt(r,e))}};function contentIndent(e,t,r){let a=r.find(t=>t.$cstNode&&isFirstOnLine(e,t.$cstNode.offset));return a?.$cstNode?indentAt(e,a.$cstNode.offset):indentAt(e,t)+` `}function tagsOf(e){return e?me(e).filter(isTagRef).toArray():[]}function tagName(e){return e.$cstNode?.text??`#${e.tag.$refText}`}function metadataLines(e,t){let r=linesOf(e,t),a=r[0];return a!==void 0&&!a.trimStart().startsWith(`metadata`)&&(r[0]=t+`metadata `+a.trimStart()),r}function mergeIntoElement(e,t,r){let a=t.$cstNode;if(!a)return;let o=sourceOf(t),{text:s}=o,l=new Inserter(e,o),p=t.body,g=p?[...p.tags?[p.tags]:[],...p.props,...p.elements]:[],_=contentIndent(s,a.offset,g),v=new Set(tagsOf(p?.tags).map(tagName)),b=tagsOf(r.body.tags).map(tagName).filter(e=>!v.has(e)),x=(p?.props??[]).filter(isLinkProperty),S=r.body.props.filter(isLinkProperty).filter(e=>!x.some(t=>t.value===e.value&&t.title===e.title)).flatMap(e=>linesOf(e,_)),C=r.body.props.find(isMetadataBody),w=p?.props.find(isMetadataBody);C&&!w&&S.push(...metadataLines(C,_));let T=r.body.elements.flatMap(e=>linesOf(e,_));if(!p?.$cstNode){let e=[...b.length>0?[_+b.join(` `)]:[],...S,...T];e.length>0&&l.at(a.end,` {
119
+ `+e.join(`
120
+ `)+`
121
+ `+indentAt(s,a.offset)+`}`);return}let ee=p.$cstNode.offset,te=p.$cstNode.end-1;if(b.length>0){let e=tagsOf(p.tags).at(-1)?.$cstNode;if(e){let t=p.tags?.$cstNode?.text.includes(`,`)?`, `:` `;l.at(e.end,t+b.join(t))}else l.linesAfter(ee+1,[_+b.join(` `)])}if(S.length>0){let e=p.props.at(-1)?.$cstNode,t=p.elements[0]?.$cstNode,r=p.tags?.$cstNode?.end;switch(!0){case!!e:l.linesAfter(e.end,S);break;case!!t:l.linesBefore(t.offset,S);break;case r!==void 0:l.linesAfter(r,S);break;default:l.linesBefore(te,S)}}C&&w?.$cstNode&&mergeMetadata(e,l,s,w,C),T.length>0&&l.linesBefore(te,T)}function mergeMetadata(e,t,r,a,o){let s=a.$cstNode,l=contentIndent(r,s.offset,a.props),p=[];for(let t of o.props){let r=a.props.find(e=>e.key===t.key);r?e.replaceNode(r,t.$cstNode?.text??``):p.push(...linesOf(t,l))}p.length>0&&t.linesBefore(s.end-1,p)}function modelBlockOf(e){for(let t=e;t;t=t.$container){if(isModel(t))return t;if(isExtendElement(t))return modelBlockOf(t.element.el.ref);if(isModelDiff(t))return}}function mainModelBlock(e){let t=e.flatMap(e=>e.parseResult.value.models),rootElements=e=>e.elements.filter(isElement).length;return t.reduce((e,t)=>!e||rootElements(t)>rootElements(e)?t:e,void 0)}function appendToModel(e,t,r){let a=t.$cstNode;if(!a)return;let o=sourceOf(t),s=new Inserter(e,o),l=linesOf(r,contentIndent(o.text,a.offset,t.elements)),p=t.elements.filter(isElement).at(-1)?.$cstNode;isElement(r)&&p?s.linesAfter(p.end,[``,...l]):s.linesBefore(a.end-1,l)}function mergeDiffAdds(e,t,r){let a=mainModelBlock(r),o=[],toModel=(t,r)=>{t?appendToModel(e,t,r):o.push(r)};for(let r of t.adds.flatMap(e=>e.elements)){let t=isExtendElement(r)?r.element.el.ref:void 0;switch(!0){case isExtendElement(r)&&isElement(t)&&!ie(t,isModelDiff):mergeIntoElement(e,t,r);break;case isRelation(r):toModel(modelBlockOf(r.source?.value.ref)??a,r);break;default:toModel(a,r)}}return o}function modelBlockWith(e){return`model {\n${e.flatMap((e,t)=>[...t>0?[``]:[],...linesOf(e,` `)]).join(`
122
+ `)}\n}\n`}function diffRange(e){let t=e.$cstNode;if(!t)return;let{document:r,text:a}=sourceOf(e),o=t.offset;if(isFirstOnLine(a,o))for(o=lineStart(a,o);o>0;){let e=lineStart(a,o-1),t=a.slice(e,o-1).trim();if(!t.startsWith(`//`)&&!t.startsWith(`/*`)&&!t.startsWith(`*`))break;o=e}let s=isLastOnLine(a,t.end)?nextLineStart(a,t.end):t.end;return{start:r.textDocument.positionAt(o),end:r.textDocument.positionAt(s)}}st();function isWithin(e,t){let notAfter=(e,t)=>e.line<t.line||e.line===t.line&&e.character<=t.character;return notAfter(t.start,e.start)&&notAfter(e.end,t.end)}var LikeC4ModelDiffs=class{services;#e=/* @__PURE__ */ new WeakMap;constructor(e){this.services=e}compare(e,t){let r=Ai(this.#e,e,()=>/* @__PURE__ */ new Map);return Ai(r,t,()=>{let r=xa(e,t);return r&&{models:r,views:_a(e,r)}})}async list(e){let t=await this.services.likec4.ModelBuilder.parseModel(e);if(!t)return[];let r=t.$data;return xn(r.diffs??{}).flatMap(e=>{let t=this.compare(r,e.id);return t?[{id:e.id,title:e.title,description:e.description??null,added:{elements:Nt(e.add.elements).length,relations:Nt(e.add.relations).length},removed:{elements:e.remove.elements.length,relations:e.remove.relations.length},modified:{elements:Nt(e.modify.elements).length},views:t.views.filter(e=>e.isAffected).map(e=>({id:e.view.id,title:e.view.title,nodes:e.nodes,edges:e.edges}))}]:[]})}async layoutCompareView(e){let t=await this.services.likec4.ModelBuilder.parseModel(e.projectId);if(!t)return null;let r=this.compare(t.$data,e.diffId)?.views.find(t=>t.view.id===e.viewId);if(!r)return null;let{diagram:a}=await this.services.likec4.Layouter.layout({view:r.view,styles:t.$styles});return a}checkBeforeApply(e,t){let r=this.services.shared.workspace.ProjectsManager.ensureProjectId(t);return{errors:this.diffNodes(r,e).flatMap(e=>{let t=e.$cstNode?.range;return(A(e).diagnostics??[]).filter(e=>e.severity===at.Error&&!!t&&isWithin(e.range,t)).map(e=>typeof e.message==`string`?e.message:e.message.value)}),overlaps:overlapsOf(findDiffOverlaps(this.services.likec4.ModelParser.documents(r).toArray()),e)}}diffNodes(e,t){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).toArray().flatMap(e=>e.parseResult.value.diffs.filter(e=>e.name===t))}addRelationRemovals(e,t,r){if(r.length===0)return;let a=this.services.workspace.AstNodeLocator,o=new Set(r),s=/* @__PURE__ */ new Set,l=this.services.likec4.ModelParser.documents(t).toArray();for(let t of l)for(let r of t.c4Relations){if(!o.has(r.id))continue;s.add(relationFingerprint(r));let l=a.getAstNode(t.parseResult.value,r.astPath);l&&e.deleteNode(l)}for(let t of l)for(let r of t.c4ExtendRelations){let o=s.has(r.id)?a.getAstNode(t.parseResult.value,r.astPath):void 0;o&&e.deleteNode(o)}}async addEdits(e,t,r,a){let o=await this.services.likec4.ModelBuilder.parseModel(a);if(!o)return!1;let s=o.projectId,l=this.diffNodes(s,t);if(l.length===0)return!1;let p=o.$data.diffs?.[t];r===`apply`&&p&&(p.remove.elements.length>0&&await this.services.likec4.RemovalImpact.addEdits(e,p.remove.elements,s,{includeScopedViews:!0,includeDynamicSteps:!0}),this.addRelationRemovals(e,s,p.remove.relations));let g=this.services.shared.workspace.LangiumDocuments.projectDocuments(s).toArray();for(let t of l){let a=diffRange(t);if(!a)continue;let o=r===`apply`?mergeDiffAdds(e,t,g):[];e.add(A(t),{range:a,newText:o.length>0?modelBlockWith(o):``})}return!0}},DocumentEdits=class{#e=/* @__PURE__ */ new Map;get documents(){return[...this.#e.values()].map(e=>e.document)}add(e,t){Ai(this.#e,e.uri.toString(),()=>({document:e,edits:[]})).edits.push(t)}deleteNode(e){if(!e.$cstNode)return;let t=A(e);this.add(t,{range:wholeLinesRange(t,e.$cstNode),newText:``})}replaceNode(e,t){e.$cstNode&&this.add(A(e),{range:e.$cstNode.range,newText:t})}toWorkspaceEdit(){let e={};for(let[t,{document:r,edits:a}]of this.#e)e[t]=withoutOverlaps(r,a);return{changes:e}}preview(){return[...this.#e].flatMap(([e,{document:t,edits:r}])=>{let a=t.textDocument.getText(),o=ce.applyEdits(t.textDocument,withoutOverlaps(t,r));return a===o?[]:[{uri:e,before:a,after:o}]})}};function wholeLinesRange(e,t){let r=e.textDocument,a=r.getText(),{start:o,end:s}=t.range,l=r.offsetAt({line:o.line,character:0}),p=r.offsetAt({line:s.line+1,character:0}),g=a.slice(l,t.offset),_=a.slice(t.end,p);return g.trim()!==``||_.trim()!==``?t.range:{start:{line:o.line,character:0},end:r.positionAt(p)}}function withoutOverlaps(e,t){let r=e.textDocument,a=t.map(e=>({edit:e,start:r.offsetAt(e.range.start),end:r.offsetAt(e.range.end)})).sort((e,t)=>e.start-t.start||t.end-e.end),o=[];for(let e of a){let t=o.some(t=>e.start<t.end&&t.start<e.end),r=o.some(t=>t.start===e.start&&t.end===e.end&&t.edit.newText===e.edit.newText);!t&&!r&&o.push(e)}return o.sort((e,t)=>e.start-t.start||e.end-t.end).map(e=>e.edit)}function isListItem(e){return isExpressions(e)||isFqnExpressions(e)||isImported(e)}function listOwner(e){return listRoot(e).$container}function listRoot(e){let t=e;for(;isListItem(t.$container)&&t.$container.$type===e.$type;)t=t.$container;return t}function listItems(e){let t=[];for(let r=e;r;r=r.prev)t.unshift(r);return t}function itemCst(e){return isImported(e)?e.imported.$refNode:e.value?.$cstNode}function removeListItems(e,t){let r=new Set([...t].map(listRoot));for(let a of r){let r=listItems(a).filter(e=>!!itemCst(e)),o=r.filter(e=>!t.has(e));if(o.length===0){e.deleteNode(a.$container);continue}if(o.length===r.length)continue;let s=A(a),l=s.textDocument.getText(),p=itemCst(r[0]),g=itemCst(r[r.length-1]),_=``;for(let e of o){let t=itemCst(e);if(_!==``){let a=itemCst(r[r.indexOf(e)-1]);_+=l.slice(a.end,t.offset)}_+=l.slice(t.offset,t.end)}e.add(s,{range:{start:p.range.start,end:g.range.end},newText:_})}}function tokenOf(e){return Ji(e.map(e=>`${e.uri}\n${e.after}`).join(`
123
+ `)||`empty`)}function failed(e){return{applied:!1,remaining:[],error:e}}var LikeC4ModelEdits=class{services;#e=[];#t=0;constructor(e){this.services=e}async collect(e,t){let r=new DocumentEdits;if(e.type===`apply-diff`){let a=this.services.likec4.ModelDiffs,{errors:o,overlaps:s}=e.action===`apply`?a.checkBeforeApply(e.diffId,t):{errors:[],overlaps:[]};return o.length>0?{error:`Diff ${e.diffId} has errors, fix them before applying: ${o.join(`; `)}`}:await a.addEdits(r,e.diffId,e.action,t)?{label:`${e.action===`apply`?`Apply`:`Discard`} diff ${e.diffId}`,edits:r,overlaps:s}:{error:`Diff not found: ${e.diffId}`}}let a=await this.services.likec4.RemovalImpact.addEdits(r,e.targets,t,e.options??{});return a.targets.length===0?{error:`Element not found: ${e.targets.join(`, `)}`}:{label:`Safe delete ${a.targets.join(`, `)}`,edits:r,overlaps:[]}}async preview(e,t){let r=await this.collect(e,t);if(`error`in r)return r;let a=r.edits.preview();return{label:r.label,token:tokenOf(a),documents:a,overlaps:r.overlaps}}async apply(e,t){let r=await this.collect(e,t?.projectId);if(`error`in r)return failed(r.error);let{edits:a,label:o,overlaps:s}=r;if(s.length>0&&!(e.type===`apply-diff`&&e.acceptOverlaps))return failed(`${o}: the diff overlaps with other diffs (${s.join(`; `)}). Agree on it with the owners of these diffs, then accept the overlaps.`);let l=a.preview();if(t?.token&&t.token!==tokenOf(l))return failed(`The model changed after the preview. Review the changes again.`);let p=await applyDocumentEdits(this.services,a,o);if(!p.applied||l.length===0)return p;let g={id:++this.#t,label:o};return this.#e.push({edit:g,documents:l}),this.#e.splice(0,this.#e.length-20),{...p,edit:g}}async rollback(e){let t=e===void 0?this.#e.length-1:this.#e.findIndex(t=>t.edit.id===e),r=this.#e[t];if(!r)return failed(`There is no edit to roll back`);let a=this.services.shared.workspace.LangiumDocuments,o=new DocumentEdits;for(let e of r.documents){let t=j.parse(e.uri),s=a.getDocument(t),l=s?.textDocument.getText();if(!s||l!==e.after)return failed(`${D.basename(t)} changed after "${r.edit.label}", roll back is not possible`);o.add(s,{range:{start:{line:0,character:0},end:s.textDocument.positionAt(l.length)},newText:e.before})}let s=await applyDocumentEdits(this.services,o,`Roll back: ${r.edit.label}`);return s.applied&&this.#e.splice(t,1),s}};function outermostStep(e){let t=e;for(;isStepOrSeries(t.$container);)t=t.$container;return t}function predicateKind(e){switch(!0){case isImported(e):return`import`;case!!ut(e,isGlobals):return`global`;case!!ut(e,isDeploymentView$1):return`deployment-view-predicate`;default:return`view-predicate`}}function classifyReference(e){if(ie(e,isModelDiff))return{kind:`diff`,fix:null};let t=e;for(let r=e;r;t=r,r=r.$container)switch(!0){case isListItem(r):return{kind:predicateKind(r),fix:{type:`list-item`,item:r}};case isStepOrSeries(r):return{kind:`dynamic-step`,fix:{type:`delete`,node:outermostStep(r)}};case isExtendElement(r):return{kind:`extend-element`,fix:{type:`delete`,node:r}};case isExtendRelation(r):return{kind:`extend-relation`,fix:{type:`delete`,node:r}};case isExtendDeployment(r):return{kind:`extend-deployment`,fix:{type:`delete`,node:r}};case isRelation(r):return{kind:`relation`,fix:{type:`delete`,node:r}};case isDeployedInstance(r):return{kind:`deployed-instance`,fix:{type:`delete`,node:r}};case isDeploymentRelation(r):return{kind:`deployment-relation`,fix:{type:`delete`,node:r}};case isElementView$1(r):return t===r.viewOf?{kind:`view-scope`,fix:{type:`delete`,node:r}}:{kind:`other`,fix:null}}return{kind:`other`,fix:null}}function findSourceReferences(e,t){let r=e.references.References,a=e.shared.workspace.LangiumDocuments,o=e.workspace.AstNodeLocator;return fn(t.flatMap(e=>r.findReferences(e,{includeDeclaration:!1}).toArray()),e=>`${e.sourceUri.toString()}#${e.segment.offset}`).flatMap(e=>{let t=a.getDocument(e.sourceUri),r=t?o.getAstNode(t.parseResult.value,e.sourcePath):void 0;return r?[{...classifyReference(r),uri:e.sourceUri.toString(),range:e.segment.range,node:r}]:[]})}function findElementDefinitions(e,t,r){let a=e.likec4.FqnIndex,o=e.shared.workspace.LangiumDocuments,s=e.workspace.AstNodeLocator;return r.flatMap(e=>a.byFqn(t,e).toArray().flatMap(e=>{let t=o.getDocument(e.documentUri),r=t?s.getAstNode(t.parseResult.value,e.path):void 0;return r&&isElement(r)&&!ie(r,isModelDiff)?[r]:[]}))}function resolutionOf({kind:e,fix:t}){switch(!0){case!t:return`manual`;case e===`view-scope`:case e===`dynamic-step`:return`optional`;default:return`removed`}}function describe(e){let t=(e.$cstNode?.text??``).replace(/\s+/g,` `).trim();return t.length>80?t.slice(0,77)+`...`:t}function describedNode({fix:e,node:t}){switch(e?.type){case`list-item`:return listOwner(e.item);case`delete`:return e.node;default:return t}}var LikeC4RemovalImpact=class{services;constructor(e){this.services=e}async impactOf(e,t,r){let a=await this.services.likec4.ModelBuilder.computeModel(t),o=ya(a,e);return r&&o.orphans.length>0&&(o=ya(a,[...o.targets,...o.orphans])),{model:a,impact:o}}collect(e,t){let r=findElementDefinitions(this.services,e,t.elements),a=new Set(r),isRemoved=e=>ie(e.node,e=>a.has(e)),o=findSourceReferences(this.services,r).filter(e=>!isRemoved(e)),s=o.flatMap(e=>e.kind===`deployed-instance`&&e.fix?.type===`delete`?[e.fix.node]:[]),l=findSourceReferences(this.services,s).filter(e=>!isRemoved(e));return{definitions:r,references:fn([...o,...l],e=>e.fix?.type===`list-item`?e.fix.item:e.fix?.node??e.node)}}async analyze(e,t){let{model:r,impact:a}=await this.impactOf(e,t,!1);if(a.targets.length===0)return null;let o=r.projectId,{references:s}=this.collect(o,a);return{projectId:o,impact:a,references:s.map(e=>({kind:e.kind,location:{uri:e.uri,range:e.range},text:describe(describedNode(e)),resolution:resolutionOf(e)}))}}async impactView(e,t){let{model:r,impact:a}=await this.impactOf(e,t,!1);if(a.targets.length===0)return null;let o=Sa(ga(r,wa(r,a)),a),{diagram:s}=await this.services.likec4.Layouter.layout({view:{...o,id:Yr(`removal-impact`),title:`Removal impact of ${a.targets.join(`, `)}`,hash:``,_type:`element`},styles:r.$styles});return s}async addEdits(e,t,r,a){let{model:o,impact:s}=await this.impactOf(t,r,!!a.includeOrphans),{definitions:l,references:p}=this.collect(o.projectId,s);for(let t of l)e.deleteNode(t);let isSkipped=({kind:e})=>e===`view-scope`&&!a.includeScopedViews||e===`dynamic-step`&&!a.includeDynamicSteps,g=/* @__PURE__ */ new Set;for(let t of p){let{fix:r}=t;r&&!isSkipped(t)&&(r.type===`delete`?e.deleteNode(r.node):g.add(r.item))}return removeListItems(e,g),s}};const Lu=Y.getChild(`commands`),Ru={PreviewRemovalImpact:`likec4.lsp.preview-removal-impact`,SafeDelete:`likec4.lsp.safe-delete`,ApplyDiff:`likec4.lsp.apply-diff`,DiscardDiff:`likec4.lsp.discard-diff`};function isLikeC4Services(e){return`likec4`in e}function readArgs(e){let[t,r]=e;if(typeof t!=`string`||typeof r!=`string`)throw Error(`Invalid command arguments: ${JSON.stringify(e)}`);return[t,r]}var LikeC4ExecuteCommandHandler=class extends Re{shared;constructor(e){super(),this.shared=e}get services(){return _i(this.shared.ServiceRegistry.all.find(isLikeC4Services),`LikeC4 services are not registered`)}registerCommands(e){e(Ru.PreviewRemovalImpact,async e=>{let[t,r]=readArgs(e);await this.services.Rpc.requestRemovalImpact({projectId:t,fqn:Hr(r)})});let edit=(t,r,a)=>e(t,async e=>{let[t,o]=readArgs(e),s=await this.services.likec4.ModelEdits.apply(a(o),{projectId:t});return this.report(r,s),s});edit(Ru.SafeDelete,`Safe delete`,e=>({type:`safe-delete`,targets:[e]})),edit(Ru.ApplyDiff,`Apply diff`,e=>({type:`apply-diff`,diffId:Vr(e),action:`apply`})),edit(Ru.DiscardDiff,`Discard diff`,e=>({type:`apply-diff`,diffId:Vr(e),action:`discard`}))}report(e,{error:t,remaining:r}){let a=this.shared.lsp.Connection?.window;switch(!0){case!!t:Lu.warn`${e} failed: ${t}`,a?.showWarningMessage(`LikeC4: ${e} failed: ${t}`);break;case r.length>0:a?.showWarningMessage(`LikeC4: ${e} left ${r.length} error(s) to fix manually`)}}};function refactor(e,t){return q.CodeAction.create(e,t,q.CodeActionKind.Refactor)}const{findLeafNodeAtOffset:zu,getStartlineNode:Bu}=ct;var LikeC4CodeActionProvider=class{services;constructor(e){this.services=e}getCodeActions(e,t,r){let a=e.parseResult.value.$cstNode;if(!a)return;let o=e.textDocument.offsetAt(t.range.start),s=zu(a,o)?.astNode,l=projectIdFrom(e);if(isElement(s)&&!ie(s,isModelDiff)){let e=this.services.likec4.FqnIndex.getFqn(s),t=refactor(`Preview removal impact of '${e}'`,q.Command.create(`Preview removal impact`,Ru.PreviewRemovalImpact,l,e));return[...clientPreviewsRemovalImpact(this.services.shared)?[t]:[],refactor(`Safe delete '${e}'`,q.Command.create(`Safe delete`,Ru.SafeDelete,l,e))]}if(isModelDiff(s))return[refactor(`Apply diff '${s.name}' to the model`,q.Command.create(`Apply diff`,Ru.ApplyDiff,l,s.name)),refactor(`Discard diff '${s.name}'`,q.Command.create(`Discard diff`,Ru.DiscardDiff,l,s.name))];if(t.context.triggerKind!==q.CodeActionTriggerKind.Invoked)return;let p=e.textDocument.offsetAt(t.range.end),g=zu(a,p);if(!g||g.hidden||!isMarkdownOrString(g.astNode))return;let _=g.astNode;if(_.text!==void 0){let t=Bu(g),r=` `.repeat(t.range.start.character),a=g.text.slice(0,1).repeat(3),o=Pn(_.text).split(`
124
+ `).map(e=>r+` `+e);return[q.CodeAction.create(`Convert to Markdown`,{changes:{[e.textDocument.uri]:[q.TextEdit.replace(g.range,[a,...o,r+a].join(`
125
+ `))]}},q.CodeActionKind.QuickFix)]}return[]}};st();const Vu=Y.getChild(`SemanticTokenProvider`),Hu={...rt},Uu={...Ze};function createSemanticTypeMethods(e){let t=[],r=new Proxy({},{get(a,o){if(o===`modifier`)return e=>(t.push(e),r);if(o in Uu)return t.push(Uu[o]),r;if(o in Hu)return()=>e(Hu[o],t);throw Error(`Unknown semantic token type or modifier: ${o}`)}});return r}const Wu=`Stop Highlighting`,stopHighlight=()=>{throw Wu};var LikeC4SemanticTokenProvider=class extends We{services;rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let r={predicate:e,highlightFn:t};this.rules.push(r)};when(isRelationshipKind,e=>{e.property(`name`).function()}),when(Fr(isRelation,isOutgoingRelationExpr,isDeploymentRelation),e=>{e.property(`kind`).function()}),when(isLibIcon,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(Fr(isNavigateToProperty,isRelationNavigateToProperty),e=>{e.property(`value`).readonly.definition.interface()}),when(isWildcardExpression,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(isFqnRefExpr,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(isTagRef,e=>{e.cst().type()}),when(isRelationKindDotRef,e=>{e.cst().function()}),when(isWhereRelationKind,e=>{P(e.node.value?.$refText)&&e.property(`value`).function()}),when(Fr(isWhereElementMetadata,isWhereRelationMetadata,isWhereRelationParticipantMetadata),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(Fr(isWhereElementTag,isWhereElementKind,isWhereRelationTag,isWhereRelationKind),e=>{P(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(Fr(isWhereRelationParticipantKind,isWhereRelationParticipantTag,isWhereRelationParticipantMetadata),e=>{e.property(`participant`).keyword()}),when(isElementKindExpression,e=>{P(e.node.kind)&&e.property(`kind`).definition.type()}),when(Fr(isGlobalStyleGroup,isGlobalStyle),e=>{e.property(`id`).readonly.definition.variable()}),when(isViewRuleGlobalStyle,e=>{e.property(`style`).readonly.definition.variable()}),when(Fr(isGlobalPredicateGroup,isGlobalDynamicPredicateGroup),e=>{e.property(`name`).readonly.definition.variable()}),when(isViewRuleGlobalPredicateRef,e=>{e.property(`predicate`).readonly.definition.variable()}),when(isElementTagExpression,e=>{P(e.node.tag)&&e.property(`tag`).definition.type()}),when(Fr(isFqnRef,isStrictFqnRef),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),when(isStrictFqnElementRef,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(isSpecificationColor,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(isSpecificationTag,e=>{(P(e.node.color)||P(e.node.themeColor)||P(e.node.customColor))&&e.keyword(`color`).property(),P(e.node.customColor)&&e.property(`customColor`).enum(),P(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(Fr(isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind),e=>{e.property(`kind`).readonly.declaration.type()}),when(isTag,e=>{e.property(`name`).definition.type()}),when(isOpacityProperty,e=>{e.property(`value`).number()}),when(isIconProperty,e=>{e.node.libicon||e.node.value===`none`?e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum():e.property(`value`).string()}),when(Fr(isLinkProperty,isDescriptionFileProperty),e=>{P(e.node.value)&&e.property(`value`).string()}),when(Fr(isColorProperty,isIconColorProperty),e=>{P(e.node.customColor)&&e.property(`customColor`).enum(),P(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>isAnyProperty(e)&&!Fr(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(e)&&P(e.key),e=>e.property(`key`).property()),when(Fr(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isIconSizeProperty,isSizingProperty,isDynamicViewDisplayVariantProperty),e=>{P(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(Fr(isElement,isDeploymentNode$1,isDeployedInstance)(e))return this.highlightNameAndKind(e);if(isLikeC4View(e))return this.highlightView(e);let r;for(let{predicate:t,highlightFn:a}of this.rules)if(t(e))try{r??=this.mark(e),a(r)}catch(t){if(t===Wu)return`prune`;Vu.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){this.mark(e).property(`name`).declaration.readonly.variable(),isDeployedInstance(e)||this.mark(e).property(`kind`).keyword(),isElement(e)?e.props.length>0&&this.mark(e).property(`props`).string():e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){let cst=t=>createSemanticTypeMethods((r,a)=>this.highlightToken({range:Bi(t??e.$cstNode,`AST node has no CST node`).range,type:r,modifier:a})),keyword=t=>createSemanticTypeMethods((r,a)=>this.highlightKeyword({node:e,keyword:t,type:r,modifier:a})),property=(t,r)=>createSemanticTypeMethods((a,o)=>this.highlightProperty({node:e,property:t,type:a,modifier:o,...r===void 0?{}:{index:r}}));return{node:e,cst,keyword,property}}};const Gu=Fr(isElement,isExtendElement);var FqnIndex=class extends ADisposable{services;projects;langiumDocuments;documentCache;workspaceCache;logger=Y.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.onDispose(this.documentCache=new ae,this.workspaceCache=new he,e.shared.workspace.DocumentBuilder.onDocumentResetBelow(E.IndexedContent,({doc:t})=>{this.documentCache.delete(t.textDocument.uri)&&this.logger.isEnabledFor(`trace`)&&this.logger.trace(`clear cache for ${e.shared.workspace.WorkspaceManager.relativePath(t.textDocument.uri)}`)}),e.shared.workspace.DocumentBuilder.onDocumentPhase(E.IndexedContent,e=>{isLikeC4LangiumDocument(e)&&(this.documentCache.set(e.textDocument.uri,this.createDocumentIndex(e)),e.likec4ProjectId&&this.workspaceCache.clear(e.likec4ProjectId))}),e.shared.workspace.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&gn(t,e=>this.documentCache.delete(e.toString())),this.workspaceCache.clear()}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=E.IndexedContent)}get(e){return e.state<E.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:D.basename(e.uri),state:e.state,expect:E.IndexedContent}),this.documentCache.get(e.textDocument.uri,()=>{let t=this.createDocumentIndex(e);return this.workspaceCache.clear(t.projectId),t})}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){W(isElement(e)||isDeploymentElement(e));let t=$l.readId(e);if(P(t))return t;let r=A(e);return r.state<E.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:D.basename(r.uri)}),this.updateDocumentIndex(r),_i($l.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return w(this.workspaceCache.get(e,`fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}elements(e){return w(this.workspaceCache.get(e,`elements`,()=>this.documents(e).flatMap(e=>this.get(e).elements()).toArray()))}rootElements(e){return w(this.workspaceCache.get(e,`rootElements`,()=>{let t=new Si;for(let r of this.documents(e))for(let e of this.get(r).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return w(this.workspaceCache.get(e,`directChildrenOf:${t}`,()=>{let r=new Si;for(let a of this.documents(e))for(let e of this.get(a).children(t))r.set(e.name,e);return uniqueByName(r)}))}uniqueDescedants(e,t){return w(this.workspaceCache.get(e,`uniqueDescedants:${t}`,()=>{let r=new Si,a=new Si;for(let o of this.documents(e)){let e=this.get(o);for(let a of e.children(t))r.set(a.name,a);for(let r of e.descendants(t))a.set(r.name,r)}let o=uniqueByName(r),s=[...a.associations()].flatMap(([e,t])=>t.length===1&&!r.has(e)?t:[]);return[...o,...Ki(s)]}))}updateDocumentIndex(e){W(isLikeC4LangiumDocument(e));let t=this.createDocumentIndex(e);this.documentCache.set(e.textDocument.uri,t),this.workspaceCache.clear(t.projectId),e.state<E.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:D.basename(e.uri),state:e.state,expect:E.IndexedContent})}createDocumentIndex(e){let{models:t,diffs:r}=e.parseResult.value,a=[...t,...r.flatMap(e=>e.adds)].flatMap(e=>e.elements.filter(Gu));if(a.length===0)return Ku.EMPTY;let o=e.likec4ProjectId??this.projects.ownerProjectId(e),s=[],l=new Si,p=new Si,g=new Si,_=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,r,a)=>{let s=Object.assign(_.createDescription(t,r,e),{id:a,likec4ProjectId:o});return $l.writeId(t,a),g.set(a,s),s};function traverseElement(e,t){let r=Or(e.name,t),a=createAndSaveDescription(e,e.name,r);t?l.set(t,a):s.push(a);let o=M(e.body?.elements??[],Gu);if(!R(o,1))return[a];let g=zt(o,e=>traverseElement(e,r));for(let e of g)p.set(r,e);return[a,...g]}function traverseExtendElement(e){let t=readStrictFqn(e.element),r=I(e.body?.elements??[],M(isElement),zt(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...Ci(t)])for(let t of r)p.set(e,t)}for(let t of a)try{if(isExtendElement(t)){traverseExtendElement(t);continue}traverseElement(t,null)}catch(r){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:t.$type,doc:D.basename(e.uri),error:r})}return new Ku(s,l,p,g,o)}};function compareNaturalByName(e,t){return Ti(e.name,t.name)}function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort(compareNaturalByName)}var Ku=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new Si,new Si,new Si,au.DefaultProjectId);constructor(e,t,r,a,o){this._rootElements=e,this._children=t,this._descendants=r,this._byfqn=a,this.projectId=o}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}elements(){return[...this._byfqn.values()]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const qu=oi(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{services;Names;logger=Y.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(qu));if(t.length===0)return Ku.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),a=[],o=new Si,s=new Si,l=new Si,p=this.Names,g=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,a,o)=>{let s={...g.createDescription(t,a,e),id:o,likec4ProjectId:r};return $l.writeId(t,o),l.set(o,s),s};function traverseElement(e,t){let r=p.getName(e);if(!P(r))return[];let l=Hr(r,t),g=createAndSaveDescription(e,r,l);if(t?o.set(t,g):a.push(g),isDeployedInstance(e))return[g];let _=M(e.body?.elements??[],qu);if(!R(_,1))return[g];let v=zt(_,e=>traverseElement(e,l));for(let e of v)s.set(l,e);return[g,...v]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),r=I(e.body?.elements??[],M(qu),zt(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...$r(t)])for(let t of r)s.set(e,t)}for(let r of t)try{if(isExtendDeployment(r)){traverseExtend(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:D.basename(e.uri),error:t})}return new Ku(a,o,s,l,r)}};function toDescriptionFileURI(e){return j.isUri(e)?e.toString():e}function toDocumentURI(e){return j.isUri(e)?e.toString():e.uri.toString()}const Ju=Y.getChild(`description-files`);function hasBeenRead(e){return`content`in e}function hasContent(e){return hasBeenRead(e)&&`md`in e.content}function hasError(e){return hasBeenRead(e)&&`error`in e.content}var LikeC4DescriptionFiles=class extends ADisposable{services;files=/* @__PURE__ */ new Map;docReferences=new ae;descriptionFileUpdatedEmitter;constructor(e){super(),this.services=e,this.onDispose(C.create(()=>{this.clearCaches()}),this.docReferences,this.descriptionFileUpdatedEmitter=new Be.Emitter,e.shared.workspace.DocumentBuilder.onDocumentResetBelow(E.Linked,({doc:e})=>{this.clearDocumentReferences(toDocumentURI(e))}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCaches()}),e.likec4.ModelParser.onDocumentParsed(({doc:e})=>{this.processDocumentReferences(e)}),e.shared.lsp.DocumentUpdateHandler.onWatchedFilesChangeBy(({uri:e})=>this.files.has(toDescriptionFileURI(e)),e=>this.onDescriptionFilesChange(e)),e.shared.workspace.DocumentBuilder.onUpdate((e,t)=>{gn(t,e=>{this.clearDocumentReferences(toDocumentURI(e))})}))}clearCaches(){this.#e&&=(clearTimeout(this.#e),void 0),this.files.clear(),this.docReferences.clear()}isReferenced(e){return(this.files.get(toDescriptionFileURI(e))?.referencedBy.size??0)>0}hashReferences(e){if(e.c4DescriptionFiles.size===0)return`<no-references>`;this.processDocumentReferences(e);let t=I([...e.c4DescriptionFiles],nn((e,t)=>{let r=this.read(toDescriptionFileURI(t));return r.hash&&(e[t]=r.hash),e},{_count:e.c4DescriptionFiles.size.toString()}));return Hi(t)}readMarkdown(e){if(e)try{let t=this.read(toDescriptionFileURI(e));return t&&hasContent(t)?t.content:void 0}catch(t){Ju.warn(`Failed to read description file ${e}`,{error:t});return}}onDescriptionFilesChange(e){let t=[];for(let r of e){let e=toDescriptionFileURI(r.uri),a=this.files.get(e);if(a){for(let e of a.referencedBy)t.push({projectId:this.services.shared.workspace.ProjectsManager.ownerProjectId(e),doc:e});this.files.delete(e),r.type!==q.FileChangeType.Deleted&&Object.assign(this.getFile(e),{referencedBy:a.referencedBy})}}I(t,Yt(z(`projectId`)),wn(e=>_n(e.map(e=>e.doc))),Bt((e,t)=>{try{this.descriptionFileUpdatedEmitter.fire({projectId:t,docs:V(e,e=>j.parse(e))})}catch(e){Ju.warn(`Failed to notify about changed description files of ${t}`,{error:e})}}))}get onDescriptionFileUpdate(){return this.descriptionFileUpdatedEmitter.event}clearDocumentReferences(e){this.docReferences.has(e)&&(this.docReferences.get(e)?.descriptionFiles.forEach(t=>{this.clearReferencedBy(t,e)}),this.docReferences.delete(e))}clearReferencedBy(e,t){let r=this.files.get(e);r&&r.referencedBy.has(t)&&(r.referencedBy.delete(t),r.referencedBy.size===0&&this.scheduleCleanup())}processDocumentReferences(e){let t=toDocumentURI(e);if(e.c4DescriptionFiles.size===0){this.clearDocumentReferences(t);return}let r=e.c4DescriptionFiles,a=this.docReferences.get(t)?.descriptionFiles;a&&a!==r&&Oi(a,r).forEach(e=>{this.clearReferencedBy(e,t)});for(let e of r)try{this.getFile(e).referencedBy.add(t)}catch(e){Ju.warn(loggable(e))}this.docReferences.set(t,{descriptionFiles:r})}getFile(e){let t=toDescriptionFileURI(e),r=this.files.get(t);if(!r){let e=j.parse(t);r=this.services.shared.workspace.WorkspaceManager.isInsideWorkspace(e)?{uri:e,referencedBy:/* @__PURE__ */ new Set}:{uri:e,referencedBy:/* @__PURE__ */ new Set,content:{error:`File "${t}" is outside of the workspace`}},this.files.set(t,r)}return r}read(e){let t=toDescriptionFileURI(e),r=this.getFile(t);if(hasBeenRead(r))return r;let a=this.readContent(r);return this.files.set(t,a),a}readContent(e){try{let t=this.services.shared.workspace.FileSystemProvider.readFileSync(e.uri);return{uri:e.uri,referencedBy:e.referencedBy,content:{md:t},hash:Ji(t||`<empty>`)}}catch(t){return{uri:e.uri,referencedBy:e.referencedBy,content:{error:t instanceof Error?t.message:String(t)}}}}#e;scheduleCleanup(){this.#e&&clearTimeout(this.#e),this.#e=setTimeout(()=>{this.#e=void 0,this.cleanup()},5e3).unref()}cleanup(){for(let[e,t]of[...this.files.entries()])t.referencedBy.size===0&&(Ju.trace(`Cleaning up unreferenced description file: ${e}`),this.files.delete(e))}hasContent=hasContent;hasError=hasError};const Yu=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Yu.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}function applyBidirectional(e,t){return t?{...e,isBidirectional:t,tail:e.tail??e.head??`normal`}:e}var MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new Si(Set);projectId;inferTechFromIcon;descriptionFileResolver;constructor(e,t){this.descriptionFileResolver=t?.descriptionFile??(()=>void 0);let r={},a=[];for(let t of e){let{c4Specification:e,c4Globals:o,c4Imports:s}=t,l=t.likec4ProjectId;Ut(l)&&(a.length===0||a[0]!==l)&&a.push(l),Object.assign(r,e.tags);for(let[t,r]of Object.entries(e.elements))this.specs.elements[t]=this.withDescriptionFile(r);for(let[t,r]of Object.entries(e.relationships))this.specs.relationships[t]=this.withDescriptionFile(r);Object.assign(this.specs.colors,e.colors);for(let[t,r]of Object.entries(e.deployments))this.specs.deployments[t]=this.withDescriptionFile(r);Object.assign(this.globals.predicates,o.predicates),Object.assign(this.globals.dynamicPredicates,o.dynamicPredicates),Object.assign(this.globals.styles,o.styles);for(let[e,t]of s)this.imports.set(e,t)}this.tags=wr(r),this.projectId=sn(a),this.inferTechFromIcon=t?.inferTechFromIcon??!0}withDescriptionFile(e){if(Object.hasOwn(e,`descriptionFile`)){let{descriptionFile:t,...r}=e,a=this.descriptionFileResolver(t);return a?{...r,description:a}:r}return e}toModelElement=e=>{let{tags:t,links:r,style:a,id:o,kind:s,title:l,description:p,technology:g,summary:_,metadata:v}=this.withDescriptionFile(e);try{let e=this.specs.elements[s];if(!e)return Y.warn`No kind '${s}' found for ${o}`,null;g??=e.technology,p??=e.description,_??=e.summary,r??=e.links,It(l)&&(l=e.title||zi(o)),e.tags&&Ii(e.tags)&&(t=t?_n([...e.tags,...t]):e.tags);let b=Nr({...e.style,...a});return!g&&this.inferTechFromIcon&&(g=deriveTechnologyFromIcon(b.icon)),Nr({metadata:v&&!N(v)?v:void 0,notation:e.notation,style:b,links:r,tags:t,summary:_,technology:g,description:p,title:l,kind:s,id:o})}catch(e){logWarnError(e)}return null};toModelRelation=e=>{let{astPath:t,source:r,target:a,kind:o,links:s,id:l,title:p,tags:g,isBidirectional:_,...v}=this.withDescriptionFile(e);if(Ut(o)&&this.specs.relationships[o]){let{multiple:e,tags:t,...b}=this.specs.relationships[o];return t&&Ii(t)&&(g=g?_n([...t,...g]):t),applyBidirectional({...b,...v,...s&&{links:s},...g&&{tags:g},title:It(p)?b.title??p:p,source:r,target:a,kind:o,id:l},_)}return applyBidirectional({...s&&{links:s},...v,...g&&{tags:g},source:r,target:a,id:l,title:p},_)};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...this.withDescriptionFile(e),element:H.flatten(e.element)};if(`element`in e)return Y.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return Y.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:r,style:a,title:o,...s}=this.withDescriptionFile(e);return o=o===zi(e.id)&&t.title?t.title:o,Nr({...t,...s,title:o,style:Nr({...t.style,...a}),id:r})}catch(e){logWarnError(e)}return null};toDeploymentRelation=e=>{let{astPath:t,source:r,target:a,kind:o,links:s,id:l,tags:p,isBidirectional:g,..._}=this.withDescriptionFile(e);if(Ut(o)&&this.specs.relationships[o]){let{multiple:e,tags:t,...v}=this.specs.relationships[o];return t&&Ii(t)&&(p=p?_n([...t,...p]):t),applyBidirectional({...v,..._,...s&&{links:s},...p&&{tags:p},source:r,target:a,kind:o,id:l},g)}return applyBidirectional({...s&&{links:s},..._,...p&&{tags:p},source:r,target:a,id:l},g)}},LastSeenArtifacts=class extends ADisposable{#e=/* @__PURE__ */ new Map;#t=/* @__PURE__ */ new Map;#n=/* @__PURE__ */ new Map;constructor(e){super();let clearCache=()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()};this.onDispose(e.shared.workspace.WorkspaceManager.onForceCleanCache(clearCache),C.create(clearCache))}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,r=e.$styles,a=this.#t.get(t);return a&&a.equals(r)||this.#t.set(t,r),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=/* @__PURE__ */ new Map;for(let r of e)if(ui(r)&&r.viewOf&&L(r.extends)){let e=t.get(r.viewOf)??[];e.push(r.id),t.set(r.viewOf,e)}for(let{id:r,nodes:a}of e)for(let e of a){let a=e.modelRef;if(e.navigateTo||!a)continue;let o=Gt(t.get(a)??[],e=>e!==r);o&&(e.navigateTo=o)}return e}function mergeOverlay(e,t){return t.tags&&(e.tags=_n([...e.tags??[],...t.tags])),t.links&&(e.links=[...e.links??[],...t.links]),t.metadata&&(e.metadata={...e.metadata,...t.metadata}),e}function buildDiffs({docs:e,toModelElement:t,toModelRelation:r,elements:a,relations:o}){let s=e.flatMap(e=>e.c4Diffs);if(s.length===0)return;let l=Yt(xn(o),relationFingerprint),buildDiff=(e,o)=>{let s={},p=qi(e.flatMap(e=>e.elements).map(t).filter(P));for(let e of p){let t=Wi(e.id);t&&!(t in a)&&!(t in s)?Y.debug`Diff ${o}: no parent found for ${e.id}`:s[e.id]=e}let g={};for(let t of e.flatMap(e=>e.extendElements)){let e=s[t.id];e?s[t.id]=Ca(e,mergeOverlay({},t)):t.id in a&&mergeOverlay(g[t.id]??={},t)}let exists=e=>{let t=H.flatten(e);return di(t)||t in a||t in s},_={};for(let t of e.flatMap(e=>e.relations).map(r).filter(P))exists(t.source)&&exists(t.target)?_[t.id]=t:Y.debug`Diff ${o}: invalid relation ${t.id}`;return{id:o,title:e.map(e=>e.title).find(Ut)??null,description:e.map(e=>e.description).find(Ut)??null,remove:{elements:_n(e.flatMap(e=>e.removeElements).map(z(`fqn`)).filter(e=>e in a)),relations:_n(e.flatMap(e=>e.removeRelations).flatMap(({fingerprint:e})=>l[e]??[]).map(z(`id`)))},add:{elements:s,relations:_},modify:{elements:g}}};return wn(Yt(s,z(`id`)),buildDiff)}function createDescriptionFileResolver(e){return t=>e.likec4.DescriptionFiles.readMarkdown(t?.uri)}var MergedExtends=class{mergedData=/* @__PURE__ */ new Map;mergeMetadata(e,t){let r={...e};for(let[e,a]of Object.entries(t)){let t=r[e];if(t===void 0){r[e]=a;continue}let o=Array.isArray(t)?t:[t],s=Array.isArray(a)?a:[a],l=_n([...o,...s]);r[e]=l.length===1?l[0]:l}return r}merge(e){for(let t of e){let{id:e,links:r,tags:a,metadata:o}=t,s=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};r&&s.links.push(...r),a&&(s.tags=_n([...s.tags,...a])),o&&(s.metadata=this.mergeMetadata(s.metadata,o)),this.mergedData.set(e,s)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let r=t.links;e.links&&e.links.length>0&&(r=[...e.links,...r]);let a=t.tags;e.tags&&e.tags.length>0&&(a=_n([...e.tags,...a]));let o=t.metadata;return e.metadata&&(o=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:R(a,1)?a:null,links:R(r,1)?r:null,...!N(o)&&{metadata:o}}}};function buildModelData(e,t,r){let a=createDescriptionFileResolver(e),o=new MergedSpecification(r,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0,descriptionFile:a});o.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(o);let s=wn(o.specs.colors,e=>Tr(e.color)),l=/* @__PURE__ */ new Set,p=new MergedExtends,g=new MergedExtends,_=r.flatMap(e=>e.c4ExtendRelations),v=/* @__PURE__ */ new Set,scanMetadataKeys=e=>{e?.metadata&&Nt(e.metadata).forEach(e=>l.add(e))},b=I(r,zt(e=>(p.merge(e.c4ExtendElements),V(e.c4Elements,o.toModelElement))),M(P),qi,nn((e,t)=>{let r=Wi(t.id);return r&&L(e[r])?(Y.debug`No parent found for ${t.id}`,e):(e[t.id]=p.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),x=I(r,zt(e=>V(e.c4Relations,o.toModelRelation)),M(e=>{if(!e)return!1;let t=H.flatten(e.source),r=H.flatten(e.target);return L(b[t])&&!di(t)||L(b[r])&&!di(r)?(Y.debug`Invalid relation ${e.id}
126
+ source: ${t} resolved: ${!!b[t]}
127
+ target: ${r} resolved: ${!!b[r]}\n`,!1):!0}),V(e=>{let t=relationFingerprint(e),r=_.filter(e=>e.id===t);if(r.length===0)return e;r.forEach(e=>v.add(e.astPath));let a=e.tags?[...e.tags]:[],o=e.links?[...e.links]:[],s=e.metadata?{...e.metadata}:{};for(let e of r){if(e.tags&&a.push(...e.tags),e.links)for(let t of e.links)o.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||o.push(t);if(e.metadata)for(let[t,r]of Object.entries(e.metadata)){let e=s[t];if(e===void 0)s[t]=r;else{let a=Array.isArray(e)?e:[e],o=Array.isArray(r)?r:[r],l=_n([...a,...o]);s[t]=l.length===1?l[0]:l}}}let l=_n(a),p=o;return{...e,...R(l,1)&&{tags:l},...R(p,1)&&{links:p},...!N(s)&&{metadata:s}}}),gn(scanMetadataKeys),Mt(z(`id`))),S=I(r,zt(e=>(g.merge(e.c4ExtendDeployments),V(e.c4Deployments,o.toDeploymentElement))),M(P),qi,nn((e,t)=>{let r=Wi(t.id);return r&&L(e[r])?(Y.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=si(t)?g.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),C=I(r,zt(e=>V(e.c4DeploymentRelations,o.toDeploymentRelation)),M(e=>e?L(S[e.source.deployment])||L(S[e.target.deployment])?(Y.debug`Invalid deployment relation ${e.id}
128
+ source: ${e.source.deployment} resolved: ${!!S[e.source.deployment]}
129
+ target: ${e.target.deployment} resolved: ${!!S[e.target.deployment]}\n`,!1):!0:!1),nn((e,t)=>Vt(e[t.id])?(Y.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let r=e.uri.toString();return e=>{let{id:o,title:s,description:l,descriptionFile:p,astPath:g,..._}=e;return l=a(p)??l,e[Mr]===`element`&&L(s)&&`viewOf`in e&&(s=b[e.viewOf]?.title??null),L(s)&&o===`index`&&(s=`Landscape view`),{...Qt(_,e=>e===void 0),[jr]:`parsed`,sourcePath:D.relative(t.folderUri,r),docUri:r,description:l,title:s,id:o}}}let w=r.flatMap(e=>V(e.c4Views,toC4View(e)));if(w.some(e=>e.id===`index`)||w.unshift({[jr]:`parsed`,[Mr]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=/* @__PURE__ */ new Set;for(let t of w)t[Mr]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(w.map(e=>e.id));for(let r of Nt(b)){if(e.has(r)||di(r))continue;let a=`__`+r.replaceAll(`.`,`_`);t.has(a)||(t.add(a),w.push({[jr]:`parsed`,[Mr]:`element`,id:a,viewOf:r,title:`Auto / ${(b[r]?.title??r).replaceAll(`
130
+ `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let T=I(w,Mt(z(`id`)));w.some(Ir)&&(T=Ta(T));for(let e of _)v.has(e.astPath)||Y.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);let unescapeTitle=e=>e.title.includes(`\\/`)?{...e,title:e.title.replaceAll(`\\/`,`/`)}:e,ee=wn(b,unescapeTitle),te=buildDiffs({docs:r,toModelElement:e=>{let t=o.toModelElement(e);return t&&unescapeTitle(t)},toModelRelation:o.toModelRelation,elements:b,relations:x});return{data:{[jr]:`parsed`,projectId:t.id,project:Nr({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,contactPerson:t.config.contactPerson,metadata:t.config.metadata,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:o.tags,elements:o.specs.elements,relationships:o.specs.relationships,deployments:o.specs.deployments,...l.size>0&&{metadataKeys:[...l].sort(Ti)},customColors:s},elements:ee,relations:x,globals:o.globals,views:T,deployments:{elements:S,relations:C},imports:{},...te&&{diffs:te}},imports:o.imports}}function isRequestedImportedElement(e,t){for(let r of e)if(t.id===r||t.id.startsWith(`${r}.`))return!0;return!1}function importedElementTitles(e){let t=/* @__PURE__ */ new Map;for(let[r,a]of an(e))for(let e of a)t.set(Wr(r,e.id),e.title);return t}function withImportedScopedViewTitles(e,t){let r=importedElementTitles(t);return r.size===0?e:wn(e,e=>{if(e[Qr]===`element`&&e.title===null&&e.viewOf){let t=r.get(e.viewOf);if(t!==void 0)return{...e,title:t}}return e})}var DefaultLikeC4ModelBuilder=class extends ADisposable{services;projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;descriptionFiles;mutex;lastSeen;log;constructor(e){super(),this.services=e,this.log=Y.getChild(`builder`),this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.descriptionFiles=e.likec4.DescriptionFiles,this.lastSeen=e.likec4.LastSeen,this.onDispose(this.cache=new ProjectModelCache(e),C.create(()=>{this.listeners.length=0}),this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}),this.descriptionFiles.onDescriptionFileUpdate(e=>{this.onDescriptionFileUpdate(e)}));let t=rn(Jt(),M(e=>isNotLikeC4Builtin(e)&&!this.projects.isExcluded(e)),V(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(E.Validated,(e,r)=>{let a=t(e);a.length>0&&this.notifyListeners(a)})),this.log.debug`created`}onDescriptionFileUpdate({projectId:e,docs:t}){this.mutex.write(async e=>{for(let e of t){let t=this.services.shared.workspace.LangiumDocuments.getDocument(e);t&&t.state>=E.Linked&&this.DocumentBuilder.resetToState(t,E.ComputedScopes)}await this.DocumentBuilder.update([],[],e)}).then(()=>{for(let t of[e,...this.cache.importersOf(e)])this.notifyListeners(t)},e=>{this.log.warn(`Failed to update document builder`,e)})}documentHash(e){let t=this.descriptionFiles.hashReferences(e)??``;return Ji(e.likec4Parser.hash+t)}projectDocumentsCache(e){let t=this.projects.getProject(e);return this.parser.documents(e).reduce((e,r)=>e===null?{project:t,hash:Ji(t.hash+this.documentHash(r)),docs:[r]}:(e.hash=Ji(e.hash+this.documentHash(r)),e.docs.push(r),e),null)??{project:t,hash:null}}buildModelData(e){let t=typeof e==`string`?this.projectDocumentsCache(e):e;return this.cache.buildModelData(t.project.id,()=>t.hash===null?null:t,({project:e,docs:t})=>{try{return buildModelData(this.services,e,t)}catch{return null}})}parseAndResolveImports(e){let t=this.log.getChild(e);return this.cache.parsedWithImports(e,()=>{let{hash:t,value:r}=this.buildModelData(e)??{};if(!t||!r)return this.cache.setImports(e,[]),null;let a=[...r.imports.associations()].filter(([,e])=>e.size>0).map(([e])=>e);if(this.cache.setImports(e,a),a.length===0)return{hash:t,value:{data:r.data,imports:null}};let o=a.reduce((e,t)=>{let a=r.imports.get(t);if(!a||a.size===0)return e;let o=this.buildModelData(t)?.value?.data;if(o){let r=xn(o.elements).filter(e=>isRequestedImportedElement(a,e));R(r,1)&&(e[t]=r)}return e},{});return It(o)?{hash:t,value:{data:r.data,imports:null}}:{hash:Ji(t+Hi(o)),value:{data:r.data,imports:o}}},({value:{data:e,imports:r}})=>r?{...e,imports:r,views:withImportedScopedViewTitles(e.views,r)}:(t.trace(`unsafeSyncJoinedModelData: no imports`),e))}unsafeSyncParsedModel(e){return this.cache.parsedModel(e,()=>this.parseAndResolveImports(e),({value:e})=>ia.create(e))}unsafeSyncComputeData(e,t=null){let r=this.log.getChild(e);return this.cache.computedData(e,()=>{let r=this.unsafeSyncParsedModel(e);if(!r)return null;let{hash:a,value:o}=r;return{hash:t?Ji(a+t.hash):a,parsedModel:o,manualLayouts:t}},({manualLayouts:e,parsedModel:t})=>{let a=performanceMark(),o=[];for(let a of xn(t.$data.views)){let s=Ea(a,t.$data);if(!s)continue;let l=ba(s,t);l.isSuccess?(e?.views[a.id]&&Object.assign(l.view,{hasManualLayout:!0}),o.push(l.view)):r.warn(loggable(l.error))}return assignNavigateTo(o),r.debug(`computeModel${e?` with manual layouts`:``}: {status} in ${a.pretty}`,{status:`completed`}),{...t.$data,manualLayouts:{...e?.views},[Zr]:`computed`,views:Mt(o,z(`id`))}})}unsafeSyncComputeModel(e,t=null){this.DocumentBuilder.currentPhase<E.Linked&&this.log.warn(`Method called before linking, it is WRONG`),this.cache.of(e).useManualLayouts(t);let r=this.cache.computedModel(e,()=>this.unsafeSyncComputeData(e,t),({value:e})=>ia.create(e));return r?this.lastSeen.rememberModel(r.value):ia.EMPTY.asComputed}async parseModel(e,t){t??=K.CancellationToken.None,e=this.projects.ensureProjectId(e);let r=this.log.getChild(e);return this.DocumentBuilder.currentPhase<E.Linked&&(r.trace`parseModel: waiting for linked`,await this.DocumentBuilder.waitUntil(E.Linked,t),r.trace`parseModel: linked`,await Ce(t)),await this.mutex.read(async()=>{let t=this.unsafeSyncParsedModel(e);return t?t.value:(r.debug`parseModel: returning EMPTY`,ia.EMPTY.asParsed)})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let r=this.log.getChild(e),a=t??K.CancellationToken.None;return this.DocumentBuilder.currentPhase<E.Linked&&(r.trace`computeModel: waiting for linked`,await this.DocumentBuilder.waitUntil(E.Linked,a),r.trace`computeModel: linked`),await this.mutex.read(async()=>{await Ce(a);let t=this.projects.getProject(e),o=await this.manualLayouts.read(t),s=this.unsafeSyncComputeModel(e,o);return s===ia.EMPTY&&e!==au.DefaultProjectId&&r.warn(`computeModel returned EMPTY`),s})}onModelParsed(e){return this.listeners.push(e),C.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){this.log.debug(`clear all caches`),this.cache.clear()}notifyListeners(e){if(this.listeners.length===0)return;let t;t=Tn(e)?I(e,Yt(e=>this.projects.ownerProjectId(e)),an()):[[e,[]]];let r=this.listeners.slice();for(let e of r)for(let[r,a]of t)try{e(r,a)}catch(e){this.log.warn(loggable(e))}}};function getOrCreate$1(e){let t=new xi(e.capacity??50),r;return{reset:()=>{r!==void 0&&(e.logger.trace(`reset latest`),r=void 0),e.onReset?.()},find:(a,o)=>{if(r!==void 0)return e.logger.trace(`use latest`),r;let s=a();if(!s)return r=null;let l=t.get(s.hash);return l?e.logger.trace(`cache hit {hash} (cache size: {size})`,{hash:s.hash,size:t.size}):(e.logger.trace(`cache miss, create {hash} (cache size: {size})`,{hash:s.hash,size:t.size+1}),l={hash:s.hash,value:o(s)},t.set(s.hash,l)),r=l}}}e(getOrCreate$1,`getOrCreate`);function createProjectCache(e,t){let r=Y.getChild([`builder`,e]),a=getOrCreate$1({logger:r.getChild(`buildData`),onReset:()=>{o.reset(),t?.()}}),o=getOrCreate$1({logger:r.getChild(`joinedData`),onReset:()=>{s.reset(),l.reset()}}),s=getOrCreate$1({logger:r.getChild(`parsedModel`),onReset:()=>{l.reset()}}),l=getOrCreate$1({logger:r.getChild(`computedData`),onReset:()=>{p.reset()}}),p=getOrCreate$1({logger:r.getChild(`computedModel`)}),g=null;return{buildData:a,joinedData:o,computedData:l,parsedModel:s,computedModel:p,useManualLayouts:e=>{let t=e?.hash??null;t!==g&&(g=t,l.reset())},reset:()=>{p.reset(),l.reset(),s.reset(),o.reset(),a.reset()}}}var ProjectModelCache=class extends ae{constructor(e){super(),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Linked,async t=>{let r=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.of(r).buildData.reset()})),this.onDispose(e.likec4.DescriptionFiles.onDescriptionFileUpdate(({projectId:e})=>{this.of(e).buildData.reset()})),this.onDispose(e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.of(e).computedData.reset()})),this.onDispose(e.likec4.ModelParser.onReparsedAfterValidation(({doc:t})=>{let r=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.of(r).buildData.reset()})),this.onDispose(e.shared.workspace.DocumentBuilder.onUpdate((t,r)=>{if(r.length>0){let t=e.shared.workspace.ProjectsManager,a=_n(V(r,t.ownerProjectId.bind(t)));if(!R(a,1))return;for(let e of a)this.of(e).reset(),this.setImports(e,[])}}))}importedBy=/* @__PURE__ */ new Map;of(e){return this.get(e,()=>createProjectCache(e,()=>this.resetImportedBy(e)))}setImports(e,t){for(let t of this.importedBy.values())t.delete(e);for(let r of t){if(r===e)continue;let t=this.importedBy.get(r);t||(t=/* @__PURE__ */ new Set,this.importedBy.set(r,t)),t.add(e)}}importersOf(e){let t=/* @__PURE__ */ new Set([e]),r=[e],a;for(;a=r.pop();)for(let e of this.importedBy.get(a)??[])t.has(e)||(t.add(e),r.push(e));return t.delete(e),[...t]}resetImportedBy(e){let t=/* @__PURE__ */ new Set([e]),r=[e],a;for(;a=r.pop();)for(let e of this.importedBy.get(a)??[])t.has(e)||(t.add(e),r.push(e),this.of(e).joinedData.reset())}clear(){this.importedBy.clear(),super.clear()}buildModelData(e,t,r){return this.of(e).buildData.find(t,r)}parsedWithImports(e,t,r){return this.of(e).joinedData.find(t,r)}parsedModel(e,t,r){return this.of(e).parsedModel.find(t,r)}computedData(e,t,r){return this.of(e).computedData.find(t,r)}computedModel(e,t,r){return this.of(e).computedModel.find(t,r)}};const{findNodeForKeyword:Xu,findNodeForProperty:Zu,findNodesForProperty:Qu}=Te,{getDocument:$u,streamAllContents:ed}=ee,td=Y.getChild(`locator`);var LikeC4ModelLocator=class{services;fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,r;if(e.length===2?(t=e[0],r=e[1]):(t=e[0],r=Ft(t)?this.projects.ensureProjectId():projectIdFrom(t)),Ft(t)){let e=t,a=this.fqnIndex.byFqn(r,e).head();if(!a)return null;let o=this.langiumDocuments.getDocument(a.documentUri),s=this.findParsedElementByFqnIn(e,o);return s&&o?{projectId:r,element:s,document:o}:null}let a=this.fqnIndex.getFqn(t),o=$u(t),s=this.findParsedElementByFqnIn(a,o);return s&&o?{projectId:r,element:s,document:o}:null}catch(e){return td.debug(loggable(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t,r){let[a,o]=yi(e);a??=this.projects.ensureProjectId(t);let s=this.fqnIndex.byFqn(a,o).head(),l=s?.nameSegment??s?.selectionSegment;return!s||!l?null:{uri:s.documentUri.toString(),range:r&&this.propertyRange(s,r)||l.range}}propertyRange(e,t){let r=this.langiumDocuments.getDocument(e.documentUri);if(!r)return;let a=this.services.workspace.AstNodeLocator.getAstNode(r.parseResult.value,e.path);if(!isElement(a)&&!isDeploymentNode$1(a)&&!isDeployedInstance(a))return;let o=(isElement(a)?[`title`,`summary`,`technology`]:[`title`,`summary`]).indexOf(t),s=isElement(a)?a.props[o]:o===0?a.title:a.summary,l=o>=0&&s!==void 0&&(t!==`summary`||s!==``)?isElement(a)?Qu(a.$cstNode,`props`)[o]:Zu(a.$cstNode,t):void 0;if(l)return l.range;let p=a.body?.props??[];switch(!0){case t===`tags`:return a.body?.tags?.$cstNode?.range;case t===`metadata`:return p.find(isMetadataProperty)?.$cstNode?.range;case t===`description`&&p.some(isDescriptionFileProperty):return p.findLast(isDescriptionFileProperty)?.$cstNode?.range;case t===`links`||t===`link`:return p.find(isLinkProperty)?.$cstNode?.range;case t===`icon`:{let{isValid:e}=this.parser.forDocument(r),t=p.find(isIconProperty),a=p.find(isElementStyleProperty)?.props.filter(isIconProperty).findLast(e);return(t&&e(t)?t:a??t)?.$cstNode?.range}default:{let e=p.filter(e=>`key`in e&&e.key===t);return(e.every(isElementStringProperty)?e.at(-1):e[0])?.$cstNode?.range}}}locateDeploymentElement(e,t,r){let a=this.projects.ensureProjectId(t),o=e,s=this.deploymentsIndex.byFqn(a,o).head(),l=s?.nameSegment??s?.selectionSegment;return!s||!l?null:{uri:s.documentUri.toString(),range:r&&this.propertyRange(s,r)||l.range}}locateRelation(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!r)continue;let a=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(!isRelation(a)&&!isDeploymentRelation(a))continue;let o=a.kind?Zu(a.$cstNode,`kind`):void 0;if(o??=a.dotKind?Zu(a.$cstNode,`dotKind`):void 0,o??=Xu(a.$cstNode,`->`),o??=Zu(a.$cstNode,`title`),o??=Zu(a.$cstNode,`target`),o??=a.$cstNode,o)return{uri:t.uri.toString(),range:{start:o.range.start,end:o.range.start}}}return null}locateViewAst(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Views.find(t=>t.id===e);if(!r)continue;let a=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(isLikeC4View(a))return{doc:t,view:r,viewAst:a}}return null}locateView(e,t){let r=this.locateViewAst(e,t);if(!r)return null;let a=r.viewAst,o=a.name?Zu(a.$cstNode,`name`):void 0;return o??=Xu(a.$cstNode,`view`),o??=a.$cstNode,o?{uri:r.doc.uri.toString(),range:{start:o.range.start,end:o.range.start}}:null}async locateDocumentTags(e,t){let r=this.langiumDocuments.getDocument(e);if(!r||!r.likec4ProjectId)return null;r.state<E.Linked&&(td.debug(`Waiting for document ${r.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(E.Linked,r.uri,t));let a=projectIdFrom(r);td.trace`locate document tags for ${r.uri.fsPath} in project ${a}`;try{let e=this.services.likec4.LastSeen.specification(a)?.tags,t=this.services.likec4.LastSeen.styles(a)??br.DEFAULT;if(!e)return td.trace(`No specification or styles found for project ${a}, cannot locate tags for document ${r.uri.fsPath}`),null;let o=I(ed(r.parseResult.value),Ni(e=>isTag(e)||isTagRef(e)),Yi(),zt(r=>{let a,o;try{isTag(r)?(a=r.name,o=r.$cstNode):(a=r.tag.$refText,o=r.tag.$refNode);let s=e[a];return Pi(s,`Tag ${a} not found in merged specification`),Pi(o,`Tag ${a} does not have a $cstNode`),{name:a,color:t.tagColor(s.color).fill,range:o.range,isSpecification:isTag(r)}}catch(e){return td.warn(`Fail on tag ${a}`,{err:e}),[]}}));return td.debug(`Found ${o.length} tags in document ${r.uri.path}`),o}catch(e){return td.warn(loggable(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:r}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!r)return null;if(!isDynamicView$1(r)||!r.body)return td.warn(`View ${e.view} is not a dynamic view`),null;let a=this.services.workspace.AstNodeLocator.getAstNodePath(r.body)+e.astPath,o=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,a);if(!o||!isStepOrSeries(o))return td.warn(`Failed to locate dynamic view step ${a} in view ${e.view}`),null;let s=o.kind?Zu(o.$cstNode,`kind`):void 0;return s??=o.dotKind?Zu(o.$cstNode,`dotKind`):void 0,s??=Xu(o.$cstNode,`->`),s??=Xu(o.$cstNode,`<-`),s??=Zu(o.$cstNode,`title`),s??=Zu(o.$cstNode,`target`),s??=o.$cstNode,s?{uri:t.uri.toString(),range:{start:s.range.start,end:s.range.start}}:null}};function*streamDeploymentModel(e){let t=Kr.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),r=[],a;for(;a=t.shift();)if(isDeploymentRelation(a))r.push(a);else{if(a.body&&a.body.elements.length>0)for(let e of a.body.elements)t.push(e);yield a}yield*r}function DeploymentModelParser(e){return class DeploymentModelParser extends e{parseDeployment(){let e=this.doc;for(let t of streamDeploymentModel(e))try{switch(!0){case isDeploymentRelation(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case isDeployedInstance(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case isDeploymentNode$1(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case isExtendDeployment(t):{let r=this.parseExtendDeployment(t);r&&e.c4ExtendDeployments.push(r);break}default:G(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,r=this.resolveFqn(e),a=_i(e.kind.ref,`DeploymentKind not resolved`).name,o=this.parseTags(e.body)??void 0,s=this.parseLinks(e.body),l=this.parseElementStyle(e.body?.props),p=this.getMetadata(e.body?.props.find(isMetadataProperty)),g=I(e.body?.props??[],M(t),M(isElementStringProperty),tn(e=>[e.key,e.value])),{title:_,...v}=this.parseBaseProps(g,{title:e.title,summary:e.summary});return ri({id:r,kind:a,title:_??gi(r),...v,...this.parseDescriptionFile(e.body),tags:o,links:s,style:l,metadata:p})}parseDeployedInstance(e){let t=this.isValid,r=this.resolveFqn(e),a=this.parseFqnRef(e.target.modelElement);W(U.isModelRef(a)||U.isImportRef(a),`Target must be a model reference`);let o=this.parseTags(e.body)??void 0,s=this.parseElementStyle(e.body?.props),l=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=I(e.body?.props??[],M(t),M(isElementStringProperty),tn(e=>[e.key,e.value])),g=this.parseBaseProps(p,{title:e.title,summary:e.summary}),_=this.parseLinks(e.body);return ri({id:r,element:a,tags:o,links:_,...g,style:s,metadata:l,...this.parseDescriptionFile(e.body)})}parseExtendDeployment(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),a=this.parseLinks(e.body);if(!t&&N(r??{})&&!a)return null;let o=this.resolveFqn(e),s=this.getAstNodePath(e);return ri({id:o,astPath:s,metadata:r,tags:t,links:a})}_resolveDeploymentRelationSource(e){if(Vt(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,r=this.getAstNodePath(e),a=this._resolveDeploymentRelationSource(e);W(U.isDeploymentRef(a),`Invalid source for deployment relation`);let o=this.parseFqnRef(e.target);W(U.isDeploymentRef(o),`Invalid target for deployment relation`);let s=this.convertTags(e)??this.convertTags(e.body)??void 0,l=this.convertLinks(e.body),p=(e.kind??e.dotKind?.kind)?.ref?.name,g=this.getMetadata(e.body?.props.find(isMetadataProperty)),_=I(e.body?.props??[],M(isRelationStringProperty),M(e=>P(e.value)),tn(e=>[e.key,e.value])),v=I(e.body?.props??[],M(isRelationNavigateToProperty),Xt())?.value.view.ref?.name,b=this.parseBaseProps(_,{title:e.title}),x=e.body?.props.find(isRelationStyleProperty),S=stringHash$1(`deployment`,this.docUri,r,a.deployment,o.deployment);return ri({id:S,source:a,target:o,isBidirectional:e.isBidirectional||void 0,...b,metadata:g,...this.parseDescriptionFile(e.body),kind:p,tags:s,links:l,...toRelationshipStyle(x?.props,t),navigateTo:v,astPath:r})}}}function DeploymentViewParser(e){return class DeploymentViewParser extends e{parseDeploymentView(e){let t=e.body;W(t,`DynamicElementView body is not defined`);let r=t.props.filter(this.isValid),a=this.getAstNodePath(e),o=e.name;o||=`deployment_`+stringHash$1(this.doc.uri.toString(),a);let s=I(r,M(isViewStringProperty),tn(e=>[e.key,e.value])),{title:l=null,description:p=null}=this.parseBaseProps(s,{title:parseTitleKeepingEscapedSlash(s.title)}),g=this.convertTags(t),_=this.convertLinks(t),v=parseViewOrder(r.find(isViewOrderProperty)),b=parseViewRouting(r,t.rules);return Ql.writeId(e,o),ri({[zr._type]:`deployment`,id:o,astPath:a,title:toSingleLine(l)??null,description:p,...this.parseDescriptionFile(t),...v!==void 0&&{order:v},...b&&{routing:b},tags:g,links:fi(_)?_:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))})}parseDeploymentViewRule(e){if(isDeploymentViewRulePredicate(e))return this.parseDeploymentViewRulePredicate(e);if(isDeploymentViewRuleGroup(e))return this.parseDeploymentViewRuleGroup(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleAncestors(e))return{includeAncestors:e.value};if(isDeploymentViewRuleStyle(e))return this.parseDeploymentViewRuleStyle(e);G(e)}parseDeploymentViewRuleGroup(e){return{title:toSingleLine(e.title)??null,groupRules:this.tryMap(`deployment`,e.groupRules,e=>isDeploymentViewRuleGroup(e)?this.parseDeploymentViewRuleGroup(e):this.parseDeploymentViewRulePredicate(e)),...this.parseStyleProps(e.props)}}parseDeploymentViewRulePredicate(e){let t=[],r=e.expr;for(;r;){try{let e=r.value;Ut(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){logWarnError(e)}r=r.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(isStyleProperty)),r=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...r&&{notation:r}}}}}function*streamModel(e){yield*streamModelElements(e.parseResult.value.models.flatMap(e=>e.elements))}function*streamModelElements(e){let t=Kr.from(e),r=[],a;for(;a=t.shift();)if(isRelation(a))r.push(a);else if(isExtendRelation(a))r.push(a);else{if(a.body?.elements&&R(a.body.elements,1))for(let e of a.body.elements)t.push(e);yield a}yield*r}function ModelParser(e){return class ModelParser extends e{parseModel(){let e=this.doc;for(let t of streamModel(e))try{if(isElement(t)){e.c4Elements.push(this.parseElement(t));continue}if(isRelation(t)){e.c4Relations.push(this.parseRelation(t));continue}if(isExtendElement(t)){let r=this.parseExtendElement(t);r&&e.c4ExtendElements.push(r);continue}if(isExtendRelation(t)){let r=this.parseExtendRelation(t);r&&e.c4ExtendRelations.push(r);continue}G(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,r=this.resolveFqn(e),a=_i(e.kind.ref,`Element kind is not resolved`).name,o=this.parseTags(e.body),s=this.parseElementStyle(e.body?.props),l=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=this.getAstNodePath(e),[g,_,v]=e.props??[],b=I(e.body?.props??[],M(t),M(isElementStringProperty),tn(e=>[e.key,e.value])),{title:x,...S}=this.parseBaseProps(b,{title:Vt(g)?parseInlineTitleKeepingEscapedSlash(e,`props`,0)??g:parseTitleKeepingEscapedSlash(b.title),summary:_,technology:v});return Nr({id:r,kind:a,astPath:p,title:x,metadata:l,tags:o??void 0,links:this.parseLinks(e.body),...S,...this.parseDescriptionFile(e.body),style:s})}parseExtendElement(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),a=this.parseLinks(e.body);if(!t&&It(r)&&!a)return null;let o=this.getAstNodePath(e),s=this.resolveFqn(e);return Nr({id:s,astPath:o,metadata:r,tags:t,links:a})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),r=this.parseFqnRef(e.target);W(H.isModelRef(t)||H.isImportRef(t),`Source must be a model reference`),W(H.isModelRef(r)||H.isImportRef(r),`Target must be a model reference`);let a=this.parseTags(e.body),o=this.getMetadata(e.body?.props.find(isMetadataProperty)),s=this.getAstNodePath(e),l=this.parseLinks(e.body);if(!a&&N(o??{})&&!l)return null;let p=(e.kind??e.dotKind?.kind)?.ref?.name,{title:g=``}=this.parseBaseProps({},{title:e.title}),_=relationFingerprint({source:t,target:r,kind:p,title:g,isBidirectional:e.isBidirectional||void 0});return Nr({id:_,astPath:s,isBidirectional:e.isBidirectional||void 0,metadata:o,tags:a,links:l})}_resolveRelationSource(e){if(Vt(e.source)){let t=this.parseFqnRef(e.source);return W(H.isModelRef(t)||H.isImportRef(t),`Relation source must be a model reference`),t}if(isElementBody(e.$container)||isExtendElementBody(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,r=this._resolveRelationSource(e),a=this.parseFqnRef(e.target);W(H.isModelRef(a)||H.isImportRef(a),`Target must be a model reference`);let o=this.parseTags(e)??this.parseTags(e.body)??void 0,s=this.parseLinks(e.body),l=(e.kind??e.dotKind?.kind)?.ref?.name,p=this.getMetadata(e.body?.props.find(isMetadataProperty)),g=this.getAstNodePath(e),_=I(e.body?.props??[],M(isRelationStringProperty),M(e=>P(e.value)),tn(e=>[e.key,e.value])),v=I(e.body?.props??[],M(isRelationNavigateToProperty),V(e=>e.value.view.ref?.name),M(P),Xt()),{title:b=``,description:x,technology:S}=this.parseBaseProps(_,{title:e.title,description:e.description,technology:e.technology}),C=e.body?.props.find(isRelationStyleProperty),w=stringHash$1(this.docUri,g,H.flatten(r),H.flatten(a));return Nr({id:w,astPath:g,source:r,target:a,isBidirectional:e.isBidirectional||void 0,title:b,metadata:p,kind:l,tags:o,links:s,navigateTo:v,description:x,technology:S,...toRelationshipStyle(C?.props,t),...this.parseDescriptionFile(e.body)})}}}function DiffParser(e){return class DiffParser extends e{parseDiffs(){let e=this.doc;for(let t of e.parseResult.value.diffs)try{e.c4Diffs.push(this.parseDiff(t))}catch(e){this.logError(e,t,`diff`)}}parseDiff(e){let t=I(e.props,M(this.isValid),tn(e=>[e.key,e.value])),{title:r=null,description:a=null}=this.parseBaseProps(t,{title:e.title}),[o,s]=dn(this.tryMap(`diff`,e.removes.flatMap(e=>e.entries),e=>this.parseRemoveEntry(e)),e=>`fqn`in e),l=[],p=[],g=[];for(let t of streamModelElements(e.adds.flatMap(e=>e.elements)))try{switch(!0){case isElement(t):l.push(this.parseElement(t));break;case isRelation(t):p.push(this.parseRelation(t));break;case isExtendElement(t):{let e=this.parseExtendElement(t);e&&g.push(e);break}}}catch(e){this.logError(e,t,`diff`)}return{id:Dr(e.name),title:toSingleLine(r)??null,description:a,removeElements:o,removeRelations:s,elements:l,relations:p,extendElements:g}}parseRemoveEntry(e){let t=this.parseFqnRef(e.source);if(W(H.isElementRef(t),`Removed element must be a model element`),!e.target)return{fqn:H.flatten(t)};let r=this.parseFqnRef(e.target);return W(H.isElementRef(r),`Relation target must be a model element`),{fingerprint:relationFingerprint({source:t,target:r,kind:(e.kind??e.dotKind?.kind)?.ref?.name,title:this.parseBaseProps({},{title:e.title}).title,isBidirectional:e.isBidirectional})}}}}const parseMetadataEquals=({operator:e,not:t},r)=>e?.startsWith(`!=`)?{neq:r}:e?.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r},parseEquals=({operator:e,not:t},r)=>e.startsWith(`!=`)?{neq:r}:e.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r};function parseParticipant(e){return!isWhereRelationParticipantKind(e)&&!isWhereRelationParticipantTag(e)&&!isWhereRelationParticipantMetadata(e)?null:e.participant}function parseWhereClause(e){switch(!0){case isWhereTagEqual(e):{let t=e.value.tag.ref?.name,r=parseParticipant(e);W(t,`Expected tag name`);let a={tag:parseEquals(e,t)};return r?{participant:r,operator:a}:a}case isWhereKindEqual(e):{let t=e.value?.ref?.name,r=parseParticipant(e);W(t,`Expected kind name`);let a={kind:parseEquals(e,t)};return r?{participant:r,operator:a}:a}case isWhereMetadataEqual(e):{let t=e.key,r=parseParticipant(e);W(t,`Expected metadata key`);let a={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return r?{participant:r,operator:a}:a}case isWhereElementNegation(e)||isWhereRelationNegation(e):return{not:parseWhereClause(e.value)};case isWhereBinaryExpression(e):{let t=parseWhereClause(e.left),r=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,r)}default:G(e)}}function createBinaryOperator(e,t,r){if(r===null)return t;switch(e){case`and`:{let e=[ai(t)?t.and:t,ai(r)?r.and:r].flat();return W(fi(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[pi(t)?t.or:t,pi(r)?r.or:r].flat();return W(fi(e),`Expected non-empty array`),{or:e}}default:G(e)}}function ExpressionV2Parser(e){return class ExpressionV2Parser extends e{parseFqnRef(e){let t=_i(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(isImported(t)){let e={project:projectIdFrom(t),model:this.resolveFqn(_i(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(isElement(t)){let r=importsRef(e);if(r){let e={project:projectIdFrom(r),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let a=instanceRef(e);return a?{deployment:this.resolveFqn(a),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(isDeploymentElement(t))return{deployment:this.resolveFqn(t)};G(t)}parseExpressionV2(e){if(isFqnExprOrWith(e))return this.parseFqnExprOrWith(e);if(isRelationExprOrWith(e))return this.parseRelationExprOrWith(e);G(e)}parseFqnExprOrWith(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);G(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(isNavigateToProperty(t)){let r=t.value.view.$refText;return P(r)&&(e.custom.navigateTo=r),e}if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom[t.key]=r),e}if(isElementStringProperty(t)){if(t.key===`description`||t.key===`summary`){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return Vt(r)&&(e.custom[t.key]=r),e}if(isIconProperty(t)){let r=this.parseIconProperty(t);return Vt(r)&&(e.custom[t.key]=r),e}if(isColorProperty(t)){let r=toColor(t);return Vt(r)&&(e.custom[t.key]=r),e}if(isShapeProperty(t)||isBorderProperty(t))return Vt(t.value)&&(e.custom[t.key]=t.value),e;if(isOpacityProperty(t))return Vt(t.value)&&(e.custom[t.key]=parseAstOpacityProperty(t)),e;if(isIconColorProperty(t)){let r=toColor(t);return Vt(r)&&(e.custom[t.key]=r),e}if(isNotationProperty(t)){let r=P(t.value)?removeIndent(parseMarkdownAsString(t.value)):void 0;return r&&(e.custom[t.key]=r),e}if(isMultipleProperty(t))return Kt(t.value)&&(e.custom[t.key]=t.value),e;if(isShapeSizeProperty(t)||isTextSizeProperty(t)||isPaddingSizeProperty(t)||isIconSizeProperty(t))return P(t.value)&&(e.custom[t.key]=parseAstSizeValue(t)),e;if(isIconPositionProperty(t))return P(t.value)&&(e.custom[t.key]=t.value),e;if(isSizingProperty(t))return P(t.value)&&(e.custom[t.key]=parseAstSizingValue(t)),e;G(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(isFqnExprWhere(e))return this.parseFqnExprWhere(e);if(isFqnExpr(e))return this.parseFqnExpr(e);G(e)}parseFqnExprWhere(e){return W(!isFqnExprWhere(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?parseWhereClause(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(isWildcardExpression(e))return{wildcard:!0};if(isElementKindExpression(e))return W(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(isElementTagExpression(e))return W(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.ref.name,isEqual:e.isEqual};if(isFqnRefExpr(e))return this.parseFqnRefExpr(e);G(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],r=e;for(;r;){try{Ut(r.value)&&this.isValid(r.value)&&t.push(this.parseFqnExpr(r.value))}catch(e){this.logError(e,r.value,`fqnref`)}r=r.prev}return t.reverse()}parseRelationExprOrWith(e){if(isRelationExprWith(e))return this.parseRelationExprWith(e);if(isRelationExprOrWhere(e))return this.parseRelationExprOrWhere(e);G(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e[t.key]=r),e}if(isRelationStringProperty(t)||isNotationProperty(t)){if(t.key===`description`){let r=this.parseMarkdownOrString(t.value);return r&&(e.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return Vt(r)&&(e[t.key]=r),e}if(isArrowProperty(t))return P(t.value)&&(e[t.key]=t.value),e;if(isColorProperty(t)){let r=toColor(t);return P(r)&&(e[t.key]=r),e}if(isLineProperty(t))return P(t.value)&&(e[t.key]=t.value),e;if(isRelationNavigateToProperty(t)){let r=t.value.view.ref?.name;return P(r)&&(e[t.key]=r),e}if(isMultipleProperty(t))return Kt(t.value)&&(e[t.key]=t.value),e;G(t)},{})}parseRelationExprOrWhere(e){if(isRelationExprWhere(e))return this.parseRelationExprWhere(e);if(isRelationExpr(e))return this.parseRelationExpr(e);G(e)}parseRelationExprWhere(e){W(!isRelationExprWhere(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),r=t.where?.expr??t,a=t.where?.condition,o=e.where?parseWhereClause(e.where):null,s;return s=o&&a?createBinaryOperator(`and`,a,o):o??a??{kind:{neq:`--always-true--`}},{where:{expr:r,condition:s}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:G(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function GlobalsParser(e){return class GlobalsParser extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,r=this.isValid,a=e.value.globals.filter(r),o=a.flatMap(e=>e.predicates.filter(r));for(let e of o)try{let r=e.name;if(!P(r))continue;if(r in t.predicates){this.logError(`Global predicate named "${r}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,r,t)}catch(t){this.logError(t,e,`globals`)}let s=a.flatMap(e=>e.styles.filter(r));for(let e of s)try{let r=e.id.name;if(!P(r))continue;if(r in t.styles){this.logError(`Global style named "${r}" is already defined`,e,`globals`);continue}let a=this.parseGlobalStyleOrGroup(e);R(a,1)&&(t.styles[r]=a)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,r){if(isGlobalPredicateGroup(e)){let a=this.parseGlobalPredicateGroup(e);R(a,1)&&(r.predicates[t]=a)}else if(isGlobalDynamicPredicateGroup(e)){let a=this.parseGlobalDynamicPredicateGroup(e);R(a,1)&&(r.dynamicPredicates[t]=a)}else G(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(isGlobalStyle(e))return[this.parseViewRuleStyle(e)];if(isGlobalStyleGroup(e))return e.styles.map(e=>this.parseViewRuleStyle(e));G(e)}}}function ImportsParser(e){return class ImportsParser extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,r=t.imports;for(;r;){try{this.doc.c4Imports.set(e,this.resolveFqn(_i(r.imported.ref,`ElementRef is empty of imported: ${r.imported.$refText}`)))}catch(e){this.logError(e,r,`imports`)}r=r.prev}}}}}function PredicatesParser(e){return class PredicatesParser extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);G(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function SpecificationParser(e){return class SpecificationParser extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,r=this.isValid;for(let a of e.flatMap(e=>e.elements.filter(r)))try{Object.assign(t.elements,this.parseElementSpecificationNode(a))}catch(e){this.logError(e,a,`specification`)}for(let a of e.flatMap(e=>e.deploymentNodes.filter(r)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(a))}catch(e){this.logError(e,a,`specification`)}let a=e.flatMap(e=>e.relationships.filter(this.isValid));for(let e of a){let{kind:r,props:a}=e;try{let o=r.name;if(!P(o))continue;if(o in t.relationships){this.logError(`Relationship kind "${o}" is already defined`,r,`specification`);continue}let s=this.parseTags(e),l=this.parseLinks(e),p=I(a.filter(isSpecificationRelationshipStringProperty)??[],M(e=>this.isValid(e)),tn(e=>[e.key,e.value])),{summary:g,..._}=this.parseBaseProps(p),v=removeIndent(parseMarkdownAsString(p.notation)),b=a.filter(isMultipleProperty);b.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${o}", using the first one`,r,`specification`);let x=b[0];t.relationships[o]=ri({..._,notation:v,...this.parseDescriptionFile(e),tags:s??void 0,...l&&zr.isNonEmptyArray(l)&&{links:l},...toRelationshipStyle(a.filter(isRelationshipStyleProperty),this.isValid),...x&&{multiple:x.value}})}catch(e){this.logError(e,r,`specification`)}}let o=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of o)try{let r=e.tag.name,a=this.getAstNodePath(e.tag),o=toColor(e)??(e.color&&this.parseColorLiteral(e.color));if(r in t.tags){this.logError(`Tag ${r} is already defined, skipping duplicate`,e,`specification`);continue}P(r)&&(t.tags[r]={astPath:a,...o?{color:o}:{}})}catch(t){this.logError(t,e,`specification`)}let s=e.flatMap(e=>e.colors.filter(r));for(let{name:e,color:r}of s)try{let a=e.name;if(a in t.colors){this.logError(`Custom color "${a}" is already defined`,e,`specification`);continue}t.colors[a]={color:Bi(this.parseColorLiteral(r),`Color "${a}" is not valid`)}}catch(e){this.logError(e,r,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:r}=e,a=t.name;if(!P(a))throw Error(`DeploymentNodeKind name is not resolved`);let o=this.parseTags(e),s=this.parseElementStyle(r.find(isElementStyleProperty)),l=this.parseLinks(e),p=I(r.filter(isSpecificationElementStringProperty)??[],M(e=>this.isValid(e)),tn(e=>[e.key,e.value])),g=this.parseBaseProps(p),_=removeIndent(parseMarkdownAsString(p.notation));return{[a]:ri({...g,notation:_,...this.parseDescriptionFile(e),tags:o??void 0,...l&&zr.isNonEmptyArray(l)&&{links:l},style:s})}}}}function ViewsParser(e){return class ViewsParser extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let r=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),a=t.folder&&!N(t.folder.trim())?toSingleLine(t.folder):null;for(let o of t.views)try{if(!e(o))continue;switch(!0){case isElementView$1(o):this.doc.c4Views.push(this.parseElementView(o,r));break;case isDynamicView$1(o):this.doc.c4Views.push(this.parseDynamicElementView(o,r));break;case isDeploymentView$1(o):this.doc.c4Views.push(this.parseDeploymentView(o));break;default:G(o)}if(a){let e=this.doc.c4Views.at(-1);e.title=a+` / `+(e.title||e.id)}}catch(e){this.logError(e,o,`views`)}}}parseElementView(e,t){let r=e.body;W(r,`ElementView body is not defined`);let a=r.props.filter(this.isValid),o=this.getAstNodePath(e),s=null,l=e.viewOf;if(l){let t=safeCall(()=>this.parseModelElementRef(l,`Invalid reference to viewOf`));if(t)s=t;else{let t=e.name??`unnamed`,r=l.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${r}`,l)}}let p=e.name;p||=`view_`+stringHash$1(this.doc.uri.toString(),o,s??``);let g=I(a,M(isViewStringProperty),tn(e=>[e.key,e.value])),{title:_=null,description:v=null}=this.parseBaseProps(g,{title:parseTitleKeepingEscapedSlash(g.title)}),b=this.convertTags(r),x=this.convertLinks(r),S=parseViewOrder(a.find(isViewOrderProperty)),C=parseViewRouting(a,r.rules),w=ri({[zr._type]:`element`,id:p,astPath:o,title:toSingleLine(_)??null,description:v,...this.parseDescriptionFile(r),...S!==void 0&&{order:S},...C&&{routing:C},tags:b,links:fi(x)?x:null,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseElementViewRule(e))],...s&&{viewOf:s}});if(Ql.writeId(e,w.id),`extends`in e){let t=e.extends.view.ref;return W(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(w,{extends:t.name})}return w}parseElementViewRule(e){if(isViewRulePredicate(e))return this.parseViewRulePredicate(e);if(isViewRuleGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleGroup(e))return this.parseViewRuleGroup(e);if(isViewRuleRank(e))return this.parseViewRuleRank(e);G(e)}parseViewRulePredicate(e){let t=[],r=e.exprs;for(;r;){let{value:e,prev:a}=r;if(this.tryParse(`views`,e,()=>{let r=this.parsePredicate(e);t.unshift(r)}),!a)break;r=a}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(isViewRuleStyle(e))return this.parseViewRuleStyle(e);if(isViewRuleGlobalStyle(e))return this.parseViewRuleGlobalStyle(e);G(e)}parseViewRuleGroup(e){let t=[];for(let r of e.groupRules)try{if(!this.isValid(r))continue;if(isViewRulePredicate(r)){t.push(this.parseViewRulePredicate(r));continue}if(isViewRuleGlobalPredicateRef(r)){t.push(this.parseViewRuleGlobalPredicateRef(r));continue}if(isViewRuleGroup(r)){t.push(this.parseViewRuleGroup(r));continue}G(r)}catch(e){this.logError(e,r,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>zr.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>zr.ModelExpression.isFqnExpr(e)),r=this.parseStyleProps(e.props.filter(isStyleProperty)),a=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:t,style:r,...a&&{notation:a}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let r=e.body;W(r,`DynamicElementView body is not defined`);let a=this.isValid,o=r.props.filter(a),s=this.getAstNodePath(e),l=e.name;l||=`dynamic_`+stringHash$1(this.doc.uri.toString(),s);let p=I(o,M(isViewStringProperty),tn(e=>[e.key,e.value])),{title:g=null,description:_=null}=this.parseBaseProps(p,{title:parseTitleKeepingEscapedSlash(p.title)}),v=this.convertTags(r),b=this.convertLinks(r),x=parseViewOrder(o.find(isViewOrderProperty));Ql.writeId(e,l);let S=Gt(o,isDynamicViewDisplayVariantProperty)?.value,C=parseViewRouting(o,r.rules);return ri({[zr._type]:`dynamic`,id:l,astPath:s,title:toSingleLine(g)??null,description:_,...this.parseDescriptionFile(r),...x!==void 0&&{order:x},...C&&{routing:C},tags:v,links:fi(b)?b:null,variant:S,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseDynamicViewRule(e))],steps:this.parseSteps(r.steps)})}parseDynamicViewRule(e){if(isDynamicViewIncludePredicate(e))return this.parseDynamicViewIncludePredicate(e);if(isDynamicViewGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);G(e)}parseDynamicViewIncludePredicate(e){let t=[],r=e.exprs;for(;r;)this.tryParse(`views`,r.value,e=>{if(isFqnExprOrWith(e)){let r=this.parseElementPredicate(e);t.unshift(r)}}),r=r.prev;return{include:t}}parseSteps(e){return this.tryMap(`views`,e,e=>this.parseStepStatement(e))}parseStepStatement(e){switch(!0){case isSubflowStep(e):return this.parseSubflowStep(e);case isTryStep(e):return this.parseTryStep(e);case isAltSteps(e):return this.parseAltSteps(e);case isStepSeries(e):return this.parseStepSeries(e);case isStep(e):return this.parseStep(e);default:G(e)}}parseStepSeries(e){let t=this.recursiveParseStepSeries(e);return W(fi(t),`Dynamic step chain must have at least one step`),{[zr._type]:`series`,steps:t}}recursiveParseStepSeries(e,t){if(isStep(e.source)){if(!this.isValid(e.source))return[];let r=this.parseStep(e.source);if(r.isBackward)return[];let a={...this.parseAbstractDynamicStep(e),source:r.target};return a.target===r.source?a.isBackward=!0:t&&(t.push([r.source,r.target]),t.push([a.source,a.target])),[r,a]}t??=[];let r=this.recursiveParseStepSeries(e.source,t);if(!fi(r)||!this.isValid(e))return[];let a=qt(r),o={...this.parseAbstractDynamicStep(e),source:a.target},s=t.findIndex(([e,t])=>e===o.target&&t===o.source);return s===-1?t.push([o.source,o.target]):(o.isBackward=!0,t.splice(s,t.length-s)),[...r,o]}parseStep(e){let t={...this.parseAbstractDynamicStep(e),source:this.parseDynamicStepEndpoint(e.source,`source`)};return e.isBackward&&(t={...t,source:t.target,target:t.source,isBackward:!0}),t}parseAbstractDynamicStep(e){let t=pathInsideDynamicView(e),r={target:this.parseDynamicStepEndpoint(e.target,`target`),astPath:t},a=removeIndent(e.title);a&&(r.title=a);let o=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;o&&(r.kind=o);for(let t of e.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(t):{let e=t.value.view.ref?.name;P(e)&&(r.navigateTo=e);break}case isRelationStringProperty(t):case isNotationProperty(t):if(Vt(t.value)){if(t.key===`description`){let e=removeIndent(t.value);e&&(r.description=e)}else r[t.key]=removeIndent(parseMarkdownAsString(t.value))??``}break;case isNotesProperty(t):Vt(t.value)&&(r[t.key]=removeIndent(t.value));break;case isArrowProperty(t):Vt(t.value)&&(r[t.key]=t.value);break;case isColorProperty(t):{let e=toColor(t);Vt(e)&&(r[t.key]=e);break}case isLineProperty(t):Vt(t.value)&&(r[t.key]=t.value);break;case isMultipleProperty(t):break;default:G(t)}}catch(e){this.logError(e,t,`views`)}return r}parseModelElementRef(e,t){let r=this.parseFqnRef(e.modelElement);if(!zr.FqnRef.isModelRef(r))throw Error(t);return zr.FqnRef.flatten(r)}parseDynamicStepEndpoint(e,t){return this.parseModelElementRef(e,`Invalid reference to ${t}`)}parseSubflowStep(e){let t=e.kind===`parallel`?`par`:e.kind;switch(t){case`break`:case`loop`:case`opt`:case`par`:{let r=this.parseSteps(e.steps);return W(fi(r),`Parallel steps must have at least one step`),zr.exact({[zr._type]:t,title:e.title,steps:r})}case`else`:case`if`:case`when`:throw Error(`Unsupported kind: ${t}`);default:G(t)}}parseTryStep(e){if(W(this.isValid(e)),isFinallyBlock(e)){let t=this.parseTryStep(e.tryCatch),r=this.parseSteps(e.finally.steps);return fi(r)?{...t,finally:zr.exact({title:e.title,steps:r})}:t}if(isCatchBlock(e)){let t=this.parseTryStep(e.try),r=this.parseSteps(e.catch.steps);return fi(r)?{...t,catch:zr.exact({title:e.title,steps:r})}:t}let t=this.parseSteps(e.steps);return W(fi(t),`Try steps must have at least one step`),{[zr._type]:`try`,try:zr.exact({title:e.title,steps:t})}}parseAltSteps(e){let t=this.tryMap(`views`,e.branches,e=>{let t=e.kind;W(t===`if`||t===`else`||t===`when`,`Expected "if", "else", or "when", got "${t}"`);let r=this.parseSteps(e.steps);return W(fi(r),`Branch steps must have at least one step`),zr.exact({[zr._type]:t,title:e.title,steps:r})});return W(fi(t),`Alt must have at least one branch`),zr.exact({[zr._type]:`alt`,title:e.title,branches:t})}}}function pathInsideDynamicView(e){let t=e,r=[];for(;!isDynamicViewBody(t);)jt(t.$containerIndex)&&r.unshift(`@${t.$containerIndex}`),r.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return r.join(``)}const nd=I(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DiffParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends nd{},LikeC4ModelParser=class extends ADisposable{services;#e=Y.getChild(`parser`);onDidParsedEmitter;constructor(e){super(),this.services=e,this.onDispose(this.onDidParsedEmitter=new Be.Emitter,e.shared.workspace.DocumentBuilder.onDocumentResetBelow(E.Linked,({doc:t,resetTo:r,previous:a})=>{this.#e.trace(`clear cached parser {doc} on reset below Linked (resetTo: {resetTo}, was: {previous})`,{doc:e.shared.workspace.WorkspaceManager.relativePath(t.uri),resetTo:r,previous:a}),this.cleanParserState(t)}),e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Linked,async t=>{isParsedLikeC4LangiumDocument(t)&&this.#e.warn(`Document {doc} was validated, we will reparse it`,{doc:e.shared.workspace.WorkspaceManager.relativePath(t.uri)});let r=this.createParser(t);this.notifyListeners(r.doc,!1)}),e.shared.workspace.DocumentBuilder.onDocumentPhase(E.Validated,e=>{isParsedLikeC4LangiumDocument(e)&&isValidationStateChanged(e,e.likec4Parser)&&(this.createParser(e),this.notifyListeners(e,!0))}))}onDocumentParsed(e){return this.onDidParsedEmitter.event(e)}onReparsedAfterValidation(e){return this.onDidParsedEmitter.event(t=>{t.afterValidation&&e(t)})}notifyListeners(e,t){try{this.onDidParsedEmitter.fire({doc:e,afterValidation:t})}catch(e){this.#e.warn(`Error in reparsed listener`,{error:e})}}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return Pi(isLikeC4LangiumDocument(e),`Document ${e.uri.toString()} is not a LikeC4 document`),e.likec4Parser??=this.createParser(e)}cleanParserState(e){e.likec4Parser?.dispose();for(let t of eu)delete e[t]}createParser(e){Pi(isLikeC4LangiumDocument(e),`Document ${e.uri.toString()} is not a LikeC4 document`),this.cleanParserState(e);let t=this.services.shared.workspace.ProjectsManager.getProject(e),r=this.services.shared.workspace.WorkspaceManager.relativePath(e.uri);this.#e.isEnabledFor(`trace`)&&this.#e.trace(`project {project}, create parser {doc}`,{project:t.id,doc:r}),e.state<E.Linked&&this.#e.error(`document {doc} is not linked, state is {state}`,{doc:r,state:e.state});let a={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new Si(Set),c4Diffs:[],c4DescriptionFiles:/* @__PURE__ */ new Set},o=new DocumentParser(this.services,Object.assign(e,a),t);try{o.parseSpecification(),o.parseImports(),o.parseModel(),o.parseDiffs(),o.parseDeployment(),o.parseGlobals(),o.parseViews()}catch(a){throw this.cleanParserState(e),this.#e.warn({message:`error parsing document`,project:t.id,doc:r,error:a}),Error(`Error parsing document ${r}`,{cause:a})}o.hash=stringHash$1(o.docPathInProject);for(let a of eu)try{if(!ji(e,a)||a===`likec4Parser`)continue;let t=a===`c4Imports`?e.c4Imports.toJSON():e[a];o.hash=Hi([o.hash,t])}catch(e){this.#e.warn({message:`error hashing document property`,project:t.id,doc:r,property:a,error:e})}return e.likec4Parser=o,o}},LikeC4ValueConverter=class extends Pe{runConverter(e,t,r){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),$e.convertString(t)):super.runConverter(e,t,r)}};st();const{findNodeForKeyword:rd}=Te,asViewStyleRule=(e,t,r=0)=>{let a=r>0?` `.repeat(r):``;return[a+`style ${e} {`,...an(t).map(([e,t])=>a+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),a+`}`]},isMatchingViewRule=(e,t)=>r=>{if(!isViewRuleStyle(r)&&!isDeploymentViewRuleStyle(r))return!1;let a=r.targets.value;if(!a||P(r.targets.prev)||a.$type!==`FqnRefExpr`||P(a.selector))return!1;let o=a.ref?.value?.ref;return(o?t.resolve(o):null)===e};function changeElementStyle(e,{view:t,viewAst:r,targets:a,style:o}){W(r.body,`View ${t.id} has no body`);let s=_i(r.$cstNode,`cant find view cst node`),l=_i(r.body.$cstNode,`cant find view body cst node`),p=_i(rd(l,`}`),`cant find closing brace`);W(p.container,`Closing brace has no container`);let g=p.container.content,_=qt(r.body.rules)?.$cstNode??g[g.indexOf(p)-1];W(_,`anchor is not defined`);let v=_.range.end,b=p.range.start.line===v.line?`
131
+ `+` `.repeat(s.range.start.character):``,x=s.range.start.character+2,S=[],C=e.likec4.FqnIndex,w=M(r.body.rules,e=>isViewRuleStyle(e)||isDeploymentViewRuleStyle(e)),T=t[Qr]===`element`?t.viewOf??null:null,ee=[],te=[];a.forEach(e=>{let t=Zt(w,isMatchingViewRule(e,C)),r=T&&ii(T,e)?e.substring(T.length+1):e;t?ee.push({fqn:r,rule:t}):te.push({fqn:r})});let ne={start:v,end:v},includeRange=e=>{e.start.line<=ne.start.line&&(e.start.line==ne.start.line?ne.start.character=Math.min(e.start.character,ne.start.character):ne.start=e.start),e.end.line>=ne.end.line&&(e.end.line==ne.end.line?ne.end.character=Math.max(e.end.character,ne.end.character):ne.end=e.end)};if(te.length>0){let e=te.flatMap(({fqn:e})=>asViewStyleRule(e,o,x));S.push(Ge.insert(v,`
99
132
  `+e.join(`
100
- `)+g)),S.start={line:h.line+1,character:_},S.end={line:h.line+e.length,character:Fn(e)?.length??0}}if(ee.length>0)for(let{rule:e}of ee){let t=e.$cstNode;U(t,`RuleCstNode not found`);for(let[r,o]of nn(s)){let s=r===`opacity`?o.toString()+`%`:o,c=e.props.find(e=>e.key===r);if(c&&c.$cstNode){let{range:{start:e,end:t}}=c.$cstNode,o=r+` `+s;includeRange({start:e,end:{...t,character:e.character+o.length}}),v.push(We.replace({start:e,end:t},o));continue}let u=ti(lp(t,`}`),`cant find closing brace`).range.start,d=` `.repeat(t.range.start.character)+` `,p=r+` `+s;v.push(We.insert({line:u.line,character:0},d+p+`
101
- `)),includeRange({start:{line:u.line,character:d.length},end:{line:u.line,character:d.length+p.length}})}}return{modifiedRange:S,edits:v}}Ze();const{findNodeForKeyword:up}=Qe;function changeViewLayout(e,{view:t,viewAst:r,layout:o}){U(r.body,`View ${t.id} has no body`);let s=r.$cstNode;U(s,`viewCstNode`);let c=toAstViewLayoutDirection(o.direction),u=un(r.body.rules,isViewRuleAutoLayout),d=`autoLayout ${c}`;if(tn(o.rankSep)&&(d+=` ${o.rankSep}`,tn(o.nodeSep)&&(d+=` ${o.nodeSep}`)),u&&u.$cstNode)return We.replace(u.$cstNode.range,d);let p=up(r.body.$cstNode,`}`)?.range.start;U(p,`Closing brace not found`);let m=`\t${d}\n\t`;return We.insert(p,m)}function preparePayload(e,t){let r=t.shared.workspace,{viewId:o,projectId:s,change:c}=e,u=r.ProjectsManager.ensureProject(s),d=t.likec4.ModelLocator.locateViewAst(o,u.id);if(!d)throw Error(`View ${o} not found in project ${u.id}`);return{viewId:o,change:c,services:t,project:u,doc:d.doc,viewAst:d.viewAst,workspace:r}}function viewChangeHandler(e,t){return r=>{if(r.change.op===e)return t(r)}}const dp=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:r,description:o}=e,s=[];return r!==void 0&&s.push(updateViewTitle(t,r)),o!==void 0&&s.push(...updateViewDescription(t,o)),e.tags!==void 0&&s.push(...updateViewTags(t,e.tags)),s});function findExistingViewProperty(e,t){let r=e.body?.props;if(r&&M(r,1))return un(r,e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let r=t(ti(e.body,`View body is required`));if(!r)return Nf.Position.create(0,0);let{line:o,character:s}=r;return Nf.Position.create(o,s+1)}const doubleIndent=e=>hn(newline(),indent(indent(e)));function updateViewTitle(e,t){let r=findExistingViewProperty(e,`title`),o=Mi(e.$container.folder??``),s=Mi(t);for(;s[0]&&o[0]===s[0];)s.shift(),o.shift();t=s.join(` ${ji} `);let c=withctx({title:t})(titleProperty());return r?Nf.TextEdit.replace(r.$cstNode.range,printOperation(c)):Nf.TextEdit.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),materialize(doubleIndent(c)).trimEnd())}function replaceTags(e,t,r){let o=t.tags,s=print(r.map(e=>`#${e}`).join(` `));if(o?.$cstNode)return r.length===0?Nf.TextEdit.del({start:findInsertPosition(e,e=>e.$cstNode?.range.start),end:o.$cstNode.range.end}):Nf.TextEdit.replace(o.$cstNode.range,materialize(s));if(r.length!==0)return Nf.TextEdit.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),materialize(doubleIndent(s)).trimEnd())}function updateViewTags(e,t){let r=replaceTags(e,ti(e.body,`View body is required`),t);return r?[r]:[]}function updateViewDescription(e,t){let r=findExistingViewProperty(e,`description`),o=withctx({description:t},indent(indent(descriptionProperty())));if(r)return[Nf.TextEdit.replace({start:{line:r.$cstNode.range.start.line,character:0},end:r.$cstNode.range.end},materialize(o).trimEnd())];let s=findInsertPosition(e,e=>R(e.props,F(e=>e.$cstNode?.range.end),P(z),Fn())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[Nf.TextEdit.insert({line:s.line+1,character:0},materialize(o))]}Ze();const fp=Y.getChild(`model-changes`);var LikeC4ModelChanges=class{services;locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let{viewId:t,projectId:r,change:o}=e;if(o.op===`change-property`){let t=preparePayload(e,this.services),r=dp(t);if(!r)return{success:!1,error:`No changes to apply`};let o=Array.isArray(r)?r:[r];return await this.applyTextEdits(t.doc,o)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let s=this.services.shared.workspace;try{let e=s.ProjectsManager.ensureProject(r);fp.debug`Applying model change ${o.op} to view ${t} in project ${e.id}`;let c=this.locator.locateViewAst(t,e.id);if(!c&&(o.op===`save-view-snapshot`||o.op===`reset-manual-layout`)&&!(await this.services.likec4.ModelBuilder.computeModel(e.id)).findView(t))throw Error(`View ${t} not found in project ${e.id}`);if(o.op===`save-view-snapshot`)return U(t===o.layout.id,`View ID does not match, expected `+t+`, got `+o.layout.id),{success:!0,location:await s.ManualLayouts.write(e,o.layout)};if(o.op===`reset-manual-layout`)return{success:!0,location:await s.ManualLayouts.remove(e,t)};if(!c)throw Error(`View ${t} not found in project ${e.id}`);let u={uri:c.doc.textDocument.uri,version:c.doc.textDocument.version},{edits:d,modifiedRange:p}=this.convertToTextEdit({lookup:c,change:o});return d.length?await this.applyTextEdits(c.doc,d)?{success:!0,location:{uri:u.uri,range:p}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let r=loggable(wrapError(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return fp.warn(r),{success:!1,error:r}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return changeElementStyle(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let r=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:r.range,edits:[r]}}default:W(t)}}async applyTextEdits(e,t){let r=this.services.shared.lsp.Connection,o=this.services.shared.workspace;if(!r){let r=he.applyEdits(e.textDocument,t);return await o.FileSystemProvider.writeFile(e.uri,r),await o.DocumentBuilder.update([e.uri],[]),!0}let s=await r.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return s.applied?(await o.DocumentBuilder.update([e.uri],[]),s.applied):(fp.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${s.failureReason}`,r.window.showErrorMessage(`Failed to apply changes: ${s.failureReason}`),!1)}},LikeC4NameProvider=class extends oe{services;constructor(e){super(),this.services=e}getNameStrict(e){return ti(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(fe(e))return e.name;if(isImported(e))return e.imported.$refText;if(isDeployedInstance(e))return e.target.modelElement.value.$refText}getNameNode(e){if(fe(e))return super.getNameNode(e);if(isImported(e))return e.imported.$refNode;if(isDeployedInstance(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return R(e,Jt(e=>`${e.type}.${e.name}`),nn(),Zt(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends ne{constructor(e){super(e)}async computeExports(e,t){let r=[];try{let{specifications:t,models:o,views:s,globals:c,likec4lib:u,deployments:d}=e.parseResult.value;this.exportLibrary(u,r,e),this.exportSpecification(t,r,e),this.exportModel(o,r,e),this.exportViews(s,r,e),this.exportGlobals(c,r,e),this.exportDeployments(d,r,e)}catch(e){logWarnError(e)}return r}exportViews(e,t,r){let o=e?.flatMap(e=>e.views);if(!(L(o)||o.length===0))for(let e of o)try{z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}exportGlobals(e,t,r){if(!(L(e)||e.length===0)){for(let o of e.flatMap(e=>e.predicates))try{let e=o;z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}for(let o of e.flatMap(e=>e.styles))try{let e=o.id;z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}}exportModel(e,t,r){if(!(L(e)||e.length===0))for(let o of e.flatMap(e=>e.elements))try{isElement(o)&&z(o.name)&&t.push(this.descriptions.createDescription(o,o.name,r))}catch(e){logWarnError(e)}}exportLibrary(e,t,r){if(!L(e))try{for(let o of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(o,o.name,r))}catch(e){logWarnError(e)}}exportSpecification(e,t,r){if(!(L(e)||e.length===0))for(let o of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(o):case isSpecificationElementKind(o):z(o.kind.name)&&t.push(this.descriptions.createDescription(o.kind,o.kind.name,r));continue;case isSpecificationTag(o):z(o.tag.name)&&t.push(this.descriptions.createDescription(o.tag,o.tag.name,r),this.descriptions.createDescription(o.tag,`#`+o.tag.name,r));continue;case isSpecificationRelationshipKind(o):z(o.kind.name)&&t.push(this.descriptions.createDescription(o.kind,o.kind.name,r));continue;case isSpecificationColor(o):z(o.name.name)&&t.push(this.descriptions.createDescription(o.name,o.name.name,r));continue;default:W(o)}}catch(e){logWarnError(e)}}exportDeployments(e,t,r){let o=e?.flatMap(e=>e.elements);if(!(L(o)||o.length===0))for(let e of o)try{isDeploymentNode$1(e)&&z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}computeLocalScopes(e,t){return new Promise(t=>{let r=e.parseResult.value,o=[],s=new ie;for(let t of r.models)try{o.push(...this.processContainer(t,s,e))}catch(e){logWarnError(e)}for(let t of r.deployments)try{o.push(...this.processDeployments(t,s,e))}catch(e){logWarnError(e)}for(let e of r.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)o.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){logWarnError(e)}uniqueDescriptions(o).forEach(e=>{s.add(r,e)}),t(s)})}processContainer(e,t,r){let o=new ie,s=[];for(let c of e.elements){if(isRelation(c))continue;let e;if(isElement(c)?(z(c.name)&&o.add(c.name,this.descriptions.createDescription(c,c.name,r)),e=c.body,e&&(t.add(e,this.descriptions.createDescription(c,`this`,r)),t.add(e,this.descriptions.createDescription(c,`it`,r)))):isExtendElement(c)&&(e=c.body),e&&e.elements.length>0)try{s.push(...this.processContainer(e,t,r))}catch(e){logWarnError(e)}}s.length&&R(s,P(e=>!o.has(e.name)),Jt(e=>e.name),cn((e,t)=>{e.length===1&&o.add(t,e[0])}));let c=[...o.values()];return t.addAll(e,c),c}processDeployments(e,t,r){let o=new ie,s=[];for(let c of e.elements){if(isDeploymentRelation(c))continue;let e=c.body;if(!isExtendDeployment(c)){let s=this.nameProvider.getName(c);if(z(s)){let e=this.descriptions.createDescription(c,s,r);o.add(s,e)}e&&(t.add(e,this.descriptions.createDescription(c,`this`,r)),t.add(e,this.descriptions.createDescription(c,`it`,r)))}if(e)try{s.push(...this.processDeployments(e,t,r))}catch(e){logWarnError(e)}}s.length&&R(s,P(e=>!o.has(e.name)),Jt(e=>e.name),cn((e,t)=>{e.length===1&&o.add(t,e[0])}));let c=[...o.values()];return t.addAll(e,c),c}};const{getDocument:pp}=Te;var LikeC4ScopeProvider=class extends le{services;indexManager;constructor(e){super(e),this.services=e,this.indexManager=e.shared.workspace.IndexManager}get fqnIndex(){return this.services.likec4.FqnIndex}get deploymentsIndex(){return this.services.likec4.DeploymentsIndex}getScope(e){try{let t=projectIdFrom(e.container),r=this.reflection.getReferenceType(e);try{let o=e.container;if(isFqnRef(o))return new ue(this.streamForFqnRef(t,o,e));if(isStrictFqnRef(o))return this.getScopeForStrictFqnRef(t,o,e);if(r!==`Element`)return this.getProjectScope(t,r,e);if(isImported(o)){let e=projectIdFrom(o);return new ue(this.fqnIndex.rootElements(e))}if(isStrictFqnElementRef(o)&&e.property===`el`){let s=o.parent;return s?new ue(this.fqnIndex.directChildrenOf(t,readStrictFqn(s))):this.getProjectScope(t,r,e)}return new ue(it(this.computeScope(t,e)))}catch(o){return logWarnError(o),this.getProjectScope(t,r,e)}}catch(e){return logWarnError(e),se}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(isElement(e)){let r=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,r);return}if(isDeploymentNode$1(e)){let r=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,r)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(elementRef(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,r){let o=t.parent;return o?new ue(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(o)).filter(e=>this.reflection.isSubtype(e.type,Vl))):this.getProjectScope(e,Vl,r)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&isDeploymentNode$1(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,r){let o=t.parent;if(!o)return it(this.genScopeForParentlessFqnRef(e,t,r));let s=o.value.ref;if(!s)return be;if(isImported(s))return it(this.genUniqueDescedants(s.imported.ref));if(isDeploymentNode$1(s))return it(this.genUniqueDescedants(s));if(isDeployedInstance(s)){let e=s.target.modelElement.value.ref,t=isImported(e)?e.imported.ref:isElement(e)?e:void 0;return it(this.genUniqueDescedants(t))}return isElement(s)?it(this.genUniqueDescedants(s)):W(s)}*genScopeForParentlessFqnRef(e,t,r){De(t,isElementRef)||isFqnRefInsideModel(t)?yield*this.computeScope(e,r,ru):isFqnRefInsideGlobals(t)?(yield*this.computeScope(e,r,ru),yield*this.computeScope(e,r,Vl),yield*this.computeScope(e,r,zl)):(yield*this.computeScope(e,r,Vl),yield*this.computeScope(e,r,zl),De(t,isDeploymentViewBody)&&(yield*this.computeScope(e,r,ru)));let o=pp(t).precomputedScopes;o&&(yield*o.values().filter(e=>this.reflection.isSubtype(e.type,Ru)))}*computeScope(e,t,r=this.reflection.getReferenceType(t)){let o=this.reflection.isSubtype(r,ru),s=this.reflection.isSubtype(r,Gc),c=pp(t.container).precomputedScopes;if(!c){yield*this.getProjectScope(e,r,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,r),u=t.container;for(;u;){let e=c.get(u).filter(byReferenceType);e.length>0&&(yield*e),s&&isExtendDeploymentBody(u)&&(yield*this.genScopeExtendDeployment(u.$container)),o&&isExtendElementBody(u)&&(yield*this.genScopeExtendElement(u.$container)),o&&isElementViewBody(u)&&(yield*this.genScopeElementView(u.$container)),u=u.$container}yield*this.getProjectScope(e,r,t).getAllElements()}getProjectScope(e,t,r){return t===`LibIcon`?super.getGlobalScope(t,r):this.globalScopeCache.get(`${e}::${t}`,()=>new ce(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let r=projectIdFrom(t.container);return this.getProjectScope(r,e,t)}},mp=Ve();let hp;(function(e){e.type=new mp.NotificationType(`likec4/onDidChangeModel`)})(hp||={});let gp;(function(e){e.type=new mp.NotificationType0(`likec4/onDidChangeProjects`)})(gp||={});let _p;(function(e){let t=e.Method=`likec4/onDidChangeSnapshot`;e.type=new mp.NotificationType(t)})(_p||={});let vp;(function(e){e.type=new mp.NotificationType(`likec4/onRequestOpenView`)})(vp||={});let yp;(function(e){e.req=new mp.RequestType(`likec4/fetchComputedModel`)})(yp||={});let bp;(function(e){e.req=new mp.RequestType0(`likec4/fetchViewsFromAllProjects`)})(bp||={});let xp;(function(e){e.req=new mp.RequestType(`likec4/fetchLayoutedModel`)})(xp||={});let Sp;(function(e){e.req=new mp.RequestType(`likec4/layout-view`)})(Sp||={});let Cp;(function(e){e.req=new mp.RequestType(`likec4/validate-layout`)})(Cp||={});let wp;(function(e){e.req=new mp.RequestType0(`likec4/reload-projects`)})(wp||={});let Tp;(function(e){e.req=new mp.RequestType0(`likec4/fetch-projects`)})(Tp||={});let Ep;(function(e){e.req=new mp.RequestType(`likec4/register-project`)})(Ep||={});let Dp;(function(e){e.req=new mp.RequestType(`likec4/build`)})(Dp||={});let Op;(function(e){e.req=new mp.RequestType(`likec4/locate`)})(Op||={});let kp;(function(e){e.req=new mp.RequestType(`likec4/change-view`)})(kp||={});let Ap;(function(e){e.req=new mp.RequestType0(`likec4/metrics`)})(Ap||={});let jp;(function(e){e.req=new mp.RequestType(`likec4/document-tags`)})(jp||={});let Mp;(function(e){e.req=new mp.RequestType0(`likec4/fetch-projects-overview`)})(Mp||={});const $=Y.getChild(`rpc`);var Rpc=class extends ADisposable{services;constructor(e){super(),this.services=e}init=yn(()=>{let e=this.services.shared.lsp.Connection;if(!e){$.info(`no connection, skip init ServerRpc`);return}$.info(`init ServerRpc`);let t=this.services.likec4,r=this.services.shared.workspace,o=r.LangiumDocuments,s=r.DocumentBuilder,sendDidChangeModelNotification=t=>{$.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(hp.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},c=sn(e=>{if(typeof e==`string`){sendDidChangeModelNotification(e);return}for(let t of e)sendDidChangeModelNotification(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),u=sn(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(gp.type).catch(e=>{$.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),d=!0;this.onDispose(S.create(()=>{c.cancel(),u.cancel()}),t.ModelBuilder.onModelParsed(e=>c.call(e)),r.ProjectsManager.onProjectsUpdate(()=>u.call(1)),e.onRequest(yp.req,async({projectId:e,cleanCaches:o=!1},s)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,o&&($.debug`cleanCaches: ${o}`,e?(r.ManualLayouts.clearCaches(),await r.ProjectsManager.rebuildProject(e)):await r.WorkspaceManager.rebuildAll());let c=await t.ModelBuilder.computeModel(e,s);return c===Ai.EMPTY?{model:null}:{model:c.$data}}),e.onNotification(_p.type,async e=>{let t=C.parse(e.update??e.delete),o=`update`in e?{update:t}:{delete:t};$.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await r.ManualLayouts.handleFileSystemUpdate(o)}),e.onRequest(xp.req,async({projectId:e},r)=>{$.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let o=await t.LanguageServices.layoutedModel(e);if(o===null)return{model:null};let s=await t.Views.diagrams(e,r);return{model:{...o.$data,_stage:`layouted`,views:rn(s,e=>e.id)}}}),e.onRequest(Sp.req,async({viewId:e,projectId:r,layoutType:o,hints:s},c)=>($.debug`received request ${`layoutView`} for ${e} from project ${r} (layout type: ${o??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:r,layoutType:o,layoutHints:s,cancelToken:c})})),e.onRequest(Cp.req,async({projectId:e},r)=>($.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,r)).map(e=>e.diagram))})),e.onRequest(Tp.req,async()=>{$.debug`received request ${`FetchProjects`}`;let e=o.groupedByProject();return{projects:Pn(e,(e,t)=>{let{folderUri:o,config:{name:s,title:c}}=r.ProjectsManager.getProject(t);return{folder:o.toString(),path:r.WorkspaceManager.relativePath(o),config:{name:s,title:c},docs:F(e,e=>e.uri.toString())}})}}),e.onRequest(wp.req,async e=>{$.debug`received request ${`ReloadProjects`}`,r.ManualLayouts.clearCaches(),await r.ProjectsManager.reloadProjects(e)}),e.onRequest(Ep.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,r.ManualLayouts.clearCaches();let o;return o=`configUri`in e?await r.ProjectsManager.registerConfigFile(C.parse(e.configUri),t):await r.ProjectsManager.registerProject(e,t),{id:o.id}}),e.onRequest(bp.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let o=[];for(let s of r.ProjectsManager.all){await ge(e);try{let r=await t.Views.computedViews(s,e);o.push(...R(r,F(e=>({id:e.id,title:e.title??e.id,projectId:s})),En((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){$.warn(`Failed to fetch views for project ${s}:`,{error:e})}}return{views:o}}),e.onRequest(Dp.req,async({docs:t},r)=>{let c=t.map(e=>C.parse(e)),isNotChanged=e=>!c.some(t=>T.equals(t,e)),u=o.userDocuments.map(e=>e.uri).filter(isNotChanged).toArray();$.debug(`[ServerRpc] received request to build:
102
- changed (total ${c.length}):${t.map(e=>`
133
+ `)+b)),ne.start={line:v.line+1,character:x},ne.end={line:v.line+e.length,character:qt(e)?.length??0}}if(ee.length>0)for(let{rule:e}of ee){let t=e.$cstNode;W(t,`RuleCstNode not found`);for(let[r,a]of an(o)){let o=r===`opacity`?a.toString()+`%`:a,s=e.props.find(e=>e.key===r);if(s&&s.$cstNode){let{range:{start:e,end:t}}=s.$cstNode,a=r+` `+o;includeRange({start:e,end:{...t,character:e.character+a.length}}),S.push(Ge.replace({start:e,end:t},a));continue}let l=_i(rd(t,`}`),`cant find closing brace`).range.start,p=` `.repeat(t.range.start.character)+` `,g=r+` `+o;S.push(Ge.insert({line:l.line,character:0},p+g+`
134
+ `)),includeRange({start:{line:l.line,character:p.length},end:{line:l.line,character:p.length+g.length}})}}return{modifiedRange:ne,edits:S}}st();const{findNodeForKeyword:id}=Te;function changeViewLayout(e,{view:t,viewAst:r,layout:a}){let o=r.$cstNode;W(r.body,`View ${t.id} has no body`),W(o,`viewCstNode`);let s=Zt(r.body.rules,isViewRuleAutoLayout),l=In(Nn(),a);if(s?.routing&&(l+=` ${s.routing}`),s&&s.$cstNode)return Ge.replace(s.$cstNode.range,l);let p=id(r.body.$cstNode,`}`)?.range;W(p,`Closing brace not found`);let g=` `.repeat(p.start.character);return Ge.replace(p,` ${l}\n${g}}`)}st();const{findNodeForKeyword:ad,findNodeForProperty:od}=Te;function changeViewRouting(e,{view:t,viewAst:r,routing:a}){W(a===`spline`||a===`ortho`,`Invalid routing: ${a}`),W(r.body,`View ${t.id} has no body`);let o=r.body,s=_i(r.$cstNode,`viewCstNode`),l=o.props,p=l.find(isViewRoutingProperty),g=p&&od(p.$cstNode,`value`);if(g)return Ge.replace(g.range,a);let _=Zt(o.rules,isViewRuleAutoLayout);if(_?.$cstNode){let e=_.routing&&od(_.$cstNode,`routing`);return e?Ge.replace(e.range,a):Ge.insert(_.$cstNode.range.end,` ${a}`)}let v=(l.at(-1)?.$cstNode??o.tags?.$cstNode)?.range.end??_i(ad(o.$cstNode,`{`),`Opening brace not found`).range.end,b=_i(ad(o.$cstNode,`}`),`Closing brace not found`),x=` `.repeat(s.range.start.character+2),S=b.range.start.line===v.line?`
135
+ `+` `.repeat(s.range.start.character):``;return Ge.insert(v,`\n${x}routing ${a}${S}`)}function preparePayload(e,t){let r=t.shared.workspace,{viewId:a,projectId:o,change:s}=e,l=r.ProjectsManager.ensureProject(o),p=t.likec4.ModelLocator.locateViewAst(a,l.id);if(!p)throw Error(`View ${a} not found in project ${l.id}`);return{viewId:a,change:s,services:t,project:l,doc:p.doc,viewAst:p.viewAst,workspace:r}}function viewChangeHandler(e,t){return r=>{if(r.change.op===e)return t(r)}}const sd=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:r,description:a}=e,o=[];return r!==void 0&&o.push(updateViewTitle(t,r)),a!==void 0&&o.push(...updateViewDescription(t,a)),e.tags!==void 0&&o.push(...updateViewTags(t,e.tags)),o});function findExistingViewProperty(e,t){let r=e.body?.props;if(r&&R(r,1))return r.findLast(e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let r=t(_i(e.body,`View body is required`));if(!r)return q.Position.create(0,0);let{line:a,character:o}=r;return q.Position.create(a,o+1)}const doubleIndent=e=>rn(An(),Fn(Fn(e)));function updateViewTitle(e,t){let r=findExistingViewProperty(e,`title`),a=oa(e.$container.folder??``),o=oa(t);for(;o[0]&&a[0]===o[0];)o.shift(),a.shift();t=o.join(` ${aa} `);let s=jn({title:t})(Mn());return r?q.TextEdit.replace(r.$cstNode.range,In(s)):q.TextEdit.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),In(doubleIndent(s)).trimEnd())}function replaceTags(e,t,r){let a=t.tags,o=kn(r.map(e=>`#${e}`).join(` `));if(a?.$cstNode)return r.length===0?q.TextEdit.del({start:findInsertPosition(e,e=>e.$cstNode?.range.start),end:a.$cstNode.range.end}):q.TextEdit.replace(a.$cstNode.range,In(o));if(r.length!==0)return q.TextEdit.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),In(doubleIndent(o)).trimEnd())}function updateViewTags(e,t){let r=replaceTags(e,_i(e.body,`View body is required`),t);return r?[r]:[]}function updateViewDescription(e,t){let r=findExistingViewProperty(e,`description`)??findExistingViewProperty(e,`descriptionFile`),a=jn({description:t},Fn(Fn(Rn())));if(r)return[q.TextEdit.replace({start:{line:r.$cstNode.range.start.line,character:0},end:r.$cstNode.range.end},In(a).trimEnd())];let o=findInsertPosition(e,e=>I(e.props,V(e=>e.$cstNode?.range.end),M(P),qt())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[q.TextEdit.insert({line:o.line+1,character:0},In(a))]}st();const cd=Y.getChild(`model-changes`);var LikeC4ModelChanges=class{services;locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let{viewId:t,projectId:r,change:a}=e;if(a.op===`change-property`){let t=preparePayload(e,this.services),r=sd(t);if(!r)return{success:!1,error:`No changes to apply`};let a=Array.isArray(r)?r:[r];return await this.applyTextEdits(t.doc,a)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let o=this.services.shared.workspace;try{let e=o.ProjectsManager.ensureProject(r);cd.debug`Applying model change ${a.op} to view ${t} in project ${e.id}`;let s=this.locator.locateViewAst(t,e.id);if(!s&&(a.op===`save-view-snapshot`||a.op===`reset-manual-layout`)&&!(await this.services.likec4.ModelBuilder.computeModel(e.id)).findView(t))throw Error(`View ${t} not found in project ${e.id}`);if(a.op===`save-view-snapshot`)return W(t===a.layout.id,`View ID does not match, expected `+t+`, got `+a.layout.id),{success:!0,location:await o.ManualLayouts.write(e,a.layout)};if(a.op===`reset-manual-layout`)return{success:!0,location:await o.ManualLayouts.remove(e,t)};if(!s)throw Error(`View ${t} not found in project ${e.id}`);let l={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version},{edits:p,modifiedRange:g}=this.convertToTextEdit({lookup:s,change:a});return p.length?await this.applyTextEdits(s.doc,p)?{success:!0,location:{uri:l.uri,range:g}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let r=loggable(wrapError(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return cd.warn(r),{success:!1,error:r}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return changeElementStyle(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let r=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:r.range,edits:[r]}}case`change-routing`:{let r=changeViewRouting(this.services,{...e,routing:t.routing});return{modifiedRange:r.range,edits:[r]}}default:G(t)}}async applyTextEdits(e,t){let r=this.services.shared.lsp.Connection,a=this.services.shared.workspace;if(!r){let r=ce.applyEdits(e.textDocument,t);return await a.FileSystemProvider.writeFile(e.uri,r),await a.DocumentBuilder.update([e.uri],[]),!0}let o=await r.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return o.applied?(await a.DocumentBuilder.update([e.uri],[]),o.applied):(cd.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${o.failureReason}`,r.window.showErrorMessage(`Failed to apply changes: ${o.failureReason}`),!1)}},LikeC4NameProvider=class extends oe{services;constructor(e){super(),this.services=e}getNameStrict(e){return _i(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(ye(e))return e.name;if(isImported(e))return e.imported.$refText;if(isDeployedInstance(e))return e.target.modelElement.value.$refText}getNameNode(e){if(ye(e))return super.getNameNode(e);if(isImported(e))return e.imported.$refNode;if(isDeployedInstance(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return I(e,Yt(e=>`${e.type}.${e.name}`),an(),zt(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends T{constructor(e){super(e)}async collectExportedSymbols(e,t){let r=[];try{let{specifications:t,models:a,views:o,globals:s,likec4lib:l,deployments:p,diffs:g}=e.parseResult.value;this.exportLibrary(l,r,e),this.exportSpecification(t,r,e),this.exportModel([...a,...g.flatMap(e=>e.adds)],r,e),this.exportViews(o,r,e),this.exportGlobals(s,r,e),this.exportDeployments(p,r,e)}catch(e){logWarnError(e)}return r}exportViews(e,t,r){let a=e?.flatMap(e=>e.views);if(!(L(a)||a.length===0))for(let e of a)try{P(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}exportGlobals(e,t,r){if(!(L(e)||e.length===0)){for(let a of e.flatMap(e=>e.predicates))try{let e=a;P(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}for(let a of e.flatMap(e=>e.styles))try{let e=a.id;P(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}}exportModel(e,t,r){if(!(L(e)||e.length===0))for(let a of e.flatMap(e=>e.elements))try{isElement(a)&&P(a.name)&&t.push(this.descriptions.createDescription(a,a.name,r))}catch(e){logWarnError(e)}}exportLibrary(e,t,r){if(!L(e))try{for(let a of e.flatMap(e=>e.icons)){let e=a.name.split(`:`)[0];isBundledIconGroup(e)&&t.push(...lo[e].map(t=>this.descriptions.createDescription(a,`${e}:${t}`,r)))}}catch(e){logWarnError(e)}}exportSpecification(e,t,r){if(!(L(e)||e.length===0))for(let a of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(a):case isSpecificationRelationshipKind(a):case isSpecificationElementKind(a):P(a.kind.name)&&t.push(this.descriptions.createDescription(a.kind,a.kind.name,r));continue;case isSpecificationTag(a):P(a.tag.name)&&t.push(this.descriptions.createDescription(a.tag,a.tag.name,r),this.descriptions.createDescription(a.tag,`#`+a.tag.name,r));continue;case isSpecificationColor(a):P(a.name.name)&&t.push(this.descriptions.createDescription(a.name,a.name.name,r));continue;default:G(a)}}catch(e){logWarnError(e)}}exportDeployments(e,t,r){let a=e?.flatMap(e=>e.elements);if(!(L(a)||a.length===0))for(let e of a)try{isDeploymentNode$1(e)&&P(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}collectLocalSymbols(e,t){return new Promise(t=>{let r=e.parseResult.value,a=[],o=new be;for(let t of[...r.models,...r.diffs.flatMap(e=>e.adds)])try{a.push(...this.processContainer(t,o,e))}catch(e){logWarnError(e)}for(let t of r.deployments)try{a.push(...this.processDeployments(t,o,e))}catch(e){logWarnError(e)}for(let e of r.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)a.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){logWarnError(e)}uniqueDescriptions(a).forEach(e=>{o.add(r,e)}),t(o)})}processContainer(e,t,r){let a=new be,o=[];for(let s of e.elements){if(isRelation(s))continue;let e;if(isElement(s)?(P(s.name)&&a.add(s.name,this.descriptions.createDescription(s,s.name,r)),e=s.body,e&&(t.add(e,this.descriptions.createDescription(s,`this`,r)),t.add(e,this.descriptions.createDescription(s,`it`,r)))):isExtendElement(s)&&(e=s.body),e&&e.elements.length>0)try{o.push(...this.processContainer(e,t,r))}catch(e){logWarnError(e)}}o.length&&I(o,M(e=>!a.has(e.name)),Yt(e=>e.name),Bt((e,t)=>{e.length===1&&a.add(t,e[0])}));let s=[...a.values()];return t.addAll(e,s),s}processDeployments(e,t,r){let a=new be,o=[];for(let s of e.elements){if(isDeploymentRelation(s))continue;let e=s.body;if(!isExtendDeployment(s)){let o=this.nameProvider.getName(s);if(P(o)){let e=this.descriptions.createDescription(s,o,r);a.add(o,e)}e&&(t.add(e,this.descriptions.createDescription(s,`this`,r)),t.add(e,this.descriptions.createDescription(s,`it`,r)))}if(e)try{o.push(...this.processDeployments(e,t,r))}catch(e){logWarnError(e)}}o.length&&I(o,M(e=>!a.has(e.name)),Yt(e=>e.name),Bt((e,t)=>{e.length===1&&a.add(t,e[0])}));let s=[...a.values()];return t.addAll(e,s),s}};const{getDocument:ld}=ee;var LikeC4ScopeProvider=class extends fe{services;indexManager;constructor(e){super(e),this.services=e,this.indexManager=e.shared.workspace.IndexManager}get fqnIndex(){return this.services.likec4.FqnIndex}get deploymentsIndex(){return this.services.likec4.DeploymentsIndex}getScope(e){try{let t=projectIdFrom(e.container),r=this.reflection.getReferenceType(e);try{let a=e.container;if(isFqnRef(a))return new pt(this.streamForFqnRef(t,a,e));if(isStrictFqnRef(a))return this.getScopeForStrictFqnRef(t,a,e);if(r!==ts.$type)return this.getProjectScope(t,r,e);if(isImported(a)){let e=projectIdFrom(a);return new pt(this.fqnIndex.rootElements(e))}if(isStrictFqnElementRef(a)&&e.property===`el`){let o=a.parent;return o?new pt(this.fqnIndex.directChildrenOf(t,readStrictFqn(o))):this.getProjectScope(t,r,e)}return new pt(w(this.computeScope(t,e)))}catch(a){return logWarnError(a),this.getProjectScope(t,r,e)}}catch(e){return logWarnError(e),le}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(isElement(e)){let r=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,r)}else if(isDeploymentNode$1(e)){let r=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,r)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(elementRef(e))}*genScopeElementView({viewOf:e,extends:t}){if(e)e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(e));else if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,r){let a=t.parent;return a?new pt(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(a)).filter(e=>this.reflection.isSubtype(e.type,ko.$type))):this.getProjectScope(e,ko.$type,r)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&isDeploymentNode$1(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,r){let a=t.parent;if(!a)return w(this.genScopeForParentlessFqnRef(e,t,r));let o=a.value.ref;if(!o)return Ue;if(isImported(o))return w(this.genUniqueDescedants(o.imported.ref));if(isDeploymentNode$1(o))return w(this.genUniqueDescedants(o));if(isDeployedInstance(o)){let e=o.target.modelElement.value.ref,t=isImported(e)?e.imported.ref:isElement(e)?e:void 0;return w(this.genUniqueDescedants(t))}return isElement(o)?w(this.genUniqueDescedants(o)):G(o)}*genScopeForParentlessFqnRef(e,t,r){ie(t,isElementRef)||isFqnRefInsideModel(t)?yield*this.computeScope(e,r,ts.$type):isFqnRefInsideGlobals(t)?(yield*this.computeScope(e,r,ts.$type),yield*this.computeScope(e,r,ko.$type),yield*this.computeScope(e,r,Eo.$type)):(yield*this.computeScope(e,r,ko.$type),yield*this.computeScope(e,r,Eo.$type),ie(t,isDeploymentViewBody)&&(yield*this.computeScope(e,r,ts.$type)));let a=ld(t),o=a.localSymbols;o&&(yield*o.getStream(a.parseResult.value).filter(e=>this.reflection.isSubtype(e.type,Gs.$type)))}*computeScope(e,t,r=this.reflection.getReferenceType(t)){let a=this.reflection.isSubtype(r,ts.$type),o=this.reflection.isSubtype(r,Oo.$type),s=ld(t.container).localSymbols;if(!s){yield*this.getProjectScope(e,r,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,r),l=t.container;for(;l;)yield*s.getStream(l).filter(byReferenceType),o&&isExtendDeploymentBody(l)&&(yield*this.genScopeExtendDeployment(l.$container)),a&&isExtendElementBody(l)&&(yield*this.genScopeExtendElement(l.$container)),a&&isElementViewBody(l)&&(yield*this.genScopeElementView(l.$container)),l=l.$container;yield*this.getProjectScope(e,r,t).getAllElements()}getProjectScope(e,t,r){return t===Ys.$type?super.getGlobalScope(t,r):this.globalScopeCache.get(`${e}::${t}`,()=>new ge(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===Ys.$type)return super.getGlobalScope(e,t);let r=projectIdFrom(t.container);return this.getProjectScope(r,e,t)}};let ud;(function(e){e.type=new K.NotificationType(`likec4/onDidChangeModel`)})(ud||={});let dd;(function(e){e.type=new K.NotificationType0(`likec4/onDidChangeProjects`)})(dd||={});let fd;(function(e){e.type=new K.NotificationType(`likec4/onRequestOpenView`)})(fd||={});let pd;(function(e){e.req=new K.RequestType(`likec4/fetchComputedModel`)})(pd||={});let md;(function(e){e.req=new K.RequestType0(`likec4/fetchViewsFromAllProjects`)})(md||={});let hd;(function(e){e.req=new K.RequestType(`likec4/fetchLayoutedModel`)})(hd||={});let gd;(function(e){e.req=new K.RequestType(`likec4/layout-view`)})(gd||={});let _d;(function(e){e.req=new K.RequestType(`likec4/validate-layout`)})(_d||={});let vd;(function(e){e.req=new K.RequestType0(`likec4/reload-projects`)})(vd||={});let yd;(function(e){e.req=new K.RequestType0(`likec4/fetch-projects`)})(yd||={});let bd;(function(e){e.req=new K.RequestType(`likec4/register-project`)})(bd||={});let xd;(function(e){e.req=new K.RequestType(`likec4/build`)})(xd||={});let Sd;(function(e){e.req=new K.RequestType(`likec4/locate`)})(Sd||={});let Cd;(function(e){e.req=new K.RequestType(`likec4/change-view`)})(Cd||={});let wd;(function(e){e.req=new K.RequestType0(`likec4/metrics`)})(wd||={});let Td;(function(e){e.req=new K.RequestType(`likec4/document-tags`)})(Td||={});let Ed;(function(e){e.req=new K.RequestType0(`likec4/fetch-projects-overview`)})(Ed||={});let Dd;(function(e){e.req=new K.RequestType(`likec4/fetch-diffs`)})(Dd||={});let Od;(function(e){e.req=new K.RequestType(`likec4/layout-compare-view`)})(Od||={});let kd;(function(e){e.req=new K.RequestType(`likec4/fetch-removal-impact`)})(kd||={});let Ad;(function(e){e.req=new K.RequestType(`likec4/preview-model-edit`)})(Ad||={});let jd;(function(e){e.req=new K.RequestType(`likec4/apply-model-edit`)})(jd||={});let Md;(function(e){e.req=new K.RequestType(`likec4/rollback-model-edit`)})(Md||={});let Nd;(function(e){e.type=new K.NotificationType(`likec4/onRequestRemovalImpact`)})(Nd||={});const $=Y.getChild(`rpc`);var Rpc=class extends ADisposable{services;constructor(e){super(),this.services=e}init=on(()=>{let e=this.services.shared.lsp.Connection;if(!e){$.info(`no connection, skip init ServerRpc`);return}$.info(`init ServerRpc`);let t=this.services.likec4,r=this.services.shared.workspace,a=r.LangiumDocuments,o=r.DocumentBuilder,sendDidChangeModelNotification=t=>{$.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(ud.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},s=Lt(e=>{if(typeof e==`string`)sendDidChangeModelNotification(e);else for(let t of e)sendDidChangeModelNotification(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):/* @__PURE__ */ new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),l=Lt(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(dd.type).catch(e=>{$.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),p=!0;this.onDispose(C.create(()=>{s.cancel(),l.cancel()}),t.ModelBuilder.onModelParsed(e=>s.call(e)),r.ProjectsManager.onProjectsUpdate(()=>l.call(1)),e.onRequest(pd.req,async({projectId:e,cleanCaches:a=!1},o)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,a&&($.debug`cleanCaches: ${a}`,e?(r.ManualLayouts.clearCaches(),await r.ProjectsManager.rebuildProject(e)):await r.WorkspaceManager.rebuildAll());let s=await t.ModelBuilder.computeModel(e,o);return s===ia.EMPTY?{model:null}:{model:s.$data}}),e.onRequest(hd.req,async({projectId:e},r)=>{$.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let a=await t.LanguageServices.layoutedModel(e,r);return a===null?{model:null}:{model:a.$data}}),e.onRequest(gd.req,async({viewId:e,projectId:r,layoutType:a,hints:o},s)=>($.debug`received request ${`layoutView`} for ${e} from project ${r} (layout type: ${a??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:r,layoutType:a,layoutHints:o,cancelToken:s})})),e.onRequest(_d.req,async({projectId:e},r)=>($.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,r)).map(e=>e.diagram))})),e.onRequest(yd.req,async()=>{$.debug`received request ${`FetchProjects`}`;let e=a.groupedByProject();return{projects:wn(e,(e,t)=>{let{folderUri:a,config:{name:o,title:s}}=r.ProjectsManager.getProject(t);return{folder:a.toString(),path:r.WorkspaceManager.relativePath(a),config:{name:o,title:s},docs:V(e,e=>e.uri.toString())}})}}),e.onRequest(vd.req,async e=>{$.debug`received request ${`ReloadProjects`}`,r.ManualLayouts.clearCaches(),await r.ProjectsManager.reloadProjects(e)}),e.onRequest(bd.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,r.ManualLayouts.clearCaches();let a;return a=`configUri`in e?await r.ProjectsManager.registerConfigFile(j.parse(e.configUri),t):await r.ProjectsManager.registerProject(e,t),{id:a.id}}),e.onRequest(md.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let a=[];for(let o of r.ProjectsManager.all){await Ce(e);try{let r=await t.Views.computedViews(o,e);a.push(...I(r,V(e=>({id:e.id,title:e.title??e.id,projectId:o})),mn((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){$.warn(`Failed to fetch views for project ${o}:`,{error:e})}}return{views:a}}),e.onRequest(xd.req,async({docs:t},r)=>{let s=t.map(e=>j.parse(e)),isNotChanged=e=>!s.some(t=>D.equals(t,e)),l=a.userDocuments.map(e=>e.uri).filter(isNotChanged).toArray();$.debug(`[ServerRpc] received request to build:
136
+ changed (total ${s.length}):${t.map(e=>`
103
137
  - `+e).join(``)}
104
- deleted (total ${u.length}):${u.map(e=>`
138
+ deleted (total ${l.length}):${l.map(e=>`
105
139
  - `+e.toString()).join(`
106
- `)}`),!d&&c.length+u.length>0&&await Promise.allSettled([...c,...u].map(async t=>{let r=t.toString();$.debug(`clear diagnostics for ${r}`);try{await e.sendDiagnostics({uri:r,diagnostics:[]})}catch(e){$.warn(`error clearing diagnostics for ${r}: ${e}`)}})),d=!1,await ge(r),await s.update(c,u,r)}),e.onRequest(Op.req,e=>{$.debug`received request ${`locate`}, ${e}`;let r=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,r);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,r);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:r});case`view`in e:return t.ModelLocator.locateView(e.view,r);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,r);default:W(e)}}),e.onRequest(kp.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Ap.req,async e=>{let o=null;for(let s of r.ProjectsManager.all)try{let r=await t.ModelBuilder.computeModel(s,e);if(r===Ai.EMPTY)continue;o??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},o.elementKinds+=an(r.specification.elements).length,o.deploymentKinds+=an(r.specification.deployments).length,o.relationshipKinds+=an(r.specification.relationships).length,o.tags+=an(r.specification.tags).length,o.customColors+=an(r.specification.customColors??{}).length,o.elements+=an(r.$data.elements).length,o.deploymentNodes+=[...r.deployment.nodes()].length,o.relationships+=an(r.$data.relations).length,o.views+=an(r.$data.views).length,o.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${s}`,{err:e})}return await ge(e),{metrics:o}}),e.onRequest(jp.req,async({documentUri:e},o)=>{let s=C.parse(e);$.debug`received request ${`GetDocumentTags`} for document ${s}`;let c=await t.ModelLocator.locateDocumentTags(s,o);return{projectId:r.ProjectsManager.ownerProjectId(s),tags:c??[]}}),e.onRequest(Mp.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})));function reportLayoutDrift(e){return R(e,P(e=>!!e.hasLayoutDrift),F(e=>{let r=t.ModelLocator.locateView(e.id);return U(r,`View ${e.id} not found`),{uri:r.uri,viewId:e.id,severity:Nf.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:r.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){$.warn(`No LSP connection`);return}await t.sendNotification(vp.type,e)}};Ze();var NodeKindProvider=class{services;constructor(e){this.services=e}getSymbolKind(e){let t=Ce(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(ru,_u,Vl,zl,Ru):return et.Constructor;case hasType(Zu,$u,Qu,ku,Td):return et.Namespace;case hasType(rl):return et.Struct;case hasType(`Tag`,Hu,Il,Ed):return et.EnumMember;case hasType(pd,Cd):return et.Event;case hasType(au,Ul,xd,bd):return et.TypeParameter}return et.Field}getCompletionItemKind(e){let t=Ce(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Il):return w.Color;case hasType(ru,Vl,zl,_u,Ru):return w.Constructor;case hasType(Zu,$u,Qu,ku,Td):return w.Module;case hasType(rl):return w.Class;case hasType(`Tag`,Hu,Il,Ed):return w.EnumMember;case hasType(pd,Cd):return w.Event;case hasType(au,xd,Ul,bd):return w.TypeParameter;default:return w.Reference}}},WorkspaceSymbolProvider=class extends Ge{};const Np=Y.getChild(`views`);var DefaultLikeC4Views=class extends ADisposable{services;#e;#t=new Tr(e=>new ProjectStorage({projectId:e,storage:Yn(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){super(),this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Xn(),this.onDispose(this.#e,S.create(()=>{this.#t.clear()}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{Np.info`force clean cache`,this.#e.clear()}),e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e,viewId:t})=>{this.#t.has(e)&&t&&this.projectStorage(e).clearView(t)}))}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return Mn(r.$data.views)}async _layoutAllViews(e,t){let r=Mn(e.$data.views);if(r.length===0)return[];let o=e.project.id,s=Np.getChild(o),c=this.projectStorage(o),u=[],d=e.$styles,p=[];for(let e of r){let t={view:e,styles:d},r=await c.get(t);if(r){p.push(r);continue}u.push(t)}if(p.length>0&&(u.length>0?s.trace`cached ${p.length} views, need to layout ${u.length} views`:s.trace`cached all ${p.length} views`),u.length>0){let e=performanceMark();await this.layouter.batchLayout({batch:u,cancelToken:t,onSuccess:(e,t)=>{p.push(c.remember(e,t))},onError:(e,t)=>{s.warn(`Fail layout view ${e.view.id}`,{error:t})}}),s.debug`layouted ${u.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await ge(t),p.length!==r.length&&s.warn`layouted ${p.length} of ${r.length} views`,p}async layoutAllViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(r,t)}async layoutView({viewId:e,layoutType:t,projectId:r,cancelToken:o,layoutHints:s}){let c=await this.ModelBuilder.computeModel(r,o),u=c.findView(e)?.$view;r=c.project.id;let d=Np.getChild(r);if(s){U(u,`View ${e} not found in model`),d.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:r}=await this.layouter.aiLayout({view:u,styles:c.$styles},s);return{dot:t,diagram:r}}if(!u){d.warn`view ${e} not found in model`;let t=c.findManualLayout(e);if(t){d.info`found manual layout for ${e}`;let r={...t};return r.drifts=[`not-exists`],r._layout=`manual`,{diagram:r,dot:`# manual layout`}}return null}let p=this.projectStorage(r);try{let e={view:u,styles:c.$styles},r=await p.getOrExecute(e);return z(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,c,t)}:r}catch(e){let t=loggable(e);return d.warn(t),this.reportViewError(u,r,t),Promise.reject(e)}}async diagrams(e,t){let r=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(r,t)).map(({diagram:e})=>this.withLayoutType(e,r,`manual`))}async viewsAsGraphvizOut(e,t){let r=`All-LayoutedViews-DotWithSvg`,o=this.services.shared.workspace.Cache;if(o.has(r))return await Promise.resolve(o.get(r));let s=await this.ModelBuilder.computeModel(e,t),c=Mn(s.$data.views);if(c.length===0)return[];let u=c.map(async e=>{let{dot:t,svg:r}=await this.layouter.svg({view:e,styles:s.$styles});return{id:e.id,dot:t,svg:r}}),d=[],p=await Promise.allSettled(u);for(let e of p)e.status===`fulfilled`?d.push(e.value):logWarnError(e.reason);return o.set(r,d),d}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){Np.trace`layouting adhoc view...`;let r=await this.ModelBuilder.computeModel(t),o=Gi(r,e),{diagram:s}=await this.layouter.layout({view:{...o,hash:``,_type:`element`},styles:r.$styles});return Np.debug`layouting adhoc view... done`,s}reportViewError(e,t,r){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${r}`)})}withLayoutType(e,t,r){if(!r)return e;let o=t.findManualLayout(e.id);return o?r===`manual`?e[Nr]===`manual`?(Np.error`View ${e.id} already has manual layout, this should not happen`,e):Rr(e,o):zr(e,o):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=Np.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`;let o=performanceMark(),s=await this.#n(e);return this.#e.trace(`layouted {view} in ${o.pretty}`,{view:e.view.id}),await this.#t.set(t,s),this.resetViewError(e.view),s}remember=(e,t)=>{let r=cacheKey(e);return t&&(this.#t.set(r,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let r=`error:${e.id}`;this.#t.has(r).then(e=>{e||(this.#t.set(r,`true`),t())})}async clearView(e){this.resetViewError(e);let t=await this.#t.keys(`v:${e}:`);if(t.length!==0){this.#e.trace`clear ${t.length} cached entries for view ${e}`;for(let e of t)await this.#t.remove(e)}}clearAll(){this.#e.trace`clear caches`,this.#t.clear()}resetViewError(e){let t=typeof e==`string`?e:e.id;this.#t.del(`error:${t}`)}};function cacheKey(e){return`v:${e.view.id}:${e.view.hash}:${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:Lr(e,t.diagram)}}const Pp={graphviz(){return new kc}};function WithGraphviz(e){return{graphviz(){return e}}}function createLikeC4SharedModule(e){return{lsp:{NodeKindProvider:e=>new NodeKindProvider(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e)},workspace:{Cache:e=>new Le(e,x.Validated),IndexManager:e=>new IndexManager(e),LangiumDocuments:e=>new LangiumDocuments(e),ProjectsManager:e=>new xf(e),WorkspaceManager:e=>new LikeC4WorkspaceManager(e),FileSystemProvider:t=>e.fileSystemProvider(t),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new QueueGraphvizLayoter({graphviz:e.likec4.Graphviz}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices$1(e={},t,r,o){let s=createSharedServices(e),c=[Fe({shared:s}),ff,createLikeC4Module({...jf,...Mf,...Pp,...e}),t,r,o].reduce(_merge,{}),u=pe(c);return s.ServiceRegistry.register(u),registerValidationChecks(u),e.connection?bi(()=>s.workspace.WorkspaceManager.ready.then(()=>u.Rpc.init())):s.workspace.ConfigurationProvider.initialized({}),{shared:s,likec4:u}}t(createLanguageServices$1,`createLanguageServices`);function createSharedServices(e={}){let t={...jf,...Mf,...e};return pe(xe({...t,fileSystemProvider:()=>new NoopFileSystemProvider}),df,createLikeC4SharedModule(t))}function _merge(e,t){if(t)for(let[r,o]of Object.entries(t)){if(r===`__proto__`||r===`constructor`||r===`prototype`||o===void 0)continue;let t=Object.hasOwn(e,r),s=e[r];e[r]=t&&s!==null&&o!==null&&typeof s==`object`&&typeof o==`object`?_merge(s,o):o}return e}function configureLogger(e){let t=e?.configureLogger??!1;if(t!==!1){if(t===`stderr`){configureLanguageServerLogger({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}configureLanguageServerLogger({colors:Ri,logLevel:e?.logLevel})}}function createLanguageServices(e){let t=K.getChild(`lang`),r=_(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),o=r.graphviz===`binary`;return t.info(`${$i.dim(`layout`)} ${o?`binary`:`wasm`}`),createLanguageServices$1({...r.useFileSystem?{...WithFileSystem(r.watch),...r.manualLayouts?Tf:Mf}:{...jf,...Mf},...WithGraphviz(o?new GraphvizBinaryAdapter:new kc)})}async function fromWorkspace(e,t){let r=ir(e),o=C.file(r).toString(),s=mt(o),c=K.getChild(`lang`),u=_(t,{...yc,useFileSystem:!0,manualLayouts:!0,watch:!1});configureLogger(u);let d=createLanguageServices(u),p={name:er(r),uri:s},m=d.shared.workspace.WorkspaceManager;c.info(`${$i.dim(`workspace:`)} ${r}`),m.initialize({capabilities:{},processId:null,rootUri:p.uri,workspaceFolders:[p]}),await m.initialized({});let h=d.shared.workspace.LangiumDocuments.userDocuments.toArray();if(h.length===0&&(c.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw await d.likec4.likec4.LanguageServices.dispose(),Error(`no LikeC4 sources found`);return c.info(`${$i.dim(`workspace:`)} found ${h.length} source files`),handleInitOptions(d,K,t)}async function fromSources(e,t){configureLogger(t);let r=K.getChild(`lang`);return await createFromSources(createLanguageServices(_(t,{...yc,useFileSystem:!1,watch:!1,manualLayouts:!1})),r,e,t)}function fromSource(e,t){return fromSources({"source.c4":e},t)}async function writeDSL(e,t,r){let o=await e.toDSL(r?.project),s=nr(t,r?.fileName??`model.c4`);return await $n(s,o,`utf-8`),s}export{getConsoleSink as C,loggable as E,K as S,getConsoleFormatter as T,toStringLF as _,createLanguageServices$1 as a,configureLogger$1 as b,Tf as c,configureLanguageServerLogger as d,Y as f,ea as g,kc as h,writeDSL as i,Ic as l,QueueGraphvizLayoter as m,fromSources as n,WithGraphviz as o,GraphvizBinaryAdapter as p,fromWorkspace as r,WithFileSystem as s,fromSource as t,Lc as u,stripIndent as v,getAnsiColorFormatter as w,createLogger as x,$i as y};
140
+ `)}`),!p&&s.length+l.length>0&&await Promise.allSettled([...s,...l].map(async t=>{let r=t.toString();$.debug(`clear diagnostics for ${r}`);try{await e.sendDiagnostics({uri:r,diagnostics:[]})}catch(e){$.warn(`error clearing diagnostics for ${r}: ${e}`)}})),p=!1,await Ce(r),await o.update(s,l,r)}),e.onRequest(Sd.req,e=>{$.debug`received request ${`locate`}, ${e}`;let r=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,r,e.property);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,r);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:r});case`view`in e:return t.ModelLocator.locateView(e.view,r);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,r,e.property);default:G(e)}}),e.onRequest(Cd.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(wd.req,async e=>{let a=null;for(let o of r.ProjectsManager.all)try{let r=await t.ModelBuilder.computeModel(o,e);if(r===ia.EMPTY)continue;a??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},a.elementKinds+=Nt(r.specification.elements).length,a.deploymentKinds+=Nt(r.specification.deployments).length,a.relationshipKinds+=Nt(r.specification.relationships).length,a.tags+=Nt(r.specification.tags).length,a.customColors+=Nt(r.specification.customColors??{}).length,a.elements+=Nt(r.$data.elements).length,a.deploymentNodes+=[...r.deployment.nodes()].length,a.relationships+=Nt(r.$data.relations).length,a.views+=Nt(r.$data.views).length,a.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${o}`,{err:e})}return await Ce(e),{metrics:a}}),e.onRequest(Td.req,async({documentUri:e},a)=>{let o=j.parse(e);$.debug`received request ${`GetDocumentTags`} for document ${o}`;let s=await t.ModelLocator.locateDocumentTags(o,a);return{projectId:r.ProjectsManager.ownerProjectId(o),tags:s??[]}}),e.onRequest(Ed.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),e.onRequest(Dd.req,async({projectId:e})=>($.debug`received request ${`FetchDiffs`} for project ${e}`,{diffs:await t.ModelDiffs.list(e)})),e.onRequest(Od.req,async e=>($.debug`received request ${`LayoutCompareView`} for ${e.viewId} and diff ${e.diffId}`,{diagram:await t.ModelDiffs.layoutCompareView(e)})),e.onRequest(kd.req,async({fqn:e,projectId:r})=>{$.debug`received request ${`FetchRemovalImpact`} for ${e}`;let[a,o]=await Promise.all([t.RemovalImpact.analyze([e],r),t.RemovalImpact.impactView([e],r)]);return{report:a,diagram:o}}),e.onRequest(Ad.req,async({request:e,projectId:r})=>{$.debug`received request ${`PreviewModelEdit`} (${e.type})`;let a=await t.ModelEdits.preview(e,r);return`error`in a?{preview:null,error:a.error}:{preview:a}}),e.onRequest(jd.req,async({request:e,token:r,projectId:a})=>($.debug`received request ${`ApplyModelEdit`} (${e.type})`,await t.ModelEdits.apply(e,{projectId:a,token:r}))),e.onRequest(Md.req,async({editId:e})=>($.debug`received request ${`RollbackModelEdit`} ${e??`latest`}`,await t.ModelEdits.rollback(e))));function reportLayoutDrift(e){return I(e,M(e=>!!e.hasLayoutDrift),V(e=>{let r=t.ModelLocator.locateView(e.id);return W(r,`View ${e.id} not found`),{uri:r.uri,viewId:e.id,severity:q.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:r.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;t?await t.sendNotification(fd.type,e):$.warn(`No LSP connection`)}async requestRemovalImpact(e){let t=this.services.shared.lsp.Connection;t?await t.sendNotification(Nd.type,e):$.warn(`No LSP connection`)}},LikeC4DocumentUpdateHandler=class extends Ae{services;#e=Y.getChild(`document-updater`);constructor(e){super(e),this.services=e}didChangeContent(e){this.#e.isEnabledFor(`trace`)&&this.#e.trace`didChangeContent ${e.document.uri}`,e.document.languageId===ql.languageId&&this.isNotExcluded(e.document)&&super.didChangeContent(e)}didChangeWatchedFiles(e){this.#e.isEnabledFor(`trace`)&&(this.#e.trace`didChangeWatchedFiles`,e.changes.forEach(e=>{this.#e.trace` - ${e.uri}`})),super.didChangeWatchedFiles(e)}getWatchers(){return[{globPattern:`**/*`}]}fireDocumentUpdate(e,t){let isLikeC4File=e=>hasLikeC4Ext(On(e.path))&&this.isNotExcluded(e),r=e.filter(isLikeC4File),a=t.filter(e=>isLikeC4File(e)||this.hasDocumentsIn(e)),o=e.filter(e=>En(e.path)===``&&!insideNodeModulesOrRepo(e.path)&&this.isNotExcluded(e));o.length===0?(r.length||a.length)&&super.fireDocumentUpdate(r,a):this.filterDirectories(o).then(e=>{(r.length||a.length||e.length)&&super.fireDocumentUpdate([...r,...e],a)})}hasDocumentsIn(e){let t=vt(e.toString());return this.services.workspace.LangiumDocuments.all.some(e=>e.uri.toString().startsWith(t))}async filterDirectories(e){let t=this.services.workspace.FileSystemProvider,r=await Promise.all(e.map(e=>t.stat(e).catch(()=>null)));return e.filter((e,t)=>r[t]?.isDirectory===!0)}onWatchedFilesChangeBy(e,t){let isNotExcluded=e=>this.isNotExcluded(e.uri);return this.onWatchedFilesChangeEmitter.event(({changes:r})=>{let a=r.filter(e).filter(isNotExcluded);R(a,1)&&t(a)})}isNotExcluded(e){return!this.services.workspace.ProjectsManager.isExcludedByWorkspace(e)}};st();var NodeKindProvider=class{services;constructor(e){this.services=e}getSymbolKind(e){let t=de(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(ts.$type,_s.$type,ko.$type,Eo.$type,Gs.$type):return ke.Constructor;case hasType(sc.$type,fc.$type,cc.$type,Is.$type,Kc.$type):return ke.Namespace;case hasType(Qs.$type):return ke.Struct;case hasType(il.$type,Ys.$type,Co.$type,qc.$type):return ke.EnumMember;case hasType(jc.$type,Wc.$type):return ke.Event;case hasType(rs.$type,jo.$type,Hc.$type,Vc.$type):return ke.TypeParameter}return ke.Field}getCompletionItemKind(e){let t=de(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Co.$type):return k.Color;case hasType(ts.$type,ko.$type,Eo.$type,_s.$type,Gs.$type):return k.Constructor;case hasType(sc.$type,fc.$type,cc.$type,Is.$type,Kc.$type):return k.Module;case hasType(Qs.$type):return k.Class;case hasType(il.$type,Ys.$type,Co.$type,qc.$type):return k.EnumMember;case hasType(jc.$type,Wc.$type):return k.Event;case hasType(rs.$type,Hc.$type,jo.$type,Vc.$type):return k.TypeParameter;default:return k.Reference}}},WorkspaceSymbolProvider=class extends nt{};const Pd=Y.getChild(`views`);var DefaultLikeC4Views=class extends ADisposable{services;#e;#t=new Br(e=>new ProjectStorage({projectId:e,storage:rr(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){super(),this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=ir(),this.onDispose(this.#e,C.create(()=>{this.#t.clear()}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{Pd.info`force clean cache`,this.#e.clear()}),e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e,viewId:t})=>{this.#t.has(e)&&(t?this.projectStorage(e).clearView(t):this.projectStorage(e).clearAll())}))}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return xn(r.$data.views)}async _layoutAllViews(e,t){let r=xn(e.$data.views);if(r.length===0)return[];let a=e.project.id,o=Pd.getChild(a),s=this.projectStorage(a),l=[],p=e.$styles,g=[];for(let e of r){let t={view:e,styles:p},r=await s.get(t);r?g.push(r):l.push(t)}if(g.length>0&&(l.length>0?o.trace`cached ${g.length} views, still need to layout ${l.length} views`:o.trace`cached all ${g.length} views`),l.length>0){let e=performanceMark();o.debug` -> layouting ${l.length} views`,await this.layouter.batchLayout({batch:l,cancelToken:t,onSuccess:(e,t)=>{g.push(s.remember(e,t))},onError:(e,t)=>{o.warn(`Fail layout view ${e.view.id}`,{error:t})}}),o.debug` <- layouted ${l.length} views in ${e.pretty}`}return t&&await Ce(t),g.length!==r.length&&o.warn`${g.length} of ${r.length} views were layouted`,g}async layoutAllViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(r,t)}async layoutView({viewId:e,layoutType:t,projectId:r,cancelToken:a,layoutHints:o}){let s=await this.ModelBuilder.computeModel(r,a),l=s.findView(e)?.$view;r=s.project.id;let p=Pd.getChild(r);if(o){W(l,`View ${e} not found in model`),p.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:r}=await this.layouter.aiLayout({view:l,styles:s.$styles},o);return{dot:t,diagram:r}}let g=this.projectStorage(r);if(!l){p.warn`view ${e} not found in model`;let r=s.findManualLayout(e);if(r&&t!==`manual`)return p.warn`view ${e} has manual layout, but requested layout type is ${t}, returning null`,null;if(r){p.info`found manual layout for ${e}`;let t={...r};return t.drifts=[`removed`],t._layout=`manual`,{diagram:t,dot:`# manual layout`}}return null}try{let e={view:l,styles:s.$styles},r=await g.getOrExecute(e);return P(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,s,t)}:r}catch(e){let t=loggable(e);return p.warn(t),this.reportViewError(l,r,t),Promise.reject(e)}}async diagrams(e,t){let r=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(r,t)).map(({diagram:e})=>this.withLayoutType(e,r,`manual`))}async viewsAsGraphvizOut(e,t){let r=`All-LayoutedViews-DotWithSvg`,a=this.services.shared.workspace.Cache;if(a.has(r))return await Promise.resolve(a.get(r));let o=await this.ModelBuilder.computeModel(e,t),s=xn(o.$data.views);if(s.length===0)return[];let l=s.map(async e=>{let{dot:t,svg:r}=await this.layouter.svg({view:e,styles:o.$styles});return{id:e.id,dot:t,svg:r}}),p=[],g=await Promise.allSettled(l);for(let e of g)e.status===`fulfilled`?p.push(e.value):logWarnError(e.reason);return a.set(r,p),p}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){Pd.trace`layouting adhoc view...`;let r=await this.ModelBuilder.computeModel(t),a=ga(r,e),{diagram:o}=await this.layouter.layout({view:{...a,hash:``,_type:`element`},styles:r.$styles});return Pd.debug`layouting adhoc view... done`,o}reportViewError(e,t,r){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${r}`)})}withLayoutType(e,t,r){if(!r)return e;let a=t.findManualLayout(e.id);return a?(e[Xr]===`manual`&&Pd.error`layouted view ${e.id} has ${e[Xr]} layout, expected auto or none`,r===`manual`?e[Xr]===`manual`?e:ti(e,a):ni(e,a)):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=Pd.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`;let a=performanceMark(),o=await this.#n(e);return this.#e.trace(`layouted {view} in ${a.pretty}`,{view:e.view.id}),await this.#t.set(t,o),this.resetViewError(e.view),o}remember=(e,t)=>{let r=cacheKey(e);return t&&(this.#t.set(r,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let r=`error:${e.id}`;this.#t.has(r).then(e=>{e||(this.#t.set(r,`true`),t())})}async clearView(e){this.resetViewError(e);let t=await this.#t.keys(`v:${e}:`);t.length!==0&&(this.#e.trace`clear ${t.length} cached entries for view ${e}`,await Promise.all(t.map(e=>this.#t.remove(e))))}clearAll(){this.#e.trace`clear caches`,this.#t.clear()}resetViewError(e){let t=typeof e==`string`?e:e.id;this.#t.del(`error:${t}`)}};function cacheKey(e){return`v:${e.view.id}:${e.view.hash}:${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:ei(e,t.diagram)}}const Fd={graphviz(){return new eo}};function WithGraphviz(e){return{graphviz(){return e}}}function createLikeC4SharedModule(e){return{lsp:{DocumentUpdateHandler:e=>new LikeC4DocumentUpdateHandler(e),NodeKindProvider:e=>new NodeKindProvider(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e),ExecuteCommandHandler:e=>new LikeC4ExecuteCommandHandler(e)},workspace:{Cache:e=>new se(e,E.Validated),IndexManager:e=>new IndexManager(e),LangiumDocuments:e=>new LangiumDocuments(e),ProjectsManager:e=>new au(e),WorkspaceManager:e=>new LikeC4WorkspaceManager(e),DocumentBuilder:e=>new LikeC4DocumentBuilder(e),FileSystemProvider:t=>e.fileSystemProvider(t),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),likec4:{DescriptionFiles:bind(LikeC4DescriptionFiles),LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new QueueGraphvizLayoter({graphviz:e.likec4.Graphviz}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),ModelDiffs:bind(LikeC4ModelDiffs),ModelEdits:bind(LikeC4ModelEdits),RemovalImpact:bind(LikeC4RemovalImpact),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DefinitionProvider:bind(LikeC4DefinitionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices$1(e={},t,r,a){let o=createSharedServices(e),s=[Ee({shared:o}),Xl,createLikeC4Module({...hu,...gu,...Fd,...e}),t,r,a].reduce(_merge,{}),l=ve(s);return o.ServiceRegistry.register(l),registerValidationChecks(l),e.connection?(trackClientCapabilities(o),o.workspace.WorkspaceManager.ready.then(()=>l.Rpc.init()).catch(e=>{Y.error(loggable(e))})):o.workspace.ConfigurationProvider.initialized({}),{shared:o,likec4:l}}e(createLanguageServices$1,`createLanguageServices`);function createSharedServices(e={}){let t={...hu,...gu,...e};return ve(Xe({...t,fileSystemProvider:()=>new NoopFileSystemProvider}),Yl,createLikeC4SharedModule(t))}function _merge(e,t){if(t)for(let[r,a]of Object.entries(t)){if(r===`__proto__`||r===`constructor`||r===`prototype`||a===void 0)continue;let t=Object.hasOwn(e,r),o=e[r];e[r]=t&&o!==null&&a!==null&&typeof o==`object`&&typeof a==`object`?_merge(o,a):a}return e}function configureLogger(e){let t=e?.configureLogger??!1;t!==!1&&configureLanguageServerLogger(t===`stderr`?{useStdErr:!0,colors:!1,logLevel:e?.logLevel}:{colors:la,logLevel:e?.logLevel})}function createLanguageServices(e){let t=Aa.getChild(`lang`),r=b(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),a=r.graphviz===`binary`;return t.info(`${Na.dim(`layout`)} ${a?`binary`:`wasm`}`),createLanguageServices$1({...r.useFileSystem?{...WithFileSystem(r.watch),...r.manualLayouts?lu:gu}:{...hu,...gu},...WithGraphviz(a?new GraphvizBinaryAdapter:new eo)})}async function fromWorkspace(e,t){let r=mr(e),a=j.file(r).toString(),o=vt(a),s=Aa.getChild(`lang`),l=b(t,{...Fa,useFileSystem:!0,manualLayouts:!0,watch:!1});configureLogger(l);let p=createLanguageServices(l),g={name:ur(r),uri:o},_=p.shared.workspace.WorkspaceManager;s.info(`${Na.dim(`workspace:`)} ${r}`),_.initialize({capabilities:{},processId:null,rootUri:g.uri,workspaceFolders:[g]}),await _.initialized({});let v=p.shared.workspace.LangiumDocuments.userDocuments.toArray();if(v.length===0&&(s.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw await p.likec4.likec4.LanguageServices.dispose(),Error(`no LikeC4 sources found`);return s.info(`${Na.dim(`workspace:`)} found ${v.length} source files`),handleInitOptions(p,Aa,t)}async function fromSources(e,t){configureLogger(t);let r=Aa.getChild(`lang`);return await createFromSources(createLanguageServices(b(t,{...Fa,useFileSystem:!1,watch:!1,manualLayouts:!1})),r,e,t)}function fromSource(e,t){return fromSources({"source.c4":e},t)}async function writeDSL(e,t,r){let a=await e.toDSL(r?.project),o=fr(t,r?.fileName??`model.c4`);return await lr(o,a,`utf-8`),o}export{loggable as C,getConsoleFormatter as S,configureLogger$1 as _,createLanguageServices$1 as a,getConsoleSink as b,lu as c,configureLanguageServerLogger as d,Y as f,Na as g,eo as h,writeDSL as i,co as l,QueueGraphvizLayoter as m,fromSources as n,WithGraphviz as o,GraphvizBinaryAdapter as p,fromWorkspace as r,WithFileSystem as s,fromSource as t,lo as u,createLogger as v,wrapError as w,getAnsiColorFormatter as x,Aa as y};