@likec4/mcp 1.51.0 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{r as e,s as t}from"./_chunks/rolldown-runtime.mjs";import{a as n,c as r,d as i,f as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g}from"./_chunks/libs/@radix-ui/colors.mjs";import{$ as _,A as ee,B as te,C as ne,D as re,E as ie,F as ae,G as oe,H as se,I as v,J as ce,K as le,L as ue,M as de,N as fe,O as y,P as pe,Q as me,R as he,S as ge,T as _e,U as ve,V as b,W as ye,X as be,Y as xe,Z as Se,_ as x,a as Ce,at as we,b as Te,c as Ee,ct as De,d as Oe,dt as ke,et as Ae,f as je,ft as Me,g as Ne,gt as Pe,h as Fe,ht as Ie,i as Le,it as S,j as C,k as Re,l as ze,lt as w,m as Be,mt as Ve,n as He,nt as Ue,o as We,ot as Ge,p as Ke,pt as qe,q as Je,r as Ye,rt as Xe,s as Ze,st as T,t as Qe,tt as $e,u as et,ut as tt,v as nt,w as rt,x as it,y as at,z as ot}from"./_chunks/libs/remeda.mjs";import{t as st}from"./_chunks/libs/natural-compare-lite.mjs";import{n as ct,t as lt}from"./_chunks/libs/@mantine/colors-generator.mjs";import{n as ut,t as dt}from"./_chunks/libs/graphology-dag.mjs";import{a as ft,i as pt,n as mt,o as ht,r as gt,s as _t,t as vt}from"./_chunks/libs/mnemonist.mjs";import{t as yt}from"./_chunks/libs/ohash.mjs";import{t as bt}from"./_chunks/libs/defu.mjs";import"./_chunks/libs/@ungap/structured-clone.mjs";import{n as xt}from"./_chunks/libs/hast-util-sanitize.mjs";import{t as St}from"./_chunks/libs/rehype-sanitize.mjs";import"./_chunks/libs/hast-util-to-html.mjs";import"./_chunks/libs/character-entities-legacy.mjs";import"./_chunks/libs/character-entities-html4.mjs";import"./_chunks/libs/ccount.mjs";import"./_chunks/libs/comma-separated-tokens.mjs";import{t as Ct}from"./_chunks/libs/rehype-stringify.mjs";import"./_chunks/libs/devlop.mjs";import{l as wt,t as Tt}from"./_chunks/libs/mdast-util-from-markdown.mjs";import"./_chunks/libs/escape-string-regexp.mjs";import"./_chunks/libs/mdast-util-find-and-replace.mjs";import"./_chunks/libs/mdast-util-gfm.mjs";import"./_chunks/libs/markdown-table.mjs";import"./_chunks/libs/longest-streak.mjs";import"./_chunks/libs/character-entities.mjs";import"./_chunks/libs/decode-named-character-reference.mjs";import"./_chunks/libs/micromark-extension-gfm.mjs";import{t as Et}from"./_chunks/libs/remark-gfm.mjs";import{t as Dt}from"./_chunks/libs/remark-github-blockquote-alert.mjs";import{t as Ot}from"./_chunks/libs/remark-parse.mjs";import"./_chunks/libs/mdast-util-to-hast.mjs";import{t as kt}from"./_chunks/libs/remark-rehype.mjs";import"./_chunks/libs/bail.mjs";import"./_chunks/libs/extend.mjs";import"./_chunks/libs/is-plain-obj.mjs";import"./_chunks/libs/trough.mjs";import{t as At}from"./_chunks/libs/unified.mjs";import{n as jt,t as Mt}from"./_chunks/libs/immer.mjs";import{a as Nt,i as Pt,n as Ft,r as It,t as Lt}from"./_chunks/libs/@logtape/logtape.mjs";import{n as Rt,t as zt}from"./_chunks/libs/merge-error-cause.mjs";import"./_chunks/libs/is-error-instance.mjs";import{t as Bt}from"./_chunks/libs/safe-stringify.mjs";import{t as Vt}from"./_chunks/libs/fast-equals.mjs";import{a as Ht,i as Ut,n as Wt,r as Gt,t as Kt}from"./_chunks/libs/@lume/kiwi.mjs";import{n as qt,r as Jt,t as E}from"./_chunks/libs/ts-graphviz.mjs";import{t as Yt}from"./_chunks/libs/word-wrap.mjs";import{n as Xt,r as Zt,t as Qt}from"./_chunks/libs/khroma.mjs";import{t as $t}from"./_chunks/libs/graphology.mjs";import{t as en}from"./_chunks/libs/p-limit.mjs";import"./_chunks/libs/eventemitter3.mjs";import{t as tn}from"./_chunks/libs/p-queue.mjs";import{n as nn,t as rn}from"./_chunks/libs/nano-spawn.mjs";import"./_chunks/libs/isexe.mjs";import{t as an}from"./_chunks/libs/which.mjs";import{$ as on,A as sn,B as cn,C as ln,D as un,E as dn,F as fn,G as pn,H as mn,I as hn,J as gn,K as _n,L as vn,M as yn,N as bn,O as xn,P as Sn,Q as Cn,R as wn,S as Tn,T as En,U as Dn,V as On,W as kn,X as An,Y as jn,Z as Mn,_ as Nn,a as Pn,at as Fn,b as In,c as Ln,ct as Rn,d as zn,dt as Bn,et as Vn,f as Hn,ft as Un,g as Wn,h as Gn,i as Kn,it as qn,j as Jn,k as Yn,l as Xn,lt as Zn,m as Qn,n as $n,nt as D,o as er,ot as tr,p as nr,q as rr,r as ir,rt as ar,s as or,st as sr,t as cr,tt as lr,u as ur,ut as dr,v as fr,w as pr,x as mr,y as hr,z as gr}from"./_chunks/libs/langium.mjs";import"./_chunks/libs/@chevrotain/regexp-to-ast.mjs";import"./_chunks/libs/chevrotain.mjs";import"./_chunks/libs/@chevrotain/cst-dts-gen.mjs";import"./_chunks/libs/@chevrotain/utils.mjs";import"./_chunks/libs/chevrotain-allstar.mjs";import{t as _r}from"./_chunks/libs/json5.mjs";import{J as O,i as vr,n as yr,r as br,t as xr}from"./_chunks/libs/@hono/mcp.mjs";import{n as Sr,t as Cr}from"./_chunks/libs/fdir.mjs";import{t as wr}from"./_chunks/libs/chokidar.mjs";import{a as Tr,c as k,d as A,f as Er,i as Dr,l as j,n as Or,o as kr,p as Ar,r as M,s as jr,t as Mr,u as Nr}from"./_chunks/libs/@modelcontextprotocol/sdk.mjs";import{a as Pr,c as Fr,d as Ir,i as Lr,l as Rr,n as zr,o as Br,r as Vr,s as Hr,t as Ur,u as Wr}from"./_chunks/libs/ufo.mjs";import"./_chunks/libs/parse-ms.mjs";import{t as Gr}from"./_chunks/libs/pretty-ms.mjs";import{t as Kr}from"./_chunks/libs/@hono/node-server.mjs";import{t as qr}from"./_chunks/libs/@msgpack/msgpack.mjs";import"./_chunks/libs/@smithy/is-array-buffer.mjs";import{t as Jr}from"./_chunks/libs/@smithy/util-base64.mjs";import{t as Yr}from"./_chunks/libs/strip-indent.mjs";import{n as Xr,t as Zr}from"./_chunks/libs/pathe.mjs";import{t as Qr}from"./_chunks/libs/tinyrainbow.mjs";import{n as $r,t as ei}from"./_chunks/libs/citty.mjs";import{basename as ti,dirname as ni,resolve as ri}from"node:path";import{Graphviz as ii}from"@hpcc-js/wasm-graphviz";import*as ai from"node:fs/promises";import{unlink as oi,writeFile as si}from"node:fs/promises";import ci from"node:os";import{pathToFileURL as li}from"url";import{isColorSupported as ui,isDevelopment as di}from"std-env";import{bundleRequire as fi}from"bundle-require";import{formatMessagesSync as pi}from"esbuild";import{mkdirSync as mi,statSync as hi}from"node:fs";const gi={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},_i={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},vi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},yi={primary:gi,blue:gi,secondary:_i,sky:_i,muted:vi,slate:vi,gray:{fill:`#737373`,stroke:`#525252`,hiContrast:`#fafafa`,loContrast:`#d4d4d4`},red:{fill:`#AC4D39`,stroke:`#853A2D`,hiContrast:`#FBD3CB`,loContrast:`#f5b2a3`},green:{fill:`#428a4f`,stroke:`#2d5d39`,hiContrast:`#f8fafc`,loContrast:`#c2f0c2`},amber:{fill:`#A35829`,stroke:`#7E451D`,hiContrast:`#FFE0C2`,loContrast:`#f9b27c`},indigo:{fill:`#6366f1`,stroke:`#4f46e5`,hiContrast:`#eef2ff`,loContrast:`#c7d2fe`}},bi={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},xi={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},Si={line:`#3b82f6`,labelBg:`#172554`,label:`#60a5fa`},Ci={line:`#0ea5e9`,labelBg:`#082f49`,label:`#38bdf8`},wi={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:Si,gray:bi,green:{line:`#15803d`,labelBg:`#052e16`,label:`#22c55e`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#818cf8`},muted:xi,primary:Si,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#f5b2a3`},secondary:Ci,sky:Ci,slate:xi},Ti={sizes:{xs:{width:180,height:100},sm:{width:240,height:135},md:{width:320,height:180},lg:{width:420,height:234},xl:{width:520,height:290}},spacing:{xs:8,sm:10,md:16,lg:24,xl:32},textSizes:{xs:13.33,sm:16,md:19.2,lg:23.04,xl:27.65},iconSizes:{xs:24,sm:36,md:60,lg:82,xl:90}},Ei=[`xs`,`sm`,`md`,`lg`,`xl`],Di=[`left`,`right`,`top`,`bottom`],Oi=[`solid`,`dashed`,`dotted`,`none`],ki=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],Ai=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],ji=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Mi={tomato:f.tomato9,grass:s.grass9,blue:u.blue9,ruby:i.ruby9,orange:m.orange9,indigo:n.indigo9,pink:r.pink9,teal:a.teal9,purple:c.purple9,amber:h.amber9,crimson:p.crimson9,red:g.red9,lime:d.lime9,yellow:o.yellow9,violet:l.violet9};function Ni(e){return e in Mi}const Pi={colors:Ai.reduce((e,t)=>(e[t]={elements:yi[t],relationships:wi[t]},e),{}),...Ti};var Fi=t(st(),1);function Ii(e,t){return e===t?0:de(e)?de(t)?(0,Fi.default)(e,t):1:de(t)?-1:0}function Li(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,Fi.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function N(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function P(e,t){if(!e)throw Error(t??`Invariant failed`)}function F(e){throw Error(`NonExhaustive value: ${e}`)}function Ri(e){let t=[],n=[];for(let[r,i]of we(e))C(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return w(n,Oe(Ii),y((e,t)=>({tag:e,spec:{color:N(ji[t%ji.length])}})),ke(t),Oe((e,t)=>Ii(e.tag,t.tag)),Ne(x(`tag`),x(`spec`)))}function zi(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,w(Qe(e,t),Ze(([e,t])=>n(e,t)),y(([e,t])=>e)))}function Bi(e){return e!=null&&typeof e==`string`}function Vi(e){return!!e&&Array.isArray(e)&&e.length>0}function Hi(...e){return(t=>e.some(e=>e(t)))}function Ui(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function Wi(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const Gi=e=>Bi(e)?e:e.id;function I(e,t){let n=Gi(e);return t?Gi(t).startsWith(n+`.`):e=>{let t=Gi(e);return n.startsWith(t+`.`)}}function Ki(e,t){if(!t)return t=>Ki(e,t);let n=Gi(e),r=Gi(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}function qi(e,t){return t?I(t,e):t=>I(e,t)}function Ji(e){return(Bi(e)?e:e.id).split(`.`).length}function Yi(e,t){let n=Bi(e)?e:e.id,r=Bi(t)?t:t.id;if(n===r)return 0;let i=Ji(n),a=Ji(r);if(Ki(n,r))return Math.abs(i-a);let o=Xi(n,r),s=o?Ji(o):0;return i+a-(2*s+1)}function Xi(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function Zi(e){let t=e.split(`.`);if(t.pop(),!T(t,2))return t;for(let e=1;e<t.length;e++)t[e]=t[e-1]+`.`+t[e];return t.reverse()}function Qi(e,t){let n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r:return-1;default:return 0}}function $i(e,t){return Qi(e.id,t.id)}function ea(e){return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>e.fqn.length-t.fqn.length).map(({item:e})=>e)}function ta(e,t){let n=t;for(let t of e)t!==n&&I(t,n)&&(n=t);return n===t?null:n}function na(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=ta(n,r);)t.push(...n.splice(n.indexOf(e),1));t.push(r)}return t}function ra(e,t){if(!e||Bi(e)){let t=e??`asc`;return e=>ra(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=Ii(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function ia(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function aa(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function oa(e,t){let n=t??e;P(ot(n));function*r(e){for(let t of e)n(t)&&(yield t)}return t?r(e):r}function sa(e,t){let n=t??e;P(ot(n));function r(e){for(let t of e)if(n(t))return t}return t?r(e):r}function ca(e){return e?la(e):la}function*la(e){for(let t of e)yield*t}function ua(e){return e?da(e):da}function da(e){let{value:t}=e[Symbol.iterator]().next();return t}function fa(e,t){let n=t??e;P(ot(n));function*r(e){for(let t of e)yield n(t)}return t?r(e):r}function pa(e,t){let n=t??e;P(ot(n));function r(e){for(let t of e)if(n(t))return!0;return!1}return t?r(e):r}function L(e){return e?Array.from(e):e=>Array.from(e)}function ma(e){return e?new Set(e):e=>new Set(e)}function ha(e){return e?ga(e):ga}function*ga(e){let t=new Set;for(let n of e)t.has(n)||(t.add(n),yield n)}function R(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function _a(...e){let t=100;return e.length===2?t=Fe(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function va(){return Promise.resolve().then(()=>void 0)}function ya(e){Promise.resolve().then(e)}const ba=(e,t)=>{let n=Xi(e.source.id,e.target.id),r=Xi(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?Qi(n,r):0;if(i!==0)return i;let a=Qi(e.source.id,t.source.id);return a===0?Qi(e.target.id,t.target.id):a};function xa(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function Sa(e,...t){let n=new Set;if(e.size===0)return n;let r=T(t,2)?(0,ht.intersection)(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function Ca(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function wa(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function Ta(e,t){return(0,ht.symmetricDifference)(e,t)}function Ea(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let n of e)if(t.has(n))return!0;return!1}function Da(e){return P(typeof e==`object`&&he(e),`objectHash: value must be an object`),yt(e)}function Oa(e){let t=5381,n=e.length;P(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}function ka(){return At().use(Ot).use(Et).use(Dt).use(kt,{allowDangerousHtml:!0}).use(St,bt({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`]},xt)).use(Ct,{allowDangerousHtml:!0})}function Aa(e){return(``+ka().processSync(e)).trim()}function ja(e){return wt(Tt(e),{includeHtml:!1,includeImageAlt:!1})}function Ma(e){P(ct.valid(e),`Invalid color: ${e}`);let t=lt(e),n=t[6],r=Na(n);return{elements:{fill:n,stroke:t[7],...r},relationships:{line:t[4],label:t[3],labelBg:t[9]}}}function Na(e){let t=ct(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=ct.contrastAPCA(t,n),s=ct.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!Je(n,i)||!Je(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:n.brighten(.4).hex(),loContrast:n.hex()}:{hiContrast:r.darken(.4).hex(),loContrast:r.hex()}}const Pa={color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}},Fa=Pi,Ia=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function z(e){return rt(e,e=>e===void 0)}function La(e){return e.summary??e.description}function Ra(e){return e.description??e.summary}const za={center({x:e,y:t,width:n,height:r}){return{x:e+n/2,y:t+r/2}},toPoints({x:e,y:t,width:n,height:r}){return[{x:e,y:t},{x:e+n,y:t},{x:e+n,y:t+r},{x:e,y:t+r}]},fromPoints(e){let{x1:t,y1:n,x2:r,y2:i}=Ba.fromPoints(e);return{x:t,y:n,width:r-t,height:i-n}},merge(...e){if(P(T(e,1),`No boxes provided`),e.length===1)return e[0];let t=e[0].x,n=e[0].y,r=e[0].x+e[0].width,i=e[0].y+e[0].height;for(let a=1;a<e.length;a++){let o=e[a];t=Math.min(t,o.x),n=Math.min(n,o.y),r=Math.max(r,o.x+o.width),i=Math.max(i,o.y+o.height)}return{x:Math.floor(t),y:Math.floor(n),width:Math.round(r-t),height:Math.round(i-n)}},fromRectBox(e){return{x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),width:Math.abs(e.x2-e.x1),height:Math.abs(e.y2-e.y1)}},toRectBox(e){return{x1:e.x,y1:e.y,x2:e.x+e.width,y2:e.y+e.height}},expand(e,t){return t===0?e:{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}},shrink(e,t){return t===0?e:{x:e.x+t,y:e.y+t,width:e.width-t*2,height:e.height-t*2}},includes(e,t){return e===t?!0:e.x<=t.x&&e.y<=t.y&&e.x+e.width>=t.x+t.width&&e.y+e.height>=t.y+t.height}},Ba={center({x1:e,y1:t,x2:n,y2:r}){return{x:(e+n)/2,y:(t+r)/2}},fromPoints(e){P(e.length>0,`At least one point is required`);let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let[a,o]of e)t=Math.min(t,a),n=Math.min(n,o),r=Math.max(r,a),i=Math.max(i,o);return{x1:t,y1:n,x2:r,y2:i}},merge(...e){P(e.length>0,`No boxes provided`);let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x1),n=Math.min(n,a.y1),r=Math.max(r,a.x2),i=Math.max(i,a.y2);return{x1:t,y1:n,x2:r,y2:i}},toBBox(e){return{x:e.x1,y:e.y1,width:e.x2-e.x1,height:e.y2-e.y1}},includes(e,t){return e===t?!0:e.x1<=t.x1&&e.y1<=t.y1&&e.x2>=t.x2&&e.y2>=t.y2}};var Va=class e{constructor(e,t){this.x=e,this.y=t,P(typeof e==`number`&&!isNaN(e)&&isFinite(e)&&typeof t==`number`&&!isNaN(t)&&isFinite(t),`Invalid arguments for Vector: (${e}, ${t})`)}static create(...t){return t.length===2?new e(t[0],t[1]):new e(t[0].x,t[0].y)}static add(e,t){return{x:e.x+t.x,y:e.y+t.y}}static subtract(e,t){return{x:e.x-t.x,y:e.y-t.y}}static multiply(e,t){return{x:e.x*t,y:e.y*t}}static divide(e,t){return{x:e.x/t,y:e.y/t}}static dot(e,t){return e.x*t.x+e.y*t.y}add(t){return new e(this.x+t.x,this.y+t.y)}subtract(t){return new e(this.x-t.x,this.y-t.y)}multiply(t){return new e(this.x*t,this.y*t)}divide(t){return new e(this.x/t,this.y/t)}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}length(){return this.x===0&&this.y===0?0:Math.sqrt(this.x**2+this.y**2)}normalize(){let t=this.length();return t===0?new e(0,0):new e(this.x/t,this.y/t)}round(){return new e(Math.round(this.x),Math.round(this.y))}trunc(){return new e(Math.trunc(this.x),Math.trunc(this.y))}toObject(){return{x:this.x,y:this.y}}};function Ha(e,t){return e[Ua]===t}const Ua=`_stage`,Wa=`_type`,Ga=`_layout`;function Ka(e){return e}function qa(e){return typeof e==`string`?{txt:e}:e}function Ja(e){if(te(e))return null;let t=de(e)?e:e.txt??e.md;return C(t?.trim())?t:null}function Ya(e,t){return t?t+`.`+e:e}const Xa=`@group`;function Za(e){return e.kind===Xa}function Qa(e){return e}function $a(e,t){return P(typeof e==`string`&&e!=``),`@`+e+`.`+t}function eo(e){return e.startsWith(`@`)}function to(e){if(!e.startsWith(`@`))return[null,e];let t=e.indexOf(`.`);if(t<2)throw Error(`Invalid global FQN`);return[e.slice(1,t),e.slice(t+1)]}function no(e,t){let n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}function ro(e){return e.startsWith(`step-`)}function io(e){if(!ro(e))throw Error(`Invalid step edge id: ${e}`);return parseFloat(e.slice(5))}let B;(function(e){function t(e){return`model`in e&&!(`project`in e)}e.isElementRef=t;function n(e){return`project`in e&&`model`in e}e.isImportRef=n;function r(e){if(de(e))throw Error(`Expected FqnRef, got: "${e}"`);if(n(e))return $a(e.project,e.model);if(t(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=r;function i(e){return t(e)||n(e)}e.isModelRef=i;function a(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=a;function o(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=o;function s(e){return o(e)||a(e)}e.isDeploymentRef=s})(B||={});let V;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&B.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`ref`in e&&B.isDeploymentRef(e.ref)}e.isDeploymentRef=r;function i(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=i;function a(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=a;function o(e){return`where`in e&&c(e.where.expr)}e.isWhere=o;function s(e){return`custom`in e&&(c(e.custom.expr)||o(e.custom.expr))}e.isCustom=s;function c(e){return t(e)||n(e)||r(e)||i(e)||a(e)}e.is=c;function l(e){return s(e)&&(e=e.custom.expr),o(e)&&(e=e.where.expr),e}e.unwrap=l})(V||={});let ao;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(ao||={});let oo;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return ao.isWhere(e)}e.isRelationWhere=n;function r(e){return V.isWhere(e)}e.isFqnExprWhere=r;function i(e){return V.is(e)||V.isWhere(e)||V.isCustom(e)}e.isFqnExpr=i;function a(e){return ao.is(e)||ao.isWhere(e)||ao.isCustom(e)}e.isRelation=a})(oo||={});let H;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&B.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=r;function i(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=i;function a(e){return`where`in e&&s(e.where.expr)}e.isWhere=a;function o(e){return`custom`in e&&(s(e.custom.expr)||a(e.custom.expr))}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.custom.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(H||={});let so;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(so||={});let co;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return so.isWhere(e)}e.isRelationWhere=n;function r(e){return H.isWhere(e)}e.isFqnExprWhere=r;function i(e){return H.is(e)||H.isWhere(e)||H.isCustom(e)}e.isFqnExpr=i;function a(e){return so.is(e)||so.isWhere(e)||so.isCustom(e)}e.isRelationExpr=a})(co||={});function lo(e){return C(e.kind)&&!C(e.element)}function uo({size:e,padding:t,textSize:n,iconSize:r,...i},a=zo.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}function fo(e){return`tag`in e}function po(e){return`kind`in e}function mo(e){return`participant`in e}function ho(e){return`not`in e}function go(e){return`and`in e}function _o(e){return`or`in e}function vo(e){switch(!0){case mo(e):{let t=e.participant;return yo(t,vo(e.operator))}case fo(e):{if(de(e.tag)||`eq`in e.tag){let t=de(e.tag)?e.tag:e.tag.eq;return e=>Array.isArray(e.tags)&&e.tags.includes(t)}let t=e.tag.neq;return e=>!Array.isArray(e.tags)||!e.tags.includes(t)}case po(e):{if(de(e.kind)||`eq`in e.kind){let t=de(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>v(e.kind)||e.kind!==t}case ho(e):return ue(vo(e.not));case go(e):return Ie(e.and.map(vo));case _o(e):return Ve(e.or.map(vo));default:F(e)}}function yo(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function bo(e){return`include`in e||`exclude`in e}function xo(e){return`targets`in e&&`style`in e}function So(e){return e._type===`element`}function Co(e){return So(e)&&C(e.extends)}function wo(e){return e._type===`deployment`}function To(e){return e._type===`dynamic`}function Eo(e){return`styleId`in e}function Do(e){return`predicateId`in e}function Oo(e){return e===`TB`||e===`BT`||e===`LR`||e===`RL`}function ko(e){return`direction`in e}function Ao(e){return ro(e)&&e.includes(`.`)?e.slice(0,e.indexOf(`.`)+1):null}function jo(e){return!!e&&`__parallel`in e&&ye(e.__parallel)}function Mo(e){return!!e&&`__series`in e&&ye(e.__series)}function No(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}function Po(e){return`rank`in e&&Array.isArray(e.targets)}const Fo=Symbol.for(`text`),Io=Symbol.for(`html`);var Lo=class e{static mdcache=new pt.default(500);static txtcache=new pt.default(500);static getOrCreateFromText(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.txtcache.get(t);return n||(n=new e({txt:t}),e.txtcache.set(t,n),n)}static getOrCreateFromMarkdown(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.mdcache.get(t);return n||(n=new e({md:t}),e.mdcache.set(t,n),n)}static memoize(t,n,r){return R(t,n,()=>e.from(r))}static from(t){return t==null||t===e.EMPTY?e.EMPTY:t instanceof e?t:typeof t==`string`?this.getOrCreateFromText(t):`isEmpty`in t&&t.isEmpty?e.EMPTY:`md`in t?this.getOrCreateFromMarkdown(t.md):this.getOrCreateFromText(t.txt)}static EMPTY=new class extends e{isEmpty=!0;nonEmpty=!1;isMarkdown=!1;$source=null;constructor(){super({txt:``})}get text(){return null}get md(){return null}get html(){return null}};$source;isEmpty;nonEmpty;isMarkdown;constructor(e){this.isMarkdown=!1,typeof e==`string`?(this.$source={txt:e},this.isEmpty=e.trim()===``):(this.$source=e,this.isEmpty=!0,`md`in e?(this.isEmpty=e.md===``,this.isMarkdown=!0):this.isEmpty=e.txt===``),this.nonEmpty=!this.isEmpty}get text(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Fo,()=>ja(e.md))}get md(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;if(`md`in e)return e.md;if(`txt`in e)return e.txt;F(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Io,()=>Aa(e.md))}equals(t){return this===t?!0:t instanceof e?this.isEmpty&&t.isEmpty?!0:this.isEmpty!==t.isEmpty||this.isMarkdown!==t.isMarkdown?!1:this.isMarkdown?this.$source?.md===t.$source?.md:this.$source?.txt===t.$source?.txt:!1}};function Ro(e,t){let n=t??6,r=ct(e.fill),i=ct(e.stroke),a=r.luminance()>.8,o=w(Qe(ct.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),ct.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),y(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return P(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const zo={theme:Fa,defaults:Pa};var Bo=class e{theme;defaults;static DEFAULT=new e(zo);static from(t,n){if(!t&&!n)return this.DEFAULT;let{customCss:r,theme:i,defaults:a}={...t},o=bt({theme:i},{defaults:{...a}},{theme:{colors:{...n}}},zo);return te(r?.content)&&Je(o,zo)?this.DEFAULT:new e(o,r)}constructor(e,t){this.config=e,this.customCss=t,this.theme=e.theme,this.defaults=e.defaults}get elementColors(){return this.theme.colors[this.defaults.color].elements}get relationshipColors(){return this.theme.colors[this.defaults.relationship.color].relationships}get groupColors(){let e=this.defaults.group?.color;if(!e)return this.elementColors;if(!this.isThemeColor(e))throw Error(`Default group color not found in theme: ${e}`);return R(this,`defaultGroup`,()=>({...this.elementColors,...this.theme.colors[e].elements}))}isDefaultColor(e){return e===this.defaults.color}colors(e){return this.computeFrom(e??=this.defaults.color)}compoundColorsCache=new mt.default(e=>new vt.default(t=>Ro(e,t)));colorsForCompounds(e,t){return this.compoundColorsCache.get(e).get(t??6)}fontSize(e){return e??=this.defaults.text??this.defaults.size,this.theme.textSizes[e]}padding(e){return e??=this.defaults.padding??this.defaults.size,this.theme.spacing[e]}iconSize(e){return e??=this.defaults.size,this.theme.iconSizes[e]}isThemeColor(e){return e in this.theme.colors}nodeSizes(e){let t=uo(e,this.defaults.size);return{sizes:t,values:{sizes:this.theme.sizes[t.size],padding:this.padding(t.padding),textSize:this.fontSize(t.textSize),iconSize:this.iconSize(t.iconSize)}}}computeFrom(e){if(this.isThemeColor(e))return this.theme.colors[e];if(!ct.valid(e))throw Error(`Invalid color value: "${e}" (not a theme color and not a valid CSS color)`);return Ma(e)}equals(e){return e===this?!0:this.constructor===e.constructor?Je(this.config,e.config)&&Je(this.customCss??null,e.customCss??null):!1}tagColor(e){return this.isThemeColor(e)?this.theme.colors[e].elements:Ni(e)?this.computeFrom(Mi[e]).elements:this.computeFrom(e).elements}};function Vo(e){return w(e,S(e=>!!e.notation),xe(x(`notation`)),ie(nt(xe(x(`shape`)),ie(nt(xe(x(`color`)),ie(nt(y(x(`kind`)),Ce())),we(),y(([e,t])=>({kinds:t,color:e})))),we(),_(([e,t])=>t.map(({color:t,kinds:n})=>({shape:e,color:t,kinds:n}))))),we(),_(([e,t])=>t.map(({shape:t,color:n,kinds:r})=>({title:e,shape:t,color:n,kinds:r}))),et(x(`shape`),x(`title`),[e=>e.kinds.length,`desc`]))}const Ho=(e,t)=>e===t||v(e)&&v(t)?!1:!Je(e,t);function Uo(e,t){e.color=t.color,e.kind=t.kind,e.navigateTo=t.navigateTo??null,e.links=t.links?[...t.links]:null,e.tags=[...t.tags],v(t.style.border)?delete e.style.border:e.style.border=t.style.border,ae(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,v(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function Wo(e,t,n){if(Ho(t.icon??`none`,e.icon??`none`)){let r=C(e.icon)&&e.icon!==`none`;switch(!0){case r&&C(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case r&&(v(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!r&&C(t.icon)&&t.icon!==`none`:return n?(e.icon=t.icon,!0):!1}}return!0}function Go(e,t,n){let r=!0;return Ho(e.style.iconColor,t.style.iconColor)&&(v(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),Ho(e.style.iconSize,t.style.iconSize)&&(n?v(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:r=!1),Ho(e.style.iconPosition,t.style.iconPosition)&&(n?v(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:r=!1),r}function Ko(e,t){return e?`md`in t?(e.md=t.md,delete e.txt,e):(`txt`in t&&(e.txt=t.txt,delete e.md),e):t}function qo(e,t,n){let r=!0;return Ho(e.title,t.title)&&(n?e.title=t.title:r=!1),Ho(e.description,t.description)&&(v(t.description)?delete e.description:n?e.description=Ko(e.description,t.description):r=!1),Ho(e.technology,t.technology)&&(v(t.technology)?delete e.technology:n?e.technology=t.technology:r=!1),r}function Jo(e,t,n){return e.title=t.title,v(t.description)?delete e.description:e.description=Ko(e.description,t.description),v(t.technology)?delete e.technology:e.technology=t.technology,!0}function Yo(e,t){P(e.id===t.id,`applyManualLayout: view ids do not match`),P(e._stage===`layouted`,`applyManualLayout: expected layouted view`),P(t._stage===`layouted`,`applyManualLayout: expected layouted snapshot`),P(e._layout!==`manual`,`applyManualLayout: expected auto-layouted view`);let n=new Set;e._type!==t._type&&n.add(`type-changed`);let r=Xo(t.nodes,e.nodes,n),i=Zo(t.edges,e.edges,n),a=Vo(r);return jt(t,o=>{o.title=e.title??t.title,o.description=e.description??t.description,o.tags=e.tags?[...e.tags]:null,o.links=e.links?[...e.links]:null,o.sourcePath=e.sourcePath,o[Ga]=`manual`,a&&a.length>0?o.notation={nodes:a}:delete o.notation,o.nodes=Mt(r),o.edges=Mt(i),To(e)&&o._type===`dynamic`&&(o.variant=e.variant),So(e)&&o._type===`element`&&(e.viewOf?o.viewOf=e.viewOf:delete o.viewOf,e.extends?o.extends=e.extends:delete o.extends);let s=[...n];T(s,1)?o.drifts=s:(o.hash=e.hash,delete o.drifts)})}function Xo(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id);return t?(r.delete(t.id),jt(e,r=>{Uo(r,t);let i=new Set,a=e.children.length>0,o=t.children.length>0;(Ho(r.modelRef,t.modelRef)||Ho(r.deploymentRef,t.deploymentRef))&&i.add(`modelRef-changed`),o&&!a&&i.add(`became-compound`),!o&&a&&i.add(`became-leaf`),Ho(r.parent,t.parent)&&i.add(`parent-changed`);let s=r.width+5>=t.width&&r.height+5>=t.height;Ho(r.shape,t.shape)&&(s?r.shape=t.shape:i.add(`shape-changed`)),Go(r,t,s)||i.add(`label-changed`),Wo(r,t,s&&o===a)||i.add(`label-changed`),(a?Jo:qo)(r,t,s)||i.add(`label-changed`),Ho(r.notes,t.notes)&&(v(t.notes)?delete r.notes:r.notes=Ko(r.notes,t.notes)),Ho(e.notation,t.notation)&&(r.notation=t.notation??null),a&&o&&Ta(new Set(e.children),new Set(t.children)).size>0&&i.add(`children-changed`);let c=[...i];T(c,1)?(n.add(`nodes-drift`),r.drifts=c):delete r.drifts})):(n.add(`nodes-removed`),{...e,drifts:[`removed`]})});return r.size>0&&n.add(`nodes-added`),i}function Zo(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id)??w(r.values(),oa(t=>t.source===e.source&&t.target===e.target),ua());return t&&r.delete(t.id),jt(e,r=>{if(!t){r.drifts=[`removed`],n.add(`edges-removed`);return}let i=new Set,a=e.id===t.id;switch(!0){case a&&e.source==t.source&&e.target==t.target:Ho(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break;case a&&e.source==t.target&&e.target==t.source:e.source!==e.target&&i.add(`direction-changed`);break;case a:e.source!=t.source&&i.add(`source-changed`),e.target!=t.target&&i.add(`target-changed`);break;default:P(e.id!=t.id,`Unexpected case in edge drift detection, ids should not match`),P(e.source==t.source,`Unexpected case in edge drift detection, sources should match`),P(e.target==t.target,`Unexpected case in edge drift detection, targets should match`),Ho(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break}if(r.color=t.color,r.line=t.line,r.navigateTo=t.navigateTo??null,r.tags=t.tags?[...t.tags]:null,Ho(e.notes,t.notes)&&(v(e.notes)!==v(t.notes)&&i.add(`notes-changed`),r.notes=t.notes??e.notes),t.astPath?r.astPath=t.astPath:delete r.astPath,Ho(Te(e,[`label`,`description`,`technology`,`labelBBox`]),Te(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:i.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:i.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(r.labelBBox.width=Math.round(t.labelBBox.width),r.labelBBox.height=Math.round(t.labelBBox.height)),Ho(e.label,t.label)&&(v(t.label)!==v(e.label)&&i.add(`label-changed`),r.label=t.label??e.label),Ho(e.description,t.description)&&(v(t.description)!==v(e.description)&&i.add(`label-changed`),t.description&&(r.description=Ko(e.description,t.description))),Ho(e.technology,t.technology)&&(v(t.technology)!==v(e.technology)&&i.add(`label-changed`),r.technology=t.technology??e.technology??null);break;default:P(!e.labelBBox,`Unexpected case in edge labelBBox drift detection`),P(!t.labelBBox,`Unexpected case in next labelBBox drift detection`);break}let o=[...i];T(o,1)?(n.add(`edges-drift`),r.drifts=o):delete r.drifts})});return r.size>0&&n.add(`edges-added`),i}function Qo(e,t){let{drifts:n,...r}=Yo(e,t);if(!n||n.length===0)return jt(e,e=>{delete e.drifts,e[Ga]=`auto`});let i=new Set;n.includes(`type-changed`)&&i.add(`type-changed`);let a=new Map(r.nodes.map(e=>[e.id,e])),o=new Map(r.edges.map(e=>[e.id,e])),s=e.nodes.map(e=>{let t=a.get(e.id);return t&&a.delete(t.id),jt(e,e=>{if(!t){i.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(i.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});a.size>0&&i.add(`nodes-removed`);let c=e.edges.map(e=>{let t=o.get(e.id)??w(o.values(),oa(t=>t.source===e.source&&t.target===e.target),ua());return t&&o.delete(t.id),jt(e,e=>{if(!t){i.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(i.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});o.size>0&&i.add(`edges-removed`);let l=[...i];return jt(e,e=>{T(l,1)?e.drifts=l:delete e.drifts,e.nodes=Mt(s),e.edges=Mt(c),e[Ga]=`auto`})}const $o=e=>e.split(`
2
+ import{r as e,s as t}from"./_chunks/rolldown-runtime.mjs";import{a as n,c as r,d as i,f as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,u as g}from"./_chunks/libs/@radix-ui/colors.mjs";import{$ as ee,A as te,B as ne,C as re,D as ie,E as ae,F as oe,G as se,H as _,I as ce,J as le,K as ue,L as v,M as y,N as de,O as b,P as fe,Q as pe,R as me,S as he,T as ge,U as _e,V as ve,W as ye,X as be,Y as xe,Z as Se,_ as x,_t as Ce,a as we,at as S,b as Te,c as Ee,ct as C,d as De,dt as Oe,et as w,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,s as Qe,st as $e,t as et,tt,u as nt,ut as T,v as rt,w as it,x as at,y as ot,z as st}from"./_chunks/libs/remeda.mjs";import{t as ct}from"./_chunks/libs/natural-compare-lite.mjs";import{n as lt,t as ut}from"./_chunks/libs/@mantine/colors-generator.mjs";import{n as dt,t as ft}from"./_chunks/libs/graphology-dag.mjs";import{a as pt,i as mt,n as ht,o as gt,r as _t,s as vt,t as E}from"./_chunks/libs/mnemonist.mjs";import{t as yt}from"./_chunks/libs/ohash.mjs";import{t as bt}from"./_chunks/libs/defu.mjs";import"./_chunks/libs/@ungap/structured-clone.mjs";import{n as xt}from"./_chunks/libs/hast-util-sanitize.mjs";import{t as St}from"./_chunks/libs/rehype-sanitize.mjs";import"./_chunks/libs/hast-util-to-html.mjs";import"./_chunks/libs/character-entities-legacy.mjs";import"./_chunks/libs/character-entities-html4.mjs";import"./_chunks/libs/ccount.mjs";import"./_chunks/libs/comma-separated-tokens.mjs";import{t as Ct}from"./_chunks/libs/rehype-stringify.mjs";import"./_chunks/libs/devlop.mjs";import{l as wt,t as Tt}from"./_chunks/libs/mdast-util-from-markdown.mjs";import"./_chunks/libs/escape-string-regexp.mjs";import"./_chunks/libs/mdast-util-find-and-replace.mjs";import"./_chunks/libs/mdast-util-gfm.mjs";import"./_chunks/libs/markdown-table.mjs";import"./_chunks/libs/longest-streak.mjs";import"./_chunks/libs/character-entities.mjs";import"./_chunks/libs/decode-named-character-reference.mjs";import"./_chunks/libs/micromark-extension-gfm.mjs";import{t as Et}from"./_chunks/libs/remark-gfm.mjs";import{t as Dt}from"./_chunks/libs/remark-github-blockquote-alert.mjs";import{t as Ot}from"./_chunks/libs/remark-parse.mjs";import"./_chunks/libs/mdast-util-to-hast.mjs";import{t as kt}from"./_chunks/libs/remark-rehype.mjs";import"./_chunks/libs/bail.mjs";import"./_chunks/libs/extend.mjs";import"./_chunks/libs/is-plain-obj.mjs";import"./_chunks/libs/trough.mjs";import{t as At}from"./_chunks/libs/unified.mjs";import{n as jt,t as Mt}from"./_chunks/libs/immer.mjs";import{a as Nt,i as Pt,n as Ft,r as It,t as Lt}from"./_chunks/libs/@logtape/logtape.mjs";import{n as Rt,t as zt}from"./_chunks/libs/merge-error-cause.mjs";import"./_chunks/libs/is-error-instance.mjs";import{t as Bt}from"./_chunks/libs/safe-stringify.mjs";import{a as Vt,i as Ht,n as Ut,r as Wt,t as Gt}from"./_chunks/libs/@lume/kiwi.mjs";import{n as Kt,r as qt,t as D}from"./_chunks/libs/ts-graphviz.mjs";import{t as Jt}from"./_chunks/libs/word-wrap.mjs";import{n as Yt,r as Xt,t as Zt}from"./_chunks/libs/khroma.mjs";import{t as Qt}from"./_chunks/libs/graphology.mjs";import{t as $t}from"./_chunks/libs/p-limit.mjs";import"./_chunks/libs/eventemitter3.mjs";import{t as en}from"./_chunks/libs/p-queue.mjs";import{n as tn,t as nn}from"./_chunks/libs/nano-spawn.mjs";import"./_chunks/libs/isexe.mjs";import{t as rn}from"./_chunks/libs/which.mjs";import{$ as an,A as on,B as sn,C as cn,D as ln,E as un,F as dn,G as fn,H as pn,I as mn,J as hn,K as gn,L as _n,M as vn,N as yn,O as bn,P as xn,Q as Sn,R as Cn,S as wn,T as Tn,U as En,V as Dn,W as On,X as kn,Y as An,Z as jn,_ as Mn,a as Nn,at as Pn,b as Fn,c as In,ct as Ln,d as Rn,dt as zn,et as Bn,f as Vn,ft as Hn,g as Un,h as Wn,i as Gn,it as Kn,j as qn,k as Jn,l as Yn,lt as Xn,m as Zn,mt as Qn,n as $n,nt as er,o as tr,ot as nr,p as rr,pt as ir,q as ar,r as or,rt as sr,s as cr,st as lr,t as ur,tt as dr,u as fr,ut as pr,v as mr,w as hr,x as gr,y as _r,z as vr}from"./_chunks/libs/langium.mjs";import"./_chunks/libs/@chevrotain/regexp-to-ast.mjs";import"./_chunks/libs/chevrotain.mjs";import"./_chunks/libs/@chevrotain/cst-dts-gen.mjs";import"./_chunks/libs/@chevrotain/utils.mjs";import"./_chunks/libs/chevrotain-allstar.mjs";import{t as yr}from"./_chunks/libs/json5.mjs";import{J as O,i as br,n as xr,r as Sr,t as Cr}from"./_chunks/libs/@hono/mcp.mjs";import{n as wr,t as Tr}from"./_chunks/libs/fdir.mjs";import{t as Er}from"./_chunks/libs/chokidar.mjs";import"./_chunks/libs/parse-ms.mjs";import{t as Dr}from"./_chunks/libs/pretty-ms.mjs";import{a as Or,c as kr,d as Ar,i as jr,l as Mr,n as Nr,o as Pr,r as Fr,s as Ir,t as Lr,u as Rr}from"./_chunks/libs/ufo.mjs";import{a as zr,c as k,d as A,f as Br,i as Vr,l as j,n as Hr,o as Ur,p as Wr,r as M,s as Gr,t as Kr,u as qr}from"./_chunks/libs/@modelcontextprotocol/sdk.mjs";import{t as Jr}from"./_chunks/libs/@hono/node-server.mjs";import"./_chunks/libs/fast-equals.mjs";import{t as Yr}from"./_chunks/libs/strip-indent.mjs";import"./_chunks/libs/destr.mjs";import{n as Xr,t as Zr}from"./_chunks/libs/unstorage.mjs";import{n as Qr,t as $r}from"./_chunks/libs/pathe.mjs";import{t as ei}from"./_chunks/libs/tinyrainbow.mjs";import{n as ti,t as ni}from"./_chunks/libs/citty.mjs";import{basename as ri,dirname as ii,resolve as ai}from"node:path";import{Graphviz as oi}from"@hpcc-js/wasm-graphviz";import*as si from"node:fs/promises";import{unlink as ci,writeFile as li}from"node:fs/promises";import ui from"node:os";import{pathToFileURL as di}from"url";import{isColorSupported as fi,isDevelopment as pi}from"std-env";import{bundleRequire as mi}from"bundle-require";import{formatMessagesSync as hi}from"esbuild";import{mkdirSync as gi,statSync as _i}from"node:fs";const vi={fill:`#3b82f6`,stroke:`#2563eb`,hiContrast:`#eff6ff`,loContrast:`#bfdbfe`},yi={fill:`#0284c7`,stroke:`#0369a1`,hiContrast:`#f0f9ff`,loContrast:`#B6ECF7`},bi={fill:`#64748b`,stroke:`#475569`,hiContrast:`#f8fafc`,loContrast:`#cbd5e1`},xi={primary:vi,blue:vi,secondary:yi,sky:yi,muted:bi,slate:bi,gray:{fill:`#737373`,stroke:`#525252`,hiContrast:`#fafafa`,loContrast:`#d4d4d4`},red:{fill:`#AC4D39`,stroke:`#853A2D`,hiContrast:`#FBD3CB`,loContrast:`#f5b2a3`},green:{fill:`#428a4f`,stroke:`#2d5d39`,hiContrast:`#f8fafc`,loContrast:`#c2f0c2`},amber:{fill:`#A35829`,stroke:`#7E451D`,hiContrast:`#FFE0C2`,loContrast:`#f9b27c`},indigo:{fill:`#6366f1`,stroke:`#4f46e5`,hiContrast:`#eef2ff`,loContrast:`#c7d2fe`}},Si={line:`#8D8D8D`,labelBg:`#18191B`,label:`#C9C9C9`},Ci={line:`#64748b`,labelBg:`#0f172a`,label:`#cbd5e1`},wi={line:`#3b82f6`,labelBg:`#172554`,label:`#60a5fa`},Ti={line:`#0ea5e9`,labelBg:`#082f49`,label:`#38bdf8`},Ei={amber:{line:`#b45309`,labelBg:`#78350f`,label:`#FFE0C2`},blue:wi,gray:Si,green:{line:`#15803d`,labelBg:`#052e16`,label:`#22c55e`},indigo:{line:`#6366f1`,labelBg:`#1e1b4b`,label:`#818cf8`},muted:Ci,primary:wi,red:{line:`#AC4D39`,labelBg:`#b91c1c`,label:`#f5b2a3`},secondary:Ti,sky:Ti,slate:Ci},Di={sizes:{xs:{width:180,height:100},sm:{width:240,height:135},md:{width:320,height:180},lg:{width:420,height:234},xl:{width:520,height:290}},spacing:{xs:8,sm:10,md:16,lg:24,xl:32},textSizes:{xs:13.33,sm:16,md:19.2,lg:23.04,xl:27.65},iconSizes:{xs:24,sm:36,md:60,lg:82,xl:90}},Oi=[`xs`,`sm`,`md`,`lg`,`xl`],ki=[`left`,`right`,`top`,`bottom`],Ai=[`solid`,`dashed`,`dotted`,`none`],ji=[`rectangle`,`person`,`browser`,`mobile`,`cylinder`,`storage`,`queue`,`bucket`,`document`,`component`],Mi=[`amber`,`blue`,`gray`,`slate`,`green`,`indigo`,`muted`,`primary`,`red`,`secondary`,`sky`],Ni=[`tomato`,`grass`,`blue`,`ruby`,`orange`,`indigo`,`pink`,`teal`,`purple`,`amber`,`crimson`,`red`,`lime`,`yellow`,`violet`],Pi={tomato:f.tomato9,grass:s.grass9,blue:u.blue9,ruby:i.ruby9,orange:m.orange9,indigo:n.indigo9,pink:r.pink9,teal:a.teal9,purple:c.purple9,amber:h.amber9,crimson:p.crimson9,red:g.red9,lime:d.lime9,yellow:o.yellow9,violet:l.violet9};function Fi(e){return e in Pi}const Ii={colors:Mi.reduce((e,t)=>(e[t]={elements:xi[t],relationships:Ei[t]},e),{}),...Di};var Li=t(ct(),1);function Ri(e,t){return e===t?0:de(e)?de(t)?(0,Li.default)(e,t):1:de(t)?-1:0}function zi(e=`.`,t=!1){return(n,r)=>{if(n===r)return 0;if(!n)return-1;if(!r)return 1;let i=n.split(e),a=r.split(e),o=Math.min(i.length,a.length);for(let e=0;e<o;e++){let t=i[e],n=a[e],r=(0,Li.default)(t,n);if(r!==0)return r}let s=i.length-a.length;return t?-1*s:s}}function N(e,t){if(e===void 0||e==null){let n=typeof t==`function`?t():t;throw Error(n??`Expected defined value, but received ${e}`)}return e}function P(e,t){if(!e)throw Error(t??`Invariant failed`)}function F(e){throw Error(`NonExhaustive value: ${e}`)}function Bi(e){let t=[],n=[];for(let[r,i]of Ke(e))y(i.color)?t.push({tag:r,spec:{color:i.color}}):n.push(r);return T(n,De(Ri),b((e,t)=>({tag:e,spec:{color:N(Ni[t%Ni.length])}})),Ae(t),De((e,t)=>Ri(e.tag,t.tag)),je(x(`tag`),x(`spec`)))}function Vi(e,t,n){return e.length===0||t.length===0?[]:(n??=Object.is,T(et(e,t),Qe(([e,t])=>n(e,t)),b(([e,t])=>e)))}function Hi(e){return e!=null&&typeof e==`string`}function Ui(e){return!!e&&Array.isArray(e)&&e.length>0}function Wi(...e){return(t=>e.some(e=>e(t)))}function Gi(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(0,t):null}function Ki(e){let t=e.lastIndexOf(`.`);return t>0?e.slice(t+1):e}const qi=e=>Hi(e)?e:e.id;function I(e,t){let n=qi(e);return t?qi(t).startsWith(n+`.`):e=>{let t=qi(e);return n.startsWith(t+`.`)}}function Ji(e,t){if(!t)return t=>Ji(e,t);let n=qi(e),r=qi(t);return n===r||r.startsWith(n+`.`)||n.startsWith(r+`.`)}function Yi(e,t){return t?I(t,e):t=>I(e,t)}function Xi(e){return(Hi(e)?e:e.id).split(`.`).length}function Zi(e,t){let n=Hi(e)?e:e.id,r=Hi(t)?t:t.id;if(n===r)return 0;let i=Xi(n),a=Xi(r);if(Ji(n,r))return Math.abs(i-a);let o=Qi(n,r),s=o?Xi(o):0;return i+a-(2*s+1)}function Qi(e,t){let n=e.split(`.`);if(n.length<2)return null;let r=t.split(`.`);if(r.length<2)return null;let i=[];for(let e=0;e<Math.min(n.length,r.length)-1&&n[e]===r[e];e++)i.push(n[e]);return i.length===0?null:i.join(`.`)}function $i(e){let t=e.split(`.`);if(t.pop(),!C(t,2))return t;for(let e=1;e<t.length;e++)t[e]=t[e-1]+`.`+t[e];return t.reverse()}function ea(e,t){let n=e.split(`.`).length,r=t.split(`.`).length;switch(!0){case n>r:return 1;case n<r:return-1;default:return 0}}function ta(e,t){return ea(e.id,t.id)}function na(e){return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>e.fqn.length-t.fqn.length).map(({item:e})=>e)}function ra(e,t){let n=t;for(let t of e)t!==n&&I(t,n)&&(n=t);return n===t?null:n}function ia(e){let t=[],n=[...e],r;for(;r=n.shift();){let e;for(;e=ra(n,r);)t.push(...n.splice(n.indexOf(e),1));t.push(r)}return t}function aa(e,t){if(!e||Hi(e)){let t=e??`asc`;return e=>aa(e,t)}let n=t===`desc`?-1:1;return e.map(e=>({item:e,fqn:e.id.split(`.`)})).sort((e,t)=>{if(e.fqn.length!==t.fqn.length)return(e.fqn.length-t.fqn.length)*n;for(let n=0;n<e.fqn.length;n++){let r=Ri(e.fqn[n],t.fqn[n]);if(r!==0)return r}return 0}).map(({item:e})=>e)}function oa(e,t,n){let r=e.get(t);return r||(r=n(t),e.set(t,r)),r}function sa(e){return typeof e==`object`&&!!e&&Symbol.iterator in e}function ca(e,t){let n=t??e;P(ne(n));function*r(e){for(let t of e)n(t)&&(yield t)}return t?r(e):r}function la(e,t){let n=t??e;P(ne(n));function r(e){for(let t of e)if(n(t))return t}return t?r(e):r}function ua(e){return e?da(e):da}function*da(e){for(let t of e)yield*t}function fa(e){return e?pa(e):pa}function pa(e){let{value:t}=e[Symbol.iterator]().next();return t}function ma(e,t){let n=t??e;P(ne(n));function*r(e){for(let t of e)yield n(t)}return t?r(e):r}function ha(e,t){let n=t??e;P(ne(n));function r(e){for(let t of e)if(n(t))return!0;return!1}return t?r(e):r}function L(e){return e?Array.from(e):e=>Array.from(e)}function ga(e){return e?new Set(e):e=>new Set(e)}function _a(e){return e?va(e):va}function*va(e){let t=new Set;for(let n of e)t.has(n)||(t.add(n),yield n)}function R(e,t,n){let r=typeof t==`symbol`?t:Symbol.for(t);return e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!1,writable:!1,value:n()}),e[r]}function ya(...e){let t=100;return e.length===2?t=Ne(e[0],e[1]):e.length===1&&(t=e[0]),new Promise(e=>{setTimeout(()=>{e(`LIKEC4_DELAY`)},t??100)})}function ba(){return Promise.resolve().then(()=>void 0)}function xa(e){Promise.resolve().then(e)}const Sa=(e,t)=>{let n=Qi(e.source.id,e.target.id),r=Qi(t.source.id,t.target.id);if(n&&!r)return 1;if(!n&&r)return-1;let i=n&&r?ea(n,r):0;if(i!==0)return i;let a=ea(e.source.id,t.source.id);return a===0?ea(e.target.id,t.target.id):a};function Ca(...e){let t=new Set;for(let n of e)for(let e of n)t.add(e);return t}function wa(e,...t){let n=new Set;if(e.size===0)return n;let r=C(t,2)?(0,gt.intersection)(...t):t[0];if(r.size===0)return n;for(let t of e)r.has(t)&&n.add(t);return n}function Ta(e,t){if(e.size===0)return new Set;if(t.size===0)return new Set(e);let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function Ea(e,t){return e.size===t.size&&[...e].every(e=>t.has(e))}function Da(e,t){return(0,gt.symmetricDifference)(e,t)}function Oa(e,t){if(e.size===0||t.size===0)return!1;t.size<e.size&&([e,t]=[t,e]);for(let n of e)if(t.has(n))return!0;return!1}function ka(e){return P(typeof e==`object`&&st(e),`objectHash: value must be an object`),yt(e)}function Aa(e){let t=5381,n=e.length;P(n>0,`stringHash: empty string`);for(let r=0;r<n;r++)t=t*33^e.charCodeAt(r);return(t>>>0).toString(36)}function ja(){return At().use(Ot).use(Et).use(Dt).use(kt,{allowDangerousHtml:!0}).use(St,bt({attributes:{"*":[`className`],svg:[`width`,`height`,`viewBox`,`fill`,`ariaHidden`],path:[`d`,`fill`,`stroke`,`strokeWidth`,`strokeLinecap`,`strokeLinejoin`]},tagNames:[`svg`,`g`,`path`,`div`]},xt)).use(Ct,{allowDangerousHtml:!0})}function Ma(e){return(``+ja().processSync(e)).trim()}function Na(e){return wt(Tt(e),{includeHtml:!1,includeImageAlt:!1})}function Pa(e){P(lt.valid(e),`Invalid color: ${e}`);let t=ut(e),n=t[6],r=Fa(n);return{elements:{fill:n,stroke:t[7],...r},relationships:{line:t[4],label:t[3],labelBg:t[9]}}}function Fa(e){let t=lt(e),n=t.brighten(2),r=t.darken(2),i,a,o,s;do i=n,a=r,n=n.brighten(1),r=r.darken(1),o=lt.contrastAPCA(t,n),s=lt.contrastAPCA(t,r);while(Math.abs(o)<60&&Math.abs(s)<60&&(!le(n,i)||!le(r,a)));return Math.abs(o)>Math.abs(s)?{hiContrast:n.brighten(.4).hex(),loContrast:n.hex()}:{hiContrast:r.darken(.4).hex(),loContrast:r.hex()}}const Ia={color:`primary`,size:`md`,opacity:15,shape:`rectangle`,group:{opacity:15,border:`dashed`},relationship:{color:`gray`,line:`dashed`,arrow:`normal`}},La=Ii,Ra=[`none`,`normal`,`onormal`,`dot`,`odot`,`diamond`,`odiamond`,`crow`,`open`,`vee`];function z(e){return it(e,e=>e===void 0)}function za(e){return e.summary??e.description}function Ba(e){return e.description??e.summary}function Va(e,t){return e[Ha]===t}const Ha=`_stage`,Ua=`_type`,Wa=`_layout`;function Ga(e){return e}function Ka(e){return typeof e==`string`?{txt:e}:e}function qa(e){if(ve(e))return null;let t=de(e)?e:e.txt??e.md;return y(t?.trim())?t:null}function Ja(e,t){return t?t+`.`+e:e}const Ya=`@group`;function Xa(e){return e.kind===Ya}function Za(e){return e}function Qa(e,t){return P(typeof e==`string`&&e!=``),`@`+e+`.`+t}function $a(e){return e.startsWith(`@`)}function eo(e){if(!e.startsWith(`@`))return[null,e];let t=e.indexOf(`.`);if(t<2)throw Error(`Invalid global FQN`);return[e.slice(1,t),e.slice(t+1)]}function to(e,t){let n=`step-${String(e).padStart(2,`0`)}`;return t?`${n}.${t}`:n}function no(e){return e.startsWith(`step-`)}function ro(e){if(!no(e))throw Error(`Invalid step edge id: ${e}`);return parseFloat(e.slice(5))}let B;(function(e){function t(e){return`model`in e&&!(`project`in e)}e.isElementRef=t;function n(e){return`project`in e&&`model`in e}e.isImportRef=n;function r(e){if(de(e))throw Error(`Expected FqnRef, got: "${e}"`);if(n(e))return Qa(e.project,e.model);if(t(e))return e.model;throw Error(`Expected FqnRef.ModelRef or FqnRef.ImportRef`)}e.flatten=r;function i(e){return t(e)||n(e)}e.isModelRef=i;function a(e){return`deployment`in e&&`element`in e}e.isInsideInstanceRef=a;function o(e){return`deployment`in e&&!(`element`in e)}e.isDeploymentElementRef=o;function s(e){return o(e)||a(e)}e.isDeploymentRef=s})(B||={});let V;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&B.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`ref`in e&&B.isDeploymentRef(e.ref)}e.isDeploymentRef=r;function i(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=i;function a(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=a;function o(e){return`where`in e&&c(e.where.expr)}e.isWhere=o;function s(e){return`custom`in e&&(c(e.custom.expr)||o(e.custom.expr))}e.isCustom=s;function c(e){return t(e)||n(e)||r(e)||i(e)||a(e)}e.is=c;function l(e){return s(e)&&(e=e.custom.expr),o(e)&&(e=e.where.expr),e}e.unwrap=l})(V||={});let io;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(io||={});let ao;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return io.isWhere(e)}e.isRelationWhere=n;function r(e){return V.isWhere(e)}e.isFqnExprWhere=r;function i(e){return V.is(e)||V.isWhere(e)||V.isCustom(e)}e.isFqnExpr=i;function a(e){return io.is(e)||io.isWhere(e)||io.isCustom(e)}e.isRelation=a})(ao||={});let H;(function(e){function t(e){return`wildcard`in e&&e.wildcard===!0}e.isWildcard=t;function n(e){return`ref`in e&&B.isModelRef(e.ref)}e.isModelRef=n;function r(e){return`elementKind`in e&&`isEqual`in e}e.isElementKindExpr=r;function i(e){return`elementTag`in e&&`isEqual`in e}e.isElementTagExpr=i;function a(e){return`where`in e&&s(e.where.expr)}e.isWhere=a;function o(e){return`custom`in e&&(s(e.custom.expr)||a(e.custom.expr))}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.custom.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(H||={});let oo;(function(e){function t(e){return`source`in e&&`target`in e}e.isDirect=t;function n(e){return`incoming`in e}e.isIncoming=n;function r(e){return`outgoing`in e}e.isOutgoing=r;function i(e){return`inout`in e}e.isInOut=i;function a(e){return`where`in e&&(t(e.where.expr)||n(e.where.expr)||r(e.where.expr)||i(e.where.expr))}e.isWhere=a;function o(e){return`customRelation`in e}e.isCustom=o;function s(e){return t(e)||n(e)||r(e)||i(e)}e.is=s;function c(e){return o(e)&&(e=e.customRelation.expr),a(e)&&(e=e.where.expr),e}e.unwrap=c})(oo||={});let so;(function(e){function t(e){return`where`in e}e.isWhere=t;function n(e){return oo.isWhere(e)}e.isRelationWhere=n;function r(e){return H.isWhere(e)}e.isFqnExprWhere=r;function i(e){return H.is(e)||H.isWhere(e)||H.isCustom(e)}e.isFqnExpr=i;function a(e){return oo.is(e)||oo.isWhere(e)||oo.isCustom(e)}e.isRelationExpr=a})(so||={});function co(e){return y(e.kind)&&!y(e.element)}function lo({size:e,padding:t,textSize:n,iconSize:r,...i},a=Ro.defaults.size){return e??=a,n??=e,t??=e,r??=e,{...i,size:e,padding:t,textSize:n,iconSize:r}}function uo(e){return`tag`in e}function fo(e){return`kind`in e}function po(e){return`metadata`in e}function mo(e){return`participant`in e}function ho(e){return`not`in e}function go(e){return`and`in e}function _o(e){return`or`in e}function vo(e){switch(!0){case mo(e):{let t=e.participant;return yo(t,vo(e.operator))}case uo(e):{if(de(e.tag)||`eq`in e.tag){let t=de(e.tag)?e.tag:e.tag.eq;return e=>Array.isArray(e.tags)&&e.tags.includes(t)}let t=e.tag.neq;return e=>!Array.isArray(e.tags)||!e.tags.includes(t)}case fo(e):{if(de(e.kind)||`eq`in e.kind){let t=de(e.kind)?e.kind:e.kind.eq;return e=>e.kind===t}let t=e.kind.neq;return e=>v(e.kind)||e.kind!==t}case po(e):{let{key:t,value:n}=e.metadata;if(n===void 0)return e=>e.metadata!=null&&t in e.metadata&&e.metadata[t]!=null;if(de(n)||`eq`in n){let e=de(n)?n:n.eq;return n=>{if(!n.metadata)return!1;let r=n.metadata[t];return Array.isArray(r)?r.includes(e):r===e}}let r=n.neq;return e=>{if(!e.metadata)return!0;let n=e.metadata[t];return n==null?!0:Array.isArray(n)?!n.includes(r):n!==r}}case ho(e):return me(vo(e.not));case go(e):return Me(e.and.map(vo));case _o(e):return Pe(e.or.map(vo));default:F(e)}}function yo(e,t){return n=>{if(!n.source||!n.target)return!1;switch(e){case`source`:return t(n.source);case`target`:return t(n.target)}}}function bo(e){return`include`in e||`exclude`in e}function xo(e){return`targets`in e&&`style`in e}function So(e){return e._type===`element`}function Co(e){return So(e)&&y(e.extends)}function wo(e){return e._type===`deployment`}function To(e){return e._type===`dynamic`}function Eo(e){return`styleId`in e}function Do(e){return`predicateId`in e}function Oo(e){return`direction`in e}function ko(e){return no(e)&&e.includes(`.`)?e.slice(0,e.indexOf(`.`)+1):null}function Ao(e){return!!e&&`__parallel`in e&&se(e.__parallel)}function jo(e){return!!e&&`__series`in e&&se(e.__series)}function Mo(e){return`title`in e&&`groupRules`in e&&Array.isArray(e.groupRules)}function No(e){return`rank`in e&&Array.isArray(e.targets)}const Po=Symbol.for(`text`),Fo=Symbol.for(`html`);var Io=class e{static mdcache=new mt.default(500);static txtcache=new mt.default(500);static getOrCreateFromText(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.txtcache.get(t);return n||(n=new e({txt:t}),e.txtcache.set(t,n),n)}static getOrCreateFromMarkdown(t){if(t=t.trimEnd(),t===``)return e.EMPTY;let n=e.mdcache.get(t);return n||(n=new e({md:t}),e.mdcache.set(t,n),n)}static memoize(t,n,r){return R(t,n,()=>e.from(r))}static from(t){return t==null||t===e.EMPTY?e.EMPTY:t instanceof e?t:typeof t==`string`?this.getOrCreateFromText(t):`isEmpty`in t&&t.isEmpty?e.EMPTY:`md`in t?this.getOrCreateFromMarkdown(t.md):this.getOrCreateFromText(t.txt)}static EMPTY=new class extends e{isEmpty=!0;nonEmpty=!1;isMarkdown=!1;$source=null;constructor(){super({txt:``})}get text(){return null}get md(){return null}get html(){return null}};$source;isEmpty;nonEmpty;isMarkdown;constructor(e){this.isMarkdown=!1,typeof e==`string`?(this.$source={txt:e},this.isEmpty=e.trim()===``):(this.$source=e,this.isEmpty=!0,`md`in e?(this.isEmpty=e.md===``,this.isMarkdown=!0):this.isEmpty=e.txt===``),this.nonEmpty=!this.isEmpty}get text(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Po,()=>Na(e.md))}get md(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;if(`md`in e)return e.md;if(`txt`in e)return e.txt;F(e)}get html(){if(this.isEmpty||this.$source===null)return``;let e=this.$source;return`txt`in e?e.txt:R(this,Fo,()=>Ma(e.md))}equals(t){return this===t?!0:t instanceof e?this.isEmpty&&t.isEmpty?!0:this.isEmpty!==t.isEmpty||this.isMarkdown!==t.isMarkdown?!1:this.isMarkdown?this.$source?.md===t.$source?.md:this.$source?.txt===t.$source?.txt:!1}};function Lo(e,t){let n=t??6,r=lt(e.fill),i=lt(e.stroke),a=r.luminance()>.8,o=T(et(lt.scale(a?[r.darken(.02).desaturate(.05),r.darken(.1).desaturate(.1)]:[r.shade(.12,`lch`).desaturate(.05),r.shade(.35,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null),lt.scale(a?[i.darken(.04).desaturate(.05),i.darken(.12).desaturate(.1)]:[i.shade(.15,`lch`).desaturate(.08),i.shade(.4,`lch`).desaturate(.4)]).mode(`oklch`).correctLightness().colors(n,null)),b(([t,n])=>({...e,fill:t.hex(),stroke:n.hex()})));return P(o.length===n,`Expected ${n} colors, got ${o.length}`),o}const Ro={theme:La,defaults:Ia};var zo=class e{theme;defaults;static DEFAULT=new e(Ro);static from(t,n){if(!t&&!n)return this.DEFAULT;let{customCss:r,theme:i,defaults:a}={...t},o=bt({theme:i},{defaults:{...a}},{theme:{colors:{...n}}},Ro);return ve(r?.content)&&le(o,Ro)?this.DEFAULT:new e(o,r)}constructor(e,t){this.config=e,this.customCss=t,this.theme=e.theme,this.defaults=e.defaults}get fingerprint(){return R(this,`fingerprint`,()=>ka({config:this.config,customCss:this.customCss}))}get elementColors(){return this.theme.colors[this.defaults.color].elements}get relationshipColors(){return this.theme.colors[this.defaults.relationship.color].relationships}get groupColors(){let e=this.defaults.group?.color;if(!e)return this.elementColors;if(!this.isThemeColor(e))throw Error(`Default group color not found in theme: ${e}`);return R(this,`defaultGroup`,()=>({...this.elementColors,...this.theme.colors[e].elements}))}isDefaultColor(e){return e===this.defaults.color}colors(e){return this.computeFrom(e??this.defaults.color)}compoundColorsCache=new ht.default(e=>new E.default(t=>Lo(e,t)));colorsForCompounds(e,t){return this.compoundColorsCache.get(e).get(t??6)}fontSize(e){return e??=this.defaults.text??this.defaults.size,this.theme.textSizes[e]}padding(e){return e??=this.defaults.padding??this.defaults.size,this.theme.spacing[e]}iconSize(e){return e??=this.defaults.size,this.theme.iconSizes[e]}isThemeColor(e){return e in this.theme.colors}nodeSizes(e){let t=lo(e,this.defaults.size);return{sizes:t,values:{sizes:this.theme.sizes[t.size],padding:this.padding(t.padding),textSize:this.fontSize(t.textSize),iconSize:this.iconSize(t.iconSize)}}}computeFrom(e){if(this.isThemeColor(e))return this.theme.colors[e];if(!lt.valid(e))throw Error(`Invalid color value: "${e}" (not a theme color and not a valid CSS color)`);return Pa(e)}equals(e){return e===this?!0:this.constructor===e.constructor?this.fingerprint===e.fingerprint:!1}tagColor(e){return this.isThemeColor(e)?this.theme.colors[e].elements:Fi(e)?this.computeFrom(Pi[e]).elements:this.computeFrom(e).elements}};function Bo(e,t){let{nodes:n,edges:r,hasManualLayout:i,...a}=e,o=new Map(n.map(e=>[e.id,e])),s=new Map(r.map(e=>[e.id,e])),c=t.nodes.map(e=>{let t=o.get(e.id);return t?{...t,x:e.x,y:e.y,width:e.width,height:e.height,labelBBox:e.labelBBox}:e}),l=t.edges.map(e=>{let t=s.get(e.id);return t?{...t,points:e.points,label:e.label,labelBBox:e.labelBBox,...e.controlPoints!=null&&{controlPoints:e.controlPoints}}:e}),u={...t,...a,[Ha]:`layouted`,bounds:t.bounds,nodes:c,edges:l};return i?u[Wa]=`auto`:delete u[Wa],u}function Vo(e){return T(e,S(e=>!!e.notation),be(x(`notation`)),ae(rt(be(x(`shape`)),ae(rt(be(x(`color`)),ae(rt(b(x(`kind`)),we())),Ke(),b(([e,t])=>({kinds:t,color:e})))),Ke(),w(([e,t])=>t.map(({color:t,kinds:n})=>({shape:e,color:t,kinds:n}))))),Ke(),w(([e,t])=>t.map(({shape:t,color:n,kinds:r})=>({title:e,shape:t,color:n,kinds:r}))),nt(x(`shape`),x(`title`),[e=>e.kinds.length,`desc`]))}const Ho=(e,t)=>e===t||v(e)&&v(t)?!1:!le(e,t);function Uo(e,t){e.color=t.color,e.kind=t.kind,e.navigateTo=t.navigateTo??null,e.links=t.links?[...t.links]:null,e.tags=[...t.tags],v(t.style.border)?delete e.style.border:e.style.border=t.style.border,ce(t.style.opacity)?e.style.opacity=t.style.opacity:delete e.style.opacity,v(t.style.multiple)?delete e.style.multiple:e.style.multiple=t.style.multiple}function Wo(e,t,n){if(Ho(t.icon??`none`,e.icon??`none`)){let r=y(e.icon)&&e.icon!==`none`;switch(!0){case r&&y(t.icon)&&t.icon!==`none`:return e.icon=t.icon,!0;case r&&(v(t.icon)||t.icon===`none`):return e.icon=`none`,!0;case!r&&y(t.icon)&&t.icon!==`none`:return n?(e.icon=t.icon,!0):!1}}return!0}function Go(e,t,n){let r=!0;return Ho(e.style.iconColor,t.style.iconColor)&&(v(t.style.iconColor)?delete e.style.iconColor:e.style.iconColor=t.style.iconColor),Ho(e.style.iconSize,t.style.iconSize)&&(n?v(t.style.iconSize)?delete e.style.iconSize:e.style.iconSize=t.style.iconSize:r=!1),Ho(e.style.iconPosition,t.style.iconPosition)&&(n?v(t.style.iconPosition)?delete e.style.iconPosition:e.style.iconPosition=t.style.iconPosition:r=!1),r}function Ko(e,t){return e?`md`in t?(e.md=t.md,delete e.txt,e):(`txt`in t&&(e.txt=t.txt,delete e.md),e):t}function qo(e,t,n){let r=!0;return Ho(e.title,t.title)&&(n?e.title=t.title:r=!1),Ho(e.description,t.description)&&(v(t.description)?delete e.description:n?e.description=Ko(e.description,t.description):r=!1),Ho(e.technology,t.technology)&&(v(t.technology)?delete e.technology:n?e.technology=t.technology:r=!1),r}function Jo(e,t,n){return e.title=t.title,v(t.description)?delete e.description:e.description=Ko(e.description,t.description),v(t.technology)?delete e.technology:e.technology=t.technology,!0}function Yo(e,t){P(e.id===t.id,`applyManualLayout: view ids do not match`),P(e._stage===`layouted`,`applyManualLayout: expected layouted view`),P(t._stage===`layouted`,`applyManualLayout: expected layouted snapshot`),P(e._layout!==`manual`,`applyManualLayout: expected auto-layouted view`);let n=new Set;e._type!==t._type&&n.add(`type-changed`);let r=Xo(t.nodes,e.nodes,n),i=Zo(t.edges,e.edges,n),a=Vo(r);return jt(t,o=>{o.title=e.title??t.title,o.description=e.description??t.description,o.tags=e.tags?[...e.tags]:null,o.links=e.links?[...e.links]:null,o.sourcePath=e.sourcePath,o[Wa]=`manual`,a&&a.length>0?o.notation={nodes:a}:delete o.notation,o.nodes=Mt(r),o.edges=Mt(i),To(e)&&o._type===`dynamic`&&(o.variant=e.variant),So(e)&&o._type===`element`&&(e.viewOf?o.viewOf=e.viewOf:delete o.viewOf,e.extends?o.extends=e.extends:delete o.extends);let s=[...n];C(s,1)?o.drifts=s:(o.hash=e.hash,delete o.drifts)})}function Xo(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id);return t?(r.delete(t.id),jt(e,r=>{Uo(r,t);let i=new Set,a=e.children.length>0,o=t.children.length>0;(Ho(r.modelRef,t.modelRef)||Ho(r.deploymentRef,t.deploymentRef))&&i.add(`modelRef-changed`),o&&!a&&i.add(`became-compound`),!o&&a&&i.add(`became-leaf`),Ho(r.parent,t.parent)&&i.add(`parent-changed`);let s=r.width+5>=t.width&&r.height+5>=t.height;Ho(r.shape,t.shape)&&(s?r.shape=t.shape:i.add(`shape-changed`)),Go(r,t,s)||i.add(`label-changed`),Wo(r,t,s&&o===a)||i.add(`label-changed`),(a?Jo:qo)(r,t,s)||i.add(`label-changed`),Ho(r.notes,t.notes)&&(v(t.notes)?delete r.notes:r.notes=Ko(r.notes,t.notes)),Ho(e.notation,t.notation)&&(r.notation=t.notation??null),a&&o&&Da(new Set(e.children),new Set(t.children)).size>0&&i.add(`children-changed`);let c=[...i];C(c,1)?(n.add(`nodes-drift`),r.drifts=c):delete r.drifts})):(n.add(`nodes-removed`),{...e,drifts:[`removed`]})});return r.size>0&&n.add(`nodes-added`),i}function Zo(e,t,n){let r=new Map(t.map(e=>[e.id,e])),i=e.map(e=>{let t=r.get(e.id)??T(r.values(),ca(t=>t.source===e.source&&t.target===e.target),fa());return t&&r.delete(t.id),jt(e,r=>{if(!t){r.drifts=[`removed`],n.add(`edges-removed`);return}let i=new Set,a=e.id===t.id;switch(!0){case a&&e.source==t.source&&e.target==t.target:Ho(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break;case a&&e.source==t.target&&e.target==t.source:e.source!==e.target&&i.add(`direction-changed`);break;case a:e.source!=t.source&&i.add(`source-changed`),e.target!=t.target&&i.add(`target-changed`);break;default:P(e.id!=t.id,`Unexpected case in edge drift detection, ids should not match`),P(e.source==t.source,`Unexpected case in edge drift detection, sources should match`),P(e.target==t.target,`Unexpected case in edge drift detection, targets should match`),Ho(r.dir??`forward`,t.dir??`forward`)&&i.add(`direction-changed`);break}if(r.color=t.color,r.line=t.line,r.navigateTo=t.navigateTo??null,r.tags=t.tags?[...t.tags]:null,Ho(e.notes,t.notes)&&(v(e.notes)!==v(t.notes)&&i.add(`notes-changed`),r.notes=t.notes??e.notes),t.astPath?r.astPath=t.astPath:delete r.astPath,Ho(Te(e,[`label`,`description`,`technology`,`labelBBox`]),Te(t,[`label`,`description`,`technology`,`labelBBox`])))switch(!0){case t.labelBBox&&!e.labelBBox:i.add(`label-added`);break;case e.labelBBox&&!t.labelBBox:i.add(`label-removed`);break;case!!e.labelBBox&&!!t.labelBBox:t.labelBBox.width*t.labelBBox.height>(e.labelBBox.width+5)*(e.labelBBox.height+5)&&(r.labelBBox.width=Math.round(t.labelBBox.width),r.labelBBox.height=Math.round(t.labelBBox.height)),Ho(e.label,t.label)&&(v(t.label)!==v(e.label)&&i.add(`label-changed`),r.label=t.label??e.label),Ho(e.description,t.description)&&(v(t.description)!==v(e.description)&&i.add(`label-changed`),t.description&&(r.description=Ko(e.description,t.description))),Ho(e.technology,t.technology)&&(v(t.technology)!==v(e.technology)&&i.add(`label-changed`),r.technology=t.technology??e.technology??null);break;default:P(!e.labelBBox,`Unexpected case in edge labelBBox drift detection`),P(!t.labelBBox,`Unexpected case in next labelBBox drift detection`);break}let o=[...i];C(o,1)?(n.add(`edges-drift`),r.drifts=o):delete r.drifts})});return r.size>0&&n.add(`edges-added`),i}function Qo(e,t){let{drifts:n,...r}=Yo(e,t);if(!n||n.length===0)return jt(e,e=>{delete e.drifts,e[Wa]=`auto`});let i=new Set;n.includes(`type-changed`)&&i.add(`type-changed`);let a=new Map(r.nodes.map(e=>[e.id,e])),o=new Map(r.edges.map(e=>[e.id,e])),s=e.nodes.map(e=>{let t=a.get(e.id);return t&&a.delete(t.id),jt(e,e=>{if(!t){i.add(`nodes-added`),e.drifts=[`added`];return}t.drifts?(i.add(`nodes-drift`),e.drifts=[...t.drifts]):delete e.drifts})});a.size>0&&i.add(`nodes-removed`);let c=e.edges.map(e=>{let t=o.get(e.id)??T(o.values(),ca(t=>t.source===e.source&&t.target===e.target),fa());return t&&o.delete(t.id),jt(e,e=>{if(!t){i.add(`edges-added`),e.drifts=[`added`];return}t.drifts?(i.add(`edges-drift`),e.drifts=[...t.drifts]):delete e.drifts})});o.size>0&&i.add(`edges-removed`);let l=[...i];return jt(e,e=>{C(l,1)?e.drifts=l:delete e.drifts,e.nodes=Mt(s),e.edges=Mt(c),e[Wa]=`auto`})}const $o=e=>e.split(`
3
3
  `).map(e=>e.trim().replace(`file://`,``));function es(e,t=2){e=Array.isArray(e)?e:e.split(`
4
4
  `);let n=` `.repeat(t);return e.map(e=>`${n}${e}`).join(`
5
5
  `)}function U(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=zt(e);if(t.stack){let e=$o(t.stack);return t.message+`
@@ -8,38 +8,40 @@ import{r as e,s as t}from"./_chunks/rolldown-runtime.mjs";import{a as n,c as r,d
8
8
  `):t}function is(e,t=!1){let n=ns(e.record);if(n){let r=n.message;return n.stack&&(r=r+`
9
9
  `+es(n.stack.split(`
10
10
  `).slice(1))),t&&(r=`${us.red}${r}${ls}`),{...e,message:e.message+`
11
- `+es(r)}}return e}const as={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function os(){return cs({format:({message:e})=>e})}const ss=e=>as[e];function cs(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return Pt({timestamp:`time`,level:ss,category:`.`,...e,format:e=>t(is(e))})}const ls=`\x1B[0m`,us={red:`\x1B[31m`};function ds(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return It({timestamp:`time`,level:ss,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,...e,format:e=>t(is(e,!0))})}function fs(e){let t=e?.messageFormatter;return t?e=>{let{properties:n}=e;return n&&Object.keys(n).length>0?[t(e),n]:[t(e)]}:e=>{let{message:t,properties:n}=e;return n&&Object.keys(n).length>0?[...t,n]:t}}function ps(e){return Ft({formatter:fs(),...e})}function ms(e){let t=e?.formatter??fs();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const hs=Nt(`likec4`);function gs(e){return hs.getChild(e)}function _s(e){try{let{sinks:t={},loggers:n,...r}=e??{},i={console:ps(),...t};Lt({reset:!0,...r,sinks:i,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}const vs={top:50,right:40,bottom:40,left:40};function ys(e,t){let n=e.nodes.map(e=>{let n=t.nodes[e.id];if(!n)return e;let{x:r,y:i,width:a,height:o}=n;return{...e,width:a,height:o,x:r,y:i}}),r=e.edges.map(e=>{let n=t.edges[e.id];return n?{...e,...n}:e});return{...e,bounds:{x:t.x,y:t.y,width:t.width,height:t.height},nodes:n,edges:r}}function bs(e,t){let n=new Map(e.nodes.map(e=>[e.id,e]));if(e.hash===t.hash||Ts(e,t))return Cs(e.nodes.filter(e=>!e.parent),n,t),ys(e,t);e.hasLayoutDrift=!0;let r=za.merge(...e.nodes.map(e=>t.nodes[e.id]).filter(e=>!!e));return e.nodes.filter(e=>e.parent==null).reduce((e,r)=>xs(r,e,n,t),{x:r.x,y:r.y+r.height+100}),e.edges.filter(e=>!t.edges[e.id]).forEach(e=>Ss(e,t)),ys(e,t)}function xs(e,t,n,r){let i=r.nodes[e.id],a=i?.isCompound??!1,o=!i,s=o?t:{x:i.x,y:i.y},c=e.children.map(e=>r.nodes[e]).filter(e=>!!e),l=c.length>0&&za.merge(...c),u=a&&l?{x:l.x,y:l.y+l.height+100}:{x:s.x+vs.left,y:s.y+vs.top};return e.children.map(e=>n.get(e)).reduce((e,t)=>xs(t,e,n,r),u),i=e.children.length>0?ws(e,r):r.nodes[e.id]??{isCompound:!1,width:e.width,height:e.height,x:s.x,y:s.y},r.nodes[e.id]=i,o?{x:i.x+i.width+100,y:i.y}:t}function Ss(e,t){let n=t.nodes[e.source],r=t.nodes[e.target],i=Es(za.center(n)),a=Es(za.center(r)),o=a.subtract(i),{x:s,y:c}=o.divide(2).add(i),l={...e?.labelBBox??{width:0,height:0},x:s,y:c},u=o.multiply(.7).add(i),d=o.multiply(.3).add(i);t.edges[e.id]={points:[[i.x,i.y],[d.x,d.y],[u.x,u.y],[a.x,a.y]],labelBBox:l,controlPoints:[u]}}function Cs(e,t,n){e.filter(e=>e.children.length>0).forEach(e=>{Cs(e.children.map(e=>t.get(e)).filter(e=>!!e),t,n),n.nodes[e.id]=ws(e,n)})}function ws(e,t){let n=za.merge(...e.children.map(e=>t.nodes[e]));return{isCompound:!0,x:n.x-vs.left,y:n.y-vs.top,width:n.width+vs.left+vs.right,height:n.height+vs.top+vs.bottom}}function Ts(e,t){let n=e=>e.children.length>0;return Vt(e.autoLayout,t.autoLayout)&&e.nodes.every(e=>{let r=t.nodes[e.id];return!!r&&n(e)===r.isCompound})&&e.edges.every(e=>!!t.edges[e.id])}function Es({x:e,y:t}){return new Va(e,t)}function Ds(e){return w(e,xe(e=>e.parallelPrefix??void 0),ie((e,t)=>e.reduce((e,t)=>(e.min.column=Math.min(e.min.column,t.from.column,t.to.column),e.min.row=Math.min(e.min.row,t.from.row,t.to.row),e.max.column=Math.max(e.max.column,t.from.column,t.to.column),e.max.row=Math.max(e.max.row,t.from.row,t.to.row),e),{parallelPrefix:t,min:{column:1/0,row:1/0},max:{column:-1/0,row:-1/0}})),Ye())}function Os(e,t){if(e.length===0||e.length===t.length)return[];let n=e=>N(t.find(t=>t.id===e));function r(e){let t=e.parent?n(e.parent):null;return t?[t,...r(t)]:[]}let i=new _t.default,a=[];return e.forEach(e=>{let t=r(e);if(t.length===0){i.clear();return}let n=_t.default.from(t),o,s;for(;o=i.peek()?.node,s=n.peek(),!(!s||!o);){if(I(s.id,o.id)||s.id===o.id){n.pop();continue}if(!I(o.id,s.id)){i.pop();continue}break}for(;s=n.pop();){let t={node:s,from:e,to:e,nested:[]},n=i.peek();n?n.nested.push(t):a.push(t),i.push(t)}i.forEach(t=>t.to=e)}),a}var ks=class{#e=new Kt;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,Ut.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of Ds(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,Ut.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,Ut.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,Ut.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(Re(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=N(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=N(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),P(e>=0,`actor ${t} not found`)}return N(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return y(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,Ut.strong).before(i),this.put(s,Ut.strong).before(r),this.put(c,Ut.strong).after(a.right),this.put(l,Ut.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];P(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=ge(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=N(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new Ht;return this.#e.addEditVariable(t,Ut.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,Ut.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,Ut.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,Ut.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,Ut.weak);break}}constraint(e,t,n=void 0,r=Ut.medium){let i;switch(t){case`==`:i=Gt.Eq;break;case`>=`:i=Gt.Ge;break;case`<=`:i=Gt.Le;break;case`== 0`:i=Gt.Eq,n=0;break;case`>= 0`:i=Gt.Ge,n=0;break;case`<= 0`:i=Gt.Le,n=0;break;default:F(t)}this.#e.addConstraint(new Wt(e,i,n??0,r))}put(e,t=Ut.required){let n=t===Ut.required?Ut.medium:Ut.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function As(e){let t=new Set,n=t=>N(e.nodes.find(e=>e.id===t)),r=[];for(let i of e.edges.filter(e=>ro(e.id))){let e=n(i.source),a=n(i.target);if(e.children.length||a.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(a),r.push({edge:i,source:e,target:a})}let i=e.nodes.filter(e=>t.has(e));P(T(i,1),`actors array must not be empty`);let a=new vt.default(()=>[]),o=[],s=0;for(let{edge:e,source:t,target:n}of r){let r=o.at(-1),c=i.indexOf(t),l=i.indexOf(n),u=t===n,d=c>l,f=Ao(e.id),p=!1;r&&r.target==t&&r.parallelPrefix===f&&(p=r.isSelfLoop!==u||r.isBack===d),p||s++;let m={id:e.id,from:{column:c,row:s},to:{column:l,row:u?++s:s},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(r?.offset??0)+22:0,source:t,target:n,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};o.push(m),a.get(t).push({step:m,row:s,type:`source`,position:d&&!u?`left`:`right`}),a.get(n).push({step:m,row:s,type:`target`,position:d||u?`right`:`left`})}let c=new ks({actors:i,steps:o,compounds:Os(i,e.nodes)}),l=c.getViewBounds(),u=w(c.getCompoundBoxes(),y(({node:e,...t})=>({...t,id:e.id,origin:e.id})),ce(`id`),ie((e,t)=>T(e,2)?y(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),Ye(),Ae());return{actors:i.map(e=>js({actor:e,ports:a.get(e),layout:c})),compounds:u,steps:y(o,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:c.getParallelBoxes(),bounds:l}}function js({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}var Ms=t(Yt(),1);function Ns(e){return e.children.length>0}function Ps(e){switch(e){case`open`:return`vee`;default:return e}}function Fs(e){return Array.isArray(e)?[Fs(e[0]),Fs(e[1])]:(P(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const Is=e=>(P(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),W=e=>Math.ceil(e/72*1e3)/1e3,Ls=e=>Math.ceil(e);Ls(40).toString();function Rs(e,t){return Zt(Qt(e,{l:-35-5*t,s:-15-5*t}))}function zs(e){return Zt(Xt(e,.3))}function Bs(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function Vs(e,{maxchars:t,maxLines:n,sanitize:r=le()}){let i=(0,Ms.default)(e,{width:t,indent:``,escape:r}).split(`
12
- `);return se(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function Hs({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=Vs(e,{maxchars:t,maxLines:r,sanitize:Bs}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${Ls(n)}"${s}>${o}</FONT>`}function Us(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:F(e)}}function Ws(e,t){let{sizes:{size:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=C(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[Hs({text:e.title,fontsize:r.textSize,maxchars:Us(n),maxLines:a?1:3})];if(n!==`xs`){C(e.technology?.trim())&&l.push(Hs({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=Lo.from(e.description).text;t&&l.push(Hs({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function Gs(e,t){let n=Hs({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const Ks=`BGCOLOR="${Bo.DEFAULT.relationshipColors.labelBg}A0"`;function qs({label:e,technology:t}){let n=[];return C(e?.trim())&&n.push(Hs({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),C(t?.trim())&&n.push(Hs({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Ks}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function Js(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${Ks}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${Ls(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return C(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${Ks} CELLPADDING="3">`,Hs({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}const Ys=`dashed`,Xs=`Arial`,Zs=gs(`dot`),Qs=50.1;var $s=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new $t({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(Ns).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`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=Yi(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.graphvizModel=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.attributes.edge),this.build(n),this.postBuild(n)}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){}build(e){let t=(e,n)=>{let r=this.generateGraphvizId(e),i=this.elementToSubgraph(e,n.subgraph(r));this.subgraphs.set(e.id,i);for(let n of e.children){let e=this.computedNode(n);if(Ns(e))t(e,i);else{let t=N(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);i.node(t.id)}}},n=[];for(let t of this.view.nodes)if(Ns(t))v(t.parent)&&n.push(t);else{let n=this.generateGraphvizId(t),r=this.elementToNode(t,e.node(n));this.nodes.set(t.id,r)}for(let r of n)t(r,e);for(let t of this.view.edges){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}}print(){return Jt(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=qt({[E.likec4_viewId]:this.view.id,[E.bgcolor]:`transparent`,[E.layout]:`dot`,[E.compound]:!0,[E.rankdir]:e.direction,[E.TBbalance]:`min`,[E.splines]:`spline`,[E.outputorder]:`nodesfirst`,[E.nodesep]:W(e.nodeSep??110),[E.ranksep]:W(e.rankSep??120),[E.pad]:W(15),[E.fontname]:Xs});return t.attributes.graph.apply({[E.fontsize]:Ls(this.styles.fontSize()),[E.labeljust]:e.direction===`RL`?`r`:`l`,[E.labelloc]:e.direction===`BT`?`b`:`t`,[E.margin]:Qs}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[E.fontname]:Xs,[E.shape]:`rect`,[E.fillcolor]:t.fill,[E.fontcolor]:t.hiContrast,[E.color]:t.stroke,[E.style]:`filled`,[E.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[E.arrowsize]:.75,[E.fontname]:Xs,[E.fontsize]:Ls(14),[E.penwidth]:Ls(2),[E.color]:t.line,[E.fontcolor]:t.label})}checkNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?null:(this.ids.add(e),e)}generateGraphvizId(e){let t=Ns(e),n=Wi(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=Wi(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){P(Ns(e),`node should be compound`),P(ae(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=zs(n.loContrast);return t.apply({[E.likec4_id]:e.id,[E.likec4_level]:e.level,[E.likec4_depth]:e.depth,[E.fillcolor]:Rs(n.fill,e.depth),[E.color]:Rs(n.stroke,e.depth),[E.style]:`filled`,[E.margin]:Ls(e.children.length>1?40:32)}),b(e.title.trim())||t.set(E.label,Gs(e,r)),t}elementToNode(e,t){P(!Ns(e),`node should not be compound`);let n=C(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:i,sizes:{width:a,height:o}}}=this.styles.nodeSizes(e.style),s=n?8:i;switch(t.attributes.apply({[E.likec4_id]:e.id,[E.likec4_level]:e.level,[E.label]:Ws(e,this.styles),[E.margin]:`${W(s)},${W(i)}`}),t.attributes.set(E.width,W(a)),t.attributes.set(E.height,W(o)),this.styles.isDefaultColor(e.color)||t.attributes.apply({[E.fillcolor]:r.fill,[E.fontcolor]:r.hiContrast,[E.color]:r.stroke}),e.shape){case`cylinder`:case`storage`:t.attributes.apply({[E.margin]:`${W(s)},${W(0)}`,[E.penwidth]:Ls(2),[E.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[E.margin]:`${W(n?s:s+4)},${W(i+6)}`});break;case`mobile`:t.attributes.apply({[E.margin]:`${W(n?s:s+4)},${W(i)}`});break;case`queue`:t.attributes.apply({[E.width]:W(a),[E.height]:W(o-8),[E.margin]:`${W(n?s:s+4)},${W(i)}`});break;case`component`:t.attributes.apply({[E.width]:W(a+10),[E.margin]:`${W(s+20)},${W(i)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(e=>!Ns(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return Ns(t)?this.leafElements(t.id):t})}descendants(e){return e===null?this.view.nodes.slice():this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return N(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(P(Ns(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,P(i,`subgraph ${e} not found`),n=N(t(this.leafElements(e)),`leaf element in ${e} not found`),r=N(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return w(this.descendants(e),_(e=>ke(e.inEdges,e.outEdges)),Ce(),De(ke(t.inEdges,t.outEdges)),y(e=>this.view.edges.find(t=>t.id===e)),S(C))}withoutCompoundEdges(e){return this.edgesWithCompounds.size===0?e:{...e,inEdges:e.inEdges.filter(e=>!this.edgesWithCompounds.has(e)),outEdges:e.outEdges.filter(e=>!this.edgesWithCompounds.has(e))}}assignGroups(){let e=w(this.view.nodes,S(Ns),y(e=>e.id),Oe(Qi),je(),y(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),S(({edges:e})=>e.length>1&&e.length<8),Ee(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=N(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=N(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(E.group,n.id),i.attributes.set(E.group,n.id)}catch(e){Zs.error(`Failed to assign group to edge ${r.id}`,{error:e})}}}applyManualLayout({height:e,...t}){let n=t.x<0?-t.x:0;t.y<0&&-t.y;for(let{id:r,...i}of t.nodes){let t=this.getGraphNode(r);if(!t)continue;let a=W(i.center.x)+n,o=W(e-i.center.y);i.fixedsize?t.attributes.apply({[E.pos]:`${a},${o}!`,[E.pin]:!0,[E.width]:W(i.fixedsize.width),[E.height]:W(i.fixedsize.height),[E.fixedsize]:!0}):t.attributes.set(E.pos,`${a},${o}`)}for(let[,e]of this.edges.entries())e.attributes.delete(E.weight),e.attributes.delete(E.minlen),e.attributes.delete(E.constraint);return this.graphvizModel.apply({[E.layout]:`fdp`,[E.overlap]:`vpsc`,[E.sep]:`+50,50`,[E.esep]:`+10,10`,[E.start]:`random2`,[E.splines]:`compound`,[E.K]:10}),this.graphvizModel.delete(E.compound),this.graphvizModel.delete(E.rankdir),this.graphvizModel.delete(E.nodesep),this.graphvizModel.delete(E.ranksep),this.graphvizModel.delete(E.pack),this.graphvizModel.delete(E.pad),this.graphvizModel.delete(E.packmode),this.graphvizModel.attributes.graph.delete(E.margin),this}},ec=class extends $s{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(E.TBbalance),e.apply({[E.nodesep]:W(t.nodeSep??130),[E.ranksep]:W(t.rankSep??130)}),e}postBuild(e){w(this.view.nodes,y(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),xe(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Ye(),y(e=>e),me(t=>{t.length<2||e.subgraph({[E.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(N(n).id)})}),We(()=>{e.set(E.newrank,!0),e.set(E.clusterrank,`global`),e.delete(E.pack),e.delete(E.packmode)}))}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(E.margin,Ls(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Re(e)),[s,c,l]=this.edgeEndpoint(r,$e),u=he(l)||he(o),d=t.edge([a,c],{[E.likec4_id]:e.id,[E.style]:e.line??Ys});l&&d.attributes.set(E.lhead,l),o&&d.attributes.set(E.ltail,o);let f=this.graphology.getEdgeAttribute(e.id,`weight`);f>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&d.attributes.set(E.weight,f);let p=qs(e);if(p&&d.attributes.set(u?E.xlabel:E.label,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[E.color]:t.line,[E.fontcolor]:t.label})}let[m,h]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return m===`none`&&h===`none`?(d.attributes.apply({[E.arrowtail]:`none`,[E.arrowhead]:`none`,[E.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[E.arrowhead]:Ps(m),[E.arrowtail]:Ps(e.tail??m),[E.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(E.constraint,!1),d):(m&&d.attributes.set(E.arrowhead,Ps(m)),h!==`none`&&d.attributes.set(E.arrowtail,Ps(h)),d)}},tc=class extends $s{postBuild(e){e.delete(E.TBbalance),e.set(E.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>Re(e)),[c,l,u]=this.edgeEndpoint(i,$e),d=t.edge([o,l],{[E.likec4_id]:e.id,[E.style]:e.line??Ys});if(u&&d.attributes.set(E.lhead,u),s&&d.attributes.set(E.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[E.color]:t.line,[E.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(C).join(`
13
- `),p=Js(io(e.id),f);d.attributes.set(E.label,p);let m=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===i)<m&&e.dir!==`back`&&d.attributes.apply({[E.minlen]:0});let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(d.attributes.apply({[E.arrowtail]:Ps(h),[E.dir]:`back`}),g!==`none`&&d.attributes.apply({[E.arrowhead]:Ps(g),[E.minlen]:0}),d):h===`none`&&g===`none`||h!==`none`&&g!==`none`?(d.attributes.apply({[E.arrowhead]:Ps(h),[E.arrowtail]:Ps(g),[E.dir]:`both`}),d):h===`none`?(d.attributes.delete(E.arrowhead),d.attributes.apply({[E.arrowtail]:Ps(g),[E.minlen]:0,[E.dir]:`back`}),d):(d.attributes.set(E.arrowhead,Ps(h)),d)}};const nc=gs(`dot.rank`);var rc=class extends $s{postBuild(e){this.assignGroups();let t=new Set,n=this.view.nodes.reduce((e,n)=>(Ns(n)&&(t.add(n.id),e.push(n)),e),[]),r=!1;for(let e of n){let t=w(e.children,S(e=>!this.compoundIds.has(e)),y(e=>this.computedNode(e)),S(e=>e.inEdges.length===0&&e.outEdges.length===0));if(t.length<=2)continue;let n=2;switch(!0){case t.length>11:n=4;break;case t.length>4:n=3;break}let i=N(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),a=null;qe(t,n).forEach(e=>{let t=e.length>1?i.createSubgraph({[E.rank]:`same`}):null;e.forEach((e,n)=>{let r=this.getGraphNode(e.id);r&&(t?.node(r.id),n===0&&(a&&i.edge([a,r],{[E.style]:`invis`}),a=r))}),r||=!!t})}let i=this.applyExplicitRankBlocks(e);r&&(e.set(E.newrank,!0),e.set(E.clusterrank,`global`)),i>0&&e.set(`likec4_rankBlocks`,i)}applyExplicitRankBlocks(e){let t=this.view.ranks??[];if(t.length===0)return 0;let n=0;for(let r of t){let t=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(t.length===0)continue;let i=e.createSubgraph({[E.rank]:r.type});t.forEach(e=>i.node(e.id)),n+=1,nc.debug`rank ${r.type} => ${t.map(e=>e.id).join(`, `)}`}return n}addEdge(e,t){let[n,r]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Re(e)),[s,c,l]=this.edgeEndpoint(r,$e),u=e.parent,d=this.graphology.getEdgeAttributes(e.id),f=t.edge([a,c],{[E.likec4_id]:e.id,[E.style]:e.line??Ys});l&&f.attributes.set(E.lhead,l),o&&f.attributes.set(E.ltail,o);let p=he(l)||he(o);!this.graphology.hasDirectedEdge(e.target,e.source)&&d.weight>1&&f.attributes.set(E.weight,d.weight);let m=qs(e);if(m&&f.attributes.set(p?E.xlabel:E.label,m),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;f.attributes.apply({[E.color]:t.line,[E.fontcolor]:t.label})}let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return f.attributes.apply({[E.arrowtail]:Ps(h),[E.dir]:`back`}),g!==`none`&&f.attributes.apply({[E.arrowhead]:Ps(g),[E.dir]:`both`,[E.minlen]:0}),f;if(h===`none`&&g===`none`)return f.attributes.apply({[E.arrowtail]:`none`,[E.arrowhead]:`none`,[E.dir]:`none`,[E.minlen]:0,[E.constraint]:!1}),f;if(h!==`none`&&g!==`none`)return f.attributes.apply({[E.arrowhead]:Ps(h),[E.arrowtail]:Ps(g),[E.dir]:`both`}),f;if(f.attributes.set(E.arrowhead,Ps(h)),g!==`none`&&f.attributes.set(E.arrowtail,Ps(g)),this.view.edges.length===1)return f;let _;return _=u===null&&i.parent==null&&s.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 n=this.computedNode(t.source),r=this.computedNode(t.target);return Ns(n)||Ns(r)?!1:n.parent==null&&r.parent==null}):this.findInternalEdges(u).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),_.length===0&&(u===null||this.leafElements(u).length<=3)&&f.attributes.set(E.minlen,0),f}};function ic(e){let[t,n,r,i]=e?e.split(`,`).map(e=>Fs(+e)):[0,0,0,0],a=Math.round(r-t),o=Math.round(n-i);return{x:Math.round(t),y:Math.round(i),width:a,height:o}}function ac(e){try{let[t,n]=e.split(`,`);return{x:Fs(parseFloat(t)),y:Fs(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function oc(e){let{x:t,y:n}=ac(e.pos),r=Is(parseFloat(e.width)),i=Is(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function sc(e,[t,n]=[0,0]){if(!e||e.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0,s=13;try{for(let c of e){if(c.op===`F`){s=Fs(c.size);continue}if(c.op===`T`){let e=Fs(c.pt[0])-t,l=Fs(c.width);switch(c.align){case`r`:e-=l;break;case`c`:e-=Math.round(l/2);break}r=Math.min(r,e),a=Math.max(a,e+l);let u=Fs(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return hs.warn(`Failed on parsing label draw ops:
14
- {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function cc({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);P(T(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&hs.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>Fs(e));return P(T(i,2),`view ${n} edge ${t} should have at least two points`),i}catch(r){throw Error(`failed on parsing view ${n} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:r})}}function lc(e,{id:t,source:n,target:r,dir:i,label:a,description:o,...s},c){let l=sc(e._ldraw_??e._tldraw_??e._hldraw_),u=e.dir===`back`||i===`back`;return a=a&&l?Vs(a,{maxchars:40,maxLines:5}).join(`
15
- `):null,{id:t,source:n,target:r,label:a,...C(o)&&{description:o},points:cc(e,c),labelBBox:l,...u?{dir:`back`}:{},...s}}function uc(e,t){let n=ic(e.bb),{nodes:r,edges:i,hasManualLayout:a,manualLayout:o,...s}=t,c=[],l=[],u;if(u=s._type===`dynamic`?{...s,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[Ua]:`layouted`,bounds:n,nodes:c,edges:l}:{...s,[Ua]:`layouted`,bounds:n,nodes:c,edges:l},a){let e=u;e[Ga]=`auto`}let d=e.objects??[];for(let e of r){let t=d.find(t=>t.likec4_id===e.id);P(t,`View ${s.id} node ${e.id} not found in graphviz output`);try{let{x:n,y:r,width:i,height:a}=`bb`in t?ic(t.bb):oc(t),o=[n,r];c.push({...e,x:n,y:r,width:i,height:a,labelBBox:sc(t._ldraw_,o)??{x:n,y:r,width:i,height:a}})}catch(n){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:n})}}let f=e.edges??[];for(let e of i){let t=f.find(t=>t.likec4_id===e.id);if(!t){hs.warn`View ${s.id} edge ${e.id} not found in graphviz output, skipping`;continue}l.push(lc(t,e,s.id))}return u}function dc(e,t){return uc(e,t)}var fc=class e extends $s{static toDot(t){return new e(t).print()}constructor(e){super(e,Bo.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[E.nodesep]:W(100),[E.ranksep]:W(100)}),e.delete(E.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[E.likec4_id]:e.id,[E.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let n=N(this.getGraphNode(e.source),`Node not found for ${e.source}`),r=N(this.getGraphNode(e.target),`Node not found for ${e.target}`),i=this.graphology.getEdgeAttributes(e.id),a=t.edge([n,r],{[E.likec4_id]:e.id,[E.likec4_project]:e.projectId,[E.style]:e.line??Ys});!this.graphology.hasDirectedEdge(e.target,e.source)&&i.weight>1&&a.attributes.set(E.weight,i.weight);let o=qs(e);if(o&&a.attributes.set(E.label,o),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;a.attributes.apply({[E.color]:t.line,[E.fontcolor]:t.label})}return a}};const pc=en(1);var mc=class e{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){ii.unload()}[Symbol.dispose](){this.dispose()}async attempt(t,n,r){return await pc(async()=>{let i=hs.getChild([`graphviz`,`wasm`,t,Be(4)]);try{i.trace`execute`;let t=await r();return++e.opsCount>=20&&(e.opsCount=0,i.trace`reached 20 operations, unloading wasm`,ii.unload()),t}catch(t){i.debug(`FAILED DOT`,{dot:n}),i.error(U(t)),e.opsCount=0,ii.unload()}i.warn(`Retrying...`);try{return await _a(30,300),await r()}catch(e){return i.error(U(e)),Promise.reject(e)}})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await ii.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 ii.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await ii.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await ii.load()).layout(e,`svg`))}};const hc=({view:e,styles:t})=>{switch(!0){case To(e):return new tc(e,t);case wo(e):return new ec(e,t);case So(e):return new rc(e,t);default:F(e)}},gc=hs.getChild(`layouter`);var _c=class{graphviz;constructor(e){this.graphviz=e??new mc,gc.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,gc.trace`change port to ${this.graphviz.name}`}async dotToJson(e){let t=gc.getChild([`dotToJson`,Be(3)]),n;try{n=await this.graphviz.layoutJson(e)}catch(n){throw t.error(U(n)),t.error`Failed to convert DOT to JSON:\n${e}`,n}try{return JSON.parse(n)}catch(r){throw t.error(U(r)),t.error`Failed to parse JSON:\n${n}\n. Generated from DOT:\n${e}`,r}}async layout(e){let t=gc.getChild([`layout`,Be(3)]);try{t.debug`layouting view ${e.view.id}...`;let n=await this.dot(e),{view:r}=e,i=uc(await this.dotToJson(n),r);return r.manualLayout&&(i=bs(i,r.manualLayout)),To(i)&&Object.assign(i,{sequenceLayout:As(i)}),n=n.split(`
16
- `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Qs}`))).join(`
11
+ `+es(r)}}return e}const as={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function os(){return cs({format:({message:e})=>e})}const ss=e=>as[e];function cs(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return Pt({timestamp:`time`,level:ss,category:`.`,...e,format:e=>t(is(e))})}const ls=`\x1B[0m`,us={red:`\x1B[31m`};function ds(e){let t=e?.format??(({timestamp:e,level:t,category:n,message:r})=>`${e} ${t} ${n} ${r}`);return It({timestamp:`time`,level:ss,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,...e,format:e=>t(is(e,!0))})}function fs(e){let t=e?.messageFormatter;return t?e=>{let{properties:n}=e;return n&&Object.keys(n).length>0?[t(e),n]:[t(e)]}:e=>{let{message:t,properties:n}=e;return n&&Object.keys(n).length>0?[...t,n]:t}}function ps(e){return Ft({formatter:fs(),...e})}function ms(e){let t=e?.formatter??fs();return e=>{let n=t(e);if(typeof n==`string`){let e=n.replace(/\r?\n$/,``);console.error(e)}else console.error(...n)}}const hs=Nt(`likec4`);function gs(e){return hs.getChild(e)}function _s(e){try{let{sinks:t={},loggers:n,...r}=e??{},i={console:ps(),...t};Lt({reset:!0,...r,sinks:i,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}function vs(e){return T(e,be(e=>e.parallelPrefix??void 0),ae((e,t)=>e.reduce((e,t)=>(e.min.column=Math.min(e.min.column,t.from.column,t.to.column),e.min.row=Math.min(e.min.row,t.from.row,t.to.row),e.max.column=Math.max(e.max.column,t.from.column,t.to.column),e.max.row=Math.max(e.max.row,t.from.row,t.to.row),e),{parallelPrefix:t,min:{column:1/0,row:1/0},max:{column:-1/0,row:-1/0}})),Xe())}function ys(e,t){if(e.length===0||e.length===t.length)return[];let n=e=>N(t.find(t=>t.id===e));function r(e){let t=e.parent?n(e.parent):null;return t?[t,...r(t)]:[]}let i=new vt.default,a=[];return e.forEach(e=>{let t=r(e);if(t.length===0){i.clear();return}let n=vt.default.from(t),o,s;for(;o=i.peek()?.node,s=n.peek(),!(!s||!o);){if(I(s.id,o.id)||s.id===o.id){n.pop();continue}if(!I(o.id,s.id)){i.pop();continue}break}for(;s=n.pop();){let t={node:s,from:e,to:e,nested:[]},n=i.peek();n?n.nested.push(t):a.push(t),i.push(t)}i.forEach(t=>t.to=e)}),a}var bs=class{#e=new Gt;#t;#n=[];#r;#i;#a;#o=[];#s=[];constructor({actors:e,steps:t,compounds:n}){this.#a=this.newVar(30),this.#r=this.newVar(0),this.#i=this.newVar(0),this.#t=this.addActors(e);for(let e of n){let t=this.addCompound(e),n=t[0];this.constraint(n.y1,`==`,0,Ht.strong),this.put(this.#i).after(n.bottom),this.put(this.#a).after(n.y2),this.#n.push(...t)}for(let e of t)this.addStep(e);for(let e of vs(t))this.addParallelRect(e);let r=this.#t[0];this.constraint(r.offset.left,`==`,0,Ht.strong);let i=this.#t.reduce((e,t)=>(this.put(t.x).after(e.right,60),this.put(t.offset.left,Ht.strong).after(e.offset.right,32),this.constraint(t.centerY,`==`,e.centerY,Ht.strong),this.put(this.#a).after(t.offset.bottom),t));if(this.put(this.#r).after(i.offset.right),this.put(this.#i).after(Re(this.#o)?.bottom??this.#a),n.length>0)for(let e of this.#n){let t=e.from.column,n=e.to.column,r=Math.max(e.from.maxRow,e.to.maxRow);for(let e=t+1;e<n;e++){let t=this.actorBox(e);r=Math.max(r,t.maxRow)}let i=N(this.#o[r],`row ${r} not found`);this.put(e.bottom).after(i.bottom,16),this.put(this.#i).after(e.bottom)}this.#e.updateVariables()}getParallelBoxes(){return this.#s.map(({parallelPrefix:e,x1:t,y1:n,x2:r,y2:i})=>({parallelPrefix:e,x:t.value(),y:n.value(),width:r.value()-t.value(),height:i.value()-n.value()}))}getActorBox(e){let t=this.actorBox(e);return{x:t.x.value(),y:t.y.value(),width:t.width,height:t.height}}getCompoundBoxes(){return this.#n.map(({node:e,depth:t,x1:n,y1:r,x2:i,bottom:a})=>({node:e,depth:t,x:n.value(),y:r.value(),width:i.value()-n.value(),height:a.value()-r.value()}))}getPortCenter(e,t){let{column:n,row:r}=t===`source`?e.from:e.to,i=this.actorBox(n).centerX,{y:a}=N(this.#o[r]);return{cx:i.value(),cy:a.value()+32/2+e.offset,height:t===`source`?40:24}}getViewBounds(){return{x:0,y:0,width:this.#r.value(),height:this.#i.value()}}actorBox(e){if(typeof e!=`number`){let t=typeof e==`string`?e:e.id;e=this.#t.findIndex(e=>e.actor.id===t),P(e>=0,`actor ${t} not found`)}return N(this.#t[e],`actor at index ${e} not found`)}addActors(e){let t=0;return b(e,(e,n)=>{let r=this.newVar(t);t+=e.width+60;let i=this.newVar(0),a={column:n,actor:e,x:r,y:i,centerX:r.plus(Math.round(e.width/2)),centerY:i.plus(Math.round(e.height/2)),width:e.width,height:e.height,right:r.plus(e.width),bottom:i.plus(e.height),minRow:1/0,maxRow:-1/0},o=this.newVar(0),s=this.newVar(0),c=this.newVar(0),l=this.newVar(0);return this.put(o,Ht.strong).before(i),this.put(s,Ht.strong).before(r),this.put(c,Ht.strong).after(a.right),this.put(l,Ht.strong).after(a.bottom),{...a,offset:{top:o,left:s,right:c,bottom:l}}})}addStep(e){let t=this.actorBox(e.source),n=this.actorBox(e.target);t.minRow=Math.min(t.minRow,e.from.row),t.maxRow=Math.max(t.maxRow,e.from.row),n.minRow=Math.min(n.minRow,e.to.row),n.maxRow=Math.max(n.maxRow,e.to.row);let[r,i]=t.column<=n.column?[t,n]:[n,t],a=(e.label?.width??100)+50;r===i?this.constraint(r.centerX.plus(a),`<=`,r.offset.right):this.constraint(r.centerX.plus(a),`<=`,i.centerX);let o=e.label?.height?e.label.height+50+32/2:80;return o=Math.max(o,80)+e.offset,this.ensureRow(e.from.row,o),e.isSelfLoop&&this.ensureRow(e.to.row,80),this}addParallelRect({parallelPrefix:e,min:t,max:n}){let r=this.actorBox(t.column).centerX.minus(30),i=this.actorBox(n.column).centerX.plus(30),a=this.#o[t.row],o=this.#o[n.row];P(a&&o,`parallel box invalid minRow=${t.row} maxRow=${n.row}`);let s=this.newVar(0);this.put(s).before(a.y,40);let c=o.bottom,l=t.row>0&&this.#o[t.row-1];l&&this.put(s).after(l.bottom,16);let u=n.row<this.#o.length-1&&this.#o[n.row+1];u&&this.put(c).before(u.y,16),this.#s.push({parallelPrefix:e,x1:r,y1:s,x2:i,y2:c})}addCompound(e){let t=[],n=e.nested.flatMap(e=>{let n=this.addCompound(e);return t.push(n[0]),n}),r=Math.max(...n.map(e=>e.depth+1),0),i=this.actorBox(e.from),a=this.actorBox(e.to),o=i.offset.left.minus(32);i.offset.left=o;let s=a.offset.right.plus(32);a.offset.right=s;let c=this.newVar(0),l=he(t),u,d;switch(!0){case!!l:u=l.y1.minus(40),d=l.y2.plus(32),this.put(c).after(l.bottom,32);break;case a===i:u=this.newVar(0),d=this.newVar(0),this.put(u).before(i.offset.top,52),this.put(d).after(i.offset.bottom,32),this.put(c).after(d);break;case t.length>0:u=this.newVar(0),d=this.newVar(0);for(let e of t)this.put(u).before(e.y1,32),this.put(d).after(e.y2,32),this.put(c).after(e.bottom,32);break;default:u=this.newVar(0),d=this.newVar(0);for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;this.put(u).before(e.top,52),this.put(d).after(e.bottom,32)}this.put(c).after(d);break}for(var f=i.column;f<=a.column;f++){let e=this.actorBox(f).offset;e.top=u,e.bottom=d}return[{node:e.node,depth:r,from:i,to:a,x1:o,y1:u,x2:s,y2:d,bottom:c},...n]}ensureRow(e,t){for(;e>=this.#o.length;){let e=this.#o.length>0&&this.#o[this.#o.length-1]?.bottom||this.#a.plus(30),t=this.newVar(this.#o.length*80);this.put(t).after(e);let n=this.newVar(80);this.require(n,`>=`,80),this.#o.push({y:t,height:n,bottom:t.plus(n),lastHeight:80})}let n=N(this.#o[e]);t>n.lastHeight&&(n.lastHeight=t,this.require(n.height,`>=`,t),this.#e.suggestValue(n.height,t))}newVar(e){let t=new Vt;return this.#e.addEditVariable(t,Ht.weak),typeof e==`number`&&(this.#e.suggestValue(t,e),this.constraint(t,`>=`,0,Ht.strong)),t}require(e,t,n=void 0){switch(this.constraint(e,t,n,Ht.required),t){case`<=`:case`>=`:this.constraint(e,`==`,n,Ht.weak);break;case`<= 0`:case`>= 0`:this.constraint(e,`== 0`,void 0,Ht.weak);break}}constraint(e,t,n=void 0,r=Ht.medium){let i;switch(t){case`==`:i=Wt.Eq;break;case`>=`:i=Wt.Ge;break;case`<=`:i=Wt.Le;break;case`== 0`:i=Wt.Eq,n=0;break;case`>= 0`:i=Wt.Ge,n=0;break;case`<= 0`:i=Wt.Le,n=0;break;default:F(t)}this.#e.addConstraint(new Ut(e,i,n??0,r))}put(e,t=Ht.required){let n=t===Ht.required?Ht.medium:Ht.weak;return{before:(r,i)=>{i&&(r=r.minus(i)),this.constraint(e,`<=`,r,t),this.constraint(e,`==`,r,n)},after:(r,i)=>{i&&(r=r.plus(i)),this.constraint(e,`>=`,r,t),this.constraint(e,`==`,r,n)}}}};function xs(e){let t=new Set,n=t=>N(e.nodes.find(e=>e.id===t)),r=[];for(let i of e.edges.filter(e=>no(e.id))){let e=n(i.source),a=n(i.target);if(e.children.length||a.children.length){console.error(`Sequence view does not support nested actors`);continue}t.add(e),t.add(a),r.push({edge:i,source:e,target:a})}let i=e.nodes.filter(e=>t.has(e));P(C(i,1),`actors array must not be empty`);let a=new E.default(()=>[]),o=[],s=0;for(let{edge:e,source:t,target:n}of r){let r=o.at(-1),c=i.indexOf(t),l=i.indexOf(n),u=t===n,d=c>l,f=ko(e.id),p=!1;r&&r.target==t&&r.parallelPrefix===f&&(p=r.isSelfLoop!==u||r.isBack===d),p||s++;let m={id:e.id,from:{column:c,row:s},to:{column:l,row:u?++s:s},edge:e,isSelfLoop:u,isBack:d,parallelPrefix:f,offset:p?(r?.offset??0)+22:0,source:t,target:n,label:e.labelBBox?{height:e.labelBBox.height+8+(e.navigateTo?20:0),width:e.labelBBox.width+16,text:e.label}:null};o.push(m),a.get(t).push({step:m,row:s,type:`source`,position:d&&!u?`left`:`right`}),a.get(n).push({step:m,row:s,type:`target`,position:d||u?`right`:`left`})}let c=new bs({actors:i,steps:o,compounds:ys(i,e.nodes)}),l=c.getViewBounds(),u=T(c.getCompoundBoxes(),b(({node:e,...t})=>({...t,id:e.id,origin:e.id})),xe(`id`),ae((e,t)=>C(e,2)?b(e,(e,n)=>({...e,id:`${t}-${n+1}`})):e),Xe(),tt());return{actors:i.map(e=>Ss({actor:e,ports:a.get(e),layout:c})),compounds:u,steps:b(o,e=>({id:e.id,sourceHandle:e.id+`_source`,targetHandle:e.id+`_target`,...e.label&&{labelBBox:{width:e.label.width,height:e.label.height}}})),parallelAreas:c.getParallelBoxes(),bounds:l}}function Ss({actor:e,ports:t,layout:n}){let{x:r,y:i,width:a,height:o}=n.getActorBox(e);return{id:e.id,x:r,y:i,width:a,height:o,ports:t.map(e=>{let t=n.getPortCenter(e.step,e.type);return{id:`${e.step.id}_${e.type}`,cx:t.cx-r,cy:t.cy-i,height:t.height,type:e.type,position:e.position}})}}var Cs=t(Jt(),1);function ws(e){return e.children.length>0}function Ts(e){switch(e){case`open`:return`vee`;default:return e}}function Es(e){return Array.isArray(e)?[Es(e[0]),Es(e[1])]:(P(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const Ds=e=>(P(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),W=e=>Math.ceil(e/72*1e3)/1e3,Os=e=>Math.ceil(e);Os(40).toString();function ks(e,t){return Xt(Zt(e,{l:-35-5*t,s:-15-5*t}))}function As(e){return Xt(Yt(e,.3))}function js(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function Ms(e,{maxchars:t,maxLines:n,sanitize:r=Ye()}){let i=(0,Cs.default)(e,{width:t,indent:``,escape:r}).split(`
12
+ `);return _e(n)&&n>0&&i.length>n&&(i=i.slice(0,n)),i}function Ns({text:e,maxchars:t,fontsize:n,maxLines:r,bold:i,color:a}){let o=Ms(e,{maxchars:t,maxLines:r,sanitize:js}).join(`<BR/>`);i&&(o=`<B>${o}</B>`);let s=a?` COLOR="${a}"`:``;return`<FONT POINT-SIZE="${Os(n)}"${s}>${o}</FONT>`}function Ps(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:F(e)}}function Fs(e,t){let{sizes:{size:n},values:r}=t.nodeSizes(e.style),i=t.colors(e.color).elements,a=[`sm`,`xs`].includes(n),o=y(e.icon),s=e.style.iconPosition??`left`,c=o&&(s===`left`||s===`right`),l=[Ns({text:e.title,fontsize:r.textSize,maxchars:Ps(n),maxLines:a?1:3})];if(n!==`xs`){y(e.technology?.trim())&&l.push(Ns({text:e.technology,fontsize:Math.ceil(r.textSize*.65),maxchars:c?35:45,maxLines:1,color:i.loContrast}));let t=Io.from(e.description).text;t&&l.push(Ns({text:t,fontsize:Math.ceil(r.textSize*.75),maxchars:c?35:45,maxLines:a?3:5,color:i.loContrast}))}if(l.length===1&&o===!1)return`<${l[0]}>`;let u=c?(t,n,i)=>{let a=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(n===0){let t=i.length>1?` ROWSPAN="${i.length}"`:``,n=Math.ceil(r.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(n+=20),s===`right`?(a=`<TD${t} WIDTH="16"> </TD>${a}`,a=`${a}<TD${t} WIDTH="${n}"> </TD>`):(a=`<TD${t} WIDTH="${n}"> </TD>${a}`,a=`${a}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${a}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,d=l.map(u).join(``);if(o&&(s===`top`||s===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(r.iconSize+8)}"> </TD></TR>`;d=s===`top`?`${e}${d}`:`${d}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${d}</TABLE>>`}function Is(e,t){let n=Ns({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return n.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${n}</TD></TR></TABLE>>`:`<${n}>`}const Ls=`BGCOLOR="${zo.DEFAULT.relationshipColors.labelBg}A0"`;function Rs({label:e,technology:t}){let n=[];return y(e?.trim())&&n.push(Ns({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),y(t?.trim())&&n.push(Ns({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),n.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Ls}>${n.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``)}</TABLE>>`}function zs(e,t){let n=`<TABLE BORDER="0" CELLPADDING="6" ${Ls}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${Os(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return y(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${n}</TD>`,`<TD ${Ls} CELLPADDING="3">`,Ns({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${n}>`}const Bs=`dashed`,Vs=`Arial`,Hs=gs(`dot`),Us=50.1;var Ws=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new Qt({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(ws).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`),n=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||n===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),n=this.graphology.getNodeAttribute(t.target,`modelRef`));let r=-1;e!==null&&n!==null&&(r=Zi(e,n)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:r,weight:1}),r>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:r}),r>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:r})}this.graphology.forEachEdge((e,{hierarchyDistance:t},n,r,i,a)=>{let o=Math.max(i.maxConnectedHierarchyDistance,a.maxConnectedHierarchyDistance);if(o>t)this.graphology.mergeEdgeAttributes(e,{weight:o-t+1});else{let i=this.graphology.directedDegree(n),a=this.graphology.directedDegree(r);i===1&&a===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let n=this.graphvizModel=this.createGraph();this.applyNodeAttributes(n.attributes.node),this.applyEdgeAttributes(n.attributes.edge),this.build(n),this.postBuild(n)}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){}build(e){let t=(e,n)=>{let r=this.generateGraphvizId(e),i=this.elementToSubgraph(e,n.subgraph(r));this.subgraphs.set(e.id,i);for(let n of e.children){let e=this.computedNode(n);if(ws(e))t(e,i);else{let t=N(this.getGraphNode(e.id),`Graphviz Node not found for ${e.id}`);i.node(t.id)}}},n=[];for(let t of this.view.nodes)if(ws(t))v(t.parent)&&n.push(t);else{let n=this.generateGraphvizId(t),r=this.elementToNode(t,e.node(n));this.nodes.set(t.id,r)}for(let r of n)t(r,e);for(let t of this.view.edges){let n=this.addEdge(t,e);n&&this.edges.set(t.id,n)}}print(){return qt(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let e=this.view.autoLayout,t=Kt({[D.likec4_viewId]:this.view.id,[D.bgcolor]:`transparent`,[D.layout]:`dot`,[D.compound]:!0,[D.rankdir]:e.direction,[D.TBbalance]:`min`,[D.splines]:`spline`,[D.outputorder]:`nodesfirst`,[D.nodesep]:W(e.nodeSep??110),[D.ranksep]:W(e.rankSep??120),[D.pad]:W(15),[D.fontname]:Vs});return t.attributes.graph.apply({[D.fontsize]:Os(this.styles.fontSize()),[D.labeljust]:e.direction===`RL`?`r`:`l`,[D.labelloc]:e.direction===`BT`?`b`:`t`,[D.margin]:Us}),t}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[D.fontname]:Vs,[D.shape]:`rect`,[D.fillcolor]:t.fill,[D.fontcolor]:t.hiContrast,[D.color]:t.stroke,[D.style]:`filled`,[D.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[D.arrowsize]:.75,[D.fontname]:Vs,[D.fontsize]:Os(14),[D.penwidth]:Os(2),[D.color]:t.line,[D.fontcolor]:t.label})}checkNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),this.ids.has(e)?null:(this.ids.add(e),e)}generateGraphvizId(e){let t=ws(e),n=Ki(e.id).toLowerCase(),r=this.checkNodeId(n,t);if(r!==null)return r;n=Ki(e.id).toLowerCase();let i=1;do r=this.checkNodeId(n+`_`+ i++,t);while(r===null);return r}elementToSubgraph(e,t){P(ws(e),`node should be compound`),P(ce(e.depth),`node.depth should be defined`);let n=this.styles.colors(e.color).elements,r=As(n.loContrast);return t.apply({[D.likec4_id]:e.id,[D.likec4_level]:e.level,[D.likec4_depth]:e.depth,[D.fillcolor]:ks(n.fill,e.depth),[D.color]:ks(n.stroke,e.depth),[D.style]:`filled`,[D.margin]:Os(e.children.length>1?40:32)}),_(e.title.trim())||t.set(D.label,Is(e,r)),t}elementToNode(e,t){P(!ws(e),`node should not be compound`);let n=y(e.icon),r=this.styles.colors(e.color).elements,{values:{padding:i,sizes:{width:a,height:o}}}=this.styles.nodeSizes(e.style),s=n?8:i;switch(t.attributes.apply({[D.likec4_id]:e.id,[D.likec4_level]:e.level,[D.label]:Fs(e,this.styles),[D.margin]:`${W(s)},${W(i)}`}),t.attributes.set(D.width,W(a)),t.attributes.set(D.height,W(o)),this.styles.isDefaultColor(e.color)||t.attributes.apply({[D.fillcolor]:r.fill,[D.fontcolor]:r.hiContrast,[D.color]:r.stroke}),e.shape){case`cylinder`:case`storage`:t.attributes.apply({[D.margin]:`${W(s)},${W(0)}`,[D.penwidth]:Os(2),[D.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[D.margin]:`${W(n?s:s+4)},${W(i+6)}`});break;case`mobile`:t.attributes.apply({[D.margin]:`${W(n?s:s+4)},${W(i)}`});break;case`queue`:t.attributes.apply({[D.width]:W(a),[D.height]:W(o-8),[D.margin]:`${W(n?s:s+4)},${W(i)}`});break;case`component`:t.attributes.apply({[D.width]:W(a+10),[D.margin]:`${W(s+20)},${W(i)}`});break;default:break}return t}leafElements(e){return e===null?this.view.nodes.filter(e=>!ws(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return ws(t)?this.leafElements(t.id):t})}descendants(e){return e===null?this.view.nodes.slice():this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return N(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let n=this.computedNode(e),r=this.getGraphNode(e),i;return r?[n,r,void 0]:(P(ws(n),`endpoint node should be compound`),i=this.getSubgraph(e)?.id,P(i,`subgraph ${e} not found`),n=N(t(this.leafElements(e)),`leaf element in ${e} not found`),r=N(this.getGraphNode(n.id),`source graphviz node ${n.id} not found`),[n,r,i])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return T(this.descendants(e),w(e=>Ae(e.inEdges,e.outEdges)),we(),Be(Ae(t.inEdges,t.outEdges)),b(e=>this.view.edges.find(t=>t.id===e)),S(y))}withoutCompoundEdges(e){return this.edgesWithCompounds.size===0?e:{...e,inEdges:e.inEdges.filter(e=>!this.edgesWithCompounds.has(e)),outEdges:e.outEdges.filter(e=>!this.edgesWithCompounds.has(e))}}assignGroups(){let e=T(this.view.nodes,S(ws),b(e=>e.id),De(ea),ke(),b(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),S(({edges:e})=>e.length>1&&e.length<8),Ee(4)),t=new Set;for(let n of e){let e=n.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let r of e)try{let e=N(this.getGraphNode(r.source),`Graphviz Node not found for ${r.source}`),i=N(this.getGraphNode(r.target),`Graphviz Node not found for ${r.target}`);t.add(r.source),t.add(r.target),e.attributes.set(D.group,n.id),i.attributes.set(D.group,n.id)}catch(e){Hs.error(`Failed to assign group to edge ${r.id}`,{error:e})}}}applyManualLayout({height:e,...t}){let n=t.x<0?-t.x:0;t.y<0&&-t.y;for(let{id:r,...i}of t.nodes){let t=this.getGraphNode(r);if(!t)continue;let a=W(i.center.x)+n,o=W(e-i.center.y);i.fixedsize?t.attributes.apply({[D.pos]:`${a},${o}!`,[D.pin]:!0,[D.width]:W(i.fixedsize.width),[D.height]:W(i.fixedsize.height),[D.fixedsize]:!0}):t.attributes.set(D.pos,`${a},${o}`)}for(let[,e]of this.edges.entries())e.attributes.delete(D.weight),e.attributes.delete(D.minlen),e.attributes.delete(D.constraint);return this.graphvizModel.apply({[D.layout]:`fdp`,[D.overlap]:`vpsc`,[D.sep]:`+50,50`,[D.esep]:`+10,10`,[D.start]:`random2`,[D.splines]:`compound`,[D.K]:10}),this.graphvizModel.delete(D.compound),this.graphvizModel.delete(D.rankdir),this.graphvizModel.delete(D.nodesep),this.graphvizModel.delete(D.ranksep),this.graphvizModel.delete(D.pack),this.graphvizModel.delete(D.pad),this.graphvizModel.delete(D.packmode),this.graphvizModel.attributes.graph.delete(D.margin),this}},Gs=class extends Ws{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(D.TBbalance),e.apply({[D.nodesep]:W(t.nodeSep??130),[D.ranksep]:W(t.rankSep??130)}),e}postBuild(e){T(this.view.nodes,b(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),be(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Xe(),b(e=>e),ee(t=>{t.length<2||e.subgraph({[D.rank]:`same`},e=>{for(let{graphvizNode:n}of t)e.node(N(n).id)})}),Ge(()=>{e.set(D.newrank,!0),e.set(D.clusterrank,`global`),e.delete(D.pack),e.delete(D.packmode)}))}elementToSubgraph(e,t){let n=super.elementToSubgraph(e,t);return e.children.length>1&&n.set(D.margin,Os(50)),n}addEdge(e,t){let[n,r]=[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Re(e)),[s,c,l]=this.edgeEndpoint(r,We),u=st(l)||st(o),d=t.edge([a,c],{[D.likec4_id]:e.id,[D.style]:e.line??Bs});l&&d.attributes.set(D.lhead,l),o&&d.attributes.set(D.ltail,o);let f=this.graphology.getEdgeAttribute(e.id,`weight`);f>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&d.attributes.set(D.weight,f);let p=Rs(e);if(p&&d.attributes.set(u?D.xlabel:D.label,p),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[D.color]:t.line,[D.fontcolor]:t.label})}let[m,h]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return m===`none`&&h===`none`?(d.attributes.apply({[D.arrowtail]:`none`,[D.arrowhead]:`none`,[D.dir]:`none`}),d):e.dir===`both`?(d.attributes.apply({[D.arrowhead]:Ts(m),[D.arrowtail]:Ts(e.tail??m),[D.dir]:`both`}),!u&&i.modelRef!==s.modelRef&&d.attributes.set(D.constraint,!1),d):(m&&d.attributes.set(D.arrowhead,Ts(m)),h!==`none`&&d.attributes.set(D.arrowtail,Ts(h)),d)}},Ks=class extends Ws{postBuild(e){e.delete(D.TBbalance),e.set(D.ordering,`in`)}addEdge(e,t){let{nodes:n}=this.view,[r,i]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[a,o,s]=this.edgeEndpoint(r,e=>Re(e)),[c,l,u]=this.edgeEndpoint(i,We),d=t.edge([o,l],{[D.likec4_id]:e.id,[D.style]:e.line??Bs});if(u&&d.attributes.set(D.lhead,u),s&&d.attributes.set(D.ltail,s),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;d.attributes.apply({[D.color]:t.line,[D.fontcolor]:t.label})}let f=[e.label?.trim(),e.technology?.trim()].filter(y).join(`
13
+ `),p=zs(ro(e.id),f);d.attributes.set(D.label,p);let m=n.findIndex(e=>e.id===r);n.findIndex(e=>e.id===i)<m&&e.dir!==`back`&&d.attributes.apply({[D.minlen]:0});let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(d.attributes.apply({[D.arrowtail]:Ts(h),[D.dir]:`back`}),g!==`none`&&d.attributes.apply({[D.arrowhead]:Ts(g),[D.minlen]:0}),d):h===`none`&&g===`none`||h!==`none`&&g!==`none`?(d.attributes.apply({[D.arrowhead]:Ts(h),[D.arrowtail]:Ts(g),[D.dir]:`both`}),d):h===`none`?(d.attributes.delete(D.arrowhead),d.attributes.apply({[D.arrowtail]:Ts(g),[D.minlen]:0,[D.dir]:`back`}),d):(d.attributes.set(D.arrowhead,Ts(h)),d)}};const qs=gs(`dot.rank`);var Js=class extends Ws{postBuild(e){this.assignGroups();let t=new Set,n=this.view.nodes.reduce((e,n)=>(ws(n)&&(t.add(n.id),e.push(n)),e),[]),r=!1;for(let e of n){let t=T(e.children,S(e=>!this.compoundIds.has(e)),b(e=>this.computedNode(e)),S(e=>e.inEdges.length===0&&e.outEdges.length===0));if(t.length<=2)continue;let n=2;switch(!0){case t.length>11:n=4;break;case t.length>4:n=3;break}let i=N(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),a=null;He(t,n).forEach(e=>{let t=e.length>1?i.createSubgraph({[D.rank]:`same`}):null;e.forEach((e,n)=>{let r=this.getGraphNode(e.id);r&&(t?.node(r.id),n===0&&(a&&i.edge([a,r],{[D.style]:`invis`}),a=r))}),r||=!!t})}let i=this.applyExplicitRankBlocks(e);r&&(e.set(D.newrank,!0),e.set(D.clusterrank,`global`)),i>0&&e.set(`likec4_rankBlocks`,i)}applyExplicitRankBlocks(e){let t=this.view.ranks??[];if(t.length===0)return 0;let n=0;for(let r of t){let t=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(t.length===0)continue;let i=e.createSubgraph({[D.rank]:r.type});t.forEach(e=>i.node(e.id)),n+=1,qs.debug`rank ${r.type} => ${t.map(e=>e.id).join(`, `)}`}return n}addEdge(e,t){let[n,r]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[i,a,o]=this.edgeEndpoint(n,e=>Re(e)),[s,c,l]=this.edgeEndpoint(r,We),u=e.parent,d=this.graphology.getEdgeAttributes(e.id),f=t.edge([a,c],{[D.likec4_id]:e.id,[D.style]:e.line??Bs});l&&f.attributes.set(D.lhead,l),o&&f.attributes.set(D.ltail,o);let p=st(l)||st(o);!this.graphology.hasDirectedEdge(e.target,e.source)&&d.weight>1&&f.attributes.set(D.weight,d.weight);let m=Rs(e);if(m&&f.attributes.set(p?D.xlabel:D.label,m),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;f.attributes.apply({[D.color]:t.line,[D.fontcolor]:t.label})}let[h,g]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return f.attributes.apply({[D.arrowtail]:Ts(h),[D.dir]:`back`}),g!==`none`&&f.attributes.apply({[D.arrowhead]:Ts(g),[D.dir]:`both`,[D.minlen]:0}),f;if(h===`none`&&g===`none`)return f.attributes.apply({[D.arrowtail]:`none`,[D.arrowhead]:`none`,[D.dir]:`none`,[D.minlen]:0,[D.constraint]:!1}),f;if(h!==`none`&&g!==`none`)return f.attributes.apply({[D.arrowhead]:Ts(h),[D.arrowtail]:Ts(g),[D.dir]:`both`}),f;if(f.attributes.set(D.arrowhead,Ts(h)),g!==`none`&&f.attributes.set(D.arrowtail,Ts(g)),this.view.edges.length===1)return f;let ee;return ee=u===null&&i.parent==null&&s.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 n=this.computedNode(t.source),r=this.computedNode(t.target);return ws(n)||ws(r)?!1:n.parent==null&&r.parent==null}):this.findInternalEdges(u).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&&(u===null||this.leafElements(u).length<=3)&&f.attributes.set(D.minlen,0),f}};function Ys(e){let[t,n,r,i]=e?e.split(`,`).map(e=>Es(+e)):[0,0,0,0],a=Math.round(r-t),o=Math.round(n-i);return{x:Math.round(t),y:Math.round(i),width:a,height:o}}function Xs(e){try{let[t,n]=e.split(`,`);return{x:Es(parseFloat(t)),y:Es(parseFloat(n))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function Zs(e){let{x:t,y:n}=Xs(e.pos),r=Ds(parseFloat(e.width)),i=Ds(parseFloat(e.height));return{x:t-Math.round(r/2),y:n-Math.round(i/2),width:r,height:i}}function Qs(e,[t,n]=[0,0]){if(!e||e.length===0)return null;let r=1/0,i=1/0,a=-1/0,o=-1/0,s=13;try{for(let c of e){if(c.op===`F`){s=Es(c.size);continue}if(c.op===`T`){let e=Es(c.pt[0])-t,l=Es(c.width);switch(c.align){case`r`:e-=l;break;case`c`:e-=Math.round(l/2);break}r=Math.min(r,e),a=Math.max(a,e+l);let u=Es(c.pt[1])-n;i=Math.min(i,Math.round(u-s)),o=Math.max(o,u)}}}catch(t){return hs.warn(`Failed on parsing label draw ops:
14
+ {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return r===1/0?null:{x:r-2,y:i-2,width:a-r+4,height:o-i+4}}function $s({_draw_:e,likec4_id:t=`???`},n=`<unknown view>`){try{let r=e.filter(e=>e.op.toLowerCase()===`b`);P(C(r,1),`view ${n} edge ${t} should have at least one bezier draw op`),r.length>1&&hs.warn(`view ${n} edge ${t} has more than one bezier draw op, using the first one only`);let i=r[0].points.map(e=>Es(e));return P(C(i,2),`view ${n} edge ${t} should have at least two points`),i}catch(r){throw Error(`failed on parsing view ${n} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:r})}}function ec(e,{id:t,source:n,target:r,dir:i,label:a,description:o,...s},c){let l=Qs(e._ldraw_??e._tldraw_??e._hldraw_),u=e.dir===`back`||i===`back`;return a=a&&l?Ms(a,{maxchars:40,maxLines:5}).join(`
15
+ `):null,{id:t,source:n,target:r,label:a,...y(o)&&{description:o},points:$s(e,c),labelBBox:l,...u?{dir:`back`}:{},...s}}function tc(e,t){let n=Ys(e.bb),{nodes:r,edges:i,hasManualLayout:a,...o}=t,s=[],c=[],l;if(l=o._type===`dynamic`?{...o,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:n},[Ha]:`layouted`,bounds:n,nodes:s,edges:c}:{...o,[Ha]:`layouted`,bounds:n,nodes:s,edges:c},a){let e=l;e[Wa]=`auto`}let u=e.objects??[];for(let e of r){let t=u.find(t=>t.likec4_id===e.id);P(t,`View ${o.id} node ${e.id} not found in graphviz output`);try{let{x:n,y:r,width:i,height:a}=`bb`in t?Ys(t.bb):Zs(t),o=[n,r];s.push({...e,x:n,y:r,width:i,height:a,labelBBox:Qs(t._ldraw_,o)??{x:n,y:r,width:i,height:a}})}catch(n){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:n})}}let d=e.edges??[];for(let e of i){let t=d.find(t=>t.likec4_id===e.id);if(!t){hs.warn`View ${o.id} edge ${e.id} not found in graphviz output, skipping`;continue}c.push(ec(t,e,o.id))}return l}function nc(e,t){return tc(e,t)}var rc=class e extends Ws{static toDot(t){return new e(t).print()}constructor(e){super(e,zo.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[D.nodesep]:W(100),[D.ranksep]:W(100)}),e.delete(D.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[D.likec4_id]:e.id,[D.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let n=N(this.getGraphNode(e.source),`Node not found for ${e.source}`),r=N(this.getGraphNode(e.target),`Node not found for ${e.target}`),i=this.graphology.getEdgeAttributes(e.id),a=t.edge([n,r],{[D.likec4_id]:e.id,[D.likec4_project]:e.projectId,[D.style]:e.line??Bs});!this.graphology.hasDirectedEdge(e.target,e.source)&&i.weight>1&&a.attributes.set(D.weight,i.weight);let o=Rs(e);if(o&&a.attributes.set(D.label,o),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;a.attributes.apply({[D.color]:t.line,[D.fontcolor]:t.label})}return a}};const ic=$t(1);var ac=class e{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){oi.unload()}[Symbol.dispose](){this.dispose()}async attempt(t,n,r){return await ic(async()=>{let i=hs.getChild([`graphviz`,`wasm`,t,Ve(4)]);try{i.trace`execute`;let t=await r();return++e.opsCount>=20&&(e.opsCount=0,i.trace`reached 20 operations, unloading wasm`,oi.unload()),t}catch(t){i.debug(`FAILED DOT`,{dot:n}),i.error(U(t)),e.opsCount=0,oi.unload()}i.warn(`Retrying...`);try{return await ya(30,300),await r()}catch(e){return i.error(U(e)),Promise.reject(e)}})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await oi.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 oi.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await oi.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await oi.load()).layout(e,`svg`))}};const oc=({view:e,styles:t})=>{switch(!0){case To(e):return new Ks(e,t);case wo(e):return new Gs(e,t);case So(e):return new Js(e,t);default:F(e)}},sc=hs.getChild(`layouter`);var cc=class{graphviz;constructor(e){this.graphviz=e??new ac,sc.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,sc.trace`change port to ${this.graphviz.name}`}printToDot(e){return oc(e).print()}async dotToJson(e){let t=sc.getChild([`dotToJson`,Ve(3)]),n;try{n=await this.graphviz.layoutJson(e)}catch(n){throw t.error(U(n)),t.error`Failed to convert DOT to JSON:\n${e}`,n}try{return JSON.parse(n)}catch(r){throw t.error(U(r)),t.error`Failed to parse JSON:\n${n}\n. Generated from DOT:\n${e}`,r}}async layout(e){let t=sc.getChild([`layout`,Ve(3)]);try{t.debug`layouting view ${e.view.id}...`;let n=await this.dot(e),{view:r}=e,i=tc(await this.dotToJson(n),r);return To(i)&&Object.assign(i,{sequenceLayout:xs(i)}),n=n.split(`
16
+ `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Us}`))).join(`
17
17
  `),t.debug`layouting view ${e.view.id} done`,{dot:n,diagram:i}}catch(n){throw t.warn(U(n)),ts(n,`Error during layout: ${e.view.id}`)}}async svg(e){let t=await this.dot(e);return t=t.split(`
18
- `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Qs}`))).join(`
19
- `),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=gc.getChild([`dot`,Be(3)]);t.trace`generating dot for view ${e.view.id}`;let n=hc(e).print();if(!So(e.view))return n;try{return t.trace`unflattening dot`,await this.graphviz.unflatten(n)}catch(r){return t.warn(`Error during unflatten: ${e.view.id}`,{error:r}),n}}async layoutProjectsView(e){let t=gc.getChild([`layoutProjectsView`,Be(3)]);t.debug`layouting projects overview...`;let n=new fc(e).print();try{n=await this.graphviz.unflatten(n)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let r=await this.dotToJson(n);return t.debug`layouting projects overview done`,dc(r,e)}};const vc=hs.getChild([`layouter-queue`]);var yc=class extends _c{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new tn({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=vc.getChild([`run`,Be(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await va(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),vc.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,vc.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=vc.getChild([`batch`,Be(3)]);if(this.isProcessingBatch)return t.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await va(),e.cancelToken?.isCancellationRequested?(t.debug`cancellation requested`,[]):(t.debug`retry`,await this.batchLayout(e));let n=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${n}`,this.isProcessingBatch=!0;let r=[];try{for(let i of e.batch)if(t.debug`add task for view ${i.view.id}`,this.queue.add(async()=>(n<=2&&await va(),await super.layout(i))).then(t=>{if(!t){e.onError?.(i,Error(`Layout queue returned null for view ${i.view.id}`));return}r.push(t),e.onSuccess?.(i,t)}).catch(n=>{t.error(`Fail layout view ${i.view.id}`,{err:n}),e.onError?.(i,n)}),await this.waitForQueueToShrink(n,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}}finally{let e=this.queue.pending+this.queue.size;e>0&&(t.trace`waiting ${e} tasks to finish`,await this.queue.onIdle()),t.debug`batch layout done`,this.isProcessingBatch=!1}return r}async waitForQueueToShrink(e=this.queue.concurrency,t=vc){this.queue.size>e+2&&(t.debug`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()}},bc=class{Aux;id;_literalId;hierarchyLevel;imported;constructor(e,t){this.$model=e,this.$element=t,this.id=this.$element.id,this._literalId=this.$element.id;let[n,r]=to(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=Ji(r)):(this.imported=null,this.hierarchyLevel=Ji(this.id))}get name(){return Wi(this.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$element.kind}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get tags(){return R(this,Symbol.for(`tags`),()=>Ce([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!fe(this.$element.summary,this.$element.description)}get summary(){return Lo.memoize(this,`summary`,La(this.$element))}get description(){return Lo.memoize(this,`description`,Ra(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return R(this,Symbol.for(`defaultView`),()=>ua(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$element.style}))}get projectId(){return this.imported?.from??this.$model.projectId}isAncestorOf(e){return I(this,e)}isDescendantOf(e){return I(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Xi(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?ra([...this.$model.descendants(this)],e)[Symbol.iterator]():this.$model.descendants(this)}siblings(){return this.$model.siblings(this)}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return R(this,Symbol.for(`views`),()=>{let e=new Set;for(let t of this.$model.views())t.includesElement(this.id)&&e.add(t);return e})}scopedViews(){return R(this,Symbol.for(`scopedViews`),()=>{let e=new Set;for(let t of this.$model.views())t.isScopedElementView()&&t.viewOf.id===this.id&&e.add(t);return e})}isDeployed(){return C(ua(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!b(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},xc=class{Aux;get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$node.style}))}get name(){return Wi(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return Lo.memoize(this,`summary`,La(this.$node))}get description(){return Lo.memoize(this,`description`,Ra(this.$node))}get technology(){return this.$node.technology??null}get links(){return this.$node.links??[]}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Xi(this.id,e.id);return t?this.$model.node(t):null}siblings(){return this.$model.siblings(this)}isSibling(e){return this.parent===e.parent}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>Ec.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>Ec.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!b(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},Sc=class extends xc{id;_literalId;title;hierarchyLevel;constructor(e,t){super(),this.$model=e,this.$node=t,this.id=t.id,this._literalId=t.id,this.title=t.title,this.hierarchyLevel=Ji(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get tags(){return R(this,Symbol.for(`tags`),()=>Ce([...this.$node.tags??[],...this.$model.$model.specification.deployments[this.kind]?.tags??[]]))}children(){return this.$model.children(this)}descendants(e=`desc`){return this.$model.descendants(this,e)}isDeploymentNode(){return!0}*instances(){for(let e of this.descendants(`desc`))e.isInstance()&&(yield e)}onlyOneInstance(){let e=this.children();if(e.size!==1)return null;let t=ua(e);return t?t.isInstance()?t:t.onlyOneInstance():null}_relationshipsFromInstances=null;relationshipsFromInstances(){if(this._relationshipsFromInstances)return this._relationshipsFromInstances;let{outgoing:e,incoming:t}=this._relationshipsFromInstances={outgoing:new Set,incoming:new Set};for(let n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return Sa(t,e)}},Cc=class extends xc{id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=Ji(t.id)}get $node(){return this.$instance}get parent(){return N(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.element.$element.style,...this.$instance.style}))}get tags(){return R(this,Symbol.for(`tags`),()=>Ce([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get summary(){return Lo.memoize(this,`summary`,La(this.$instance)??La(this.element.$element))}get description(){return Lo.memoize(this,`description`,Ra(this.$instance)??Ra(this.element.$element))}get technology(){return this.$instance.technology??this.element.technology??null}get links(){return this.$instance.links??this.element.links}isInstance(){return!0}outgoingModelRelationships(){return this.element.outgoing()}incomingModelRelationships(){return this.element.incoming()}*views(){for(let e of this.$model.views())if(e._type===`deployment`){if(e.includesDeployment(this.id)){yield e;continue}e.includesDeployment(this.parent.id)&&this.parent.onlyOneInstance()&&(yield e)}}},wc=class{constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return R(this,`style `,()=>({shape:this.element.shape,color:this.element.color,...this.element.$element.style}))}get shape(){return this.element.shape}get color(){return this.element.color}get title(){return this.element.title}get summary(){return this.element.summary}get description(){return this.element.description}get technology(){return this.element.technology}isDeploymentNode(){return!1}isInstance(){return!1}},Tc=class{boundary;source;target;constructor(e,t){this.$model=e,this.$relationship=t,this.source=e.deploymentRef(t.source),this.target=e.deploymentRef(t.target);let n=Xi(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return C(this.$relationship.title)?this.$relationship.title:null}get technology(){return te(this.$relationship.technology)?(this.kind&&this.$model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!fe(this.$relationship.summary,this.$relationship.description)}get summary(){return Lo.memoize(this,`summary`,La(this.$relationship))}get description(){return Lo.memoize(this,`description`,Ra(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get navigateTo(){return this.$relationship.navigateTo?this.$model.$model.view(this.$relationship.navigateTo):null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.$model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.$model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.$model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.$model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!0}isModelRelation(){return!1}hasMetadata(){return!!this.$relationship.metadata&&!b(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},Ec=class e{static empty(){return new e}static from(t,n){return new e(new Set(t),new Set(n))}constructor(e=new Set,t=new Set){this.model=e,this.deployment=t}get isEmpty(){return this.model.size===0&&this.deployment.size===0}get nonEmpty(){return this.model.size>0||this.deployment.size>0}get size(){return this.model.size+this.deployment.size}intersect(t){return e.from(Sa(this.model,t.model),Sa(this.deployment,t.deployment))}difference(t){return e.from(Ca(this.model,t.model),Ca(this.deployment,t.deployment))}union(t){return e.from(xa(this.model,t.model),xa(this.deployment,t.deployment))}};const G=e=>typeof e==`string`?e:e.id,Dc=e=>{if(P(!e.includes(`
20
- `),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return T(t,1)?t:[``]}return[e.trim()]},Oc=e=>Dc(e).join(`/`),kc=e=>{let t=Dc(e);return T(t,2)?t.slice(0,-1).join(`/`):null},Ac=e=>e.includes(`/`)?Dc(e).pop()??e:e.trim();var jc=class{#e=new Map;#t=new Map;#n=new vt.default(()=>new Set);#r=new vt.default(()=>new Set);#i=new Set;#a=new Map;#o=new vt.default(()=>new Set);#s=new vt.default(()=>new Set);#c=new vt.default(()=>new Set);#l=new vt.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=Ye(t.elements);for(let e of na(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of Ye(t.relations)){let t=this.addRelation(e);for(let e of t.tags)this.#l.get(e).add(t)}}get $styles(){return this.$model.$styles}get projectId(){return this.$model.projectId}get project(){return this.$model.project}get specification(){return this.$model.specification}element(e){if(e instanceof Sc||e instanceof Cc)return e;let t=G(e);return N(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return P(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(P(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return P(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(P(t.isInstance(),`Element ${t?.id} is not a deployed instance`),t):null}roots(){return this.#i.values()}elements(){return this.#e.values()}*nodes(){for(let e of this.#e.values())e.isDeploymentNode()&&(yield e)}*nodesOfKind(e){for(let t of this.#e.values())t.isDeploymentNode()&&t.kind===e&&(yield t)}*instances(){for(let e of this.#e.values())e.isInstance()&&(yield e)}*instancesOf(e){let t=G(e),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(B.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return ia(this.#u,`${t}@${n}`,()=>new wc(this.instance(t),this.$model.element(n)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=G(e);return N(this.#a.get(t),`DeploymentRelationModel ${t} not found`)}findRelationship(e){return this.#a.get(e)??null}*views(){for(let e of this.$model.views())e.isDeploymentView()&&(yield e)}parent(e){let t=G(e);return this.#t.get(t)||null}children(e){let t=G(e);return this.#n.get(t)}*siblings(e){let t=G(e),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=G(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=G(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=G(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=lo(e)?new Sc(this,Object.freeze(e)):new Cc(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let n=Ui(t.id);return n?(P(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(P(t.isDeploymentNode(),`Root element ${t.id} is not a deployment node`),this.#i.add(t)),t}addRelation(e){if(this.#a.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new Tc(this,Object.freeze(e));this.#a.set(t.id,t),this.#o.get(t.target.id).add(t),this.#s.get(t.source.id).add(t);let n=t.boundary?.id??null;if(n)for(let e of[n,...Zi(n)])this.#c.get(e).add(t);for(let e of Zi(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of Zi(t.target.id)){if(e===n)break;this.#o.get(e).add(t)}return t}},Mc=class{source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(B.flatten(t.source)),this.target=e.element(B.flatten(t.target));let n=Xi(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return te(this.$relationship.title)?null:this.$relationship.title}get technology(){return te(this.$relationship.technology)?(this.kind&&this.model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!fe(this.$relationship.summary,this.$relationship.description)}get summary(){return Lo.memoize(this,`summary`,La(this.$relationship))}get description(){return Lo.memoize(this,`description`,Ra(this.$relationship))}get navigateTo(){return this.$relationship.navigateTo?this.model.view(this.$relationship.navigateTo):null}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!1}isModelRelation(){return!0}hasMetadata(){return!!this.$relationship.metadata&&!b(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},Nc=class{Aux;$viewModel;$view;$edge;constructor(e,t,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return Lo.memoize(this,`description`,this.$edge.description)}get technology(){return this.$edge.technology??null}hasParent(){return this.$edge.parent!==null}get tags(){return this.$edge.tags??[]}get stepNumber(){return this.isStep()?io(this.id):null}get navigateTo(){return this.$edge.navigateTo?this.$viewModel.$model.view(this.$edge.navigateTo):null}get color(){return this.$edge.color}get line(){return this.$edge.line??this.$viewModel.$styles.defaults.relationship.line}get head(){return this.$edge.head??this.$viewModel.$styles.defaults.relationship.arrow}get tail(){return this.$edge.tail}isStep(){return ro(this.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},Pc=class{Aux;$viewModel;$view;$node;constructor(e,t){this.$viewModel=e,this.$view=e.$view,this.$node=t}get id(){return this.$node.id}get title(){return this.$node.title}get kind(){return this.$node.kind}get description(){return Lo.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return Lo.memoize(this,`notes`,this.$node.notes)}get parent(){return this.$node.parent?this.$viewModel.node(this.$node.parent):null}get element(){let e=this.$node.modelRef;return e?this.$viewModel.$model.element(e):null}get deployment(){let e=this.$node.deploymentRef;return e?this.$viewModel.$model.deployment.element(e):null}get shape(){return this.$node.shape}get color(){return this.$node.color}get icon(){return this.$node.icon??null}get tags(){return this.$node.tags}get links(){return this.$node.links??[]}get navigateTo(){return this.$node.navigateTo?this.$viewModel.$model.view(this.$node.navigateTo):null}get style(){return this.$node.style}get x(){return`x`in this.$node?this.$node.x:void 0}get y(){return`y`in this.$node?this.$node.y:void 0}get width(){return`width`in this.$node?this.$node.width:void 0}get height(){return`height`in this.$node?this.$node.height:void 0}children(){return R(this,`children`,()=>new Set(this.$node.children.map(e=>this.$viewModel.node(e))))}*ancestors(){let e=this.parent;for(;e;)yield e,e=e.parent}*siblings(){let e=this.parent?.children()??this.$viewModel.roots();for(let t of e)t.id!==this.id&&(yield t)}*incoming(e=`all`){for(let t of this.$node.inEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return C(this.$node.modelRef)}hasDeployment(){return C(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return Za(this.$node)}isTagged(e){return this.tags.includes(e)}},Fc=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new vt.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new Pc(this,Object.freeze(e));this.#n.set(e.id,t),e.parent||this.#t.add(t),e.deploymentRef&&this.#a.add(e.deploymentRef),e.modelRef&&this.#i.add(e.modelRef);for(let e of t.tags)this.#s.get(e).add(t)}for(let e of this.#e.edges){let t=new Nc(this,Object.freeze(e),this.node(e.source),this.node(e.target));for(let e of t.tags)this.#s.get(e).add(t);for(let t of e.relations)this.#o.add(t);this.#r.set(e.id,t)}this.title=n.title?Ac(n.title):null,this.viewPath=n.title?Oc(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[Wa]}get stage(){return this.#e[Ua]}get bounds(){if(`bounds`in this.#e)return this.#e.bounds;if(this.#c)return this.#c.bounds;throw Error(`View is not layouted`)}get titleOrId(){return this.title??this.viewOf?.title??this.id}get titleOrUntitled(){return this.title??`Untitled`}get breadcrumbs(){return R(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return Lo.memoize(this,`description`,this.#e.description)}get tags(){return this.#e.tags??[]}get links(){return this.#e.links??[]}get viewOf(){if(this.isElementView()){let e=this.#e.viewOf;return e?this.$model.element(e):null}return null}get mode(){return this.isDynamicView()?this.#e.variant??`diagram`:null}get includedTags(){return[...this.#s.keys()]}get $view(){if(!this.isLayouted()||`drifts`in this.#e)return this.#e;let e=this.#c;return e?R(this,`withDriftReasons`,()=>Qo(this.#e,e)):this.#e}get $layouted(){if(!this.isLayouted())throw Error(`View is not layouted`);return this.$manual??this.#e}get hasManualLayout(){return this.#c!==void 0}get hasLayoutDrifts(){if(!this.isLayouted())return!1;let e=this.$manual;return!!e?.drifts&&e.drifts.length>0}get $manual(){if(!this.isLayouted())return null;let e=this.#c;return e?R(this,`snapshotWithManualLayout`,()=>Yo(this.#e,e)):null}get projectId(){return this.$model.projectId}roots(){return this.#t.values()}*compounds(){for(let e of this.#n.values())e.hasChildren()&&(yield e)}node(e){let t=G(e);return N(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(G(e))??null}findNodeWithElement(e){let t=G(e);return this.#i.has(t)?sa(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=G(e);return N(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(G(e))??null}edges(){return this.#r.values()}*edgesWithRelation(e){for(let t of this.#r.values())t.includesRelation(e)&&(yield t)}*elements(){for(let e of this.#n.values())e.hasElement()&&(yield e)}isTagged(e){return this.tags.includes(e)}includesElement(e){return this.#i.has(G(e))}includesDeployment(e){return this.#a.has(G(e))}includesRelation(e){return this.#o.has(G(e))}isComputed(){return this.#e[Ua]===`computed`}isLayouted(){return this.#e[Ua]===`layouted`}isDiagram(){return this.#e[Ua]===`layouted`}isElementView(){return this.#e[Wa]===`element`}isScopedElementView(){return this.#e[Wa]===`element`&&C(this.#e.viewOf)}isDeploymentView(){return this.#e[Wa]===`deployment`}isDynamicView(){return this.#e[Wa]===`dynamic`}},Ic=class e{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Re(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return P(!this.isRoot,`Root view folder has no breadcrumbs`),R(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return P(!this.isRoot,`Root view folder has no parent`),te(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return R(this,`folders`,()=>{let t=[];for(let n of this.children)n instanceof e&&t.push(n);return t})}get views(){return R(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof Fc&&e.push(t);return e})}},Lc=class e{Aux;_elements=new Map;_parents=new Map;_children=new vt.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new vt.default(()=>new Set);_outgoing=new vt.default(()=>new Set);_internal=new vt.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new vt.default(()=>new Set);_allTags=new vt.default(()=>new Set);static fromParsed(t){return new e(t)}static create(t){return new e(t)}static fromDump(t){let{_stage:n=`layouted`,projectId:r=`unknown`,project:i,globals:a,imports:o,deployments:s,views:c,relations:l,elements:u,specification:d}=t;return new e({[Ua]:n,projectId:r,project:i,globals:{predicates:a?.predicates??{},dynamicPredicates:a?.dynamicPredicates??{},styles:a?.styles??{}},imports:o??{},deployments:{elements:s?.elements??{},relations:s?.relations??{}},views:c??{},relations:l??{},elements:u??{},specification:d})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of we(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of we(e.imports??{}))for(let e of na(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}for(let t of Ye(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new jc(this),Ha(e,`computed`)||Ha(e,`layouted`)){let t=Li(`/`),n=w(Ye(e.views),y(e=>({view:e,path:Oc(e.title??e.id),folderPath:e.title&&kc(e.title)||``})),Oe((e,n)=>t(e.folderPath,n.folderPath))),r=e=>{let t=this._viewFolders.get(e);if(!t){let r=ze(e,`/`);P(T(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new Ic(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=r(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||ze(e,`/`).reduce((e,t)=>{let n=e.join(`/`),i=r(b(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(i),e.push(t),e},[]);for(let{view:t,folderPath:i}of n){let n=new Fc(this,r(i),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(i).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new Ic(this,[``],void 0),this._viewFolders.set(this._rootViewFolder.path,this._rootViewFolder)}get asParsed(){return this}get asComputed(){return this}get asLayouted(){return this}get $styles(){return R(this,`styles`,()=>Bo.from(this.project.styles,this.specification.customColors))}isParsed(){return this.stage===`parsed`}isLayouted(){return this.stage===`layouted`}isComputed(){return this.stage===`computed`}get $model(){return this.$data}get stage(){return this.$data[Ua]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??R(this,Symbol.for(`project`),()=>({id:this.projectId,styles:{},manualLayouts:{}}))}get specification(){return this.$data.specification}get globals(){return R(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof bc)return e;let t=G(e);return N(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(G(e))??null}roots(){return this._rootElements.values()}elements(){return this._elements.values()}relationships(){return this._relations.values()}relationship(e,t){if(t===`deployment`)return this.deployment.relationship(e);let n=G(e),r=this._relations.get(n)??null;return r||t===`model`?N(r,`Model relation ${n} not found`):N(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(G(e))??null;return n||t===`model`?n:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=G(e);return N(this._views.get(t),`View ${t} not found`)}findView(e){return this._views.get(e)??null}findManualLayout(e){return`manualLayouts`in this.$data?this.$data.manualLayouts?.[e]??null:null}viewFolder(e){return N(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return P(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=G(e);return this._parents.get(t)||null}children(e){let t=G(e);return this._children.get(t)}*siblings(e){let t=G(e),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=G(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=G(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=G(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return R(this,`tags`,()=>Oe([...this._allTags.keys()],Ii))}get tagsSortedByUsage(){return R(this,`tagsSortedByUsage`,()=>w([...this._allTags.entries()],y(([e,t])=>({tag:e,count:t.size,tagged:t})),Oe((e,t)=>Ii(e.tag,t.tag)),et([x(`count`),`desc`])))}findByTag(e,t){return oa(this._allTags.get(e),e=>t===`elements`?e instanceof bc:t===`views`?e instanceof Fc:t===`relationships`?e instanceof Mc:!0)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=vo(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=vo(e);for(let e of this._relations.values())t(e)&&(yield e)}addElement(e){if(this._elements.has(e.id))throw Error(`Element ${e.id} already exists`);let t=new bc(this,Object.freeze(e));this._elements.set(t.id,t);let n=Ui(t.id);return n?(P(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){P(!eo(t.id),`Imported element already has global FQN`);let n=$a(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new bc(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=Ui(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=Ui(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new Mc(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=Xi(n.id,r.id);if(i)for(let e of[i,...Zi(i)])this._internal.get(e).add(t);for(let e of Zi(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of Zi(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=Lc.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(Lc||={});let Rc;(function(e){e.isInside=e=>t=>I(e,t.source.id)&&I(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||I(e,n.source.id))&&(n.target.id===t||I(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||I(e,t.target.id))&&!I(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||I(e,t.source.id))&&!I(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(Rc||={});const zc=Symbol.for(`nodejs.util.inspect.custom`);var Bc=class e{id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,this.id=Oa(`deployment:${e.id}:${t.id}`)}get expression(){return`${this.source.id} -> ${this.target.id}`}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target),this._boundary}nonEmpty(){return this.relations.nonEmpty}[zc](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){let e=[...this.relations.model].map(e=>` `+e.expression);e.length?e.unshift(` model:`):e.unshift(` model: []`);let t=[...this.relations.deployment].map(e=>` `+e.expression);return t.length?t.unshift(` deployment:`):t.unshift(` deployment: []`),[this.expression,...e,...t].join(`
21
- `)}hasDirectDeploymentRelation(){for(let e of this.relations.deployment)if(e.source.id===this.source.id||e.target.id===this.target.id)return!0;return!1}*values(){yield*this.relations.model,yield*this.relations.deployment}mergeWith(t){return Array.isArray(t)?t.reduce((e,t)=>e.mergeWith(t),this):(P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,this.relations.union(t.relations)))}difference(t){return new e(this.source,this.target,this.relations.difference(t.relations))}intersect(t){return new e(this.source,this.target,this.relations.intersect(t.relations))}equals(t){return P(t instanceof e,`Other should ne DeploymentConnectionModel`),this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&wa(this.relations.model,t.relations.model)&&wa(this.relations.deployment,t.relations.deployment)}update(t){return t&&={model:this.relations.model,deployment:this.relations.deployment,...t},new e(this.source,this.target,t?new Ec(t.model??new Set,t.deployment??new Set):this.relations)}};function Vc(e,t){if(!t){let t=e;return e=>Vc(e,t)}let n=e.source===t.source,r=e.target===t.target;if(n&&r)return!1;let i=I(t.source.id,e.source.id),a=I(t.target.id,e.target.id);return i&&a||n&&a||r&&i}function Hc(e,t){let n=t;for(let t of e)Vc(t,n)&&(n=t);return n===t?null:n}function Uc(e){return e.boundary?.id?`.${e.boundary.id}`:``}function Wc(e,t){if(!e||Bi(e)){let t=e??`asc`;return e=>Gc(e,t)}return Gc(e,t??`asc`)}function Gc(e,t){return w(e,y(e=>({id:Uc(e),conn:e})),ra(t),y(e=>e.conn))}function Kc(e,t){return e.filter(e=>Vc(t,e))}function qc(e,t){return e.filter(Vc(t))}function Jc(e){let t=new Map;for(let n of e){let e=t.get(n.id);e?t.set(n.id,n.mergeWith(e)):t.set(n.id,n)}return[...t.values()]}function Yc(e,t){let n=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let r=n.get(t.id);if(!r)return e.push(t),e;let i=t.difference(r);return i.nonEmpty()&&e.push(i),e},[])}function Xc(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function Zc(e,t){if(!t){let t=e;return e=>Zc(e,t)}let n=e;return qi(n.source,t)&&!qi(n.target,t)}function Qc(e,t){if(!t){let t=e;return e=>Qc(e,t)}let n=e;return qi(n.target,t)&&!qi(n.source,t)}function $c(e,t){if(!t){let t=e;return e=>$c(e,t)}let n=e;return qi(n.source,t)!==qi(n.target,t)}var el=class e{id;constructor(e,t,n=new Set){this.source=e,this.target=t,this.relations=n,this.id=Oa(`model:${e.id}:${t.id}`)}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target)}get expression(){return`${this.source.id} -> ${this.target.id}`}get isDirect(){return this.nonEmpty()&&!this.isImplicit}get isImplicit(){return this.nonEmpty()&&pa(this.relations,ue(Xc(this)))}get directRelations(){return new Set(oa(this.relations,Xc(this)))}nonEmpty(){return this.relations.size>0}mergeWith(t){return P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,xa(this.relations,t.relations))}difference(t){return new e(this.source,this.target,Ca(this.relations,t.relations))}intersect(t){return P(t instanceof e,`Cannot intersect connection with different type`),new e(this.source,this.target,Sa(this.relations,t.relations))}equals(t){P(t instanceof e,`Cannot merge connection with different type`);let n=t;return this.id===n.id&&this.source.id===n.source.id&&this.target.id===n.target.id&&wa(this.relations,n.relations)}update(t){return new e(this.source,this.target,t)}[zc](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
22
- `)}reversed(){return new e(this.target,this.source)}},tl=e({findConnection:()=>nl,findConnectionsBetween:()=>rl,findConnectionsWithin:()=>il});function nl(e,t,n=`directed`){if(e===t||Ki(e,t))return[];let r=e.allOutgoing.intersect(t.allIncoming),i=r.nonEmpty?[new Bc(e,t,r)]:[];return n===`directed`?i:[...i,...nl(t,e,`directed`)]}function rl(e,t,n=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of nl(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function il(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...rl(t,r.slice(n+1),`both`)),e),[])}var al=e({findConnection:()=>ol,findConnectionsBetween:()=>sl,findConnectionsWithin:()=>cl});function ol(e,t,n=`directed`){if(e===t||Ki(e,t))return[];let r=Sa(e.allOutgoing,t.allIncoming),i=r.size>0?new el(e,t,r):null;if(n===`directed`)return i?[i]:[];let a=Sa(e.allIncoming,t.allOutgoing),o=a.size>0?new el(t,e,a):null;return i&&o?[i,o]:i?[i]:o?[o]:[]}function sl(e,t,n=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of ol(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function cl(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...sl(t,r.slice(n+1),`both`)),e),[])}function ll(e){return e instanceof Sc}function ul(e){return e instanceof Cc}function dl(e){return ll(e)||ul(e)}function fl(e){return e instanceof wc}function pl(e){return e instanceof bc}var ml=t(an(),1);const hl=hs.getChild([`graphviz`,`binary`]);var gl=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,ci.availableParallelism()-2)}get dotpath(){return this._dotpath??R(this,`_dotpath`,()=>{let e=ml.default.sync(`dot`);return hl.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??R(this,`_unflattenpath`,()=>{let e=ml.default.sync(`unflatten`);return hl.debug`Found ${e}`,e})}async unflatten(e){let t,n=hl.getChild([`unflatten`,Be(4)]);try{let r=await rn(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=r.stdout,b(r.stderr)?n.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):n.warn(`{command} has stderr:
23
- `+r.stderr,{command:r.command})}catch(r){n.debug(`FAILED DOT`,{dot:e}),n.error(U(r)),r instanceof nn&&!b(r.stdout)&&(n.warn(`{command} returned result but failed with exitcode {exitCode}:
24
- {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),t=r.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=hl.getChild([`layoutJson`,Be(4)]),n;try{let r=await rn(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,b(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
25
- `+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(U(r)),r instanceof nn&&!b(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
26
- {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=hl.getChild([`svg`,Be(4)]),n;try{let r=await rn(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,b(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
27
- `+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(U(r)),r instanceof nn&&!b(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
28
- {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}};const K=hs.getChild(`server`);function q(e){K.warn(U(e))}function _l(e){let t=os();return n=>{try{switch(n.level){case`error`:case`fatal`:{let r=n.category.join(`.`);if(r===`likec4.config`)break;let i=rs(n);i?e.telemetry.logEvent({eventName:`error`,message:`${i.name}: ${i.message}`,category:r,...i.stack&&{stack:i.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(n),category:r});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function vl({lspConnection:e,enableTelemetry:t=!!e,useStdErr:n=!1,logLevel:r=di?`debug`:`warning`,nonBlocking:i=!1,colors:a=!1}={}){let o=!!e&&t&&!di;_s({reset:!0,sinks:{console:n?ms({formatter:cs()}):ps({formatter:a?ds():cs(),nonBlocking:i}),...o&&{telemetry:_l(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...o?[`telemetry`]:[]],lowestLevel:r}]}),K.trace(`logger configured`)}const yl=/^@[A-Za-z0-9_-]*$/,bl=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,xl=O.string().min(1,`Image alias key cannot be empty`).regex(yl,`Image alias key must match /^@\\w+$/`),Sl=O.string().min(1,`Image alias value cannot be empty`).regex(bl,`Image alias value must be a relative path (no leading slash or protocol)`),Cl=O.record(xl,Sl).meta({id:`ImageAliases`,description:`Map of image alias prefixes to relative paths (keys must match /^@\\w+$/; values must be relative paths without protocol or leading slash).`}),wl=O.string().min(1,`Include path cannot be empty`).regex(/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,`Include path must be a relative path (no leading slash, drive letter, or protocol)`),Tl=O.strictObject({paths:O.array(wl).meta({description:[`Additional relative directory paths to include LikeC4 source files from, searched recursively.`,`Paths are relative to the project folder (the folder containing this config file).`,`Example: ["../shared", "../common/specs"]`].join(`
18
+ `).filter(e=>!(e.includes(`margin`)&&e.includes(`${Us}`))).join(`
19
+ `),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=sc.getChild([`dot`,Ve(3)]);t.trace`generating dot for view ${e.view.id}`;let n=oc(e).print();if(!So(e.view))return n;try{return t.trace`unflattening dot`,await this.graphviz.unflatten(n)}catch(r){return t.warn(`Error during unflatten: ${e.view.id}`,{error:r}),n}}async layoutProjectsView(e){let t=sc.getChild([`layoutProjectsView`,Ve(3)]);t.debug`layouting projects overview...`;let n=new rc(e).print();try{n=await this.graphviz.unflatten(n)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let r=await this.dotToJson(n);return t.debug`layouting projects overview done`,nc(r,e)}};const lc=hs.getChild([`layouter-queue`]);var uc=class extends cc{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new en({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=lc.getChild([`run`,Ve(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await ba(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),lc.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,lc.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=lc.getChild([`batch`,Ve(3)]);if(this.isProcessingBatch)return t.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await ba(),e.cancelToken?.isCancellationRequested?(t.debug`cancellation requested`,[]):(t.debug`retry`,await this.batchLayout(e));let n=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${n}`,this.isProcessingBatch=!0;let r=[];try{for(let i of e.batch)if(t.debug`add task for view ${i.view.id}`,this.queue.add(async()=>(n<=2&&await ba(),await super.layout(i))).then(t=>{if(!t){e.onError?.(i,Error(`Layout queue returned null for view ${i.view.id}`));return}r.push(t),e.onSuccess?.(i,t)}).catch(n=>{t.error(`Fail layout view ${i.view.id}`,{err:n}),e.onError?.(i,n)}),await this.waitForQueueToShrink(n,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}}finally{let e=this.queue.pending+this.queue.size;e>0&&(t.trace`waiting ${e} tasks to finish`,await this.queue.onIdle()),t.debug`batch layout done`,this.isProcessingBatch=!1}return r}async waitForQueueToShrink(e=this.queue.concurrency,t=lc){this.queue.size>e+2&&(t.debug`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()}},dc=class{Aux;id;_literalId;hierarchyLevel;imported;constructor(e,t){this.$model=e,this.$element=t,this.id=this.$element.id,this._literalId=this.$element.id;let[n,r]=eo(this.id);n?(this.imported={from:n,fqn:r},this.hierarchyLevel=Xi(r)):(this.imported=null,this.hierarchyLevel=Xi(this.id))}get name(){return Ki(this.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$element.kind}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get tags(){return R(this,Symbol.for(`tags`),()=>we([...this.$element.tags??[],...this.$model.specification.elements[this.$element.kind]?.tags??[]]))}get metadata(){return this.$element.metadata??{}}get title(){return this.$element.title}get hasSummary(){return!!this.$element.summary&&!!this.$element.description&&!fe(this.$element.summary,this.$element.description)}get summary(){return Io.memoize(this,`summary`,za(this.$element))}get description(){return Io.memoize(this,`description`,Ba(this.$element))}get technology(){return this.$element.technology??null}get links(){return this.$element.links??[]}get defaultView(){return R(this,Symbol.for(`defaultView`),()=>fa(this.scopedViews())??null)}get isRoot(){return this.parent===null}get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$element.style}))}get projectId(){return this.imported?.from??this.$model.projectId}isAncestorOf(e){return I(this,e)}isDescendantOf(e){return I(e,this)}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Qi(this.id,e.id);return t?this.$model.element(t):null}children(){return this.$model.children(this)}descendants(e){return e?aa([...this.$model.descendants(this)],e)[Symbol.iterator]():this.$model.descendants(this)}siblings(){return this.$model.siblings(this)}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>new Set(this.outgoing()))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>new Set(this.incoming()))}views(){return R(this,Symbol.for(`views`),()=>{let e=new Set;for(let t of this.$model.views())t.includesElement(this.id)&&e.add(t);return e})}scopedViews(){return R(this,Symbol.for(`scopedViews`),()=>{let e=new Set;for(let t of this.$model.views())t.isScopedElementView()&&t.viewOf.id===this.id&&e.add(t);return e})}isDeployed(){return y(fa(this.deployments()))}deployments(){return this.$model.deployment.instancesOf(this)}hasMetadata(){return!!this.$element.metadata&&!_(this.$element.metadata)}getMetadata(e){return e?this.$element.metadata?.[e]:this.$element.metadata??{}}isTagged(e){return this.tags.includes(e)}},fc=class{Aux;get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.$node.style}))}get name(){return Ki(this.id)}get shape(){return this.style.shape}get color(){return this.style.color}get icon(){return this.style.icon??null}get summary(){return Io.memoize(this,`summary`,za(this.$node))}get description(){return Io.memoize(this,`description`,Ba(this.$node))}get technology(){return this.$node.technology??null}get links(){return this.$node.links??[]}ancestors(){return this.$model.ancestors(this)}commonAncestor(e){let t=Qi(this.id,e.id);return t?this.$model.node(t):null}siblings(){return this.$model.siblings(this)}isSibling(e){return this.parent===e.parent}*ascendingSiblings(){yield*this.siblings();for(let e of this.ancestors())yield*e.siblings()}*descendingSiblings(){for(let e of[...this.ancestors()].reverse())yield*e.siblings();yield*this.siblings()}incoming(e=`all`){return this.$model.incoming(this,e)}outgoing(e=`all`){return this.$model.outgoing(this,e)}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}*views(){for(let e of this.$model.views())e._type===`deployment`&&e.includesDeployment(this.id)&&(yield e)}isDeploymentNode(){return!1}isInstance(){return!1}get allOutgoing(){return R(this,Symbol.for(`allOutgoing`),()=>_c.from(new Set(this.outgoingModelRelationships()),new Set(this.outgoing())))}get allIncoming(){return R(this,Symbol.for(`allIncoming`),()=>_c.from(new Set(this.incomingModelRelationships()),new Set(this.incoming())))}hasMetadata(){return!!this.$node.metadata&&!_(this.$node.metadata)}getMetadata(e){return e?this.$node.metadata?.[e]:this.$node.metadata??{}}isTagged(e){return this.tags.includes(e)}},pc=class extends fc{id;_literalId;title;hierarchyLevel;constructor(e,t){super(),this.$model=e,this.$node=t,this.id=t.id,this._literalId=t.id,this.title=t.title,this.hierarchyLevel=Xi(t.id)}get parent(){return this.$model.parent(this)}get kind(){return this.$node.kind}get metadata(){return this.$node.metadata??{}}get tags(){return R(this,Symbol.for(`tags`),()=>we([...this.$node.tags??[],...this.$model.$model.specification.deployments[this.kind]?.tags??[]]))}children(){return this.$model.children(this)}descendants(e=`desc`){return this.$model.descendants(this,e)}isDeploymentNode(){return!0}*instances(){for(let e of this.descendants(`desc`))e.isInstance()&&(yield e)}onlyOneInstance(){let e=this.children();if(e.size!==1)return null;let t=fa(e);return t?t.isInstance()?t:t.onlyOneInstance():null}_relationshipsFromInstances=null;relationshipsFromInstances(){if(this._relationshipsFromInstances)return this._relationshipsFromInstances;let{outgoing:e,incoming:t}=this._relationshipsFromInstances={outgoing:new Set,incoming:new Set};for(let n of this.instances()){for(let t of n.element.outgoing())e.add(t);for(let e of n.element.incoming())t.add(e)}return this._relationshipsFromInstances}outgoingModelRelationships(){return this.relationshipsFromInstances().outgoing.values()}incomingModelRelationships(){return this.relationshipsFromInstances().incoming.values()}internalModelRelationships(){let{outgoing:e,incoming:t}=this.relationshipsFromInstances();return wa(t,e)}},mc=class extends fc{id;_literalId;title;hierarchyLevel;constructor(e,t,n){super(),this.$model=e,this.$instance=t,this.element=n,this.id=t.id,this._literalId=t.id,this.title=t.title??n.title,this.hierarchyLevel=Xi(t.id)}get $node(){return this.$instance}get parent(){return N(this.$model.parent(this),`Parent of ${this.id} not found`)}get style(){return R(this,`style`,()=>z({shape:this.$model.$styles.defaults.shape,color:this.$model.$styles.defaults.color,border:this.$model.$styles.defaults.border,opacity:this.$model.$styles.defaults.opacity,size:this.$model.$styles.defaults.size,padding:this.$model.$styles.defaults.padding,textSize:this.$model.$styles.defaults.text,iconPosition:this.$model.$styles.defaults.iconPosition,...this.element.$element.style,...this.$instance.style}))}get tags(){return R(this,Symbol.for(`tags`),()=>we([...this.$instance.tags??[],...this.element.tags]))}get kind(){return this.element.kind}get metadata(){return this.$instance.metadata??this.element.metadata??{}}get summary(){return Io.memoize(this,`summary`,za(this.$instance)??za(this.element.$element))}get description(){return Io.memoize(this,`description`,Ba(this.$instance)??Ba(this.element.$element))}get technology(){return this.$instance.technology??this.element.technology??null}get links(){return this.$instance.links??this.element.links}isInstance(){return!0}outgoingModelRelationships(){return this.element.outgoing()}incomingModelRelationships(){return this.element.incoming()}*views(){for(let e of this.$model.views())if(e._type===`deployment`){if(e.includesDeployment(this.id)){yield e;continue}e.includesDeployment(this.parent.id)&&this.parent.onlyOneInstance()&&(yield e)}}},hc=class{constructor(e,t){this.instance=e,this.element=t}get id(){return this.instance.id}get _literalId(){return this.instance.id}get style(){return R(this,`style `,()=>({shape:this.element.shape,color:this.element.color,...this.element.$element.style}))}get shape(){return this.element.shape}get color(){return this.element.color}get title(){return this.element.title}get summary(){return this.element.summary}get description(){return this.element.description}get technology(){return this.element.technology}isDeploymentNode(){return!1}isInstance(){return!1}},gc=class{boundary;source;target;constructor(e,t){this.$model=e,this.$relationship=t,this.source=e.deploymentRef(t.source),this.target=e.deploymentRef(t.target);let n=Qi(this.source.id,this.target.id);this.boundary=n?this.$model.node(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return y(this.$relationship.title)?this.$relationship.title:null}get technology(){return ve(this.$relationship.technology)?(this.kind&&this.$model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!fe(this.$relationship.summary,this.$relationship.description)}get summary(){return Io.memoize(this,`summary`,za(this.$relationship))}get description(){return Io.memoize(this,`description`,Ba(this.$relationship))}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get metadata(){return this.$relationship.metadata??{}}get navigateTo(){return this.$relationship.navigateTo?this.$model.$model.view(this.$relationship.navigateTo):null}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.$model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.$model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.$model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.$model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!0}isModelRelation(){return!1}hasMetadata(){return!!this.$relationship.metadata&&!_(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},_c=class e{static empty(){return new e}static from(t,n){return new e(new Set(t),new Set(n))}constructor(e=new Set,t=new Set){this.model=e,this.deployment=t}get isEmpty(){return this.model.size===0&&this.deployment.size===0}get nonEmpty(){return this.model.size>0||this.deployment.size>0}get size(){return this.model.size+this.deployment.size}intersect(t){return e.from(wa(this.model,t.model),wa(this.deployment,t.deployment))}difference(t){return e.from(Ta(this.model,t.model),Ta(this.deployment,t.deployment))}union(t){return e.from(Ca(this.model,t.model),Ca(this.deployment,t.deployment))}};const G=e=>typeof e==`string`?e:e.id,vc=e=>{if(P(!e.includes(`
20
+ `),`View title cannot contain newlines`),e.includes(`/`)){let t=e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0);return C(t,1)?t:[``]}return[e.trim()]},yc=e=>vc(e).join(`/`),bc=e=>{let t=vc(e);return C(t,2)?t.slice(0,-1).join(`/`):null},xc=e=>e.includes(`/`)?vc(e).pop()??e:e.trim();var Sc=class{#e=new Map;#t=new Map;#n=new E.default(()=>new Set);#r=new E.default(()=>new Set);#i=new Set;#a=new Map;#o=new E.default(()=>new Set);#s=new E.default(()=>new Set);#c=new E.default(()=>new Set);#l=new E.default(()=>new Set);#u=new Map;$deployments;constructor(e){this.$model=e;let t=this.$deployments=e.$data.deployments,n=Xe(t.elements);for(let e of ia(n)){let t=this.addElement(e);for(let e of t.tags)this.#l.get(e).add(t);t.isInstance()&&this.#r.get(t.element.id).add(t)}for(let e of Xe(t.relations)){let t=this.addRelation(e);for(let e of t.tags)this.#l.get(e).add(t)}}get $styles(){return this.$model.$styles}get projectId(){return this.$model.projectId}get project(){return this.$model.project}get specification(){return this.$model.specification}element(e){if(e instanceof pc||e instanceof mc)return e;let t=G(e);return N(this.#e.get(t),`Element ${t} not found`)}findElement(e){return this.#e.get(e)??null}node(e){let t=this.element(e);return P(t.isDeploymentNode(),`Element ${t.id} is not a deployment node`),t}findNode(e){let t=this.findElement(e);return t?(P(t.isDeploymentNode(),`Element ${t?.id} is not a deployment node`),t):null}instance(e){let t=this.element(e);return P(t.isInstance(),`Element ${t.id} is not a deployed instance`),t}findInstance(e){let t=this.findElement(e);return t?(P(t.isInstance(),`Element ${t?.id} is not a deployed instance`),t):null}roots(){return this.#i.values()}elements(){return this.#e.values()}*nodes(){for(let e of this.#e.values())e.isDeploymentNode()&&(yield e)}*nodesOfKind(e){for(let t of this.#e.values())t.isDeploymentNode()&&t.kind===e&&(yield t)}*instances(){for(let e of this.#e.values())e.isInstance()&&(yield e)}*instancesOf(e){let t=G(e),n=this.#r.get(t);n&&(yield*n)}deploymentRef(e){if(B.isInsideInstanceRef(e)){let{deployment:t,element:n}=e;return oa(this.#u,`${t}@${n}`,()=>new hc(this.instance(t),this.$model.element(n)))}return this.element(e.deployment)}relationships(){return this.#a.values()}relationship(e){let t=G(e);return N(this.#a.get(t),`DeploymentRelationModel ${t} not found`)}findRelationship(e){return this.#a.get(e)??null}*views(){for(let e of this.$model.views())e.isDeploymentView()&&(yield e)}parent(e){let t=G(e);return this.#t.get(t)||null}children(e){let t=G(e);return this.#n.get(t)}*siblings(e){let t=G(e),n=this.parent(e)?.children()??this.roots();for(let e of n)e.id!==t&&(yield e)}*ancestors(e){let t=G(e),n;for(;n=this.#t.get(t);)yield n,t=n.id}*descendants(e,t=`desc`){for(let n of this.children(e))t===`asc`?(yield n,yield*this.descendants(n.id)):(yield*this.descendants(n.id),yield n)}*incoming(e,t=`all`){let n=G(e);for(let e of this.#o.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=G(e);for(let e of this.#s.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}addElement(e){if(this.#e.has(e.id))throw Error(`Element ${e.id} already exists`);let t=co(e)?new pc(this,Object.freeze(e)):new mc(this,Object.freeze(e),this.$model.element(e.element));this.#e.set(t.id,t);let n=Gi(t.id);return n?(P(this.#e.has(n),`Parent ${n} of ${t.id} not found`),this.#t.set(t.id,this.node(n)),this.#n.get(n).add(t)):(P(t.isDeploymentNode(),`Root element ${t.id} is not a deployment node`),this.#i.add(t)),t}addRelation(e){if(this.#a.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new gc(this,Object.freeze(e));this.#a.set(t.id,t),this.#o.get(t.target.id).add(t),this.#s.get(t.source.id).add(t);let n=t.boundary?.id??null;if(n)for(let e of[n,...$i(n)])this.#c.get(e).add(t);for(let e of $i(t.source.id)){if(e===n)break;this.#s.get(e).add(t)}for(let e of $i(t.target.id)){if(e===n)break;this.#o.get(e).add(t)}return t}},Cc=class{source;target;boundary;constructor(e,t){this.model=e,this.$relationship=t,this.source=e.element(B.flatten(t.source)),this.target=e.element(B.flatten(t.target));let n=Qi(this.source.id,this.target.id);this.boundary=n?this.model.element(n):null}get id(){return this.$relationship.id}get expression(){return`${this.source.id} -> ${this.target.id}`}get title(){return ve(this.$relationship.title)?null:this.$relationship.title}get technology(){return ve(this.$relationship.technology)?(this.kind&&this.model.specification.relationships[this.kind])?.technology??null:this.$relationship.technology}get hasSummary(){return!!this.$relationship.summary&&!!this.$relationship.description&&!fe(this.$relationship.summary,this.$relationship.description)}get summary(){return Io.memoize(this,`summary`,za(this.$relationship))}get description(){return Io.memoize(this,`description`,Ba(this.$relationship))}get navigateTo(){return this.$relationship.navigateTo?this.model.view(this.$relationship.navigateTo):null}get tags(){return this.$relationship.tags??[]}get kind(){return this.$relationship.kind??null}get metadata(){return this.$relationship.metadata??{}}get links(){return this.$relationship.links??[]}get color(){return this.$relationship.color??this.model.$styles.defaults.relationship.color}get line(){return this.$relationship.line??this.model.$styles.defaults.relationship.line}get head(){return this.$relationship.head??this.model.$styles.defaults.relationship.arrow}get tail(){return this.$relationship.tail}*views(){for(let e of this.model.views())e.includesRelation(this.id)&&(yield e)}isDeploymentRelation(){return!1}isModelRelation(){return!0}hasMetadata(){return!!this.$relationship.metadata&&!_(this.$relationship.metadata)}getMetadata(e){return e?this.$relationship.metadata?.[e]:this.$relationship.metadata??{}}isTagged(e){return this.tags.includes(e)}},wc=class{Aux;$viewModel;$view;$edge;constructor(e,t,n,r){this.source=n,this.target=r,this.$viewModel=e,this.$view=e.$view,this.$edge=t}get id(){return this.$edge.id}get parent(){return this.$edge.parent?this.$viewModel.node(this.$edge.parent):null}get label(){return this.$edge.label??null}get description(){return Io.memoize(this,`description`,this.$edge.description)}get technology(){return this.$edge.technology??null}hasParent(){return this.$edge.parent!==null}get tags(){return this.$edge.tags??[]}get stepNumber(){return this.isStep()?ro(this.id):null}get navigateTo(){return this.$edge.navigateTo?this.$viewModel.$model.view(this.$edge.navigateTo):null}get color(){return this.$edge.color}get line(){return this.$edge.line??this.$viewModel.$styles.defaults.relationship.line}get head(){return this.$edge.head??this.$viewModel.$styles.defaults.relationship.arrow}get tail(){return this.$edge.tail}isStep(){return no(this.id)}*relationships(e){for(let t of this.$edge.relations)if(e){let n=this.$viewModel.$model.findRelationship(t,e);n&&(yield n)}else yield this.$viewModel.$model.relationship(t)}includesRelation(e){let t=typeof e==`string`?e:e.id;return this.$edge.relations.includes(t)}isTagged(e){return this.tags.includes(e)}},Tc=class{Aux;$viewModel;$view;$node;constructor(e,t){this.$viewModel=e,this.$view=e.$view,this.$node=t}get id(){return this.$node.id}get title(){return this.$node.title}get kind(){return this.$node.kind}get description(){return Io.memoize(this,`description`,this.$node.description)}get technology(){return this.$node.technology??null}get notes(){return Io.memoize(this,`notes`,this.$node.notes)}get parent(){return this.$node.parent?this.$viewModel.node(this.$node.parent):null}get element(){let e=this.$node.modelRef;return e?this.$viewModel.$model.element(e):null}get deployment(){let e=this.$node.deploymentRef;return e?this.$viewModel.$model.deployment.element(e):null}get shape(){return this.$node.shape}get color(){return this.$node.color}get icon(){return this.$node.icon??null}get tags(){return this.$node.tags}get links(){return this.$node.links??[]}get navigateTo(){return this.$node.navigateTo?this.$viewModel.$model.view(this.$node.navigateTo):null}get style(){return this.$node.style}get x(){return`x`in this.$node?this.$node.x:void 0}get y(){return`y`in this.$node?this.$node.y:void 0}get width(){return`width`in this.$node?this.$node.width:void 0}get height(){return`height`in this.$node?this.$node.height:void 0}children(){return R(this,`children`,()=>new Set(this.$node.children.map(e=>this.$viewModel.node(e))))}*ancestors(){let e=this.parent;for(;e;)yield e,e=e.parent}*siblings(){let e=this.parent?.children()??this.$viewModel.roots();for(let t of e)t.id!==this.id&&(yield t)}*incoming(e=`all`){for(let t of this.$node.inEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.target.id===this.id:case e===`to-descendants`&&n.target.id!==this.id:yield n;break}}}*incomers(e=`all`){let t=new Set;for(let n of this.incoming(e))t.has(n.source.id)||(t.add(n.source.id),yield n.source)}*outgoing(e=`all`){for(let t of this.$node.outEdges){let n=this.$viewModel.edge(t);switch(!0){case e===`all`:case e===`direct`&&n.source.id===this.id:case e===`from-descendants`&&n.source.id!==this.id:yield n;break}}}*outgoers(e=`all`){let t=new Set;for(let n of this.outgoing(e))t.has(n.target.id)||(t.add(n.target.id),yield n.target)}isLayouted(){return`width`in this.$node&&`height`in this.$node}hasChildren(){return this.$node.children.length>0}hasParent(){return this.$node.parent!==null}hasElement(){return y(this.$node.modelRef)}hasDeployment(){return y(this.$node.deploymentRef)}hasDeployedInstance(){return this.hasElement()&&this.hasDeployment()}isGroup(){return Xa(this.$node)}isTagged(e){return this.tags.includes(e)}},Ec=class{Aux;#e;#t=new Set;#n=new Map;#r=new Map;#i=new Set;#a=new Set;#o=new Set;#s=new E.default(e=>new Set);#c;id;$model;title;folder;viewPath;constructor(e,t,n,r){this.$model=e,this.#e=n,this.id=n.id,this.folder=t,this.#c=r;for(let e of this.#e.nodes){let t=new Tc(this,Object.freeze(e));this.#n.set(e.id,t),e.parent||this.#t.add(t),e.deploymentRef&&this.#a.add(e.deploymentRef),e.modelRef&&this.#i.add(e.modelRef);for(let e of t.tags)this.#s.get(e).add(t)}for(let e of this.#e.edges){let t=new wc(this,Object.freeze(e),this.node(e.source),this.node(e.target));for(let e of t.tags)this.#s.get(e).add(t);for(let t of e.relations)this.#o.add(t);this.#r.set(e.id,t)}this.title=n.title?xc(n.title):null,this.viewPath=n.title?yc(n.title):n.id}get $styles(){return this.$model.$styles}get _type(){return this.#e[Ua]}get stage(){return this.#e[Ha]}get bounds(){if(`bounds`in this.#e)return this.#e.bounds;if(this.#c)return this.#c.bounds;throw Error(`View is not layouted`)}get titleOrId(){return this.title??this.viewOf?.title??this.id}get titleOrUntitled(){return this.title??`Untitled`}get breadcrumbs(){return R(this,`breadcrumbs`,()=>this.folder.isRoot?[this]:[...this.folder.breadcrumbs,this])}get description(){return Io.memoize(this,`description`,this.#e.description)}get tags(){return this.#e.tags??[]}get links(){return this.#e.links??[]}get viewOf(){if(this.isElementView()){let e=this.#e.viewOf;return e?this.$model.element(e):null}return null}get mode(){return this.isDynamicView()?this.#e.variant??`diagram`:null}get includedTags(){return[...this.#s.keys()]}get $view(){if(!this.isLayouted()||`drifts`in this.#e)return this.#e;let e=this.#c;return e?R(this,`withDriftReasons`,()=>Qo(this.#e,e)):this.#e}get $layouted(){if(!this.isLayouted())throw Error(`View is not layouted`);return this.$manual??this.#e}get hasManualLayout(){return this.#c!==void 0}get hasLayoutDrifts(){if(!this.isLayouted())return!1;let e=this.$manual;return!!e?.drifts&&e.drifts.length>0}get $manual(){if(!this.isLayouted())return null;let e=this.#c;return e?R(this,`snapshotWithManualLayout`,()=>Yo(this.#e,e)):null}get projectId(){return this.$model.projectId}roots(){return this.#t.values()}*compounds(){for(let e of this.#n.values())e.hasChildren()&&(yield e)}node(e){let t=G(e);return N(this.#n.get(t),`Node ${t} not found in view ${this.#e.id}`)}findNode(e){return this.#n.get(G(e))??null}findNodeWithElement(e){let t=G(e);return this.#i.has(t)?la(this.#n.values(),e=>e.hasElement()&&e.element.id===t)??null:null}nodes(){return this.#n.values()}edge(e){let t=G(e);return N(this.#r.get(t),`Edge ${t} not found in view ${this.#e.id}`)}findEdge(e){return this.#r.get(G(e))??null}edges(){return this.#r.values()}*edgesWithRelation(e){for(let t of this.#r.values())t.includesRelation(e)&&(yield t)}*elements(){for(let e of this.#n.values())e.hasElement()&&(yield e)}isTagged(e){return this.tags.includes(e)}includesElement(e){return this.#i.has(G(e))}includesDeployment(e){return this.#a.has(G(e))}includesRelation(e){return this.#o.has(G(e))}isComputed(){return this.#e[Ha]===`computed`}isLayouted(){return this.#e[Ha]===`layouted`}isDiagram(){return this.#e[Ha]===`layouted`}isElementView(){return this.#e[Ua]===`element`}isScopedElementView(){return this.#e[Ua]===`element`&&y(this.#e.viewOf)}isDeploymentView(){return this.#e[Ua]===`deployment`}isDynamicView(){return this.#e[Ua]===`dynamic`}},Dc=class e{$model;path;title;isRoot;parentPath;defaultViewId;constructor(e,t,n){this.$model=e,this.path=t.join(`/`),this.isRoot=this.path===``,this.title=Re(t),this.isRoot?this.parentPath=void 0:this.parentPath=t.slice(0,-1).join(`/`),this.defaultViewId=n}get defaultView(){return this.defaultViewId?this.$model.view(this.defaultViewId):null}get breadcrumbs(){return P(!this.isRoot,`Root view folder has no breadcrumbs`),R(this,`breadcrumbs`,()=>{let e=this.parent;return e?e.isRoot?[e,this]:[...e.breadcrumbs,this]:[this]})}get parent(){return P(!this.isRoot,`Root view folder has no parent`),ve(this.parentPath)?null:this.$model.viewFolder(this.parentPath)}get children(){return this.$model.viewFolderItems(this.path)}get folders(){return R(this,`folders`,()=>{let t=[];for(let n of this.children)n instanceof e&&t.push(n);return t})}get views(){return R(this,`views`,()=>{let e=[];for(let t of this.children)t instanceof Ec&&e.push(t);return e})}},Oc=class e{Aux;_elements=new Map;_parents=new Map;_children=new E.default(()=>new Set);_rootElements=new Set;_relations=new Map;_incoming=new E.default(()=>new Set);_outgoing=new E.default(()=>new Set);_internal=new E.default(()=>new Set);_views=new Map;_rootViewFolder;_viewFolders=new Map;_viewFolderItems=new E.default(()=>new Set);_allTags=new E.default(()=>new Set);static fromParsed(t){return new e(t)}static create(t){return new e(t)}static fromDump(t){let{_stage:n=`layouted`,projectId:r=`unknown`,project:i,globals:a,imports:o,deployments:s,views:c,relations:l,elements:u,specification:d}=t;return new e({[Ha]:n,projectId:r,project:i,globals:{predicates:a?.predicates??{},dynamicPredicates:a?.dynamicPredicates??{},styles:a?.styles??{}},imports:o??{},deployments:{elements:s?.elements??{},relations:s?.relations??{}},views:c??{},relations:l??{},elements:u??{},specification:d})}deployment;$data;constructor(e){this.$data=e;for(let[,t]of Ke(e.elements)){let e=this.addElement(t);for(let t of e.tags)this._allTags.get(t).add(e)}for(let[t,n]of Ke(e.imports??{}))for(let e of ia(n)){let n=this.addImportedElement(t,e);for(let e of n.tags)this._allTags.get(e).add(n)}for(let t of Xe(e.relations)){let e=this.addRelation(t);for(let t of e.tags)this._allTags.get(t).add(e)}if(this.deployment=new Sc(this),Va(e,`computed`)||Va(e,`layouted`)){let t=zi(`/`),n=T(Xe(e.views),b(e=>({view:e,path:yc(e.title??e.id),folderPath:e.title&&bc(e.title)||``})),De((e,n)=>t(e.folderPath,n.folderPath))),r=e=>{let t=this._viewFolders.get(e);if(!t){let r=ze(e,`/`);P(C(r,1),`View group path "${e}" must have at least one element`);let i;i=e===``?n.find(e=>e.view.id===`index`):n.find(t=>t.path===e),t=new Dc(this,r,i?.view.id),this._viewFolders.set(e,t)}return t};this._rootViewFolder=r(``);for(let{folderPath:e}of n)this._viewFolders.has(e)||ze(e,`/`).reduce((e,t)=>{let n=e.join(`/`),i=r(_(n)?t:n+`/`+t);return this._viewFolderItems.get(n).add(i),e.push(t),e},[]);for(let{view:t,folderPath:i}of n){let n=new Ec(this,r(i),t,e.manualLayouts?.[t.id]);this._viewFolderItems.get(i).add(n),this._views.set(t.id,n);for(let e of n.tags)this._allTags.get(e).add(n)}}else this._rootViewFolder=new Dc(this,[``],void 0),this._viewFolders.set(this._rootViewFolder.path,this._rootViewFolder)}get asParsed(){return this}get asComputed(){return this}get asLayouted(){return this}get $styles(){return R(this,`styles`,()=>zo.from(this.project.styles,this.specification.customColors))}isParsed(){return this.stage===`parsed`}isLayouted(){return this.stage===`layouted`}isComputed(){return this.stage===`computed`}get $model(){return this.$data}get stage(){return this.$data[Ha]}get projectId(){return this.$data.projectId??`default`}get project(){return this.$data.project??R(this,Symbol.for(`project`),()=>({id:this.projectId,styles:{},manualLayouts:{}}))}get specification(){return this.$data.specification}get globals(){return R(this,Symbol.for(`globals`),()=>({predicates:{...this.$data.globals?.predicates},dynamicPredicates:{...this.$data.globals?.dynamicPredicates},styles:{...this.$data.globals?.styles}}))}element(e){if(e instanceof dc)return e;let t=G(e);return N(this._elements.get(t),`Element ${t} not found`)}findElement(e){return this._elements.get(G(e))??null}roots(){return this._rootElements.values()}elements(){return this._elements.values()}relationships(){return this._relations.values()}relationship(e,t){if(t===`deployment`)return this.deployment.relationship(e);let n=G(e),r=this._relations.get(n)??null;return r||t===`model`?N(r,`Model relation ${n} not found`):N(this.deployment.findRelationship(n),`No model/deployment relation ${n} not found`)}findRelationship(e,t){if(t===`deployment`)return this.deployment.findRelationship(e);let n=this._relations.get(G(e))??null;return n||t===`model`?n:this.deployment.findRelationship(e)}views(){return this._views.values()}view(e){let t=G(e);return N(this._views.get(t),`View ${t} not found`)}findView(e){return this._views.get(e)??null}findManualLayout(e){return`manualLayouts`in this.$data?this.$data.manualLayouts?.[e]??null:null}viewFolder(e){return N(this._viewFolders.get(e),`View folder ${e} not found`)}get rootViewFolder(){return this._rootViewFolder}get hasViewFolders(){return this._viewFolders.size>1}viewFolderItems(e){return P(this._viewFolders.has(e),`View folder ${e} not found`),this._viewFolderItems.get(e)}parent(e){let t=G(e);return this._parents.get(t)||null}children(e){let t=G(e);return this._children.get(t)}*siblings(e){let t=G(e),n=this._parents.get(t),r=n?this._children.get(n.id).values():this.roots();for(let e of r)e.id!==t&&(yield e)}*ancestors(e){let t=G(e),n;for(;n=this._parents.get(t);)yield n,t=n.id}*descendants(e){for(let t of this.children(e))yield t,yield*this.descendants(t.id)}*incoming(e,t=`all`){let n=G(e);for(let e of this._incoming.get(n))switch(!0){case t===`all`:case t===`direct`&&e.target.id===n:case t===`to-descendants`&&e.target.id!==n:yield e;break}}*outgoing(e,t=`all`){let n=G(e);for(let e of this._outgoing.get(n))switch(!0){case t===`all`:case t===`direct`&&e.source.id===n:case t===`from-descendants`&&e.source.id!==n:yield e;break}}get tags(){return R(this,`tags`,()=>De([...this._allTags.keys()],Ri))}get tagsSortedByUsage(){return R(this,`tagsSortedByUsage`,()=>T([...this._allTags.entries()],b(([e,t])=>({tag:e,count:t.size,tagged:t})),De((e,t)=>Ri(e.tag,t.tag)),nt([x(`count`),`desc`])))}findByTag(e,t){return ca(this._allTags.get(e),e=>t===`elements`?e instanceof dc:t===`views`?e instanceof Ec:t===`relationships`?e instanceof Cc:!0)}*elementsOfKind(e){for(let t of this._elements.values())t.kind===e&&(yield t)}*elementsWhere(e){let t=vo(e);for(let e of this._elements.values())t(e)&&(yield e)}*relationshipsWhere(e){let t=vo(e);for(let e of this._relations.values())t(e)&&(yield e)}addElement(e){if(this._elements.has(e.id))throw Error(`Element ${e.id} already exists`);let t=new dc(this,Object.freeze(e));this._elements.set(t.id,t);let n=Gi(t.id);return n?(P(this._elements.has(n),`Parent ${n} of ${t.id} not found`),this._parents.set(t.id,this.element(n)),this._children.get(n).add(t)):this._rootElements.add(t),t}addImportedElement(e,t){P(!$a(t.id),`Imported element already has global FQN`);let n=Qa(e,t.id);if(this._elements.has(n))throw Error(`Element ${n} already exists`);let r=new dc(this,Object.freeze({...t,id:n}));this._elements.set(r.id,r);let i=Gi(r.id);for(;i;){if(i.includes(`.`)&&this._elements.has(i))return this._parents.set(r.id,this.element(i)),this._children.get(i).add(r),r;i=Gi(i)}return this._rootElements.add(r),r}addRelation(e){if(this._relations.has(e.id))throw Error(`Relation ${e.id} already exists`);let t=new Cc(this,Object.freeze(e)),{source:n,target:r}=t;this._relations.set(t.id,t),this._incoming.get(r.id).add(t),this._outgoing.get(n.id).add(t);let i=Qi(n.id,r.id);if(i)for(let e of[i,...$i(i)])this._internal.get(e).add(t);for(let e of $i(n.id)){if(e===i)break;this._outgoing.get(e).add(t)}for(let e of $i(r.id)){if(e===i)break;this._incoming.get(e).add(t)}return t}};(function(e){e.EMPTY=Oc.create({_stage:`computed`,projectId:`default`,project:{id:`default`},specification:{elements:{},relationships:{},deployments:{},tags:{}},globals:{predicates:{},dynamicPredicates:{},styles:{}},deployments:{elements:{},relations:{}},elements:{},relations:{},views:{},imports:{}})})(Oc||={});let kc;(function(e){e.isInside=e=>t=>I(e,t.source.id)&&I(e,t.target.id);let t=e.isDirectedBetween=(e,t)=>n=>(n.source.id===e||I(e,n.source.id))&&(n.target.id===t||I(t,n.target.id));e.isAnyBetween=(e,n)=>{let r=t(e,n),i=t(n,e);return e=>r(e)||i(e)};let n=e.isIncoming=e=>t=>(t.target.id===e||I(e,t.target.id))&&!I(e,t.source.id),r=e.isOutgoing=e=>t=>(t.source.id===e||I(e,t.source.id))&&!I(e,t.target.id);e.isAnyInOut=e=>{let t=n(e),i=r(e);return e=>t(e)||i(e)}})(kc||={});const Ac=Symbol.for(`nodejs.util.inspect.custom`);var jc=class e{id;constructor(e,t,n){this.source=e,this.target=t,this.relations=n,this.id=Aa(`deployment:${e.id}:${t.id}`)}get expression(){return`${this.source.id} -> ${this.target.id}`}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target),this._boundary}nonEmpty(){return this.relations.nonEmpty}[Ac](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){let e=[...this.relations.model].map(e=>` `+e.expression);e.length?e.unshift(` model:`):e.unshift(` model: []`);let t=[...this.relations.deployment].map(e=>` `+e.expression);return t.length?t.unshift(` deployment:`):t.unshift(` deployment: []`),[this.expression,...e,...t].join(`
21
+ `)}hasDirectDeploymentRelation(){for(let e of this.relations.deployment)if(e.source.id===this.source.id||e.target.id===this.target.id)return!0;return!1}*values(){yield*this.relations.model,yield*this.relations.deployment}mergeWith(t){return Array.isArray(t)?t.reduce((e,t)=>e.mergeWith(t),this):(P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,this.relations.union(t.relations)))}difference(t){return new e(this.source,this.target,this.relations.difference(t.relations))}intersect(t){return new e(this.source,this.target,this.relations.intersect(t.relations))}equals(t){return P(t instanceof e,`Other should ne DeploymentConnectionModel`),this.id===t.id&&this.source.id===t.source.id&&this.target.id===t.target.id&&Ea(this.relations.model,t.relations.model)&&Ea(this.relations.deployment,t.relations.deployment)}update(t){return t&&={model:this.relations.model,deployment:this.relations.deployment,...t},new e(this.source,this.target,t?new _c(t.model??new Set,t.deployment??new Set):this.relations)}};function Mc(e,t){if(!t){let t=e;return e=>Mc(e,t)}let n=e.source===t.source,r=e.target===t.target;if(n&&r)return!1;let i=I(t.source.id,e.source.id),a=I(t.target.id,e.target.id);return i&&a||n&&a||r&&i}function Nc(e,t){let n=t;for(let t of e)Mc(t,n)&&(n=t);return n===t?null:n}function Pc(e){return e.boundary?.id?`.${e.boundary.id}`:``}function Fc(e,t){if(!e||Hi(e)){let t=e??`asc`;return e=>Ic(e,t)}return Ic(e,t??`asc`)}function Ic(e,t){return T(e,b(e=>({id:Pc(e),conn:e})),aa(t),b(e=>e.conn))}function Lc(e,t){return e.filter(e=>Mc(t,e))}function Rc(e,t){return e.filter(Mc(t))}function zc(e){let t=new Map;for(let n of e){let e=t.get(n.id);e?t.set(n.id,n.mergeWith(e)):t.set(n.id,n)}return[...t.values()]}function Bc(e,t){let n=new Map([...t].map(e=>[e.id,e]));return[...e].reduce((e,t)=>{let r=n.get(t.id);if(!r)return e.push(t),e;let i=t.difference(r);return i.nonEmpty()&&e.push(i),e},[])}function Vc(e,t){return t?e.source===t.source&&e.target===t.target:t=>e.source===t.source&&e.target===t.target}function Hc(e,t){if(!t){let t=e;return e=>Hc(e,t)}let n=e;return Yi(n.source,t)&&!Yi(n.target,t)}function Uc(e,t){if(!t){let t=e;return e=>Uc(e,t)}let n=e;return Yi(n.target,t)&&!Yi(n.source,t)}function Wc(e,t){if(!t){let t=e;return e=>Wc(e,t)}let n=e;return Yi(n.source,t)!==Yi(n.target,t)}var Gc=class e{id;constructor(e,t,n=new Set){this.source=e,this.target=t,this.relations=n,this.id=Aa(`model:${e.id}:${t.id}`)}_boundary;get boundary(){return this._boundary??=this.source.commonAncestor(this.target)}get expression(){return`${this.source.id} -> ${this.target.id}`}get isDirect(){return this.nonEmpty()&&!this.isImplicit}get isImplicit(){return this.nonEmpty()&&ha(this.relations,me(Vc(this)))}get directRelations(){return new Set(ca(this.relations,Vc(this)))}nonEmpty(){return this.relations.size>0}mergeWith(t){return P(this.source.id===t.source.id,`Cannot merge connections with different sources`),P(this.target.id===t.target.id,`Cannot merge connections with different targets`),new e(this.source,this.target,Ca(this.relations,t.relations))}difference(t){return new e(this.source,this.target,Ta(this.relations,t.relations))}intersect(t){return P(t instanceof e,`Cannot intersect connection with different type`),new e(this.source,this.target,wa(this.relations,t.relations))}equals(t){P(t instanceof e,`Cannot merge connection with different type`);let n=t;return this.id===n.id&&this.source.id===n.source.id&&this.target.id===n.target.id&&Ea(this.relations,n.relations)}update(t){return new e(this.source,this.target,t)}[Ac](t,n,r){let i=this.toString();return Object.defineProperty(i,`constructor`,{value:e,enumerable:!1}),i}toString(){return[this.expression,this.relations.size?` relations:`:` relations: [ ]`,...[...this.relations].map(e=>` `+e.expression)].join(`
22
+ `)}reversed(){return new e(this.target,this.source)}},Kc=e({findConnection:()=>qc,findConnectionsBetween:()=>Jc,findConnectionsWithin:()=>Yc});function qc(e,t,n=`directed`){if(e===t||Ji(e,t))return[];let r=e.allOutgoing.intersect(t.allIncoming),i=r.nonEmpty?[new jc(e,t,r)]:[];return n===`directed`?i:[...i,...qc(t,e,`directed`)]}function Jc(e,t,n=`both`){if(e.allIncoming.isEmpty&&e.allOutgoing.isEmpty)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of qc(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function Yc(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Jc(t,r.slice(n+1),`both`)),e),[])}var Xc=e({findConnection:()=>Zc,findConnectionsBetween:()=>Qc,findConnectionsWithin:()=>$c});function Zc(e,t,n=`directed`){if(e===t||Ji(e,t))return[];let r=wa(e.allOutgoing,t.allIncoming),i=r.size>0?new Gc(e,t,r):null;if(n===`directed`)return i?[i]:[];let a=wa(e.allIncoming,t.allOutgoing),o=a.size>0?new Gc(t,e,a):null;return i&&o?[i,o]:i?[i]:o?[o]:[]}function Qc(e,t,n=`both`){if(e.allIncoming.size===0&&e.allOutgoing.size===0)return[];let r=[],i=[];for(let a of t)if(e!==a)for(let t of Zc(e,a,n))t.source===e?r.push(t):i.push(t);return[...r,...i]}function $c(e){return[...e].reduce((e,t,n,r)=>(n===r.length-1||e.push(...Qc(t,r.slice(n+1),`both`)),e),[])}function el(e){return e instanceof pc}function tl(e){return e instanceof mc}function nl(e){return el(e)||tl(e)}function rl(e){return e instanceof hc}function il(e){return e instanceof dc}var al=t(rn(),1);const ol=hs.getChild([`graphviz`,`binary`]);var sl=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,ui.availableParallelism()-2)}get dotpath(){return this._dotpath??R(this,`_dotpath`,()=>{let e=al.default.sync(`dot`);return ol.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??R(this,`_unflattenpath`,()=>{let e=al.default.sync(`unflatten`);return ol.debug`Found ${e}`,e})}async unflatten(e){let t,n=ol.getChild([`unflatten`,Ve(4)]);try{let r=await nn(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=r.stdout,_(r.stderr)?n.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):n.warn(`{command} has stderr:
23
+ `+r.stderr,{command:r.command})}catch(r){n.debug(`FAILED DOT`,{dot:e}),n.error(U(r)),r instanceof tn&&!_(r.stdout)&&(n.warn(`{command} returned result but failed with exitcode {exitCode}:
24
+ {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),t=r.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=ol.getChild([`layoutJson`,Ve(4)]),n;try{let r=await nn(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,_(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
25
+ `+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(U(r)),r instanceof tn&&!_(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
26
+ {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=ol.getChild([`svg`,Ve(4)]),n;try{let r=await nn(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});n=r.stdout,_(r.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:r.command,durationMs:Math.round(r.durationMs)}):t.warn(`{command} has stderr:
27
+ `+r.stderr,{command:r.command})}catch(r){if(t.debug(`FAILED DOT`,{dot:e}),t.error(U(r)),r instanceof tn&&!_(r.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
28
+ {stderr}`,{command:r.command,exitCode:r.exitCode,stderr:r.stderr}),n=r.stdout;else throw r}return n}};const K=hs.getChild(`server`);function q(e){K.warn(U(e))}function cl(e){let t=os();return n=>{try{switch(n.level){case`error`:case`fatal`:{let r=n.category.join(`.`);if(r===`likec4.config`)break;let i=rs(n);i?e.telemetry.logEvent({eventName:`error`,message:`${i.name}: ${i.message}`,category:r,...i.stack&&{stack:i.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(n),category:r});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function ll({lspConnection:e,enableTelemetry:t=!!e,useStdErr:n=!1,logLevel:r=pi?`debug`:`warning`,nonBlocking:i=!1,colors:a=!1}={}){let o=!!e&&t&&!pi;_s({reset:!0,sinks:{console:n?ms({formatter:cs()}):ps({formatter:a?ds():cs(),nonBlocking:i}),...o&&{telemetry:cl(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...o?[`telemetry`]:[]],lowestLevel:r}]}),K.trace(`logger configured`)}const ul=/^@[A-Za-z0-9_-]*$/,dl=/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,fl=O.string().min(1,`Image alias key cannot be empty`).regex(ul,`Image alias key must match /^@\\w+$/`),pl=O.string().min(1,`Image alias value cannot be empty`).regex(dl,`Image alias value must be a relative path (no leading slash or protocol)`),ml=O.record(fl,pl).meta({id:`ImageAliases`,description:`Map of image alias prefixes to relative paths (keys must match /^@\\w+$/; values must be relative paths without protocol or leading slash).`}),hl=O.string().min(1,`Include path cannot be empty`).regex(/^(?!\/|[A-Za-z]:[\\\/])(?!.*:\/\/).*$/,`Include path must be a relative path (no leading slash, drive letter, or protocol)`),gl=O.strictObject({paths:O.array(hl).meta({description:[`Additional relative directory paths to include LikeC4 source files from, searched recursively.`,`Paths are relative to the project folder (the folder containing this config file).`,`Example: ["../shared", "../common/specs"]`].join(`
29
29
  `)}),maxDepth:O.number().int().min(1).max(20).default(3).meta({description:[`Maximum directory depth to scan when searching for .c4 files in include paths.`,`Prevents excessive scanning of deeply nested directories.`,`Default: 3`].join(`
30
30
  `)}),fileThreshold:O.number().int().min(1).max(1e4).default(30).meta({description:[`Maximum number of files to load from include paths before warning.`,`Helps identify performance issues from accidentally including large directories.`,`Default: 30`].join(`
31
31
  `)})}).meta({id:`include-config`,description:[`Configuration for including additional LikeC4 source files from other directories.`,`Example: { "paths": ["../shared", "../common/specs"], "maxDepth": 5, "fileThreshold": 50 }`].join(`
32
- `)}),El=O.int().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`).meta({id:`Opacity`,description:`Opacity 0-100%`}),Dl=O.enum(ki).meta({id:`ElementShape`}),Ol=O.enum(Oi).meta({id:`BorderStyle`}),kl=O.enum(Ei).meta({id:`ElementSize`}),Al=O.enum(Di).meta({id:`IconPosition`}),jl=O.enum(Ia).meta({id:`ArrowType`}),Ml=O.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),Nl=O.enum(Ai).meta({id:`ThemeColorName`}),Pl=O.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),Fl=Nl.or(Pl).transform(e=>e).meta({id:`ColorName`}),Il=O.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),Ll=O.strictObject({fill:Il.meta({description:`Background color`}),stroke:Il.meta({description:`Stroke color (border, paths above background)`}),hiContrast:Il.meta({description:`High contrast text color (title)`}),loContrast:Il.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),Rl=O.strictObject({line:Il.meta({description:`Line color`}),label:Il.meta({description:`Label text color`}),labelBg:Il.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),zl=O.strictObject({elements:Ll.or(Il.transform(e=>Ma(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:Rl.or(Il.transform(e=>Ma(e).relationships)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`})}).transform(e=>e).meta({id:`StrictThemeColorValues`,description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color value`}).or(Il.transform(e=>Ma(e))).transform(e=>e).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),Bl=O.partialRecord(Fl,zl).transform(e=>e),Vl=O.strictObject({width:O.number().min(50),height:O.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),Hl=O.partialRecord(kl,Vl),Ul=O.strictObject({colors:Bl.optional().meta({description:`Override theme colors`}),sizes:Hl.optional().meta({description:`Override theme sizes`})}).meta({id:`ThemeCustomization`,description:`Customize theme colors and sizes`}).transform(({colors:e,sizes:t})=>z({colors:e?z(e):void 0,sizes:t?z(t):void 0})),Wl=O.strictObject({color:Fl.optional().meta({description:`Default color for groups
33
- (must be a valid color name from the theme)`}),opacity:El.optional().meta({description:`Default opacity for groups`}),border:Ol.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`}),Gl=O.strictObject({color:Fl.optional().meta({description:`Default color for relationships
34
- (must be a valid color name from the theme)`}),line:Ml.optional().meta({description:`Default line style for relationships`}),arrow:jl.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
35
- These values will be used if such property is not defined`}),Kl=O.strictObject({color:Fl.optional().meta({description:`Default color for elements
36
- (must be a valid color name from the theme)`}),opacity:El.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:Ol.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:kl.optional().meta({description:`Default size for elements`}),shape:Dl.optional().meta({description:`Default shape for elements`}),iconPosition:Al.optional().meta({description:`Default icon position for elements`}),group:Wl.optional().meta({description:`Override default values for group style properties
37
- These values will be used if such property is not defined`}),relationship:Gl.optional().meta({description:`Override default values for relationship style properties
38
- These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),ql=O.union([O.string().min(1,`Custom CSS file path cannot be empty`),O.array(O.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`}),Jl=O.strictObject({theme:Ul.optional().meta({description:`Project theme customization`}),defaults:Kl.optional().meta({description:`Override default values for style properties
39
- These values will be used if such property is not defined`}),customCss:ql.optional().meta({description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`})}).transform(({theme:e,defaults:t,customCss:n})=>z({defaults:Yl(t),customCss:Xl(n),theme:e}));function Yl(e){if(!e)return;let{relationship:t,group:n,...r}=e;return z({...r,relationship:t&&z(t),group:n&&z(n)})}function Xl(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const Zl=O.strictObject({outDir:O.string().default(`.likec4`).meta({description:[`Path to the directory where manual layouts will be stored,`,`relative to the folder containing the project config. `,``,`Defaults to '.likec4'.`].join(`
40
- `)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),Ql=O.object({name:O.string().nonempty(`Project name cannot be empty`).refine(e=>e!==`default`,{abort:!0,error:`Project name cannot be "default"`}).refine(e=>!e.includes(`.`)&&!e.includes(`@`)&&!e.includes(`#`),{abort:!0,error:`Project name cannot contain ".", "@" or "#", try to use A-z, 0-9, _ and -`}).meta({description:`Project name, must be unique in the workspace`}),extends:O.union([O.string().min(1,`Extend path cannot be empty`),O.array(O.string().min(1,`Extend path cannot be empty`)).min(1,`Extend list cannot be empty`)]).optional().meta({description:`Extend styles from other config files`}),title:O.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:O.string().nonempty(`Contact person cannot be empty if specified`).optional().meta({description:`A person who has been involved in creating or maintaining this project`}),metadata:O.record(O.string(),O.any()).optional().meta({description:`Arbitrary metadata as key-value pairs for custom project information`}),styles:Jl.optional().meta({description:`Project styles customization`}),imageAliases:Cl.optional(),include:Tl.optional(),exclude:O.array(O.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:Zl.optional(),inferTechnologyFromIcon:O.boolean().optional().meta({description:[`Automatically derive element technology from icon name when technology is not set explicitly.`,`Applies to aws:, azure:, gcp:, and tech: icons. Bootstrap icons are excluded.`,`Defaults to true.`].join(`
41
- `)}),implicitViews:O.boolean().optional().meta({description:`Auto-generate scoped views for elements without explicit views. Defaults to true.`})}).meta({id:`LikeC4ProjectConfig`,description:`LikeC4 Project Configuration`}),$l=O.instanceof(Function),eu=O.record(O.string(),$l),tu=Ql.extend({generators:eu.optional()});function nu(e){let t=tu.safeParse(e);if(t.success)return t.data;throw Error(`Config validation failed:
42
- `+O.prettifyError(t.error))}function ru(e){return nu(_r.parse(e.trim()||`{}`))}const iu={parse:ru,validate:nu,normalizeInclude:e=>{let t=Tl.safeParse(e);return t.success?t.data:{paths:[],maxDepth:3,fileThreshold:30}}};function au(e){let t=e.length;for(;t>0&&(e[t-1]===`/`||e[t-1]===`\\`);)t--;return e.slice(0,t)}function ou(e){return e.split(`/`).flatMap(e=>e.split(`\\`))}function su(e){let t=au(e),n=ou(t);return n[n.length-1]||t}const cu=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],lu=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...cu,...lu];function uu(e){return cu.includes(su(e))}function du(e){return lu.includes(su(e))}function fu(e){return uu(e)||du(e)}const pu=Ql.pick({extends:!0,styles:!0}).loose(),mu=e=>e?Array.isArray(e)?e:[e]:[],hu=async e=>{let t=await ai.readFile(e,`utf-8`),n;try{n=_r.parse(t.trim()||`{}`)}catch(t){throw ts(t,`${e}:`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e}: Config must be a JSON object`);let r=pu.safeParse(n);if(!r.success)throw Error(`${e}: Invalid config\n`+O.prettifyError(r.error));return r.data},gu=async(e,t)=>{if(t.includes(e)){let n=t.indexOf(e),r=[...t.slice(n),e].join(` -> `);throw Error(`Config extends cycle detected: ${r}`)}let n=await hu(e),r=mu(n.extends),i=[...t,e],a=[];for(let t of r){let n=ri(ni(e),t);a.push(...await gu(n,i))}return[...a,n]};async function _u(e){e=typeof e==`string`?e:e.fsPath,hs.getChild(`config`).debug`Loading config: ${e}`;let t=ni(e),n=ti(e),r={name:ti(t)};if(uu(n)){let t=await gu(ri(e),[]);P(T(t,1),`Expect at least one config`);let n=_e(Re(t),[`extends`,`styles`]),i=t.map(e=>e.styles).filter(he),a=i.length>0?bt({},...i.reverse()):void 0;return nu({...r,...n,...a?{styles:a}:{}})}P(du(n),`Invalid name for config file: ${e}`);let{mod:i}=await fi({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=pi(e.errors,{kind:`error`});for(let e of t)hs.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
32
+ `)}),_l=O.int().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`).meta({id:`Opacity`,description:`Opacity 0-100%`}),vl=O.enum(ji).meta({id:`ElementShape`}),yl=O.enum(Ai).meta({id:`BorderStyle`}),bl=O.enum(Oi).meta({id:`ElementSize`}),xl=O.enum(ki).meta({id:`IconPosition`}),Sl=O.enum(Ra).meta({id:`ArrowType`}),Cl=O.enum([`dashed`,`solid`,`dotted`]).meta({id:`LineType`}),wl=O.enum(Mi).meta({id:`ThemeColorName`}),Tl=O.custom().refine(e=>typeof e==`string`,`Custom color name must be a string`).transform(e=>e).meta({id:`CustomColorName`}),El=wl.or(Tl).transform(e=>e).meta({id:`ColorName`}),Dl=O.string().min(1,`Color value cannot be empty`).meta({id:`ColorLiteral`}),Ol=O.strictObject({fill:Dl.meta({description:`Background color`}),stroke:Dl.meta({description:`Stroke color (border, paths above background)`}),hiContrast:Dl.meta({description:`High contrast text color (title)`}),loContrast:Dl.meta({description:`Low contrast text color (description)`})}).meta({id:`ElementColorValues`}).transform(e=>e),kl=O.strictObject({line:Dl.meta({description:`Line color`}),label:Dl.meta({description:`Label text color`}),labelBg:Dl.optional().default(`rgba(0, 0, 0, 0.5)`).meta({description:`Label background color`})}).meta({id:`RelationshipColorValues`}).transform(e=>e),Al=O.strictObject({elements:Ol.or(Dl.transform(e=>Pa(e).elements)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),relationships:kl.or(Dl.transform(e=>Pa(e).relationships)).meta({description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`})}).transform(e=>e).meta({id:`StrictThemeColorValues`,description:`Exact color value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color value`}).or(Dl.transform(e=>Pa(e))).transform(e=>e).meta({id:`ThemeColorValues`,description:`Exact value (hex, rgb, rgba, hsl, hsla ...) or break down of specific color values`}),jl=O.partialRecord(El,Al).transform(e=>e),Ml=O.strictObject({width:O.number().min(50),height:O.number().min(50)}).meta({id:`Dimensions`,description:`Defines dimensions for theme size`}),Nl=O.partialRecord(bl,Ml),Pl=O.strictObject({colors:jl.optional().meta({description:`Override theme colors`}),sizes:Nl.optional().meta({description:`Override theme sizes`})}).meta({id:`ThemeCustomization`,description:`Customize theme colors and sizes`}).transform(({colors:e,sizes:t})=>z({colors:e?z(e):void 0,sizes:t?z(t):void 0})),Fl=O.strictObject({color:El.optional().meta({description:`Default color for groups
33
+ (must be a valid color name from the theme)`}),opacity:_l.optional().meta({description:`Default opacity for groups`}),border:yl.optional().meta({description:`Default border for groups`})}).meta({id:`GroupDefaultStyleValues`}),Il=O.strictObject({color:El.optional().meta({description:`Default color for relationships
34
+ (must be a valid color name from the theme)`}),line:Cl.optional().meta({description:`Default line style for relationships`}),arrow:Sl.optional().meta({description:`Default arrow style for relationships`})}).meta({id:`RelationshipDefaultStyleValues`,description:`Override default values for relationship style properties
35
+ These values will be used if such property is not defined`}),Ll=O.strictObject({color:El.optional().meta({description:`Default color for elements
36
+ (must be a valid color name from the theme)`}),opacity:_l.optional().meta({description:`Default opacity (0-100%) for elements when displayed as a group (like a container)`}),border:yl.optional().meta({description:`Default border style for elements when displayed as a group (like a container)`}),size:bl.optional().meta({description:`Default size for elements`}),shape:vl.optional().meta({description:`Default shape for elements`}),iconPosition:xl.optional().meta({description:`Default icon position for elements`}),group:Fl.optional().meta({description:`Override default values for group style properties
37
+ These values will be used if such property is not defined`}),relationship:Il.optional().meta({description:`Override default values for relationship style properties
38
+ These values will be used if such property is not defined`})}).meta({id:`DefaultStyleValues`}),Rl=O.union([O.string().min(1,`Custom CSS file path cannot be empty`),O.array(O.string().min(1,`Custom CSS file path cannot be empty`))]).meta({id:`CustomStylesheets`}),zl=O.strictObject({theme:Pl.optional().meta({description:`Project theme customization`}),defaults:Ll.optional().meta({description:`Override default values for style properties
39
+ These values will be used if such property is not defined`}),customCss:Rl.optional().meta({description:`Custom CSS (or list of CSS files) to be included in the generated diagrams`})}).transform(({theme:e,defaults:t,customCss:n})=>z({defaults:Bl(t),customCss:Vl(n),theme:e}));function Bl(e){if(!e)return;let{relationship:t,group:n,...r}=e;return z({...r,relationship:t&&z(t),group:n&&z(n)})}function Vl(e){if(!e)return;let t=(Array.isArray(e)?e:[e]).filter(Boolean);if(t.length!==0)return{paths:t,content:``}}const Hl=O.strictObject({outDir:O.string().default(`.likec4`).meta({description:[`Path to the directory where manual layouts will be stored,`,`relative to the folder containing the project config. `,``,`Defaults to '.likec4'.`].join(`
40
+ `)})}).meta({id:`ManualLayoutsConfig`,description:`Configuration for manual layouts`}),Ul=O.union([O.strictObject({redirect:O.literal(!0)}),O.strictObject({include:O.array(O.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`include list cannot be empty`)}),O.strictObject({exclude:O.array(O.string().nonempty().refine(e=>e!==`#`,{message:`selector cannot be "#"`})).nonempty(`exclude list cannot be empty`)})]).meta({id:`LandingPageConfig`,description:`Configure the landing page. Use redirect to go to the index view, or include/exclude to filter the view grid.`}),Wl=O.object({name:O.string().nonempty(`Project name cannot be empty`).refine(e=>e!==`default`,{abort:!0,error:`Project name cannot be "default"`}).refine(e=>!e.includes(`.`)&&!e.includes(`@`)&&!e.includes(`#`),{abort:!0,error:`Project name cannot contain ".", "@" or "#", try to use A-z, 0-9, _ and -`}).meta({description:`Project name, must be unique in the workspace`}),extends:O.union([O.string().min(1,`Extend path cannot be empty`),O.array(O.string().min(1,`Extend path cannot be empty`)).min(1,`Extend list cannot be empty`)]).optional().meta({description:`Extend styles from other config files`}),title:O.string().nonempty(`Project title cannot be empty if specified`).optional().meta({description:`A human readable title for the project`}),contactPerson:O.string().nonempty(`Contact person cannot be empty if specified`).optional().meta({description:`A person who has been involved in creating or maintaining this project`}),metadata:O.record(O.string(),O.any()).optional().meta({description:`Arbitrary metadata as key-value pairs for custom project information`}),styles:zl.optional().meta({description:`Project styles customization`}),imageAliases:ml.optional(),include:gl.optional(),exclude:O.array(O.string()).optional().meta({description:`List of file patterns to exclude from the project, default is ["**/node_modules/**"]`}),manualLayouts:Hl.optional(),inferTechnologyFromIcon:O.boolean().optional().meta({description:[`Automatically derive element technology from icon name when technology is not set explicitly.`,`Applies to aws:, azure:, gcp:, and tech: icons. Bootstrap icons are excluded.`,`Defaults to true.`].join(`
41
+ `)}),implicitViews:O.boolean().optional().meta({description:`Auto-generate scoped views for elements without explicit views. Defaults to false.`}),landingPage:Ul.optional()}).meta({id:`LikeC4ProjectConfig`,description:`LikeC4 Project Configuration`}),Gl=O.instanceof(Function),Kl=O.record(O.string(),Gl);Wl.extend({generators:Kl.optional()});function ql(e){let t=e.landingPage,n=null;if(t!=null){let e=Ul.safeParse(t);if(!e.success)throw Error(`Config validation failed:
42
+ `+O.prettifyError(e.error));n=e.data}let r=Wl.safeParse(e);if(!r.success)throw Error(`Config validation failed:
43
+ `+O.prettifyError(r.error));let i=r.data;n!==null&&(i={...i,landingPage:n});let a=e.generators;if(typeof a==`object`&&a&&!Array.isArray(a)){let e=Kl.safeParse(a);if(!e.success)throw Error(`Config validation failed (generators):
44
+ `+O.prettifyError(e.error));return{...i,generators:e.data}}return i}function Jl(e){return ql(yr.parse(e.trim()||`{}`))}const Yl={parse:Jl,validate:ql,normalizeInclude:e=>{let t=gl.safeParse(e);return t.success?t.data:{paths:[],maxDepth:3,fileThreshold:30}}};function Xl(e){let t=e.length;for(;t>0&&(e[t-1]===`/`||e[t-1]===`\\`);)t--;return e.slice(0,t)}function Zl(e){return e.split(`/`).flatMap(e=>e.split(`\\`))}function Ql(e){let t=Xl(e),n=Zl(t);return n[n.length-1]||t}const $l=[`.likec4rc`,`.likec4.config.json`,`likec4.config.json`],eu=[`likec4.config.js`,`likec4.config.cjs`,`likec4.config.mjs`,`likec4.config.ts`,`likec4.config.cts`,`likec4.config.mts`];[...$l,...eu];function tu(e){return $l.includes(Ql(e))}function nu(e){return eu.includes(Ql(e))}function ru(e){return tu(e)||nu(e)}const iu=Wl.pick({extends:!0,styles:!0}).loose(),au=e=>e?Array.isArray(e)?e:[e]:[],ou=async e=>{let t=await si.readFile(e,`utf-8`),n;try{n=yr.parse(t.trim()||`{}`)}catch(t){throw ts(t,`${e}:`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e}: Config must be a JSON object`);let r=iu.safeParse(n);if(!r.success)throw Error(`${e}: Invalid config\n`+O.prettifyError(r.error));return r.data},su=async(e,t)=>{if(t.includes(e)){let n=t.indexOf(e),r=[...t.slice(n),e].join(` -> `);throw Error(`Config extends cycle detected: ${r}`)}let n=await ou(e),r=au(n.extends),i=[...t,e],a=[];for(let t of r){let n=ai(ii(e),t);a.push(...await su(n,i))}return[...a,n]};async function cu(e){e=typeof e==`string`?e:e.fsPath,hs.getChild(`config`).debug`Loading config: ${e}`;let t=ii(e),n=ri(e),r={name:ri(t)};if(tu(n)){let t=await su(ai(e),[]);P(C(t,1),`Expect at least one config`);let n=ge(Re(t),[`extends`,`styles`]),i=t.map(e=>e.styles).filter(st),a=i.length>0?bt({},...i.reverse()):void 0;return ql({...r,...n,...a?{styles:a}:{}})}P(nu(n),`Invalid name for config file: ${e}`);let{mod:i}=await mi({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=hi(e.errors,{kind:`error`});for(let e of t)hs.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
43
45
  // Mock implementation to allow loading config files without bundling @likec4/config
44
46
  function mock(x) { return x }
45
47
  export {
@@ -48,10 +50,10 @@ export {
48
50
  mock as defineStyle,
49
51
  mock as defineTheme,
50
52
  mock as defineThemeColor,
51
- }`,loader:`js`}))}}]}});return nu(Object.assign(r,i?.default??i))}var vu=Cr();const yu=[`likec4lib {`,` icons {`,...[...Object.entries({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(`.`)})].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
52
- `),bu=`likec4builtin`,xu=`${bu}:///likec4/lib/icons.c4`;function Su(e){return(`uri`in e?e.uri:e).scheme===bu}function Cu(e){return!Su(e)}Bn();const wu=K.getChild(`manual-layouts`),Tu=e=>e.endsWith(`.likec4.snap`);function Eu(e){return`${e}.likec4.snap`}function Du(e){return Sn.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const Ou={manualLayouts:e=>new Au(e)},ku=`file://./`;var Au=class{cache;constructor(e){this.services=e,this.cache=new hr,ya(()=>{e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async read(e){return await this.cache.get(e.id,async()=>{let t=wu.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=Du(e),i=[];try{let a=await n.scanDirectory(r,Tu);if(a.length===0)return null;for(let r of a)try{let t=await n.readFile(r.uri),a=_r.parse(t),o=this.resolveIconPathsAfterRead(a,e.folderUri);i.push({...o,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${r.uri.fsPath}`,{err:e})}i.length&&t.debug`read manual layouts for ${e.id}, found ${i.length}`}catch(n){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:n})}if(i.length===0)return null;let a=oe(i,x(`id`));return{hash:Da(a),views:a}})}async write(e,t){this.cache.delete(e.id);let n=wu.getChild(e.id),r=Du(e),i=Sn.joinPath(r,Eu(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=_r.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:tr.create(Fn.create(0,0),Fn.create(a.split(`
53
+ }`,loader:`js`}))}}]}});return ql(Object.assign(r,i?.default??i))}var lu=Tr();const uu=[`likec4lib {`,` icons {`,...[...Object.entries({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(`.`)})].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
54
+ `),du=`likec4builtin`,fu=`${du}:///likec4/lib/icons.c4`;function pu(e){return(`uri`in e?e.uri:e).scheme===du}function mu(e){return!pu(e)}ir();var hu=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){q(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};const gu=`AnyProperty`;function _u(e){return J.isInstance(e,gu)}const vu=`ColorLiteral`;function yu(e){return J.isInstance(e,vu)}const bu=`DeploymentElement`;function xu(e){return J.isInstance(e,bu)}const Su=`DeploymentNodeOrElementKind`,Cu=`DeploymentViewRule`;function wu(e){return J.isInstance(e,Cu)}const Tu=`DynamicViewProperty`,Eu=`DynamicViewRule`;function Du(e){return J.isInstance(e,Eu)}const Ou=`DynamicViewStep`;function ku(e){return J.isInstance(e,Ou)}const Au=`ElementProperty`;function ju(e){return J.isInstance(e,Au)}const Mu=`ExpressionV2`;function Nu(e){return J.isInstance(e,Mu)}const Pu=`ExtendElementProperty`,Fu=`ExtendRelationProperty`,Iu=`FqnExpr`;function Lu(e){return J.isInstance(e,Iu)}const Ru=`FqnExprOrWhere`;function zu(e){return J.isInstance(e,Ru)}const Bu=`FqnExprOrWith`;function Vu(e){return J.isInstance(e,Bu)}const Hu=`FqnReferenceable`,Uu=`LikeC4View`;function Wu(e){return J.isInstance(e,Uu)}const Gu=`MetadataProperty`;function Ku(e){return J.isInstance(e,Gu)}const qu=`MetadataValue`,Ju=`ModelReferenceable`,Yu=`Referenceable`,Xu=`RelationExpr`;function Zu(e){return J.isInstance(e,Xu)}const Qu=`RelationExprOrWhere`;function $u(e){return J.isInstance(e,Qu)}const ed=`RelationExprOrWith`;function td(e){return J.isInstance(e,ed)}const nd=`RelationProperty`,rd=`RelationshipStyleProperty`;function id(e){return J.isInstance(e,rd)}const ad=`SizeProperty`;function od(e){return J.isInstance(e,ad)}const sd=`StringProperty`;function cd(e){return J.isInstance(e,sd)}const ld=`StyleProperty`;function ud(e){return J.isInstance(e,ld)}const dd=`ViewProperty`;function fd(e){return J.isInstance(e,dd)}const pd=`ViewRule`;function md(e){return J.isInstance(e,pd)}const hd=`ViewRuleStyleOrGlobalRef`;function gd(e){return J.isInstance(e,hd)}const _d=`WhereElement`;function vd(e){return J.isInstance(e,_d)}const yd=`WhereElementExpression`;function bd(e){return J.isInstance(e,yd)}const xd=`WhereExpression`,Sd=`WhereKindEqual`;function Cd(e){return J.isInstance(e,Sd)}const wd=`WhereMetadataEqual`;function Td(e){return J.isInstance(e,wd)}const Ed=`WhereRelation`;function Dd(e){return J.isInstance(e,Ed)}const Od=`WhereRelationExpression`;function kd(e){return J.isInstance(e,Od)}const Ad=`WhereTagEqual`;function jd(e){return J.isInstance(e,Ad)}const Md=`AbstractDynamicStep`,Nd=`ArrowProperty`;function Pd(e){return J.isInstance(e,Nd)}const Fd=`BorderProperty`;function Id(e){return J.isInstance(e,Fd)}const Ld=`ColorProperty`;function Rd(e){return J.isInstance(e,Ld)}const zd=`CustomColor`,Bd=`CustomElementProperties`;function Vd(e){return J.isInstance(e,Bd)}const Hd=`CustomRelationProperties`;function Ud(e){return J.isInstance(e,Hd)}const Wd=`DeployedInstance`;function Gd(e){return J.isInstance(e,Wd)}const Kd=`DeployedInstanceBody`;function qd(e){return J.isInstance(e,Kd)}const Jd=`DeploymentNode`;function Yd(e){return J.isInstance(e,Jd)}const Xd=`DeploymentNodeBody`;function Zd(e){return J.isInstance(e,Xd)}const Qd=`DeploymentNodeKind`;function $d(e){return J.isInstance(e,Qd)}const ef=`DeploymentRelation`;function tf(e){return J.isInstance(e,ef)}const nf=`DeploymentRelationBody`;function rf(e){return J.isInstance(e,nf)}const af=`DeploymentView`;function of(e){return J.isInstance(e,af)}const sf=`DeploymentViewBody`;function cf(e){return J.isInstance(e,sf)}const lf=`DeploymentViewRulePredicate`;function uf(e){return J.isInstance(e,lf)}const df=`DeploymentViewRuleStyle`;function ff(e){return J.isInstance(e,df)}const pf=`DirectedRelationExpr`;function mf(e){return J.isInstance(e,pf)}const hf=`DynamicView`;function gf(e){return J.isInstance(e,hf)}const _f=`DynamicViewBody`;function vf(e){return J.isInstance(e,_f)}const yf=`DynamicViewDisplayVariantProperty`;function bf(e){return J.isInstance(e,yf)}const xf=`DynamicViewGlobalPredicateRef`;function Sf(e){return J.isInstance(e,xf)}const Cf=`DynamicViewIncludePredicate`;function wf(e){return J.isInstance(e,Cf)}const Tf=`DynamicViewParallelSteps`;function Ef(e){return J.isInstance(e,Tf)}const Df=`DynamicViewRef`,Of=`Element`;function kf(e){return J.isInstance(e,Of)}const Af=`ElementBody`;function jf(e){return J.isInstance(e,Af)}const Mf=`ElementKind`;function Nf(e){return J.isInstance(e,Mf)}const Pf=`ElementKindExpression`;function Ff(e){return J.isInstance(e,Pf)}const If=`ElementRef`;function Lf(e){return J.isInstance(e,If)}const Rf=`ElementStringProperty`;function zf(e){return J.isInstance(e,Rf)}const Bf=`ElementStyleProperty`;function Vf(e){return J.isInstance(e,Bf)}const Hf=`ElementTagExpression`;function Uf(e){return J.isInstance(e,Hf)}const Wf=`ElementView`;function Gf(e){return J.isInstance(e,Wf)}const Kf=`ElementViewBody`;function qf(e){return J.isInstance(e,Kf)}const Jf=`ElementViewRef`,Yf=`Expressions`;function Xf(e){return J.isInstance(e,Yf)}const Zf=`ExtendDeployment`;function Qf(e){return J.isInstance(e,Zf)}const $f=`ExtendDeploymentBody`;function ep(e){return J.isInstance(e,$f)}const tp=`ExtendElement`;function np(e){return J.isInstance(e,tp)}const rp=`ExtendElementBody`;function ip(e){return J.isInstance(e,rp)}const ap=`ExtendRelation`;function op(e){return J.isInstance(e,ap)}const sp=`ExtendRelationBody`;function cp(e){return J.isInstance(e,sp)}const lp=`FqnExpressions`;function up(e){return J.isInstance(e,lp)}const dp=`FqnExprWhere`;function fp(e){return J.isInstance(e,dp)}const pp=`FqnExprWith`;function mp(e){return J.isInstance(e,pp)}const hp=`FqnRef`;function gp(e){return J.isInstance(e,hp)}const _p=`FqnRefExpr`;function vp(e){return J.isInstance(e,_p)}const yp=`GlobalDynamicPredicateGroup`;function bp(e){return J.isInstance(e,yp)}const xp=`GlobalPredicateGroup`;function Sp(e){return J.isInstance(e,xp)}const Cp=`Globals`;function wp(e){return J.isInstance(e,Cp)}const Tp=`GlobalStyle`;function Ep(e){return J.isInstance(e,Tp)}const Dp=`GlobalStyleGroup`;function Op(e){return J.isInstance(e,Dp)}const kp=`GlobalStyleId`,Ap=`HexColor`;function jp(e){return J.isInstance(e,Ap)}const Mp=`IconColorProperty`;function Np(e){return J.isInstance(e,Mp)}const Pp=`IconPositionProperty`;function Fp(e){return J.isInstance(e,Pp)}const Ip=`IconProperty`;function Lp(e){return J.isInstance(e,Ip)}const Rp=`IconSizeProperty`;function zp(e){return J.isInstance(e,Rp)}const Bp=`Imported`;function Vp(e){return J.isInstance(e,Bp)}const Hp=`ImportsFromPoject`;function Up(e){return J.isInstance(e,Hp)}const Wp=`IncomingRelationExpr`;function Gp(e){return J.isInstance(e,Wp)}const Kp=`InOutRelationExpr`;function qp(e){return J.isInstance(e,Kp)}const Jp=`LibIcon`;function Yp(e){return J.isInstance(e,Jp)}const Xp=`LikeC4Grammar`;function Zp(e){return J.isInstance(e,Xp)}const Qp=`LikeC4Lib`;function $p(e){return J.isInstance(e,Qp)}const em=`LineProperty`;function tm(e){return J.isInstance(e,em)}const nm=`LinkProperty`;function rm(e){return J.isInstance(e,nm)}const im=`MarkdownOrString`;function am(e){return J.isInstance(e,im)}const om=`MetadataArray`;function sm(e){return J.isInstance(e,om)}const cm=`MetadataAttribute`;function lm(e){return J.isInstance(e,cm)}const um=`MetadataBody`;function dm(e){return J.isInstance(e,um)}const fm=`Model`;function pm(e){return J.isInstance(e,fm)}const mm=`ModelDeployments`;function hm(e){return J.isInstance(e,mm)}const gm=`ModelViews`;function _m(e){return J.isInstance(e,gm)}const vm=`MultipleProperty`;function ym(e){return J.isInstance(e,vm)}const bm=`NavigateToProperty`;function xm(e){return J.isInstance(e,bm)}const Sm=`NotationProperty`;function Cm(e){return J.isInstance(e,Sm)}const wm=`NotesProperty`;function Tm(e){return J.isInstance(e,wm)}const Em=`OpacityProperty`;function Dm(e){return J.isInstance(e,Em)}const Om=`OutgoingRelationExpr`;function km(e){return J.isInstance(e,Om)}const Am=`PaddingSizeProperty`;function jm(e){return J.isInstance(e,Am)}const Mm=`Relation`;function Nm(e){return J.isInstance(e,Mm)}const Pm=`RelationBody`;function Fm(e){return J.isInstance(e,Pm)}const Im=`RelationExprWhere`;function Lm(e){return J.isInstance(e,Im)}const Rm=`RelationExprWith`;function zm(e){return J.isInstance(e,Rm)}const Bm=`RelationKindDotRef`;function Vm(e){return J.isInstance(e,Bm)}const Hm=`RelationNavigateToProperty`;function Um(e){return J.isInstance(e,Hm)}const Wm=`RelationshipKind`;function Gm(e){return J.isInstance(e,Wm)}const Km=`RelationStringProperty`;function qm(e){return J.isInstance(e,Km)}const Jm=`RelationStyleProperty`;function Ym(e){return J.isInstance(e,Jm)}const Xm=`RGBAColor`;function Zm(e){return J.isInstance(e,Xm)}const Qm=`ShapeProperty`;function $m(e){return J.isInstance(e,Qm)}const eh=`ShapeSizeProperty`;function th(e){return J.isInstance(e,eh)}const nh=`SpecificationColor`;function rh(e){return J.isInstance(e,nh)}const ih=`SpecificationDeploymentNodeKind`;function ah(e){return J.isInstance(e,ih)}const oh=`SpecificationElementKind`;function sh(e){return J.isInstance(e,oh)}const ch=`SpecificationElementStringProperty`;function lh(e){return J.isInstance(e,ch)}const uh=`SpecificationRelationshipKind`;function dh(e){return J.isInstance(e,uh)}const fh=`SpecificationRelationshipStringProperty`;function ph(e){return J.isInstance(e,fh)}const mh=`SpecificationRule`;function hh(e){return J.isInstance(e,mh)}const gh=`SpecificationTag`;function _h(e){return J.isInstance(e,gh)}const vh=`StrictFqnElementRef`;function yh(e){return J.isInstance(e,vh)}const bh=`StrictFqnRef`;function xh(e){return J.isInstance(e,bh)}function Sh(e){return J.isInstance(e,`Tag`)}const Ch=`TagRef`;function wh(e){return J.isInstance(e,Ch)}const Th=`Tags`;function Eh(e){return J.isInstance(e,Th)}const Dh=`TextSizeProperty`;function Oh(e){return J.isInstance(e,Dh)}const kh=`ViewRef`,Ah=`ViewRuleAutoLayout`;function jh(e){return J.isInstance(e,Ah)}const Mh=`ViewRuleGlobalPredicateRef`;function Nh(e){return J.isInstance(e,Mh)}const Ph=`ViewRuleGlobalStyle`;function Fh(e){return J.isInstance(e,Ph)}const Ih=`ViewRuleGroup`;function Lh(e){return J.isInstance(e,Ih)}const Rh=`ViewRulePredicate`;function zh(e){return J.isInstance(e,Rh)}const Bh=`ViewRuleRank`;function Vh(e){return J.isInstance(e,Bh)}const Hh=`ViewRuleStyle`;function Uh(e){return J.isInstance(e,Hh)}const Wh=`ViewStringProperty`;function Gh(e){return J.isInstance(e,Wh)}const Kh=`WhereBinaryExpression`;function qh(e){return J.isInstance(e,Kh)}const Jh=`WhereElementKind`;function Yh(e){return J.isInstance(e,Jh)}const Xh=`WhereElementMetadata`;function Zh(e){return J.isInstance(e,Xh)}const Qh=`WhereElementNegation`;function $h(e){return J.isInstance(e,Qh)}const eg=`WhereElementTag`;function tg(e){return J.isInstance(e,eg)}const ng=`WhereRelationKind`;function rg(e){return J.isInstance(e,ng)}const ig=`WhereRelationMetadata`;function ag(e){return J.isInstance(e,ig)}const og=`WhereRelationNegation`;function sg(e){return J.isInstance(e,og)}const cg=`WhereRelationParticipantKind`;function lg(e){return J.isInstance(e,cg)}const ug=`WhereRelationParticipantMetadata`;function dg(e){return J.isInstance(e,ug)}const fg=`WhereRelationParticipantTag`;function pg(e){return J.isInstance(e,fg)}const mg=`WhereRelationTag`;function hg(e){return J.isInstance(e,mg)}const gg=`WildcardExpression`;function _g(e){return J.isInstance(e,gg)}const vg=`DynamicStepChain`;function yg(e){return J.isInstance(e,vg)}const bg=`DynamicStepSingle`;function xg(e){return J.isInstance(e,bg)}var Sg=class extends Bn{getAllTypes(){return[Md,gu,Nd,Fd,vu,Ld,zd,Bd,Hd,Wd,Kd,bu,Jd,Xd,Qd,Su,ef,nf,af,sf,Cu,lf,df,pf,vg,bg,hf,_f,yf,xf,Cf,Tf,Tu,Df,Eu,Ou,Of,Af,Mf,Pf,Au,If,Rf,Bf,Hf,Wf,Kf,Jf,Mu,Yf,Zf,$f,tp,rp,Pu,ap,sp,Fu,Iu,Ru,Bu,dp,pp,lp,hp,_p,Hu,yp,xp,Tp,Dp,kp,Cp,Ap,Mp,Pp,Ip,Rp,Bp,Hp,Kp,Wp,Jp,Xp,Qp,Uu,em,nm,im,om,cm,um,Gu,qu,fm,mm,Ju,gm,vm,bm,Sm,wm,Em,Om,Am,Xm,Yu,Mm,Pm,Xu,Qu,ed,Im,Rm,Bm,Hm,nd,Km,Jm,Wm,rd,Qm,eh,ad,nh,ih,oh,ch,uh,fh,mh,gh,vh,bh,sd,ld,`Tag`,Ch,Th,Dh,dd,kh,pd,Ah,Mh,Ph,Ih,Rh,Bh,Hh,hd,Wh,Kh,_d,yd,Jh,Xh,Qh,eg,xd,Sd,wd,Ed,Od,ng,ig,og,cg,ug,fg,mg,Ad,gg]}computeIsSubtype(e,t){switch(e){case Nd:case em:return this.isSubtype(rd,t);case Fd:case Mp:case Pp:case vm:case Em:case Qm:return this.isSubtype(ld,t);case Ld:return this.isSubtype(rd,t)||this.isSubtype(ld,t);case Wd:case Jd:return this.isSubtype(bu,t)||this.isSubtype(Yu,t);case Qd:case Mf:return this.isSubtype(Su,t);case af:case hf:case Wf:return this.isSubtype(Uu,t);case lf:case df:return this.isSubtype(Cu,t);case pf:case Wp:case Kp:case Om:return this.isSubtype(Xu,t);case vg:case bg:return this.isSubtype(Md,t)||this.isSubtype(Ou,t);case yf:return this.isSubtype(Tu,t);case xf:case Cf:return this.isSubtype(Eu,t);case Tu:case Au:case bm:case nd:case rd:case sd:case ld:return this.isSubtype(gu,t);case Of:return this.isSubtype(Hu,t)||this.isSubtype(Ju,t)||this.isSubtype(Yu,t);case Pf:case Hf:case _p:case gg:return this.isSubtype(Iu,t);case Rf:return this.isSubtype(Au,t)||this.isSubtype(sd,t);case Bf:return this.isSubtype(Au,t);case Zf:case tp:case Yu:return this.isSubtype(Hu,t);case Iu:case dp:return this.isSubtype(Ru,t);case Ru:case pp:return this.isSubtype(Bu,t);case Bu:case ed:return this.isSubtype(Mu,t);case Ap:case Xm:return this.isSubtype(vu,t);case Ip:return this.isSubtype(Au,t)||this.isSubtype(ld,t);case Rp:case Am:case eh:case Dh:return this.isSubtype(ad,t)||this.isSubtype(ld,t);case Bp:return this.isSubtype(Ju,t)||this.isSubtype(Yu,t);case nm:return this.isSubtype(Au,t)||this.isSubtype(Pu,t)||this.isSubtype(Fu,t)||this.isSubtype(nd,t)||this.isSubtype(dd,t);case im:case om:return this.isSubtype(qu,t);case cm:case ch:case fh:return this.isSubtype(sd,t);case um:return this.isSubtype(Gu,t);case Gu:return this.isSubtype(Au,t)||this.isSubtype(Pu,t)||this.isSubtype(Fu,t)||this.isSubtype(nd,t);case Sm:case wm:return this.isSubtype(gu,t)||this.isSubtype(sd,t);case Xu:case Im:return this.isSubtype(Qu,t);case Qu:case Rm:return this.isSubtype(ed,t);case Hm:case Jm:return this.isSubtype(nd,t);case Km:return this.isSubtype(nd,t)||this.isSubtype(sd,t);case dd:return this.isSubtype(gu,t)||this.isSubtype(Tu,t);case Ah:return this.isSubtype(Cu,t)||this.isSubtype(Eu,t)||this.isSubtype(pd,t);case Mh:case Ih:case Rh:case Bh:return this.isSubtype(pd,t);case Ph:case Hh:return this.isSubtype(hd,t);case hd:return this.isSubtype(Eu,t)||this.isSubtype(pd,t);case Wh:return this.isSubtype(sd,t)||this.isSubtype(dd,t);case Kh:return this.isSubtype(yd,t)||this.isSubtype(Od,t);case _d:case Qh:return this.isSubtype(yd,t);case yd:case Od:return this.isSubtype(xd,t);case Jh:return this.isSubtype(_d,t)||this.isSubtype(Sd,t);case Xh:return this.isSubtype(_d,t)||this.isSubtype(wd,t);case eg:return this.isSubtype(_d,t)||this.isSubtype(Ad,t);case Ed:case og:return this.isSubtype(Od,t);case ng:case cg:return this.isSubtype(Sd,t)||this.isSubtype(Ed,t);case ig:case ug:return this.isSubtype(wd,t)||this.isSubtype(Ed,t);case fg:case mg:return this.isSubtype(Ed,t)||this.isSubtype(Ad,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractDynamicStep:kind`:case`DeploymentRelation:kind`:case`DynamicStepChain:kind`:case`DynamicStepSingle:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`WhereRelationKind:value`:return Wm;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return zd;case`DeploymentNode:kind`:return Qd;case`DynamicViewGlobalPredicateRef:predicate`:return yp;case`DynamicViewRef:view`:return hf;case`Element:kind`:case`ElementKindExpression:kind`:return Mf;case`ElementViewRef:view`:return Wf;case`FqnRef:value`:case`StrictFqnRef:value`:return Yu;case`IconProperty:libicon`:return Jp;case`Imported:imported`:case`StrictFqnElementRef:el`:return Of;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return Uu;case`ViewRuleGlobalPredicateRef:predicate`:return xp;case`ViewRuleGlobalStyle:style`:return kp;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Su;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Md:return{name:Md,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case Nd:return{name:Nd,properties:[{name:`key`},{name:`value`}]};case Fd:return{name:Fd,properties:[{name:`key`},{name:`value`}]};case Ld:return{name:Ld,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case zd:return{name:zd,properties:[{name:`name`}]};case Bd:return{name:Bd,properties:[{name:`props`,defaultValue:[]}]};case Hd:return{name:Hd,properties:[{name:`props`,defaultValue:[]}]};case Wd:return{name:Wd,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Kd:return{name:Kd,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Jd:return{name:Jd,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Xd:return{name:Xd,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Qd:return{name:Qd,properties:[{name:`name`}]};case ef:return{name:ef,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case nf:return{name:nf,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case af:return{name:af,properties:[{name:`body`},{name:`name`}]};case sf:return{name:sf,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case lf:return{name:lf,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case df:return{name:df,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case pf:return{name:pf,properties:[{name:`source`},{name:`target`}]};case hf:return{name:hf,properties:[{name:`body`},{name:`name`}]};case _f:return{name:_f,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case yf:return{name:yf,properties:[{name:`key`},{name:`value`}]};case xf:return{name:xf,properties:[{name:`predicate`}]};case Cf:return{name:Cf,properties:[{name:`exprs`}]};case Tf:return{name:Tf,properties:[{name:`steps`,defaultValue:[]}]};case Df:return{name:Df,properties:[{name:`view`}]};case Of:return{name:Of,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case Af:return{name:Af,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Mf:return{name:Mf,properties:[{name:`name`}]};case Pf:return{name:Pf,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case If:return{name:If,properties:[{name:`modelElement`}]};case Rf:return{name:Rf,properties:[{name:`key`},{name:`value`}]};case Bf:return{name:Bf,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Hf:return{name:Hf,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case Wf:return{name:Wf,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case Kf:return{name:Kf,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Jf:return{name:Jf,properties:[{name:`view`}]};case Yf:return{name:Yf,properties:[{name:`prev`},{name:`value`}]};case Zf:return{name:Zf,properties:[{name:`body`},{name:`deploymentNode`}]};case $f:return{name:$f,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case tp:return{name:tp,properties:[{name:`body`},{name:`element`}]};case rp:return{name:rp,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ap:return{name:ap,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case sp:return{name:sp,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case lp:return{name:lp,properties:[{name:`prev`},{name:`value`}]};case dp:return{name:dp,properties:[{name:`subject`},{name:`where`}]};case pp:return{name:pp,properties:[{name:`custom`},{name:`subject`}]};case hp:return{name:hp,properties:[{name:`parent`},{name:`value`}]};case _p:return{name:_p,properties:[{name:`ref`},{name:`selector`}]};case yp:return{name:yp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case xp:return{name:xp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Cp:return{name:Cp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Tp:return{name:Tp,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Dp:return{name:Dp,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case kp:return{name:kp,properties:[{name:`name`}]};case Ap:return{name:Ap,properties:[{name:`hex`}]};case Mp:return{name:Mp,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Pp:return{name:Pp,properties:[{name:`key`},{name:`value`}]};case Ip:return{name:Ip,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Rp:return{name:Rp,properties:[{name:`key`},{name:`value`}]};case Bp:return{name:Bp,properties:[{name:`imported`},{name:`prev`}]};case Hp:return{name:Hp,properties:[{name:`imports`},{name:`project`}]};case Wp:return{name:Wp,properties:[{name:`to`}]};case Kp:return{name:Kp,properties:[{name:`inout`}]};case Jp:return{name:Jp,properties:[{name:`name`}]};case Xp:return{name:Xp,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Qp:return{name:Qp,properties:[{name:`icons`,defaultValue:[]}]};case em:return{name:em,properties:[{name:`key`},{name:`value`}]};case nm:return{name:nm,properties:[{name:`key`},{name:`title`},{name:`value`}]};case im:return{name:im,properties:[{name:`markdown`},{name:`text`}]};case om:return{name:om,properties:[{name:`values`,defaultValue:[]}]};case cm:return{name:cm,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case um:return{name:um,properties:[{name:`props`,defaultValue:[]}]};case fm:return{name:fm,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case mm:return{name:mm,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case gm:return{name:gm,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case vm:return{name:vm,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case bm:return{name:bm,properties:[{name:`key`},{name:`value`}]};case Sm:return{name:Sm,properties:[{name:`key`},{name:`value`}]};case wm:return{name:wm,properties:[{name:`key`},{name:`value`}]};case Em:return{name:Em,properties:[{name:`key`},{name:`value`}]};case Om:return{name:Om,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case Am:return{name:Am,properties:[{name:`key`},{name:`value`}]};case Mm:return{name:Mm,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Pm:return{name:Pm,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Im:return{name:Im,properties:[{name:`subject`},{name:`where`}]};case Rm:return{name:Rm,properties:[{name:`custom`},{name:`subject`}]};case Bm:return{name:Bm,properties:[{name:`kind`}]};case Hm:return{name:Hm,properties:[{name:`key`},{name:`value`}]};case Wm:return{name:Wm,properties:[{name:`name`}]};case Km:return{name:Km,properties:[{name:`key`},{name:`value`}]};case Jm:return{name:Jm,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case Xm:return{name:Xm,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case Qm:return{name:Qm,properties:[{name:`key`},{name:`value`}]};case eh:return{name:eh,properties:[{name:`key`},{name:`value`}]};case nh:return{name:nh,properties:[{name:`color`},{name:`name`}]};case ih:return{name:ih,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case oh:return{name:oh,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case ch:return{name:ch,properties:[{name:`key`},{name:`value`}]};case uh:return{name:uh,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case fh:return{name:fh,properties:[{name:`key`},{name:`value`}]};case mh:return{name:mh,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case gh:return{name:gh,properties:[{name:`color`},{name:`tag`}]};case vh:return{name:vh,properties:[{name:`el`},{name:`parent`}]};case bh:return{name:bh,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Ch:return{name:Ch,properties:[{name:`tag`}]};case Th:return{name:Th,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Dh:return{name:Dh,properties:[{name:`key`},{name:`value`}]};case kh:return{name:kh,properties:[{name:`view`}]};case Ah:return{name:Ah,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case Mh:return{name:Mh,properties:[{name:`predicate`}]};case Ph:return{name:Ph,properties:[{name:`style`}]};case Ih:return{name:Ih,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Rh:return{name:Rh,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case Bh:return{name:Bh,properties:[{name:`targets`},{name:`value`}]};case Hh:return{name:Hh,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Wh:return{name:Wh,properties:[{name:`key`},{name:`value`}]};case Kh:return{name:Kh,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case Jh:return{name:Jh,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Xh:return{name:Xh,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Qh:return{name:Qh,properties:[{name:`value`}]};case eg:return{name:eg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case ng:return{name:ng,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case ig:return{name:ig,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case og:return{name:og,properties:[{name:`value`}]};case cg:return{name:cg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case ug:return{name:ug,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case fg:return{name:fg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case mg:return{name:mg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case gg:return{name:gg,properties:[{name:`isWildcard`,defaultValue:!1}]};case vg:return{name:vg,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case bg:return{name:bg,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const J=new Sg;let Cg;const wg=()=>Cg??=Zn(`{"$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@44"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"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@161"},"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@165"},"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@165"},"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@165"},"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@164"},"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@165"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"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@163"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"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":"Assignment","feature":"color","operator":"=","terminal":{"$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":"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@158"},"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":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"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":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"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@186"},"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@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@150"},"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@150"},"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":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"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@165"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"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@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"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@22"},"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@20"},"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@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"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@163"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElement","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"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@26"},"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@20"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","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","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$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@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@35"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"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@36"},"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@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"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@163"},"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@149"},"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@40"},"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@41"},"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@189"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Assignment","feature":"boolValue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"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@163"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"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@163"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"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@186"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"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@46"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"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@165"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"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@51"},"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@165"},"arguments":[]}},{"$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":"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@46"},"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@47"},"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@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"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@53"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"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@54"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"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@154"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"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@163"},"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@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"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@60"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"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@186"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"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@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","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","fragment":true,"name":"DynamicViewStepTarget","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@186"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewStep","returnType":{"$ref":"#/types@5"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepChain","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$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":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepSingle","returnType":{"$ref":"#/interfaces@1"},"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":"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":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"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@82"},"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@124"},"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@82"},"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@125"},"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@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"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@126"},"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@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"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@57"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"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@163"},"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@163"},"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@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"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@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"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@48"},"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@50"},"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@83"},"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@83"},"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@86"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"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@78"},"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@88"},"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@96"},"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@87"},"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@79"},"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@90"},"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@103"},"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@167"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"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@177"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"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@91"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"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@92"},"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@88"},"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@94"},"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@88"},"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@88"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$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@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}}]}]},"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@88"},"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@88"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"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@98"},"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@98"},"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@99"},"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@99"},"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@96"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"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@96"},"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":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"?"}]}]},"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@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"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@105"},"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@105"},"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@106"},"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@106"},"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@103"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"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@103"},"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":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"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@110"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"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@165"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"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@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"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@165"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"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@186"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"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@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"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@115"},"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@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"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@116/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@116/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$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@186"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@117"},"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@36"},"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@165"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"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@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"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@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"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@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"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@82"},"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@124"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"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@189"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"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@189"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"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@189"},"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@126"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"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@126"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"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@162"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":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":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$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@184"},"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@172"},"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@161"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"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":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$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@141"},"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@136"},"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@156"},"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@152"},"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@139"},"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@141"},"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@141"},"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@141"},"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@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"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@145"},"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@152"},"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@153"},"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@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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@181"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"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":"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@159"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"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@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"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@179"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"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@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"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@185"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"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@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"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@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"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"}]},"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@183"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"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@183"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"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][-\\\\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}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@110"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@112"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@46"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@118"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@41"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@55"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@53"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@22"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@149"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@80"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@145"}}]}},{"$type":"Type","name":"DynamicViewStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]}},{"$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@101/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@4/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereMetadataEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@108/definition/elements@5/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@103"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@110"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@112"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@114"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@144"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@135"}}]}}],"interfaces":[{"$type":"Interface","name":"AbstractDynamicStep","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@151"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"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@79"}}}],"superTypes":[]},{"$type":"Interface","name":"DynamicStepSingle","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}]},{"$type":"Interface","name":"DynamicStepChain","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]},"isOptional":false}]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),Tg={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},Eg={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},Dg={AstReflection:()=>new Sg},Og={Grammar:()=>wg(),LanguageMetaData:()=>Tg,parser:{ParserConfig:()=>Eg}},kg=Symbol.for(`idattr`),Ag={writeId(e,t){return e[kg]=t,e},readId(e){return e[kg]}},jg={writeId(e,t){return v(t)?e[kg]=void 0:e[kg]=t,e},readId(e){return e[kg]}};function Mg(e){return e?.textDocument.languageId===Tg.languageId}function Ng(e){return Mg(e)&&mu(e)}function Pg(e){return e?.markdown||e?.text}function Fg(e){let t=parseFloat(e);return isNaN(t)?100:Je(t,{min:0,max:100})}function Ig({value:e}){return Fg(e)}function Lg({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:F(e)}}function Rg({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:F(e)}}function zg(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case Rd(r):{let e=Bg(r);y(e)&&(n.color=e);break}case tm(r):n.line=r.value;break;case Pd(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:F(r)}break;default:F(r)}return n}function Bg(e){return e?.themeColor??e?.customColor?.$refText}function Vg(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:F(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function Hg(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:F(e)}}function Ug(e){return On(e,e=>zh(e)||uf(e)||wf(e))}const Wg=e=>pm(e)||jf(e)||ip(e)||qf(e)||vf(e)||Lf(e),Gg=e=>hm(e)||cf(e)||Zd(e)||ep(e)||qd(e);function Kg(e){for(;;){if(Gg(e)||Wg(e))return!1;if(wp(e)||_m(e))return!0;if(e.$container)e=e.$container;else return!1}}function qg(e){for(;;){if(Gg(e))return!1;if(Wg(e))return!0;if(e.$container)e=e.$container;else return!1}}function Jg(e){for(;;){if(Wg(e))return!1;if(Gg(e))return!0;if(e.$container)e=e.$container;else return!1}}function Yg(e){try{let t=yh(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 Xg(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function Zg(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function Qg(e){let t;for(;t=e.value?.ref;){if(Yd(t))return null;if(Gd(t))return t;if(v(e.parent))return null;e=e.parent}return null}function $g(e){let t=Zg(e);return t?.$type===`Imported`?t:null}function e_(e){let t;for(;t=e.value?.ref;){if(xu(t))return!0;if(v(e.parent))return!1;e=e.parent}return!1}var t_=class extends rr{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=fn(e);let r=super.createDescription(e,t,n);return pu(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},n_=class extends Vn{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,n){let r=this.services.workspace.ProjectsManager;return kn(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const r_=zi(`/`),i_=(e,t)=>r_(e.uri.path,t.uri.path);var a_=class extends Jn{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.`);let n=[...this.documentMap.values(),e].sort(i_);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e);Ng(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return Ng(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return kn(this.documentMap.values()).filter(e=>Ng(e)&&!this.projectsManager.isExcluded(e))}get all(){return kn(this.documentMap.values()).map(e=>(Ng(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return kn(this.documentMap.values()).filter(n=>Ng(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return T(this.userDocuments.toArray(),b(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),be(x(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,Ng(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},o_=t(wr(),1);const Y=K.getChild(`projects`);function s_(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function c_(e){return s_(e)?e.uri.toString():typeof e==`string`?Fr(e,{acceptRelative:!1,strict:!0})?e:_n.file(e).toString():e.toString()}const l_=zi(`/`,!0),u_=(e,t)=>l_(Ar(e.path),Ar(t.path));function d_(e){return t=>e.startsWith(Hi(t)?t:t.folder)}function f_(e,t){let n=Hi(e)?e:e.folder,r=Hi(t)?t:t.folder;return n.startsWith(r)||r.startsWith(n)}function p_(...e){return Ce(f_,e)}function m_(e,t){return t.startsWith(e.folder)||e.includePaths?.some(d_(t))?!h_(e,t):!1}function h_(e,t){return e.exclude?.(Rr(t))??!1}function g_(...e){return Ce(m_,e)}function __(...e){return Ce(h_,e)}function v_(e){return e=c_(e),Ir(e)}const y_=(e,t)=>u_(e.folderUri,t.folderUri);function b_(e){return e.sort(y_)}const x_={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,o_.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function S_(e){return x_.exclude(Rr(e))}function C_(e){if(`configUri`in e){P(!ve(e.configUri),`configUri is emptyish`);let t=_n.isUri(e.configUri)?e.configUri:_n.parse(c_(e.configUri)),n=v_(mn.dirname(t));return{configUri:t,folder:n,folderUri:_n.parse(n)}}P(!ve(e.folderUri),`folderUri is emptyish`);let t=v_(e.folderUri),n=_n.parse(t);return{configUri:mn.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var w_=class e{static DefaultProjectId=x_.id;#e=[];#t=void 0;#n=[];#r=new E.default(t=>{if(t===e.DefaultProjectId){let e=this.getWorkspaceFolder(),n=mn.joinPath(e,`likec4.config.json`),r=v_(e);return{id:t,config:x_.config,folder:r,folderUri:_n.parse(r),configUri:n,exclude:x_.exclude,includeConfig:{...x_.includeConfig}}}return N(this.#n.find(e=>e.id===t),`Project ${t} not found`)});#i=new E.default(e=>{let t=c_(e),n=this.#a.get(t);return n?__(n,t)?!this.#n.some(g_(t)):!1:S_(t)});#a=new E.default(e=>{let t=d_(e);return this.#n.find(t)??this.#n.find(g_(e))??null});constructor(e){this.services=e,Y.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#n.length>1))return C(this.#n,1)?this.#n[0].id:e.DefaultProjectId}set defaultProjectId(t){if(t!==this.#t){if(this.#t=void 0,!t||t===e.DefaultProjectId){Y.debug`reset default project ID`;return}P(this.#n.find(e=>e.id===t),`Project "${t}" not found`),Y.debug`set default project ID to ${t}`,this.#t=t}}get default(){return this.#r.get(this.defaultProjectId??e.DefaultProjectId)}get all(){if(C(this.#n,1)){let e=[...b(this.#n,x(`id`)),x_.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[x_.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId??this.ownerProjectId(e);return this.#r.get(t)}findOverlaped(e){let t=p_(v_(e));return this.#n.filter(e=>t(e)||!!e.includePaths&&!!Ie(e.includePaths,t))}ensureProjectId(t){return t===e.DefaultProjectId?this.defaultProjectId??e.DefaultProjectId:t?(P(this.#n.some(e=>t===e.id),`Project ID ${t} is not registered`),t):N(this.defaultProjectId,()=>`Specify exact project, known: [${b(this.#n,x(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#n.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return s_(t)&&pu(t)?!0:e.length===1?this.#i.get(c_(t)):__(this.#r.get(e[0]),c_(t))}isIncluded(t,n){let r=c_(n);return C(this.#n,1)?t===e.DefaultProjectId?!this.#a.get(r)&&!S_(r):g_(this.#r.get(t),c_(n)):!S_(r)}async registerConfigFile(e,t){if(S_(c_(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by: ${x_.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:n,configUri:e},t)}catch(t){if(!yn(t))throw ts(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=Yl.validate(e.config),{configUri:r,folder:i,folderUri:a}=C_(e),o=Yl.normalizeInclude(n.include),s=this.#n.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(Y.info`project name changed from ${s.config.name} to ${n.name}`,Y.info`unregistering ${s.id}`,s.id=this.uniqueProjectId(n.name),Y.info`register ${s.id}`),this.warnIfConfigOverride(s,r),s.config=n,s.folder=i,s.folderUri=a,s.configUri=r,s.includeConfig=o):(s={id:this.uniqueProjectId(n.name),config:n,folder:i,configUri:r,folderUri:a,includeConfig:o},this.#n=b_([...this.#n,s]),Y.info`register ${s.id}`),M_(()=>this.updateIncludesExcludes(s)),this.#o?s:(this.resetCaches(),this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>yn(e)?Promise.reject(e):(Y.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(t){return this.#a.get(c_(t))?.id??this.#t??e.DefaultProjectId}#o=null;async reloadProjects(e){return this.#o?(Y.debug`reload projects is already in progress, waiting`,await this.#o.catch(()=>{})):(Y.debug`schedule reload projects`,this.#o=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(yn(e)||Y.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#o=null,this.notifyListeners()}),await this.#o)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Y.warn(`Failed to reloadProjects, no workspace folders found`);return}Y.debug`start reload projects`;let n=[];for(let e of t){let t=_n.parse(e.uri);Y.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)Y.debug`found config ${mn.relative(t,r.uri)}`,n.push(r.uri)}catch(e){Y.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#n.length===0){Y.warning(`No config files found`);return}Y.warning(`no config files found, but {count} projects were registered before`,{count:this.#n.length}),Y.warning(`reset`)}n.sort(u_);let r=new Map(this.#n.map(e=>[e.configUri.toString(),e]));this.#n=[],this.#r.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){Y.warn(U(t));let n=r.get(e.toString());n&&(Y.debug`Update failed, restore project ${n.id}`,await this.registerProject(n).catch(e=>{Y.warn(`fail to restore project ${n.id}, ignoring`,{error:e})}))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(b(this.#n,x(`id`))),n=e;if(!t.has(n))return n;Y.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){Y.trace(`resetCaches`),this.#t&&!this.#n.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#r.clear(),this.#a.clear(),this.#i.clear()}async rebuildProject(t,n){let r=this.#n.find(e=>e.id===t);if(!r)return t===e.DefaultProjectId?Y.info`Rebuilding all documents `:Y.warn`Project ${t} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(n);let i=Y.getChild(r.id),a=this.services.workspace.LangiumDocuments.userDocuments.filter(e=>g_(r,c_(e))).map(e=>e.uri).toArray();if(a.length===0){i.debug`no documents found for project ${r.id}, skipping rebuild`;return}i.info(`rebuild project documents: {docs}`,{docs:a.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(a,[],n).catch(e=>{i.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#n)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),Wn.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 Y.warn(`Failed to get workspace URI, using default folder`,{error:e}),_n.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){Y.warn(U(e))}}updateIncludesExcludes(e){let t=e.config;switch(delete e.includePaths,delete e.exclude,!0){case v(t.exclude):e.exclude=x_.exclude;break;case t.exclude&&C(t.exclude,1):e.exclude=(0,o_.default)(b(t.exclude,t=>(!jr(t)&&!t.startsWith(`**`)&&(t=Pr(`**`,t)),Lr(Or(e.folderUri.path,t)))),{contains:!0,dot:!0});break}let n=e.includeConfig.paths;if(!C(n,1))return e;e.includePaths=b(n,t=>{let n=mn.resolvePath(e.folderUri,t);return{uri:n,folder:v_(n)}}),Y.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let n of this.#n)n.id!==e.id&&(p_(t,n)&&Y.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:n.id}),n.includePaths?.forEach(r=>{p_(t,r)&&Y.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:n.id,otherIncludePath:r.folder})}));return e}warnIfConfigOverride(e,t){try{let[n,r]=b([e.configUri,t],mn.basename);n!==r&&Y.warn`config ${r} overrides ${n} in folder ${e.folder}`}catch{}}};function T_(e){return Tg.fileExtensions.some(t=>e!==t&&e.endsWith(t))}function E_(e){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(e)}const D_=zi(`/`);function O_(e,t){return D_(e.uri.path,t.uri.path)}var k_=class extends Rn{documentFactory;fileSystemProvider;#e=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.documentFactory=e.workspace.LangiumDocumentFactory,this.fileSystemProvider=e.workspace.FileSystemProvider}async performStartup(e){this.folders??=e;let t=[];for(let n of e)try{let e=_n.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){q(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri)}catch(e){q(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(uu,_n.parse(fu)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=0,i=[];for(let{projectId:e,includePath:t,includeConfig:r}of n)try{K.debug`scanning include path ${t.fsPath} for project ${e}`;let n=await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:r.maxDepth});i.push(...n),n.length===0&&K.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){K.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of Fe(i,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),r++}catch(t){K.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&r>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));r>e?K.warn(`Loaded ${r} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):K.info`loaded ${r} total files from ${n.length} include paths`}}includeEntry(e,t,n){let r=mn.basename(t.uri);return t.isDirectory?!E_(r):t.isFile?(n.fileExtensions.includes(mn.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcluded(t.uri):!1}workspace(){return this.folders&&C(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();K.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){let e=this.workspace();return P(e,`Workspace not initialized`),_n.parse(e.uri)}get workspaceURL(){let e=this.workspace();return P(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of this.#e)e();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#e.push(e),Wn.create(()=>{this.#e=this.#e.filter(t=>t!==e)})}};function A_(e){if(Vp(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;P(Up(e))}if(Up(e))return e.project;let t=dr(e)?fn(e):e;return t.likec4ProjectId?t.likec4ProjectId:(K.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,w_.DefaultProjectId)}function j_(...e){return Aa(e.length>1?e.join(`:::`):e[0])}function M_(e){try{return e()}catch(e){K.trace(`Safe call failed`,{error:e});return}}function N_(){try{return globalThis.performance.now()}catch{return Date.now()}}function P_(){let e=N_();return{get ms(){return N_()-e},get pretty(){return Dr(N_()-e)}}}const F_=K.getChild(`manual-layouts`),I_=`.likec4.snap`,L_=e=>e.endsWith(I_);function R_(e){return`${e}${I_}`}function z_(e){let t=mn.basename(e);return L_(t)?t.slice(0,-12):null}function B_(e){return mn.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const V_={manualLayouts:e=>new U_(e)},H_=`file://./`;var U_=class{cache;listeners=[];#e=$t(1);constructor(e){this.services=e,this.cache=new Fn,xa(()=>{e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async handleFileSystemUpdate(e){let t=e.update??e.delete,n=z_(t)??void 0,r=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(r),`delete`in e){this.triggerUpdate(z({removed:t,projectId:r,viewId:n}));return}let i=this.services.workspace.ProjectsManager.getProject(r);if(!n){let e=await this.readSnapshot(t,i);e?n=e.id:(F_.error(`File ${t} does not exist or is not a valid manual layout file`),n=`index`)}this.triggerUpdate({updated:t,projectId:r,viewId:n})}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=F_.getChild(e.id),n=this.services.workspace.FileSystemProvider,r=B_(e),i=[];try{let a=await n.scanDirectory(r,L_);if(a.length===0)return null;for(let r of a)try{let t=await n.readFile(r.uri),a=yr.parse(t),o=this.resolveIconPathsAfterRead(a,e.folderUri);i.push({...o,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${r.uri.fsPath}`,{err:e})}i.length&&t.trace`read manual layouts for ${e.id}, found ${i.length}`}catch(n){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:n})}if(i.length===0)return null;let a=ue(i,x(`id`));return{hash:ka(a),views:a}}async readSnapshot(e,t){let n=this.services.workspace.FileSystemProvider;try{let r=await n.readFile(e),i=yr.parse(r);if(!t){let n=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(n)}return{...this.resolveIconPathsAfterRead(i,t.folderUri),_layout:`manual`}}catch(t){return F_.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 t;let n=await this.readManualLayouts(e);return this.cache.set(e.id,n),n})}async write(e,t){this.cache.delete(e.id);let n=F_.getChild(e.id),r=B_(e),i=mn.joinPath(r,R_(t.id));if(`manualLayout`in t){let{manualLayout:e,...n}=t;t=n}let a=yr.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),o={uri:i.toString(),range:Ln.create(lr.create(0,0),lr.create(a.split(`
53
55
  `).length-1,1))};n.debug`write snapshot of ${t.id} in project ${e.id} to ${i.fsPath}`;let s=this.services.workspace.FileSystemProvider;try{await s.writeFile(i,a+`
54
- `)}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}return o}async remove(e,t){this.cache.delete(e.id);let n=wu.getChild(e.id),r=Du(e),i=Sn.joinPath(r,Eu(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:tr.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(i))return n.warn`Snapshot ${t} did not exist at ${i.fsPath}`,null}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}return a}clearCaches(){wu.trace`clear caches`,this.cache.clear()}normalizeIconPathsForWrite(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let n=fn.parse(e.icon),r=Sn.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${ku}${r}`}}return e});return{...e,nodes:n}}resolveIconPathsAfterRead(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(ku)){let n=e.icon.substring(9),r=Sn.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const ju=`AnyProperty`;function Mu(e){return J.isInstance(e,ju)}const Nu=`ColorLiteral`;function Pu(e){return J.isInstance(e,Nu)}const Fu=`DeploymentElement`;function Iu(e){return J.isInstance(e,Fu)}const Lu=`DeploymentNodeOrElementKind`,Ru=`DeploymentViewRule`;function zu(e){return J.isInstance(e,Ru)}const Bu=`DynamicViewProperty`,Vu=`DynamicViewRule`;function Hu(e){return J.isInstance(e,Vu)}const Uu=`DynamicViewStep`;function Wu(e){return J.isInstance(e,Uu)}const Gu=`ElementProperty`;function Ku(e){return J.isInstance(e,Gu)}const qu=`ExpressionV2`;function Ju(e){return J.isInstance(e,qu)}const Yu=`ExtendElementProperty`,Xu=`ExtendRelationProperty`,Zu=`FqnExpr`;function Qu(e){return J.isInstance(e,Zu)}const $u=`FqnExprOrWhere`;function ed(e){return J.isInstance(e,$u)}const td=`FqnExprOrWith`;function nd(e){return J.isInstance(e,td)}const rd=`FqnReferenceable`,id=`LikeC4View`;function ad(e){return J.isInstance(e,id)}const od=`MetadataProperty`;function sd(e){return J.isInstance(e,od)}const cd=`MetadataValue`,ld=`ModelReferenceable`,ud=`Referenceable`,dd=`RelationExpr`;function fd(e){return J.isInstance(e,dd)}const pd=`RelationExprOrWhere`;function md(e){return J.isInstance(e,pd)}const hd=`RelationExprOrWith`;function gd(e){return J.isInstance(e,hd)}const _d=`RelationProperty`,vd=`RelationshipStyleProperty`;function yd(e){return J.isInstance(e,vd)}const bd=`SizeProperty`;function xd(e){return J.isInstance(e,bd)}const Sd=`StringProperty`;function Cd(e){return J.isInstance(e,Sd)}const wd=`StyleProperty`;function Td(e){return J.isInstance(e,wd)}const Ed=`ViewProperty`;function Dd(e){return J.isInstance(e,Ed)}const Od=`ViewRule`;function kd(e){return J.isInstance(e,Od)}const Ad=`ViewRuleStyleOrGlobalRef`;function jd(e){return J.isInstance(e,Ad)}const Md=`WhereElement`;function Nd(e){return J.isInstance(e,Md)}const Pd=`WhereElementExpression`;function Fd(e){return J.isInstance(e,Pd)}const Id=`WhereExpression`,Ld=`WhereKindEqual`;function Rd(e){return J.isInstance(e,Ld)}const zd=`WhereRelation`;function Bd(e){return J.isInstance(e,zd)}const Vd=`WhereRelationExpression`;function Hd(e){return J.isInstance(e,Vd)}const Ud=`WhereTagEqual`;function Wd(e){return J.isInstance(e,Ud)}const Gd=`AbstractDynamicStep`,Kd=`ArrowProperty`;function qd(e){return J.isInstance(e,Kd)}const Jd=`BorderProperty`;function Yd(e){return J.isInstance(e,Jd)}const Xd=`ColorProperty`;function Zd(e){return J.isInstance(e,Xd)}const Qd=`CustomColor`,$d=`CustomElementProperties`;function ef(e){return J.isInstance(e,$d)}const tf=`CustomRelationProperties`;function nf(e){return J.isInstance(e,tf)}const rf=`DeployedInstance`;function af(e){return J.isInstance(e,rf)}const of=`DeployedInstanceBody`;function sf(e){return J.isInstance(e,of)}const cf=`DeploymentNode`;function lf(e){return J.isInstance(e,cf)}const uf=`DeploymentNodeBody`;function df(e){return J.isInstance(e,uf)}const ff=`DeploymentNodeKind`;function pf(e){return J.isInstance(e,ff)}const mf=`DeploymentRelation`;function hf(e){return J.isInstance(e,mf)}const gf=`DeploymentRelationBody`;function _f(e){return J.isInstance(e,gf)}const vf=`DeploymentView`;function yf(e){return J.isInstance(e,vf)}const bf=`DeploymentViewBody`;function xf(e){return J.isInstance(e,bf)}const Sf=`DeploymentViewRulePredicate`;function Cf(e){return J.isInstance(e,Sf)}const wf=`DeploymentViewRuleStyle`;function Tf(e){return J.isInstance(e,wf)}const Ef=`DirectedRelationExpr`;function Df(e){return J.isInstance(e,Ef)}const Of=`DynamicView`;function kf(e){return J.isInstance(e,Of)}const Af=`DynamicViewBody`;function jf(e){return J.isInstance(e,Af)}const Mf=`DynamicViewDisplayVariantProperty`;function Nf(e){return J.isInstance(e,Mf)}const Pf=`DynamicViewGlobalPredicateRef`;function Ff(e){return J.isInstance(e,Pf)}const If=`DynamicViewIncludePredicate`;function Lf(e){return J.isInstance(e,If)}const Rf=`DynamicViewParallelSteps`;function zf(e){return J.isInstance(e,Rf)}const Bf=`DynamicViewRef`,Vf=`Element`;function Hf(e){return J.isInstance(e,Vf)}const Uf=`ElementBody`;function Wf(e){return J.isInstance(e,Uf)}const Gf=`ElementKind`;function Kf(e){return J.isInstance(e,Gf)}const qf=`ElementKindExpression`;function Jf(e){return J.isInstance(e,qf)}const Yf=`ElementRef`;function Xf(e){return J.isInstance(e,Yf)}const Zf=`ElementStringProperty`;function Qf(e){return J.isInstance(e,Zf)}const $f=`ElementStyleProperty`;function ep(e){return J.isInstance(e,$f)}const tp=`ElementTagExpression`;function np(e){return J.isInstance(e,tp)}const rp=`ElementView`;function ip(e){return J.isInstance(e,rp)}const ap=`ElementViewBody`;function op(e){return J.isInstance(e,ap)}const sp=`ElementViewRef`,cp=`Expressions`;function lp(e){return J.isInstance(e,cp)}const up=`ExtendDeployment`;function dp(e){return J.isInstance(e,up)}const fp=`ExtendDeploymentBody`;function pp(e){return J.isInstance(e,fp)}const mp=`ExtendElement`;function hp(e){return J.isInstance(e,mp)}const gp=`ExtendElementBody`;function _p(e){return J.isInstance(e,gp)}const vp=`ExtendRelation`;function yp(e){return J.isInstance(e,vp)}const bp=`ExtendRelationBody`;function xp(e){return J.isInstance(e,bp)}const Sp=`FqnExpressions`;function Cp(e){return J.isInstance(e,Sp)}const wp=`FqnExprWhere`;function Tp(e){return J.isInstance(e,wp)}const Ep=`FqnExprWith`;function Dp(e){return J.isInstance(e,Ep)}const Op=`FqnRef`;function kp(e){return J.isInstance(e,Op)}const Ap=`FqnRefExpr`;function jp(e){return J.isInstance(e,Ap)}const Mp=`GlobalDynamicPredicateGroup`;function Np(e){return J.isInstance(e,Mp)}const Pp=`GlobalPredicateGroup`;function Fp(e){return J.isInstance(e,Pp)}const Ip=`Globals`;function Lp(e){return J.isInstance(e,Ip)}const Rp=`GlobalStyle`;function zp(e){return J.isInstance(e,Rp)}const Bp=`GlobalStyleGroup`;function Vp(e){return J.isInstance(e,Bp)}const Hp=`GlobalStyleId`,Up=`HexColor`;function Wp(e){return J.isInstance(e,Up)}const Gp=`IconColorProperty`;function Kp(e){return J.isInstance(e,Gp)}const qp=`IconPositionProperty`;function Jp(e){return J.isInstance(e,qp)}const Yp=`IconProperty`;function Xp(e){return J.isInstance(e,Yp)}const Zp=`IconSizeProperty`;function Qp(e){return J.isInstance(e,Zp)}const $p=`Imported`;function em(e){return J.isInstance(e,$p)}const tm=`ImportsFromPoject`;function nm(e){return J.isInstance(e,tm)}const rm=`IncomingRelationExpr`;function im(e){return J.isInstance(e,rm)}const am=`InOutRelationExpr`;function om(e){return J.isInstance(e,am)}const sm=`LibIcon`;function cm(e){return J.isInstance(e,sm)}const lm=`LikeC4Grammar`;function um(e){return J.isInstance(e,lm)}const dm=`LikeC4Lib`;function fm(e){return J.isInstance(e,dm)}const pm=`LineProperty`;function mm(e){return J.isInstance(e,pm)}const hm=`LinkProperty`;function gm(e){return J.isInstance(e,hm)}const _m=`MarkdownOrString`;function vm(e){return J.isInstance(e,_m)}const ym=`MetadataArray`;function bm(e){return J.isInstance(e,ym)}const xm=`MetadataAttribute`;function Sm(e){return J.isInstance(e,xm)}const Cm=`MetadataBody`;function wm(e){return J.isInstance(e,Cm)}const Tm=`Model`;function Em(e){return J.isInstance(e,Tm)}const Dm=`ModelDeployments`;function Om(e){return J.isInstance(e,Dm)}const km=`ModelViews`;function Am(e){return J.isInstance(e,km)}const jm=`MultipleProperty`;function Mm(e){return J.isInstance(e,jm)}const Nm=`NavigateToProperty`;function Pm(e){return J.isInstance(e,Nm)}const Fm=`NotationProperty`;function Im(e){return J.isInstance(e,Fm)}const Lm=`NotesProperty`;function Rm(e){return J.isInstance(e,Lm)}const zm=`OpacityProperty`;function Bm(e){return J.isInstance(e,zm)}const Vm=`OutgoingRelationExpr`;function Hm(e){return J.isInstance(e,Vm)}const Um=`PaddingSizeProperty`;function Wm(e){return J.isInstance(e,Um)}const Gm=`Relation`;function Km(e){return J.isInstance(e,Gm)}const qm=`RelationBody`;function Jm(e){return J.isInstance(e,qm)}const Ym=`RelationExprWhere`;function Xm(e){return J.isInstance(e,Ym)}const Zm=`RelationExprWith`;function Qm(e){return J.isInstance(e,Zm)}const $m=`RelationKindDotRef`;function eh(e){return J.isInstance(e,$m)}const th=`RelationNavigateToProperty`;function nh(e){return J.isInstance(e,th)}const rh=`RelationshipKind`;function ih(e){return J.isInstance(e,rh)}const ah=`RelationStringProperty`;function oh(e){return J.isInstance(e,ah)}const sh=`RelationStyleProperty`;function ch(e){return J.isInstance(e,sh)}const lh=`RGBAColor`;function uh(e){return J.isInstance(e,lh)}const dh=`ShapeProperty`;function fh(e){return J.isInstance(e,dh)}const ph=`ShapeSizeProperty`;function mh(e){return J.isInstance(e,ph)}const hh=`SpecificationColor`;function gh(e){return J.isInstance(e,hh)}const _h=`SpecificationDeploymentNodeKind`;function vh(e){return J.isInstance(e,_h)}const yh=`SpecificationElementKind`;function bh(e){return J.isInstance(e,yh)}const xh=`SpecificationElementStringProperty`;function Sh(e){return J.isInstance(e,xh)}const Ch=`SpecificationRelationshipKind`;function wh(e){return J.isInstance(e,Ch)}const Th=`SpecificationRelationshipStringProperty`;function Eh(e){return J.isInstance(e,Th)}const Dh=`SpecificationRule`;function Oh(e){return J.isInstance(e,Dh)}const kh=`SpecificationTag`;function Ah(e){return J.isInstance(e,kh)}const jh=`StrictFqnElementRef`;function Mh(e){return J.isInstance(e,jh)}const Nh=`StrictFqnRef`;function Ph(e){return J.isInstance(e,Nh)}function Fh(e){return J.isInstance(e,`Tag`)}const Ih=`TagRef`;function Lh(e){return J.isInstance(e,Ih)}const Rh=`Tags`;function zh(e){return J.isInstance(e,Rh)}const Bh=`TextSizeProperty`;function Vh(e){return J.isInstance(e,Bh)}const Hh=`ViewRef`,Uh=`ViewRuleAutoLayout`;function Wh(e){return J.isInstance(e,Uh)}const Gh=`ViewRuleGlobalPredicateRef`;function Kh(e){return J.isInstance(e,Gh)}const qh=`ViewRuleGlobalStyle`;function Jh(e){return J.isInstance(e,qh)}const Yh=`ViewRuleGroup`;function Xh(e){return J.isInstance(e,Yh)}const Zh=`ViewRulePredicate`;function Qh(e){return J.isInstance(e,Zh)}const $h=`ViewRuleRank`;function eg(e){return J.isInstance(e,$h)}const tg=`ViewRuleStyle`;function ng(e){return J.isInstance(e,tg)}const rg=`ViewStringProperty`;function ig(e){return J.isInstance(e,rg)}const ag=`WhereBinaryExpression`;function og(e){return J.isInstance(e,ag)}const sg=`WhereElementKind`;function cg(e){return J.isInstance(e,sg)}const lg=`WhereElementNegation`;function ug(e){return J.isInstance(e,lg)}const dg=`WhereElementTag`;function fg(e){return J.isInstance(e,dg)}const pg=`WhereRelationKind`;function mg(e){return J.isInstance(e,pg)}const hg=`WhereRelationNegation`;function gg(e){return J.isInstance(e,hg)}const _g=`WhereRelationParticipantKind`;function vg(e){return J.isInstance(e,_g)}const yg=`WhereRelationParticipantTag`;function bg(e){return J.isInstance(e,yg)}const xg=`WhereRelationTag`;function Sg(e){return J.isInstance(e,xg)}const Cg=`WildcardExpression`;function wg(e){return J.isInstance(e,Cg)}const Tg=`DynamicStepChain`;function Eg(e){return J.isInstance(e,Tg)}const Dg=`DynamicStepSingle`;function Og(e){return J.isInstance(e,Dg)}var kg=class extends Cn{getAllTypes(){return[Gd,ju,Kd,Jd,Nu,Xd,Qd,$d,tf,rf,of,Fu,cf,uf,ff,Lu,mf,gf,vf,bf,Ru,Sf,wf,Ef,Tg,Dg,Of,Af,Mf,Pf,If,Rf,Bu,Bf,Vu,Uu,Vf,Uf,Gf,qf,Gu,Yf,Zf,$f,tp,rp,ap,sp,qu,cp,up,fp,mp,gp,Yu,vp,bp,Xu,Zu,$u,td,wp,Ep,Sp,Op,Ap,rd,Mp,Pp,Rp,Bp,Hp,Ip,Up,Gp,qp,Yp,Zp,$p,tm,am,rm,sm,lm,dm,id,pm,hm,_m,ym,xm,Cm,od,cd,Tm,Dm,ld,km,jm,Nm,Fm,Lm,zm,Vm,Um,lh,ud,Gm,qm,dd,pd,hd,Ym,Zm,$m,th,_d,ah,sh,rh,vd,dh,ph,bd,hh,_h,yh,xh,Ch,Th,Dh,kh,jh,Nh,Sd,wd,`Tag`,Ih,Rh,Bh,Ed,Hh,Od,Uh,Gh,qh,Yh,Zh,$h,tg,Ad,rg,ag,Md,Pd,sg,lg,dg,Id,Ld,zd,Vd,pg,hg,_g,yg,xg,Ud,Cg]}computeIsSubtype(e,t){switch(e){case Kd:case pm:return this.isSubtype(vd,t);case Jd:case Gp:case qp:case jm:case zm:case dh:return this.isSubtype(wd,t);case Xd:return this.isSubtype(vd,t)||this.isSubtype(wd,t);case rf:case cf:return this.isSubtype(Fu,t)||this.isSubtype(ud,t);case ff:case Gf:return this.isSubtype(Lu,t);case vf:case Of:case rp:return this.isSubtype(id,t);case Sf:case wf:return this.isSubtype(Ru,t);case Ef:case rm:case am:case Vm:return this.isSubtype(dd,t);case Tg:case Dg:return this.isSubtype(Gd,t)||this.isSubtype(Uu,t);case Mf:return this.isSubtype(Bu,t);case Pf:case If:return this.isSubtype(Vu,t);case Bu:case Gu:case Nm:case _d:case vd:case Sd:case wd:return this.isSubtype(ju,t);case Vf:return this.isSubtype(rd,t)||this.isSubtype(ld,t)||this.isSubtype(ud,t);case qf:case tp:case Ap:case Cg:return this.isSubtype(Zu,t);case Zf:return this.isSubtype(Gu,t)||this.isSubtype(Sd,t);case $f:return this.isSubtype(Gu,t);case up:case mp:case ud:return this.isSubtype(rd,t);case Zu:case wp:return this.isSubtype($u,t);case $u:case Ep:return this.isSubtype(td,t);case td:case hd:return this.isSubtype(qu,t);case Up:case lh:return this.isSubtype(Nu,t);case Yp:return this.isSubtype(Gu,t)||this.isSubtype(wd,t);case Zp:case Um:case ph:case Bh:return this.isSubtype(bd,t)||this.isSubtype(wd,t);case $p:return this.isSubtype(ld,t)||this.isSubtype(ud,t);case hm:return this.isSubtype(Gu,t)||this.isSubtype(Yu,t)||this.isSubtype(Xu,t)||this.isSubtype(_d,t)||this.isSubtype(Ed,t);case _m:case ym:return this.isSubtype(cd,t);case xm:case xh:case Th:return this.isSubtype(Sd,t);case Cm:return this.isSubtype(od,t);case od:return this.isSubtype(Gu,t)||this.isSubtype(Yu,t)||this.isSubtype(Xu,t)||this.isSubtype(_d,t);case Fm:case Lm:return this.isSubtype(ju,t)||this.isSubtype(Sd,t);case dd:case Ym:return this.isSubtype(pd,t);case pd:case Zm:return this.isSubtype(hd,t);case th:case sh:return this.isSubtype(_d,t);case ah:return this.isSubtype(_d,t)||this.isSubtype(Sd,t);case Ed:return this.isSubtype(ju,t)||this.isSubtype(Bu,t);case Uh:return this.isSubtype(Ru,t)||this.isSubtype(Vu,t)||this.isSubtype(Od,t);case Gh:case Yh:case Zh:case $h:return this.isSubtype(Od,t);case qh:case tg:return this.isSubtype(Ad,t);case Ad:return this.isSubtype(Vu,t)||this.isSubtype(Od,t);case rg:return this.isSubtype(Sd,t)||this.isSubtype(Ed,t);case ag:return this.isSubtype(Pd,t)||this.isSubtype(Vd,t);case Md:case lg:return this.isSubtype(Pd,t);case Pd:case Vd:return this.isSubtype(Id,t);case sg:return this.isSubtype(Md,t)||this.isSubtype(Ld,t);case dg:return this.isSubtype(Md,t)||this.isSubtype(Ud,t);case zd:case hg:return this.isSubtype(Vd,t);case pg:case _g:return this.isSubtype(Ld,t)||this.isSubtype(zd,t);case yg:case xg:return this.isSubtype(zd,t)||this.isSubtype(Ud,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractDynamicStep:kind`:case`DeploymentRelation:kind`:case`DynamicStepChain:kind`:case`DynamicStepSingle:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`WhereRelationKind:value`:return rh;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return Qd;case`DeploymentNode:kind`:return ff;case`DynamicViewGlobalPredicateRef:predicate`:return Mp;case`DynamicViewRef:view`:return Of;case`Element:kind`:case`ElementKindExpression:kind`:return Gf;case`ElementViewRef:view`:return rp;case`FqnRef:value`:case`StrictFqnRef:value`:return ud;case`IconProperty:libicon`:return sm;case`Imported:imported`:case`StrictFqnElementRef:el`:return Vf;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return id;case`ViewRuleGlobalPredicateRef:predicate`:return Pp;case`ViewRuleGlobalStyle:style`:return Hp;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Lu;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Gd:return{name:Gd,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case Kd:return{name:Kd,properties:[{name:`key`},{name:`value`}]};case Jd:return{name:Jd,properties:[{name:`key`},{name:`value`}]};case Xd:return{name:Xd,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Qd:return{name:Qd,properties:[{name:`name`}]};case $d:return{name:$d,properties:[{name:`props`,defaultValue:[]}]};case tf:return{name:tf,properties:[{name:`props`,defaultValue:[]}]};case rf:return{name:rf,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case of:return{name:of,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case cf:return{name:cf,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case uf:return{name:uf,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ff:return{name:ff,properties:[{name:`name`}]};case mf:return{name:mf,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case gf:return{name:gf,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case vf:return{name:vf,properties:[{name:`body`},{name:`name`}]};case bf:return{name:bf,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Sf:return{name:Sf,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case wf:return{name:wf,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Ef:return{name:Ef,properties:[{name:`source`},{name:`target`}]};case Of:return{name:Of,properties:[{name:`body`},{name:`name`}]};case Af:return{name:Af,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case Mf:return{name:Mf,properties:[{name:`key`},{name:`value`}]};case Pf:return{name:Pf,properties:[{name:`predicate`}]};case If:return{name:If,properties:[{name:`exprs`}]};case Rf:return{name:Rf,properties:[{name:`steps`,defaultValue:[]}]};case Bf:return{name:Bf,properties:[{name:`view`}]};case Vf:return{name:Vf,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case Uf:return{name:Uf,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Gf:return{name:Gf,properties:[{name:`name`}]};case qf:return{name:qf,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case Yf:return{name:Yf,properties:[{name:`modelElement`}]};case Zf:return{name:Zf,properties:[{name:`key`},{name:`value`}]};case $f:return{name:$f,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case tp:return{name:tp,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case rp:return{name:rp,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case ap:return{name:ap,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case sp:return{name:sp,properties:[{name:`view`}]};case cp:return{name:cp,properties:[{name:`prev`},{name:`value`}]};case up:return{name:up,properties:[{name:`body`},{name:`deploymentNode`}]};case fp:return{name:fp,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case mp:return{name:mp,properties:[{name:`body`},{name:`element`}]};case gp:return{name:gp,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case vp:return{name:vp,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case bp:return{name:bp,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Sp:return{name:Sp,properties:[{name:`prev`},{name:`value`}]};case wp:return{name:wp,properties:[{name:`subject`},{name:`where`}]};case Ep:return{name:Ep,properties:[{name:`custom`},{name:`subject`}]};case Op:return{name:Op,properties:[{name:`parent`},{name:`value`}]};case Ap:return{name:Ap,properties:[{name:`ref`},{name:`selector`}]};case Mp:return{name:Mp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Pp:return{name:Pp,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Ip:return{name:Ip,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Rp:return{name:Rp,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case Bp:return{name:Bp,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Hp:return{name:Hp,properties:[{name:`name`}]};case Up:return{name:Up,properties:[{name:`hex`}]};case Gp:return{name:Gp,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case qp:return{name:qp,properties:[{name:`key`},{name:`value`}]};case Yp:return{name:Yp,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Zp:return{name:Zp,properties:[{name:`key`},{name:`value`}]};case $p:return{name:$p,properties:[{name:`imported`},{name:`prev`}]};case tm:return{name:tm,properties:[{name:`imports`},{name:`project`}]};case rm:return{name:rm,properties:[{name:`to`}]};case am:return{name:am,properties:[{name:`inout`}]};case sm:return{name:sm,properties:[{name:`name`}]};case lm:return{name:lm,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case dm:return{name:dm,properties:[{name:`icons`,defaultValue:[]}]};case pm:return{name:pm,properties:[{name:`key`},{name:`value`}]};case hm:return{name:hm,properties:[{name:`key`},{name:`title`},{name:`value`}]};case _m:return{name:_m,properties:[{name:`markdown`},{name:`text`}]};case ym:return{name:ym,properties:[{name:`values`,defaultValue:[]}]};case xm:return{name:xm,properties:[{name:`key`},{name:`value`}]};case Cm:return{name:Cm,properties:[{name:`props`,defaultValue:[]}]};case Tm:return{name:Tm,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Dm:return{name:Dm,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case km:return{name:km,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case jm:return{name:jm,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Nm:return{name:Nm,properties:[{name:`key`},{name:`value`}]};case Fm:return{name:Fm,properties:[{name:`key`},{name:`value`}]};case Lm:return{name:Lm,properties:[{name:`key`},{name:`value`}]};case zm:return{name:zm,properties:[{name:`key`},{name:`value`}]};case Vm:return{name:Vm,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case Um:return{name:Um,properties:[{name:`key`},{name:`value`}]};case Gm:return{name:Gm,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case qm:return{name:qm,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Ym:return{name:Ym,properties:[{name:`subject`},{name:`where`}]};case Zm:return{name:Zm,properties:[{name:`custom`},{name:`subject`}]};case $m:return{name:$m,properties:[{name:`kind`}]};case th:return{name:th,properties:[{name:`key`},{name:`value`}]};case rh:return{name:rh,properties:[{name:`name`}]};case ah:return{name:ah,properties:[{name:`key`},{name:`value`}]};case sh:return{name:sh,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case lh:return{name:lh,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case dh:return{name:dh,properties:[{name:`key`},{name:`value`}]};case ph:return{name:ph,properties:[{name:`key`},{name:`value`}]};case hh:return{name:hh,properties:[{name:`color`},{name:`name`}]};case _h:return{name:_h,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case yh:return{name:yh,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case xh:return{name:xh,properties:[{name:`key`},{name:`value`}]};case Ch:return{name:Ch,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case Th:return{name:Th,properties:[{name:`key`},{name:`value`}]};case Dh:return{name:Dh,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case kh:return{name:kh,properties:[{name:`color`},{name:`tag`}]};case jh:return{name:jh,properties:[{name:`el`},{name:`parent`}]};case Nh:return{name:Nh,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Ih:return{name:Ih,properties:[{name:`tag`}]};case Rh:return{name:Rh,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Bh:return{name:Bh,properties:[{name:`key`},{name:`value`}]};case Hh:return{name:Hh,properties:[{name:`view`}]};case Uh:return{name:Uh,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case Gh:return{name:Gh,properties:[{name:`predicate`}]};case qh:return{name:qh,properties:[{name:`style`}]};case Yh:return{name:Yh,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Zh:return{name:Zh,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case $h:return{name:$h,properties:[{name:`targets`},{name:`value`}]};case tg:return{name:tg,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case rg:return{name:rg,properties:[{name:`key`},{name:`value`}]};case ag:return{name:ag,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case sg:return{name:sg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case lg:return{name:lg,properties:[{name:`value`}]};case dg:return{name:dg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case pg:return{name:pg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case hg:return{name:hg,properties:[{name:`value`}]};case _g:return{name:_g,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case yg:return{name:yg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case xg:return{name:xg,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Cg:return{name:Cg,properties:[{name:`isWildcard`,defaultValue:!1}]};case Tg:return{name:Tg,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case Dg:return{name:Dg,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:e,properties:[]}}}};const J=new kg;let Ag;const jg=()=>Ag??=Qn(`{"$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@44"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"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@160"},"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@164"},"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@164"},"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@164"},"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@163"},"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@164"},"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@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"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@162"},"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@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"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":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"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@157"},"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":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"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":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"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@185"},"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@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@149"},"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@149"},"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":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"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@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"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@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"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@22"},"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@20"},"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@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"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@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElement","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"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@26"},"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@20"},"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@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"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@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","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","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$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@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@35"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"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@36"},"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@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"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@162"},"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@148"},"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@40"},"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@41"},"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@188"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"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@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"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@162"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"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@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"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@46"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"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@164"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"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@51"},"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@164"},"arguments":[]}},{"$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":"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@46"},"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@47"},"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@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"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@53"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"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@54"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"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@153"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"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@162"},"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@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"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@60"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"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@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"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@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","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","fragment":true,"name":"DynamicViewStepTarget","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@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewStep","returnType":{"$ref":"#/types@5"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepChain","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$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":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepSingle","returnType":{"$ref":"#/interfaces@1"},"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":"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":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"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@82"},"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@123"},"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@82"},"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@124"},"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@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"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@125"},"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@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"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@57"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"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@162"},"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@162"},"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@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"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":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"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@48"},"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@50"},"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@83"},"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@83"},"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@86"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"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@78"},"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@88"},"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@96"},"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@87"},"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@79"},"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@90"},"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":"?"}]},"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@166"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"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@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"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@91"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"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@92"},"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@88"},"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@94"},"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@88"},"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@88"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$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@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]}]},"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@88"},"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@88"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"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@98"},"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@98"},"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@99"},"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@99"},"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@96"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"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@96"},"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":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"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@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":"*"}]},"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@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":"*"}]},"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@102"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"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@102"},"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":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},"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@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"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@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"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@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"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@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"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@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"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@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"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@114"},"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@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"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@115/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@115/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$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@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@116"},"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@36"},"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@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"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@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"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@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"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@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"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@82"},"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@123"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"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@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"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@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"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@188"},"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@125"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"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@125"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"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@161"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":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":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$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@183"},"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@171"},"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@160"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"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":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$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@140"},"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@135"},"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@155"},"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@151"},"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@138"},"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@140"},"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@140"},"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@140"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"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@144"},"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@151"},"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@152"},"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@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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@180"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"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":"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@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"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@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"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@178"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"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@173"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"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@184"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"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@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"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@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"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"}]},"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@182"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"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@182"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"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][-\\\\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}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@46"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@117"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@41"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@55"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@53"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@22"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@148"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@80"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@144"}}]}},{"$type":"Type","name":"DynamicViewStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]}},{"$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@101/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@0/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@101/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@102"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@113"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@141"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@134"}}]}}],"interfaces":[{"$type":"Interface","name":"AbstractDynamicStep","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@150"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"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@79"}}}],"superTypes":[]},{"$type":"Interface","name":"DynamicStepSingle","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}]},{"$type":"Interface","name":"DynamicStepChain","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]},"isOptional":false}]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),Mg={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},Ng={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},Pg={AstReflection:()=>new kg},Fg={Grammar:()=>jg(),LanguageMetaData:()=>Mg,parser:{ParserConfig:()=>Ng}};function Ig(e){return Mg.fileExtensions.some(t=>e!==t&&e.endsWith(t))}function Lg(e){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(e)}const Rg=Li(`/`);function zg(e,t){return Rg(e.uri.path,t.uri.path)}const Bg=K.getChild(`chokidar`),Vg={fileSystemWatcher:e=>new Ug(e)},Hg=e=>{let t=ti(e);return Ig(t)||fu(t)||Tu(t)};var Ug=class{watcher;queue=new tn({concurrency:1,timeout:5e3});constructor(e){this.services=e}watch(e){if(this.watcher){Bg.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,await e.close()}}createWatcher(e){Bg.debug`create watcher for folder: ${e}`;let t=wr.watch(e,{ignored:[e=>e.includes(`node_modules`)||e.includes(`.git`),(e,t)=>!!t?.isFile()&&!Hg(e)],followSymlinks:!0,ignoreInitial:!0}),n=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})};return t.on(`add`,n).on(`change`,n).on(`unlink`,(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})}).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){Bg.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Bg.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,n=ti(e),r=fn.file(e);switch(!0){case fu(n):Bg.debug`project file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(r);break;case Ig(n):Bg.debug`file changed: ${e}`,await t.DocumentBuilder.update([r],[]);break;case Tu(n):{Bg.debug`manual layout file changed: ${e}`,t.ManualLayouts.clearCaches();let n=t.ProjectsManager.ownerProjectId(r);await t.ProjectsManager.rebuildProject(n);break}default:Bg.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,n=ti(e),r=fn.file(e);switch(!0){case fu(n):Bg.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case Ig(n):Bg.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[r]);break;case Tu(n):{Bg.debug`manual layout file removed: ${e}`;let n=t.ProjectsManager.ownerProjectId(r);t.ManualLayouts.clearCaches(),await t.ProjectsManager.rebuildProject(n);break}default:Bg.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Bg.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},Wg=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(Su(e))return Promise.resolve(yu);throw Error(`No file system is available.`)}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.`)}},Gg=class{watch(){}dispose(){return Promise.resolve()}},Kg=class{read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}};const qg={fileSystemWatcher:()=>new Gg},Jg={fileSystemProvider:()=>new Wg,...qg},Yg={manualLayouts:()=>new Kg},Xg=K.getChild(`filesystem`);function Zg(e,t=!1){return!t&&fu(ti(e))}function Qg(e,t=!1){return!t&&Ig(ti(e))}const $g=(e=!0)=>({fileSystemProvider:()=>new e_,...e?Vg:qg});var e_=class extends cr{async readFile(e){if(Su(e))return Promise.resolve(yu);try{return await super.readFile(e)}catch(t){return Xg.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let n=t?.recursive??!0,r=t?.maxDepth??1/0,i=[];try{let t=new vu.fdir().withSymlinks({resolvePaths:!1}).exclude(Lg).withFullPaths().filter(Qg);n?r!==1/0&&(t=t.withMaxDepth(r)):t=t.withMaxDepth(1);let a=await t.crawl(e.fsPath).withPromise();for(let e of a)i.push({isFile:!0,isDirectory:!1,uri:fn.file(e)})}catch(t){Xg.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(zg)}async scanProjectFiles(e){return await this.scanDirectory(e,Zg)}async scanDirectory(e,t){let n=[];try{let r=await new vu.fdir().withSymlinks({resolvePaths:!1}).exclude(Lg).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:fn.file(e)})}catch(t){Xg.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return n}async loadProjectConfig(e){return await _u(e)}async writeFile(e,t){let n=ni(e.fsPath),r=hi(n,{throwIfNoEntry:!1});if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(Xg.debug(`creating directory {path}`,{path:n}),mi(n,{recursive:!0})),Xg.debug(`writing file {path}`,{path:e.fsPath}),await si(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=hi(t,{throwIfNoEntry:!1});return n?.isFile()||n?.isSymbolicLink()?(await oi(t),Xg.debug(`deleted file {path}`,{path:t}),!0):(Xg.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){Xg.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}};const t_={mcpServer:()=>new n_,mcpServerFactory:()=>new r_};var n_=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},r_=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}};const i_=K.getChild(`mcp`);function a_(e,t){let{name:n,description:r,...i}=e;return e=>[n,{description:r?.trim()??``,...i},o_(n,e,t)]}function o_(e,t,n){let r=n.bind(null,t);return(async function(t,n){i_.debug(`Calling tool {name}, args: {args}`,{name:e,args:t});try{let e=await r.call(null,t,n);return typeof e==`string`?{content:[{type:`text`,text:e}]}:{content:[{type:`text`,text:JSON.stringify(e)}],structuredContent:e}}catch(t){return i_.error(`Tool ${e} failed`,{err:t}),{content:[{type:`text`,text:U(t)}],isError:!0}}})}var s_=`1.51.0`,c_=class extends nr{constructor(e){super(e),this.services=e}createDescription(e,t,n){n??=Dn(e);let r=super.createDescription(e,t,n);return Su(n.uri)||(n.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(n),r.likec4ProjectId=n.likec4ProjectId),r}},l_=class extends Hn{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,n){let r=this.services.workspace.ProjectsManager;return gn(this.symbolIndex.keys()).filter(t=>n&&!n.has(t)?!1:r.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}};const u_=Symbol.for(`idattr`),d_={writeId(e,t){return e[u_]=t,e},readId(e){return e[u_]}},f_={writeId(e,t){return v(t)?e[u_]=void 0:e[u_]=t,e},readId(e){return e[u_]}};function p_(e){return e?.textDocument.languageId===Mg.languageId}function m_(e){return e?.markdown||e?.text}function h_(e){let t=parseFloat(e);return isNaN(t)?100:Me(t,{min:0,max:100})}function g_({value:e}){return h_(e)}function __({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:F(e)}}function v_({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:F(e)}}function y_(e,t){let n={};if(!e||e.length===0)return n;for(let r of e)if(t(r))switch(!0){case Zd(r):{let e=b_(r);C(e)&&(n.color=e);break}case mm(r):n.line=r.value;break;case qd(r):switch(r.key){case`head`:n.head=r.value;break;case`tail`:n.tail=r.value;break;default:F(r)}break;default:F(r)}return n}function b_(e){return e?.themeColor??e?.customColor?.$refText}function x_(e){let t=e.rankSep,n=e.nodeSep,r;switch(e.direction){case`TopBottom`:r=`TB`;break;case`BottomTop`:r=`BT`;break;case`LeftRight`:r=`LR`;break;case`RightLeft`:r=`RL`;break;default:F(e.direction)}return{direction:r,...n&&{nodeSep:n},...t&&{rankSep:t}}}function S_(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:F(e)}}function C_(e){return mn(e,e=>Qh(e)||Cf(e)||Lf(e))}const w_=e=>Em(e)||Wf(e)||_p(e)||op(e)||jf(e)||Xf(e),T_=e=>Om(e)||xf(e)||df(e)||pp(e)||sf(e);function E_(e){for(;;){if(T_(e)||w_(e))return!1;if(Lp(e)||Am(e))return!0;if(e.$container)e=e.$container;else return!1}}function D_(e){for(;;){if(T_(e))return!1;if(w_(e))return!0;if(e.$container)e=e.$container;else return!1}}function O_(e){for(;;){if(w_(e))return!1;if(T_(e))return!0;if(e.$container)e=e.$container;else return!1}}const k_=Li(`/`),A_=(e,t)=>k_(e.uri.path,t.uri.path),j_=e=>p_(e)&&Cu(e);var M_=class extends xn{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.`);let n=[...this.documentMap.values(),e].sort(A_);this.documentMap.clear();for(let e of n)this.documentMap.set(e.uri.toString(),e);j_(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e))}getDocument(e){let t=super.getDocument(e);return j_(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return gn(this.documentMap.values()).filter(e=>j_(e)&&!this.projectsManager.isExcluded(e))}get all(){return gn(this.documentMap.values()).map(e=>(j_(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return gn(this.documentMap.values()).filter(n=>j_(n)&&t.isIncluded(e,n)?(n.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return w(this.userDocuments.toArray(),y(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),xe(x(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,j_(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},N_=t(Sr(),1),P_=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){q(e)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function F_(e){try{let t=Mh(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 I_(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],n=e.parent;for(;n;)t.push(n.$type===`StrictFqnRef`?n.value.$refText:n.el.$refText),n=n.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function L_(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function R_(e){let t;for(;t=e.value?.ref;){if(lf(t))return null;if(af(t))return t;if(v(e.parent))return null;e=e.parent}return null}function z_(e){let t=L_(e);return t?.$type===`Imported`?t:null}function B_(e){let t;for(;t=e.value?.ref;){if(Iu(t))return!0;if(v(e.parent))return!1;e=e.parent}return!1}function V_(e){if(em(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;P(nm(e))}if(nm(e))return e.project;let t=on(e)?Dn(e):e;return t.likec4ProjectId?t.likec4ProjectId:(K.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,lv.DefaultProjectId)}function H_(...e){return Oa(e.length>1?e.join(`:::`):e[0])}function U_(e){try{return e()}catch(e){K.trace(`Safe call failed`,{error:e});return}}function W_(){try{return globalThis.performance.now()}catch{return Date.now()}}function G_(){let e=W_();return{get ms(){return W_()-e},get pretty(){return Gr(W_()-e)}}}const Y=K.getChild(`projects`);function K_(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function q_(e){return K_(e)?e.uri.toString():typeof e==`string`?Vr(e,{acceptRelative:!1,strict:!0})?e:fn.file(e).toString():e.toString()}const J_=Li(`/`,!0),Y_=(e,t)=>J_(Ir(e.path),Ir(t.path));function X_(e){return t=>e.startsWith(Bi(t)?t:t.folder)}function Z_(e,t){let n=Bi(e)?e:e.folder,r=Bi(t)?t:t.folder;return n.startsWith(r)||r.startsWith(n)}function Q_(...e){return Pe(Z_,e)}function $_(e,t){return t.startsWith(e.folder)||e.includePaths?.some(X_(t))?!ev(e,t):!1}function ev(e,t){return e.exclude?.(Wr(t))??!1}function tv(...e){return Pe($_,e)}function nv(...e){return Pe(ev,e)}function rv(e){return e=q_(e),Hr(e)}const iv=(e,t)=>Y_(e.folderUri,t.folderUri);function av(e){return e.sort(iv)}const ov={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,N_.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function sv(e){return ov.exclude(Wr(e))}function cv(e){if(`configUri`in e){P(!te(e.configUri),`configUri is emptyish`);let t=fn.isUri(e.configUri)?e.configUri:fn.parse(q_(e.configUri)),n=rv(Sn.dirname(t));return{configUri:t,folder:n,folderUri:fn.parse(n)}}P(!te(e.folderUri),`folderUri is emptyish`);let t=rv(e.folderUri),n=fn.parse(t);return{configUri:Sn.joinPath(n,`likec4.config.json`),folder:t,folderUri:n}}var lv=class e{static DefaultProjectId=ov.id;#e=[];#t=void 0;#n=[];#r=new vt.default(t=>{if(t===e.DefaultProjectId){let e=this.getWorkspaceFolder(),n=Sn.joinPath(e,`likec4.config.json`),r=rv(e);return{id:t,config:ov.config,folder:r,folderUri:fn.parse(r),configUri:n,exclude:ov.exclude,includeConfig:{...ov.includeConfig}}}return N(this.#n.find(e=>e.id===t),`Project ${t} not found`)});#i=new vt.default(e=>{let t=q_(e),n=this.#a.get(t);return n?nv(n,t)?!this.#n.some(tv(t)):!1:sv(t)});#a=new vt.default(e=>{let t=X_(e);return this.#n.find(t)??this.#n.find(tv(e))??null});constructor(e){this.services=e,Y.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#n.length>1))return T(this.#n,1)?this.#n[0].id:e.DefaultProjectId}set defaultProjectId(t){if(t!==this.#t){if(this.#t=void 0,!t||t===e.DefaultProjectId){Y.debug`reset default project ID`;return}P(this.#n.find(e=>e.id===t),`Project "${t}" not found`),Y.debug`set default project ID to ${t}`,this.#t=t}}get default(){return this.#r.get(this.defaultProjectId??e.DefaultProjectId)}get all(){if(T(this.#n,1)){let e=[...y(this.#n,x(`id`)),ov.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[ov.id]}getProject(e){let t=typeof e==`string`?e:e.likec4ProjectId??this.ownerProjectId(e);return this.#r.get(t)}findOverlaped(e){let t=Q_(rv(e));return this.#n.filter(e=>t(e)||!!e.includePaths&&!!Xe(e.includePaths,t))}ensureProjectId(t){return t===e.DefaultProjectId?this.defaultProjectId??e.DefaultProjectId:t?(P(this.#n.some(e=>t===e.id),`Project ID ${t} is not registered`),t):N(this.defaultProjectId,()=>`Specify exact project, known: [${y(this.#n,x(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#n.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return K_(t)&&Su(t)?!0:e.length===1?this.#i.get(q_(t)):nv(this.#r.get(e[0]),q_(t))}isIncluded(t,n){let r=q_(n);return T(this.#n,1)?t===e.DefaultProjectId?!this.#a.get(r)&&!sv(r):tv(this.#r.get(t),q_(n)):!sv(r)}async registerConfigFile(e,t){if(sv(q_(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by: ${ov.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let n=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:n,configUri:e},t)}catch(t){if(!Jn(t))throw ts(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let n=iu.validate(e.config),{configUri:r,folder:i,folderUri:a}=cv(e),o=iu.normalizeInclude(n.include),s=this.#n.find(e=>e.folder===i);return s?(s.config.name!==n.name&&(Y.info`project name changed from ${s.config.name} to ${n.name}`,Y.info`unregistering ${s.id}`,s.id=this.uniqueProjectId(n.name),Y.info`register ${s.id}`),this.warnIfConfigOverride(s,r),s.config=n,s.folder=i,s.folderUri=a,s.configUri=r,s.includeConfig=o):(s={id:this.uniqueProjectId(n.name),config:n,folder:i,configUri:r,folderUri:a,includeConfig:o},this.#n=av([...this.#n,s]),Y.info`register ${s.id}`),U_(()=>this.updateIncludesExcludes(s)),this.#o?s:(this.resetCaches(),this.notifyListeners(),await this.rebuildProject(s.id,t).catch(e=>Jn(e)?Promise.reject(e):(Y.warn(`Failed to rebuild project {projectId} after config change`,{projectId:s.id,error:e}),Promise.resolve())),s)}ownerProjectId(t){return this.#a.get(q_(t))?.id??this.#t??e.DefaultProjectId}#o=null;async reloadProjects(e){return this.#o?(Y.debug`reload projects is already in progress, waiting`,await this.#o.catch(()=>{})):(Y.debug`schedule reload projects`,this.#o=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(Jn(e)||Y.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#o=null,this.notifyListeners()}),await this.#o)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Y.warn(`Failed to reloadProjects, no workspace folders found`);return}Y.debug`start reload projects`;let n=[];for(let e of t){let t=fn.parse(e.uri);Y.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let r of e)Y.debug`found config ${Sn.relative(t,r.uri)}`,n.push(r.uri)}catch(e){Y.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(n.length===0){if(this.#n.length===0){Y.warning(`No config files found`);return}Y.warning(`no config files found, but {count} projects were registered before`,{count:this.#n.length}),Y.warning(`reset`)}n.sort(Y_);let r=new Map(this.#n.map(e=>[e.configUri.toString(),e]));this.#n=[],this.#r.clear();for(let e of n)try{await this.registerConfigFile(e)}catch(t){Y.warn(U(t));let n=r.get(e.toString());n&&(Y.debug`Update failed, restore project ${n.id}`,await this.registerProject(n).catch(e=>{Y.warn(`fail to restore project ${n.id}, ignoring`,{error:e})}))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(y(this.#n,x(`id`))),n=e;if(!t.has(n))return n;Y.warn`Project "${e}" already exists, generating unique ID`;let r=1;for(;t.has(n);)n=`${e}-${r++}`;return n}resetCaches(){Y.trace(`resetCaches`),this.#t&&!this.#n.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#r.clear(),this.#a.clear(),this.#i.clear()}async rebuildProject(t,n){let r=this.#n.find(e=>e.id===t);if(!r)return t===e.DefaultProjectId?Y.info`Rebuilding all documents `:Y.warn`Project ${t} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(n);let i=Y.getChild(r.id),a=this.services.workspace.LangiumDocuments.userDocuments.filter(e=>tv(r,q_(e))).map(e=>e.uri).toArray();if(a.length===0){i.debug`no documents found for project ${r.id}, skipping rebuild`;return}i.info(`rebuild project documents: {docs}`,{docs:a.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(a,[],n).catch(e=>{i.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#n)if(t.includePaths)for(let n of t.includePaths)e.push({projectId:t.id,includePath:n.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),Gn.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 Y.warn(`Failed to get workspace URI, using default folder`,{error:e}),fn.file(`/`)}}notifyListeners(){for(let e of this.#e)try{e()}catch(e){Y.warn(U(e))}}updateIncludesExcludes(e){let t=e.config;switch(delete e.includePaths,delete e.exclude,!0){case v(t.exclude):e.exclude=ov.exclude;break;case t.exclude&&T(t.exclude,1):e.exclude=(0,N_.default)(y(t.exclude,t=>(!Lr(t)&&!t.startsWith(`**`)&&(t=Br(`**`,t)),Ur(Pr(e.folderUri.path,t)))),{contains:!0,dot:!0});break}let n=e.includeConfig.paths;if(!T(n,1))return e;e.includePaths=y(n,t=>{let n=Sn.resolvePath(e.folderUri,t);return{uri:n,folder:rv(n)}}),Y.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`;for(let t of e.includePaths)for(let n of this.#n)n.id!==e.id&&(Q_(t,n)&&Y.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:n.id}),n.includePaths?.forEach(r=>{Q_(t,r)&&Y.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:n.id,otherIncludePath:r.folder})}));return e}warnIfConfigOverride(e,t){try{let[n,r]=y([e.configUri,t],Sn.basename);n!==r&&Y.warn`config ${r} overrides ${n} in folder ${e.folder}`}catch{}}},uv=class extends zn{documentFactory;fileSystemProvider;#e=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.documentFactory=e.workspace.LangiumDocumentFactory,this.fileSystemProvider=e.workspace.FileSystemProvider}async performStartup(e){this.folders??=e;let t=[];for(let n of e)try{let e=fn.parse(n.uri),r=await this.fileSystemProvider.scanProjectFiles(e);t.push(...r),this.services.workspace.FileSystemWatcher.watch(e.fsPath)}catch(e){q(e)}let n=this.services.workspace.ProjectsManager;for(let e of t)try{await n.registerConfigFile(e.uri)}catch(e){q(e)}return await super.performStartup(e)}async loadAdditionalDocuments(e,t){t(this.documentFactory.fromString(yu,fn.parse(xu)));let n=this.services.workspace.ProjectsManager.getAllIncludePaths(),r=0,i=[];for(let{projectId:e,includePath:t,includeConfig:r}of n)try{K.debug`scanning include path ${t.fsPath} for project ${e}`;let n=await this.fileSystemProvider.readDirectory(t,{recursive:!0,maxDepth:r.maxDepth});i.push(...n),n.length===0&&K.debug`loaded ${n.length} files from include path ${t.fsPath}`}catch(e){K.warn(`Failed to scan include path ${t.fsPath}`,{error:e})}for(let e of Le(i,e=>e.uri.path))try{t(await this.langiumDocuments.getOrCreateDocument(e.uri)),r++}catch(t){K.warn(`Failed to load document ${e.uri.fsPath}`,{error:t})}if(n.length>0&&r>0){let e=Math.min(...n.map(e=>e.includeConfig.fileThreshold));r>e?K.warn(`Loaded ${r} files from include paths (threshold: ${e}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):K.info`loaded ${r} total files from ${n.length} include paths`}}includeEntry(e,t,n){let r=Sn.basename(t.uri);return t.isDirectory?!Lg(r):t.isFile?(n.fileExtensions.includes(Sn.extname(t.uri))||n.fileNames.includes(r))&&!this.services.workspace.ProjectsManager.isExcluded(t.uri):!1}workspace(){return this.folders&&T(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();K.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){let e=this.workspace();return P(e,`Workspace not initialized`),fn.parse(e.uri)}get workspaceURL(){let e=this.workspace();return P(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of this.#e)e();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#e.push(e),Gn.create(()=>{this.#e=this.#e.filter(t=>t!==e)})}};const dv=j({name:A().describe(`Project identifier`),title:A().optional().describe(`Human-readable project title`),contactPerson:A().optional().describe(`Maintainer contact information`),metadata:Nr(A(),Ar()).optional().describe(`Custom project metadata as key-value pairs`),extends:Er([A(),M(A())]).optional().describe(`Style inheritance paths`),exclude:M(A()).optional().describe(`File exclusion patterns`),include:j({paths:M(A()).describe(`Include paths`),maxDepth:k().describe(`Maximum directory depth`),fileThreshold:k().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:j({outDir:A().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:j({hasTheme:Dr().describe(`Whether theme customization is defined`),hasDefaults:Dr().describe(`Whether default style values are defined`),hasCustomCss:Dr().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function fv(e){let t={name:e.name};return e.title!=null&&(t.title=e.title),e.contactPerson!=null&&(t.contactPerson=e.contactPerson),e.metadata&&(t.metadata=e.metadata),e.extends&&(t.extends=e.extends),e.exclude&&(t.exclude=e.exclude),e.include&&(t.include={paths:e.include.paths||[],maxDepth:e.include.maxDepth??3,fileThreshold:e.include.fileThreshold??30}),e.manualLayouts&&(t.manualLayouts={outDir:e.manualLayouts.outDir??`.likec4`}),e.styles&&(t.styles={hasTheme:!!e.styles.theme,hasDefaults:!!e.styles.defaults,hasCustomCss:!!e.styles.customCss}),t}const pv=j({id:A().describe(`Element id (FQN)`),name:A().describe(`Element name`),kind:A().describe(`Element kind`),title:A(),tags:M(A()),metadata:Nr(Er([A(),M(A())])),includedInViews:M(j({id:A().describe(`View id`),title:A().describe(`View title`),type:kr([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function mv(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:yv(e.views())}}function hv(e,t,n,r,i,a){P(e.findElement(t),`Element "${t}" not found`);let o=new Set,s={},c=0,l=!1,u=[{elementId:t,depth:0}];for(;u.length>0;){let{elementId:t,depth:d}=u.shift();if(d>i||o.has(t))continue;if(o.size>=a){l=!0;break}let f=e.findElement(t);if(!f)continue;o.add(t),c=Math.max(c,d);let p=(n===`incoming`?[...f.incoming(r)]:[...f.outgoing(r)]).map(e=>{let t={elementId:n===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});s[t]={...mv(f),neighbors:p,depth:d};for(let e of p)o.has(e.elementId)||u.push({elementId:e.elementId,depth:d+1})}for(let e of Object.values(s))e.neighbors=e.neighbors.filter(e=>e.elementId in s);return{target:t,totalNodes:o.size,maxDepth:c,truncated:l,nodes:s}}const gv=j({path:A().describe(`Path to the file`),range:j({start:j({line:k(),character:k()}),end:j({line:k(),character:k()})}).describe(`Range in the file`)}).nullable(),_v=A().refine(e=>!0).optional().default(lv.DefaultProjectId).describe(`Project id (optional, will use "default" if not specified)`),vv=M(j({id:A().describe(`View id`),title:A().describe(`View title`),type:kr([`element`,`deployment`,`dynamic`]).describe(`View type`)})),yv=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),bv=(e,t)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:fn.parse(r.uri).fsPath,range:r.range}:null}catch(e){return i_.debug(`Failed to locate {params}`,{error:e,params:n}),null}},xv=pv.extend({description:A().nullable().describe(`Element description`),technology:A().nullable().describe(`Element technology`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),children:M(A()).describe(`Direct child element ids`),incomingCount:k().describe(`Number of incoming relationships`),outgoingCount:k().describe(`Number of outgoing relationships`)}),Sv=a_({name:`batch-read-elements`,description:`
56
+ `),this.triggerUpdate({updated:i,projectId:e.id,viewId:t.id})}catch(e){n.warn(`Failed to write snapshot ${t.id} to ${i.fsPath}`,{err:e})}return o}async remove(e,t){this.cache.delete(e.id);let n=F_.getChild(e.id),r=B_(e),i=mn.joinPath(r,R_(t));n.debug`delete snapshot of ${t} in project ${e.id}. File: ${i.fsPath}`;let a={uri:i.toString(),range:Ln.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(i))return n.warn`Snapshot ${t} did not exist at ${i.fsPath}`,null;this.triggerUpdate({removed:i,projectId:e.id,viewId:t})}catch(e){n.warn(`Failed to delete snapshot ${t} from ${i.fsPath}`,{err:e})}return a}clearCaches(){F_.trace`clear caches`,this.cache.clear()}triggerUpdate(e){for(let t of this.listeners)M_(()=>t(e))}normalizeIconPathsForWrite(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let n=_n.parse(e.icon),r=mn.relative(t,n);return r.startsWith(`..`)?e:{...e,icon:`${H_}${r}`}}return e});return{...e,nodes:n}}resolveIconPathsAfterRead(e,t){let n=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(H_)){let n=e.icon.substring(9),r=mn.joinPath(t,n);return{...e,icon:r.toString()}}return e});return{...e,nodes:n}}};const W_=K.getChild(`chokidar`),G_={fileSystemWatcher:e=>new q_(e)},K_=e=>{let t=ri(e);return T_(t)||ru(t)||L_(t)};var q_=class{watcher;queue=new en({concurrency:1,timeout:5e3});constructor(e){this.services=e}watch(e){if(this.watcher){W_.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,await e.close()}}createWatcher(e){W_.debug`create watcher for folder: ${e}`;let t=Er.watch(e,{ignored:[e=>e.includes(`node_modules`)||e.includes(`.git`),(e,t)=>!!t?.isFile()&&!K_(e)],followSymlinks:!0,ignoreInitial:!0}),n=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})};return t.on(`add`,n).on(`change`,n).on(`unlink`,(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})}).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){W_.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{W_.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,n=ri(e),r=_n.file(e);switch(!0){case ru(n):W_.debug`project file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(r);break;case T_(n):W_.debug`file changed: ${e}`,await t.DocumentBuilder.update([r],[]);break;case L_(n):W_.debug`manual layout file changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ManualLayouts.handleFileSystemUpdate({update:r});break;default:W_.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,n=ri(e),r=_n.file(e);switch(!0){case ru(n):W_.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case T_(n):W_.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[r]);break;case L_(n):W_.debug`manual layout file removed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({delete:r});break;default:W_.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){W_.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},J_=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(pu(e))return Promise.resolve(uu);throw Error(`No file system is available.`)}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.`)}},Y_=class{watch(){}dispose(){return Promise.resolve()}},X_=class{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:()=>{}}}};const Z_={fileSystemWatcher:()=>new Y_},Q_={fileSystemProvider:()=>new J_,...Z_},$_={manualLayouts:()=>new X_},ev=K.getChild(`filesystem`);function tv(e,t=!1){return!t&&ru(ri(e))}function nv(e,t=!1){return!t&&T_(ri(e))}const rv=(e=!0)=>({fileSystemProvider:()=>new iv,...e?G_:Z_});var iv=class extends ur{async readFile(e){if(pu(e))return Promise.resolve(uu);try{return await super.readFile(e)}catch(t){return ev.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let n=t?.recursive??!0,r=t?.maxDepth??1/0,i=[];try{let t=new lu.fdir().withSymlinks({resolvePaths:!1}).exclude(E_).withFullPaths().filter(nv);n?r!==1/0&&(t=t.withMaxDepth(r)):t=t.withMaxDepth(1);let a=await t.crawl(e.fsPath).withPromise();for(let e of a)i.push({isFile:!0,isDirectory:!1,uri:_n.file(e)})}catch(t){ev.warn(`Failed to read directory ${e.fsPath}`,{error:t})}return i.sort(O_)}async scanProjectFiles(e){return await this.scanDirectory(e,tv)}async scanDirectory(e,t){let n=[];try{let r=await new lu.fdir().withSymlinks({resolvePaths:!1}).exclude(E_).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of r)n.push({isFile:!0,isDirectory:!1,uri:_n.file(e)})}catch(t){ev.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return n}async loadProjectConfig(e){return await cu(e)}async writeFile(e,t){let n=ii(e.fsPath),r=_i(n,{throwIfNoEntry:!1});if(r?.isFile())throw Error(`Cannot create directory ${n} because a file with the same name exists.`);return r||(ev.debug(`creating directory {path}`,{path:n}),gi(n,{recursive:!0})),ev.debug(`writing file {path}`,{path:e.fsPath}),await li(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,n=_i(t,{throwIfNoEntry:!1});return n?.isFile()||n?.isSymbolicLink()?(await ci(t),ev.debug(`deleted file {path}`,{path:t}),!0):(ev.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){ev.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}};const av={mcpServer:()=>new ov,mcpServerFactory:()=>new sv};var ov=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},sv=class{create(e){throw Error(`NoopLikeC4MCPServerFactory`)}};const cv=K.getChild(`mcp`);function lv(e,t){let{name:n,description:r,...i}=e;return e=>[n,{description:r?.trim()??``,...i},uv(n,e,t)]}function uv(e,t,n){let r=n.bind(null,t);return(async function(t,n){cv.debug(`Calling tool {name}, args: {args}`,{name:e,args:t});try{let e=await r.call(null,t,n);return typeof e==`string`?{content:[{type:`text`,text:e}]}:{content:[{type:`text`,text:JSON.stringify(e)}],structuredContent:e}}catch(t){return cv.error(`Tool ${e} failed`,{err:t}),{content:[{type:`text`,text:U(t)}],isError:!0}}})}var dv=`1.53.0`;const fv=j({name:A().describe(`Project identifier`),title:A().optional().describe(`Human-readable project title`),contactPerson:A().optional().describe(`Maintainer contact information`),metadata:qr(A(),Wr()).optional().describe(`Custom project metadata as key-value pairs`),extends:Br([A(),M(A())]).optional().describe(`Style inheritance paths`),exclude:M(A()).optional().describe(`File exclusion patterns`),include:j({paths:M(A()).describe(`Include paths`),maxDepth:k().describe(`Maximum directory depth`),fileThreshold:k().describe(`File threshold`)}).optional().describe(`Include configuration`),manualLayouts:j({outDir:A().describe(`Output directory for manual layouts`)}).optional().describe(`Manual layouts configuration`),styles:j({hasTheme:Vr().describe(`Whether theme customization is defined`),hasDefaults:Vr().describe(`Whether default style values are defined`),hasCustomCss:Vr().describe(`Whether custom CSS is defined`)}).optional().describe(`Simplified styles configuration (boolean flags)`)});function pv(e){let t={name:e.name};return e.title!=null&&(t.title=e.title),e.contactPerson!=null&&(t.contactPerson=e.contactPerson),e.metadata&&(t.metadata=e.metadata),e.extends&&(t.extends=e.extends),e.exclude&&(t.exclude=e.exclude),e.include&&(t.include={paths:e.include.paths||[],maxDepth:e.include.maxDepth??3,fileThreshold:e.include.fileThreshold??30}),e.manualLayouts&&(t.manualLayouts={outDir:e.manualLayouts.outDir??`.likec4`}),e.styles&&(t.styles={hasTheme:!!e.styles.theme,hasDefaults:!!e.styles.defaults,hasCustomCss:!!e.styles.customCss}),t}const mv=j({id:A().describe(`Element id (FQN)`),name:A().describe(`Element name`),kind:A().describe(`Element kind`),title:A(),tags:M(A()),metadata:qr(Br([A(),M(A())])),includedInViews:M(j({id:A().describe(`View id`),title:A().describe(`View title`),type:Ur([`element`,`deployment`,`dynamic`]).describe(`View type`)})).describe(`Views that include this element`)});function hv(e){return{id:e.id,name:e.name,kind:e.kind,title:e.title,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:bv(e.views())}}function gv(e,t,n,r,i,a){P(e.findElement(t),`Element "${t}" not found`);let o=new Set,s={},c=0,l=!1,u=[{elementId:t,depth:0}];for(;u.length>0;){let{elementId:t,depth:d}=u.shift();if(d>i||o.has(t))continue;if(o.size>=a){l=!0;break}let f=e.findElement(t);if(!f)continue;o.add(t),c=Math.max(c,d);let p=(n===`incoming`?[...f.incoming(r)]:[...f.outgoing(r)]).map(e=>{let t={elementId:n===`incoming`?e.source.id:e.target.id};return e.title&&(t.relationshipLabel=e.title),e.technology&&(t.technology=e.technology),t});s[t]={...hv(f),neighbors:p,depth:d};for(let e of p)o.has(e.elementId)||u.push({elementId:e.elementId,depth:d+1})}for(let e of Object.values(s))e.neighbors=e.neighbors.filter(e=>e.elementId in s);return{target:t,totalNodes:o.size,maxDepth:c,truncated:l,nodes:s}}const _v=j({path:A().describe(`Path to the file`),range:j({start:j({line:k(),character:k()}),end:j({line:k(),character:k()})}).describe(`Range in the file`)}).nullable(),vv=A().refine(e=>!0).optional().default(w_.DefaultProjectId).describe(`Project id (optional, will use "default" if not specified)`),yv=M(j({id:A().describe(`View id`),title:A().describe(`View title`),type:Ur([`element`,`deployment`,`dynamic`]).describe(`View type`)})),bv=e=>[...e].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type})),xv=(e,t)=>n=>{try{let r=e.locate({projectId:t,...n});return r?{path:_n.parse(r.uri).fsPath,range:r.range}:null}catch(e){return cv.debug(`Failed to locate {params}`,{error:e,params:n}),null}},Sv=mv.extend({description:A().nullable().describe(`Element description`),technology:A().nullable().describe(`Element technology`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),children:M(A()).describe(`Direct child element ids`),incomingCount:k().describe(`Number of incoming relationships`),outgoingCount:k().describe(`Number of outgoing relationships`)}),Cv=lv({name:`batch-read-elements`,description:`
55
57
  Read details of multiple elements in a single call, reducing round-trips.
56
58
  Returns a compact summary for each element including metadata, description, technology, shape, children, and relationship counts.
57
59
 
@@ -113,7 +115,7 @@ Example response:
113
115
  ],
114
116
  "notFound": []
115
117
  }
116
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:M(A()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:_v},outputSchema:{elements:M(xv),notFound:M(A()).describe(`Element ids that were not found`)}},async(e,t)=>{P(t.ids.length<=50,`Maximum 50 element ids per call`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=[];for(let e of t.ids){let t=r.findElement(e);if(!t){a.push(e);continue}i.push({...mv(t),description:t.description.text,technology:t.technology,shape:t.shape,color:t.color,children:[...t.children()].map(e=>e.id),incomingCount:t.allIncoming.size,outgoingCount:t.allOutgoing.size})}return{elements:i,notFound:a}}),Cv=j({id:A(),kind:A(),title:A(),description:A().nullable(),technology:A().nullable(),shape:A(),color:A()}),wv=j({element1:Cv,element2:Cv,propertyDiffs:M(j({property:A().describe(`Property name`),element1Value:A().nullable().describe(`Value in element1`),element2Value:A().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:j({onlyInElement1:M(A()).describe(`Tags present only in element1`),onlyInElement2:M(A()).describe(`Tags present only in element2`),common:M(A()).describe(`Tags present in both elements`)}),metadata:j({onlyInElement1:Nr(Er([A(),M(A())])).describe(`Metadata keys only in element1`),onlyInElement2:Nr(Er([A(),M(A())])).describe(`Metadata keys only in element2`),different:M(j({key:A(),element1Value:Er([A(),M(A())]),element2Value:Er([A(),M(A())])})).describe(`Metadata keys present in both but with different values`),common:Nr(Er([A(),M(A())])).describe(`Metadata keys with identical values in both`)}),relationships:j({incomingOnlyElement1:k().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:k().describe(`Count of unique source elements sending to element2 only`),incomingShared:k().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:k().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:k().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:k().describe(`Count of unique target elements receiving from both`)})}),Tv=a_({name:`element-diff`,description:`
118
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Batch read elements`},inputSchema:{ids:M(A()).min(1).max(50).describe(`Array of element ids (FQNs) to read (max 50)`),project:vv},outputSchema:{elements:M(Sv),notFound:M(A()).describe(`Element ids that were not found`)}},async(e,t)=>{P(t.ids.length<=50,`Maximum 50 element ids per call`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=[];for(let e of t.ids){let t=r.findElement(e);if(!t){a.push(e);continue}i.push({...hv(t),description:t.description.text,technology:t.technology,shape:t.shape,color:t.color,children:[...t.children()].map(e=>e.id),incomingCount:t.allIncoming.size,outgoingCount:t.allOutgoing.size})}return{elements:i,notFound:a}}),wv=j({id:A(),kind:A(),title:A(),description:A().nullable(),technology:A().nullable(),shape:A(),color:A()}),Tv=j({element1:wv,element2:wv,propertyDiffs:M(j({property:A().describe(`Property name`),element1Value:A().nullable().describe(`Value in element1`),element2Value:A().nullable().describe(`Value in element2`)})).describe(`Properties that differ between the two elements`),tags:j({onlyInElement1:M(A()).describe(`Tags present only in element1`),onlyInElement2:M(A()).describe(`Tags present only in element2`),common:M(A()).describe(`Tags present in both elements`)}),metadata:j({onlyInElement1:qr(Br([A(),M(A())])).describe(`Metadata keys only in element1`),onlyInElement2:qr(Br([A(),M(A())])).describe(`Metadata keys only in element2`),different:M(j({key:A(),element1Value:Br([A(),M(A())]),element2Value:Br([A(),M(A())])})).describe(`Metadata keys present in both but with different values`),common:qr(Br([A(),M(A())])).describe(`Metadata keys with identical values in both`)}),relationships:j({incomingOnlyElement1:k().describe(`Count of unique source elements sending to element1 only`),incomingOnlyElement2:k().describe(`Count of unique source elements sending to element2 only`),incomingShared:k().describe(`Count of unique source elements sending to both`),outgoingOnlyElement1:k().describe(`Count of unique target elements receiving from element1 only`),outgoingOnlyElement2:k().describe(`Count of unique target elements receiving from element2 only`),outgoingShared:k().describe(`Count of unique target elements receiving from both`)})}),Ev=lv({name:`element-diff`,description:`
117
119
  Compare two elements side-by-side, showing differences in properties, tags, metadata, and relationships.
118
120
 
119
121
  Request:
@@ -173,7 +175,7 @@ Example response:
173
175
  "outgoingShared": 2
174
176
  }
175
177
  }
176
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:A().describe(`First element id (FQN)`),element2Id:A().describe(`Second element id (FQN)`),project:_v},outputSchema:wv.shape},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.element1Id);P(i,`Element "${t.element1Id}" not found in project "${n}"`);let a=r.findElement(t.element2Id);P(a,`Element "${t.element2Id}" not found in project "${n}"`);let o=[],s=[{name:`kind`,get:e=>e.kind},{name:`title`,get:e=>e.title},{name:`description`,get:e=>e.description.text},{name:`technology`,get:e=>e.technology},{name:`shape`,get:e=>e.shape},{name:`color`,get:e=>e.color}];for(let e of s){let t=e.get(i),n=e.get(a);t!==n&&o.push({property:e.name,element1Value:t,element2Value:n})}let c=new Set(i.tags),l=new Set(a.tags),u=[],d=[],f=[];for(let e of c)l.has(e)?u.push(e):d.push(e);for(let e of l)c.has(e)||f.push(e);let p=i.getMetadata(),m=a.getMetadata(),h=new Set([...Object.keys(p),...Object.keys(m)]),g={},_={},ee=[],te={};for(let e of h){let t=p[e],n=m[e];t!==void 0&&n===void 0?g[e]=t:t===void 0&&n!==void 0?_[e]=n:t!==void 0&&n!==void 0&&(JSON.stringify(t)===JSON.stringify(n)?te[e]=t:ee.push({key:e,element1Value:t,element2Value:n}))}let ne=new Set([...i.incoming()].map(e=>e.source.id)),re=new Set([...a.incoming()].map(e=>e.source.id)),ie=new Set([...i.outgoing()].map(e=>e.target.id)),ae=new Set([...a.outgoing()].map(e=>e.target.id)),oe=0,se=0,v=0;for(let e of ne)re.has(e)?oe++:se++;for(let e of re)ne.has(e)||v++;let ce=0,le=0,ue=0;for(let e of ie)ae.has(e)?ce++:le++;for(let e of ae)ie.has(e)||ue++;return{element1:{id:i.id,kind:i.kind,title:i.title,description:i.description.text,technology:i.technology,shape:i.shape,color:i.color},element2:{id:a.id,kind:a.kind,title:a.title,description:a.description.text,technology:a.technology,shape:a.shape,color:a.color},propertyDiffs:o,tags:{onlyInElement1:d,onlyInElement2:f,common:u},metadata:{onlyInElement1:g,onlyInElement2:_,different:ee,common:te},relationships:{incomingOnlyElement1:se,incomingOnlyElement2:v,incomingShared:oe,outgoingOnlyElement1:le,outgoingOnlyElement2:ue,outgoingShared:ce}}}),Ev=a_({name:`find-relationship-paths`,description:`
178
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Compare two elements`},inputSchema:{element1Id:A().describe(`First element id (FQN)`),element2Id:A().describe(`Second element id (FQN)`),project:vv},outputSchema:Tv.shape},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.element1Id);P(i,`Element "${t.element1Id}" not found in project "${n}"`);let a=r.findElement(t.element2Id);P(a,`Element "${t.element2Id}" not found in project "${n}"`);let o=[],s=[{name:`kind`,get:e=>e.kind},{name:`title`,get:e=>e.title},{name:`description`,get:e=>e.description.text},{name:`technology`,get:e=>e.technology},{name:`shape`,get:e=>e.shape},{name:`color`,get:e=>e.color}];for(let e of s){let t=e.get(i),n=e.get(a);t!==n&&o.push({property:e.name,element1Value:t,element2Value:n})}let c=new Set(i.tags),l=new Set(a.tags),u=[],d=[],f=[];for(let e of c)l.has(e)?u.push(e):d.push(e);for(let e of l)c.has(e)||f.push(e);let p=i.getMetadata(),m=a.getMetadata(),h=new Set([...Object.keys(p),...Object.keys(m)]),g={},ee={},te=[],ne={};for(let e of h){let t=p[e],n=m[e];t!==void 0&&n===void 0?g[e]=t:t===void 0&&n!==void 0?ee[e]=n:t!==void 0&&n!==void 0&&(JSON.stringify(t)===JSON.stringify(n)?ne[e]=t:te.push({key:e,element1Value:t,element2Value:n}))}let re=new Set([...i.incoming()].map(e=>e.source.id)),ie=new Set([...a.incoming()].map(e=>e.source.id)),ae=new Set([...i.outgoing()].map(e=>e.target.id)),oe=new Set([...a.outgoing()].map(e=>e.target.id)),se=0,_=0,ce=0;for(let e of re)ie.has(e)?se++:_++;for(let e of ie)re.has(e)||ce++;let le=0,ue=0,v=0;for(let e of ae)oe.has(e)?le++:ue++;for(let e of oe)ae.has(e)||v++;return{element1:{id:i.id,kind:i.kind,title:i.title,description:i.description.text,technology:i.technology,shape:i.shape,color:i.color},element2:{id:a.id,kind:a.kind,title:a.title,description:a.description.text,technology:a.technology,shape:a.shape,color:a.color},propertyDiffs:o,tags:{onlyInElement1:d,onlyInElement2:f,common:u},metadata:{onlyInElement1:g,onlyInElement2:ee,different:te,common:ne},relationships:{incomingOnlyElement1:_,incomingOnlyElement2:ce,incomingShared:se,outgoingOnlyElement1:ue,outgoingOnlyElement2:v,outgoingShared:le}}}),Dv=lv({name:`find-relationship-paths`,description:`
177
179
  Discover all paths (chains of relationships) between two elements, supporting multi-hop traversal.
178
180
 
179
181
  Request:
@@ -262,7 +264,7 @@ Example response:
262
264
  }
263
265
  ]
264
266
  }
265
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:A().describe(`Source element FQN`),targetId:A().describe(`Target element FQN`),maxDepth:k().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:Dr().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:_v},outputSchema:{paths:M(j({length:k().describe(`Number of hops in the path`),steps:M(j({source:A().describe(`Source element FQN`),target:A().describe(`Target element FQN`),relationship:j({kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.sourceId);P(i,`Source element "${t.sourceId}" not found in project "${n}"`);let a=r.findElement(t.targetId);P(a,`Target element "${t.targetId}" not found in project "${n}"`),P(i.id!==a.id,`Source and target must be different elements`);let o=t.maxDepth,s=t.includeIndirect?`all`:`direct`,c=[{elementId:i.id,path:[],visited:new Set([i.id])}],l=[];for(;c.length>0&&l.length<100;){let e=c.shift();if(e.path.length>=o)continue;let t=r.findElement(e.elementId);if(t)for(let n of t.outgoing(s)){let t=n.target.id;if(t===a.id){let t={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};if(l.push({length:e.path.length+1,steps:[...e.path,t]}),l.length>=100)break;continue}if(e.visited.has(t))continue;let r={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};c.push({elementId:t,path:[...e.path,r],visited:new Set([...e.visited,t])})}}return l.sort((e,t)=>e.length-t.length),{paths:l}}),Dv=j({id:A(),title:A(),kind:A()}),Ov=j({type:kr([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:Dv,target:Dv,kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`),includedInViews:vv.describe(`Views that include this relationship`),sourceLocation:gv}),kv=a_({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
267
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationship paths`},inputSchema:{sourceId:A().describe(`Source element FQN`),targetId:A().describe(`Target element FQN`),maxDepth:k().int().min(1).max(5).optional().default(3).describe(`Maximum path length (default: 3, max: 5)`),includeIndirect:Vr().optional().default(!1).describe(`Include indirect (implied) relationships through nested elements (default: false)`),project:vv},outputSchema:{paths:M(j({length:k().describe(`Number of hops in the path`),steps:M(j({source:A().describe(`Source element FQN`),target:A().describe(`Target element FQN`),relationship:j({kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})})).describe(`Ordered sequence of relationships in the path`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=r.findElement(t.sourceId);P(i,`Source element "${t.sourceId}" not found in project "${n}"`);let a=r.findElement(t.targetId);P(a,`Target element "${t.targetId}" not found in project "${n}"`),P(i.id!==a.id,`Source and target must be different elements`);let o=t.maxDepth,s=t.includeIndirect?`all`:`direct`,c=[{elementId:i.id,path:[],visited:new Set([i.id])}],l=[];for(;c.length>0&&l.length<100;){let e=c.shift();if(e.path.length>=o)continue;let t=r.findElement(e.elementId);if(t)for(let n of t.outgoing(s)){let t=n.target.id;if(t===a.id){let t={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};if(l.push({length:e.path.length+1,steps:[...e.path,t]}),l.length>=100)break;continue}if(e.visited.has(t))continue;let r={source:n.source.id,target:n.target.id,relationship:{kind:n.kind,title:n.title,description:n.description.text,technology:n.technology,tags:[...n.tags]}};c.push({elementId:t,path:[...e.path,r],visited:new Set([...e.visited,t])})}}return l.sort((e,t)=>e.length-t.length),{paths:l}}),Ov=j({id:A(),title:A(),kind:A()}),kv=j({type:Ur([`direct`,`indirect`]).describe(`Type of relationship, "direct" for direct relationships, "indirect" for relationships through nested elements`),source:Ov,target:Ov,kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`),includedInViews:yv.describe(`Views that include this relationship`),sourceLocation:_v}),Av=lv({name:`find-relationships`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Find relationships between two elements`},description:`
266
268
  Find relationships between two LikeC4 elements within a project.
267
269
 
268
270
  What it does:
@@ -333,7 +335,7 @@ Response:
333
335
  }
334
336
  ]
335
337
  }
336
- `,inputSchema:{element1:A().describe(`Element ID (FQN)`),element2:A().describe(`Element ID (FQN)`),project:_v},outputSchema:{found:M(Ov)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project);if(Ki(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let r=[],i=await e.computedModel(n),a=i.findElement(t.element1);P(a,`Element "${t.element1}" not found in project "${n}"`);let o=i.findElement(t.element2);P(o,`Element "${t.element2}" not found in project "${n}"`);let s=bv(e,n),c=ol(a,o,`both`).flatMap(e=>[...e.relations]);for(let e of c){let t=e.source===a&&e.target===o||e.source===o&&e.target===a;r.push({type:t?`direct`:`indirect`,source:{id:e.source.id,title:e.source.title,kind:e.source.kind},target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags],includedInViews:yv(e.views()),sourceLocation:s({relation:e.id})})}return{found:r}}),Av=a_({name:`list-projects`,description:`
338
+ `,inputSchema:{element1:A().describe(`Element ID (FQN)`),element2:A().describe(`Element ID (FQN)`),project:vv},outputSchema:{found:M(kv)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project);if(Ji(t.element1,t.element2))throw Error(`No relationships possible between parent-child`);let r=[],i=await e.computedModel(n),a=i.findElement(t.element1);P(a,`Element "${t.element1}" not found in project "${n}"`);let o=i.findElement(t.element2);P(o,`Element "${t.element2}" not found in project "${n}"`);let s=xv(e,n),c=Zc(a,o,`both`).flatMap(e=>[...e.relations]);for(let e of c){let t=e.source===a&&e.target===o||e.source===o&&e.target===a;r.push({type:t?`direct`:`indirect`,source:{id:e.source.id,title:e.source.title,kind:e.source.kind},target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags],includedInViews:bv(e.views()),sourceLocation:s({relation:e.id})})}return{found:r}}),jv=lv({name:`list-projects`,description:`
337
339
  List LikeC4 projects discoverable in the current workspace.
338
340
 
339
341
  Request:
@@ -366,7 +368,7 @@ Example response:
366
368
  }
367
369
  ]
368
370
  }
369
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:M(j({id:A(),title:A(),folder:A(),sources:M(A())}))}},async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),jv=a_({name:`open-view`,description:`
371
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`List projects`},outputSchema:{projects:M(j({id:A(),title:A(),folder:A(),sources:M(A())}))}},async e=>({projects:e.projects().map(e=>({id:e.id,title:e.title,folder:e.folder.fsPath,sources:e.documents.map(e=>e.fsPath)}))})),Mv=lv({name:`open-view`,description:`
370
372
  Open a LikeC4 view in the editor's preview panel.
371
373
 
372
374
  Request:
@@ -387,7 +389,7 @@ Example response:
387
389
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
388
390
  }
389
391
  }
390
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Open view in preview panel`},inputSchema:{viewId:A().describe(`View id (name)`),project:_v},outputSchema:{location:gv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findView(t.viewId);if(!r)throw Error(`View with ID '${t.viewId}' not found in project ${n}`);return await e.views.openView(r.id,n),{location:bv(e,n)({view:r.id})}}),Mv=kr([`exact`,`contains`,`exists`]),Nv=a_({name:`query-by-metadata`,description:`
392
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Open view in preview panel`},inputSchema:{viewId:A().describe(`View id (name)`),project:vv},outputSchema:{location:_v}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findView(t.viewId);if(!r)throw Error(`View with ID '${t.viewId}' not found in project ${n}`);return await e.views.openView(r.id,n),{location:xv(e,n)({view:r.id})}}),Nv=Ur([`exact`,`contains`,`exists`]),Pv=lv({name:`query-by-metadata`,description:`
391
393
  Search elements and deployment nodes by metadata key-value pairs with flexible matching modes.
392
394
 
393
395
  Request:
@@ -453,7 +455,7 @@ Example response:
453
455
  }
454
456
  ]
455
457
  }
456
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:A().describe(`Metadata key to filter by`),value:A().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:Mv.optional().default(`exact`).describe(`Matching mode`),project:_v},outputSchema:{results:M(pv.extend({matchedValue:A().describe(`The metadata value that matched`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.matchMode,a=[],o=(e,t,n)=>{let r=Array.isArray(e)?e:[e];switch(n){case`exists`:return!0;case`exact`:return t===void 0?!1:r.some(e=>e===t);case`contains`:{if(t===void 0)return!1;let e=t.toLowerCase();return r.some(t=>t.toLowerCase().includes(e))}default:return!1}},s=(e,t,n)=>{let r=Array.isArray(e)?e:[e];if(n===`exists`||t===void 0)return r[0]||``;if(n===`exact`)return r.find(e=>e===t)||r[0]||``;if(n===`contains`){let e=t.toLowerCase();return r.find(t=>t.toLowerCase().includes(e))||r[0]||``}return r[0]||``};for(let e of r.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...mv(e),matchedValue:s(r,t.value,i)})}}if(a.length<50)for(let e of r.deployment.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...mv(e),matchedValue:s(r,t.value,i)})}}return{results:a}}),Pv=a_({name:`query-by-tag-pattern`,description:`
458
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by metadata`},inputSchema:{key:A().describe(`Metadata key to filter by`),value:A().optional().describe(`Metadata value to match (ignored for exists mode)`),matchMode:Nv.optional().default(`exact`).describe(`Matching mode`),project:vv},outputSchema:{results:M(mv.extend({matchedValue:A().describe(`The metadata value that matched`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.matchMode,a=[],o=(e,t,n)=>{let r=Array.isArray(e)?e:[e];switch(n){case`exists`:return!0;case`exact`:return t===void 0?!1:r.some(e=>e===t);case`contains`:{if(t===void 0)return!1;let e=t.toLowerCase();return r.some(t=>t.toLowerCase().includes(e))}default:return!1}},s=(e,t,n)=>{let r=Array.isArray(e)?e:[e];if(n===`exists`||t===void 0)return r[0]||``;if(n===`exact`)return r.find(e=>e===t)||r[0]||``;if(n===`contains`){let e=t.toLowerCase();return r.find(t=>t.toLowerCase().includes(e))||r[0]||``}return r[0]||``};for(let e of r.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...hv(e),matchedValue:s(r,t.value,i)})}}if(a.length<50)for(let e of r.deployment.elements()){if(a.length>=50)break;let n=e.getMetadata();if(t.key in n){let r=n[t.key];r!==void 0&&o(r,t.value,i)&&a.push({...hv(e),matchedValue:s(r,t.value,i)})}}return{results:a}}),Fv=lv({name:`query-by-tag-pattern`,description:`
457
459
  Search elements by tag patterns using prefix or substring matching.
458
460
  Useful for tag taxonomies with structured naming conventions (e.g., "schedule_*", "*_asil_*").
459
461
 
@@ -508,7 +510,7 @@ Example response:
508
510
  "truncated": false,
509
511
  "matchedTagValues": ["target_asil_qm", "target_asil_asil_b", "target_asil_qm__tbc"]
510
512
  }
511
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:A().min(1).describe(`Tag pattern to match`),matchMode:kr([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:_v},outputSchema:{results:M(pv.extend({matchedTags:M(A()).describe(`Tags that matched the pattern`)})),truncated:Dr().describe(`True if results were truncated`),matchedTagValues:M(A()).describe(`All unique tag values matching the pattern across all elements`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.pattern.toLowerCase(),a=e=>{let n=e.toLowerCase();switch(t.matchMode){case`prefix`:return n.startsWith(i);case`contains`:return n.includes(i);case`suffix`:return n.endsWith(i)}},o=[],s=!1,c=new Set;for(let e of r.elements()){let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...mv(e),matchedTags:t})}}for(let e of r.deployment.elements()){if(!ll(e))continue;let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...mv(e),matchedTags:t})}}return{results:o,truncated:s,matchedTagValues:[...c].sort((e,t)=>e.localeCompare(t))}}),Fv=a_({name:`query-by-tags`,description:`
513
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tag pattern`},inputSchema:{pattern:A().min(1).describe(`Tag pattern to match`),matchMode:Ur([`prefix`,`contains`,`suffix`]).optional().default(`prefix`).describe(`Pattern matching mode (default: prefix)`),project:vv},outputSchema:{results:M(mv.extend({matchedTags:M(A()).describe(`Tags that matched the pattern`)})),truncated:Vr().describe(`True if results were truncated`),matchedTagValues:M(A()).describe(`All unique tag values matching the pattern across all elements`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=t.pattern.toLowerCase(),a=e=>{let n=e.toLowerCase();switch(t.matchMode){case`prefix`:return n.startsWith(i);case`contains`:return n.includes(i);case`suffix`:return n.endsWith(i)}},o=[],s=!1,c=new Set;for(let e of r.elements()){let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...hv(e),matchedTags:t})}}for(let e of r.deployment.elements()){if(!el(e))continue;let t=[...e.tags].filter(a);if(t.length>0){if(t.forEach(e=>c.add(e)),o.length>=50){s=!0;continue}o.push({...hv(e),matchedTags:t})}}return{results:o,truncated:s,matchedTagValues:[...c].sort((e,t)=>e.localeCompare(t))}}),Iv=lv({name:`query-by-tags`,description:`
512
514
  Advanced tag filtering with boolean logic (AND, OR, NOT).
513
515
 
514
516
  Request:
@@ -572,7 +574,7 @@ Example response:
572
574
  }
573
575
  ]
574
576
  }
575
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:M(A()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:M(A()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:M(A()).optional().describe(`Element must have NONE of these tags (NOT)`),project:_v},outputSchema:{results:M(pv),truncated:Dr().describe(`True if results were truncated due to exceeding the 50-result limit`)}},async(e,t)=>{P(t.allOf&&t.allOf.length>0||t.anyOf&&t.anyOf.length>0||t.noneOf&&t.noneOf.length>0,`At least one condition (allOf, anyOf, or noneOf) must be specified with at least one tag`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=!1,o=e=>{let n=e instanceof Set?e:new Set(e);return!(t.allOf&&t.allOf.length>0&&!t.allOf.every(e=>n.has(e))||t.anyOf&&t.anyOf.length>0&&!t.anyOf.some(e=>n.has(e))||t.noneOf&&t.noneOf.length>0&&t.noneOf.some(e=>n.has(e)))};for(let e of r.elements()){if(i.length>=50){a=!0;break}o(e.tags)&&i.push(mv(e))}if(!a)for(let e of r.deployment.elements()){if(i.length>=50){a=!0;break}ll(e)&&o(e.tags)&&i.push(mv(e))}return{results:i,truncated:a}}),Iv=kr([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),Lv=a_({name:`query-graph`,description:`
577
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query by tags`},inputSchema:{allOf:M(A()).optional().describe(`Element must have ALL these tags (AND)`),anyOf:M(A()).optional().describe(`Element must have ANY of these tags (OR)`),noneOf:M(A()).optional().describe(`Element must have NONE of these tags (NOT)`),project:vv},outputSchema:{results:M(mv),truncated:Vr().describe(`True if results were truncated due to exceeding the 50-result limit`)}},async(e,t)=>{P(t.allOf&&t.allOf.length>0||t.anyOf&&t.anyOf.length>0||t.noneOf&&t.noneOf.length>0,`At least one condition (allOf, anyOf, or noneOf) must be specified with at least one tag`);let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n),i=[],a=!1,o=e=>{let n=e instanceof Set?e:new Set(e);return!(t.allOf&&t.allOf.length>0&&!t.allOf.every(e=>n.has(e))||t.anyOf&&t.anyOf.length>0&&!t.anyOf.some(e=>n.has(e))||t.noneOf&&t.noneOf.length>0&&t.noneOf.some(e=>n.has(e)))};for(let e of r.elements()){if(i.length>=50){a=!0;break}o(e.tags)&&i.push(hv(e))}if(!a)for(let e of r.deployment.elements()){if(i.length>=50){a=!0;break}el(e)&&o(e.tags)&&i.push(hv(e))}return{results:i,truncated:a}}),Lv=Ur([`ancestors`,`descendants`,`siblings`,`children`,`parent`,`incomers`,`outgoers`]),Rv=lv({name:`query-graph`,description:`
576
578
  Query element hierarchy and relationships in the architecture graph.
577
579
 
578
580
  Request:
@@ -644,7 +646,7 @@ Example response:
644
646
  ],
645
647
  "truncated": false
646
648
  }
647
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:A().describe(`Element id (FQN) to query`),queryType:Iv.describe(`Type of graph query`),includeIndirect:Dr().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:_v},outputSchema:{results:M(pv),truncated:Dr().describe(`True if results were truncated due to exceeding maximum limit`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);P(r,`Element "${t.elementId}" not found in project "${n}"`);let i=[],a=!1;switch(t.queryType){case`ancestors`:for(let e of r.ancestors()){if(i.length>=100){a=!0;break}i.push(mv(e))}break;case`descendants`:for(let e of r.descendants()){if(i.length>=100){a=!0;break}i.push(mv(e))}break;case`siblings`:for(let e of r.siblings()){if(i.length>=100){a=!0;break}i.push(mv(e))}break;case`children`:for(let e of r.children()){if(i.length>=100){a=!0;break}i.push(mv(e))}break;case`parent`:{let e=r.parent;e&&i.push(mv(e));break}case`incomers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.incomers(e)){if(i.length>=100){a=!0;break}i.push(mv(t))}break}case`outgoers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.outgoers(e)){if(i.length>=100){a=!0;break}i.push(mv(t))}break}}return{results:i,truncated:a}}),Rv=j({elementId:A().describe(`ID of the incoming element`),relationshipLabel:A().optional().describe(`Label on the relationship`),technology:A().optional().describe(`Technology specified on the relationship`)}),zv=a_({name:`query-incomers-graph`,description:`
649
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query element graph`},inputSchema:{elementId:A().describe(`Element id (FQN) to query`),queryType:Lv.describe(`Type of graph query`),includeIndirect:Vr().optional().default(!0).describe(`For incomers/outgoers: include indirect relationships (default: true)`),project:vv},outputSchema:{results:M(mv),truncated:Vr().describe(`True if results were truncated due to exceeding maximum limit`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);P(r,`Element "${t.elementId}" not found in project "${n}"`);let i=[],a=!1;switch(t.queryType){case`ancestors`:for(let e of r.ancestors()){if(i.length>=100){a=!0;break}i.push(hv(e))}break;case`descendants`:for(let e of r.descendants()){if(i.length>=100){a=!0;break}i.push(hv(e))}break;case`siblings`:for(let e of r.siblings()){if(i.length>=100){a=!0;break}i.push(hv(e))}break;case`children`:for(let e of r.children()){if(i.length>=100){a=!0;break}i.push(hv(e))}break;case`parent`:{let e=r.parent;e&&i.push(hv(e));break}case`incomers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.incomers(e)){if(i.length>=100){a=!0;break}i.push(hv(t))}break}case`outgoers`:{let e=t.includeIndirect?`all`:`direct`;for(let t of r.outgoers(e)){if(i.length>=100){a=!0;break}i.push(hv(t))}break}}return{results:i,truncated:a}}),zv=j({elementId:A().describe(`ID of the incoming element`),relationshipLabel:A().optional().describe(`Label on the relationship`),technology:A().optional().describe(`Technology specified on the relationship`)}),Bv=lv({name:`query-incomers-graph`,description:`
648
650
  Query the complete graph of all elements that provide input to the target element (recursive incomers/producers).
649
651
 
650
652
  This tool performs a breadth-first traversal to discover all upstream dependencies - elements that directly or
@@ -701,7 +703,7 @@ Notes:
701
703
  Example:
702
704
  For a database element, this returns all services, APIs, and components that write to it,
703
705
  plus all their dependencies, recursively up to maxDepth levels.
704
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:A().describe(`Target element id (FQN) to query incomers for`),includeIndirect:Dr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:k().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:k().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:_v},outputSchema:{target:A().describe(`Target element id`),totalNodes:k().describe(`Total number of nodes in the graph`),maxDepth:k().describe(`Maximum depth reached`),truncated:Dr().describe(`True if result was truncated due to maxNodes limit`),nodes:Nr(pv.extend({incomers:M(Rv).describe(`Incoming relationships with details`),depth:k().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);P(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=hv(r,t.elementId,`incoming`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,incomers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Bv=j({elementId:A().describe(`ID of the outgoing element`),relationshipLabel:A().optional().describe(`Label on the relationship`),technology:A().optional().describe(`Technology specified on the relationship`)}),Vv=a_({name:`query-outgoers-graph`,description:`
706
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete incomers graph`},inputSchema:{elementId:A().describe(`Target element id (FQN) to query incomers for`),includeIndirect:Vr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:k().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:k().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:vv},outputSchema:{target:A().describe(`Target element id`),totalNodes:k().describe(`Total number of nodes in the graph`),maxDepth:k().describe(`Maximum depth reached`),truncated:Vr().describe(`True if result was truncated due to maxNodes limit`),nodes:qr(mv.extend({incomers:M(zv).describe(`Incoming relationships with details`),depth:k().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);P(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=gv(r,t.elementId,`incoming`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,incomers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Vv=j({elementId:A().describe(`ID of the outgoing element`),relationshipLabel:A().optional().describe(`Label on the relationship`),technology:A().optional().describe(`Technology specified on the relationship`)}),Hv=lv({name:`query-outgoers-graph`,description:`
705
707
  Query the complete graph of all elements that receive output from the target element (recursive outgoers/consumers).
706
708
 
707
709
  This tool performs a breadth-first traversal to discover all downstream dependencies - elements that directly or
@@ -758,7 +760,7 @@ Notes:
758
760
  Example:
759
761
  For an API service, this returns all clients, services, and systems that consume its output,
760
762
  plus all their consumers, recursively up to maxDepth levels.
761
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:A().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:Dr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:k().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:k().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:_v},outputSchema:{target:A().describe(`Target element id`),totalNodes:k().describe(`Total number of nodes in the graph`),maxDepth:k().describe(`Maximum depth reached`),truncated:Dr().describe(`True if result was truncated due to maxNodes limit`),nodes:Nr(pv.extend({outgoers:M(Bv).describe(`Outgoing relationships with details`),depth:k().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);P(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=hv(r,t.elementId,`outgoing`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,outgoers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Hv=a_({name:`read-deployment`,description:`
763
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Query complete outgoers graph`},inputSchema:{elementId:A().describe(`Target element id (FQN) to query outgoers for`),includeIndirect:Vr().optional().default(!0).describe(`Include indirect relationships through nested elements (default: true)`),maxDepth:k().int().positive().max(50).optional().default(10).describe(`Maximum traversal depth (default: 10, max: 50)`),maxNodes:k().int().positive().max(2e3).optional().default(200).describe(`Maximum number of nodes to return (default: 200, max: 2000)`),project:vv},outputSchema:{target:A().describe(`Target element id`),totalNodes:k().describe(`Total number of nodes in the graph`),maxDepth:k().describe(`Maximum depth reached`),truncated:Vr().describe(`True if result was truncated due to maxNodes limit`),nodes:qr(mv.extend({outgoers:M(Vv).describe(`Outgoing relationships with details`),depth:k().describe(`Distance from target element (0 = target)`)}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=await e.computedModel(n);P(r.findElement(t.elementId),`Element "${t.elementId}" not found in project "${n}"`);let i=t.includeIndirect?`all`:`direct`,a=gv(r,t.elementId,`outgoing`,i,t.maxDepth,t.maxNodes),o={};for(let[e,t]of Object.entries(a.nodes)){let{neighbors:n,...r}=t;o[e]={...r,outgoers:n}}return{target:a.target,totalNodes:a.totalNodes,maxDepth:a.maxDepth,truncated:a.truncated,nodes:o}}),Uv=lv({name:`read-deployment`,description:`
762
764
  Read details about a deployment node or a deployed instance in a LikeC4 project.
763
765
 
764
766
  What it does:
@@ -823,7 +825,7 @@ Example response (deployed instance):
823
825
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
824
826
  }
825
827
  }
826
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:A().describe(`Deployment id (FQN)`),project:_v},outputSchema:{type:kr([`deployment-node`,`deployed-instance`]),id:A().describe(`Deployment id (FQN)`),kind:A().describe(`Deployment node kind, or element kind for deployed instances`),name:A(),title:A(),description:A().nullable(),technology:A().nullable(),tags:M(A()),project:A(),metadata:Nr(Er([A(),M(A())])),links:M(j({title:A().nullable().describe(`Optional link title`),url:A().describe(`Link URL`),relative:A().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:A(),color:A(),children:M(A()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:vv.describe(`Views that include this deployment node`),instanceof:j({id:A().describe(`Element ID (FQN)`),title:A(),kind:A()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:gv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).deployment.findElement(t.id);P(r,`Deployment entity "${t.id}" not found in project "${n}"`);let i=bv(e,n);return{type:r.isInstance()?`deployed-instance`:`deployment-node`,id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:r.isInstance()?[]:[...r.children()].map(e=>e.id),includedInViews:yv(r.views()),instanceof:r.isInstance()?{id:r.element.id,title:r.element.title,kind:r.element.kind}:null,sourceLocation:i({deployment:r.id})}}),Uv=a_({name:`read-element`,description:`
828
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read deployment entity`},inputSchema:{id:A().describe(`Deployment id (FQN)`),project:vv},outputSchema:{type:Ur([`deployment-node`,`deployed-instance`]),id:A().describe(`Deployment id (FQN)`),kind:A().describe(`Deployment node kind, or element kind for deployed instances`),name:A(),title:A(),description:A().nullable(),technology:A().nullable(),tags:M(A()),project:A(),metadata:qr(Br([A(),M(A())])),links:M(j({title:A().nullable().describe(`Optional link title`),url:A().describe(`Link URL`),relative:A().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this deployment entity`),shape:A(),color:A(),children:M(A()).describe(`Children of this deployment node (Array of Deployment ids)`),includedInViews:yv.describe(`Views that include this deployment node`),instanceof:j({id:A().describe(`Element ID (FQN)`),title:A(),kind:A()}).nullable().describe(`If type is "deployed-instance", the referenced element`),sourceLocation:_v}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).deployment.findElement(t.id);P(r,`Deployment entity "${t.id}" not found in project "${n}"`);let i=xv(e,n);return{type:r.isInstance()?`deployed-instance`:`deployment-node`,id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:r.isInstance()?[]:[...r.children()].map(e=>e.id),includedInViews:bv(r.views()),instanceof:r.isInstance()?{id:r.element.id,title:r.element.title,kind:r.element.kind}:null,sourceLocation:i({deployment:r.id})}}),Wv=lv({name:`read-element`,description:`
827
829
  Read detailed information about a LikeC4 element.
828
830
 
829
831
  Request:
@@ -910,7 +912,7 @@ Example response:
910
912
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 25, "character": 0 } }
911
913
  }
912
914
  }
913
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:A().describe(`Element id (FQN)`),project:_v},outputSchema:{id:A().describe(`Element id (FQN)`),kind:A().describe(`Element kind`),name:A().describe(`Element name`),title:A(),description:A().nullable(),technology:A().nullable(),tags:M(A()),project:A(),metadata:Nr(Er([A(),M(A())])),links:M(j({title:A().nullable().describe(`Optional link title`),url:A().describe(`Link URL`),relative:A().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:A(),color:A(),children:M(A()).describe(`Children of this element (Array of FQNs)`),defaultView:A().nullable().describe(`Name of the default view of this element`),includedInViews:vv.describe(`Views that include this element`),relationships:j({incoming:M(j({source:j({id:A(),title:A(),kind:A()}).describe(`Source element of this relationship`),kind:A().nullable().describe(`Relationship kind`),target:A().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:M(j({source:A().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:j({id:A(),title:A(),kind:A()}).describe(`Target element of this relationship`),kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:M(A()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:gv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.id);P(r,`Element "${t.id}" not found in project "${n}"`);let i=bv(e,n);return{id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:[...r.children()].map(e=>e.id),defaultView:r.defaultView?.id||null,includedInViews:yv(r.views()),relationships:{incoming:[...r.incoming()].map(e=>({source:{id:e.source.id,title:e.source.title,kind:e.source.kind},kind:e.kind,target:e.target.id,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]})),outgoing:[...r.outgoing()].map(e=>({source:e.source.id,target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]}))},deployedInstances:[...r.deployments()].map(e=>e.id),sourceLocation:i({element:r.id})}}),Wv=a_({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
915
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read element`},inputSchema:{id:A().describe(`Element id (FQN)`),project:vv},outputSchema:{id:A().describe(`Element id (FQN)`),kind:A().describe(`Element kind`),name:A().describe(`Element name`),title:A(),description:A().nullable(),technology:A().nullable(),tags:M(A()),project:A(),metadata:qr(Br([A(),M(A())])),links:M(j({title:A().nullable().describe(`Optional link title`),url:A().describe(`Link URL`),relative:A().nullable().describe(`Relative path (if URL is relative to workspace root)`)})).describe(`External links associated with this element`),shape:A(),color:A(),children:M(A()).describe(`Children of this element (Array of FQNs)`),defaultView:A().nullable().describe(`Name of the default view of this element`),includedInViews:yv.describe(`Views that include this element`),relationships:j({incoming:M(j({source:j({id:A(),title:A(),kind:A()}).describe(`Source element of this relationship`),kind:A().nullable().describe(`Relationship kind`),target:A().describe(`Target element id (FQN), either this element or nested element, if relationship is indirect`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})).describe(`Incoming relationships of this element (direct and indirect, incoming to nested elements)`),outgoing:M(j({source:A().describe(`Source element id (FQN), either this element or nested element, if relationship is indirect`),target:j({id:A(),title:A(),kind:A()}).describe(`Target element of this relationship`),kind:A().nullable().describe(`Relationship kind`),title:A().nullable().describe(`Relationship title`),description:A().nullable().describe(`Relationship description`),technology:A().nullable().describe(`Relationship technology`),tags:M(A()).describe(`Relationship tags`)})).describe(`Outgoing relationships of this element (direct and indirect, outgoing from nested elements)`)}).describe(`Relationships of this element`),deployedInstances:M(A()).describe(`Deployed instances of this element (Array of Deployment FQNs)`),sourceLocation:_v}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.id);P(r,`Element "${t.id}" not found in project "${n}"`);let i=xv(e,n);return{id:r.id,name:r.name,kind:r.kind,title:r.title,description:r.description.text,technology:r.technology,tags:[...r.tags],project:n,metadata:r.getMetadata(),links:(r.links??[]).map(e=>({title:e.title??null,url:e.url,relative:e.relative??null})),shape:r.shape,color:r.color,children:[...r.children()].map(e=>e.id),defaultView:r.defaultView?.id||null,includedInViews:bv(r.views()),relationships:{incoming:[...r.incoming()].map(e=>({source:{id:e.source.id,title:e.source.title,kind:e.source.kind},kind:e.kind,target:e.target.id,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]})),outgoing:[...r.outgoing()].map(e=>({source:e.source.id,target:{id:e.target.id,title:e.target.title,kind:e.target.kind},kind:e.kind,title:e.title,description:e.description.text,technology:e.technology,tags:[...e.tags]}))},deployedInstances:[...r.deployments()].map(e=>e.id),sourceLocation:i({element:r.id})}}),Gv=lv({name:`read-project-summary`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read project summary`},description:`
914
916
  Request:
915
917
  - project: string (optional) — project id. Defaults to "default" if omitted.
916
918
 
@@ -1001,7 +1003,7 @@ Example response:
1001
1003
  }
1002
1004
  ]
1003
1005
  }
1004
- `,inputSchema:{project:_v},outputSchema:{title:A(),folder:A(),sources:M(A()),config:dv.describe(`Project configuration`),specification:j({elementKinds:M(A()),relationshipKinds:M(A()),deploymentKinds:M(A()),tags:M(A()),metadataKeys:M(A())}),elements:M(j({id:A(),kind:A(),title:A(),tags:M(A())})).describe(`List of elements in the project`),deployments:M(Tr(`type`,[j({type:jr(`deployment-node`),id:A().describe(`Node ID`),kind:A().describe(`Deployment node kind`),title:A().describe(`Node title`),tags:M(A())}),j({type:jr(`deployed-instance`),id:A().describe(`Node ID`),title:A().describe(`Node title`),tags:M(A()),referencedElementId:A().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:M(j({id:A(),title:A(),type:kr([`element`,`deployment`,`dynamic`])}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=await e.computedModel(n);return{title:r.title,folder:r.folder.fsPath,sources:r.documents?.map(e=>e.fsPath)??[],config:fv(r.config),specification:{elementKinds:ee(i.specification.elements),relationshipKinds:ee(i.specification.relationships),deploymentKinds:ee(i.specification.deployments),tags:[...i.tags],metadataKeys:i.specification.metadataKeys??[]},elements:[...i.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...i.deployment.elements()].map(e=>e.isInstance()?{type:`deployed-instance`,id:e.id,title:e.title,tags:[...e.tags],referencedElementId:e.element.id}:{type:`deployment-node`,id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]}),views:[...i.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type}))}}),Gv=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,Kv=Tr(`type`,[j({type:jr(`element`),id:A().describe(`Node ID`),elementId:A().describe(`Element ID (FQN)`),kind:A().describe(`Element kind`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),children:M(A()).describe(`Children nodes, array of node IDs`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())}),j({type:jr(`deployment-node`),id:A().describe(`Node ID`),deploymentId:A().describe(`Deployment entity ID (FQN)`),kind:A().describe(`Deployment kind`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),children:M(A()).describe(`Children nodes, array of node IDs`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())}),j({type:jr(`deployed-instance`),id:A().describe(`Node ID`),deploymentId:A().describe(`Deployment entity ID (FQN)`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),referencedElement:j({id:A().describe(`Element ID (FQN)`),kind:A().describe(`Element kind`),title:A().describe(`Element title`)}),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())})]),qv=a_({name:`read-view`,description:`
1006
+ `,inputSchema:{project:vv},outputSchema:{title:A(),folder:A(),sources:M(A()),config:fv.describe(`Project configuration`),specification:j({elementKinds:M(A()),relationshipKinds:M(A()),deploymentKinds:M(A()),tags:M(A()),metadataKeys:M(A())}),elements:M(j({id:A(),kind:A(),title:A(),tags:M(A())})).describe(`List of elements in the project`),deployments:M(zr(`type`,[j({type:Gr(`deployment-node`),id:A().describe(`Node ID`),kind:A().describe(`Deployment node kind`),title:A().describe(`Node title`),tags:M(A())}),j({type:Gr(`deployed-instance`),id:A().describe(`Node ID`),title:A().describe(`Node title`),tags:M(A()),referencedElementId:A().describe(`Element ID (FQN)`)})])).describe(`List of deployment nodes and deployed instances in the project`),views:M(j({id:A(),title:A(),type:Ur([`element`,`deployment`,`dynamic`])}))}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=await e.computedModel(n);return{title:r.title,folder:r.folder.fsPath,sources:r.documents?.map(e=>e.fsPath)??[],config:pv(r.config),specification:{elementKinds:te(i.specification.elements),relationshipKinds:te(i.specification.relationships),deploymentKinds:te(i.specification.deployments),tags:[...i.tags],metadataKeys:i.specification.metadataKeys??[]},elements:[...i.elements()].filter(e=>!e.imported).map(e=>({id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]})),deployments:[...i.deployment.elements()].map(e=>e.isInstance()?{type:`deployed-instance`,id:e.id,title:e.title,tags:[...e.tags],referencedElementId:e.element.id}:{type:`deployment-node`,id:e.id,kind:e.kind,title:e.title,tags:[...e.tags]}),views:[...i.views()].map(e=>({id:e.id,title:e.titleOrId,type:e.$view._type}))}}),Kv=e=>e.hasElement()?e.element.id:e.hasDeployment()?e.deployment.id:null,qv=zr(`type`,[j({type:Gr(`element`),id:A().describe(`Node ID`),elementId:A().describe(`Element ID (FQN)`),kind:A().describe(`Element kind`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),children:M(A()).describe(`Children nodes, array of node IDs`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())}),j({type:Gr(`deployment-node`),id:A().describe(`Node ID`),deploymentId:A().describe(`Deployment entity ID (FQN)`),kind:A().describe(`Deployment kind`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),children:M(A()).describe(`Children nodes, array of node IDs`),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())}),j({type:Gr(`deployed-instance`),id:A().describe(`Node ID`),deploymentId:A().describe(`Deployment entity ID (FQN)`),title:A().describe(`Node title`),description:A().nullable(),technology:A().nullable(),referencedElement:j({id:A().describe(`Element ID (FQN)`),kind:A().describe(`Element kind`),title:A().describe(`Element title`)}),shape:A().describe(`Rendered shape`),color:A().describe(`Rendered color`),tags:M(A())})]),Jv=lv({name:`read-view`,description:`
1005
1007
  Read detailed information about a LikeC4 view.
1006
1008
 
1007
1009
  Request:
@@ -1049,7 +1051,7 @@ Example response:
1049
1051
  "range": { "start": { "line": 10, "character": 0 }, "end": { "line": 30, "character": 0 } }
1050
1052
  }
1051
1053
  }
1052
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:A().describe(`View id (name)`),project:_v},outputSchema:{id:A(),type:kr([`element`,`deployment`,`dynamic`]).describe(`View type`),title:A(),description:A().nullable(),tags:M(A()),project:A(),nodes:M(Kv),edges:M(j({source:A().describe(`Source node`),target:A().describe(`Target node`),label:A().nullable(),description:A().nullable(),technology:A().nullable(),tags:M(A())})).describe(`Edge represents relationship between nodes`),sourceLocation:gv}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=(await e.computedModel(n)).findView(t.viewId);if(!i)throw Error(`View with ID '${t.viewId}' not found in project ${r.id}`);let a=bv(e,r.id);return{id:i.id,type:i.$view._type,title:i.title??i.id,description:i.description.text,tags:[...i.tags],project:r.id,nodes:[...i.nodes()].flatMap(e=>{let t={id:e.id,title:e.title,description:e.description.text,technology:e.technology,shape:e.shape,color:e.color,tags:[...e.tags]};return e.hasDeployedInstance()?{...t,type:`deployed-instance`,deploymentId:e.deployment.id,referencedElement:{id:e.deployment.element.id,kind:e.deployment.element.kind,title:e.deployment.element.title}}:e.hasDeployment()?{...t,type:`deployment-node`,kind:e.deployment.kind,deploymentId:e.deployment.id,children:[...e.children()].map(e=>e.id)}:e.hasElement()?{...t,type:`element`,elementId:e.element.id,kind:e.element.kind,children:[...e.children()].flatMap(e=>Gv(e)??[])}:[]}),edges:[...i.edges()].map(e=>({source:e.source.id,target:e.target.id,label:e.label,description:e.description.text,technology:e.technology,tags:[...e.tags]})),sourceLocation:a({view:i.id})}}),Jv=M(Tr(`type`,[j({type:jr(`element`),project:A().describe(`Project ID`),id:A().describe(`Element ID (FQN)`),name:A().describe(`Element name`),kind:A(),title:A(),technology:A().nullable(),shape:A(),includedInViews:vv,metadata:Nr(Er([A(),M(A())])),tags:M(A())}),j({type:jr(`deployment-node`),project:A().describe(`Project ID`),id:A().describe(`Deployment ID (FQN)`),name:A().describe(`Deployment name`),kind:A(),title:A(),technology:A().nullable(),shape:A(),includedInViews:vv,metadata:Nr(Er([A(),M(A())])),tags:M(A())})])),Yv=a_({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
1054
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Read view`},inputSchema:{viewId:A().describe(`View id (name)`),project:vv},outputSchema:{id:A(),type:Ur([`element`,`deployment`,`dynamic`]).describe(`View type`),title:A(),description:A().nullable(),tags:M(A()),project:A(),nodes:M(qv),edges:M(j({source:A().describe(`Source node`),target:A().describe(`Target node`),label:A().nullable(),description:A().nullable(),technology:A().nullable(),tags:M(A())})).describe(`Edge represents relationship between nodes`),sourceLocation:_v}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=e.project(n),i=(await e.computedModel(n)).findView(t.viewId);if(!i)throw Error(`View with ID '${t.viewId}' not found in project ${r.id}`);let a=xv(e,r.id);return{id:i.id,type:i.$view._type,title:i.title??i.id,description:i.description.text,tags:[...i.tags],project:r.id,nodes:[...i.nodes()].flatMap(e=>{let t={id:e.id,title:e.title,description:e.description.text,technology:e.technology,shape:e.shape,color:e.color,tags:[...e.tags]};return e.hasDeployedInstance()?{...t,type:`deployed-instance`,deploymentId:e.deployment.id,referencedElement:{id:e.deployment.element.id,kind:e.deployment.element.kind,title:e.deployment.element.title}}:e.hasDeployment()?{...t,type:`deployment-node`,kind:e.deployment.kind,deploymentId:e.deployment.id,children:[...e.children()].map(e=>e.id)}:e.hasElement()?{...t,type:`element`,elementId:e.element.id,kind:e.element.kind,children:[...e.children()].flatMap(e=>Kv(e)??[])}:[]}),edges:[...i.edges()].map(e=>({source:e.source.id,target:e.target.id,label:e.label,description:e.description.text,technology:e.technology,tags:[...e.tags]})),sourceLocation:a({view:i.id})}}),Yv=M(zr(`type`,[j({type:Gr(`element`),project:A().describe(`Project ID`),id:A().describe(`Element ID (FQN)`),name:A().describe(`Element name`),kind:A(),title:A(),technology:A().nullable(),shape:A(),includedInViews:yv,metadata:qr(Br([A(),M(A())])),tags:M(A())}),j({type:Gr(`deployment-node`),project:A().describe(`Project ID`),id:A().describe(`Deployment ID (FQN)`),name:A().describe(`Deployment name`),kind:A(),title:A(),technology:A().nullable(),shape:A(),includedInViews:yv,metadata:qr(Br([A(),M(A())])),tags:M(A())})])),Xv=lv({name:`search-element`,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Search elements`},description:`
1053
1055
  Search LikeC4 elements and deployment nodes across all projects.
1054
1056
 
1055
1057
  Query syntax (case-insensitive):
@@ -1104,7 +1106,7 @@ Example response:
1104
1106
  }
1105
1107
  ]
1106
1108
  }
1107
- `,inputSchema:{search:A().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:k(),found:Jv}},async(e,t)=>{let n=e.projects(),r=[],i=t.search.toLowerCase(),a;i.startsWith(`kind:`)?(i=i.slice(5),i_.debug(`search by kind: {search}`,{search:i}),a=e=>e.kind.toLowerCase()===i):i.startsWith(`shape:`)?(i=i.slice(6),i_.debug(`search by shape: {search}`,{search:i}),a=e=>e.shape.toLowerCase()===i):i.startsWith(`meta:`)?(i=i.slice(5),i_.debug(`search by metadata: {search}`,{search:i}),a=e=>!!e.getMetadata(i)):i.startsWith(`#`)?(i=i.slice(1),i_.debug(`search by tag: {search}`,{search:i}),a=e=>e.tags.some(e=>e.toLowerCase().includes(i))):(i_.debug(`search by id/title: {search}`,{search:i}),a=e=>e.id.toLowerCase().includes(i)||e.title.toLowerCase().includes(i));for(let t of n)try{let n=await e.computedModel(t.id);for(let e of oa(n.elements(),e=>!e.imported&&a(e)))r.push({type:`element`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:yv(e.views())});for(let e of oa(n.deployment.nodes(),a))r.push({type:`deployment-node`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:yv(e.views())})}catch(e){i_.error(`Error searching in project ${t.id}:`,{error:e})}return{total:r.length,found:r.slice(0,20)}}),Xv=j({id:A().describe(`Element id (FQN)`),name:A().describe(`Element name`),kind:A().describe(`Element kind`),title:A().describe(`Human-readable title`),depth:k().describe(`Depth relative to the root element (1 = direct child)`),tags:M(A()).describe(`Assigned tags`),metadata:Nr(Er([A(),M(A())])).describe(`Element metadata`),childCount:k().describe(`Number of direct children`),incomingCount:k().describe(`Number of incoming relationships`),outgoingCount:k().describe(`Number of outgoing relationships`)}),Zv=a_({name:`subgraph-summary`,description:`
1109
+ `,inputSchema:{search:A().min(2,`Search must be at least 2 characters long`)},outputSchema:{total:k(),found:Yv}},async(e,t)=>{let n=e.projects(),r=[],i=t.search.toLowerCase(),a;i.startsWith(`kind:`)?(i=i.slice(5),cv.debug(`search by kind: {search}`,{search:i}),a=e=>e.kind.toLowerCase()===i):i.startsWith(`shape:`)?(i=i.slice(6),cv.debug(`search by shape: {search}`,{search:i}),a=e=>e.shape.toLowerCase()===i):i.startsWith(`meta:`)?(i=i.slice(5),cv.debug(`search by metadata: {search}`,{search:i}),a=e=>!!e.getMetadata(i)):i.startsWith(`#`)?(i=i.slice(1),cv.debug(`search by tag: {search}`,{search:i}),a=e=>e.tags.some(e=>e.toLowerCase().includes(i))):(cv.debug(`search by id/title: {search}`,{search:i}),a=e=>e.id.toLowerCase().includes(i)||e.title.toLowerCase().includes(i));for(let t of n)try{let n=await e.computedModel(t.id);for(let e of ca(n.elements(),e=>!e.imported&&a(e)))r.push({type:`element`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:bv(e.views())});for(let e of ca(n.deployment.nodes(),a))r.push({type:`deployment-node`,project:t.id,id:e.id,name:e.name,kind:e.kind,title:e.title,technology:e.technology,shape:e.shape,tags:[...e.tags],metadata:e.getMetadata(),includedInViews:bv(e.views())})}catch(e){cv.error(`Error searching in project ${t.id}:`,{error:e})}return{total:r.length,found:r.slice(0,20)}}),Zv=j({id:A().describe(`Element id (FQN)`),name:A().describe(`Element name`),kind:A().describe(`Element kind`),title:A().describe(`Human-readable title`),depth:k().describe(`Depth relative to the root element (1 = direct child)`),tags:M(A()).describe(`Assigned tags`),metadata:qr(Br([A(),M(A())])).describe(`Element metadata`),childCount:k().describe(`Number of direct children`),incomingCount:k().describe(`Number of incoming relationships`),outgoingCount:k().describe(`Number of outgoing relationships`)}),Qv=lv({name:`subgraph-summary`,description:`
1108
1110
  Get a compact, table-friendly summary of all descendants of a parent element.
1109
1111
  Returns each descendant with its depth, metadata, tags, and relationship counts in a single call.
1110
1112
  Much more efficient than calling read-element for each descendant individually.
@@ -1170,7 +1172,7 @@ Example response:
1170
1172
  "truncated": false,
1171
1173
  "truncatedByDepth": false
1172
1174
  }
1173
- `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:A().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:k().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:M(A()).optional().describe(`If provided, only include these metadata keys in the response`),project:_v},outputSchema:{root:j({id:A(),kind:A(),title:A(),childCount:k()}),descendants:M(Xv),totalDescendants:k().describe(`Total number of descendants found`),truncated:Dr().describe(`True if results were truncated due to exceeding the limit`),truncatedByDepth:Dr().describe(`True if deeper descendants exist beyond maxDepth`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);P(r,`Element "${t.elementId}" not found in project "${n}"`);let i=t.maxDepth,a=t.metadataKeys,o=[],s=0,c=!1,l=!1,u=[],d=[...r.children()];for(let e of d)u.push({element:e,depth:1});for(;u.length>0;){let{element:e,depth:t}=u.shift();if(t>i){l=!0;continue}s++;let n=[...e.children()];if(o.length<200){let r=e.getMetadata(),i=a?Object.fromEntries(a.filter(e=>e in r).map(e=>[e,r[e]])):r;o.push({id:e.id,name:e.name,kind:e.kind,title:e.title,depth:t,tags:[...e.tags],metadata:i,childCount:n.length,incomingCount:[...e.incoming()].length,outgoingCount:[...e.outgoing()].length})}else c=!0;for(let e of n)u.push({element:e,depth:t+1})}return{root:{id:r.id,kind:r.kind,title:r.title,childCount:d.length},descendants:o,totalDescendants:s,truncated:c,truncatedByDepth:l}});var Qv=class{constructor(e){this.services=e}create(e){let t=this.services.shared.lsp.Connection!==void 0,n=new Or({name:`LikeC4`,version:s_},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
1175
+ `,annotations:{readOnlyHint:!0,idempotentHint:!0,title:`Subgraph summary`},inputSchema:{elementId:A().describe(`Parent element id (FQN) whose descendants to summarize`),maxDepth:k().int().min(1).max(20).optional().default(10).describe(`Maximum depth of descendants to include (default: 10, max: 20)`),metadataKeys:M(A()).optional().describe(`If provided, only include these metadata keys in the response`),project:vv},outputSchema:{root:j({id:A(),kind:A(),title:A(),childCount:k()}),descendants:M(Zv),totalDescendants:k().describe(`Total number of descendants found`),truncated:Vr().describe(`True if results were truncated due to exceeding the limit`),truncatedByDepth:Vr().describe(`True if deeper descendants exist beyond maxDepth`)}},async(e,t)=>{let n=e.projectsManager.ensureProjectId(t.project),r=(await e.computedModel(n)).findElement(t.elementId);P(r,`Element "${t.elementId}" not found in project "${n}"`);let i=t.maxDepth,a=t.metadataKeys,o=[],s=0,c=!1,l=!1,u=[],d=[...r.children()];for(let e of d)u.push({element:e,depth:1});for(;u.length>0;){let{element:e,depth:t}=u.shift();if(t>i){l=!0;continue}s++;let n=[...e.children()];if(o.length<200){let r=e.getMetadata(),i=a?Object.fromEntries(a.filter(e=>e in r).map(e=>[e,r[e]])):r;o.push({id:e.id,name:e.name,kind:e.kind,title:e.title,depth:t,tags:[...e.tags],metadata:i,childCount:n.length,incomingCount:[...e.incoming()].length,outgoingCount:[...e.outgoing()].length})}else c=!0;for(let e of n)u.push({element:e,depth:t+1})}return{root:{id:r.id,kind:r.kind,title:r.title,childCount:d.length},descendants:o,totalDescendants:s,truncated:c,truncatedByDepth:l}});var $v=class{constructor(e){this.services=e}create(e){let t=this.services.shared.lsp.Connection!==void 0,n=new Hr({name:`LikeC4`,version:dv},{instructions:`LikeC4 MCP – query and navigate LikeC4 models.
1174
1176
 
1175
1177
  Conventions:
1176
1178
  - All tools are read-only and idempotent.
@@ -1204,47 +1206,48 @@ Instructions:
1204
1206
  - If response returns "sourceLocation", provide link to this location in the editor
1205
1207
 
1206
1208
  Full documentation: https://likec4.dev/llms-full.txt
1207
- `,enforceStrictCapabilities:!0,...e,capabilities:{tools:{},logging:{},...e?.capabilities}});return n.registerTool(...Av(this.services.likec4.LanguageServices)),n.registerTool(...Wv(this.services.likec4.LanguageServices)),n.registerTool(...Uv(this.services.likec4.LanguageServices)),n.registerTool(...Hv(this.services.likec4.LanguageServices)),n.registerTool(...qv(this.services.likec4.LanguageServices)),n.registerTool(...Yv(this.services.likec4.LanguageServices)),n.registerTool(...kv(this.services.likec4.LanguageServices)),n.registerTool(...Lv(this.services.likec4.LanguageServices)),n.registerTool(...zv(this.services.likec4.LanguageServices)),n.registerTool(...Vv(this.services.likec4.LanguageServices)),n.registerTool(...Nv(this.services.likec4.LanguageServices)),n.registerTool(...Fv(this.services.likec4.LanguageServices)),n.registerTool(...Ev(this.services.likec4.LanguageServices)),n.registerTool(...Sv(this.services.likec4.LanguageServices)),n.registerTool(...Pv(this.services.likec4.LanguageServices)),n.registerTool(...Tv(this.services.likec4.LanguageServices)),n.registerTool(...Zv(this.services.likec4.LanguageServices)),t&&n.registerTool(...jv(this.services.likec4.LanguageServices)),n.server.onerror=e=>{K.error(U(e))},n}},$v=class{transport=void 0;_mcp=void 0;constructor(e){this.services=e}get mcp(){if(!this._mcp)throw Error(`MCP server is not started`);return this._mcp}get isStarted(){return this.transport!==void 0}get port(){return NaN}async dispose(){await this.stop()}async start(){this.transport||(i_.info(`Starting MCP stdio server`),this._mcp=this.services.mcp.ServerFactory.create(),this.transport=new Mr,await this._mcp.connect(this.transport),i_.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{i_.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0}}};async function ey(e){let t=new vr;t.use(`*`,br({origin:`*`,allowHeaders:[`Content-Type`,`mcp-session-id`,`Last-Event-ID`,`mcp-protocol-version`],exposeHeaders:[`mcp-session-id`,`mcp-protocol-version`]})),t.get(`/health`,e=>e.json({status:`ok`}));let n=e.create(),r=new yr({eventStore:new xr({})});return t.all(`/mcp`,async e=>(n.isConnected()||await n.connect(r),await r.handleRequest(e))),t.notFound(e=>(i_.debug(`${e.req.method} ${e.req.url} not found`),e.json({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not found.`},id:null},{status:404}))),t.onError((e,t)=>(i_.error(U(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function ty(e){let{factory:t,port:n}=e,r=await ey(t);return new Promise((e,t)=>{let i=Kr({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.unref())})})}var ny=class{server=void 0;constructor(e,t=33335){this.services=e,this._port=t}get mcp(){throw Error(`StreamableLikeC4MCPServer has access to McpServer only during the request`)}get isStarted(){return this.server?.listening===!0}get port(){return this._port}async dispose(){await this.stop()}async start(e=this._port){if(this.server){if(this.port===e)return;await this.stop()}i_.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await ty({factory:this.services.mcp.ServerFactory,port:e}),i_.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(i_.info(`Stopping MCP server`),this.server=void 0,new Promise(t=>{e.close(e=>{e?i_.error(`Failed to stop MCP server`,{err:e}):i_.info(`MCP server stopped`),t()})})):(i_.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};function ry(e,t=33335){i_.debug(`Creating StreamableLikeC4MCPServer`);let n=new ny(e,t),r=e.LanguageMetaData.languageId,i=e.shared.lsp.Connection;return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>{if(e.section!==r){i_.warn(`Unexpected configuration update: {update}`,{update:e});return}let{enabled:a=!1,port:o=t}=e.configuration.mcp;if(!a){n.stop();return}Promise.resolve().then(()=>n.start(o)).then(()=>{i?.telemetry?.logEvent({eventName:`mcp-server-started`,mcpPort:o})}).catch(e=>{let t=U(e);i?.telemetry?.logEvent({eventName:`mcp-server-start-failed`,mcpPort:o,message:t}),i_.warn(`Failed to start LikeC4 MCP Server: \n${t}`),i&&i.window.showErrorMessage(`LikeC4: Failed to start MCP Server\n\n${t}`)})}),n}function iy(e){return new $v(e)}function ay(e=`sse`){return{mcpServer:t=>e===`stdio`?iy(t):ry(t,typeof e==`object`?e.port:33335),mcpServerFactory:e=>new Qv(e)}}var oy=class extends Wn{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!lf(e)&&!af(e)&&!Hf(e))return super.getDocumentation(e);try{let t=Dn(e);if(t.state<Yn.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case lf(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case af(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=B.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],o=i?this.locator.getParsedElement(a,i):this.locator.getParsedElement(a),s=[`_instance of_ \`${a}\``];return o&&s.push(`**${o.element.title}**`),s.join(`
1208
- `)}case Hf(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
1209
- `):void 0}default:return e}}catch(e){q(e)}}};function sy(e,t){return[e,t]=cy(e,t)>0?[t,e]:[e,t],ly(e.range,t.range.start)}function cy(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function ly(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 uy(e){return!!e&&e.range.start.line!=e.range.end.line}const X={newLine:ir.newLine({allowMore:!0}),oneSpace:ir.oneSpace(),noSpace:ir.noSpace(),indent:ir.indent({allowMore:!0}),noIndent:ir.noIndent()};var dy=class extends $n{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}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.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,zh,(e,t)=>{let n=gr(e.$cstNode,`values`).filter(C).slice(1);t.cst(n).prepend(X.oneSpace),t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatDeploymentRelation(e){this.on(e,hf,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...S([e.target,e.tags],C)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)})}formatExtendDeployment(e){this.on(e,dp,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatRelation(e){this.on(e,e=>Km(e)||hf(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...S([e.target,e.tags],C)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)}),this.on(e,Wu,(e,t)=>{t.keywords(`->`,`<-`).surround(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.properties(`title`).prepend(X.oneSpace),(Eg(e)&&uy(e.$cstNode)||Og(e)&&Eg(e.$container)&&uy(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(ir.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(ir.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&uy(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){um(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(X.noIndent)}indentContentInBraces(e){if(fm(e)||Oh(e)||bh(e)||wh(e)||vh(e)||Lp(e)||zp(e)||Vp(e)||Fp(e)||Np(e)||Vp(e)||Em(e)||Wf(e)||_p(e)||Jm(e)||ch(e)||wm(e)||Am(e)||op(e)||jf(e)||xf(e)||ng(e)||Xh(e)||ef(e)||nf(e)||ep(e)||zf(e)||Om(e)||df(e)||_f(e)||sf(e)||pp(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(X.noIndent).prepend(X.oneSpace);let r=uy(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(X.oneSpace);continue}(!o||!sy(o,e))&&t.cst([e]).prepend(ir.newLine({allowMore:!0})).prepend(X.indent),o=e}r?i.prepend(X.noIndent).prepend(ir.newLine({allowMore:!0})):i.prepend(ir.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,Kf)?.keywords(`element`).append(X.oneSpace)}formatView(e){this.on(e,ip,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(X.oneSpace),t.keywords(`of`,`extends`).surround(X.oneSpace)}),this.on(e,kf)?.keywords(`dynamic`,`view`).append(X.oneSpace),this.on(e,yf)?.keywords(`deployment`,`view`).append(X.oneSpace)}formatLeafProperty(e){if(Qf(e)||oh(e)||ig(e)||Im(e)||Rm(e)||Sh(e)||Eh(e)||Zd(e)||mm(e)||qd(e)||Xp(e)||fh(e)||Yd(e)||Bm(e)||Mm(e)||Kp(e)||Qp(e)||Jp(e)||mh(e)||Wm(e)||Vh(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(X.oneSpace):n.prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)}}formatLinkProperty(e){this.on(e,gm,(e,t)=>{t.keyword(`link`).append(X.oneSpace),t.property(`value`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatNavigateToProperty(e){this.on(e,Pm)?.property(`key`).append(X.oneSpace)}formatAutolayoutProperty(e){this.on(e,Wh,(e,t)=>{t.keyword(`autoLayout`).append(X.oneSpace),t.property(`rankSep`).prepend(X.oneSpace),t.property(`nodeSep`).prepend(X.oneSpace)})}formatMetadataProperty(e){this.on(e,Sm,(e,t)=>{t.property(`key`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatElementDeclaration(e){this.on(e,Hf,(e,t)=>{let n=wn(e.$cstNode,`kind`),r=wn(e.$cstNode,`name`);r&&n&&(cy(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`props`).prepend(X.oneSpace)})}formatExtendElement(e){this.on(e,hp,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatGlobals(e){this.on(e,zp,(e,t)=>{t.keyword(`style`).append(X.oneSpace),t.property(`id`).append(X.oneSpace)}),this.on(e,Vp,(e,t)=>{t.keyword(`styleGroup`).append(X.oneSpace)}),this.on(e,Fp,(e,t)=>{t.keyword(`predicateGroup`).append(X.oneSpace)}),this.on(e,Np,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(X.oneSpace)})}formatImports(e){this.on(e,nm,(e,t)=>{t.keyword(`import`).append(X.oneSpace),t.keywords(`{`,`}`,`from`).surround(X.oneSpace)}),this.on(e,em,(e,t)=>{t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatSpecificationRule(e){if((bh(e)||wh(e)||Ah(e)||vh(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(X.oneSpace),gh(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(X.oneSpace),t.property(`name`).append(X.oneSpace)}}formatWithPredicate(e){(Dp(e)||Qm(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(X.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,lf,(e,t)=>{let n=wn(e.$cstNode,`kind`),r=wn(e.$cstNode,`name`);r&&n&&(cy(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`title`).prepend(X.oneSpace)})}formatDeployedInstance(e){this.on(e,af,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(X.oneSpace),t.keyword(`instanceOf`).append(X.oneSpace),t.property(`title`).prepend(X.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,Jh,(e,t)=>{t.keywords(`global`,`style`).append(X.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(Kh(e)||Ff(e))&&t.keywords(`global`,`predicate`).append(X.oneSpace)}formatViewRuleGroup(e){this.on(e,Xh,(e,t)=>{t.keyword(`group`).append(X.oneSpace)})}formatViewRuleStyle(e){this.on(e,ng)?.keyword(`style`).append(X.oneSpace),this.on(e,Tf)?.keyword(`style`).append(X.oneSpace),this.on(e,lp)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace),this.on(e,Cp)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace)}formatWhereExpression(e){(Xm(e)||Tp(e))&&this.getNodeFormatter(e).keyword(`where`).append(X.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,Hd,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,gg,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),Bd(e)||Sg(e)||mg(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,Fd,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,ug,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),Nd(e)||fg(e)||cg(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatIncludeExcludeExpressions(e){if(Hu(e)||Qh(e)||Cf(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!uy(e.$cstNode))&&t.keywords(`include`,`exclude`).append(X.oneSpace)}if(lp(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&uy(n?.$cstNode);r&&t.property(`value`).prepend(X.indent),t.keyword(`,`).prepend(X.noSpace).append(r?X.newLine:X.oneSpace)}}formatRelationExpression(e){this.on(e,im,(e,t)=>{t.keyword(`->`).append(X.oneSpace)}),this.on(e,om,(e,t)=>{t.keyword(`->`).prepend(X.oneSpace)}),this.on(e,Hm,(e,t)=>{t.keywords(`->`,`<->`).prepend(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace)}),this.on(e,Df,(e,t)=>{t.property(`target`).prepend(X.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Hu(t)||Qh(t)||Cf(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:F(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,Cd)?.property(`value`),t??=this.on(e,Hf)?.properties(`props`),t??=this.on(e,nm)?.properties(`project`),t??=this.on(e,Km)?.properties(`title`,`technology`),t??=this.on(e,Xh)?.properties(`title`),t??=this.on(e,Wu)?.properties(`title`),t??=this.on(e,lf)?.properties(`title`),t??=this.on(e,af)?.properties(`title`),t??=this.on(e,hf)?.properties(`title`,`technology`),t??=this.on(e,gm)?.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,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}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`}}}};function fy(e,t){let n=[],r=e.parent;for(;r;){let e=N(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function py(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);P(t,`Source node ${n.source} not found`),P(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=fy(t,e),a=fy(r,e),o=i.length>0&&a.length>0?Re(zi(je(i),je(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}var my=ut(),hy=t(dt(),1);function gy(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function _y(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function vy(e){let t=gy([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let r=t=>N(e.nodes.get(t)),i=new $t({multi:!0,allowSelfLoops:!0,type:`directed`}),[a,o]=it(w(n,y(e=>{let t=r(e.source),n=r(e.target),i=e.parent?r(e.parent):null;return{id:e.id,edge:e,parent:i,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),s=[],c=e=>{i.mergeNode(e.source),i.mergeNode(e.target),s.push(e),(0,hy.default)(i,e.source,e.target)||i.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:o}of a)if(c(t),o.parent&&o.parent!==t.parent&&w(fy(o,e.nodes),Ze(e=>e.inEdges.includes(t.id)),me(e=>{i.mergeNode(e.id),(0,hy.default)(i,t.source,e.id)||i.mergeDirectedEdge(t.source,e.id),(0,hy.default)(i,e.id,t.target)||i.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=r(n.parent);i.mergeNode(e.id),(0,hy.default)(i,e.id,n.id)||i.mergeDirectedEdge(e.id,n.id),o.parent&&o.parent!==n.parent&&((0,hy.default)(i,e.id,o.parent)||i.mergeDirectedEdge(e.id,o.parent))}for(let{edge:e}of o)c(e);P(s.length===n.length,`Not all edges were added to the graph`);let l=(0,my.topologicalSort)(i),u=[],d=t.slice();for(let e of l){let t=d.findIndex(t=>t.id===e);P(t>=0,`Node "${e}" not found`),u.push(...d.splice(t,1))}return d.length>0&&u.length>0&&(u=u.flatMap(e=>{if(d.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>d.includes(e));return n.length>0?(d=d.filter(e=>!n.includes(e)),[...n,e]):e})),u.push(...d),{nodes:_y(gy(u)),edges:s}}function yy(e){return e.hash=Da({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:w(e.nodes,y(e=>({id:e.id,icon:C(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:Ja(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconPosition:e.style.iconPosition??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),re(({id:e,...t})=>[e,t])),edges:w(e.edges,y(e=>({source:e.source,target:e.target,label:e.label,description:Ja(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),re(({source:e,target:t,...n})=>[`${e}:${t}`,n]))}),e}var by=class{get Ctx(){throw Error(`Should not be called in runtime`)}constructor(e){this.state=e}get elements(){return this.state.elements}get explicits(){return this.state.explicits}get final(){return this.state.final}get connections(){return this.state.connections}isEmpty(){return this.elements.size===0&&this.connections.length===0&&this.explicits.size===0&&this.final.size===0}},xy=class{excluded={elements:new Set,connections:[]};constructor(e,t){this.memory=e,this.expression=t}markedToMoveExplicitToImplicit=!1;_removeElement(e){this.excluded.elements.add(e)}exclude(e){if(!e)return this;if(aa(e)){for(let t of e)this._removeElement(t);return this}return this._removeElement(e),this}_removeConnection(e){this.excluded.connections.push(e)}excludeConnections(e,t){if(ve(t)&&(P(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),aa(e)){for(let t of e)this._removeConnection(t);return this}return this._removeConnection(e),this}isDirty(){return this.excluded.elements.size>0||this.excluded.connections.length>0}isEmpty(){return!this.isDirty()}filterForMoveToImplicits(e){return this.markedToMoveExplicitToImplicit||this.excluded.elements.size>0?e:new Set}moveDisconnectedExplicitsToImplicits(e){let t=Ca(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=Sa(t,e.elements),t=w(t,oa(t=>e.explicits.has(t)&&!pa(e.final,qi(t))),ma()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=Ca(e.explicits,t),e.final=Ca(e.final,t)),e}removeElements(e){return e.elements=Ca(e.elements,this.excluded.elements),e.explicits=Ca(e.explicits,this.excluded.elements),e.final=Ca(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=Ca(n,e.explicits),e.final=Ca(e.final,n),e)}precommit(e){return e}postcommit(e){return P(Ca(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),P(Ca(e.final,e.elements).size===0,`Final elements must be subset of elements`),e}commit(){let e=this.precommit(this.memory.mutableState());if(this.excluded.elements.size>0){let t=e.connections.filter(e=>this.excluded.elements.has(e.source)||this.excluded.elements.has(e.target)).flatMap(t=>[t,...Kc(e.connections,t).map(e=>e.intersect(t))]).filter(e=>e.nonEmpty());this.excludeConnections(t)}return this.excluded.connections.length>0&&(e=this.removeConnections(e)),this.excluded.elements.size>0&&(e=this.removeElements(e)),this.memory.update(this.postcommit(e))}},Sy=class{explicits=new Set;implicits=new Set;_ordered=new Set;_connections=[];constructor(e,t){this.memory=e,this.expression=t}get elements(){return this.explicits}get connections(){return this._connections}mergedConnections(){return Jc([...this.memory.connections,...this._connections])}connectWithExisting(e,t){throw Error(`Method not implements, depends on the model`)}_addExplicit(e){this._ordered.add(e),this.explicits.add(e),this.implicits.delete(e)}addExplicit(e){if(!e)return this;if(aa(e)){for(let t of e)this._addExplicit(t);return this}return this._addExplicit(e),this}_addImplicit(e){this.explicits.has(e)||(this._ordered.add(e),this.implicits.add(e))}addImplicit(e){if(!e)return this;if(aa(e)){for(let t of e)this._addImplicit(t);return this}return this._addImplicit(e),this}_addConnection(e){this._connections.push(e),this._addImplicit(e.source),this._addImplicit(e.target)}addConnections(e){if(aa(e)){for(let t of e)this._addConnection(t);return this}return this._addConnection(e),this}isDirty(){return this.explicits.size>0||this.implicits.size>0||this._connections.length>0}isEmpty(){return!this.isDirty()}precommit(e){return e}postcommit(e){return e}processConnections(e){return e}commit(){let e=this.precommit(this.memory.mutableState()),t=new Set;if(this._connections.length>0){let[n,r]=it(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(Jc([...e.connections,...n,...r])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=xa(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=Sa(e.elements,xa(e.explicits,this.explicits)),e.final=Sa(e.elements,xa(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function Cy(e,t=`final`){let n=na(L(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new vt.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>I(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>I(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new vt.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(Rc.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var wy=class extends xy{};function Ty(e){if(H.isCustom(e))return Ty(e.custom.expr);if(H.isWhere(e)){let t=Ty(e.where.expr),n=vo(e.where.condition);return e=>t(e)&&n(e)}if(H.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(H.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(H.isWildcard(e))return()=>!0;if(H.isModelRef(e)){let t=B.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||Ui(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}F(e)}function Ey(e,t,n){let{shape:r,color:i,icon:a,...o}=e.style,s=!b(o);w(n,S(ue(Za)),S(t),me(t=>{t.shape=r??t.shape,t.color=i??t.color,se(a)&&(t.icon=a),se(e.notation)&&(t.notation=e.notation),s&&(t.style={...t.style,...o})}))}function Dy(e,t){for(let n of e)!xo(n)||n.targets.length===0||Ey(n,Ve(n.targets.map(Ty)),t);return t}var Oy=class e{static kind=Xa;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(t){return new e(this.id,this.viewRule,this.parent,t)}clone(){return new e(this.id,this.viewRule,this.parent,new Set(this.elements))}},ky=class extends xy{excludeRelations(e){return w(this.memory.connections,S(t=>Ea(t.relations,e)),me(t=>{this.excludeConnections(t.update(Sa(t.relations,e)))})),this}precommit(e){if(this.excluded.elements.size>0){let e=new Set([...this.excluded.elements].flatMap(e=>[...e.incoming(`direct`),...e.outgoing(`direct`)]));this.excludeRelations(e)}return e}postcommit(e){let t=Ca(this.memory.explicits,e.explicits);for(let n of t)e.explicitFirstSeenIn.delete(n);let n=Ca(this.memory.elements,e.elements);for(let t of n)e.lastSeenIn.delete(t);return e}},Ay=class extends ky{constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:jy,findConnectionsBetween:My}=al;var Ny=class extends Sy{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!aa(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(jy(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(My(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(My(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(My(e,this.memory.elements,`directed`));return r()}addImplicitWithinScope(e){e&&(!this.memory.scope||I(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return co.isRelationExpr(this.expression)||w(e,me(({source:e,target:t,boundary:n})=>{w(Qe([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),Ge(([e,t])=>e===t),Ee(1),me(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=Ca(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@root`);return e}},Py=class extends Ny{constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=Ca(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},Fy=class e extends by{static empty(t){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},t)}constructor(e,t){super(e),this.state=e,this.scope=t}get groups(){return this.state.groups}get explicitFirstSeenIn(){return this.state.explicitFirstSeenIn}get lastSeenIn(){return this.state.lastSeenIn}stageInclude(e){return new Ny(this,e)}stageExclude(e){return new ky(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections],groups:this.state.groups.map(e=>e.clone()),explicitFirstSeenIn:new Map(this.state.explicitFirstSeenIn),lastSeenIn:new Map(this.state.lastSeenIn)}}update(t){return new e({...this.state,...t},this.scope)}},Iy=class e extends Fy{static enter(t,n){let r=`@gr${t.groups.length+1}`;if(t instanceof e){let i=_t.default.from([...t.stack].reverse()),a=t.mutableState();return a.groups.push(new Oy(r,n,t.activeGroupId)),i.push(r),new e(a,t.scope,i)}let i=t.mutableState();i.groups.push(new Oy(r,n,null));let a=_t.default.of(r);return new e(i,t.scope,a)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}get activeGroupId(){return N(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(t){return new e({...this.state,...t},this.scope,this.stack)}stageInclude(e){return new Py(this,e)}stageExclude(e){return new Ay(this,e)}leave(){let t=this.mutableState();return this.stack.pop(),this.stack.peek()?new e(t,this.scope,this.stack):new Fy(t,this.scope)}};function Ly(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function Ry(e){let{id:t,title:n,...r}=_e(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return z({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:La(e.$element),tags:[...e.tags],...r})}function zy({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&N(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:Xa,title:a.title??``,color:a.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:z({border:a.border??e.group.border,opacity:a.opacity??e.group.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort($i).forEach(({id:e,...t})=>{let n=Ui(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=Ui(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=N(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,Ly(o,r)),o.children.push(e),a=o.level+1);let c=z({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),a}function By(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...Te(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function Vy(e,t){let n=w(e,Ke((e,t)=>(C(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),C(t.description)&&!e.description.some(Je(t.description))&&e.description.push(t.description),C(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),C(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),C(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),C(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),C(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),C(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),C(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=ge(n.title)??(n.title.length>1?`[...]`:void 0),i=Ce(n.tags),a=z({title:r,description:ge(n.description),technology:ge(n.technology),kind:ge(n.kind),head:ge(n.head),tail:ge(n.tail),color:ge(n.color),line:ge(n.line),navigateTo:ge(n.navigateTo),...Vi(i)&&{tags:i}});if(t){let e=By(t);a=at({...a,...e},C)}return v(a.title)&&C(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:Hy,findConnectionsBetween:Uy,findConnectionsWithin:Wy}=tl;function Gy(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}function Ky(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function qy(e){if(V.isWildcard(e))return()=>!0;if(V.isElementTagExpr(e)||V.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(V.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>Ui(e.id)===t:e=>e.id===t}if(V.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?Ui(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}F(e)}function Jy(e){return La(e.$instance)??La(e.element.$element)}function Yy(e){let t=e.id,n=e.onlyOneInstance();return z({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:T(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:La(e.$node)??void 0,tags:[...e.tags],style:_e(e.style,[`icon`,`shape`,`color`])})}function Xy(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.links,...t.links??[]];return z({id:e.id,kind:`instance`,title:e.title,description:Jy(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:T(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function Zy(e){return e.isInstance()?Xy(e):Yy(e)}function Qy(e){return e.reduce((e,t)=>{let n=[...t.relations.model,...t.relations.deployment];P(T(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=Vy(n.map(e=>e.$relationship)),d=z({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u}),f=e.find(e=>e.source===a&&e.target===i);if(f&&d.label===f.label){f.dir=`both`;let n=f.head??d.head??t.source.$model.$styles.defaults.relationship.arrow;return f.head??=n,f.tail??=n,d.color&&(f.color??=d.color),d.line&&(f.line??=d.line),e}return e.push(d),e},[])}function $y(e,t){let n=zy(e.$styles,[...t.final].map(Zy));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=Jy(r)??null,t.technology??=r.technology,b(t.tags)&&(t.tags=[...r.tags]),(!t.links||b(t.links))&&T(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}function eb(e,t){for(let n of e)!xo(n)||n.targets.length===0||Ey(n,Ve(n.targets.map(qy)),t);return t}function tb(e){let t=new vt.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new vt.default(()=>new Set);for(let[e,r]of t)T(r,2)&&w(r,_(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),xe(x(`group`)),Ye(),S(T(2)),me(nt(y(x(`conn`)),Wc(`desc`),Ge((e,t,n)=>t===0||e.boundary===n[t-1].boundary),me(t=>{n.get(t).add(e)}))));return n}function nb(e){e=Jc(e);let t=tb(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;P(r.isDeploymentNode());let a=Sa(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=xa(Sa(n.relations.model,e.internalModelRelationships()),Sa(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return w(t.entries(),fa(([e,t])=>e.update({model:t,deployment:null})),L())}function rb(e){return Yc(e,nb(e))}function ib(e){return w(e,Jc,Ke((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=Ec.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=Hy(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)Vc(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new Bc(r,i,o)),t},[]))}function ab(e){return Yc(e,ib(e))}var ob=class extends Sy{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!aa(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(Hy(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Uy(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Uy(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(Uy(e,this.memory.elements,`directed`));return r()}processConnections(e){let t=w(e,rb,ab);return w(t,me(({source:e,target:t,boundary:n})=>{w(Qe([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),Ge(([e,t])=>e===t),Ee(1),me(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},sb=class e extends by{static empty(){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new ob(this,e)}stageExclude(e){return new wy(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections]}}update(t){return new e({...this.state,...t})}equals(t){return t instanceof e&&Je(this.state,t.state)}diff(e){return{added:{elements:L(Ca(e.elements,this.elements)),explicits:L(Ca(e.explicits,this.explicits)),final:L(Ca(e.final,this.final)),connections:L(Yc(e.connections,this.connections))},removed:{elements:L(Ca(this.elements,e.elements)),explicits:L(Ca(this.explicits,e.explicits)),final:L(Ca(this.final,e.final)),connections:Yc(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
1210
- `)}[zc](e,t,n){return this.toString()}};const cb={include:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return bb(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return bb(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},lb={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=Cb(Uy(e,[...Ob(e)],`directed`),i);r.addConnections(t)}return r}P(V.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=Gy(t,e.incoming);for(let e of a){let t=Cb(Uy(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.incoming)||V.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.incoming))return xb(db(t,e.incoming),{stage:r,memory:n},i);if(V.isWildcard(e.incoming))return r;let a=ub(Gy(t,e.incoming)),o=w(n.connections,S(a),Cb(i));return r.excludeConnections(o),r}};function ub(e){return Ve(e.map(e=>{let t=t=>t===e||I(e,t);return e=>!t(e.source)&&t(e.target)}))}function db(e,t){let n=Ky(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const fb={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of Ob(e)){let n=Cb(Hy(t,e,`directed`),i);r.addConnections(n)}return r}P(V.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=Gy(t,e.outgoing);for(let e of o){let t=Cb(Uy(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.outgoing)||V.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.outgoing))return xb(mb(t,e.outgoing),{stage:r,memory:n},i);if(V.isWildcard(e.outgoing))return r;let a=pb(Gy(t,e.outgoing)),o=w(n.connections,S(a),Cb(i));return r.excludeConnections(o),r}};function pb(e){return Ve(e.map(e=>{let t=t=>t===e||I(e,t);return e=>t(e.source)&&!t(e.target)}))}function mb(e,t){let n=Ky(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const hb={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(V.isElementTagExpr(e)||V.isElementKindExpr(e)||V.isElementTagExpr(t)||V.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);P(!V.isModelRef(e),`Invalid source model ref in direct relation`),P(!V.isModelRef(t),`Invalid target model ref in direct relation`);let o=V.isWildcard(e),s=V.isWildcard(t),c=n?`both`:`directed`,l;switch(!0){case o&&s:l=w(Wy(r.instances()),Cb(a),y(e=>(i.addImplicit(e.boundary),e)));break;case!o&&s:{let t=Gy(r,e),i=pb(t),o=i;if(n){let e=ub(t);o=t=>i(t)!==e(t)}l=w(t,_(e=>Uy(e,Ob(e),c)),S(o),Cb(a));break}case o&&!s:{let e=Gy(r,t),i=ub(e),o=i;if(n){let t=pb(e);o=e=>t(e)!==i(e)}l=w(e,_(e=>[...Ob(e)].flatMap(t=>Hy(t,e,c))),S(o),Cb(a));break}default:{P(!o,`Inference failed - source should be a deployment ref`),P(!s,`Inference failed - target should be a deployment ref`);let n=Gy(r,e),i=Gy(r,t),u=pb(n),d=ub(i);l=w(n,_(e=>Uy(e,i,c)),S(e=>u(e)&&d(e)),Cb(a))}}return i.addConnections(l),V.isDeploymentRef(e)&&he(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),V.isDeploymentRef(t)&&he(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=qy(e.target),o=qy(e.source),s;switch(!0){case V.isWildcard(e.source)&&V.isWildcard(e.target):return r.excludeConnections(Cb(n.connections,i)),r;case V.isModelRef(e.source)&&V.isModelRef(e.target):return s=gb({source:e.source,target:e.target,expr:e,model:t}),xb(s,{stage:r,memory:n},i);case V.isModelRef(e.source)&&V.isWildcard(e.target):return s=mb(t,e.source),xb(s,{stage:r,memory:n},i);case V.isModelRef(e.source):return s=mb(t,e.source),xb(s,{stage:r,memory:n},i,e=>a(e.target));case V.isModelRef(e.target):return s=db(t,e.target),xb(s,{stage:r,memory:n},i,e=>o(e.source));default:let c=w(n.connections,S(t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source)),Cb(i));return c.length===0||r.excludeConnections(c),r}}};function gb({source:e,target:t,expr:n,model:r}){let i=Ky(r,e),a=Ky(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...sl(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const _b={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.inout)){for(let e of a){let t=Tb(Uy(e,[...Ob(e)],`both`),i);r.addConnections(t)}return r}P(V.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=Gy(t,e.inout);for(let e of a){let t=Tb(Uy(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.inout)||V.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.inout)){let a=Ky(t,e.inout);return a.length===0?r:xb(xa(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(V.isWildcard(e.inout))return r;let a=Gy(t,e.inout),o=ub(a),s=pb(a),c=w(n.connections,S(e=>o(e)!==s(e)),Cb(i));return r.excludeConnections(c),r}},vb={include:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return bb(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return bb(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},yb={include:({model:e,stage:t,where:n})=>{let r=[],i=w([...e.roots()],wb(n),y(e=>(e.onlyOneInstance()||r.push(...e.children()),e)));return t.addExplicit(i),r.length>1&&t.addConnections(Wy([...i,...r])),t},exclude:({stage:e,memory:t,where:n})=>{let r=w([...t.elements],wb(n));return e.exclude(r),e}};function bb(e,{expr:t,where:n,...r}){switch(!0){case V.isElementTagExpr(t):case V.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case ao.isCustom(t):case V.isCustom(t):case V.isModelRef(t):return;case V.isWhere(t):return cb[e]({...r,expr:t,where:n});case ao.isWhere(t):return vb[e]({...r,expr:t,where:n});case V.isDeploymentRef(t):return kb[e]({...r,expr:t,where:n});case V.isWildcard(t):return yb[e]({...r,expr:t,where:n});case ao.isDirect(t):return hb[e]({...r,expr:t,where:n});case ao.isInOut(t):return _b[e]({...r,expr:t,where:n});case ao.isOutgoing(t):return fb[e]({...r,expr:t,where:n});case ao.isIncoming(t):return lb[e]({...r,expr:t,where:n});default:F(t)}}function xb(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=w(n.connections,S(e=>i(e)),S(t=>Ea(t.relations.model,e)),y(t=>t.update({deployment:null,model:Sa(t.relations.model,e)})),Cb(r),S(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function Sb(e,t){return Cb(e,t).nonEmpty()}function Cb(...e){if(e.length===1)return t=>Cb(t,e[0]);let[t,n]=e;return n===null?t:ye(t)?t.map(e=>Cb(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(Db(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(Db(t)(e))))})}function wb(...e){if(e.length===1)return t=>wb(t,e[0]);let[t,n]=e;return ye(t)?t.filter(e=>wb(e,n)):n?.(Eb(t,t))??!0}function Tb(e,t){return t?w(e,S(e=>Sb(e,t))):e}function Eb(e,t){if(pl(e)){let n=dl(t)&&ul(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]]}}if(fl(e))return Te(e.element,[`tags`,`kind`]);if(ul(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags]};if(ll(e))return Te(e,[`tags`,`kind`]);F(e)}function Db(e){return t=>({tags:t.tags,kind:t.kind,source:Eb(t.source,e.source),target:Eb(t.target,e.target)})}function Ob(e){let t=new Set;for(let n of e.descendingSiblings())t.add(n);return t}const kb={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(ul(r))return wb(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:jb(r,e);break;case t.selector===`children`:Ab(r,e);break;case t.selector===`descendants`:Mb(r,e);break;default:wb(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=qy(e),a=w([...n.elements],S(i),wb(r));return t.exclude(a),t}};function Ab(e,{stage:t,where:n}){let r=wb([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(Wy(r)),t.connectWithExisting(r),t.addExplicit(r))}function jb(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=wb([...e.children()],r),a=!1;for(let e of i)if(Uy(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(Wy(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function Mb(e,{stage:t,where:n}){let r=e=>{let i=[];for(let t of e.children())t.isDeploymentNode()&&i.push(...r(t)),wb(t,n)&&i.push(t);return t.connectWithExisting(i,`in`),t.addConnections(Wy(i)),t.addImplicit(i),i},i=r(e);if(i.length===0)return;t.connectWithExisting(i,`out`);let a=Nb(t);w(i,S(e=>a.has(e)),me(e=>t.addExplicit(e)))}function Nb(e){return w(e.mergedConnections(),rb,ab,Ke((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var Pb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=w(e.connections,rb,ab),n=Yc(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=xa(this.memory.elements,e.elements),n=xa(e.final,this.memory.explicits),r=new vt.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let i=new Set(n),a=e=>{for(let t of i)if(e===t||I(e,t))return!0;return!1};return w(Ca(t,i),oa(e=>e.isDeploymentNode()),L(),ea,me(e=>{let t=[...e.children()].filter(a).length;if(t>=2){n.add(e);return}t===1&&pa(e.siblings(),a)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=Cy(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=ge([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=ge(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};function Fb(e,t){let n=sb.empty();for(let r of t)if(bo(r)){let t=`include`in r?`include`:`exclude`,i=r.include??r.exclude;for(let r of i){let i=t===`include`?n.stageInclude(r):n.stageExclude(r);i=bb(t,{expr:r,model:e,stage:i,memory:n,where:null})??i,n=i.commit()}}return Pb.for(n).commit()}function Ib(e,{docUri:t,rules:n,...r}){let i=Fb(e.deployment,n),a=$y(e,i),o=Qy(i.connections);py(a,o);let s=vy({nodes:a,edges:o}),c=eb(n,s.nodes),l=Ue(n,ko),u=Vo(c);return yy({...r,[Ua]:`computed`,[Wa]:`deployment`,autoLayout:{direction:l?.direction??`TB`,...l?.nodeSep&&{nodeSep:l.nodeSep},...l?.rankSep&&{rankSep:l.rankSep}},edges:s.edges,nodes:y(c,e=>(e.icon===`none`&&delete e.icon,e)),...u.length>0&&{notation:{nodes:u}}})}function Lb(e){return t=>No(t)?t.groupRules.flatMap(Lb(e)):bo(t)&&`include`in t?t.include.filter(e):[]}function Rb(e,t){let n=e.flatMap(Lb(H.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,...f}=rt(t,v),p=z({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),m=!te(p),h=!te(f),g=Ty(e);r.forEach((e,t)=>{Za(e)||!g(e)||(h&&(e={...e,...f,isCustomized:!0}),m&&(e={...e,isCustomized:!0,style:{...e.style,...p}}),r[t]=e)})}return r}function zb(e,t){return e.reduce((e,n)=>{if(Do(n)){let r=t.predicates[n.predicateId];return v(r)?e:e.concat(r)}if(Eo(n)){let r=t.styles[n.styleId];return v(r)?e:e.concat(r)}return e.push(n),e},[])}function Bb(e,t){return e.reduce((e,n)=>{if(Do(n)){let r=t.dynamicPredicates[n.predicateId];return v(r)?e:e.concat(r)}if(Eo(n)){let r=t.styles[n.styleId];return v(r)?e:e.concat(r)}return e.push(n),e},[])}function Vb(e,t){let n=new Set;for(let r of t)if(bo(r))for(let t of r.include){let r=Ty(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const Hb=e=>{if(jo(e)){let t=[],n=[];for(let r of e.__parallel)if(Mo(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return Mo(e)?[...e.__series]:e};function Ub(e,t){let n=[],r=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let i of _(t,Hb)){let t=e.element(i.source),a=e.element(i.target),o=n.indexOf(t),s=n.indexOf(a);o>=0&&s>=0||(i.isBackward?r(a,t):r(t,a))}return new Set(n)}function Wb(e,t,n){let r=ol(e,t,`directed`).flatMap(e=>[...e.relations]).sort(ba);if(!Vi(r))return{};if(r.length===1){let e=r[0];return z({title:e.title??void 0,kind:e.kind??void 0,tags:e.tags,relations:[e.id],navigateTo:e.$relationship.navigateTo,color:e.$relationship.color,line:e.$relationship.line,technology:e.technology??void 0,description:e.$relationship.description??void 0})}let i=w(r,_(e=>e.tags),Ce()),a=T(i,1)?i:void 0,o=y(r,e=>e.id),s=$e(r).$relationship.navigateTo;s===n&&(s=void 0),s||=w(r,_(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),Ce(),ge());let c=w(r,Ke((e,{title:t,technology:n,$relationship:r})=>(C(t)&&e.title.add(t),C(r.color)&&e.color.add(r.color),C(r.line)&&e.line.add(r.line),C(r.kind)&&e.kind.add(r.kind),C(n)&&e.technology.add(n),C(r.description)&&!e.description.some(Je(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return z({tags:a??void 0,relations:o,navigateTo:s,kind:ge([...c.kind]),title:ge([...c.title]),color:ge([...c.color]),line:ge([...c.line]),technology:ge([...c.technology]),description:ge(c.description)})}var Gb=class{steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=Bb(t,this.model.globals),a=Vb(this.model,i),o=Ub(this.model,n),s=w(xa(Sa(a,o),o,a),L(),na),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(I(t,n)){e.push(t);break}}return e},[]),l=(e,t,n)=>{if(Mo(e)){for(let r of e.__series)t=l(r,t,n);return t}let r=n?no(n,t):no(t),{source:i,target:a,title:o,isBackward:u,navigateTo:d,notation:f,...p}=e,m=this.model.element(i),h=s.indexOf(m);P(h>=0,`Source ${i} not found`);let g=this.model.element(a),_=s.indexOf(g);P(_>=0,`Target ${a} not found`),(c.includes(m)||c.includes(g))&&console.error(`Step ${m.id} -> ${g.id} because it involves a compound`);let{title:ee,relations:te,navigateTo:ne,...re}=Wb(m,g,this.view.id),ie=C(d)&&d!==this.view.id?d:ne,ae=e.kind&&!e.technology?this.model.specification.relationships[e.kind]?.technology:void 0;return this.steps.push(z({...re,...p,...ae&&{technology:ae},id:r,source:m,target:g,navigateTo:ie,title:o??ee,relations:te??[],isBackward:h>_})),t+1},u=1;for(let e of n){if(jo(e)){let t=1;for(let n of e.__parallel)t=l(n,t,u);u++;continue}u=l(e,u)}let d=zy(this.model.$styles,s.map(Ry)),f=this.model.$styles.defaults.relationship,p=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=N(d.get(t.id),`Source node ${t.id} not found`),l=N(d.get(n.id),`Target node ${n.id} not found`),u={id:e,parent:Xi(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:f.color,line:f.line,head:f.arrow,tags:o??[],...s};for(a&&(u.dir=`back`);u.parent&&!d.has(u.parent);)u.parent=Ui(u.parent);c.outEdges.push(u.id),l.inEdges.push(u.id);for(let e of Zi(u.source)){if(e===u.parent)break;d.get(e)?.outEdges.push(u.id)}for(let e of Zi(u.target)){if(e===u.parent)break;d.get(e)?.inEdges.push(u.id)}return u}),m=Rb(i,Dy(i,s.map(e=>N(d.get(e.id))))),h=Ue(i,ko),g=Vo(m);return yy({...r,[Wa]:`dynamic`,[Ua]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:h?.direction??`LR`,...h?.nodeSep&&{nodeSep:h.nodeSep},...h?.rankSep&&{rankSep:h.rankSep}},nodes:y(m,e=>(e.icon===`none`&&delete e.icon,e)),edges:p,...g.length>0&&{notation:{nodes:g}}})}};function Kb(e,t){return new Gb(e,t).compute()}function qb(e){switch(!0){case so.isCustom(e):return qb(e.customRelation.expr);case so.isWhere(e):{let t=qb(e.where.expr),n=vo(e.where.condition);return e=>t(e)&&n({source:{tags:e.source.tags,kind:e.source.kind},target:{tags:e.target.tags,kind:e.target.kind},...e.tags&&{tags:e.tags},...e.kind&&{kind:e.kind}})}case so.isDirect(e):{let t=Ty(e.source),n=Ty(e.target);return r=>t(r.source)&&n(r.target)||!!e.isBidirectional&&t(r.target)&&n(r.source)}case so.isInOut(e):{let t=Ty(e.inout);return e=>t(e.source)||t(e.target)}case so.isIncoming(e):{let t=Ty(e.incoming);return e=>t(e.target)}case so.isOutgoing(e):{let t=Ty(e.outgoing);return e=>t(e.source)}default:F(e)}}function Jb(e,t,n){let r=e.flatMap(Lb(so.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,...s}}of r){let r=a?{description:qa(a)}:{},c=o?{notes:qa(o)}:{},l=rt(s,v),u=qb(e);i.forEach((e,a)=>{let o,s;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(s=n),o&&s)break;!o||!s||u({source:o,target:s,...Te(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...c,label:n??e.label,isCustomized:!0})})}return i}function Yb(e){return w([...e],Jc,Ke((e,t,n,r)=>{let i=qc(r,t),a=xa(...i.map(x(`relations`))),o=Sa(t.relations,a);if(i.length>0&&(o=xa(o,t.directRelations)),Hc(r,t.reversed())&&(o=xa(o,t.directRelations)),o.size<t.relations.size){let e=r.some($c(t.source)),n=r.some($c(t.target));e&&(o=xa(o,ma(oa(t.relations,Zc(t.source))))),n&&(o=xa(o,ma(oa(t.relations,Qc(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var Xb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=Yb(e.connections);if(t.length===0)return e;let n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=xa(this.memory.elements,e.elements),n=xa(e.final,this.memory.explicits),r=new Set(n),i=e=>{for(let t of r)if(e===t||I(e,t))return!0;return!1};return w(Ca(t,r),L(),ea,me(e=>{let t=[...e.children()].filter(i).length;if(t>=2){n.add(e);return}t===1&&pa(e.siblings(),i)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=Cy(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=ge([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=ge(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:Zb,findConnectionsBetween:Qb,findConnectionsWithin:$b}=al;function ex(e,t){switch(!0){case H.isElementKindExpr(t):return[...oa(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case H.isElementTagExpr(t):return[...oa(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(B.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(B.flatten(t.ref)),r=t.selector===`children`?L(n.children()):L(n.descendants());return r&&r.length>0?r:[n]}case H.isModelRef(t):return[e.element(B.flatten(t.ref))];default:F(t)}}function tx(e,t){if(t.isEmpty()||e.length===0)return e;let n=Ve(e.map(e=>qi(e))),r=L(oa(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function nx(e,{memory:t,model:n}){let r=ex(n,e);return H.isModelRef(e)?e.selector===`descendants`?r:tx(r,t):r}const rx={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(B.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections($b(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(ex(t,e));return n.exclude(i),n}},ix={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(ex(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections($b(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(ex(t,e));return n.exclude(i),n}},ax={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(ex(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections($b(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(ex(t,e));return n.exclude(i),n}},ox=()=>!0,sx=e=>e;function cx(e){return e.reduce((e,t)=>{let n=[...t.relations];P(T(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=Vy(n.map(e=>e.$relationship),ge(S(n,e=>e.source.id===i&&e.target.id===a))?.$relationship),d=z({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u});return e.push(d),e},[])}function lx(e,t){return zy(e.$styles,[...t.final].map(Ry),t.groups)}const ux=H.isWildcard,dx=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),fx={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=ux(e),l=ux(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==ox:{let e=w(i.relationships(),oa(o),L(),y(e=>new el(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==ox:u.push(...$b(r.elements));break;case c&&l:u.push(...$b(i.roots()));break;case!c&&l&&o!==ox:{let t=w(ex(i,e),_(e=>w(e,He(tt(n===!0),{onTrue:e=>xa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),oa(o),ha(),L(),it(t=>t.source===e),([t,n])=>ke(w(t,S(t=>!dx(e,t.target)),y(t=>new el(e,t.target,new Set([t])))),w(n,S(t=>!dx(e,t.source)),y(t=>new el(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=px(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...Qb(e,a,o));break}case c&&!l&&o!==ox:{let e=w(ex(i,t),_(e=>w(e,He(tt(n===!0),{onTrue:e=>xa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),oa(o),L(),it(t=>t.target===e),([t,n])=>ke(w(n,S(t=>!dx(e,t.target)),y(t=>new el(e,t.target,new Set([t])))),w(t,S(t=>!dx(e,t.source)),y(t=>new el(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=px(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...Qb(t,e,o));break}default:{P(!ux(e),`Inference failed - source must be not a wildcard`),P(!ux(t),`Inference failed - target must be not a wildcard`);let a=nx(e,{memory:r,model:i}),o=nx(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...Qb(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=ux(e),c=ux(t),l;switch(!0){case s&&c:l=w(i.connections,_(nt(x(`relations`),oa(o),L())),ma());break;case!s&&c:l=w(ex(r,e),_(e=>w(e,He(tt(n===!0),{onTrue:e=>xa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),oa(o),L())),ma());break;case s&&!c:l=w(ex(r,t),_(e=>w(e,He(tt(n===!0),{onTrue:e=>xa(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),oa(o),L())),ma());break;default:{P(!ux(e),`Inference failed - source must be not a wildcard`),P(!ux(t),`Inference failed - target must be not a wildcard`);let i=ex(r,e),a=ex(r,t),s=new Set;for(let e of i)for(let t of a)Ki(e,t)||(s=xa(s,Sa(e.allOutgoing,t.allIncoming),n?Sa(t.allOutgoing,e.allIncoming):new Set));l=ma(oa(s,o))}}return a.excludeRelations(l),a}};function px(e,{memory:t,model:n}){let r=ex(n,e);if(!T(r,1))return[[],[]];if(H.isModelRef(e)){let i=L(n.element(B.flatten(e.ref)).ascendingSiblings());return[tx(r,t),tx(i,t)]}return[r,w(r,y(e=>e.ascendingSiblings()),ca(),ha(),L(),e=>tx(e,t))]}const mx={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(H.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...Zb(e,t,`directed`))}else{let e=nx(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...Ce(e.flatMap(e=>[...e.ascendingSiblings()])));let i=hx(n,o);for(let n of t)s.push(...Qb(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=ex(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function hx(e,t){switch(!0){case H.isElementKindExpr(t):case H.isElementTagExpr(t):{let e=Ty(t);return t=>e(t.target)}case H.isModelRef(t)&&t.selector===`children`:{let n=B.flatten(t.ref);return Ve([...e.children(n)].map(e=>Rc.isIncoming(e.id)))}case H.isModelRef(t)&&t.selector===`descendants`:{let n=B.flatten(t.ref);return Ve([Rc.isInside(n),...[...e.children(n)].map(e=>Rc.isIncoming(e.id))])}case H.isModelRef(t)&&t.selector===`expanded`:{let e=B.flatten(t.ref);return Ve([Rc.isIncoming(e),Rc.isInside(e)])}case H.isModelRef(t):{let e=B.flatten(t.ref);return Rc.isIncoming(e)}default:F(t)}}const gx={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(H.isWildcard(e)){if(!t)return;o.push(...Qb(t,t.ascendingSiblings()))}else{let t=nx(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=Ce(t.flatMap(e=>L(e.ascendingSiblings()))));for(let e of t)o.push(...Qb(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=ex(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(ma(a.filter(i))),r}},_x={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(H.isWildcard(o)){if(!t)return;s.push(...Qb(t,t.ascendingSiblings(),`directed`))}else{let e=nx(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...Ce(e.flatMap(e=>[...e.ascendingSiblings()])));let i=vx(n,o);for(let n of e)s.push(...Qb(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=ex(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(ma(a.filter(i))),r}};function vx(e,t){switch(!0){case H.isElementKindExpr(t):case H.isElementTagExpr(t):{let e=Ty(t);return t=>e(t.source)}case H.isModelRef(t)&&t.selector===`children`:{let n=B.flatten(t.ref);return Ve([...e.children(n)].map(e=>Rc.isOutgoing(e.id)))}case H.isModelRef(t)&&t.selector===`descendants`:{let n=B.flatten(t.ref);return Ve([Rc.isInside(n),...[...e.children(n)].map(e=>Rc.isOutgoing(e.id))])}case H.isModelRef(t)&&t.selector===`expanded`:{let e=B.flatten(t.ref);return Ve([Rc.isOutgoing(e),Rc.isInside(e)])}case H.isModelRef(t):{let e=B.flatten(t.ref);return Rc.isOutgoing(e)}default:F(t)}}const yx={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=[...t.roots()].filter(i);if(e.length===0)return;let[r,a]=it(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections($b(e)),n.connectWithExisting(e),n}let a=i(e)?e:null,o=L(oa(e.children(),i)),s=o.length>0;if(!s)if(a){if(Qb(a,a.siblings()).length===0){let e=a.parent;e&&i(e)&&n.addExplicit(e)}o.push(a)}else return n;a&&n.addExplicit(a);let c=ma([...r.elements,...e.descendingSiblings()]);for(let e of c)n.addConnections(Qb(e,o,`directed`));s&&(n.addConnections($b(o)),n.addExplicit(o));for(let e of o)n.addConnections(Qb(e,c,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===ox?e?(n.exclude([e,...e.descendants()]),n):Fy.empty(t.scope).stageExclude(n.expression):(n.exclude(S([...t.elements],r)),n)};function bx(e,t,n){switch(!0){case H.isCustom(e):return t===`include`?bx(e.custom.expr,t,n):n.stage;case H.isWhere(e):{let r=vo(e.where.condition),i=e=>S(e,r);return bx(e.where.expr,t,{...n,where:r,filterWhere:i})}case H.isModelRef(e)&&e.selector===`expanded`:return rx[t]({...n,expr:e})??n.stage;case H.isWildcard(e):return yx[t]({...n,expr:e})??n.stage;case H.isElementKindExpr(e):case H.isElementTagExpr(e):return ix[t]({...n,expr:e})??n.stage;case H.isModelRef(e):return ax[t]({...n,expr:e})??n.stage;default:F(e)}}function xx(e,t,n){switch(!0){case so.isCustom(e):return t===`include`?xx(e.customRelation.expr,t,n):n.stage;case so.isWhere(e):{let r=vo(e.where.condition),i=e=>new Set(S([...e],r)),a=e=>w(e,y(e=>new el(e.source,e.target,i(e.relations))),S(e=>e.nonEmpty()));return xx(e.where.expr,t,{...n,where:r,filterWhere:a})}case so.isInOut(e):return gx[t]({...n,expr:e})??n.stage;case so.isDirect(e):return fx[t]({...n,expr:e})??n.stage;case so.isOutgoing(e):return _x[t]({...n,expr:e})??n.stage;case so.isIncoming(e):return mx[t]({...n,expr:e})??n.stage;default:F(e)}}function Sx(e,t,n){let r={model:e,scope:t.scope,where:ox,filterWhere:sx};for(let i of n){if(No(i)){t=Sx(e,Iy.enter(t,i),i.groupRules),P(t instanceof Iy,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(bo(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case co.isFqnExpr(i):n=bx(i,e,{...r,stage:n,memory:t})??n;break;case co.isRelationExpr(i):n=xx(i,e,{...r,stage:n,memory:t})??n;break;default:F(i)}t=n.commit()}}}return t}function Cx(e,t,n){return t=Sx(e,t,n),Xb.for(t).commit()}function wx(e,{docUri:t,rules:n,...r}){let i=zb(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=Cx(e,Fy.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=Ex(o);let s=lx(e,o),c=cx(o.connections);py(s,c);let l=vy({nodes:s,edges:c}),u=Rb(i,Dy(i,l.nodes)),d=Ue(i,ko),f=Vo(u),p=Tx(i,u);return yy({...r,_stage:`computed`,autoLayout:{direction:d?.direction??`TB`,...d?.nodeSep&&{nodeSep:d.nodeSep},...d?.rankSep&&{rankSep:d.rankSep}},edges:Jb(i,u,l.edges),nodes:y(u,e=>(e.icon===`none`&&delete e.icon,e)),...f.length>0&&{notation:{nodes:f}},...p.length>0&&{ranks:p}})}function Tx(e,t){let n=[];for(let r of e){if(!Po(r)||r.targets.length===0)continue;let e=w(t,S(Ve(r.targets.map(Ty))),y(e=>e.id));T(e,1)&&n.push({type:r.rank,nodes:e})}return n}function Ex(e){if(e.groups.length===0)return e;let t=new vt.default(()=>new Set),n=new Map,r=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},i=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(w(na([...e.explicitFirstSeenIn.keys()]),me(i=>{if(!r(i)){let r=N(e.explicitFirstSeenIn.get(i));n.set(i,r),t.get(r).add(i)}})),w(na([...e.lastSeenIn.keys()]),S(e=>!n.has(e)),me(a=>{if(r(a)||i(a))return;let o=N(e.lastSeenIn.get(a));n.set(a,o),t.get(o).add(a)})),t.size===0)return e;let a=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:a})}function Dx(e,t){switch(!0){case So(e):return wx(t,e);case wo(e):return Ib(t,e);case To(e):return Kb(t,e);default:F(e)}}function Ox(e,t){try{return{isSuccess:!0,view:Dx(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function kx(e){let t=new $t({type:`directed`}),n=[];for(let r of Ye(e))t.addNode(r.id,{view:r}),Co(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,hy.default)(t,e.id,e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which creates a cycle`);continue}t.addDirectedEdge(e.id,e.extends)}return(0,my.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!Co(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!So(i))return e;let a=Ce([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:Vi(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const Ax=e=>ee(e).length,jx=e=>Oa(e);function Mx(e){let t=Nx(e),n=(e,t)=>`${e}->${t}`,r=new vt.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),i=(e,t)=>r.get(n(e,t)).relationships,a=(e,t)=>{let n=t.projectId;P(n!==e.projectId,`Imported element must have a different project id`);let r=i(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let a=i(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&a.add(n)};for(let t of e)if(!b(t.$data.imports))for(let[e,n]of we(t.$data.imports))for(let r of n){let n=$a(e,r.id);a(t,N(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let o=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];P(T(i,1),`Relationships set must have at least one relationship`);let a={id:Oa(e),source:jx(t),target:jx(n),projectId:t,relations:y(i,x(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:Ce(_(i,x(`tags`)))},o=ge(i);return o&&(a.label=o.title,a.description=La(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});py(t,o);let s=vy({nodes:t,edges:o});return{id:`projects-view`,[Wa]:`projects`,[Ua]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...s}}function Nx(e){let t=new Map;for(let n of e){let e=Ka(n.projectId),r={id:jx(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${Ax(n.$data.elements)}`,`Relationships: ${Ax(n.$data.relations)}`,`Views: ${Ax(n.$data.views)}`].join(`
1211
- `)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}return t}function Px(e,t){return{...wx(e,{id:Qa(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}Bn();const Fx=K.getChild(`LanguageServices`),Ix=e=>e.severity===ar.Error;var Lx=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get mcpServer(){let e=this.services.mcp.Server;return e instanceof n_?null:e}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=w(this.services.shared.workspace.LangiumDocuments.groupedByProject(),we(),y(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:y(n,x(`uri`)),config:a}}));if(T(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(T(t,1))return t;let{id:n,folderUri:r,config:i}=e.default;return[{id:n,folder:r,title:i.title??i.name,documents:[],config:i}]}project(e){let{id:t,folderUri:n,config:r}=this.projectsManager.ensureProject(e),i=y(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),x(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return Lc.create({...r.$data,_stage:`layouted`,views:w(i,y(x(`diagram`)),oe(x(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Lc.EMPTY){Fx.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!T(n,1))throw Error(`No models found`);let r=Mx(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return w(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),_(e=>w(e.diagnostics??[],S(Ix),y(({message:t,range:n})=>({message:t,line:n.start.line,range:n,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:F(e)}}async dispose(){try{Fx.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){Fx.error(U(e))}finally{Fx.debug(`LikeC4LanguageServices disposed`)}}},Rx=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if(p_(e))return e.state<Yn.Linked&&(K.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Yn.Linked,e.uri,n),K.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=d_.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=V_(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};Bn();const zx=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function Bx(e,t){return Mn(t.feature)&&t.property===`project`&&nm(e.node)}var Vx=class extends hn{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case An(t.feature):return this.completionForKeyword(e,t.feature,n);case jn(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case Bx(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:D.Snippet,insertTextFormat:qn.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&kn(e.node,Am):n(e,{label:t.value,detail:`Insert deployment view`,kind:D.Class,insertTextFormat:qn.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
1212
- `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:D.Property,insertTextFormat:qn.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:D.Property,insertTextFormat:qn.Snippet,insertText:`${t.value} \${1|${Ai.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:D.Property,insertTextFormat:qn.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:D.Module,insertTextFormat:qn.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:D.Module,insertTextFormat:qn.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
1213
- `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:D.Module,insertTextFormat:qn.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
1214
- `)});break;case t.value===`dynamic`&&kn(e.node,Am):n(e,{label:t.value,detail:`Insert dynamic view`,kind:D.Class,insertTextFormat:qn.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
1215
- `)});break;case t.value===`style`&&e.node&&kn(e.node,zp):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:D.Module,insertTextFormat:qn.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${zx}|} $0\n}`});break;case t.value===`style`&&e.node&&kn(e.node,Ve([Am,Vp])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:D.Module,insertTextFormat:qn.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${zx}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:D.Module,insertTextFormat:qn.Snippet,insertText:`${t.value} {\n\t\${1|${zx}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:D.Class,insertTextFormat:qn.Snippet,insertText:`extend $1 {
1209
+ `,enforceStrictCapabilities:!0,...e,capabilities:{tools:{},logging:{},...e?.capabilities}});return n.registerTool(...jv(this.services.likec4.LanguageServices)),n.registerTool(...Gv(this.services.likec4.LanguageServices)),n.registerTool(...Wv(this.services.likec4.LanguageServices)),n.registerTool(...Uv(this.services.likec4.LanguageServices)),n.registerTool(...Jv(this.services.likec4.LanguageServices)),n.registerTool(...Xv(this.services.likec4.LanguageServices)),n.registerTool(...Av(this.services.likec4.LanguageServices)),n.registerTool(...Rv(this.services.likec4.LanguageServices)),n.registerTool(...Bv(this.services.likec4.LanguageServices)),n.registerTool(...Hv(this.services.likec4.LanguageServices)),n.registerTool(...Pv(this.services.likec4.LanguageServices)),n.registerTool(...Iv(this.services.likec4.LanguageServices)),n.registerTool(...Dv(this.services.likec4.LanguageServices)),n.registerTool(...Cv(this.services.likec4.LanguageServices)),n.registerTool(...Fv(this.services.likec4.LanguageServices)),n.registerTool(...Ev(this.services.likec4.LanguageServices)),n.registerTool(...Qv(this.services.likec4.LanguageServices)),t&&n.registerTool(...Mv(this.services.likec4.LanguageServices)),n.server.onerror=e=>{K.error(U(e))},n}},ey=class{transport=void 0;_mcp=void 0;constructor(e){this.services=e}get mcp(){if(!this._mcp)throw Error(`MCP server is not started`);return this._mcp}get isStarted(){return this.transport!==void 0}get port(){return NaN}async dispose(){await this.stop()}async start(){this.transport||(cv.info(`Starting MCP stdio server`),this._mcp=this.services.mcp.ServerFactory.create(),this.transport=new Kr,await this._mcp.connect(this.transport),cv.info(`LikeC4 MCP Server running on stdio`))}async stop(){if(this.transport)try{cv.info(`Stopping MCP stdio server`),await this.transport.close(),this._mcp&&await this._mcp.close()}finally{this._mcp=void 0,this.transport=void 0}}};async function ty(e){let t=new br;t.use(`*`,Sr({origin:`*`,allowHeaders:[`Content-Type`,`mcp-session-id`,`Last-Event-ID`,`mcp-protocol-version`],exposeHeaders:[`mcp-session-id`,`mcp-protocol-version`]})),t.get(`/health`,e=>e.json({status:`ok`}));let n=e.create(),r=new xr({eventStore:new Cr({})});return t.all(`/mcp`,async e=>(n.isConnected()||await n.connect(r),await r.handleRequest(e))),t.notFound(e=>(cv.debug(`${e.req.method} ${e.req.url} not found`),e.json({jsonrpc:`2.0`,error:{code:-32e3,message:`Method not found.`},id:null},{status:404}))),t.onError((e,t)=>(cv.error(U(e)),t.json({jsonrpc:`2.0`,error:{code:-32603,message:`Internal server error`},id:null},{status:500}))),t}async function ny(e){let{factory:t,port:n}=e,r=await ty(t);return new Promise((e,t)=>{let i=Jr({fetch:r.fetch,hostname:`0.0.0.0`,port:n}).prependOnceListener(`error`,t).prependOnceListener(`listening`,()=>{i.removeListener(`error`,t),e(i.unref())})})}var ry=class{server=void 0;constructor(e,t=33335){this.services=e,this._port=t}get mcp(){throw Error(`StreamableLikeC4MCPServer has access to McpServer only during the request`)}get isStarted(){return this.server?.listening===!0}get port(){return this._port}async dispose(){await this.stop()}async start(e=this._port){if(this.server){if(this.port===e)return;await this.stop()}cv.info(`Starting MCP server on port {port}`,{port:e}),this._port=e,this.server=await ny({factory:this.services.mcp.ServerFactory,port:e}),cv.info(`MCP server ready at http://0.0.0.0:{port}/mcp`,{port:e})}stop(){let e=this.server;return e?(cv.info(`Stopping MCP server`),this.server=void 0,new Promise(t=>{e.close(e=>{e?cv.error(`Failed to stop MCP server`,{err:e}):cv.info(`MCP server stopped`),t()})})):(cv.info(`MCP server is not running, nothing to stop`),Promise.resolve())}};function iy(e,t=33335){cv.debug(`Creating StreamableLikeC4MCPServer`);let n=new ry(e,t),r=e.LanguageMetaData.languageId,i=e.shared.lsp.Connection;return e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>{if(e.section!==r){cv.warn(`Unexpected configuration update: {update}`,{update:e});return}let{enabled:a=!1,port:o=t}=e.configuration.mcp;if(!a){n.stop();return}Promise.resolve().then(()=>n.start(o)).then(()=>{i?.telemetry?.logEvent({eventName:`mcp-server-started`,mcpPort:o})}).catch(e=>{let t=U(e);i?.telemetry?.logEvent({eventName:`mcp-server-start-failed`,mcpPort:o,message:t}),cv.warn(`Failed to start LikeC4 MCP Server: \n${t}`),i&&i.window.showErrorMessage(`LikeC4: Failed to start MCP Server\n\n${t}`)})}),n}function ay(e){return new ey(e)}function oy(e=`sse`){return{mcpServer:t=>e===`stdio`?ay(t):iy(t,typeof e==`object`?e.port:33335),mcpServerFactory:e=>new $v(e)}}var sy=class extends Un{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!Yd(e)&&!Gd(e)&&!kf(e))return super.getDocumentation(e);try{let t=fn(e);if(t.state<on.Linked)return super.getDocumentation(e);let n=this.parser.forDocument(t);switch(!0){case Yd(e):{let t=n.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case Gd(e):{let r=n.parseDeployedInstance(e);if(!r)return;let[i,a]=B.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],o=i?this.locator.getParsedElement(a,i):this.locator.getParsedElement(a),s=[`_instance of_ \`${a}\``];return o&&s.push(`**${o.element.title}**`),s.join(`
1210
+ `)}case kf(e):{let t=n.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
1211
+ `):void 0}default:return e}}catch(e){q(e)}}};function cy(e,t){return[e,t]=ly(e,t)>0?[t,e]:[e,t],uy(e.range,t.range.start)}function ly(e,t){let n=e.range.start.line-t.range.start.line;return n===0?e.range.start.character-t.range.start.character:n}function uy(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 dy(e){return!!e&&e.range.start.line!=e.range.end.line}const X={newLine:or.newLine({allowMore:!0}),oneSpace:or.oneSpace(),noSpace:or.noSpace(),indent:or.indent({allowMore:!0}),noIndent:or.noIndent()};var fy=class extends $n{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,n){this.extendedFormattingCommands=[];let r=super.doDocumentFormat(e,t,n);return this.doExtendedFormatting(r),r}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.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,Eh,(e,t)=>{let n=Dn(e.$cstNode,`values`).filter(y).slice(1);t.cst(n).prepend(X.oneSpace),t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatDeploymentRelation(e){this.on(e,tf,(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...S([e.target,e.tags],y)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)})}formatExtendDeployment(e){this.on(e,Qf,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatRelation(e){this.on(e,e=>Nm(e)||tf(e),(e,t)=>{let n=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(n).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...S([e.target,e.tags],y)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)}),this.on(e,ku,(e,t)=>{t.keywords(`->`,`<-`).surround(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.properties(`title`).prepend(X.oneSpace),(yg(e)&&dy(e.$cstNode)||xg(e)&&yg(e.$container)&&dy(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(or.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(or.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&dy(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){Zp(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(X.noIndent)}indentContentInBraces(e){if($p(e)||hh(e)||sh(e)||dh(e)||ah(e)||wp(e)||Ep(e)||Op(e)||Sp(e)||bp(e)||Op(e)||pm(e)||jf(e)||ip(e)||Fm(e)||Ym(e)||dm(e)||_m(e)||qf(e)||vf(e)||cf(e)||Uh(e)||Lh(e)||Vd(e)||Ud(e)||Vf(e)||Ef(e)||hm(e)||Zd(e)||rf(e)||qd(e)||ep(e)){let t=this.getNodeFormatter(e),n=t.keywords(`{`);n.prepend(X.noIndent).prepend(X.oneSpace);let r=dy(e.$cstNode),i=t.keywords(`}`),a=t.interior(n,i),o=null;for(let e of a.nodes){if(!r){t.cst([e]).surround(X.oneSpace);continue}(!o||!cy(o,e))&&t.cst([e]).prepend(or.newLine({allowMore:!0})).prepend(X.indent),o=e}r?i.prepend(X.noIndent).prepend(or.newLine({allowMore:!0})):i.prepend(or.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,Nf)?.keywords(`element`).append(X.oneSpace)}formatView(e){this.on(e,Gf,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(X.oneSpace),t.keywords(`of`,`extends`).surround(X.oneSpace)}),this.on(e,gf)?.keywords(`dynamic`,`view`).append(X.oneSpace),this.on(e,of)?.keywords(`deployment`,`view`).append(X.oneSpace)}formatLeafProperty(e){if(zf(e)||qm(e)||Gh(e)||Cm(e)||Tm(e)||lh(e)||ph(e)||Rd(e)||tm(e)||Pd(e)||Lp(e)||$m(e)||Id(e)||Dm(e)||ym(e)||Np(e)||zp(e)||Fp(e)||th(e)||jm(e)||Oh(e)){let t=this.getNodeFormatter(e),n=t.keyword(`:`),r=t.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);n.nodes.length===0?r.append(X.oneSpace):n.prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)}}formatLinkProperty(e){this.on(e,rm,(e,t)=>{t.keyword(`link`).append(X.oneSpace),t.property(`value`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatNavigateToProperty(e){this.on(e,xm)?.property(`key`).append(X.oneSpace)}formatAutolayoutProperty(e){this.on(e,jh,(e,t)=>{t.keyword(`autoLayout`).append(X.oneSpace),t.property(`rankSep`).prepend(X.oneSpace),t.property(`nodeSep`).prepend(X.oneSpace)})}formatMetadataProperty(e){this.on(e,lm,(e,t)=>{t.property(`key`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatElementDeclaration(e){this.on(e,kf,(e,t)=>{let n=sn(e.$cstNode,`kind`),r=sn(e.$cstNode,`name`);r&&n&&(ly(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`props`).prepend(X.oneSpace)})}formatExtendElement(e){this.on(e,np,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatGlobals(e){this.on(e,Ep,(e,t)=>{t.keyword(`style`).append(X.oneSpace),t.property(`id`).append(X.oneSpace)}),this.on(e,Op,(e,t)=>{t.keyword(`styleGroup`).append(X.oneSpace)}),this.on(e,Sp,(e,t)=>{t.keyword(`predicateGroup`).append(X.oneSpace)}),this.on(e,bp,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(X.oneSpace)})}formatImports(e){this.on(e,Up,(e,t)=>{t.keyword(`import`).append(X.oneSpace),t.keywords(`{`,`}`,`from`).surround(X.oneSpace)}),this.on(e,Vp,(e,t)=>{t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatSpecificationRule(e){if((sh(e)||dh(e)||_h(e)||ah(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(X.oneSpace),rh(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(X.oneSpace),t.property(`name`).append(X.oneSpace)}}formatWithPredicate(e){(mp(e)||zm(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(X.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,Yd,(e,t)=>{let n=sn(e.$cstNode,`kind`),r=sn(e.$cstNode,`name`);r&&n&&(ly(r,n)>0?t.cst([n]).append(X.oneSpace):(t.cst([r]).append(X.oneSpace),t.cst([n]).prepend(X.oneSpace))),t.properties(`title`).prepend(X.oneSpace)})}formatDeployedInstance(e){this.on(e,Gd,(e,t)=>{let n=e.$cstNode?.content.find(e=>e.text===`=`);n&&t.cst([n]).surround(X.oneSpace),t.keyword(`instanceOf`).append(X.oneSpace),t.property(`title`).prepend(X.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,Fh,(e,t)=>{t.keywords(`global`,`style`).append(X.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(Nh(e)||Sf(e))&&t.keywords(`global`,`predicate`).append(X.oneSpace)}formatViewRuleGroup(e){this.on(e,Lh,(e,t)=>{t.keyword(`group`).append(X.oneSpace)})}formatViewRuleStyle(e){this.on(e,Uh)?.keyword(`style`).append(X.oneSpace),this.on(e,ff)?.keyword(`style`).append(X.oneSpace),this.on(e,Xf)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace),this.on(e,up)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace)}formatWhereExpression(e){(Lm(e)||fp(e))&&this.getNodeFormatter(e).keyword(`where`).append(X.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,kd,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,sg,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),Dd(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,bd,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,$h,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),vd(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatIncludeExcludeExpressions(e){if(Du(e)||zh(e)||uf(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!dy(e.$cstNode))&&t.keywords(`include`,`exclude`).append(X.oneSpace)}if(Xf(e)){let t=this.getNodeFormatter(e),n=this.findPredicateExpressionRoot(e),r=n?.$cstNode&&dy(n?.$cstNode);r&&t.property(`value`).prepend(X.indent),t.keyword(`,`).prepend(X.noSpace).append(r?X.newLine:X.oneSpace)}}formatRelationExpression(e){this.on(e,Gp,(e,t)=>{t.keyword(`->`).append(X.oneSpace)}),this.on(e,qp,(e,t)=>{t.keyword(`->`).prepend(X.oneSpace)}),this.on(e,km,(e,t)=>{t.keywords(`->`,`<->`).prepend(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace)}),this.on(e,mf,(e,t)=>{t.property(`target`).prepend(X.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||Du(t)||zh(t)||uf(t))return t;t=t.$container}}on(e,t,n){let r=t(e)?this.getNodeFormatter(e):void 0;return n&&r&&n(e,r),r}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let n of this.extendedFormattingCommands)switch(n.type){case`normalizeQuotes`:t(n,e);break;default:F(n.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;t??=this.on(e,cd)?.property(`value`),t??=this.on(e,kf)?.properties(`props`),t??=this.on(e,Up)?.properties(`project`),t??=this.on(e,Nm)?.properties(`title`,`technology`),t??=this.on(e,Lh)?.properties(`title`),t??=this.on(e,ku)?.properties(`title`),t??=this.on(e,Yd)?.properties(`title`),t??=this.on(e,Gd)?.properties(`title`),t??=this.on(e,tf)?.properties(`title`,`technology`),t??=this.on(e,rm)?.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,n)=>{let r=t===`single`?`"`:`'`,i=t===`single`?`'`:`"`,a=i.repeat(3),o=i,s=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?a:o;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),r,i)+t}});n.push(...s)}}escapeQuotesInternalQuotes(e,t,n){let r=``,i=0;for(;i>=0;){let t=e.indexOf(n,i);if(t<0){r+=e.slice(i);break}r+=e.slice(i,t),i=t+1;let a=!1;for(;t>0&&e[t-1]==`\\`;)a=!a,t--;r+=a?n:`\\${n}`}return r}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`}}}};function py(e,t){let n=[],r=e.parent;for(;r;){let e=N(t.get(r),`Parent node ${r} not found`);n.push(e),r=e.parent}return n}function my(e,t){for(let n of t){let t=e.get(n.source),r=e.get(n.target);P(t,`Source node ${n.source} not found`),P(r,`Target node ${n.target} not found`),t.outEdges.push(n.id),r.inEdges.push(n.id);let i=py(t,e),a=py(r,e),o=i.length>0&&a.length>0?Re(Vi(ke(i),ke(a))):null;n.parent=o?o.id:null;for(let e of i){if(e===o)break;e.outEdges.push(n.id)}for(let e of a){if(e===o)break;e.inEdges.push(n.id)}}}var hy=dt(),gy=t(ft(),1);function _y(e){let t=[],n=[...e],r;for(;r=n.shift();){let e=r.parent;if(e){let r=[];for(;e;){let t=n.findIndex(t=>t.id===e);if(t<0)break;let[i]=n.splice(t,1);if(!i)throw Error(`Invalid state, should not happen`);r.unshift(i),e=i.parent}t.push(...r)}t.push(r)}return t}function vy(e){return e.forEach(t=>{t.children.length>0&&(t.children=e.reduce((e,n)=>(n.parent===t.id&&e.push(n.id),e),[]))}),e}function yy(e){let t=_y([...e.nodes.values()]),n=[...e.edges];if(t.length<2||n.length===0)return{nodes:t,edges:n};let r=t=>N(e.nodes.get(t)),i=new Qt({multi:!0,allowSelfLoops:!0,type:`directed`}),[a,o]=at(T(n,b(e=>{let t=r(e.source),n=r(e.target),i=e.parent?r(e.parent):null;return{id:e.id,edge:e,parent:i,source:t,target:n}})),({source:e,target:t})=>e.children.length===0&&t.children.length===0),s=[],c=e=>{i.mergeNode(e.source),i.mergeNode(e.target),s.push(e),(0,gy.default)(i,e.source,e.target)||i.mergeDirectedEdge(e.source,e.target)};for(let{edge:t,source:n,target:o}of a)if(c(t),o.parent&&o.parent!==t.parent&&T(py(o,e.nodes),Qe(e=>e.inEdges.includes(t.id)),ee(e=>{i.mergeNode(e.id),(0,gy.default)(i,t.source,e.id)||i.mergeDirectedEdge(t.source,e.id),(0,gy.default)(i,e.id,t.target)||i.mergeDirectedEdge(e.id,t.target)})),n.parent){let e=r(n.parent);i.mergeNode(e.id),(0,gy.default)(i,e.id,n.id)||i.mergeDirectedEdge(e.id,n.id),o.parent&&o.parent!==n.parent&&((0,gy.default)(i,e.id,o.parent)||i.mergeDirectedEdge(e.id,o.parent))}for(let{edge:e}of o)c(e);P(s.length===n.length,`Not all edges were added to the graph`);let l=(0,hy.topologicalSort)(i),u=[],d=t.slice();for(let e of l){let t=d.findIndex(t=>t.id===e);P(t>=0,`Node "${e}" not found`),u.push(...d.splice(t,1))}return d.length>0&&u.length>0&&(u=u.flatMap(e=>{if(d.length===0)return e;let n=t.slice(0,t.indexOf(e)).filter(e=>d.includes(e));return n.length>0?(d=d.filter(e=>!n.includes(e)),[...n,e]):e})),u.push(...d),{nodes:vy(_y(u)),edges:s}}function by(e){return e.hash=ka({id:e.id,__:e._type??`element`,autoLayout:e.autoLayout,nodes:T(e.nodes,b(e=>({id:e.id,icon:y(e.icon)&&e.icon!==`none`?`Y`:`N`,title:e.title,description:qa(e.description),technology:e.technology??null,shape:e.shape,size:e.style.size??null,iconSize:e.style.iconSize??null,iconPosition:e.style.iconPosition??null,textSize:e.style.textSize??null,padding:e.style.padding??null,children:e.children})),ie(({id:e,...t})=>[e,t])),edges:T(e.edges,b(e=>({source:e.source,target:e.target,label:e.label,description:qa(e.description),technology:e.technology??null,dir:e.dir,head:e.head,tail:e.tail,line:e.line})),ie(({source:e,target:t,...n})=>[`${e}:${t}`,n]))}),e}var xy=class{get Ctx(){throw Error(`Should not be called in runtime`)}constructor(e){this.state=e}get elements(){return this.state.elements}get explicits(){return this.state.explicits}get final(){return this.state.final}get connections(){return this.state.connections}isEmpty(){return this.elements.size===0&&this.connections.length===0&&this.explicits.size===0&&this.final.size===0}},Sy=class{excluded={elements:new Set,connections:[]};constructor(e,t){this.memory=e,this.expression=t}markedToMoveExplicitToImplicit=!1;_removeElement(e){this.excluded.elements.add(e)}exclude(e){if(!e)return this;if(sa(e)){for(let t of e)this._removeElement(t);return this}return this._removeElement(e),this}_removeConnection(e){this.excluded.connections.push(e)}excludeConnections(e,t){if(ye(t)&&(P(!this.markedToMoveExplicitToImplicit,`Already marked to move explicits`),this.markedToMoveExplicitToImplicit=t),sa(e)){for(let t of e)this._removeConnection(t);return this}return this._removeConnection(e),this}isDirty(){return this.excluded.elements.size>0||this.excluded.connections.length>0}isEmpty(){return!this.isDirty()}filterForMoveToImplicits(e){return this.markedToMoveExplicitToImplicit||this.excluded.elements.size>0?e:new Set}moveDisconnectedExplicitsToImplicits(e){let t=Ta(new Set(this.memory.connections.flatMap(e=>[e.source,e.target])),new Set(e.connections.flatMap(e=>[e.source,e.target])));return t=wa(t,e.elements),t=T(t,ca(t=>e.explicits.has(t)&&!ha(e.final,Yi(t))),ga()),t.size>0&&(t=this.filterForMoveToImplicits(t),e.explicits=Ta(e.explicits,t),e.final=Ta(e.final,t)),e}removeElements(e){return e.elements=Ta(e.elements,this.excluded.elements),e.explicits=Ta(e.explicits,this.excluded.elements),e.final=Ta(e.final,this.excluded.elements),e}removeConnections(e){let t=this.excluded.connections.reduce((e,t)=>{let n=e.get(t.id);return n?e.set(t.id,n.mergeWith(t)):e.set(t.id,t),e},new Map),n=new Set;e.connections=e.connections.reduce((e,r)=>{let i=t.get(r.id);if(i){n.add(r.source),n.add(r.target);let t=r.difference(i);t.nonEmpty()&&e.push(t)}else e.push(r);return e},[]);for(let t of e.connections)n.delete(t.source),n.delete(t.target),t.boundary&&e.elements.has(t.boundary)&&n.delete(t.boundary);return n.size===0?e:(n=Ta(n,e.explicits),e.final=Ta(e.final,n),e)}precommit(e){return e}postcommit(e){return P(Ta(e.explicits,e.elements).size===0,`Explicits must be subset of elements`),P(Ta(e.final,e.elements).size===0,`Final elements must be subset of elements`),e}commit(){let e=this.precommit(this.memory.mutableState());if(this.excluded.elements.size>0){let t=e.connections.filter(e=>this.excluded.elements.has(e.source)||this.excluded.elements.has(e.target)).flatMap(t=>[t,...Lc(e.connections,t).map(e=>e.intersect(t))]).filter(e=>e.nonEmpty());this.excludeConnections(t)}return this.excluded.connections.length>0&&(e=this.removeConnections(e)),this.excluded.elements.size>0&&(e=this.removeElements(e)),this.memory.update(this.postcommit(e))}},Cy=class{explicits=new Set;implicits=new Set;_ordered=new Set;_connections=[];constructor(e,t){this.memory=e,this.expression=t}get elements(){return this.explicits}get connections(){return this._connections}mergedConnections(){return zc([...this.memory.connections,...this._connections])}connectWithExisting(e,t){throw Error(`Method not implements, depends on the model`)}_addExplicit(e){this._ordered.add(e),this.explicits.add(e),this.implicits.delete(e)}addExplicit(e){if(!e)return this;if(sa(e)){for(let t of e)this._addExplicit(t);return this}return this._addExplicit(e),this}_addImplicit(e){this.explicits.has(e)||(this._ordered.add(e),this.implicits.add(e))}addImplicit(e){if(!e)return this;if(sa(e)){for(let t of e)this._addImplicit(t);return this}return this._addImplicit(e),this}_addConnection(e){this._connections.push(e),this._addImplicit(e.source),this._addImplicit(e.target)}addConnections(e){if(sa(e)){for(let t of e)this._addConnection(t);return this}return this._addConnection(e),this}isDirty(){return this.explicits.size>0||this.implicits.size>0||this._connections.length>0}isEmpty(){return!this.isDirty()}precommit(e){return e}postcommit(e){return e}processConnections(e){return e}commit(){let e=this.precommit(this.memory.mutableState()),t=new Set;if(this._connections.length>0){let[n,r]=at(this._connections,t=>e.final.has(t.source));e.connections=this.processConnections(zc([...e.connections,...n,...r])),t=new Set(e.connections.flatMap(e=>[e.source,e.target]))}return e.elements=Ca(e.elements,this._ordered,this.explicits,t,this.implicits),e.explicits=wa(e.elements,Ca(e.explicits,this.explicits)),e.final=wa(e.elements,Ca(e.final,this.explicits,t)),this.memory.update(this.postcommit(e))}};function wy(e,t=`final`){let n=ia(L(t===`final`?e.final:e.elements)),r=new Set(e.connections.flatMap(e=>[e.source,e.target])),i=new Set(n),a=new E.default(()=>null),o=n.reduce((e,t,n,r)=>(e.set(t,r.slice(n+1).filter(e=>I(t,e)).map(e=>(i.delete(e),e)).reduce((e,n)=>(e.some(e=>I(e,n))||(e.push(n),a.set(n,t)),e),[])),e),new E.default(()=>[]));return{root:i,connected:r,hasInOut:t=>e.connections.some(kc.isAnyInOut(t.id)),parent:e=>a.get(e),children:e=>o.get(e)}}var Ty=class extends Sy{};function Ey(e){if(H.isCustom(e))return Ey(e.custom.expr);if(H.isWhere(e)){let t=Ey(e.where.expr),n=vo(e.where.condition);return e=>t(e)&&n(e)}if(H.isElementKindExpr(e))return e.isEqual?t=>t.kind===e.elementKind:t=>t.kind!==e.elementKind;if(H.isElementTagExpr(e))return e.isEqual?({tags:t})=>t.includes(e.elementTag):({tags:t})=>!t.includes(e.elementTag);if(H.isWildcard(e))return()=>!0;if(H.isModelRef(e)){let t=B.flatten(e.ref);if(e.selector===`expanded`)return e=>e.id===t||Gi(e.id)===t;if(e.selector===`descendants`||e.selector===`children`){let e=t+`.`;return t=>t.id.startsWith(e)}return e=>e.id===t}F(e)}function Dy(e,t,n){let{shape:r,color:i,icon:a,...o}=e.style,s=!_(o);T(n,S(me(Xa)),S(t),ee(t=>{t.shape=r??t.shape,t.color=i??t.color,_e(a)&&(t.icon=a),_e(e.notation)&&(t.notation=e.notation),s&&(t.style={...t.style,...o})}))}function Oy(e,t){for(let n of e)!xo(n)||n.targets.length===0||Dy(n,Pe(n.targets.map(Ey)),t);return t}var ky=class e{static kind=Ya;constructor(e,t,n=null,r=new Set){this.id=e,this.viewRule=t,this.parent=n,this.elements=r}isEmpty(){return this.elements.size===0}update(t){return new e(this.id,this.viewRule,this.parent,t)}clone(){return new e(this.id,this.viewRule,this.parent,new Set(this.elements))}},Ay=class extends Sy{excludeRelations(e){return T(this.memory.connections,S(t=>Oa(t.relations,e)),ee(t=>{this.excludeConnections(t.update(wa(t.relations,e)))})),this}precommit(e){if(this.excluded.elements.size>0){let e=new Set([...this.excluded.elements].flatMap(e=>[...e.incoming(`direct`),...e.outgoing(`direct`)]));this.excludeRelations(e)}return e}postcommit(e){let t=Ta(this.memory.explicits,e.explicits);for(let n of t)e.explicitFirstSeenIn.delete(n);let n=Ta(this.memory.elements,e.elements);for(let t of n)e.lastSeenIn.delete(t);return e}},jy=class extends Ay{constructor(e,t){super(e,t),this.memory=e,this.expression=t}};const{findConnection:My,findConnectionsBetween:Ny}=Xc;var Py=class extends Cy{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!sa(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(My(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Ny(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Ny(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(Ny(e,this.memory.elements,`directed`));return r()}addImplicitWithinScope(e){e&&(!this.memory.scope||I(this.memory.scope,e))&&this.addImplicit(e)}processConnections(e){return so.isRelationExpr(this.expression)||T(e,ee(({source:e,target:t,boundary:n})=>{T(et([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),$e(([e,t])=>e===t),Ee(1),ee(([r,i])=>{if(r===e&&i===t){this.addImplicitWithinScope(n);return}r!==e&&this.addImplicitWithinScope(r),i!==t&&this.addImplicitWithinScope(i)}))})),e}postcommit(e){let t=Ta(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,`@root`);return e}},Fy=class extends Py{constructor(e,t){super(e,t),this.memory=e,this.expression=t}postcommit(e){let t=Ta(e.explicits,this.memory.explicits);for(let n of t)e.explicitFirstSeenIn.set(n,this.memory.activeGroupId);for(let t of[...this.explicits,...this.implicits])e.lastSeenIn.set(t,this.memory.activeGroupId);return e}},Iy=class e extends xy{static empty(t){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[],groups:[],explicitFirstSeenIn:new Map,lastSeenIn:new Map},t)}constructor(e,t){super(e),this.state=e,this.scope=t}get groups(){return this.state.groups}get explicitFirstSeenIn(){return this.state.explicitFirstSeenIn}get lastSeenIn(){return this.state.lastSeenIn}stageInclude(e){return new Py(this,e)}stageExclude(e){return new Ay(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections],groups:this.state.groups.map(e=>e.clone()),explicitFirstSeenIn:new Map(this.state.explicitFirstSeenIn),lastSeenIn:new Map(this.state.lastSeenIn)}}update(t){return new e({...this.state,...t},this.scope)}},Ly=class e extends Iy{static enter(t,n){let r=`@gr${t.groups.length+1}`;if(t instanceof e){let i=vt.default.from([...t.stack].reverse()),a=t.mutableState();return a.groups.push(new ky(r,n,t.activeGroupId)),i.push(r),new e(a,t.scope,i)}let i=t.mutableState();i.groups.push(new ky(r,n,null));let a=vt.default.of(r);return new e(i,t.scope,a)}constructor(e,t,n){super(e,t),this.state=e,this.scope=t,this.stack=n}get activeGroupId(){return N(this.stack.peek(),`Stack must not be empty`)}mutableState(){return{...super.mutableState()}}update(t){return new e({...this.state,...t},this.scope,this.stack)}stageInclude(e){return new Fy(this,e)}stageExclude(e){return new jy(this,e)}leave(){let t=this.mutableState();return this.stack.pop(),this.stack.peek()?new e(t,this.scope,this.stack):new Iy(t,this.scope)}};function Ry(e,t){let n;for(;e.parent&&(n=t.get(e.parent));){let t=n.depth??1;if(n.depth=Math.max(t,(e.depth??0)+1),n.depth===t)break;e=n}}function zy(e){let{id:t,title:n,...r}=ge(e.$element,[`summary`,`description`,`metadata`,`style`,`tags`]),{color:i,icon:a,shape:o,...s}=e.style;return z({id:t,title:n,modelRef:t,shape:o,color:i,icon:a,style:s,description:za(e.$element),tags:[...e.tags],metadata:e.$element.metadata,...r})}function By({defaults:e},t,n){let r=new Map,i=new Map;n?.forEach(({id:t,parent:n,viewRule:a,elements:o})=>{n&&N(r.get(n),`Parent group node ${n} not found`).children.push(t),r.set(t,{id:t,parent:n,kind:Ya,title:a.title??``,color:a.color??e.group.color??e.color,shape:`rectangle`,children:[],inEdges:[],outEdges:[],level:0,depth:0,tags:[],style:z({border:a.border??e.group.border,opacity:a.opacity??e.group.opacity,size:a.size,multiple:a.multiple,padding:a.padding,textSize:a.textSize})});for(let e of o)i.set(e.id,t)}),Array.from(t).sort(ta).forEach(({id:e,...t})=>{let n=Gi(e),a=0,o;for(;n&&(o=r.get(n),!o);)n=Gi(n);let s=t.modelRef??e;if(!o&&i.has(s)){let e=N(i.get(s));o=r.get(e),n=e}o&&(o.children.length==0&&(o.depth=1,Ry(o,r)),o.children.push(e),a=o.level+1);let c=z({id:e,parent:n,level:a,children:[],inEdges:[],outEdges:[],...t});r.set(e,c)});let a=new Map;return n?.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),t.forEach(({id:e})=>{a.set(e,N(r.get(e)))}),a}function Vy(e){let{title:t,description:n=null}=e;return{...t&&{title:t,description:n},...Te(e,[`color`,`technology`,`head`,`line`,`tail`,`kind`,`navigateTo`])}}function Hy(e,t){let n=T(e,qe((e,t)=>(y(t.title)&&!e.title.includes(t.title)&&e.title.push(t.title),y(t.description)&&!e.description.some(le(t.description))&&e.description.push(t.description),y(t.technology)&&!e.technology.includes(t.technology)&&e.technology.push(t.technology),y(t.kind)&&!e.kind.includes(t.kind)&&e.kind.push(t.kind),y(t.color)&&!e.color.includes(t.color)&&e.color.push(t.color),y(t.line)&&!e.line.includes(t.line)&&e.line.push(t.line),y(t.head)&&!e.head.includes(t.head)&&e.head.push(t.head),y(t.tail)&&!e.tail.includes(t.tail)&&e.tail.push(t.tail),y(t.navigateTo)&&!e.navigateTo.includes(t.navigateTo)&&e.navigateTo.push(t.navigateTo),t.tags&&e.tags.push(...t.tags),e),{title:[],description:[],technology:[],kind:[],head:[],tail:[],color:[],tags:[],line:[],navigateTo:[]})),r=he(n.title)??(n.title.length>1?`[...]`:void 0),i=we(n.tags),a=z({title:r,description:he(n.description),technology:he(n.technology),kind:he(n.kind),head:he(n.head),tail:he(n.tail),color:he(n.color),line:he(n.line),navigateTo:he(n.navigateTo),...Ui(i)&&{tags:i}});if(t){let e=Vy(t);a=ot({...a,...e},y)}return v(a.title)&&y(a.technology)&&(a.title=`[${a.technology}]`,delete a.technology),a}const{findConnection:Uy,findConnectionsBetween:Wy,findConnectionsWithin:Gy}=Kc;function Ky(e,t){let n=e.element(t.ref.deployment);if(n.isDeploymentNode()){if(t.selector===`children`)return[...n.children()];if(t.selector===`expanded`)return[n,...n.children()];if(t.selector===`descendants`)return[...n.descendants()]}return[n]}function qy(e,t){let n=e.$model.element(t.ref.model);return t.selector===`children`?[...n.children()]:t.selector===`expanded`?[n,...n.children()]:t.selector===`descendants`?[...n.descendants()]:[n]}function Jy(e){if(V.isWildcard(e))return()=>!0;if(V.isElementTagExpr(e)||V.isElementKindExpr(e))throw Error(`element kind and tag expressions are not supported in deployment view rules`);if(V.isDeploymentRef(e)){let t=e.ref.deployment;if(e.selector===`expanded`){let e=t+`.`;return n=>n.id===t||n.id.startsWith(e)}if(e.selector===`descendants`){let e=t+`.`;return t=>t.id.startsWith(e)}return e.selector===`children`?e=>Gi(e.id)===t:e=>e.id===t}if(V.isModelRef(e)){let t=e.ref.model;if(e.selector===`expanded`){let e=t+`.`;return n=>{let r=n.modelRef??null;return r?r===t||r.startsWith(e):!0}}if(e.selector===`descendants`){let e=t+`.`;return t=>{let n=t.modelRef??null;return n?n.startsWith(e):!0}}return e.selector===`children`?e=>{let n=e.modelRef??null;return n?Gi(n)===t:!0}:e=>{let n=e.modelRef??null;return n?n===t:!0}}F(e)}function Yy(e){return za(e.$instance)??za(e.element.$element)}function Xy(e){let t=e.id,n=e.onlyOneInstance();return z({id:t,deploymentRef:t,title:e.title,kind:e.kind,technology:e.technology??void 0,links:C(e.links,1)?[...e.links]:void 0,notation:e.$node.notation??void 0,color:e.color,shape:e.shape,modelRef:n?.element.id,icon:e.style.icon,description:za(e.$node)??void 0,tags:[...e.tags],style:ge(e.style,[`icon`,`shape`,`color`])})}function Zy(e){let t=e.$instance,n=e.element,{icon:r,color:i,shape:a,...o}=e.style,s=[...n.links,...t.links??[]];return z({id:e.id,kind:`instance`,title:e.title,description:Yy(e)??void 0,technology:e.technology??void 0,tags:[...e.tags],links:C(s,1)?s:void 0,icon:r,color:i,shape:a,style:o,deploymentRef:t.id,modelRef:n.id,notation:t.notation})}function Qy(e){return e.isInstance()?Zy(e):Xy(e)}function $y(e){return e.reduce((e,t)=>{let n=[...t.relations.model,...t.relations.deployment];P(C(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=Hy(n.map(e=>e.$relationship)),d=z({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u}),f=e.find(e=>e.source===a&&e.target===i);if(f&&d.label===f.label){f.dir=`both`;let n=f.head??d.head??t.source.$model.$styles.defaults.relationship.arrow;return f.head??=n,f.tail??=n,d.color&&(f.color??=d.color),d.line&&(f.line??=d.line),e}return e.push(d),e},[])}function eb(e,t){let n=By(e.$styles,[...t.final].map(Qy));for(let t of n.values()){if(!t.deploymentRef||!t.modelRef||t.children.length>0)continue;let n=e.deployment.element(t.deploymentRef),r=n.isDeploymentNode()&&n.onlyOneInstance();if(!r)continue;t.title===n.name&&(t.title=r.title),t.description??=Yy(r)??null,t.technology??=r.technology,_(t.tags)&&(t.tags=[...r.tags]),(!t.links||_(t.links))&&C(r.links,1)&&(t.links=[...r.links]);let i=e.$styles.defaults;t.shape===i.shape&&t.shape!==r.shape&&(t.shape=r.shape,t.notation=null),t.color===i.color&&t.color!==r.color&&(t.color=r.color,t.notation=null),!t.icon&&r.icon&&(t.icon=r.icon)}return n}function tb(e,t){for(let n of e)!xo(n)||n.targets.length===0||Dy(n,Pe(n.targets.map(Jy)),t);return t}function nb(e){let t=new E.default(()=>[]);for(let n of e)for(let e of n.relations.model)t.get(e).push(n);let n=new E.default(()=>new Set);for(let[e,r]of t)C(r,2)&&T(r,w(e=>[{group:`$source-${e.source.id}`,conn:e},{group:`$target-${e.target.id}`,conn:e}]),be(x(`group`)),Xe(),S(C(2)),ee(rt(b(x(`conn`)),Fc(`desc`),$e((e,t,n)=>t===0||e.boundary===n[t-1].boundary),ee(t=>{n.get(t).add(e)}))));return n}function rb(e){e=zc(e);let t=nb(e);for(let n of e){let{source:e,target:r}=n,i=n.relations.model;if(e.isDeploymentNode()!==r.isDeploymentNode()){let r=e.isDeploymentNode()?e:n.target;P(r.isDeploymentNode());let a=wa(i,r.internalModelRelationships());for(let e of a)t.get(n).add(e);continue}if(e.isDeploymentNode()&&r.isDeploymentNode()){let i=Ca(wa(n.relations.model,e.internalModelRelationships()),wa(n.relations.model,r.internalModelRelationships()));for(let e of i)t.get(n).add(e)}}return T(t.entries(),ma(([e,t])=>e.update({model:t,deployment:null})),L())}function ib(e){return Bc(e,rb(e))}function ab(e){return T(e,zc,qe((t,n)=>{let{source:r,target:i,relations:a}=n;if(r.isInstance()&&i.isInstance())return t;let o=_c.empty();if(r.isDeploymentNode()&&i.isDeploymentNode()){let[e]=Uy(i,r,`directed`);e&&(o=a.intersect(e.relations))}for(let t of e)Mc(t,n)&&(o=o.union(a.intersect(t.relations)));return o.nonEmpty&&t.push(new jc(r,i,o)),t},[]))}function ob(e){return Bc(e,ab(e))}var sb=class extends Cy{connectWithExisting(e,t=`both`){let n=this._connections.length,r=()=>this._connections.length>n;if(!sa(e)){if(t===`in`||t===`both`)for(let t of this.memory.elements)this.addConnections(Uy(t,e,`directed`));return(t===`out`||t===`both`)&&this.addConnections(Wy(e,this.memory.elements,`directed`)),r()}let i=[...e];if(t===`in`||t===`both`)for(let e of this.memory.elements)this.addConnections(Wy(e,i,`directed`));if(t===`out`||t===`both`)for(let e of i)this.addConnections(Wy(e,this.memory.elements,`directed`));return r()}processConnections(e){let t=T(e,ib,ob);return T(t,ee(({source:e,target:t,boundary:n})=>{T(et([...L(e.ancestors()).reverse(),e],[...L(t.ancestors()).reverse(),t]),$e(([e,t])=>e===t),Ee(1),ee(([r,i])=>{if(e===r&&t===i){this.addImplicit(n);return}r!==e&&r.isDeploymentNode()&&!r.onlyOneInstance()&&this.addImplicit(r),i!==t&&i.isDeploymentNode()&&!i.onlyOneInstance()&&this.addImplicit(i)}))})),t}},cb=class e extends xy{static empty(){return new e({elements:new Set,explicits:new Set,final:new Set,connections:[]})}stageInclude(e){return new sb(this,e)}stageExclude(e){return new Ty(this,e)}mutableState(){return{elements:new Set(this.state.elements),explicits:new Set(this.state.explicits),final:new Set(this.state.final),connections:[...this.state.connections]}}update(t){return new e({...this.state,...t})}equals(t){return t instanceof e&&le(this.state,t.state)}diff(e){return{added:{elements:L(Ta(e.elements,this.elements)),explicits:L(Ta(e.explicits,this.explicits)),final:L(Ta(e.final,this.final)),connections:L(Bc(e.connections,this.connections))},removed:{elements:L(Ta(this.elements,e.elements)),explicits:L(Ta(this.explicits,e.explicits)),final:L(Ta(this.final,e.final)),connections:Bc(this.connections,e.connections)}}}toString(){return[`final:`,...[...this.final].map(e=>` `+e.id),`connections:`,...this.connections.map(e=>` `+e.expression)].join(`
1212
+ `)}[Ac](e,t,n){return this.toString()}};const lb={include:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return xb(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return xb(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},ub={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.incoming)){for(let e of a){if(e.allOutgoing.isEmpty)continue;let t=wb(Wy(e,[...kb(e)],`directed`),i);r.addConnections(t)}return r}P(V.isDeploymentRef(e.incoming),`Only deployment refs are supported in include`);let o=Ky(t,e.incoming);for(let e of a){let t=wb(Wy(e,o,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.incoming)||V.isElementKindExpr(e.incoming))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.incoming))return Sb(fb(t,e.incoming),{stage:r,memory:n},i);if(V.isWildcard(e.incoming))return r;let a=db(Ky(t,e.incoming)),o=T(n.connections,S(a),wb(i));return r.excludeConnections(o),r}};function db(e){return Pe(e.map(e=>{let t=t=>t===e||I(e,t);return e=>!t(e.source)&&t(e.target)}))}function fb(e,t){let n=qy(e,t);return new Set(n.flatMap(e=>[...e.allIncoming]))}const pb={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.outgoing)){for(let e of a)if(!e.allIncoming.isEmpty)for(let t of kb(e)){let n=wb(Uy(t,e,`directed`),i);r.addConnections(n)}return r}P(V.isDeploymentRef(e.outgoing),`Only deployment refs are supported in include`);let o=Ky(t,e.outgoing);for(let e of o){let t=wb(Wy(e,a,`directed`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.outgoing)||V.isElementKindExpr(e.outgoing))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.outgoing))return Sb(hb(t,e.outgoing),{stage:r,memory:n},i);if(V.isWildcard(e.outgoing))return r;let a=mb(Ky(t,e.outgoing)),o=T(n.connections,S(a),wb(i));return r.excludeConnections(o),r}};function mb(e){return Pe(e.map(e=>{let t=t=>t===e||I(e,t);return e=>t(e.source)&&!t(e.target)}))}function hb(e,t){let n=qy(e,t);return new Set(n.flatMap(e=>[...e.allOutgoing]))}const gb={include:({expr:{source:e,target:t,isBidirectional:n=!1},model:r,stage:i,where:a})=>{if(V.isElementTagExpr(e)||V.isElementKindExpr(e)||V.isElementTagExpr(t)||V.isElementKindExpr(t))throw Error(`element kind and tag expressions are not supported in include`);P(!V.isModelRef(e),`Invalid source model ref in direct relation`),P(!V.isModelRef(t),`Invalid target model ref in direct relation`);let o=V.isWildcard(e),s=V.isWildcard(t),c=n?`both`:`directed`,l;switch(!0){case o&&s:l=T(Gy(r.instances()),wb(a),b(e=>(i.addImplicit(e.boundary),e)));break;case!o&&s:{let t=Ky(r,e),i=mb(t),o=i;if(n){let e=db(t);o=t=>i(t)!==e(t)}l=T(t,w(e=>Wy(e,kb(e),c)),S(o),wb(a));break}case o&&!s:{let e=Ky(r,t),i=db(e),o=i;if(n){let t=mb(e);o=e=>t(e)!==i(e)}l=T(e,w(e=>[...kb(e)].flatMap(t=>Uy(t,e,c))),S(o),wb(a));break}default:{P(!o,`Inference failed - source should be a deployment ref`),P(!s,`Inference failed - target should be a deployment ref`);let n=Ky(r,e),i=Ky(r,t),u=mb(n),d=db(i);l=T(n,w(e=>Wy(e,i,c)),S(e=>u(e)&&d(e)),wb(a))}}return i.addConnections(l),V.isDeploymentRef(e)&&st(e.selector)&&i.addImplicit(r.element(e.ref.deployment)),V.isDeploymentRef(t)&&st(t.selector)&&i.addImplicit(r.element(t.ref.deployment)),i},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=Jy(e.target),o=Jy(e.source),s;switch(!0){case V.isWildcard(e.source)&&V.isWildcard(e.target):return r.excludeConnections(wb(n.connections,i)),r;case V.isModelRef(e.source)&&V.isModelRef(e.target):return s=_b({source:e.source,target:e.target,expr:e,model:t}),Sb(s,{stage:r,memory:n},i);case V.isModelRef(e.source)&&V.isWildcard(e.target):return s=hb(t,e.source),Sb(s,{stage:r,memory:n},i);case V.isModelRef(e.source):return s=hb(t,e.source),Sb(s,{stage:r,memory:n},i,e=>a(e.target));case V.isModelRef(e.target):return s=fb(t,e.target),Sb(s,{stage:r,memory:n},i,e=>o(e.source));default:let c=T(n.connections,S(t=>o(t.source)&&a(t.target)||e.isBidirectional===!0&&o(t.target)&&a(t.source)),wb(i));return c.length===0||r.excludeConnections(c),r}}};function _b({source:e,target:t,expr:n,model:r}){let i=qy(r,e),a=qy(r,t),o=n.isBidirectional?`both`:`directed`,s=[];for(let e of i)s.push(...Qc(e,a,o));return new Set(s.flatMap(e=>[...e.relations]))}const vb={include:({expr:e,model:t,memory:n,stage:r,where:i})=>{let a=[...n.elements];if(V.isWildcard(e.inout)){for(let e of a){let t=Eb(Wy(e,[...kb(e)],`both`),i);r.addConnections(t)}return r}P(V.isDeploymentRef(e.inout),`Only deployment refs are supported in include`);let o=Ky(t,e.inout);for(let e of a){let t=Eb(Wy(e,o,`both`),i);r.addConnections(t)}return r},exclude:({expr:e,model:t,memory:n,stage:r,where:i})=>{if(V.isElementTagExpr(e.inout)||V.isElementKindExpr(e.inout))throw Error(`element kind and tag expressions are not supported in exclude`);if(V.isModelRef(e.inout)){let a=qy(t,e.inout);return a.length===0?r:Sb(Ca(new Set,...a.flatMap(e=>[e.allIncoming,e.allOutgoing])),{stage:r,memory:n},i)}if(V.isWildcard(e.inout))return r;let a=Ky(t,e.inout),o=db(a),s=mb(a),c=T(n.connections,S(e=>o(e)!==s(e)),wb(i));return r.excludeConnections(c),r}},yb={include:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return xb(`include`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})},exclude:({expr:e,model:t,memory:n,stage:r})=>{let i=vo(e.where.condition);return xb(`exclude`,{expr:e.where.expr,model:t,stage:r,memory:n,where:i})}},bb={include:({model:e,stage:t,where:n})=>{let r=[],i=T([...e.roots()],Tb(n),b(e=>(e.onlyOneInstance()||r.push(...e.children()),e)));return t.addExplicit(i),r.length>1&&t.addConnections(Gy([...i,...r])),t},exclude:({stage:e,memory:t,where:n})=>{let r=T([...t.elements],Tb(n));return e.exclude(r),e}};function xb(e,{expr:t,where:n,...r}){switch(!0){case V.isElementTagExpr(t):case V.isElementKindExpr(t):throw Error(`element kind and tag expressions are not supported in deployment view rules`);case io.isCustom(t):case V.isCustom(t):case V.isModelRef(t):return;case V.isWhere(t):return lb[e]({...r,expr:t,where:n});case io.isWhere(t):return yb[e]({...r,expr:t,where:n});case V.isDeploymentRef(t):return Ab[e]({...r,expr:t,where:n});case V.isWildcard(t):return bb[e]({...r,expr:t,where:n});case io.isDirect(t):return gb[e]({...r,expr:t,where:n});case io.isInOut(t):return vb[e]({...r,expr:t,where:n});case io.isOutgoing(t):return pb[e]({...r,expr:t,where:n});case io.isIncoming(t):return ub[e]({...r,expr:t,where:n});default:F(t)}}function Sb(e,{stage:t,memory:n},r,i=()=>!0){if(e.size===0)return t;let a=T(n.connections,S(e=>i(e)),S(t=>Oa(t.relations.model,e)),b(t=>t.update({deployment:null,model:wa(t.relations.model,e)})),wb(r),S(e=>e.nonEmpty()));return a.length===0?t:t.excludeConnections(a)}function Cb(e,t){return wb(e,t).nonEmpty()}function wb(...e){if(e.length===1)return t=>wb(t,e[0]);let[t,n]=e;return n===null?t:se(t)?t.map(e=>wb(e,n)).filter(e=>e.nonEmpty()):t.update({model:new Set([...t.relations.model.values()].filter(e=>n(Ob(t)(e)))),deployment:new Set([...t.relations.deployment.values()].filter(e=>n(Ob(t)(e))))})}function Tb(...e){if(e.length===1)return t=>Tb(t,e[0]);let[t,n]=e;return se(t)?t.filter(e=>Tb(e,n)):n?.(Db(t,t))??!0}function Eb(e,t){return t?T(e,S(e=>Cb(e,t))):e}function Db(e,t){if(il(e)){let n=nl(t)&&tl(t)?t:null;return{kind:e.kind,tags:[...e.tags,...n?.tags??[]],metadata:e.metadata}}if(rl(e))return Te(e.element,[`tags`,`kind`,`metadata`]);if(tl(e))return{kind:e.element.kind,tags:[...e.tags,...e.element.tags],metadata:e.metadata};if(el(e))return Te(e,[`tags`,`kind`,`metadata`]);F(e)}function Ob(e){return t=>({tags:t.tags,kind:t.kind,metadata:t.metadata,source:Db(t.source,e.source),target:Db(t.target,e.target)})}function kb(e){let t=new Set;for(let n of e.descendingSiblings())t.add(n);return t}const Ab={include:e=>{let{expr:t,where:n}=e,r=e.model.element(t.ref.deployment);if(tl(r))return Tb(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r)),e.stage;switch(!0){case t.selector===`expanded`:Mb(r,e);break;case t.selector===`children`:jb(r,e);break;case t.selector===`descendants`:Nb(r,e);break;default:Tb(r,n)&&(e.stage.addExplicit(r),e.stage.connectWithExisting(r))}return e.stage},exclude:({expr:e,stage:t,memory:n,where:r})=>{let i=Jy(e),a=T([...n.elements],S(i),Tb(r));return t.exclude(a),t}};function jb(e,{stage:t,where:n}){let r=Tb([...e.children()],n);r.length!==0&&(t.addImplicit(e),t.addConnections(Gy(r)),t.connectWithExisting(r),t.addExplicit(r))}function Mb(e,{memory:t,stage:n,where:r}){n.addImplicit(e),n.connectWithExisting(e);let i=Tb([...e.children()],r),a=!1;for(let e of i)if(Wy(e,t.elements).length>0){a=!0;break}a&&(n.connectWithExisting(i,`in`),n.addConnections(Gy(i)),n.connectWithExisting(i,`out`)),n.addImplicit(i),n.connections.length>0&&n.addExplicit(e)}function Nb(e,{stage:t,where:n}){let r=e=>{let i=[];for(let t of e.children())t.isDeploymentNode()&&i.push(...r(t)),Tb(t,n)&&i.push(t);return t.connectWithExisting(i,`in`),t.addConnections(Gy(i)),t.addImplicit(i),i},i=r(e);if(i.length===0)return;t.connectWithExisting(i,`out`);let a=Pb(t);T(i,S(e=>a.has(e)),ee(e=>t.addExplicit(e)))}function Pb(e){return T(e.mergedConnections(),ib,ob,qe((e,t)=>(e.add(t.source),e.add(t.target),e),new Set))}var Fb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=T(e.connections,ib,ob),n=Bc(e.connections,t);if(n.length===0)return e;let r=e.stageExclude({});return r.excludeConnections(n,!0),r.commit()}step2ProcessImplicits(e){let t=Ca(this.memory.elements,e.elements),n=Ca(e.final,this.memory.explicits),r=new E.default(()=>new Set);for(let t of e.connections)if(t.boundary)for(let e of t.relations.model)r.get(e).add(t.boundary);for(let[e,i]of r)if(!(i.size<2))for(let e of i)t.delete(e)&&n.add(e);let i=new Set(n),a=e=>{for(let t of i)if(e===t||I(e,t))return!0;return!1};return T(Ta(t,i),ca(e=>e.isDeploymentNode()),L(),na,ee(e=>{let t=[...e.children()].filter(a).length;if(t>=2){n.add(e);return}t===1&&ha(e.siblings(),a)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&t.add(n.boundary);let n=wy(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=he([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=he(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};function Ib(e,t){let n=cb.empty();for(let r of t)if(bo(r)){let t=`include`in r?`include`:`exclude`,i=r.include??r.exclude;for(let r of i){let i=t===`include`?n.stageInclude(r):n.stageExclude(r);i=xb(t,{expr:r,model:e,stage:i,memory:n,where:null})??i,n=i.commit()}}return Fb.for(n).commit()}function Lb(e,{docUri:t,rules:n,...r}){let i=Ib(e.deployment,n),a=eb(e,i),o=$y(i.connections);my(a,o);let s=yy({nodes:a,edges:o}),c=tb(n,s.nodes),l=Ze(n,Oo),u=Vo(c);return by({...r,[Ha]:`computed`,[Ua]:`deployment`,autoLayout:{direction:l?.direction??`TB`,...l?.nodeSep&&{nodeSep:l.nodeSep},...l?.rankSep&&{rankSep:l.rankSep}},edges:s.edges,nodes:b(c,e=>(e.icon===`none`&&delete e.icon,e)),...u.length>0&&{notation:{nodes:u}}})}function Rb(e){return t=>Mo(t)?t.groupRules.flatMap(Rb(e)):bo(t)&&`include`in t?t.include.filter(e):[]}function zb(e,t){let n=e.flatMap(Rb(H.isCustom));if(n.length===0)return t;let r=[...t];for(let{custom:{expr:e,...t}}of n){let{border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d,...f}=it(t,v),p=z({border:n,opacity:i,multiple:a,iconColor:o,iconSize:s,iconPosition:c,padding:l,size:u,textSize:d}),m=!ve(p),h=!ve(f),g=Ey(e);r.forEach((e,t)=>{Xa(e)||!g(e)||(h&&(e={...e,...f,isCustomized:!0}),m&&(e={...e,isCustomized:!0,style:{...e.style,...p}}),r[t]=e)})}return r}function Bb(e,t){return e.reduce((e,n)=>{if(Do(n)){let r=t.predicates[n.predicateId];return v(r)?e:e.concat(r)}if(Eo(n)){let r=t.styles[n.styleId];return v(r)?e:e.concat(r)}return e.push(n),e},[])}function Vb(e,t){return e.reduce((e,n)=>{if(Do(n)){let r=t.dynamicPredicates[n.predicateId];return v(r)?e:e.concat(r)}if(Eo(n)){let r=t.styles[n.styleId];return v(r)?e:e.concat(r)}return e.push(n),e},[])}function Hb(e,t){let n=new Set;for(let r of t)if(bo(r))for(let t of r.include){let r=Ey(t);for(let t of e.elements())r(t)&&n.add(t)}return n}const Ub=e=>{if(Ao(e)){let t=[],n=[];for(let r of e.__parallel)if(jo(r)){let[e,...i]=r.__series;t.push(e),n.push(...i)}else t.push(r);return[...t,...n]}return jo(e)?[...e.__series]:e};function Wb(e,t){let n=[],r=(...[e,t])=>{if(!n.includes(e)){let r=n.indexOf(t);if(r>0){n.splice(r,0,e);return}else n.push(e)}n.includes(t)||n.push(t)};for(let i of w(t,Ub)){let t=e.element(i.source),a=e.element(i.target),o=n.indexOf(t),s=n.indexOf(a);o>=0&&s>=0||(i.isBackward?r(a,t):r(t,a))}return new Set(n)}function Gb(e,t,n){let r=Zc(e,t,`directed`).flatMap(e=>[...e.relations]).sort(Sa);if(!Ui(r))return{};if(r.length===1){let e=r[0];return z({title:e.title??void 0,kind:e.kind??void 0,tags:e.tags,relations:[e.id],navigateTo:e.$relationship.navigateTo,color:e.$relationship.color,line:e.$relationship.line,technology:e.technology??void 0,description:e.$relationship.description??void 0})}let i=T(r,w(e=>e.tags),we()),a=C(i,1)?i:void 0,o=b(r,e=>e.id),s=We(r).$relationship.navigateTo;s===n&&(s=void 0),s||=T(r,w(e=>e.$relationship.navigateTo&&e.$relationship.navigateTo!==n?e.$relationship.navigateTo:[]),we(),he());let c=T(r,qe((e,{title:t,technology:n,$relationship:r})=>(y(t)&&e.title.add(t),y(r.color)&&e.color.add(r.color),y(r.line)&&e.line.add(r.line),y(r.kind)&&e.kind.add(r.kind),y(n)&&e.technology.add(n),y(r.description)&&!e.description.some(le(r.description))&&e.description.push(r.description),e),{kind:new Set,color:new Set,line:new Set,title:new Set,technology:new Set,description:[]}));return z({tags:a??void 0,relations:o,navigateTo:s,kind:he([...c.kind]),title:he([...c.title]),color:he([...c.color]),line:he([...c.line]),technology:he([...c.technology]),description:he(c.description)})}var Kb=class{steps=[];constructor(e,t){this.model=e,this.view=t}compute(){let{docUri:e,rules:t,steps:n,...r}=this.view,i=Vb(t,this.model.globals),a=Hb(this.model,i),o=Wb(this.model,n),s=T(Ca(wa(a,o),o,a),L(),ia),c=s.reduce((e,t,n,r)=>{for(let i=n+1;i<r.length;i++){let n=r[i];if(I(t,n)){e.push(t);break}}return e},[]),l=(e,t,n)=>{if(jo(e)){for(let r of e.__series)t=l(r,t,n);return t}let r=n?to(n,t):to(t),{source:i,target:a,title:o,isBackward:u,navigateTo:d,notation:f,...p}=e,m=this.model.element(i),h=s.indexOf(m);P(h>=0,`Source ${i} not found`);let g=this.model.element(a),ee=s.indexOf(g);P(ee>=0,`Target ${a} not found`),(c.includes(m)||c.includes(g))&&console.error(`Step ${m.id} -> ${g.id} because it involves a compound`);let{title:te,relations:ne,navigateTo:re,...ie}=Gb(m,g,this.view.id),ae=y(d)&&d!==this.view.id?d:re,oe=e.kind&&!e.technology?this.model.specification.relationships[e.kind]?.technology:void 0;return this.steps.push(z({...ie,...p,...oe&&{technology:oe},id:r,source:m,target:g,navigateTo:ae,title:o??te,relations:ne??[],isBackward:h>ee})),t+1},u=1;for(let e of n){if(Ao(e)){let t=1;for(let n of e.__parallel)t=l(n,t,u);u++;continue}u=l(e,u)}let d=By(this.model.$styles,s.map(zy)),f=this.model.$styles.defaults.relationship,p=this.steps.map(({id:e,source:t,target:n,relations:r,title:i,isBackward:a,tags:o,...s})=>{let c=N(d.get(t.id),`Source node ${t.id} not found`),l=N(d.get(n.id),`Target node ${n.id} not found`),u={id:e,parent:Qi(t.id,n.id),source:c.id,target:l.id,label:i??null,relations:r,color:f.color,line:f.line,head:f.arrow,tags:o??[],...s};for(a&&(u.dir=`back`);u.parent&&!d.has(u.parent);)u.parent=Gi(u.parent);c.outEdges.push(u.id),l.inEdges.push(u.id);for(let e of $i(u.source)){if(e===u.parent)break;d.get(e)?.outEdges.push(u.id)}for(let e of $i(u.target)){if(e===u.parent)break;d.get(e)?.inEdges.push(u.id)}return u}),m=zb(i,Oy(i,s.map(e=>N(d.get(e.id))))),h=Ze(i,Oo),g=Vo(m);return by({...r,[Ua]:`dynamic`,[Ha]:`computed`,variant:r.variant??`diagram`,autoLayout:{direction:h?.direction??`LR`,...h?.nodeSep&&{nodeSep:h.nodeSep},...h?.rankSep&&{rankSep:h.rankSep}},nodes:b(m,e=>(e.icon===`none`&&delete e.icon,e)),edges:p,...g.length>0&&{notation:{nodes:g}}})}};function qb(e,t){return new Kb(e,t).compute()}function Jb(e){switch(!0){case oo.isCustom(e):return Jb(e.customRelation.expr);case oo.isWhere(e):{let t=Jb(e.where.expr),n=vo(e.where.condition);return e=>t(e)&&n({source:{tags:e.source.tags,kind:e.source.kind,metadata:e.source.metadata},target:{tags:e.target.tags,kind:e.target.kind,metadata:e.target.metadata},...e.tags&&{tags:e.tags},...e.kind&&{kind:e.kind},...e.metadata&&{metadata:e.metadata}})}case oo.isDirect(e):{let t=Ey(e.source),n=Ey(e.target);return r=>t(r.source)&&n(r.target)||!!e.isBidirectional&&t(r.target)&&n(r.source)}case oo.isInOut(e):{let t=Ey(e.inout);return e=>t(e.source)||t(e.target)}case oo.isIncoming(e):{let t=Ey(e.incoming);return e=>t(e.target)}case oo.isOutgoing(e):{let t=Ey(e.outgoing);return e=>t(e.source)}default:F(e)}}function Yb(e,t,n){let r=e.flatMap(Rb(oo.isCustom)),i=Array.from(n);if(r.length===0||i.length===0)return i;for(let{customRelation:{expr:e,title:n,description:a,notes:o,...s}}of r){let r=a?{description:Ka(a)}:{},c=o?{notes:Ka(o)}:{},l=it(s,v),u=Jb(e);i.forEach((e,a)=>{let o,s;for(let n of t)if(n.id===e.source&&(o=n),n.id===e.target&&(s=n),o&&s)break;!o||!s||u({source:o,target:s,...Te(e,[`kind`,`tags`])})&&(i[a]={...e,...l,...r,...c,label:n??e.label,isCustomized:!0})})}return i}function Xb(e){return T([...e],zc,qe((e,t,n,r)=>{let i=Rc(r,t),a=Ca(...i.map(x(`relations`))),o=wa(t.relations,a);if(i.length>0&&(o=Ca(o,t.directRelations)),Nc(r,t.reversed())&&(o=Ca(o,t.directRelations)),o.size<t.relations.size){let e=r.some(Wc(t.source)),n=r.some(Wc(t.target));e&&(o=Ca(o,ga(ca(t.relations,Hc(t.source))))),n&&(o=Ca(o,ga(ca(t.relations,Uc(t.target)))))}return o.size>0&&e.push(t.update(o)),e},[]))}var Zb=class e{static for(t){return new e(t)}constructor(e){this.memory=e}step1CleanConnections(e){if(e.connections.length<2)return e;let t=Xb(e.connections);if(t.length===0)return e;let n=e.stageExclude({});return n.excludeConnections(t,!0),n.commit()}step2ProcessImplicits(e){let t=Ca(this.memory.elements,e.elements),n=Ca(e.final,this.memory.explicits),r=new Set(n),i=e=>{for(let t of r)if(e===t||I(e,t))return!0;return!1};return T(Ta(t,r),L(),na,ee(e=>{let t=[...e.children()].filter(i).length;if(t>=2){n.add(e);return}t===1&&ha(e.siblings(),i)&&n.add(e)})),e.update({final:n})}step3ProcessBoundaries(e){let t=new Set;for(let n of e.connections)n.boundary&&n.boundary!==n.source&&n.boundary!==n.target&&t.add(n.boundary);let n=wy(e,`final`),r=e.stageExclude({}),i=r=>!(t.has(r)||e.explicits.has(r)||n.hasInOut(r)||n.root.has(r)),a=he([...n.root]);a&&!e.explicits.has(a)&&r.exclude(a);for(let t of e.final){let e=he(n.children(t));e&&!n.hasInOut(e)&&i(t)&&r.exclude(t)}return r.isDirty()?r.commit():e}commit(){let e=this.step1CleanConnections(this.memory),t=this.step2ProcessImplicits(e);return this.step3ProcessBoundaries(t)}};const{findConnection:Qb,findConnectionsBetween:$b,findConnectionsWithin:ex}=Xc;function tx(e,t){switch(!0){case H.isElementKindExpr(t):return[...ca(e.elements(),e=>t.isEqual===(e.kind===t.elementKind))];case H.isElementTagExpr(t):return[...ca(e.elements(),e=>t.isEqual===e.tags.includes(t.elementTag))];case t.selector===`expanded`:{let n=e.element(B.flatten(t.ref));return[n,...n.children()]}case t.selector===`children`:case t.selector===`descendants`:{let n=e.element(B.flatten(t.ref)),r=t.selector===`children`?L(n.children()):L(n.descendants());return r&&r.length>0?r:[n]}case H.isModelRef(t):return[e.element(B.flatten(t.ref))];default:F(t)}}function nx(e,t){if(t.isEmpty()||e.length===0)return e;let n=Pe(e.map(e=>Yi(e))),r=L(ca(t.elements,t=>!e.includes(t)&&n(t)));return[...e,...r]}function rx(e,{memory:t,model:n}){let r=tx(n,e);return H.isModelRef(e)?e.selector===`descendants`?r:nx(r,t):r}const ix={include:({expr:e,model:t,stage:n,where:r})=>{let i=t.element(B.flatten(e.ref));r(i)&&(n.addExplicit(i),n.connectWithExisting(i));let a=[...i.children()].filter(r),o=[];for(let e of a)n.addImplicit(e),n.connectWithExisting(e)&&o.push(e);return n.addConnections(ex(o)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(tx(t,e));return n.exclude(i),n}},ax={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(tx(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(ex(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(tx(t,e));return n.exclude(i),n}},ox={include:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(tx(t,e));if(i.length!==0)return n.addExplicit(i),n.connectWithExisting(i),n.addConnections(ex(i)),n},exclude:({expr:e,model:t,stage:n,filterWhere:r})=>{let i=r(tx(t,e));return n.exclude(i),n}},sx=()=>!0,cx=e=>e;function lx(e){return e.reduce((e,t)=>{let n=[...t.relations];P(C(n,1),`Edge must have at least one relation`);let r=t.source.$model.$styles.defaults,i=t.source.id,a=t.target.id,{title:o,color:s=r.relationship.color,line:c=r.relationship.line,head:l=r.relationship.arrow,...u}=Hy(n.map(e=>e.$relationship),he(S(n,e=>e.source.id===i&&e.target.id===a))?.$relationship),d=z({id:t.id,parent:t.boundary?.id??null,source:i,target:a,label:o??null,relations:n.map(e=>e.id),color:s,line:c,head:l,...u});return e.push(d),e},[])}function ux(e,t){return By(e.$styles,[...t.final].map(zy),t.groups)}const dx=H.isWildcard,fx=(e,t)=>e.isAncestorOf(t)||e.isDescendantOf(t),px={include:({expr:{source:e,target:t,isBidirectional:n=!1},memory:r,model:i,stage:a,where:o,filterWhere:s})=>{let c=dx(e),l=dx(t),u=[];switch(!0){case c&&l&&r.isEmpty()&&o!==sx:{let e=T(i.relationships(),ca(o),L(),b(e=>new Gc(e.source,e.target,new Set([e]))));return a.addConnections(e),a}case c&&l&&!r.isEmpty()&&o!==sx:u.push(...ex(r.elements));break;case c&&l:u.push(...ex(i.roots()));break;case!c&&l&&o!==sx:{let t=T(tx(i,e),w(e=>T(e,Ue(Oe(n===!0),{onTrue:e=>Ca(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ca(o),_a(),L(),at(t=>t.source===e),([t,n])=>Ae(T(t,S(t=>!fx(e,t.target)),b(t=>new Gc(e,t.target,new Set([t])))),T(n,S(t=>!fx(e,t.source)),b(t=>new Gc(t.source,e,new Set([t]))))))));return a.addConnections(t),a}case!c&&l:{let[t,a]=mx(e,{memory:r,model:i}),o=n?`both`:`directed`;for(let e of t)u.push(...$b(e,a,o));break}case c&&!l&&o!==sx:{let e=T(tx(i,t),w(e=>T(e,Ue(Oe(n===!0),{onTrue:e=>Ca(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ca(o),L(),at(t=>t.target===e),([t,n])=>Ae(T(n,S(t=>!fx(e,t.target)),b(t=>new Gc(e,t.target,new Set([t])))),T(t,S(t=>!fx(e,t.source)),b(t=>new Gc(t.source,e,new Set([t]))))))));return a.addConnections(e),a}case c&&!l:{let[e,a]=mx(t,{memory:r,model:i}),o=n?`both`:`directed`;for(let t of a)u.push(...$b(t,e,o));break}default:{P(!dx(e),`Inference failed - source must be not a wildcard`),P(!dx(t),`Inference failed - target must be not a wildcard`);let a=rx(e,{memory:r,model:i}),o=rx(t,{memory:r,model:i}),s=n?`both`:`directed`;for(let e of a)u.push(...$b(e,o,s))}}return a.addConnections(s(u)),a},exclude:({expr:{source:e,target:t,isBidirectional:n},model:r,memory:i,stage:a,where:o})=>{let s=dx(e),c=dx(t),l;switch(!0){case s&&c:l=T(i.connections,w(rt(x(`relations`),ca(o),L())),ga());break;case!s&&c:l=T(tx(r,e),w(e=>T(e,Ue(Oe(n===!0),{onTrue:e=>Ca(e.allIncoming,e.allOutgoing),onFalse:e=>e.allOutgoing}),ca(o),L())),ga());break;case s&&!c:l=T(tx(r,t),w(e=>T(e,Ue(Oe(n===!0),{onTrue:e=>Ca(e.allIncoming,e.allOutgoing),onFalse:e=>e.allIncoming}),ca(o),L())),ga());break;default:{P(!dx(e),`Inference failed - source must be not a wildcard`),P(!dx(t),`Inference failed - target must be not a wildcard`);let i=tx(r,e),a=tx(r,t),s=new Set;for(let e of i)for(let t of a)Ji(e,t)||(s=Ca(s,wa(e.allOutgoing,t.allIncoming),n?wa(t.allOutgoing,e.allIncoming):new Set));l=ga(ca(s,o))}}return a.excludeRelations(l),a}};function mx(e,{memory:t,model:n}){let r=tx(n,e);if(!C(r,1))return[[],[]];if(H.isModelRef(e)){let i=L(n.element(B.flatten(e.ref)).ascendingSiblings());return[nx(r,t),nx(i,t)]}return[r,T(r,b(e=>e.ascendingSiblings()),ua(),_a(),L(),e=>nx(e,t))]}const hx={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.incoming,s=[];if(H.isWildcard(o)){if(!t)return;for(let e of t.ascendingSiblings())s.push(...Qb(e,t,`directed`))}else{let e=rx(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...we(e.flatMap(e=>[...e.ascendingSiblings()])));let i=gx(n,o);for(let n of t)s.push(...$b(n,e,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{incoming:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allIncoming)}else{let n=tx(t,e);a.push(...n.flatMap(e=>[...e.allIncoming]))}return r.excludeRelations(new Set(a.filter(i))),r}};function gx(e,t){switch(!0){case H.isElementKindExpr(t):case H.isElementTagExpr(t):{let e=Ey(t);return t=>e(t.target)}case H.isModelRef(t)&&t.selector===`children`:{let n=B.flatten(t.ref);return Pe([...e.children(n)].map(e=>kc.isIncoming(e.id)))}case H.isModelRef(t)&&t.selector===`descendants`:{let n=B.flatten(t.ref);return Pe([kc.isInside(n),...[...e.children(n)].map(e=>kc.isIncoming(e.id))])}case H.isModelRef(t)&&t.selector===`expanded`:{let e=B.flatten(t.ref);return Pe([kc.isIncoming(e),kc.isInside(e)])}case H.isModelRef(t):{let e=B.flatten(t.ref);return kc.isIncoming(e)}default:F(t)}}const _x={include:({expr:{inout:e},scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=[];if(H.isWildcard(e)){if(!t)return;o.push(...$b(t,t.ascendingSiblings()))}else{let t=rx(e,{memory:r,model:n}),i=[...r.elements];i.length===0&&(i=we(t.flatMap(e=>L(e.ascendingSiblings()))));for(let e of t)o.push(...$b(e,i))}return i.addConnections(a(o)),i},exclude:({expr:{inout:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing),a.push(...n.allIncoming)}else{let n=tx(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing,...e.allIncoming]))}return r.excludeRelations(ga(a.filter(i))),r}},vx={include:({expr:e,scope:t,model:n,memory:r,stage:i,filterWhere:a})=>{let o=e.outgoing,s=[];if(H.isWildcard(o)){if(!t)return;s.push(...$b(t,t.ascendingSiblings(),`directed`))}else{let e=rx(o,{memory:r,model:n}),t=[...r.elements];t.length===0&&t.push(...we(e.flatMap(e=>[...e.ascendingSiblings()])));let i=yx(n,o);for(let n of e)s.push(...$b(n,t,`directed`).filter(i))}return i.addConnections(a(s)),i},exclude:({expr:{outgoing:e},model:t,scope:n,stage:r,where:i})=>{let a=[];if(H.isWildcard(e)){if(!n)return;a.push(...n.allOutgoing)}else{let n=tx(t,e);a.push(...n.flatMap(e=>[...e.allOutgoing]))}return r.excludeRelations(ga(a.filter(i))),r}};function yx(e,t){switch(!0){case H.isElementKindExpr(t):case H.isElementTagExpr(t):{let e=Ey(t);return t=>e(t.source)}case H.isModelRef(t)&&t.selector===`children`:{let n=B.flatten(t.ref);return Pe([...e.children(n)].map(e=>kc.isOutgoing(e.id)))}case H.isModelRef(t)&&t.selector===`descendants`:{let n=B.flatten(t.ref);return Pe([kc.isInside(n),...[...e.children(n)].map(e=>kc.isOutgoing(e.id))])}case H.isModelRef(t)&&t.selector===`expanded`:{let e=B.flatten(t.ref);return Pe([kc.isOutgoing(e),kc.isInside(e)])}case H.isModelRef(t):{let e=B.flatten(t.ref);return kc.isOutgoing(e)}default:F(t)}}const bx={include:({scope:e,model:t,stage:n,memory:r,where:i})=>{if(!e){let e=[...t.roots()].filter(i);if(e.length===0)return;let[r,a]=at(e,e=>!e.imported);return n.addExplicit(r),n.addImplicit(a),n.addConnections(ex(e)),n.connectWithExisting(e),n}let a=i(e)?e:null,o=L(ca(e.children(),i)),s=o.length>0;if(!s)if(a){if($b(a,a.siblings()).length===0){let e=a.parent;e&&i(e)&&n.addExplicit(e)}o.push(a)}else return n;a&&n.addExplicit(a);let c=ga([...r.elements,...e.descendingSiblings()]);for(let e of c)n.addConnections($b(e,o,`directed`));s&&(n.addConnections(ex(o)),n.addExplicit(o));for(let e of o)n.addConnections($b(e,c,`directed`));return n},exclude:({scope:e,memory:t,stage:n,where:r})=>r===sx?e?(n.exclude([e,...e.descendants()]),n):Iy.empty(t.scope).stageExclude(n.expression):(n.exclude(S([...t.elements],r)),n)};function xx(e,t,n){switch(!0){case H.isCustom(e):return t===`include`?xx(e.custom.expr,t,n):n.stage;case H.isWhere(e):{let r=vo(e.where.condition),i=e=>S(e,r);return xx(e.where.expr,t,{...n,where:r,filterWhere:i})}case H.isModelRef(e)&&e.selector===`expanded`:return ix[t]({...n,expr:e})??n.stage;case H.isWildcard(e):return bx[t]({...n,expr:e})??n.stage;case H.isElementKindExpr(e):case H.isElementTagExpr(e):return ax[t]({...n,expr:e})??n.stage;case H.isModelRef(e):return ox[t]({...n,expr:e})??n.stage;default:F(e)}}function Sx(e,t,n){switch(!0){case oo.isCustom(e):return t===`include`?Sx(e.customRelation.expr,t,n):n.stage;case oo.isWhere(e):{let r=vo(e.where.condition),i=e=>new Set(S([...e],r)),a=e=>T(e,b(e=>new Gc(e.source,e.target,i(e.relations))),S(e=>e.nonEmpty()));return Sx(e.where.expr,t,{...n,where:r,filterWhere:a})}case oo.isInOut(e):return _x[t]({...n,expr:e})??n.stage;case oo.isDirect(e):return px[t]({...n,expr:e})??n.stage;case oo.isOutgoing(e):return vx[t]({...n,expr:e})??n.stage;case oo.isIncoming(e):return hx[t]({...n,expr:e})??n.stage;default:F(e)}}function Cx(e,t,n){let r={model:e,scope:t.scope,where:sx,filterWhere:cx};for(let i of n){if(Mo(i)){t=Cx(e,Ly.enter(t,i),i.groupRules),P(t instanceof Ly,`processPredicates must return ActiveGroupMemory`),t=t.leave();continue}if(bo(i)){let e=`include`in i?`include`:`exclude`,n=i.include??i.exclude;for(let i of n){let n=e===`include`?t.stageInclude(i):t.stageExclude(i);switch(!0){case so.isFqnExpr(i):n=xx(i,e,{...r,stage:n,memory:t})??n;break;case so.isRelationExpr(i):n=Sx(i,e,{...r,stage:n,memory:t})??n;break;default:F(i)}t=n.commit()}}}return t}function wx(e,t,n){return t=Cx(e,t,n),Zb.for(t).commit()}function Tx(e,{docUri:t,rules:n,...r}){let i=Bb(n,e.globals),a=r.viewOf?e.asComputed.element(r.viewOf):null,o=wx(e,Iy.empty(a),i);o.isEmpty()&&a&&(o=o.update({final:new Set([a])})),o=Dx(o);let s=ux(e,o),c=lx(o.connections);my(s,c);let l=yy({nodes:s,edges:c}),u=zb(i,Oy(i,l.nodes)),d=Ze(i,Oo),f=Vo(u),p=Ex(i,u);return by({...r,_stage:`computed`,autoLayout:{direction:d?.direction??`TB`,...d?.nodeSep&&{nodeSep:d.nodeSep},...d?.rankSep&&{rankSep:d.rankSep}},edges:Yb(i,u,l.edges),nodes:b(u,e=>(e.icon===`none`&&delete e.icon,e)),...f.length>0&&{notation:{nodes:f}},...p.length>0&&{ranks:p}})}function Ex(e,t){let n=[];for(let r of e){if(!No(r)||r.targets.length===0)continue;let e=T(t,S(Pe(r.targets.map(Ey))),b(e=>e.id));C(e,1)&&n.push({type:r.rank,nodes:e})}return n}function Dx(e){if(e.groups.length===0)return e;let t=new E.default(()=>new Set),n=new Map,r=e=>{for(let r of e.ancestors()){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1},i=e=>{for(let r of e.descendants(`asc`)){let i=n.get(r);if(i)return n.set(e,i),t.get(i).add(e),!0}return!1};if(T(ia([...e.explicitFirstSeenIn.keys()]),ee(i=>{if(!r(i)){let r=N(e.explicitFirstSeenIn.get(i));n.set(i,r),t.get(r).add(i)}})),T(ia([...e.lastSeenIn.keys()]),S(e=>!n.has(e)),ee(a=>{if(r(a)||i(a))return;let o=N(e.lastSeenIn.get(a));n.set(a,o),t.get(o).add(a)})),t.size===0)return e;let a=e.groups.map(e=>{let n=t.get(e.id);return n?e.update(n):e});return e.update({groups:a})}function Ox(e,t){switch(!0){case So(e):return Tx(t,e);case wo(e):return Lb(t,e);case To(e):return qb(t,e);default:F(e)}}function kx(e,t){try{return{isSuccess:!0,view:Ox(e,t)}}catch(e){return{isSuccess:!1,error:e instanceof Error?e:Error(`Unknown error: ${e}`),view:void 0}}}function Ax(e){let t=new Qt({type:`directed`}),n=[];for(let r of Xe(e))t.addNode(r.id,{view:r}),Co(r)&&n.push(r);if(n.length===0)return e;for(let e of n){if(!t.hasNode(e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which does not exist`);continue}if((0,gy.default)(t,e.id,e.extends)){console.warn(`View "${e.id}" extends from "${e.extends}" which creates a cycle`);continue}t.addDirectedEdge(e.id,e.extends)}return(0,hy.topologicalSort)(t).reverse().reduce((e,n)=>{let r=t.getNodeAttribute(n,`view`);if(!Co(r))return e[r.id]=r,e;let i=e[r.extends];if(!i||!So(i))return e;let a=we([...i.tags??[],...r.tags??[]]),o=[...i.links??[],...r.links??[]];return e[r.id]={...i,...r,title:r.title??i.title??null,description:r.description??i.description??null,tags:a,links:Ui(o)?o:null,rules:[...i.rules,...r.rules]},e},{})}const jx=e=>te(e).length,Mx=e=>Aa(e);function Nx(e){let t=Px(e),n=(e,t)=>`${e}->${t}`,r=new E.default(e=>{let[t,n]=e.split(`->`);return{from:t,to:n,relationships:new Set}}),i=(e,t)=>r.get(n(e,t)).relationships,a=(e,t)=>{let n=t.projectId;P(n!==e.projectId,`Imported element must have a different project id`);let r=i(e.projectId,n);for(let n of t.incoming(`direct`))n.source.projectId===e.projectId&&r.add(n);let a=i(n,e.projectId);for(let n of t.outgoing(`direct`))n.target.projectId===e.projectId&&a.add(n)};for(let t of e)if(!_(t.$data.imports))for(let[e,n]of Ke(t.$data.imports))for(let r of n){let n=Qa(e,r.id);a(t,N(t.findElement(n),`Element ${r.id} from project ${e} not found in model ${t.projectId}`))}let o=Array.from(r.entries()).filter(([e,{relationships:t}])=>t.size>0).map(([e,{from:t,to:n,relationships:r}])=>{let i=[...r];P(C(i,1),`Relationships set must have at least one relationship`);let a={id:Aa(e),source:Mx(t),target:Mx(n),projectId:t,relations:b(i,x(`id`)),label:null,color:`gray`,parent:null,line:`solid`,tags:we(w(i,x(`tags`)))},o=he(i);return o&&(a.label=o.title,a.description=za(o.$relationship)??null,a.technology=o.technology,a.color=o.color,a.line=o.line,o.kind&&(a.kind=o.kind),o.$relationship.navigateTo&&(a.navigateTo=o.$relationship.navigateTo)),a});my(t,o);let s=yy({nodes:t,edges:o});return{id:`projects-view`,[Ua]:`projects`,[Ha]:`computed`,title:`Projects`,description:{txt:`Overview of all projects and their relationships`},autoLayout:{direction:`TB`},...s}}function Px(e){let t=new Map;for(let n of e){let e=Ga(n.projectId),r={id:Mx(e),kind:`@project`,parent:null,projectId:e,title:n.project.title??n.project.id,description:{txt:[`Elements: ${jx(n.$data.elements)}`,`Relationships: ${jx(n.$data.relations)}`,`Views: ${jx(n.$data.views)}`].join(`
1213
+ `)},shape:`rectangle`,children:[],inEdges:[],outEdges:[],color:`primary`,level:0,style:{},tags:[]};t.set(r.id,r)}return t}function Fx(e,t){return{...Tx(e,{id:Za(`adhoc`),_stage:`parsed`,_type:`element`,rules:t,title:null,description:null}),_type:`adhoc`,_stage:`computed`}}ir();const Ix=K.getChild(`LanguageServices`),Lx=e=>e.severity===Pn.Error;var Rx=class{builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get mcpServer(){let e=this.services.mcp.Server;return e instanceof ov?null:e}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let e=this.services.shared.workspace.ProjectsManager,t=T(this.services.shared.workspace.LangiumDocuments.groupedByProject(),Ke(),b(([t,n])=>{let r=t,{folderUri:i,config:a}=e.getProject(r);return{id:r,folder:i,title:a.title??a.name,documents:b(n,x(`uri`)),config:a}}));if(C(t,2)&&e.defaultProjectId){let n=t.findIndex(t=>t.id===e.defaultProjectId);if(n>0){let[e]=t.splice(n,1);return[e,...t]}return t}if(C(t,1))return t;let{id:n,folderUri:r,config:i}=e.default;return[{id:n,folder:r,title:i.title??i.name,documents:[],config:i}]}project(e){let{id:t,folderUri:n,config:r}=this.projectsManager.ensureProject(e),i=b(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),x(`uri`));return{id:t,folder:n,title:r.title??r.name,documents:i,config:r}}async diagrams(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(n,t)}async computedModel(e,t){let n=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(n,t)}async layoutedModel(e,t){let n=this.projectsManager.ensureProjectId(e),r=await this.builder.computeModel(n,t);if(!r)throw Error(`Failed to compute model, empty project?`);let i=await this.views.layoutAllViews(n,t);return Oc.create({...r.$data,_stage:`layouted`,views:T(i,b(x(`diagram`)),ue(x(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,n=[];for(let r of t){let t=await this.builder.computeModel(r,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Oc.EMPTY){Ix.debug(`Project ${r} is empty, skipping`);continue}n.push(t)}if(!C(n,1))throw Error(`No models found`);let r=Nx(n);return await this.views.layouter.layoutProjectsView(r)}getErrors(){return T(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),w(e=>T(e.diagnostics??[],S(Lx),b(({message:t,range:n})=>({message:t,line:n.start.line,range:n,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:F(e)}}async format(e){let t=this.services.shared.workspace.LangiumDocuments,n=this.services.lsp.Formatter,r=zx(e),i=this.collectDocumentsToFormat(t,e);i.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let a=new Map;for(let e of i){let t=e.uri.toString(),i=await n.formatDocument(e,{options:r,textDocument:{uri:t}}),o=i.length===0?e.textDocument.getText():qn.applyEdits(e.textDocument,i);a.set(t,o)}return a}collectDocumentsToFormat(e,t){let n=t?.projectIds??[],r=t?.documentUris??[],i=new Map;if(n.length>0)for(let t of n)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);else if(r.length===0)for(let t of this.projectsManager.all)for(let n of e.projectDocuments(t))i.set(n.uri.toString(),n);for(let t of r){if(i.has(t))continue;let n;try{n=e.getDocument(_n.parse(t))}catch{Ix.warn(`format: skipping unknown document ${t}`);continue}if(!Mg(n)){Ix.warn(`format: skipping unknown document ${t}`);continue}i.set(t,n)}return[...i.values()]}async dispose(){try{Ix.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(e){Ix.error(U(e))}finally{Ix.debug(`LikeC4LanguageServices disposed`)}}};function zx(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 Bx=class{constructor(e){this.services=e}async provideCodeLens(e,t,n){if(Mg(e))return e.state<on.Linked&&(K.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(on.Linked,e.uri,n),K.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=Ag.readId(e),n=e.$cstNode?.range;if(!n||!t)return[];let r=A_(e);return{range:{start:n.start,end:{line:n.start.line,character:n.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,r],title:`open preview`}}})}};ir();const Vx=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function Hx(e,t){return an(t.feature)&&t.property===`project`&&Up(e.node)}var Ux=class extends Cn{constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,n){switch(!0){case Sn(t.feature):return this.completionForKeyword(e,t.feature,n);case jn(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,n);case Hx(e,t):return this.completionForImportedProject(e,n)}}completionForKeyword(e,t,n){if(this.filterKeyword(e,t))switch(!0){case t.value===`import`:n(e,{label:t.value,kind:Kn.Snippet,insertTextFormat:nr.Snippet,insertText:`${t.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&gn(e.node,_m):n(e,{label:t.value,detail:`Insert deployment view`,kind:Kn.Class,insertTextFormat:nr.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
1214
+ `)});break;case[`title`,`description`,`technology`,`link`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} property`,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:`${t.value} '\${0}'`});break;case t.value===`color`:n(e,{label:t.value,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:`${t.value} \${1|${Mi.join(`,`)}|}$0`});break;case t.value===`opacity`:n(e,{label:t.value,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:`${t.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:`${t.value} {\n\t$0\n}`});break;case t.value===`group`:n(e,{label:t.value,detail:`Insert group block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
1215
+ `)});break;case[`par`,`parallel`].includes(t.value):n(e,{label:t.value,detail:`Insert block of parallel steps`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:[`${t.value} {`,` $0`,`}`].join(`
1216
+ `)});break;case t.value===`dynamic`&&gn(e.node,_m):n(e,{label:t.value,detail:`Insert dynamic view`,kind:Kn.Class,insertTextFormat:nr.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
1217
+ `)});break;case t.value===`style`&&e.node&&gn(e.node,Ep):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:`${t.value} \${1:name} \${2:*} {\n\t\${3|${Vx}|} $0\n}`});break;case t.value===`style`&&e.node&&gn(e.node,Pe([_m,Op])):n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:`${t.value} \${1:*} {\n\t\${2|${Vx}|} $0\n}`});break;case t.value===`style`:n(e,{label:t.value,detail:`Insert ${t.value} block`,kind:Kn.Module,insertTextFormat:nr.Snippet,insertText:`${t.value} {\n\t\${1|${Vx}|} $0\n}`});break;case t.value===`extend`:n(e,{label:t.value,detail:`Extend another view`,kind:Kn.Class,insertTextFormat:nr.Snippet,insertText:`extend $1 {
1216
1218
  $0
1217
- }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:D.Property,insertTextFormat:qn.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:D.Property,insertTextFormat:qn.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:D.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:qn.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=b(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:D.Folder,insertText:n,filterText:n,textEdit:dr.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},Hx=Vn(),Ux=class extends Xn{createDocumentHighlight(e){return Hx.DocumentHighlight.create(e.segment.range,Hx.DocumentHighlightKind.Read)}},Wx=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!p_(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:pn(e.parseResult.value).filter(gm).map(t=>{try{let n=wn(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Vr(r))return{range:n,target:r}}catch(e){q(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Vr(t)||zr(t))return t;if(Lr(t))return Pr(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Pr(n.toString(),t)}relativeLink(e,t){if(zr(t))return Rr(t);if(Lr(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return Rr(Fr(new URL(t,r).toString(),n))}return null}};Bn();const Gx=K.getChild(`DocumentSymbolProvider`);var Kx=class{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,n){if(!p_(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<Yn.Linked&&(Gx.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Yn.Linked,e.uri,n),Gx.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return q(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(C);return n.length===0?[]:[{kind:Zn.Namespace,name:`icons`,range:t.range,selectionRange:vn(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=wn(t,`name`);if(!n)return[];let r=w([...e.elements,...e.tags,...e.relationships],y(e=>{try{if(bh(e)||wh(e)||vh(e))return this.getKindSymbol(e);if(Ah(e))return this.getTagSymbol(e)}catch(e){return q(e),null}F(e)}),S(C));return r.length===0?[]:[{kind:Zn.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=wn(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>yp(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=wn(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(hp(e))return this.getExtendElementSymbol(e);if(Hf(e))return this.getElementSymbol(e)}catch(e){q(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:I_(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=wn(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=wn(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||b(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||b(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||b(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 n=e.name?wn(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(lf(e))return this.getDeploymentNodeSymbol(e);if(af(e))return this.getDeployedInstanceSymbol(e);if(dp(e))return[]}catch(e){q(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=Dn(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const qx=`
1219
+ }`});break;case t.value===`autoLayout`:n(e,{label:t.value,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case t.value===`mode`:n(e,{label:t.value,kind:Kn.Property,insertTextFormat:nr.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(t.value):n(e,{label:t.value,kind:Kn.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:nr.PlainText,insertText:`${t.value} `});break;default:n(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let n=this.services.shared.workspace.ProjectsManager,r=e.document.textDocument,i={start:r.positionAt(e.tokenOffset),end:r.positionAt(e.tokenEndOffset)},a=r.getText(i),o=_(a)?`'`:a.substring(0,1);for(let r of n.all){let n=o+r+o;t(e,{label:r,kind:Kn.Folder,insertText:n,filterText:n,textEdit:Hn.replace(i,n),detail:`Project`,sortText:`0_`+r})}}},Wx=er(),Gx=class extends Yn{createDocumentHighlight(e){return Wx.DocumentHighlight.create(e.segment.range,Wx.DocumentHighlightKind.Read)}},Kx=class{constructor(e){this.services=e}async getDocumentLinks(e,t,n){return!Mg(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:ar(e.parseResult.value).filter(rm).map(t=>{try{let n=sn(t.$cstNode,`value`)?.range,r=n&&this.resolveLink(e,t.value);if(r&&Fr(r))return{range:n,target:r}}catch(e){q(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(Fr(t)||Nr(t))return t;if(jr(t))return Or(e.uri.toString(),`../`,t);let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return Or(n.toString(),t)}relativeLink(e,t){if(Nr(t))return Mr(t);if(jr(t)){let n=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),r=new URL(e.uri.toString());return Mr(kr(new URL(t,r).toString(),n))}return null}};ir();const qx=K.getChild(`DocumentSymbolProvider`);var Jx=class{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,n){if(!Mg(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<on.Linked&&(qx.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(on.Linked,e.uri,n),qx.debug(`document is Linked`));let{parseResult:{value:{specifications:r,models:i,deployments:a,views:o,likec4lib:s}}}=e;return[...s.map(e=>()=>this.getLikec4LibSymbol(e)),...r.map(e=>()=>this.getSpecSymbol(e)),...i.map(e=>()=>this.getModelSymbol(e)),...a.map(e=>()=>this.getDeploymentModelSymbol(e)),...o.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return q(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=e.icons.map(e=>this.getLibIconSymbol(e)).filter(y);return n.length===0?[]:[{kind:zn.Namespace,name:`icons`,range:t.range,selectionRange:vr(t,`icons`)?.range??t.range,children:n}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let n=sn(t,`name`);if(!n)return[];let r=T([...e.elements,...e.tags,...e.relationships],b(e=>{try{if(sh(e)||dh(e)||ah(e))return this.getKindSymbol(e);if(_h(e))return this.getTagSymbol(e)}catch(e){return q(e),null}F(e)}),S(y));return r.length===0?[]:[{kind:zn.Namespace,name:e.name,range:t.range,selectionRange:n.range,children:r}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=sn(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>op(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let n=sn(t,`name`);return n?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e){try{if(np(e))return this.getExtendElementSymbol(e);if(kf(e))return this.getElementSymbol(e)}catch(e){q(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,n=e.element.$cstNode,r=e.body;return!t||!n?[]:[{kind:this.symbolKind(e),name:Xg(e.element),range:t.range,selectionRange:n.range,children:r.elements.flatMap(e=>this.getElementsSymbol(e))}]}getElementSymbol(e){let t=e.$cstNode,n=sn(t,`name`);if(!n||!t)return[];let r=e.name,i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,n=sn(t,`name`);return!n||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:n.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||_(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||_(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||_(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 n=e.name?sn(t,`name`):null;return n?[{kind:this.symbolKind(e),name:n.text,range:t.range,selectionRange:n.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(Yd(e))return this.getDeploymentNodeSymbol(e);if(Gd(e))return this.getDeployedInstanceSymbol(e);if(Qf(e))return[]}catch(e){q(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=this.nameProvider.getNameStrict(e),i=e.kind.$refText;return[{kind:this.symbolKind(e),name:r,range:t.range,selectionRange:n.range,detail:i,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,n=this.nameProvider.getNameNode(e);if(!n||!t)return[];let r=fn(e),i=this.parser.forDocument(r).parseDeployedInstance(e),a=this.nameProvider.getNameStrict(e),o=`instance of `+i.element.model;return[{kind:this.symbolKind(e),name:a,range:t.range,selectionRange:n.range,detail:o,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Yx=`
1218
1220
  ---
1219
- `;var Jx=class extends Ln{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(Fh(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(Kf(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(pf(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(ih(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(Hf(e))return this.getElementHover(e);if(lf(e))return this.getDeploymentNodeHover(e);if(af(e))return this.getDeployedInstanceHover(e)}catch(e){K.debug(U(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=La(n);i&&r.push(``,(i.md??i.txt).split(`
1221
+ `;var Xx=class extends In{parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(Sh(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(Nf(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if($d(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(Gm(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(kf(e))return this.getElementHover(e);if(Yd(e))return this.getDeploymentNodeHover(e);if(Gd(e))return this.getDeployedInstanceHover(e)}catch(e){K.debug(U(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let n=t.element,r=[`<sup>\`${n.id}\`</sup> `,`### ${n.title} `],i=za(n);i&&r.push(``,(i.md??i.txt).split(`
1220
1222
  `).join(`
1221
1223
  `));let a=this.services.likec4.LastSeen.model(t.projectId)?.findElement(n.id),o=a&&this.getElementModelHover(a,t.projectId);return r.push(o||`
1222
1224
  <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:r.join(`
1223
- `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(qx,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let a=e=>{let n=[e.id,t],r=fn.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},o=[...e.scopedViews()].map(a);o.length>0&&n.push(qx,`<small>Element views:</small>`,...o);let s=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:a(t)).filter(he);if(s.length>0){let e=o.length>0?`Also appears in views:`:`Appears in views:`;n.push(o.length>0?``:qx,`<small>${e}</small>`,...s,` `)}return n.length>0?n.join(`
1224
- `):void 0}getDeploymentNodeHover(e){let t=Dn(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=La(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
1225
- `)}}}getDeployedInstanceHover(e){let t=Dn(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=B.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${B.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
1226
- `)}}}},Yx=lr(),Xx=class{getCodeActions(e,t){let n=t.context.diagnostics,r=[];for(let i of n)i.code===`manual-layout-v1`&&r.push({title:`Migrate Manual Layouts`,command:Yx.Command.create(`Migrate Manual Layouts`,`likec4.migrate-manual-layouts`),edit:{changes:{[e.textDocument.uri]:[Yx.TextEdit.insert(t.range.start,``)]}},kind:`quickfix`,isPreferred:!0,diagnostics:[i]});return r.length>0?r:void 0}};Bn();const Zx=K.getChild(`SemanticTokenProvider`),Qx={...Rn},$x={...sr};function eS(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in $x)return t.push($x[i]),n;if(i in Qx)return()=>e(Qx[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const tS=`Stop Highlighting`,nS=()=>{throw tS};var rS=class extends or{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let e=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};e(ih,e=>{e.property(`name`).function()}),e(Hi(Km,Hm,hf),e=>{e.property(`kind`).function()}),e(cm,e=>{e.property(`name`).definition.function(),nS()}),e(Hi(Pm,nh),e=>{e.property(`value`).readonly.definition.interface()}),e(wg,e=>{e.cst().readonly.definition.variable(),nS()}),e(jp,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),e(Lh,e=>{e.cst().type()}),e(eh,e=>{e.cst().function()}),e(mg,e=>{C(e.node.value?.$refText)&&e.property(`value`).function()}),e(Hi(Nd,Bd),e=>{C(e.node.value)&&e.property(`value`).readonly.definition.type()}),e(Hi(vg,bg),e=>{e.property(`participant`).keyword()}),e(Jf,e=>{C(e.node.kind)&&e.property(`kind`).definition.type()}),e(Hi(Vp,zp),e=>{e.property(`id`).readonly.definition.variable()}),e(Jh,e=>{e.property(`style`).readonly.definition.variable()}),e(Hi(Fp,Np),e=>{e.property(`name`).readonly.definition.variable()}),e(Kh,e=>{e.property(`predicate`).readonly.definition.variable()}),e(np,e=>{C(e.node.tag)&&e.property(`tag`).definition.type()}),e(Hi(kp,Ph),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()}),e(Mh,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),e(gh,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),e(Ah,e=>{C(e.node.color)&&e.keyword(`color`).property()}),e(Hi(bh,wh,vh),e=>{e.property(`kind`).readonly.declaration.type()}),e(Fh,e=>{e.property(`name`).definition.type()}),e(Bm,e=>{e.property(`value`).number()}),e(Xp,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),e(gm,e=>{C(e.node.value)&&e.property(`value`).string()}),e(Hi(Zd,Kp),e=>{C(e.node.customColor)&&e.property(`customColor`).enum(),C(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(e=>Mu(e)&&!Hi(sd,ep,ch)(e)&&C(e.key),e=>e.property(`key`).property()),e(Hi(fh,qd,mm,Yd,xd,Jp,Qp,Nf),e=>{C(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(Hi(Hf,lf,af)(e))return this.highlightNameAndKind(e);if(ad(e))return this.highlightView(e);let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===tS)return`prune`;Zx.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),af(e)||this.mark(e).property(`kind`).keyword(),Hf(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){return{node:e,cst:t=>eS((n,r)=>this.highlightToken({range:N(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>eS((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>eS((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}};const iS=Hi(Hf,hp);var aS=class extends P_{projects;langiumDocuments;documentCache;workspaceCache;logger=K.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new mt.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new In(e.shared,Yn.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(Yn.IndexedContent,e=>{p_(e)&&Cu(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=Yn.IndexedContent)}get(e){return e.state<Yn.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:Sn.basename(e.uri),state:e.state,expect:Yn.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){P(Hf(e)||Iu(e));let t=f_.readId(e);if(C(t))return t;let n=Dn(e);return n.state<Yn.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:Sn.basename(n.uri)}),P(p_(n)),this.get(n),N(f_.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return gn(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return gn(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new ft.default;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return oS(t)}))}directChildrenOf(e,t){return gn(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new ft.default;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return oS(n)}))}uniqueDescedants(e,t){return gn(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new ft.default,r=new ft.default;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=oS(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...ra(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(iS));if(t.length===0)return sS.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new ft.default,a=new ft.default,o=new ft.default,s=this.services.workspace.AstNodeDescriptionProvider,c=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return f_.writeId(t,i),o.set(i,a),a};function l(e,t){let n=Ya(e.name,t),o=c(e,e.name,n);t?i.set(t,o):r.push(o);let s=S(e.body?.elements??[],iS);if(!T(s,1))return[o];let u=s.flatMap(e=>l(e,n));for(let e of u)a.set(n,e);return[o,...u]}function u(e){let t=I_(e.element),n=w(e.body?.elements??[],S(Hf),_(e=>l(e,t)));if(n.length!==0)for(let e of[t,...Zi(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(hp(n)){u(n);continue}l(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:Sn.basename(e.uri),error:t})}return new sS(r,i,a,o,n)}};function oS(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Ii(e.name,t.name))}var sS=class e{static EMPTY=new e([],new ft.default,new ft.default,new ft.default,lv.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}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 cS=Hi(Iu,dp);var lS=class extends aS{Names;logger=K.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(cS));if(t.length===0)return sS.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new ft.default,a=new ft.default,o=new ft.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,l=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return f_.writeId(t,i),o.set(i,a),a};function u(e,t){let n=s.getName(e);if(!C(n))return[];let o=Ya(n,t),c=l(e,n,o);if(t?i.set(t,c):r.push(c),af(e))return[c];let d=S(e.body?.elements??[],cS);if(!T(d,1))return[c];let f=d.flatMap(e=>u(e,o));for(let e of f)a.set(o,e);return[c,...f]}function d(e){let t=I_(e.deploymentNode),n=w(e.body?.elements??[],S(cS),_(e=>u(e,t)));if(n.length!==0)for(let e of[t,...Zi(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(dp(n)){d(n);continue}u(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:Sn.basename(e.uri),error:t})}return new sS(r,i,a,o,n)}};const uS=/^(aws|azure|gcp|tech):(.+)$/;function dS(e){if(!e)return;let t=uS.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var fS=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new ft.default(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;he(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,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,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=Ri(n),this.projectId=ge(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return K.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,te(a)&&(a=u.title||Wi(r)),u.tags&&Vi(u.tags)&&(e=e?Ce([...u.tags,...e]):u.tags);let d=z({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=dS(d.icon)),z({metadata:l&&!b(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){q(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>he(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:B.flatten(e.element)};if(`element`in e)return K.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return K.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===Wi(e.id)&&t.title?t.title:i,z({...t,...a,title:i,style:z({...t.style,...r}),id:n})}catch(e){q(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>he(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},pS=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),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 mS(e){let t=new Map;for(let n of e)if(So(n)&&n.viewOf&&v(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=Xe(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}const{getDocument:hS}=On;function gS({nodes:e,edges:t,autoLayout:n,...r}){return{...r,autoLayout:Oo(n)?{direction:n}:n,nodes:ie(e,({b:e,c:t,...n})=>({x:e[0],y:e[1],width:e[2],height:e[3],isCompound:t,...n})),edges:ie(t,({p:e,cp:t,l:n,...r})=>({...!!t&&{controlPoints:t},...!!n&&{labelBBox:n},...r,points:e}))}}function _S(e){return e.includes(`@likec4-generated`)}function vS(e){if(!_S(e))throw Error(`Not a likec4-generated comment: ${e}`);return gS(qr(Jr(e.trim().split(`
1227
- `).filter(e=>!e.includes(`**`)&&!e.includes(`@likec4-`)&&!e.includes(`*/`)).map(e=>e.replaceAll(`*`,``).trim()).join(``))))}function yS(e){let t=_n(e.$cstNode,[`BLOCK_COMMENT`]);if(!(!t||!_S(t.text)))try{return vS(t.text)}catch(n){let r=hS(e);q(n),K.warn(`Ignoring manual layout of "${e.name??`unnamed`}" at ${r.uri.fsPath}:${1+(t.range.start.line||0)}`);return}}var bS=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=Ce([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=Ce([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=Ce([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:T(r,1)?r:null,links:T(n,1)?n:null,...!b(i)&&{metadata:i}}}};function xS(e,t,n){let r=new fS(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=ie(r.specs.colors,e=>Ma(e.color)),a=new Set,o=new bS,s=new bS,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,u=e=>{e?.metadata&&ee(e.metadata).forEach(e=>a.add(e))},d=w(n,_(e=>(o.merge(e.c4ExtendElements),y(e.c4Elements,r.toModelElement))),S(C),na,Ke((e,t)=>{let n=Ui(t.id);return n&&v(e[n])?(K.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),u(e[t.id]),e)},{})),f=w(n,_(e=>y(e.c4Relations,r.toModelRelation)),S(e=>{if(!e)return!1;let t=B.flatten(e.source),n=B.flatten(e.target);return v(d[t])&&!eo(t)||v(d[n])&&!eo(n)?(K.debug`Invalid relation ${e.id}
1225
+ `)}}}getElementModelHover(e,t){let n=[],r=[...e.incoming(`direct`)].length,i=[...e.outgoing(`direct`)].length;(r>0||i>0)&&n.push(Yx,`<small>**${r}** incoming, **${i}** outgoing relationships</small> `);let a=e=>{let n=[e.id,t],r=_n.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(n))}`);return` - [${e.titleOrId}](${r})`},o=[...e.scopedViews()].map(a);o.length>0&&n.push(Yx,`<small>Element views:</small>`,...o);let s=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:a(t)).filter(st);if(s.length>0){let e=o.length>0?`Also appears in views:`:`Appears in views:`;n.push(o.length>0?``:Yx,`<small>${e}</small>`,...s,` `)}return n.length>0?n.join(`
1226
+ `):void 0}getDeploymentNodeHover(e){let t=fn(e),n=this.parser.forDocument(t).parseDeploymentNode(e),r=[n.id+` `];n.title!==e.name&&r.push(`### ${n.title}`),r.push("deployment node `"+n.kind+"` ");let i=za(n);return i&&r.push(``,i.md??i.txt),{contents:{kind:`markdown`,value:r.join(`
1227
+ `)}}}getDeployedInstanceHover(e){let t=fn(e),n=this.parser.forDocument(t).parseDeployedInstance(e),[r,i]=B.isImportRef(n.element)?[n.element.project,n.element.model]:[t.likec4ProjectId,n.element.model],a=r?this.locator.getParsedElement(i,r):this.locator.getParsedElement(i),o=[n.id+` `,`instance of \`${B.flatten(n.element)}\``];return a&&o.push(`### ${a.element.title}`,"element kind `"+a.element.kind+"` "),{contents:{kind:`markdown`,value:o.join(`
1228
+ `)}}}},Zx=sr(),Qx=class{getCodeActions(e,t){}};ir();const $x=K.getChild(`SemanticTokenProvider`),eS={...pr},tS={...Xn};function nS(e){let t=[],n=new Proxy({},{get(r,i){if(i===`modifier`)return e=>(t.push(e),n);if(i in tS)return t.push(tS[i]),n;if(i in eS)return()=>e(eS[i],t);throw Error(`Unknown semantic token type or modifier: ${i}`)}});return n}const rS=`Stop Highlighting`,iS=()=>{throw rS};var aS=class extends cr{rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let e=(e,t)=>{let n={predicate:e,highlightFn:t};this.rules.push(n)};e(Gm,e=>{e.property(`name`).function()}),e(Wi(Nm,km,tf),e=>{e.property(`kind`).function()}),e(Yp,e=>{e.property(`name`).definition.function(),iS()}),e(Wi(xm,Um),e=>{e.property(`value`).readonly.definition.interface()}),e(_g,e=>{e.cst().readonly.definition.variable(),iS()}),e(vp,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),e(wh,e=>{e.cst().type()}),e(Vm,e=>{e.cst().function()}),e(rg,e=>{y(e.node.value?.$refText)&&e.property(`value`).function()}),e(Wi(Zh,ag,dg),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),e(Wi(tg,Yh,hg,rg),e=>{y(e.node.value)&&e.property(`value`).readonly.definition.type()}),e(Wi(lg,pg,dg),e=>{e.property(`participant`).keyword()}),e(Ff,e=>{y(e.node.kind)&&e.property(`kind`).definition.type()}),e(Wi(Op,Ep),e=>{e.property(`id`).readonly.definition.variable()}),e(Fh,e=>{e.property(`style`).readonly.definition.variable()}),e(Wi(Sp,bp),e=>{e.property(`name`).readonly.definition.variable()}),e(Nh,e=>{e.property(`predicate`).readonly.definition.variable()}),e(Uf,e=>{y(e.node.tag)&&e.property(`tag`).definition.type()}),e(Wi(gp,xh),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()}),e(yh,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),e(rh,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),e(_h,e=>{y(e.node.color)&&e.keyword(`color`).property()}),e(Wi(sh,dh,ah),e=>{e.property(`kind`).readonly.declaration.type()}),e(Sh,e=>{e.property(`name`).definition.type()}),e(Dm,e=>{e.property(`value`).number()}),e(Lp,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),e(rm,e=>{y(e.node.value)&&e.property(`value`).string()}),e(Wi(Rd,Np),e=>{y(e.node.customColor)&&e.property(`customColor`).enum(),y(e.node.themeColor)&&e.property(`themeColor`).enum()}),e(e=>_u(e)&&!Wi(Ku,Vf,Ym)(e)&&y(e.key),e=>e.property(`key`).property()),e(Wi($m,Pd,tm,Id,od,Fp,zp,bf),e=>{y(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(Wi(kf,Yd,Gd)(e))return this.highlightNameAndKind(e);if(Wu(e))return this.highlightView(e);let n;for(let{predicate:t,highlightFn:r}of this.rules)if(t(e))try{n??=this.mark(e),r(n)}catch(t){if(t===rS)return`prune`;$x.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),Gd(e)||this.mark(e).property(`kind`).keyword(),kf(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){return{node:e,cst:t=>nS((n,r)=>this.highlightToken({range:N(t??e.$cstNode,`AST node has no CST node`).range,type:n,modifier:r})),keyword:t=>nS((n,r)=>this.highlightKeyword({node:e,keyword:t,type:n,modifier:r})),property:(t,n)=>nS((r,i)=>this.highlightProperty({node:e,property:t,type:r,modifier:i,...n===void 0?{}:{index:n}}))}}};const oS=Wi(kf,np);var sS=class extends hu{projects;langiumDocuments;documentCache;workspaceCache;logger=K.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new ht.default(e=>this.createDocumentIndex(e)),this.workspaceCache=new gr(e.shared,on.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(on.IndexedContent,e=>{Ng(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=on.IndexedContent)}get(e){return e.state<on.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:mn.basename(e.uri),state:e.state,expect:on.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){P(kf(e)||xu(e));let t=jg.readId(e);if(y(t))return t;let n=fn(e);return n.state<on.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:mn.basename(n.uri)}),P(Mg(n)),this.get(n),N(jg.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return kn(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return kn(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new pt.default;for(let n of this.documents(e))for(let e of this.get(n).rootElements())t.set(e.name,e);return cS(t)}))}directChildrenOf(e,t){return kn(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let n=new pt.default;for(let r of this.documents(e))for(let e of this.get(r).children(t))n.set(e.name,e);return cS(n)}))}uniqueDescedants(e,t){return kn(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let n=new pt.default,r=new pt.default;for(let i of this.documents(e)){let e=this.get(i);for(let r of e.children(t))n.set(r.name,r);for(let n of e.descendants(t))r.set(n.name,n)}let i=cS(n),a=[...r.associations()].flatMap(([e,t])=>t.length===1&&!n.has(e)?t:[]);return[...i,...aa(a)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(oS));if(t.length===0)return lS.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new pt.default,a=new pt.default,o=new pt.default,s=this.services.workspace.AstNodeDescriptionProvider,c=(t,r,i)=>{let a=Object.assign(s.createDescription(t,r,e),{id:i,likec4ProjectId:n});return jg.writeId(t,i),o.set(i,a),a};function l(e,t){let n=Ja(e.name,t),o=c(e,e.name,n);t?i.set(t,o):r.push(o);let s=S(e.body?.elements??[],oS);if(!C(s,1))return[o];let u=w(s,e=>l(e,n));for(let e of u)a.set(n,e);return[o,...u]}function u(e){let t=Xg(e.element),n=T(e.body?.elements??[],S(kf),w(e=>l(e,t)));if(n.length!==0)for(let e of[t,...$i(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(np(n)){u(n);continue}l(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:mn.basename(e.uri),error:t})}return new lS(r,i,a,o,n)}};function cS(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>Ri(e.name,t.name))}var lS=class e{static EMPTY=new e([],new pt.default,new pt.default,new pt.default,w_.DefaultProjectId);constructor(e,t,n,r,i){this._rootElements=e,this._children=t,this._descendants=n,this._byfqn=r,this.projectId=i}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 uS=Wi(xu,Qf);var dS=class extends sS{Names;logger=K.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(uS));if(t.length===0)return lS.EMPTY;let n=e.likec4ProjectId??this.projects.ownerProjectId(e),r=[],i=new pt.default,a=new pt.default,o=new pt.default,s=this.Names,c=this.services.workspace.AstNodeDescriptionProvider,l=(t,r,i)=>{let a={...c.createDescription(t,r,e),id:i,likec4ProjectId:n};return jg.writeId(t,i),o.set(i,a),a};function u(e,t){let n=s.getName(e);if(!y(n))return[];let o=Ja(n,t),c=l(e,n,o);if(t?i.set(t,c):r.push(c),Gd(e))return[c];let d=S(e.body?.elements??[],uS);if(!C(d,1))return[c];let f=w(d,e=>u(e,o));for(let e of f)a.set(o,e);return[c,...f]}function d(e){let t=Xg(e.deploymentNode),n=T(e.body?.elements??[],S(uS),w(e=>u(e,t)));if(n.length!==0)for(let e of[t,...$i(t)])for(let t of n)a.set(e,t)}for(let n of t)try{if(Qf(n)){d(n);continue}u(n,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:n.$type,doc:mn.basename(e.uri),error:t})}return new lS(r,i,a,o,n)}};const fS=/^(aws|azure|gcp|tech):(.+)$/;function pS(e){if(!e)return;let t=fS.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var mS=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new pt.default(Set);projectId;inferTechFromIcon;constructor(e,t){let n={},r=[];for(let t of e){let{c4Specification:e,c4Globals:i,c4Imports:a}=t,o=t.likec4ProjectId;st(o)&&(r.length===0||r[0]!==o)&&r.push(t.likec4ProjectId),Object.assign(n,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,i.predicates),Object.assign(this.globals.dynamicPredicates,i.dynamicPredicates),Object.assign(this.globals.styles,i.styles);for(let[e,t]of a)this.imports.set(e,t)}this.tags=Bi(n),this.projectId=he(r),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:n,id:r,kind:i,title:a,description:o,technology:s,summary:c,metadata:l})=>{try{let u=this.specs.elements[i];if(!u)return K.warn`No kind '${i}' found for ${r}`,null;s??=u.technology,o??=u.description,c??=u.summary,t??=u.links,ve(a)&&(a=u.title||Ki(r)),u.tags&&Ui(u.tags)&&(e=e?we([...u.tags,...e]):u.tags);let d=z({...u.style,...n});return!s&&this.inferTechFromIcon&&(s=pS(d.icon)),z({metadata:l&&!_(l)?l:void 0,notation:u.notation,style:d,links:t,tags:e,summary:c,technology:s,description:o,title:a,kind:i,id:r})}catch(e){q(e)}return null};toModelRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>st(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:B.flatten(e.element)};if(`element`in e)return K.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return K.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:n,style:r,title:i,...a}=e;return i=i===Ki(e.id)&&t.title?t.title:i,z({...t,...a,title:i,style:z({...t.style,...r}),id:n})}catch(e){q(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:n,kind:r,links:i,id:a,...o})=>st(r)&&this.specs.relationships[r]?{...this.specs.relationships[r],...o,...i&&{links:i},source:t,target:n,kind:r,id:a}:{...i&&{links:i},...o,source:t,target:n,id:a}},hS=class{#e=new Map;#t=new Map;#n=new Map;constructor(e){e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,n=e.$styles,r=this.#t.get(t);return(!r||!r.equals(n))&&this.#t.set(t,n),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 gS(e){let t=new Map;for(let n of e)if(So(n)&&n.viewOf&&v(n.extends)){let e=t.get(n.viewOf)??[];e.push(n.id),t.set(n.viewOf,e)}for(let{id:n,nodes:r}of e)for(let e of r){let r=e.modelRef;if(e.navigateTo||!r)continue;let i=Ie(t.get(r)??[],e=>e!==n);i&&(e.navigateTo=i)}return e}var _S=class{mergedData=new Map;mergeMetadata(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];if(t===void 0){n[e]=r;continue}let i=Array.isArray(t)?t:[t],a=Array.isArray(r)?r:[r],o=we([...i,...a]);n[e]=o.length===1?o[0]:o}return n}merge(e){for(let t of e){let{id:e,links:n,tags:r,metadata:i}=t,a=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};n&&a.links.push(...n),r&&(a.tags=we([...a.tags,...r])),i&&(a.metadata=this.mergeMetadata(a.metadata,i)),this.mergedData.set(e,a)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let n=t.links;e.links&&e.links.length>0&&(n=[...e.links,...n]);let r=t.tags;e.tags&&e.tags.length>0&&(r=we([...e.tags,...r]));let i=t.metadata;return e.metadata&&(i=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:C(r,1)?r:null,links:C(n,1)?n:null,...!_(i)&&{metadata:i}}}};function vS(e,t,n){let r=new mS(n,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});r.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(r);let i=ae(r.specs.colors,e=>Pa(e.color)),a=new Set,o=new _S,s=new _S,c=n.flatMap(e=>e.c4ExtendRelations),l=new Set,u=e=>{e?.metadata&&te(e.metadata).forEach(e=>a.add(e))},d=T(n,w(e=>(o.merge(e.c4ExtendElements),b(e.c4Elements,r.toModelElement))),S(y),ia,qe((e,t)=>{let n=Gi(t.id);return n&&v(e[n])?(K.debug`No parent found for ${t.id}`,e):(e[t.id]=o.applyExtended(t),u(e[t.id]),e)},{})),f=T(n,w(e=>b(e.c4Relations,r.toModelRelation)),S(e=>{if(!e)return!1;let t=B.flatten(e.source),n=B.flatten(e.target);return v(d[t])&&!$a(t)||v(d[n])&&!$a(n)?(K.debug`Invalid relation ${e.id}
1228
1229
  source: ${t} resolved: ${!!d[t]}
1229
- target: ${n} resolved: ${!!d[n]}\n`,!1):!0}),y(e=>{let t=H_(`extend-relation`,B.flatten(e.source),B.flatten(e.target),e.kind??`default`,e.title??``),n=c.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>l.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=Ce([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=Ce(r),s=i;return{...e,...T(o,1)&&{tags:o},...T(s,1)&&{links:s},...!b(a)&&{metadata:a}}}),me(u),oe(x(`id`))),p=w(n,_(e=>(s.merge(e.c4ExtendDeployments),y(e.c4Deployments,r.toDeploymentElement))),S(C),na,Ke((e,t)=>{let n=Ui(t.id);return n&&v(e[n])?(K.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=lo(t)?s.applyExtended(t):t,u(e[t.id]),e)},{})),m=w(n,_(e=>y(e.c4DeploymentRelations,r.toDeploymentRelation)),S(e=>e?v(p[e.source.deployment])||v(p[e.target.deployment])?(K.debug`Invalid deployment relation ${e.id}
1230
+ target: ${n} resolved: ${!!d[n]}\n`,!1):!0}),b(e=>{let t=j_(`extend-relation`,B.flatten(e.source),B.flatten(e.target),e.kind??`default`,e.title??``),n=c.filter(e=>e.id===t);if(n.length===0)return e;n.forEach(e=>l.add(e.astPath));let r=e.tags?[...e.tags]:[],i=e.links?[...e.links]:[],a=e.metadata?{...e.metadata}:{};for(let e of n){if(e.tags&&r.push(...e.tags),e.links)for(let t of e.links)i.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||i.push(t);if(e.metadata)for(let[t,n]of Object.entries(e.metadata)){let e=a[t];if(e===void 0)a[t]=n;else{let r=Array.isArray(e)?e:[e],i=Array.isArray(n)?n:[n],o=we([...r,...i]);a[t]=o.length===1?o[0]:o}}}let o=we(r),s=i;return{...e,...C(o,1)&&{tags:o},...C(s,1)&&{links:s},...!_(a)&&{metadata:a}}}),ee(u),ue(x(`id`))),p=T(n,w(e=>(s.merge(e.c4ExtendDeployments),b(e.c4Deployments,r.toDeploymentElement))),S(y),ia,qe((e,t)=>{let n=Gi(t.id);return n&&v(e[n])?(K.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=co(t)?s.applyExtended(t):t,u(e[t.id]),e)},{})),m=T(n,w(e=>b(e.c4DeploymentRelations,r.toDeploymentRelation)),S(e=>e?v(p[e.source.deployment])||v(p[e.target.deployment])?(K.debug`Invalid deployment relation ${e.id}
1230
1231
  source: ${e.source.deployment} resolved: ${!!p[e.source.deployment]}
1231
- target: ${e.target.deployment} resolved: ${!!p[e.target.deployment]}\n`,!1):!0:!1),Ke((e,t)=>se(e[t.id])?(K.debug`Duplicate deployment relation ${t.id}`,e):(u(t),e[t.id]=t,e),{}));function h(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e[Wa]===`element`&&v(i)&&`viewOf`in e&&(i=d[e.viewOf]?.title??null),v(i)&&r===`index`&&(i=`Landscape view`),{...rt(s,e=>e===void 0),[Ua]:`parsed`,sourcePath:Sn.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let g=n.flatMap(e=>y(e.c4Views,h(e)));if(g.some(e=>e.id===`index`)||g.unshift({[Ua]:`parsed`,[Wa]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews!==!1){let e=new Set;for(let t of g)t[Wa]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(g.map(e=>e.id));for(let n of ee(d)){if(e.has(n)||eo(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),g.push({[Ua]:`parsed`,[Wa]:`element`,id:r,viewOf:n,title:`Auto / ${(d[n]?.title??n).replaceAll(`
1232
- `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let te=w(g,oe(x(`id`)));g.some(Co)&&(te=kx(te));for(let e of c)l.has(e.astPath)||K.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[Ua]:`parsed`,projectId:t.id,project:z({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:r.tags,elements:r.specs.elements,relationships:ie(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...a.size>0&&{metadataKeys:[...a].sort(Ii)},customColors:i},elements:d,relations:f,globals:r.globals,views:te,deployments:{elements:p,relations:m},imports:{}},imports:r.imports}}const SS=e=>`parsed-without-imports-${e}`,CS=e=>`parsed-model-${e}`,wS=e=>`computed-model-${e}`,TS=K.getChild(`builder`);var ES=class extends P_{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.cache=e.shared.workspace.Cache,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.onDispose(this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}));let t=nt(le(),S(e=>Cu(e)&&!this.projects.isExcluded(e)),y(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(Yn.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),TS.debug`created`}unsafeSyncParseModelData(e){let t=this.cache,n=SS(e);return t.get(n,()=>{let t=TS.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,xS(this.services,n,r))}catch(t){return TS.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){let t=TS.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);T(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=TS.getChild(e),r=this.cache,i=G_();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await sn(t);let a=CS(e);return r.has(a)&&n.debug`parseModel from cache`,r.get(a,()=>{let t=this.unsafeSyncJoinedModelData(e);return t?(n.debug`parseModel in ${i.pretty}`,Lc.create(t)):(n.debug`parseModel: returning EMPTY`,Lc.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(e,t){let n=this.cache,r=wS(e)+(t?.hash??``);return n.get(r,()=>{let n=TS.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,Lc.EMPTY.asComputed;let i=Lc.create(r),a=[];for(let e of Ye(r.views)){let r=Ox(e,i);if(!r.isSuccess){n.warn(U(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}mS(a);let o=re(a,t=>{let n=DS(e,t.id),r=this.previousViews[n],i=r&&Vt(t,r)?r:t;return this.previousViews[n]=i,[t.id,i]}),s={...r,manualLayouts:{...t?.views},[Ua]:`computed`,views:o};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(Lc.create(s))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=TS.getChild(e),r=G_();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await sn(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===Lc.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),Gn.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){TS.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){for(let t of this.listeners)try{t(e)}catch(e){TS.warn(U(e))}}};function DS(e,t){return`computed-view-${e}-${t}`}const{findNodeForKeyword:OS,findNodeForProperty:kS}=cn,{getDocument:AS,streamAllContents:jS}=On,MS=K.getChild(`locator`);var NS=class{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,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=de(t)?this.projects.ensureProjectId():V_(t)),de(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=AS(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return MS.debug(U(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=to(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!Km(r)&&!hf(r))continue;let i=r.kind?kS(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?kS(r.$cstNode,`dotKind`):void 0,i??=OS(r.$cstNode,`->`),i??=kS(r.$cstNode,`title`),i??=kS(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(ad(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?kS(r.$cstNode,`name`):void 0;return i??=OS(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<Yn.Linked&&(MS.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(Yn.Linked,n.uri,t));let r=V_(n);MS.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??Bo.DEFAULT;if(!e)return MS.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=w(jS(n.parseResult.value),oa(e=>Fh(e)||Lh(e)),L(),_(n=>{let r,i;try{Fh(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return P(a,`Tag ${r} not found in merged specification`),P(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:Fh(n)}}catch(e){return MS.warn(`Fail on tag ${r}`,{err:e}),[]}}));return MS.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return MS.warn(U(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!kf(n)||!n.body)return MS.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!Wu(i))return MS.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?kS(i.$cstNode,`kind`):void 0;return a??=i.dotKind?kS(i.$cstNode,`dotKind`):void 0,a??=OS(i.$cstNode,`->`),a??=OS(i.$cstNode,`<-`),a??=kS(i.$cstNode,`title`),a??=kS(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const PS=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function Z(e){return async function(t,n,r){try{let i=e(t,n,r);pe(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),K.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:FS}=On,IS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;PS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=V_(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},LS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;PS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=V_(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},RS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=FS(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){K.warn(U(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(B.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(B.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(B.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(B.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Ki(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},zS=e=>Z((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!lf(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),BS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=F_(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=F_(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(I(i,o)||I(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},VS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=e.source;Og(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=F_(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},HS=e=>Z((e,t)=>{if(b(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}kn(e,jf)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:US}=On,WS=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return Z((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}PS.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=US(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(V_(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},GS=e=>Z((e,t)=>{B_(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:KS}=On,qS=e=>{let t=e.shared.workspace.ProjectsManager;return Z((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=V_(KS(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},JS=e=>Z((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),YS=e=>(e,t)=>{let n=e.$container;n.props.some(t=>Xp(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),ep(n)&&Wf(n.$container)&&n.$container.props.some(e=>Xp(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`})},XS=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||de(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=ae(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==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((!ae(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!ae(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!ae(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),ae(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),de(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}F(e)},ZS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(Dn(e)),i=U_(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=U_(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}B.isImportRef(i)&&(B.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),Ki(B.flatten(i),B.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},QS=e=>Z((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),$S=e=>{let t=e.likec4.ModelParser,n=new In(e.shared,Yn.Linked),r=({source:e,target:t,kind:n,title:r})=>H_(`extend-relation`,B.flatten(e),B.flatten(t),n??`default`,r??``);function i(t){return n.get(t,()=>new Set(w(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),_(e=>e.c4Relations??[]),y(e=>r(e)))))}return Z((e,n)=>{let a=Dn(e),o=t.forDocument(a),s=U_(()=>o.parseFqnRef(e.source));if(!s){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=U_(()=>o.parseFqnRef(e.target));if(!c){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!B.isModelRef(s)&&!B.isImportRef(s)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!B.isModelRef(c)&&!B.isImportRef(c)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let l=V_(a),u=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:d=``}=o.parseBaseProps({},{title:e.title}),f=r({source:s,target:c,kind:u,title:d});i(l).has(f)||n(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},eC=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),tC=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),nC=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),rC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{PS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=V_(e),i=t.projectElements(r,Gf).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==Dn(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},iC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{PS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=V_(e),i=t.projectElements(r,ff).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==Dn(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},aC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=e.name,i=V_(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==Dn(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},oC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{PS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=V_(e);t.projectElements(r,rh).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},sC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=V_(e),i=t.projectElements(r,Pp),a=t.projectElements(r,Mp);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},cC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=V_(e);t.projectElements(r,Hp).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},lC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=_n(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&_S(r.text)&&n(`warning`,`Migrate to the new manual layout snapshots (run LikeC4: Migrate manual layouts)`,{node:e,range:r.range,code:`manual-layout-v1`}),!e.name)return;PS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=V_(e);t.projectElements(i,id).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function uC(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const dC=e=>Z((e,t)=>{let n=uC(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(jp),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!fC(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function fC(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:fC(e.parent,t.parent)}const pC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=C_(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(Dn(r)),o=V.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case V.isWildcard(o)&&i:case V.isElementKindExpr(o)&&i:case V.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case V.isWildcard(o):case V.isModelRef(o):case V.isDeploymentRef(o):return;case V.isElementKindExpr(o):case V.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:F(o)}})},mC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(Dn(e)).parseFqnRefExpr(e),i=C_(e),a=O_(e)&&!kn(e,e=>Tf(e)||ng(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!kn(e,fd)){if(V.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(V.isDeploymentRef(r)&&B.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}C(e.selector)&&!lf(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case V.isElementKindExpr(r):case V.isElementTagExpr(r):case V.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},hC=e=>Z((e,t)=>{e.to.$type===`WildcardExpression`&&!om(e.$container)&&v(mn(e,ip)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),gC=e=>Z((e,t)=>{if(C_(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=mn(e,ip);n&&v(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),_C=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=mn(e,Cf);if(!r||r.isInclude!==!0)return;let i=Dn(e),a=t.forDocument(i),o=ao.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(ao.isDirect(o)){(V.isModelRef(o.source)||V.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=ao.isIncoming(o)?o.incoming:ao.isOutgoing(o)?o.outgoing:o.inout,V.isModelRef(c)){n(`error`,s,{node:e});return}})},vC=e=>Z((e,t)=>{let n=C_(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var yC=class extends ur{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};Bn();const bC=Hi(nm,em,Lp,Fp,Np,zp,Vp,Dp,Qm,Qu,fd,zf,Eg,Og,zu,Cf,Ju,fd,jp,Dd,Td,zh,kd,Hu,ad,jd,af,lf,hf,yd,Nf,wm,sd,Km,Jm,Ku,Cd,Pm,Hf,Wf,ep,Xf,hp,_p,dp,pp,yp,xp,bh,wh,vh,Ah,gh,Oh,lp,Pu),xC=e=>{let t=e;for(;t&&!um(t);){if(bC(t))return t;t=t.$container}};function SC(e){let t=e.state>=Yn.Validated?e.diagnostics?.filter(e=>e.severity===ar.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(v(e)||n.has(e))continue;n.add(e);let t=xC(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function CC(e){K.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:LS(e),DeploymentNodeKind:iC(e),DeploymentNode:IS(e),DeploymentRelation:RS(e),ExtendDeployment:zS(e),ExtendRelation:$S(e),FqnRefExpr:mC(e),RelationExpr:_C(e),OpacityProperty:JS(e),IconProperty:YS(e),SpecificationRule:eC(e),Model:tC(e),Globals:nC(e),GlobalPredicateGroup:sC(e),GlobalDynamicPredicateGroup:sC(e),GlobalStyleId:cC(e),DynamicStepSingle:BS(e),DynamicStepChain:VS(e),LikeC4View:lC(e),Element:WS(e),ElementRef:GS(e),ElementKind:rC(e),Relation:ZS(e),RelationBody:QS(e),Tag:aC(e),FqnExprWith:pC(e),RelationExprWith:vC(e),RelationshipKind:oC(e),IncomingRelationExpr:hC(e),OutgoingRelationExpr:gC(e),ImportsFromPoject:qS(e),ColorLiteral:XS(e),DynamicViewDisplayVariantProperty:HS(e),ViewRuleRank:dC(e)});let t=e.shared.lsp.Connection;t&&ya(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)K.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>K.error(U(e)))})})}const wC=K.getChild(`parser`);function TC(e){if(e==null)return;let t=EC(e);return de(t)?t.split(`
1232
+ target: ${e.target.deployment} resolved: ${!!p[e.target.deployment]}\n`,!1):!0:!1),qe((e,t)=>_e(e[t.id])?(K.debug`Duplicate deployment relation ${t.id}`,e):(u(t),e[t.id]=t,e),{}));function h(e){let n=e.uri.toString();return e=>{let{id:r,title:i,description:a,astPath:o,...s}=e;return e[Ua]===`element`&&v(i)&&`viewOf`in e&&(i=d[e.viewOf]?.title??null),v(i)&&r===`index`&&(i=`Landscape view`),{...it(s,e=>e===void 0),[Ha]:`parsed`,sourcePath:mn.relative(t.folderUri,n),docUri:n,description:a,title:i,id:r}}}let g=n.flatMap(e=>b(e.c4Views,h(e)));if(g.some(e=>e.id===`index`)||g.unshift({[Ha]:`parsed`,[Ua]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of g)t[Ua]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(g.map(e=>e.id));for(let n of te(d)){if(e.has(n)||$a(n))continue;let r=`__`+n.replaceAll(`.`,`_`);t.has(r)||(t.add(r),g.push({[Ha]:`parsed`,[Ua]:`element`,id:r,viewOf:n,title:`Auto / ${(d[n]?.title??n).replaceAll(`
1233
+ `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let ne=T(g,ue(x(`id`)));g.some(Co)&&(ne=Ax(ne));for(let e of c)l.has(e.astPath)||K.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);return{data:{[Ha]:`parsed`,projectId:t.id,project:z({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:r.tags,elements:r.specs.elements,relationships:ae(r.specs.relationships,({notation:e,technology:t,...n})=>({...e&&{notation:e},...t&&{technology:t},style:n})),deployments:r.specs.deployments,...a.size>0&&{metadataKeys:[...a].sort(Ri)},customColors:i},elements:d,relations:f,globals:r.globals,views:ne,deployments:{elements:p,relations:m},imports:{}},imports:r.imports}}const yS=K.getChild(`builder`);var bS=class extends hu{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 xS(e),this.onDispose(this.cache,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=rt(Ye(),S(e=>mu(e)&&!this.projects.isExcluded(e)),b(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(on.Validated,(e,n)=>{let r=t(e);r.length>0&&this.notifyListeners(r)})),yS.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=yS.getChild(e);try{let n=this.projects.getProject(e),r=this.documents(e);return r.length===0?(t.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(t.debug`unsafeSyncParseModelData: completed`,vS(this.services,n,r))}catch(t){return yS.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=yS.getChild(e),n=this.unsafeSyncParseModelData(e);if(!n)return null;if(n.imports.size===0)return n.data;t.debug`processing imports of ${e}`;let r=[...n.imports.associations()].reduce((e,[t,n])=>{if(n.size===0)return e;let r=this.unsafeSyncParseModelData(t);if(r){let i=[...n].flatMap(e=>r.data.elements[e]??[]);C(i,1)&&(e[t]=structuredClone(i))}return e},{});return{...n.data,imports:r}})}async parseModel(e,t){e=this.projects.ensureProjectId(e);let n=P_();return await this.mutex.read(async()=>(t?.isCancellationRequested&&await vn(t),this.cache.parsedModel(e,()=>{let t=yS.getChild(e),r=this.unsafeSyncJoinedModelData(e);return r?(t.debug`parseModel in ${n.pretty}`,Oc.create(r)):(t.debug`parseModel: returning EMPTY`,Oc.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let n=yS.getChild(e),r=this.unsafeSyncJoinedModelData(e);if(!r)return n.debug`unsafeSyncComputeModel: returning EMPTY`,Oc.EMPTY.asComputed;let i=Oc.create(r),a=[];for(let e of Xe(r.views)){let r=kx(e,i);if(!r.isSuccess){n.warn(U(r.error));continue}t?.views[e.id]&&Object.assign(r.view,{hasManualLayout:!0}),a.push(r.view)}gS(a);let o={...r,manualLayouts:{...t?.views},[Ha]:`computed`,views:ue(a,x(`id`))};return n.debug(`unsafeSyncComputeModel${t?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(Oc.create(o))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let n=yS.getChild(e),r=P_();return await this.mutex.read(async()=>{t?.isCancellationRequested&&await vn(t);let i=this.projects.getProject(e),a=await this.manualLayouts.read(i),o=this.unsafeSyncComputeModel(e,a);return o===Oc.EMPTY?n.debug(`computeModel returned EMPTY`):r.ms>10&&n.debug(`computeModel completed in ${r.pretty}`),o})}onModelParsed(e){return this.listeners.push(e),Wn.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){yS.debug(`clearCache`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){let t;t=se(e)?T(e,be(e=>this.projects.ownerProjectId(e)),Ke()):[[e,[]]];for(let e of this.listeners)try{for(let[n,r]of t)e(n,r)}catch(e){yS.warn(U(e))}}},xS=class extends _r{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(on.Validated,t=>{let n=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(n)})),this.toDispose.push(e.shared.workspace.DocumentBuilder.onUpdate((t,n)=>{if(n.length>0){let t=e.shared.workspace.ProjectsManager,r=we(b(n,t.ownerProjectId.bind(t)));for(let e of r)this.clear(e)}}))}parsedData(e,t){return super.get(e,`parsed-data`,t)}parsedJoinedData(e,t){return super.get(e,`parsed-joined-data`,t)}parsedModel(e,t){return super.get(e,`parsed-model`,t)}computedModel(e,t,n){return super.get(e,`computed-model-${t?.hash??``}`,n)}};const{findNodeForKeyword:SS,findNodeForProperty:CS}=pn,{getDocument:wS,streamAllContents:TS}=En,ES=K.getChild(`locator`);var DS=class{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,n;if(e.length===2?(t=e[0],n=e[1]):(t=e[0],n=de(t)?this.projects.ensureProjectId():A_(t)),de(t)){let e=t,r=this.fqnIndex.byFqn(n,e).head();if(!r)return null;let i=this.langiumDocuments.getDocument(r.documentUri),a=this.findParsedElementByFqnIn(e,i);return a&&i?{projectId:n,element:a,document:i}:null}let r=this.fqnIndex.getFqn(t),i=wS(t),a=this.findParsedElementByFqnIn(r,i);return a&&i?{projectId:n,element:a,document:i}:null}catch(e){return ES.debug(U(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[n,r]=eo(e);n??=this.projects.ensureProjectId(t);let i=this.fqnIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateDeploymentElement(e,t){let n=this.projects.ensureProjectId(t),r=e,i=this.deploymentsIndex.byFqn(n,r).head(),a=i?.nameSegment??i?.selectionSegment;return!i||!a?null:{uri:i.documentUri.toString(),range:a.range}}locateRelation(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(!Nm(r)&&!tf(r))continue;let i=r.kind?CS(r.$cstNode,`kind`):void 0;if(i??=r.dotKind?CS(r.$cstNode,`dotKind`):void 0,i??=SS(r.$cstNode,`->`),i??=CS(r.$cstNode,`title`),i??=CS(r.$cstNode,`target`),i??=r.$cstNode,i)return{uri:t.uri.toString(),range:{start:i.range.start,end:i.range.start}}}return null}locateViewAst(e,t){let n=this.projects.ensureProjectId(t);for(let t of this.documents(n)){let n=t.c4Views.find(t=>t.id===e);if(!n)continue;let r=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,n.astPath);if(Wu(r))return{doc:t,view:n,viewAst:r}}return null}locateView(e,t){let n=this.locateViewAst(e,t);if(!n)return null;let r=n.viewAst,i=r.name?CS(r.$cstNode,`name`):void 0;return i??=SS(r.$cstNode,`view`),i??=r.$cstNode,i?{uri:n.doc.uri.toString(),range:{start:i.range.start,end:i.range.start}}:null}async locateDocumentTags(e,t){let n=this.langiumDocuments.getDocument(e);if(!n||!n.likec4ProjectId)return null;n.state<on.Linked&&(ES.debug(`Waiting for document ${n.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(on.Linked,n.uri,t));let r=A_(n);ES.trace`locate document tags for ${n.uri.fsPath} in project ${r}`;try{let e=this.services.likec4.LastSeen.specification(r)?.tags,t=this.services.likec4.LastSeen.styles(r)??zo.DEFAULT;if(!e)return ES.trace(`No specification or styles found for project ${r}, cannot locate tags for document ${n.uri.fsPath}`),null;let i=T(TS(n.parseResult.value),ca(e=>Sh(e)||wh(e)),L(),w(n=>{let r,i;try{Sh(n)?(r=n.name,i=n.$cstNode):(r=n.tag.$refText,i=n.tag.$refNode);let a=e[r];return P(a,`Tag ${r} not found in merged specification`),P(i,`Tag ${r} does not have a $cstNode`),{name:r,color:t.tagColor(a.color).fill,range:i.range,isSpecification:Sh(n)}}catch(e){return ES.warn(`Fail on tag ${r}`,{err:e}),[]}}));return ES.debug(`Found ${i.length} tags in document ${n.uri.path}`),i}catch(e){return ES.warn(U(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:n}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!n)return null;if(!gf(n)||!n.body)return ES.warn(`View ${e.view} is not a dynamic view`),null;let r=this.services.workspace.AstNodeLocator.getAstNodePath(n.body)+e.astPath,i=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r);if(!i||!ku(i))return ES.warn(`Failed to locate dynamic view step ${r} in view ${e.view}`),null;let a=i.kind?CS(i.$cstNode,`kind`):void 0;return a??=i.dotKind?CS(i.$cstNode,`dotKind`):void 0,a??=SS(i.$cstNode,`->`),a??=SS(i.$cstNode,`<-`),a??=CS(i.$cstNode,`title`),a??=CS(i.$cstNode,`target`),a??=i.$cstNode,a?{uri:t.uri.toString(),range:{start:a.range.start,end:a.range.start}}:null}};const OS=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function Z(e){return async function(t,n,r){try{let i=e(t,n,r);oe(i)&&await i;return}catch(e){let r=e instanceof Error?e.message:String(e);n(`error`,`Validation failed: ${r}`,{node:t}),K.debug(`Validation failed: ${r}`,{error:e})}}}const{getDocument:kS}=En,AS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`DeploymentNode must be named`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;OS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=A_(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate node name "${s}"`,{node:e,range:a})})},jS=e=>{let t=e.likec4.DeploymentsIndex,n=e.references.NameProvider;return Z((e,r)=>{let i=n.getName(e);if(!i){r(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let a=N(n.getNameNode(e),`name CstNode not found`).range;OS.includes(i)&&r(`error`,`Reserved word: ${i}`,{node:e,range:a});let o=A_(e),s=t.getFqn(e);t.byFqn(o,s).limit(2).toArray().length>1&&r(`error`,`Duplicate instance name "${s}"`,{node:e,range:a})})},MS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{if(!e.target?.value?.ref){n(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let r=kS(e),i=t.forDocument(r),a;try{a=i._resolveDeploymentRelationSource(e)}catch(t){K.warn(U(t)),n(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(B.isImportRef(a)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(B.isModelRef(a)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let o=i.parseFqnRef(e.target);if(B.isImportRef(o)){n(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(B.isModelRef(o)){n(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Ji(a.deployment,o.deployment)&&n(`error`,`Invalid parent-child relationship`,{node:e})})},NS=e=>Z((e,t)=>{let n=e.deploymentNode.value.ref;(!n||!Yd(n))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),PS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=Yg(e.source),i=r&&t.getFqn(r);i||n(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let a=Yg(e.target),o=a&&t.getFqn(a);o||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),i&&o&&(I(i,o)||I(o,i))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},FS=e=>{let t=e.likec4.FqnIndex;return Z((e,n)=>{let r=e.source;xg(r)&&r.isBackward&&n(`error`,`Invalid chain after backward step`,{node:e});let i=Yg(e.target);i&&t.getFqn(i)||n(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},IS=e=>Z((e,t)=>{if(_(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}gn(e,vf)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:LS}=En,RS=e=>{let t=e.likec4.FqnIndex,n=e.workspace.AstNodeLocator;return Z((e,r)=>{let i=t.getFqn(e);if(!i){r(`error`,`Not indexed element`,{node:e,property:`name`});return}OS.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let a=LS(e),o=a.uri,s=n.getAstNodePath(e),c=t.byFqn(A_(a),i).filter(e=>e.documentUri!==o||e.path!==s).head();if(c){let t=c.documentUri!==o;r(`error`,`Duplicate element name ${e.name===i?e.name:e.name+` (`+i+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment?.range??c.selectionSegment?.range,uri:c.documentUri.toString()},message:`conflicting element`}]}})}})},zS=e=>Z((e,t)=>{e_(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:BS}=En,VS=e=>{let t=e.shared.workspace.ProjectsManager;return Z((e,n)=>{if(!t.all.includes(e.project)){n(`error`,`Imported project not found`,{node:e,property:`project`});return}let r=A_(BS(e));if(e.project===r){n(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},HS=e=>Z((e,t)=>{let n=parseFloat(e.value);(isNaN(n)||n<0||n>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),US=e=>(e,t)=>{let n=e.$container;n.props.some(t=>Lp(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),Vf(n)&&jf(n.$container)&&n.$container.props.some(e=>Lp(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`})},WS=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||de(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let n=ce(e.hex)?e.hex.toString().length:e.hex.length;n!==6&&n!==3&&n!==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((!ce(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!ce(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!ce(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),ce(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),de(e.alpha)){let n=parseFloat(e.alpha);(n<0||n>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}F(e)},GS=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(fn(e)),i=M_(()=>r._resolveRelationSource(e));if(!i){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let a=M_(()=>r.parseFqnRef(e.target));if(!a){n(`error`,`Target not resolved`,{node:e,property:`target`});return}B.isImportRef(i)&&(B.isImportRef(a)?n(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):n(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),Ji(B.flatten(i),B.flatten(a))&&n(`error`,`Invalid parent-child relationship`,{node:e})})},KS=e=>Z((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),qS=e=>{let t=e.likec4.ModelParser,n=new gr(e.shared,on.Linked),r=({source:e,target:t,kind:n,title:r})=>j_(`extend-relation`,B.flatten(e),B.flatten(t),n??`default`,r??``);function i(t){return n.get(t,()=>new Set(T(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),w(e=>e.c4Relations??[]),b(e=>r(e)))))}return Z((e,n)=>{let a=fn(e),o=t.forDocument(a),s=M_(()=>o.parseFqnRef(e.source));if(!s){n(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=M_(()=>o.parseFqnRef(e.target));if(!c){n(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!B.isModelRef(s)&&!B.isImportRef(s)){n(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!B.isModelRef(c)&&!B.isImportRef(c)){n(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let l=A_(a),u=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:d=``}=o.parseBaseProps({},{title:e.title}),f=r({source:s,target:c,kind:u,title:d});i(l).has(f)||n(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:e})})},JS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),YS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),XS=e=>Z((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),ZS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{OS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=A_(e),i=t.projectElements(r,Mf).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==fn(e).uri;n(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},QS=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{OS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=A_(e),i=t.projectElements(r,Qd).filter(t=>t.name===e.name&&t.node!==e).head();if(i){let t=i.documentUri!==fn(e).uri;n(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:i.nameSegment.range,uri:i.documentUri.toString()},message:`conflicting definition`}]}})}})},$S=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=e.name,i=A_(e),a=t.projectElements(i,`Tag`).filter(t=>t.name===r&&t.node!==e).head();if(a){let t=a.documentUri!==fn(e).uri;n(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:a.nameSegment.range,uri:a.documentUri.toString()},message:`conflicting definition`}]}})}})},eC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{OS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let r=A_(e);t.projectElements(r,Wm).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},tC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=A_(e),i=t.projectElements(r,xp),a=t.projectElements(r,yp);i.concat(a).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},nC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=A_(e);t.projectElements(r,kp).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},rC=/@likec4-generated/,iC=e=>{let t=e.shared.workspace.IndexManager;return Z((e,n)=>{let r=hn(e.$cstNode,[`BLOCK_COMMENT`]);if(r&&rC.test(r.text)&&n(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:r.range}),!e.name)return;OS.includes(e.name)&&n(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let i=A_(e);t.projectElements(i,Uu).filter(t=>t.name===e.name).limit(2).count()>1&&n(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})};function aC(e){let t=[],n=e;for(;n;)n.value&&t.push(n.value),n=n.prev;return t.reverse()}const oC=e=>Z((e,t)=>{let n=aC(e.targets);n.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let r=n.filter(vp),i=r[0]?.ref?.parent;for(let n=1;n<r.length;n++){let a=r[n];e.value===`same`&&!sC(i,a?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function sC(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:sC(e.parent,t.parent)}const cC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=Ug(e);if(r?.$type!==`DynamicViewIncludePredicate`&&r?.isInclude!==!0){n(`error`,`Invalid usage inside "exclude"`,{node:e});return}let i=r.$type===`DynamicViewIncludePredicate`,a=t.forDocument(fn(r)),o=V.unwrap(a.parseFqnExprWith(e).custom.expr);switch(!0){case V.isWildcard(o)&&i:case V.isElementKindExpr(o)&&i:case V.isElementTagExpr(o)&&i:n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case V.isWildcard(o):case V.isModelRef(o):case V.isDeploymentRef(o):return;case V.isElementKindExpr(o):case V.isElementTagExpr(o):n(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:F(o)}})},lC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=t.forDocument(fn(e)).parseFqnRefExpr(e),i=Ug(e),a=Jg(e)&&!gn(e,e=>ff(e)||Uh(e));if(i?.$type===`DeploymentViewRulePredicate`||a){if(!gn(e,Zu)){if(V.isModelRef(r)){n(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(V.isDeploymentRef(r)&&B.isInsideInstanceRef(r.ref)){n(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}y(e.selector)&&!Yd(e.ref.value?.ref)&&n(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(i?.$type===`DynamicViewIncludePredicate`)switch(!0){case V.isElementKindExpr(r):case V.isElementTagExpr(r):case V.isWildcard(r):n(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},uC=e=>Z((e,t)=>{e.to.$type===`WildcardExpression`&&!qp(e.$container)&&v(On(e,Gf)?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}),dC=e=>Z((e,t)=>{if(Ug(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let n=On(e,Gf);n&&v(n.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),fC=e=>{let t=e.likec4.ModelParser;return Z((e,n)=>{let r=On(e,uf);if(!r||r.isInclude!==!0)return;let i=fn(e),a=t.forDocument(i),o=io.unwrap(a.parseRelationExpr(e)),s=`Model reference is allowed in exclude predicate only`;if(io.isDirect(o)){(V.isModelRef(o.source)||V.isModelRef(o.target))&&n(`error`,s,{node:e});return}let c;if(c=io.isIncoming(o)?o.incoming:io.isOutgoing(o)?o.outgoing:o.inout,V.isModelRef(c)){n(`error`,s,{node:e});return}})},pC=e=>Z((e,t)=>{let n=Ug(e);if(!(!n||n.$type==`DynamicViewIncludePredicate`)&&!n.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var mC=class extends fr{constructor(e){super(e),this.services=e}async validateDocument(e,t,n){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,n)}};ir();const hC=Wi(Up,Vp,wp,Sp,bp,Ep,Op,mp,zm,Lu,Zu,Ef,yg,xg,wu,uf,Nu,Zu,vp,fd,ud,Eh,md,Du,Wu,gd,Gd,Yd,tf,id,bf,dm,Ku,Nm,Fm,ju,cd,xm,kf,jf,Vf,Lf,np,ip,Qf,ep,op,cp,sh,dh,ah,_h,rh,hh,Xf,yu),gC=e=>{let t=e;for(;t&&!Zp(t);){if(hC(t))return t;t=t.$container}};function _C(e){let t=e.state>=on.Validated?e.diagnostics?.filter(e=>e.severity===Pn.Error)??[]:[],n=new WeakSet;for(let{node:e}of t){if(v(e)||n.has(e))continue;n.add(e);let t=gC(e);t&&n.add(t)}return{isValid:e=>!n.has(e),invalidNodes:n}}function vC(e){K.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:jS(e),DeploymentNodeKind:QS(e),DeploymentNode:AS(e),DeploymentRelation:MS(e),ExtendDeployment:NS(e),ExtendRelation:qS(e),FqnRefExpr:lC(e),RelationExpr:fC(e),OpacityProperty:HS(e),IconProperty:US(e),SpecificationRule:JS(e),Model:YS(e),Globals:XS(e),GlobalPredicateGroup:tC(e),GlobalDynamicPredicateGroup:tC(e),GlobalStyleId:nC(e),DynamicStepSingle:PS(e),DynamicStepChain:FS(e),LikeC4View:iC(e),Element:RS(e),ElementRef:zS(e),ElementKind:ZS(e),Relation:GS(e),RelationBody:KS(e),Tag:$S(e),FqnExprWith:cC(e),RelationExprWith:pC(e),RelationshipKind:eC(e),IncomingRelationExpr:uC(e),OutgoingRelationExpr:dC(e),ImportsFromPoject:VS(e),ColorLiteral:WS(e),DynamicViewDisplayVariantProperty:IS(e),ViewRuleRank:oC(e)});let t=e.shared.lsp.Connection;t&&xa(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,n)=>{for(let e of n)K.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>K.error(U(e)))})})}const yC=K.getChild(`parser`);function bC(e){if(e==null)return;let t=xC(e);return de(t)?t.split(`
1233
1234
  `).join(` `):`md`in t?{md:t.md.split(`
1234
1235
  `).join(` `)}:{txt:t.txt.split(`
1235
- `).join(` `)}}function EC(e){if(e!=null)switch(!0){case de(e):return Yr(e).trim();case vm(e)&&de(e.markdown):return{md:Yr(e.markdown).trim()};case vm(e)&&de(e.text):return{txt:Yr(e.text).trim()};case vm(e):return{txt:``};default:return}}var DC=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=SC(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(on(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?wC.getChild(n).debug(r):wC.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return _(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(em(e)){let t=V_(e),n=this.resolveFqn(N(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),$a(t,n)}return hp(e)?I_(e.element):dp(e)?I_(e.deploymentNode):Iu(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)||b(e.props))return;let t=e=>{if(vm(e)){let t=EC(e);if(!t)return[];if(typeof t==`string`)return C(t)?[t]:[];{let e=t.md||t.txt;return C(e)?[e]:[]}}else if(bm(e))return e.values.map(e=>EC(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(C);return[]},n=w(e.props,_(e=>t(e.value).map(t=>[e.key,t])),S(([e,t])=>C(t)));if(b(n))return;let r=w(n,xe(([e])=>e),ie(e=>e.map(([e,t])=>t))),i={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(i[e]=t.length===1?t[0]:t);return b(i)?void 0:i}parseMarkdownOrString(e){if(vm(e))return EC(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>N(e.tag.ref,`Tag reference is not resolved`).name).filter(C)),t=t.prev;return Vi(n)?Ce(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,S(e.props,gm),e=>{let t=e.value;if(te(t))return;let n=C(e.title)?TC(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return z({url:t,title:n,relative:r&&r!==t?r:void 0})});return Vi(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&Vr(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&Lr(n):return Pr(this.doc.uri.toString(),`../`,n);case n&&zr(n):return Br(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){wC.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?Br(i,r):i;return Br(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(Wp(e))return`#${e.hex}`;if(uh(e)){let t=ae(e.alpha)?e.alpha:void 0;return de(e.alpha)&&(t=h_(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}F(e)}}parseElementStyle(e){if(!e)return{};if(ye(e)){let t=this.parseStyleProps(e.find(ep)?.props);try{let n=this.parseIconProperty(e.find(Xp));n&&(t.icon=n)}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 n of e)if(this.isValid(n))try{switch(!0){case Yd(n):C(n.value)&&(t.border=n.value);break;case Zd(n):{let e=b_(n);C(e)&&(t.color=e);break}case fh(n):C(n.value)&&(t.shape=n.value);break;case Xp(n):{let e=this.parseIconProperty(n);C(e)&&(t.icon=e);break}case Kp(n):{let e=b_(n);C(e)&&(t.iconColor=e);break}case Qp(n):C(n.value)&&(t.iconSize=__(n));break;case Jp(n):C(n.value)&&(t.iconPosition=v_(n));break;case Bm(n):t.opacity=g_(n);break;case Mm(n):t.multiple=ve(n.value)?n.value:!1;break;case mh(n):C(n.value)&&(t.size=__(n));break;case Wm(n):C(n.value)&&(t.padding=__(n));break;case Vh(n):C(n.value)&&(t.textSize=__(n));break;default:F(n)}}catch(e){this.logError(e,n)}return z(t)}parseBaseProps(e,t){let n=EC(t?.title??m_(e.title)),r=t?.description?{txt:EC(t.description)}:this.parseMarkdownOrString(e.description);return z({title:n,summary:t?.summary?{txt:EC(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:TC(t?.technology)??EC(m_(e.technology))})}};function*OC(e){let t=gt.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(hf(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function kC(e){return class extends e{parseDeployment(){let e=this.doc;for(let t of OC(e))try{switch(!0){case hf(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case af(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case lf(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case dp(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:F(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(sd)),c=w(e.body?.props??[],S(t),S(Qf),re(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return z({id:n,kind:r,title:l??Wi(n),...u,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);P(B.isModelRef(r)||B.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(sd)),s=w(e.body?.props??[],S(t),S(Qf),re(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return z({id:n,element:r,tags:i,links:this.parseLinks(e.body),...c,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(sd)),r=this.parseLinks(e.body);return!t&&b(n??{})&&!r?null:z({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(se(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,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);P(B.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);P(B.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(sd)),l=w(e.body?.props??[],S(oh),S(e=>C(e.value)),re(e=>[e.key,e.value])),u=w(e.body?.props??[],S(nh),$e())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(ch);return z({id:H_(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...y_(f?.props,t),navigateTo:u,astPath:n})}}}function AC(e){return class extends e{parseDeploymentView(e){let t=e.body;P(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+H_(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(w(n,S(ig),re(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);d_.writeId(e,i);let l=yS(e);return{[Wa]:`deployment`,id:i,astPath:r,title:TC(a)??null,description:o,tags:s,links:Vi(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e)),...l&&{manualLayout:l}}}parseDeploymentViewRule(e){if(Cf(e))return this.parseDeploymentViewRulePredicate(e);if(Wh(e))return x_(e);if(Tf(e))return this.parseDeploymentViewRuleStyle(e);F(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;he(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){q(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(Td)),n=EC(m_(e.props.find(Im)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const jC=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function MC(e){return!vg(e)&&!bg(e)?null:e.participant}function NC(e){switch(!0){case Wd(e):{let t=e.value.tag.ref?.name,n=MC(e);P(t,`Expected tag name`);let r={tag:jC(e,t)};return n?{participant:n,operator:r}:r}case Rd(e):{let t=e.value?.ref?.name,n=MC(e);P(t,`Expected kind name`);let r={kind:jC(e,t)};return n?{participant:n,operator:r}:r}case ug(e)||gg(e):return{not:NC(e.value)};case og(e):{let t=NC(e.left),n=NC(e.right);return PC(e.operator.toLowerCase(),t,n)}default:F(e)}}function PC(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[go(t)?t.and:t,go(n)?n.and:n].flat();return P(Vi(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[_o(t)?t.or:t,_o(n)?n.or:n].flat();return P(Vi(e),`Expected non-empty array`),{or:e}}default:F(e)}}function FC(e){return class extends e{parseFqnRef(e){let t=N(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(em(t)){let e={project:V_(t),model:this.resolveFqn(N(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(Hf(t)){let n=z_(e);if(n){let e={project:V_(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=R_(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(Iu(t))return{deployment:this.resolveFqn(t)};F(t)}parseExpressionV2(e){if(nd(e))return this.parseFqnExprOrWith(e);if(gd(e))return this.parseRelationExprOrWith(e);F(e)}parseFqnExprOrWith(e){if(Dp(e))return this.parseFqnExprWith(e);if(ed(e))return this.parseFqnExprOrWhere(e);F(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(Pm(t)){let n=t.value.view.$refText;return C(n)&&(e.custom.navigateTo=n),e}if(Rm(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(Qf(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=EC(m_(t.value));return n&&(e.custom[t.key]=n),e}if(Xp(t)){let n=this.parseIconProperty(t);return se(n)&&(e.custom[t.key]=n),e}if(Zd(t)){let n=b_(t);return se(n)&&(e.custom[t.key]=n),e}if(fh(t)||Yd(t))return se(t.value)&&(e.custom[t.key]=t.value),e;if(Bm(t))return se(t.value)&&(e.custom[t.key]=g_(t)),e;if(Kp(t)){let n=b_(t);return se(n)&&(e.custom[t.key]=n),e}if(Im(t)){let n=C(t.value)?EC(m_(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(Mm(t))return ve(t.value)&&(e.custom[t.key]=t.value),e;if(mh(t)||Vh(t)||Wm(t)||Qp(t))return C(t.value)&&(e.custom[t.key]=__(t)),e;if(Jp(t))return C(t.value)&&(e.custom[t.key]=t.value),e;F(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(Tp(e))return this.parseFqnExprWhere(e);if(Qu(e))return this.parseFqnExpr(e);F(e)}parseFqnExprWhere(e){return P(!Tp(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?NC(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(wg(e))return{wildcard:!0};if(Jf(e))return P(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(np(e))return P(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(jp(e))return this.parseFqnRefExpr(e);F(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=[],n=e;for(;n;){try{he(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(Qm(e))return this.parseRelationExprWith(e);if(md(e))return this.parseRelationExprOrWhere(e);F(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(Rm(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(oh(t)||Im(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=EC(m_(t.value));return n&&(e[t.key]=n),e}if(qd(t))return C(t.value)&&(e[t.key]=t.value),e;if(Zd(t)){let n=b_(t);return C(n)&&(e[t.key]=n),e}if(mm(t))return C(t.value)&&(e[t.key]=t.value),e;if(nh(t)){let n=t.value.view.ref?.name;return C(n)&&(e[t.key]=n),e}F(t)},{})}parseRelationExprOrWhere(e){if(Xm(e))return this.parseRelationExprWhere(e);if(fd(e))return this.parseRelationExpr(e);F(e)}parseRelationExprWhere(e){P(!Xm(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,i=e.where?NC(e.where):null,a;return a=i&&r?PC(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}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:F(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 IC(e){return class extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!C(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!C(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);T(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(Fp(e)){let r=this.parseGlobalPredicateGroup(e);T(r,1)&&(n.predicates[t]=r);return}if(Np(e)){let r=this.parseGlobalDynamicPredicateGroup(e);T(r,1)&&(n.dynamicPredicates[t]=r);return}F(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(zp(e))return[this.parseViewRuleStyle(e)];if(Vp(e))return e.styles.map(e=>this.parseViewRuleStyle(e));F(e)}}}function LC(e){return class extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(N(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*RC(e){let t=gt.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Km(r)){n.push(r);continue}if(yp(r)){n.push(r);continue}if(r.body?.elements&&T(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}function zC(e){return class extends e{parseModel(){let e=this.doc;for(let t of RC(e))try{if(Hf(t)){e.c4Elements.push(this.parseElement(t));continue}if(Km(t)){e.c4Relations.push(this.parseRelation(t));continue}if(hp(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(yp(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}F(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(sd)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=w(e.body?.props??[],S(t),S(Qf),re(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return z({id:n,kind:r,astPath:s,title:f,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...p,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(sd)),r=this.parseLinks(e.body);if(!t&&te(n)&&!r)return null;let i=this.getAstNodePath(e);return z({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);P(B.isModelRef(t)||B.isImportRef(t),`Source must be a model reference`),P(B.isModelRef(n)||B.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(sd)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&b(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return z({id:H_(`extend-relation`,B.flatten(t),B.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(se(e.source)){let t=this.parseFqnRef(e.source);return P(B.isModelRef(t)||B.isImportRef(t),`Relation source must be a model reference`),t}if(Wf(e.$container)||_p(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);P(B.isModelRef(r)||B.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(sd)),c=this.getAstNodePath(e),l=w(e.body?.props??[],S(oh),S(e=>C(e.value)),re(e=>[e.key,e.value])),u=w(e.body?.props??[],S(nh),y(e=>e.value.view.ref?.name),S(C),$e()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(ch);return z({id:H_(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...y_(m?.props,t)})}}}function BC(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(Dp(e))return this.parseFqnExprWith(e);if(ed(e))return this.parseFqnExprOrWhere(e);F(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 VC(e){return class extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!C(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=w(n.filter(Eh)??[],S(e=>this.isValid(e)&&he(e.value)),re(e=>[e.key,EC(m_(e.value))]),rt(v));t.relationships[r]={...i,...y_(n.filter(yd),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}C(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:N(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!C(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(ep)),o=this.parseLinks(e),s=w(n.filter(Sh)??[],S(e=>this.isValid(e)),re(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=EC(m_(s.notation));return{[r]:z({...c,notation:l,tags:i??void 0,...o&&Vi(o)&&{links:o},style:a})}}}}function HC(e){return class extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!b(t.folder.trim())?TC(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case ip(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case kf(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case yf(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:F(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;P(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=F_(e.viewOf),n=t&&U_(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+H_(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(w(n.props,S(e=>this.isValid(e)),S(ig),re(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u=yS(e),d={[Wa]:`element`,id:a,astPath:r,title:TC(o)??null,description:s,tags:c,links:Vi(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i},...u&&{manualLayout:u}};if(d_.writeId(e,d.id),`extends`in e){let t=e.extends.view.ref;return P(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(d,{extends:t.name})}return d}parseElementViewRule(e){if(Qh(e))return this.parseViewRulePredicate(e);if(Kh(e))return this.parseViewRuleGlobalPredicateRef(e);if(jd(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Wh(e))return x_(e);if(Xh(e))return this.parseViewRuleGroup(e);if(eg(e))return this.parseViewRuleRank(e);F(e)}parseViewRulePredicate(e){let t=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(ng(e))return this.parseViewRuleStyle(e);if(Jh(e))return this.parseViewRuleGlobalStyle(e);F(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(Qh(n)){t.push(this.parseViewRulePredicate(n));continue}if(Xh(n)){t.push(this.parseViewRuleGroup(n));continue}F(n)}catch(e){this.logError(e,n,`views`)}return{title:TC(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>co.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>co.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(Td)),r=EC(m_(e.props.find(Im)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;P(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+H_(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(w(i,S(ig),re(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);d_.writeId(e,o);let d=yS(e),f=Xe(i,Nf)?.value;return{[Wa]:`dynamic`,id:o,astPath:a,title:TC(s)??null,description:c,tags:l,links:Vi(u)?u:null,variant:f,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>zf(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e)),...d&&{manualLayout:d}}}parseDynamicViewRule(e){if(Lf(e))return this.parseDynamicViewIncludePredicate(e);if(Ff(e))return this.parseViewRuleGlobalPredicateRef(e);if(jd(e))return this.parseViewRuleStyleOrGlobalRef(e);if(Wh(e))return x_(e);F(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(nd(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=UC(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return P(Vi(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(Og(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return P(Vi(t),`Dynamic step chain must have at least one step`),{seriesId:UC(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(Og(e.source)){if(!this.isValid(e.source))return[];let n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!Vi(n)||!this.isValid(e))return[];let r=Re(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=F_(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=F_(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:UC(e)},r=EC(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case nh(t):{let e=t.value.view.ref?.name;C(e)&&(n.navigateTo=e);break}case oh(t):case Im(t):if(se(t.value))if(t.key===`description`){let e=EC(t.value);e&&(n.description=e)}else n[t.key]=EC(m_(t.value))??``;break;case Rm(t):se(t.value)&&(n[t.key]=EC(t.value));break;case qd(t):se(t.value)&&(n[t.key]=t.value);break;case Zd(t):{let e=b_(t);se(e)&&(n[t.key]=e);break}case mm(t):se(t.value)&&(n[t.key]=t.value);break;default:F(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function UC(e){let t=e,n=[];for(;!jf(t);)ae(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}Bn();const WC=w(DC,FC,LC,zC,kC,AC,BC,VC,HC,IC);var GC=class extends WC{};const KC=K.getChild(`parser`),qC=e=>e.severity===ar.Error;var JC=class{cachedParsers=new mt.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(Yn.Linked,async e=>{this.cachedParsers.has(e)&&(KC.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:Sn.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(Yn.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){q(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(Yn.Validated,async e=>{e.diagnostics?.some(qC)&&this.cachedParsers.has(e)&&(KC.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:Sn.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){P(p_(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=Sn.relative(t.folderUri,e.uri);e.likec4ProjectId?KC.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):KC.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<Yn.Linked&&KC.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new ft.default(Set)};e=Object.assign(e,r);let i=new GC(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},YC=class extends yn{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),bn.convertString(t)):super.runConverter(e,t,n)}};Bn();const{findNodeForKeyword:XC}=cn,ZC=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...we(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},QC=(e,t)=>n=>{if(!ng(n)&&!Tf(n))return!1;let r=n.targets.value;if(!r||C(n.targets.prev)||r.$type!==`FqnRefExpr`||C(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function $C(e,{view:t,viewAst:n,targets:r,style:i}){P(n.body,`View ${t.id} has no body`);let a=n.$cstNode;P(a,`viewCstNode`);let o=Re(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;P(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=S(n.body.rules,e=>ng(e)||Tf(e)),u=t[Wa]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=Ue(l,QC(e,c)),n=u&&I(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},m=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},h=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>ZC(e,i,s));h.push(dr.insert(o,`
1236
+ `).join(` `)}}function xC(e){if(e!=null)switch(!0){case de(e):return Yr(e).trim();case am(e)&&de(e.markdown):return{md:Yr(e.markdown).trim()};case am(e)&&de(e.text):return{txt:Yr(e.text).trim()};case am(e):return{txt:``};default:return}}var SC=class{isValid;constructor(e,t,n){this.services=e,this.doc=t,this.project=n,this.isValid=_C(t).isValid}logError(e,t,n){let r=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(dr(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let n=t.$cstNode,i=n?`:${n.range.start.line+1}:${n.range.start.character+1}`:``;r+=`\n\tat ${e} (${this.doc.uri.fsPath}${i})`}else t&&`$refText`in t&&(r+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);n&&n!==`base`?yC.getChild(n).debug(r):yC.debug(r)}tryParse(e,t,n){try{return!t||!this.isValid(t)?void 0:n(t)}catch(n){this.logError(n,t,e);return}}tryMap(e,t,n){return w(t,t=>this.tryParse(e,t,n)??[])}resolveFqn(e){if(Vp(e)){let t=A_(e),n=this.resolveFqn(N(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,n),Qa(t,n)}return np(e)?Xg(e.element):Qf(e)?Xg(e.deploymentNode):xu(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)||_(e.props))return;let t=e=>{if(am(e)){let t=xC(e);if(!t)return[];if(typeof t==`string`)return y(t)?[t]:[];{let e=t.md||t.txt;return y(e)?[e]:[]}}else if(sm(e))return e.values.map(e=>xC(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(y);return[]},n=T(e.props,w(e=>e.value?t(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),S(([e,t])=>y(t)));if(_(n))return;let r=T(n,be(([e])=>e),ae(e=>e.map(([e,t])=>t))),i={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(i[e]=t.length===1?t[0]:t);return _(i)?void 0:i}parseMarkdownOrString(e){if(am(e))return xC(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let n=[];for(;t;)n.push(...this.tryMap(`base`,t.values,e=>N(e.tag.ref,`Tag reference is not resolved`).name).filter(y)),t=t.prev;return Ui(n)?we(n):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,S(e.props,rm),e=>{let t=e.value;if(ve(t))return;let n=y(e.title)?bC(e.title):void 0,r=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return z({url:t,title:n,relative:r&&r!==t?r:void 0})});return Ui(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:n}=e;switch(!0){case!!t:{let n=t.ref?.name;if(!n){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return n}case n&&n===`none`:return n;case n&&Fr(n):if(n.startsWith(`file:`)){this.logError(`Icon property '${n}' used the 'file' protocol which is not supported`,e);return}return n;case n&&n.startsWith(`@`):return this.parseImageAlias(n);case n&&jr(n):return Or(this.doc.uri.toString(),`../`,n);case n&&Nr(n):return Pr(this.project.folderUri.toString(),n);default:this.logError(`Icon property '${n}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),n=t>0?e.substring(0,t):e,r=t>0?e.substring(t+1):``,i={"@":`./images`,...this.project.config.imageAliases}[n];if(!i){yC.warn(`Image alias "${n}" not found in project configuration`);return}let a=r?Pr(i,r):i;return Pr(this.project.folderUri.toString(),a)}parseColorLiteral(e){if(this.isValid(e)){if(jp(e))return`#${e.hex}`;if(Zm(e)){let t=ce(e.alpha)?e.alpha:void 0;return de(e.alpha)&&(t=Fg(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}F(e)}}parseElementStyle(e){if(!e)return{};if(se(e)){let t=this.parseStyleProps(e.find(Vf)?.props);try{let n=this.parseIconProperty(e.find(Lp));n&&(t.icon=n)}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 n of e)if(this.isValid(n))try{switch(!0){case Id(n):y(n.value)&&(t.border=n.value);break;case Rd(n):{let e=Bg(n);y(e)&&(t.color=e);break}case $m(n):y(n.value)&&(t.shape=n.value);break;case Lp(n):{let e=this.parseIconProperty(n);y(e)&&(t.icon=e);break}case Np(n):{let e=Bg(n);y(e)&&(t.iconColor=e);break}case zp(n):y(n.value)&&(t.iconSize=Lg(n));break;case Fp(n):y(n.value)&&(t.iconPosition=Rg(n));break;case Dm(n):t.opacity=Ig(n);break;case ym(n):t.multiple=ye(n.value)?n.value:!1;break;case th(n):y(n.value)&&(t.size=Lg(n));break;case jm(n):y(n.value)&&(t.padding=Lg(n));break;case Oh(n):y(n.value)&&(t.textSize=Lg(n));break;default:F(n)}}catch(e){this.logError(e,n)}return z(t)}parseBaseProps(e,t){let n=xC(t?.title??Pg(e.title)),r=t?.description?{txt:xC(t.description)}:this.parseMarkdownOrString(e.description);return z({title:n,summary:t?.summary?{txt:xC(t.summary)}:this.parseMarkdownOrString(e.summary),description:r,technology:bC(t?.technology)??xC(Pg(e.technology))})}};function*CC(e){let t=_t.default.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(tf(r)){n.push(r);continue}if(r.body&&r.body.elements.length>0)for(let e of r.body.elements)t.push(e);yield r}yield*n}function wC(e){return class extends e{parseDeployment(){let e=this.doc;for(let t of CC(e))try{switch(!0){case tf(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case Gd(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case Yd(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case Qf(t):{let n=this.parseExtendDeployment(t);n&&e.c4ExtendDeployments.push(n);break}default:F(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`DeploymentKind not resolved`).name,i=this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=this.parseElementStyle(e.body?.props),s=this.getMetadata(e.body?.props.find(Ku)),c=T(e.body?.props??[],S(t),S(zf),ie(e=>[e.key,e.value])),{title:l,...u}=this.parseBaseProps(c,{title:e.title,summary:e.summary});return z({id:n,kind:r,title:l??Ki(n),...u,tags:i,links:a,style:o,metadata:s})}parseDeployedInstance(e){let t=this.isValid,n=this.resolveFqn(e),r=this.parseFqnRef(e.target.modelElement);P(B.isModelRef(r)||B.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e.body)??void 0,a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(Ku)),s=T(e.body?.props??[],S(t),S(zf),ie(e=>[e.key,e.value])),c=this.parseBaseProps(s,{title:e.title,summary:e.summary});return z({id:n,element:r,tags:i,links:this.parseLinks(e.body),...c,style:a,metadata:o})}parseExtendDeployment(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(Ku)),r=this.parseLinks(e.body);return!t&&_(n??{})&&!r?null:z({id:this.resolveFqn(e),astPath:this.getAstNodePath(e),metadata:n,tags:t,links:r})}_resolveDeploymentRelationSource(e){if(_e(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,n=this.getAstNodePath(e),r=this._resolveDeploymentRelationSource(e);P(B.isDeploymentRef(r),`Invalid source for deployment relation`);let i=this.parseFqnRef(e.target);P(B.isDeploymentRef(i),`Invalid target for deployment relation`);let a=this.convertTags(e)??this.convertTags(e.body)??void 0,o=this.convertLinks(e.body),s=(e.kind??e.dotKind?.kind)?.ref?.name,c=this.getMetadata(e.body?.props.find(Ku)),l=T(e.body?.props??[],S(qm),S(e=>y(e.value)),ie(e=>[e.key,e.value])),u=T(e.body?.props??[],S(Um),We())?.value.view.ref?.name,d=this.parseBaseProps(l,{title:e.title}),f=e.body?.props.find(Ym);return z({id:j_(`deployment`,n,r.deployment,i.deployment),source:r,target:i,...d,metadata:c,kind:s,tags:a,links:o,...zg(f?.props,t),navigateTo:u,astPath:n})}}}function TC(e){return class extends e{parseDeploymentView(e){let t=e.body;P(t,`DynamicElementView body is not defined`);let n=t.props.filter(this.isValid),r=this.getAstNodePath(e),i=e.name;i||=`deployment_`+j_(this.doc.uri.toString(),r);let{title:a=null,description:o=null}=this.parseBaseProps(T(n,S(Gh),ie(e=>[e.key,e.value]))),s=this.convertTags(t),c=this.convertLinks(t);return Ag.writeId(e,i),{[Ua]:`deployment`,id:i,astPath:r,title:bC(a)??null,description:o,tags:s,links:Ui(c)?c:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(uf(e))return this.parseDeploymentViewRulePredicate(e);if(jh(e))return Vg(e);if(ff(e))return this.parseDeploymentViewRuleStyle(e);F(e)}parseDeploymentViewRulePredicate(e){let t=[],n=e.expr;for(;n;){try{let e=n.value;st(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){q(e)}n=n.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(ud)),n=xC(Pg(e.props.find(Cm)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...n&&{notation:n}}}}}const EC=({operator:e,not:t},n)=>e?.startsWith(`!=`)?{neq:n}:e?.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n},DC=({operator:e,not:t},n)=>e.startsWith(`!=`)?{neq:n}:e.startsWith(`=`)?{eq:n}:t?{neq:n}:{eq:n};function OC(e){return!lg(e)&&!pg(e)&&!dg(e)?null:e.participant}function kC(e){switch(!0){case jd(e):{let t=e.value.tag.ref?.name,n=OC(e);P(t,`Expected tag name`);let r={tag:DC(e,t)};return n?{participant:n,operator:r}:r}case Cd(e):{let t=e.value?.ref?.name,n=OC(e);P(t,`Expected kind name`);let r={kind:DC(e,t)};return n?{participant:n,operator:r}:r}case Td(e):{let t=e.key,n=OC(e);P(t,`Expected metadata key`);let r={metadata:{key:t,...e.value==null?{}:{value:EC(e,String(e.value))}}};return n?{participant:n,operator:r}:r}case $h(e)||sg(e):return{not:kC(e.value)};case qh(e):{let t=kC(e.left),n=kC(e.right);return AC(e.operator.toLowerCase(),t,n)}default:F(e)}}function AC(e,t,n){if(n===null)return t;switch(e){case`and`:{let e=[go(t)?t.and:t,go(n)?n.and:n].flat();return P(Ui(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[_o(t)?t.or:t,_o(n)?n.or:n].flat();return P(Ui(e),`Expected non-empty array`),{or:e}}default:F(e)}}function jC(e){return class extends e{parseFqnRef(e){let t=N(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(Vp(t)){let e={project:A_(t),model:this.resolveFqn(N(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(kf(t)){let n=$g(e);if(n){let e={project:A_(n),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let r=Qg(e);return r?{deployment:this.resolveFqn(r),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(xu(t))return{deployment:this.resolveFqn(t)};F(t)}parseExpressionV2(e){if(Vu(e))return this.parseFqnExprOrWith(e);if(td(e))return this.parseRelationExprOrWith(e);F(e)}parseFqnExprOrWith(e){if(mp(e))return this.parseFqnExprWith(e);if(zu(e))return this.parseFqnExprOrWhere(e);F(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(xm(t)){let n=t.value.view.$refText;return y(n)&&(e.custom.navigateTo=n),e}if(Tm(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom[t.key]=n),e}if(zf(t)){if(t.key===`description`||t.key===`summary`){let n=this.parseMarkdownOrString(t.value);return n&&(e.custom.description=n),e}let n=xC(Pg(t.value));return n&&(e.custom[t.key]=n),e}if(Lp(t)){let n=this.parseIconProperty(t);return _e(n)&&(e.custom[t.key]=n),e}if(Rd(t)){let n=Bg(t);return _e(n)&&(e.custom[t.key]=n),e}if($m(t)||Id(t))return _e(t.value)&&(e.custom[t.key]=t.value),e;if(Dm(t))return _e(t.value)&&(e.custom[t.key]=Ig(t)),e;if(Np(t)){let n=Bg(t);return _e(n)&&(e.custom[t.key]=n),e}if(Cm(t)){let n=y(t.value)?xC(Pg(t.value)):void 0;return n&&(e.custom[t.key]=n),e}if(ym(t))return ye(t.value)&&(e.custom[t.key]=t.value),e;if(th(t)||Oh(t)||jm(t)||zp(t))return y(t.value)&&(e.custom[t.key]=Lg(t)),e;if(Fp(t))return y(t.value)&&(e.custom[t.key]=t.value),e;F(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(fp(e))return this.parseFqnExprWhere(e);if(Lu(e))return this.parseFqnExpr(e);F(e)}parseFqnExprWhere(e){return P(!fp(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?kC(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(_g(e))return{wildcard:!0};if(Ff(e))return P(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(Uf(e))return P(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.$refText,isEqual:e.isEqual};if(vp(e))return this.parseFqnRefExpr(e);F(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=[],n=e;for(;n;){try{st(n.value)&&this.isValid(n.value)&&t.push(this.parseFqnExpr(n.value))}catch(e){this.logError(e,n.value,`fqnref`)}n=n.prev}return t.reverse()}parseRelationExprOrWith(e){if(zm(e))return this.parseRelationExprWith(e);if($u(e))return this.parseRelationExprOrWhere(e);F(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(Tm(t)){let n=this.parseMarkdownOrString(t.value);return n&&(e[t.key]=n),e}if(qm(t)||Cm(t)){if(t.key===`description`){let n=this.parseMarkdownOrString(t.value);return n&&(e.description=n),e}let n=xC(Pg(t.value));return n&&(e[t.key]=n),e}if(Pd(t))return y(t.value)&&(e[t.key]=t.value),e;if(Rd(t)){let n=Bg(t);return y(n)&&(e[t.key]=n),e}if(tm(t))return y(t.value)&&(e[t.key]=t.value),e;if(Um(t)){let n=t.value.view.ref?.name;return y(n)&&(e[t.key]=n),e}F(t)},{})}parseRelationExprOrWhere(e){if(Lm(e))return this.parseRelationExprWhere(e);if(Zu(e))return this.parseRelationExpr(e);F(e)}parseRelationExprWhere(e){P(!Lm(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),n=t.where?.expr??t,r=t.where?.condition,i=e.where?kC(e.where):null,a;return a=i&&r?AC(`and`,r,i):i??r??{kind:{neq:`--always-true--`}},{where:{expr:n,condition:a}}}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:F(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 MC(e){return class extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,n=this.isValid,r=e.value.globals.filter(n),i=r.flatMap(e=>e.predicates.filter(n));for(let e of i)try{let n=e.name;if(!y(n))continue;if(n in t.predicates){this.logError(`Global predicate named "${n}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,n,t)}catch(t){this.logError(t,e,`globals`)}let a=r.flatMap(e=>e.styles.filter(n));for(let e of a)try{let n=e.id.name;if(!y(n))continue;if(n in t.styles){this.logError(`Global style named "${n}" is already defined`,e,`globals`);continue}let r=this.parseGlobalStyleOrGroup(e);C(r,1)&&(t.styles[n]=r)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,n){if(Sp(e)){let r=this.parseGlobalPredicateGroup(e);C(r,1)&&(n.predicates[t]=r);return}if(bp(e)){let r=this.parseGlobalDynamicPredicateGroup(e);C(r,1)&&(n.dynamicPredicates[t]=r);return}F(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(Ep(e))return[this.parseViewRuleStyle(e)];if(Op(e))return e.styles.map(e=>this.parseViewRuleStyle(e));F(e)}}}function NC(e){return class extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,n=t.imports;for(;n;){try{this.doc.c4Imports.set(e,this.resolveFqn(N(n.imported.ref,`ElementRef is empty of imported: ${n.imported.$refText}`)))}catch(e){this.logError(e,n,`imports`)}n=n.prev}}}}}function*PC(e){let t=_t.default.from(e.parseResult.value.models.flatMap(e=>e.elements)),n=[],r;for(;r=t.shift();){if(Nm(r)){n.push(r);continue}if(op(r)){n.push(r);continue}if(r.body?.elements&&C(r.body.elements,1))for(let e of r.body.elements)t.push(e);yield r}yield*n}function FC(e){return class extends e{parseModel(){let e=this.doc;for(let t of PC(e))try{if(kf(t)){e.c4Elements.push(this.parseElement(t));continue}if(Nm(t)){e.c4Relations.push(this.parseRelation(t));continue}if(np(t)){let n=this.parseExtendElement(t);n&&e.c4ExtendElements.push(n);continue}if(op(t)){let n=this.parseExtendRelation(t);n&&e.c4ExtendRelations.push(n);continue}F(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,n=this.resolveFqn(e),r=N(e.kind.ref,`Element kind is not resolved`).name,i=this.parseTags(e.body),a=this.parseElementStyle(e.body?.props),o=this.getMetadata(e.body?.props.find(Ku)),s=this.getAstNodePath(e),[c,l,u]=e.props??[],d=T(e.body?.props??[],S(t),S(zf),ie(e=>[e.key,e.value])),{title:f,...p}=this.parseBaseProps(d,{title:c,summary:l,technology:u});return z({id:n,kind:r,astPath:s,title:f,metadata:o,tags:i??void 0,links:this.parseLinks(e.body),...p,style:a})}parseExtendElement(e){let t=this.parseTags(e.body),n=this.getMetadata(e.body?.props.find(Ku)),r=this.parseLinks(e.body);if(!t&&ve(n)&&!r)return null;let i=this.getAstNodePath(e);return z({id:this.resolveFqn(e),astPath:i,metadata:n,tags:t,links:r})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),n=this.parseFqnRef(e.target);P(B.isModelRef(t)||B.isImportRef(t),`Source must be a model reference`),P(B.isModelRef(n)||B.isImportRef(n),`Target must be a model reference`);let r=this.parseTags(e.body),i=this.getMetadata(e.body?.props.find(Ku)),a=this.getAstNodePath(e),o=this.parseLinks(e.body);if(!r&&_(i??{})&&!o)return null;let s=(e.kind??e.dotKind?.kind)?.ref?.name,{title:c=``}=this.parseBaseProps({},{title:e.title});return z({id:j_(`extend-relation`,B.flatten(t),B.flatten(n),s??`default`,c),astPath:a,metadata:i,tags:r,links:o})}_resolveRelationSource(e){if(_e(e.source)){let t=this.parseFqnRef(e.source);return P(B.isModelRef(t)||B.isImportRef(t),`Relation source must be a model reference`),t}if(jf(e.$container)||ip(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,n=this._resolveRelationSource(e),r=this.parseFqnRef(e.target);P(B.isModelRef(r)||B.isImportRef(r),`Target must be a model reference`);let i=this.parseTags(e)??this.parseTags(e.body)??void 0,a=this.parseLinks(e.body),o=(e.kind??e.dotKind?.kind)?.ref?.name,s=this.getMetadata(e.body?.props.find(Ku)),c=this.getAstNodePath(e),l=T(e.body?.props??[],S(qm),S(e=>y(e.value)),ie(e=>[e.key,e.value])),u=T(e.body?.props??[],S(Um),b(e=>e.value.view.ref?.name),S(y),We()),{title:d=``,description:f,technology:p}=this.parseBaseProps(l,{title:e.title,description:e.description,technology:e.technology}),m=e.body?.props.find(Ym);return z({id:j_(c,n.model,r.model),astPath:c,source:n,target:r,title:d,metadata:s,kind:o,tags:i,links:a,navigateTo:u,description:f,technology:p,...zg(m?.props,t)})}}}function IC(e){return class extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(mp(e))return this.parseFqnExprWith(e);if(zu(e))return this.parseFqnExprOrWhere(e);F(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 LC(e){return class extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,n=this.isValid;for(let r of e.flatMap(e=>e.elements.filter(n)))try{Object.assign(t.elements,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}for(let r of e.flatMap(e=>e.deploymentNodes.filter(n)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(r))}catch(e){this.logError(e,r,`specification`)}let r=e.flatMap(e=>e.relationships.filter(this.isValid));for(let{kind:e,props:n}of r)try{let r=e.name;if(!y(r))continue;if(r in t.relationships){this.logError(`Relationship kind "${r}" is already defined`,e,`specification`);continue}let i=T(n.filter(ph)??[],S(e=>this.isValid(e)&&st(e.value)),ie(e=>[e.key,xC(Pg(e.value))]),it(v));t.relationships[r]={...i,...zg(n.filter(id),this.isValid)}}catch(t){this.logError(t,e,`specification`)}let i=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of i)try{let n=e.tag.name,r=this.getAstNodePath(e.tag),i=e.color&&this.parseColorLiteral(e.color);if(n in t.tags){this.logError(`Tag ${n} is already defined, skipping duplicate`,e,`specification`);continue}y(n)&&(t.tags[n]={astPath:r,...i?{color:i}:{}})}catch(t){this.logError(t,e,`specification`)}let a=e.flatMap(e=>e.colors.filter(n));for(let{name:e,color:n}of a)try{let r=e.name;if(r in t.colors){this.logError(`Custom color "${r}" is already defined`,e,`specification`);continue}t.colors[r]={color:N(this.parseColorLiteral(n),`Color "${r}" is not valid`)}}catch(e){this.logError(e,n,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:n}=e,r=t.name;if(!y(r))throw Error(`DeploymentNodeKind name is not resolved`);let i=this.parseTags(e),a=this.parseElementStyle(n.find(Vf)),o=this.parseLinks(e),s=T(n.filter(lh)??[],S(e=>this.isValid(e)),ie(e=>[e.key,e.value])),c=this.parseBaseProps(s),l=xC(Pg(s.notation));return{[r]:z({...c,notation:l,tags:i??void 0,...o&&Ui(o)&&{links:o},style:a})}}}}function RC(e){return class extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let n=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),r=t.folder&&!_(t.folder.trim())?bC(t.folder):null;for(let i of t.views)try{if(!e(i))continue;switch(!0){case Gf(i):this.doc.c4Views.push(this.parseElementView(i,n));break;case gf(i):this.doc.c4Views.push(this.parseDynamicElementView(i,n));break;case of(i):this.doc.c4Views.push(this.parseDeploymentView(i));break;default:F(i)}if(r){let e=this.doc.c4Views.at(-1);e.title=r+` / `+(e.title||e.id)}}catch(e){this.logError(e,i,`views`)}}}parseElementView(e,t){let n=e.body;P(n,`ElementView body is not defined`);let r=this.getAstNodePath(e),i=null;if(`viewOf`in e){let t=Yg(e.viewOf),n=t&&M_(()=>this.resolveFqn(t));if(n)i=n;else{let t=e.name??`unnamed`,n=e.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${n}`,e.viewOf)}}let a=e.name;a||=`view_`+j_(this.doc.uri.toString(),r,i??``);let{title:o=null,description:s=null}=this.parseBaseProps(T(n.props,S(e=>this.isValid(e)),S(Gh),ie(e=>[e.key,e.value]))),c=this.convertTags(n),l=this.convertLinks(n),u={[Ua]:`element`,id:a,astPath:r,title:bC(o)??null,description:s,tags:c,links:Ui(l)?l:null,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseElementViewRule(e))],...i&&{viewOf:i}};if(Ag.writeId(e,u.id),`extends`in e){let t=e.extends.view.ref;return P(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(u,{extends:t.name})}return u}parseElementViewRule(e){if(zh(e))return this.parseViewRulePredicate(e);if(Nh(e))return this.parseViewRuleGlobalPredicateRef(e);if(gd(e))return this.parseViewRuleStyleOrGlobalRef(e);if(jh(e))return Vg(e);if(Lh(e))return this.parseViewRuleGroup(e);if(Vh(e))return this.parseViewRuleRank(e);F(e)}parseViewRulePredicate(e){let t=[],n=e.exprs;for(;n;){let{value:e,prev:r}=n;if(this.tryParse(`views`,e,()=>{let n=this.parsePredicate(e);t.unshift(n)}),!r)break;n=r}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(Uh(e))return this.parseViewRuleStyle(e);if(Fh(e))return this.parseViewRuleGlobalStyle(e);F(e)}parseViewRuleGroup(e){let t=[];for(let n of e.groupRules)try{if(!this.isValid(n))continue;if(zh(n)){t.push(this.parseViewRulePredicate(n));continue}if(Lh(n)){t.push(this.parseViewRuleGroup(n));continue}F(n)}catch(e){this.logError(e,n,`views`)}return{title:bC(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>so.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>so.isFqnExpr(e)),n=this.parseStyleProps(e.props.filter(ud)),r=xC(Pg(e.props.find(Cm)?.value));return{targets:t,style:n,...r&&{notation:r}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let n=e.body;P(n,`DynamicElementView body is not defined`);let r=this.isValid,i=n.props.filter(r),a=this.getAstNodePath(e),o=e.name;o||=`dynamic_`+j_(this.doc.uri.toString(),a);let{title:s=null,description:c=null}=this.parseBaseProps(T(i,S(Gh),ie(e=>[e.key,e.value]))),l=this.convertTags(n),u=this.convertLinks(n);Ag.writeId(e,o);let d=Ie(i,bf)?.value;return{[Ua]:`dynamic`,id:o,astPath:a,title:bC(s)??null,description:c,tags:l,links:Ui(u)?u:null,variant:d,rules:[...t,...this.tryMap(`views`,n.rules,e=>this.parseDynamicViewRule(e))],steps:this.tryMap(`views`,n.steps,e=>Ef(e)?this.parseDynamicParallelSteps(e):this.parseDynamicStep(e))}}parseDynamicViewRule(e){if(wf(e))return this.parseDynamicViewIncludePredicate(e);if(Sf(e))return this.parseViewRuleGlobalPredicateRef(e);if(gd(e))return this.parseViewRuleStyleOrGlobalRef(e);if(jh(e))return Vg(e);F(e)}parseDynamicViewIncludePredicate(e){let t=[],n=e.exprs;for(;n;)this.tryParse(`views`,n.value,e=>{if(Vu(e)){let n=this.parseElementPredicate(e);t.unshift(n)}}),n=n.prev;return{include:t}}parseDynamicParallelSteps(e){let t=zC(e),n=this.tryMap(`views`,e.steps,e=>this.parseDynamicStep(e));return P(Ui(n),`Dynamic parallel steps must have at least one step`),{parallelId:t,__parallel:n}}parseDynamicStep(e){if(xg(e))return this.parseDynamicStepSingle(e);let t=this.recursiveParseDynamicStepChain(e);return P(Ui(t),`Dynamic step chain must have at least one step`),{seriesId:zC(e),__series:t}}recursiveParseDynamicStepChain(e,t){if(xg(e.source)){if(!this.isValid(e.source))return[];let n=this.parseDynamicStepSingle(e.source);if(n.isBackward)return[];let r={...this.parseAbstractDynamicStep(e),source:n.target};return r.target===n.source?r.isBackward=!0:t&&(t.push([n.source,n.target]),t.push([r.source,r.target])),[n,r]}t??=[];let n=this.recursiveParseDynamicStepChain(e.source,t);if(!Ui(n)||!this.isValid(e))return[];let r=Re(n),i={...this.parseAbstractDynamicStep(e),source:r.target},a=t.findIndex(([e,t])=>e===i.target&&t===i.source);return a===-1?t.push([i.source,i.target]):(i.isBackward=!0,t.splice(a,t.length-a)),[...n,i]}parseDynamicStepSingle(e){let t=Yg(e.source);if(!t)throw Error(`Invalid reference to source`);let n={...this.parseAbstractDynamicStep(e),source:this.resolveFqn(t)};return e.isBackward&&(n={...n,source:n.target,target:n.source,isBackward:!0}),n}parseAbstractDynamicStep(e){let t=Yg(e.target);if(!t)throw Error(`Invalid reference to target`);let n={target:this.resolveFqn(t),astPath:zC(e)},r=xC(e.title);r&&(n.title=r);let i=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;i&&(n.kind=i);for(let t of e.custom?.props??[])try{switch(!0){case Um(t):{let e=t.value.view.ref?.name;y(e)&&(n.navigateTo=e);break}case qm(t):case Cm(t):if(_e(t.value))if(t.key===`description`){let e=xC(t.value);e&&(n.description=e)}else n[t.key]=xC(Pg(t.value))??``;break;case Tm(t):_e(t.value)&&(n[t.key]=xC(t.value));break;case Pd(t):_e(t.value)&&(n[t.key]=t.value);break;case Rd(t):{let e=Bg(t);_e(e)&&(n[t.key]=e);break}case tm(t):_e(t.value)&&(n[t.key]=t.value);break;default:F(t)}}catch(e){this.logError(e,t,`views`)}return n}}}function zC(e){let t=e,n=[];for(;!vf(t);)ce(t.$containerIndex)&&n.unshift(`@${t.$containerIndex}`),n.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return n.join(``)}ir();const BC=T(SC,jC,NC,FC,wC,TC,IC,LC,RC,MC);var VC=class extends BC{};const HC=K.getChild(`parser`),UC=e=>e.severity===Pn.Error;var WC=class{cachedParsers=new ht.default(e=>this.createParser(e));constructor(e){this.services=e,e.shared.workspace.DocumentBuilder.onDocumentPhase(on.Linked,async e=>{this.cachedParsers.has(e)&&(HC.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:mn.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(on.Linked,async t=>{for(let n of t)if(!e.shared.workspace.ProjectsManager.isExcluded(n))try{this.parse(n)}catch(e){q(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(on.Validated,async e=>{e.diagnostics?.some(UC)&&this.cachedParsers.has(e)&&(HC.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:e.likec4ProjectId,doc:mn.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){P(Mg(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),n=mn.relative(t.folderUri,e.uri);e.likec4ProjectId?HC.trace(`create parser {projectId} document {doc}`,{projectId:e.likec4ProjectId,doc:n}):HC.debug(`create parser for document without project {doc}`,{doc:e.uri.fsPath}),e.state<on.Linked&&HC.debug(`Document {doc} is not linked, state is {state}`,{doc:n,state:e.state});let r={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new pt.default(Set)};e=Object.assign(e,r);let i=new VC(this.services,e,t);try{i.parseSpecification(),i.parseImports(),i.parseModel(),i.parseDeployment(),i.parseGlobals(),i.parseViews()}catch(e){throw Error(`Error parsing document ${n}`,{cause:e})}return i}},GC=class extends xn{runConverter(e,t,n){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),dn.convertString(t)):super.runConverter(e,t,n)}};ir();const{findNodeForKeyword:KC}=pn,qC=(e,t,n=0)=>{let r=n>0?` `.repeat(n):``;return[r+`style ${e} {`,...Ke(t).map(([e,t])=>r+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),r+`}`]},JC=(e,t)=>n=>{if(!Uh(n)&&!ff(n))return!1;let r=n.targets.value;if(!r||y(n.targets.prev)||r.$type!==`FqnRefExpr`||y(r.selector))return!1;let i=r.ref?.value?.ref;return(i?t.resolve(i):null)===e};function YC(e,{view:t,viewAst:n,targets:r,style:i}){P(n.body,`View ${t.id} has no body`);let a=n.$cstNode;P(a,`viewCstNode`);let o=Re(n.body.rules)?.$cstNode?.range.end??n.body.$cstNode?.range.end;P(o,`insertPos is not defined`);let s=a.range.start.character+2,c=e.likec4.FqnIndex,l=S(n.body.rules,e=>Uh(e)||ff(e)),u=t[Ua]===`element`?t.viewOf??null:null,d=[],f=[];r.forEach(e=>{let t=Ze(l,JC(e,c)),n=u&&I(u,e)?e.substring(u.length+1):e;t?d.push({fqn:n,rule:t}):f.push({fqn:n})});let p={start:o,end:o},m=e=>{e.start.line<=p.start.line&&(e.start.line==p.start.line?p.start.character=Math.min(e.start.character,p.start.character):p.start=e.start),e.end.line>=p.end.line&&(e.end.line==p.end.line?p.end.character=Math.max(e.end.character,p.end.character):p.end=e.end)},h=[];if(f.length>0){let e=f.flatMap(({fqn:e})=>qC(e,i,s));h.push(Hn.insert(o,`
1236
1237
  `+e.join(`
1237
- `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Re(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;P(t,`RuleCstNode not found`);for(let[n,r]of we(i)){let i=n===`opacity`?r.toString()+`%`:r,a=e.props.find(e=>e.key===n);if(a&&a.$cstNode){let{range:{start:e,end:t}}=a.$cstNode;m({start:e,end:t}),h.push(dr.replace({start:e,end:t},n+` `+i));continue}let o=XC(t,`{`)?.range.end;P(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;h.push(dr.insert(o,`
1238
- `+c)),m({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:h}}Bn();const{findNodeForKeyword:ew}=cn;function tw(e,{view:t,viewAst:n,layout:r}){P(n.body,`View ${t.id} has no body`);let i=n.$cstNode;P(i,`viewCstNode`);let a=S_(r.direction),o=Ue(n.body.rules,Wh),s=`autoLayout ${a}`;if(ae(r.rankSep)&&(s+=` ${r.rankSep}`,ae(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return dr.replace(o.$cstNode.range,s);let c=ew(n.body.$cstNode,`}`)?.range.start;P(c,`Closing brace not found`);let l=`\t${s}\n\t`;return dr.insert(c,l)}Bn();async function nw(e,{lookup:t}){if(!t.view.manualLayout)return!1;let n=t.viewAst.$cstNode;P(n,`invalid view.$cstNode`);let r=e.shared.lsp.Connection;P(r,`LSP Connection not available`);let i=_n(n,[`BLOCK_COMMENT`]);return i&&_S(i.text)?(await r.workspace.applyEdit({label:`LikeC4 - remove manual layout v1 for ${t.view.id}`,edit:{changes:{[t.doc.textDocument.uri]:[dr.del(i.range)]}}})).applied:!1}Bn();const rw=K.getChild(`model-changes`);var iw=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);rw.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return P(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),s.view.manualLayout&&t&&await nw(this.services,{lookup:s}).catch(e=>{rw.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return s.view.manualLayout&&t&&await nw(this.services,{lookup:s}).catch(e=>{rw.warn(`Failed to remove manual layout v1 for view ${r} in project ${o.id}`,{err:e})}),{success:!0,location:await n.ManualLayouts.remove(o,r)};P(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?{success:!0,location:{uri:c.uri,range:u}}:(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=U(ts(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return rw.error(n),{success:!1,error:n}}finally{this.services.likec4.ModelBuilder.clearCache()}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return $C(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=tw(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:F(t)}}},aw=class extends dn{constructor(e){super(),this.services=e}getNameStrict(e){return N(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(un(e))return e.name;if(em(e))return e.imported.$refText;if(af(e))return e.target.modelElement.value.$refText}getNameNode(e){if(un(e))return super.getNameNode(e);if(em(e))return e.imported.$refNode;if(af(e))return e.target.modelElement.value.$refNode}};function ow(e){return w(e,xe(e=>`${e.type}.${e.name}`),we(),_(([e,t])=>t.length===1?t:[]))}var sw=class extends pr{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){q(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(v(r)||r.length===0))for(let e of r)try{C(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}exportGlobals(e,t,n){if(!(v(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;C(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;C(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}}exportModel(e,t,n){if(!(v(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{Hf(r)&&C(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){q(e)}}exportLibrary(e,t,n){if(!v(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){q(e)}}exportSpecification(e,t,n){if(!(v(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case vh(r):case bh(r):C(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case Ah(r):C(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case wh(r):C(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case gh(r):C(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:F(r)}}catch(e){q(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(v(r)||r.length===0))for(let e of r)try{lf(e)&&C(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new En;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){q(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){q(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){q(e)}ow(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new En,i=[];for(let a of e.elements){if(Km(a))continue;let e;if(Hf(a)?(C(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):hp(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){q(e)}}i.length&&w(i,S(e=>!r.has(e.name)),xe(e=>e.name),Se((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new En,i=[];for(let a of e.elements){if(hf(a))continue;let e=a.body;if(!dp(a)){let i=this.nameProvider.getName(a);if(C(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){q(e)}}i.length&&w(i,S(e=>!r.has(e.name)),xe(e=>e.name),Se((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:cw}=On;var lw=class extends fr{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=V_(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(kp(r))return new ln(this.streamForFqnRef(t,r,e));if(Ph(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==Vf)return this.getProjectScope(t,n,e);if(em(r)){let e=V_(r);return new ln(this.fqnIndex.rootElements(e))}if(Mh(r)&&e.property===`el`){let i=r.parent;return i?new ln(this.fqnIndex.directChildrenOf(t,I_(i))):this.getProjectScope(t,n,e)}return new ln(gn(this.computeScope(t,e)))}catch(r){return q(r),this.getProjectScope(t,n,e)}}catch(e){return q(e),mr}}*genUniqueDescedants(e){if(!e)return;let t=V_(e);if(Hf(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(lf(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*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(F_(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(F_(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new ln(this.deploymentsIndex.directChildrenOf(e,I_(r)).filter(e=>this.reflection.isSubtype(e.type,cf))):this.getProjectScope(e,cf,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&lf(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return gn(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return rr;if(em(i))return gn(this.genUniqueDescedants(i.imported.ref));if(lf(i))return gn(this.genUniqueDescedants(i));if(af(i)){let e=i.target.modelElement.value.ref,t=em(e)?e.imported.ref:Hf(e)?e:void 0;return gn(this.genUniqueDescedants(t))}return Hf(i)?gn(this.genUniqueDescedants(i)):F(i)}*genScopeForParentlessFqnRef(e,t,n){kn(t,Xf)||D_(t)?yield*this.computeScope(e,n,Vf):E_(t)?(yield*this.computeScope(e,n,Vf),yield*this.computeScope(e,n,cf),yield*this.computeScope(e,n,rf)):(yield*this.computeScope(e,n,cf),yield*this.computeScope(e,n,rf),kn(t,xf)&&(yield*this.computeScope(e,n,Vf)));let r=cw(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,$p)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Vf),i=this.reflection.isSubtype(n,Fu),a=cw(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let o=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(o);e.length>0&&(yield*e),i&&pp(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&_p(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&op(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===sm?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new Tn(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===sm)return super.getGlobalScope(e,t);let n=V_(t.container);return this.getProjectScope(n,e,t)}},uw=Un();let dw;(function(e){e.type=new uw.NotificationType(`likec4/onDidChangeModel`)})(dw||={});let fw;(function(e){e.type=new uw.NotificationType0(`likec4/onDidChangeProjects`)})(fw||={});let pw;(function(e){e.type=new uw.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(pw||={});let mw;(function(e){e.type=new uw.NotificationType(`likec4/onRequestOpenView`)})(mw||={});let hw;(function(e){e.req=new uw.RequestType(`likec4/fetchComputedModel`)})(hw||={});let gw;(function(e){e.req=new uw.RequestType0(`likec4/fetchViewsFromAllProjects`)})(gw||={});let _w;(function(e){e.req=new uw.RequestType(`likec4/fetchLayoutedModel`)})(_w||={});let vw;(function(e){e.req=new uw.RequestType(`likec4/layout-view`)})(vw||={});let yw;(function(e){e.req=new uw.RequestType(`likec4/validate-layout`)})(yw||={});let bw;(function(e){e.req=new uw.RequestType0(`likec4/reload-projects`)})(bw||={});let xw;(function(e){e.req=new uw.RequestType0(`likec4/fetch-projects`)})(xw||={});let Sw;(function(e){e.req=new uw.RequestType(`likec4/register-project`)})(Sw||={});let Cw;(function(e){e.req=new uw.RequestType(`likec4/build`)})(Cw||={});let ww;(function(e){e.req=new uw.RequestType(`likec4/locate`)})(ww||={});let Tw;(function(e){e.req=new uw.RequestType(`likec4/change-view`)})(Tw||={});let Ew;(function(e){e.req=new uw.RequestType0(`likec4/metrics`)})(Ew||={});let Dw;(function(e){e.req=new uw.RequestType(`likec4/document-tags`)})(Dw||={});let Ow;(function(e){e.req=new uw.RequestType0(`likec4/fetch-projects-overview`)})(Ow||={});const Q=K.getChild(`rpc`);var kw=class extends P_{constructor(e){super(),this.services=e}init=ne(()=>{let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,a=be(t=>{t>1?Q.debug`send ${`onDidChangeModel`} (${t} batched)`:Q.debug`send ${`onDidChangeModel`}`,e.sendNotification(dw.type,``).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),o=be(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(fw.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),s=!0;this.onDispose(t.ModelBuilder.onModelParsed(()=>a.call(1)),n.ProjectsManager.onProjectsUpdate(()=>o.call(1)),e.onRequest(hw.req,async({projectId:e,cleanCaches:r=!1},i)=>{Q.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&(Q.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===Lc.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(pw.type,async({snapshotUri:e})=>{Q.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${e}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.rebuildProject(n.ProjectsManager.ownerProjectId(e))}),e.onRequest(_w.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:oe(i,e=>e.id)}}}),e.onRequest(vw.req,async({viewId:e,projectId:n,layoutType:r},i)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(yw.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:c((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(xw.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:ie(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:y(e,e=>e.uri.toString())}})})),e.onRequest(bw.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(Sw.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(fn.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(gw.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await sn(e);try{let n=await t.Views.computedViews(i,e);r.push(...w(n,y(e=>({id:e.id,title:e.title??e.id,projectId:i})),Oe((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(Cw.req,async({docs:t},n)=>{let a=t.map(e=>fn.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>Sn.equals(t,e))).toArray();Q.debug(`[ServerRpc] received request to build:
1238
+ `))),p.start={line:o.line+1,character:s},p.end={line:o.line+e.length,character:Re(e)?.length??0}}if(d.length>0)for(let{rule:e}of d){let t=e.$cstNode;P(t,`RuleCstNode not found`);for(let[n,r]of Ke(i)){let i=n===`opacity`?r.toString()+`%`:r,a=e.props.find(e=>e.key===n);if(a&&a.$cstNode){let{range:{start:e,end:t}}=a.$cstNode;m({start:e,end:t}),h.push(Hn.replace({start:e,end:t},n+` `+i));continue}let o=KC(t,`{`)?.range.end;P(o,`Opening brace not found`);let s=` `.repeat(t.range.start.character)+` `,c=s+n+` `+i;h.push(Hn.insert(o,`
1239
+ `+c)),m({start:{line:o.line+1,character:s.length},end:{line:o.line+1,character:c.length}})}}return{modifiedRange:p,edits:h}}ir();const{findNodeForKeyword:XC}=pn;function ZC(e,{view:t,viewAst:n,layout:r}){P(n.body,`View ${t.id} has no body`);let i=n.$cstNode;P(i,`viewCstNode`);let a=Hg(r.direction),o=Ze(n.body.rules,jh),s=`autoLayout ${a}`;if(ce(r.rankSep)&&(s+=` ${r.rankSep}`,ce(r.nodeSep)&&(s+=` ${r.nodeSep}`)),o&&o.$cstNode)return Hn.replace(o.$cstNode.range,s);let c=XC(n.body.$cstNode,`}`)?.range.start;P(c,`Closing brace not found`);let l=`\t${s}\n\t`;return Hn.insert(c,l)}ir();const QC=K.getChild(`model-changes`);var $C=class{locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let t=this.services.shared.lsp.Connection,n=this.services.shared.workspace;try{let{viewId:r,projectId:i,change:a}=e,o=n.ProjectsManager.ensureProject(i);QC.debug`Applying model change ${a.op} to view ${r} in project ${o.id}`;let s=this.locator.locateViewAst(r,o.id);if(!s)throw Error(`View ${r} not found in project ${o.id}`);let c={uri:s.doc.textDocument.uri,version:s.doc.textDocument.version};if(a.op===`save-view-snapshot`)return P(r===a.layout.id,`View ID does not match, expected `+r+`, got `+a.layout.id),{success:!0,location:await n.ManualLayouts.write(o,a.layout)};if(a.op===`reset-manual-layout`)return{success:!0,location:await n.ManualLayouts.remove(o,r)};P(t,`This change only supported in IDE (running as Extension)`);let{edits:l,modifiedRange:u}=this.convertToTextEdit({lookup:s,change:a});if(!l.length)return{success:!1,error:`No changes to apply`};let d=await t.workspace.applyEdit({label:`LikeC4 - change view ${e.viewId}`,edit:{changes:{[c.uri]:l}}});return d.applied?(await n.DocumentBuilder.update([s.doc.uri],[]),{success:!0,location:{uri:c.uri,range:u}}):(t.window.showErrorMessage(`Failed to apply changes ${d.failureReason}`),{success:!1,error:`Failed to apply changes ${d.failureReason}`})}catch(t){let n=U(ts(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return QC.error(n),{success:!1,error:n}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return YC(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let n=ZC(this.services,{...e,layout:t.layout});return{modifiedRange:n.range,edits:[n]}}default:F(t)}}},ew=class extends ln{constructor(e){super(),this.services=e}getNameStrict(e){return N(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(bn(e))return e.name;if(Vp(e))return e.imported.$refText;if(Gd(e))return e.target.modelElement.value.$refText}getNameNode(e){if(bn(e))return super.getNameNode(e);if(Vp(e))return e.imported.$refNode;if(Gd(e))return e.target.modelElement.value.$refNode}};function tw(e){return T(e,be(e=>`${e.type}.${e.name}`),Ke(),w(([e,t])=>t.length===1?t:[]))}var nw=class extends Tn{constructor(e){super(e)}async computeExports(e,t){let n=[];try{let{specifications:t,models:r,views:i,globals:a,likec4lib:o,deployments:s}=e.parseResult.value;this.exportLibrary(o,n,e),this.exportSpecification(t,n,e),this.exportModel(r,n,e),this.exportViews(i,n,e),this.exportGlobals(a,n,e),this.exportDeployments(s,n,e)}catch(e){q(e)}return n}exportViews(e,t,n){let r=e?.flatMap(e=>e.views);if(!(v(r)||r.length===0))for(let e of r)try{y(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}exportGlobals(e,t,n){if(!(v(e)||e.length===0)){for(let r of e.flatMap(e=>e.predicates))try{let e=r;y(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}for(let r of e.flatMap(e=>e.styles))try{let e=r.id;y(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}}exportModel(e,t,n){if(!(v(e)||e.length===0))for(let r of e.flatMap(e=>e.elements))try{kf(r)&&y(r.name)&&t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){q(e)}}exportLibrary(e,t,n){if(!v(e))try{for(let r of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(r,r.name,n))}catch(e){q(e)}}exportSpecification(e,t,n){if(!(v(e)||e.length===0))for(let r of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case ah(r):case sh(r):y(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case _h(r):y(r.tag.name)&&t.push(this.descriptions.createDescription(r.tag,r.tag.name,n));continue;case dh(r):y(r.kind.name)&&t.push(this.descriptions.createDescription(r.kind,r.kind.name,n));continue;case rh(r):y(r.name.name)&&t.push(this.descriptions.createDescription(r.name,r.name.name,n));continue;default:F(r)}}catch(e){q(e)}}exportDeployments(e,t,n){let r=e?.flatMap(e=>e.elements);if(!(v(r)||r.length===0))for(let e of r)try{Yd(e)&&y(e.name)&&t.push(this.descriptions.createDescription(e,e.name,n))}catch(e){q(e)}}computeLocalScopes(e,t){return new Promise(t=>{let n=e.parseResult.value,r=[],i=new un;for(let t of n.models)try{r.push(...this.processContainer(t,i,e))}catch(e){q(e)}for(let t of n.deployments)try{r.push(...this.processDeployments(t,i,e))}catch(e){q(e)}for(let e of n.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)r.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){q(e)}tw(r).forEach(e=>{i.add(n,e)}),t(i)})}processContainer(e,t,n){let r=new un,i=[];for(let a of e.elements){if(Nm(a))continue;let e;if(kf(a)?(y(a.name)&&r.add(a.name,this.descriptions.createDescription(a,a.name,n)),e=a.body,e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))):np(a)&&(e=a.body),e&&e.elements.length>0)try{i.push(...this.processContainer(e,t,n))}catch(e){q(e)}}i.length&&T(i,S(e=>!r.has(e.name)),be(e=>e.name),pe((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}processDeployments(e,t,n){let r=new un,i=[];for(let a of e.elements){if(tf(a))continue;let e=a.body;if(!Qf(a)){let i=this.nameProvider.getName(a);if(y(i)){let e=this.descriptions.createDescription(a,i,n);r.add(i,e)}e&&(t.add(e,this.descriptions.createDescription(a,`this`,n)),t.add(e,this.descriptions.createDescription(a,`it`,n)))}if(e)try{i.push(...this.processDeployments(e,t,n))}catch(e){q(e)}}i.length&&T(i,S(e=>!r.has(e.name)),be(e=>e.name),pe((e,t)=>{e.length===1&&r.add(t,e[0])}));let a=[...r.values()];return t.addAll(e,a),a}};const{getDocument:rw}=En;var iw=class extends mr{deploymentsIndex;fqnIndex;indexManager;constructor(e){super(e),this.indexManager=e.shared.workspace.IndexManager,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex}getScope(e){try{let t=A_(e.container),n=this.reflection.getReferenceType(e);try{let r=e.container;if(gp(r))return new hr(this.streamForFqnRef(t,r,e));if(xh(r))return this.getScopeForStrictFqnRef(t,r,e);if(n!==Of)return this.getProjectScope(t,n,e);if(Vp(r)){let e=A_(r);return new hr(this.fqnIndex.rootElements(e))}if(yh(r)&&e.property===`el`){let i=r.parent;return i?new hr(this.fqnIndex.directChildrenOf(t,Xg(i))):this.getProjectScope(t,n,e)}return new hr(kn(this.computeScope(t,e)))}catch(r){return q(r),this.getProjectScope(t,n,e)}}catch(e){return q(e),wn}}*genUniqueDescedants(e){if(!e)return;let t=A_(e);if(kf(e)){let n=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,n);return}if(Yd(e)){let n=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,n)}}*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(Yg(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(Yg(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,n){let r=t.parent;return r?new hr(this.deploymentsIndex.directChildrenOf(e,Xg(r)).filter(e=>this.reflection.isSubtype(e.type,Jd))):this.getProjectScope(e,Jd,n)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&Yd(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,n){let r=t.parent;if(!r)return kn(this.genScopeForParentlessFqnRef(e,t,n));let i=r.value.ref;if(!i)return An;if(Vp(i))return kn(this.genUniqueDescedants(i.imported.ref));if(Yd(i))return kn(this.genUniqueDescedants(i));if(Gd(i)){let e=i.target.modelElement.value.ref,t=Vp(e)?e.imported.ref:kf(e)?e:void 0;return kn(this.genUniqueDescedants(t))}return kf(i)?kn(this.genUniqueDescedants(i)):F(i)}*genScopeForParentlessFqnRef(e,t,n){gn(t,Lf)||qg(t)?yield*this.computeScope(e,n,Of):Kg(t)?(yield*this.computeScope(e,n,Of),yield*this.computeScope(e,n,Jd),yield*this.computeScope(e,n,Wd)):(yield*this.computeScope(e,n,Jd),yield*this.computeScope(e,n,Wd),gn(t,cf)&&(yield*this.computeScope(e,n,Of)));let r=rw(t).precomputedScopes;r&&(yield*r.values().filter(e=>this.reflection.isSubtype(e.type,Bp)))}*computeScope(e,t,n=this.reflection.getReferenceType(t)){let r=this.reflection.isSubtype(n,Of),i=this.reflection.isSubtype(n,bu),a=rw(t.container).precomputedScopes;if(!a){yield*this.getProjectScope(e,n,t).getAllElements();return}let o=e=>this.reflection.isSubtype(e.type,n),s=t.container;for(;s;){let e=a.get(s).filter(o);e.length>0&&(yield*e),i&&ep(s)&&(yield*this.genScopeExtendDeployment(s.$container)),r&&ip(s)&&(yield*this.genScopeExtendElement(s.$container)),r&&qf(s)&&(yield*this.genScopeElementView(s.$container)),s=s.$container}yield*this.getProjectScope(e,n,t).getAllElements()}getProjectScope(e,t,n){return t===Jp?super.getGlobalScope(t,n):this.globalScopeCache.get(`${e}::${t}`,()=>new cn(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===Jp)return super.getGlobalScope(e,t);let n=A_(t.container);return this.getProjectScope(n,e,t)}},aw=Qn();let ow;(function(e){e.type=new aw.NotificationType(`likec4/onDidChangeModel`)})(ow||={});let sw;(function(e){e.type=new aw.NotificationType0(`likec4/onDidChangeProjects`)})(sw||={});let cw;(function(e){e.type=new aw.NotificationType(e.Method=`likec4/onDidChangeSnapshot`)})(cw||={});let lw;(function(e){e.type=new aw.NotificationType(`likec4/onRequestOpenView`)})(lw||={});let uw;(function(e){e.req=new aw.RequestType(`likec4/fetchComputedModel`)})(uw||={});let dw;(function(e){e.req=new aw.RequestType0(`likec4/fetchViewsFromAllProjects`)})(dw||={});let fw;(function(e){e.req=new aw.RequestType(`likec4/fetchLayoutedModel`)})(fw||={});let pw;(function(e){e.req=new aw.RequestType(`likec4/layout-view`)})(pw||={});let mw;(function(e){e.req=new aw.RequestType(`likec4/validate-layout`)})(mw||={});let hw;(function(e){e.req=new aw.RequestType0(`likec4/reload-projects`)})(hw||={});let gw;(function(e){e.req=new aw.RequestType0(`likec4/fetch-projects`)})(gw||={});let _w;(function(e){e.req=new aw.RequestType(`likec4/register-project`)})(_w||={});let vw;(function(e){e.req=new aw.RequestType(`likec4/build`)})(vw||={});let yw;(function(e){e.req=new aw.RequestType(`likec4/locate`)})(yw||={});let bw;(function(e){e.req=new aw.RequestType(`likec4/change-view`)})(bw||={});let xw;(function(e){e.req=new aw.RequestType0(`likec4/metrics`)})(xw||={});let Sw;(function(e){e.req=new aw.RequestType(`likec4/document-tags`)})(Sw||={});let Cw;(function(e){e.req=new aw.RequestType0(`likec4/fetch-projects-overview`)})(Cw||={});const Q=K.getChild(`rpc`);var ww=class extends hu{constructor(e){super(),this.services=e}init=re(()=>{let e=this.services.shared.lsp.Connection;if(!e){Q.info(`no connection, skip init ServerRpc`);return}Q.info(`init ServerRpc`);let t=this.services.likec4,n=this.services.shared.workspace,r=n.LangiumDocuments,i=n.DocumentBuilder,a=t=>{Q.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(ow.type,{projectId:t}).catch(e=>{Q.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},o=Se(e=>{if(typeof e==`string`){a(e);return}for(let t of e)a(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}),s=Se(t=>{t>1?Q.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:Q.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(sw.type).catch(e=>{Q.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),c=!0;this.onDispose(t.ModelBuilder.onModelParsed(e=>o.call(e)),n.ProjectsManager.onProjectsUpdate(()=>s.call(1)),e.onRequest(uw.req,async({projectId:e,cleanCaches:r=!1},i)=>{Q.debug`received request ${`fetchComputedModel`} for project ${e}`,r&&(Q.debug`cleanCaches: ${r}`,e?await n.ProjectsManager.rebuildProject(e):await n.WorkspaceManager.rebuildAll());let a=await t.ModelBuilder.computeModel(e,i);return a===Oc.EMPTY?{model:null}:{model:a.$data}}),e.onNotification(cw.type,async e=>{let t=_n.parse(e.update??e.delete),r=`update`in e?{update:t}:{delete:t};Q.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await n.ManualLayouts.handleFileSystemUpdate(r)}),e.onRequest(fw.req,async({projectId:e},n)=>{Q.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let r=await t.LanguageServices.layoutedModel(e);if(r===null)return{model:null};let i=await t.Views.diagrams(e,n);return{model:{...r.$data,_stage:`layouted`,views:ue(i,e=>e.id)}}}),e.onRequest(pw.req,async({viewId:e,projectId:n,layoutType:r},i)=>(Q.debug`received request ${`layoutView`} for ${e} from project ${n} (layout type: ${r??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:n,layoutType:r,cancelToken:i})})),e.onRequest(mw.req,async({projectId:e},n)=>(Q.debug`received request ${`validateLayout`} for project ${e}`,{result:l((await t.Views.layoutAllViews(e,n)).map(e=>e.diagram))})),e.onRequest(gw.req,async()=>(Q.debug`received request ${`FetchProjects`}`,{projects:ae(r.groupedByProject(),(e,t)=>{let{folderUri:r,config:{name:i,title:a}}=n.ProjectsManager.getProject(t);return{folder:r.toString(),config:{name:i,title:a},docs:b(e,e=>e.uri.toString())}})})),e.onRequest(hw.req,async e=>{Q.debug`received request ${`ReloadProjects`}`,n.ManualLayouts.clearCaches(),await n.ProjectsManager.reloadProjects(e)}),e.onRequest(_w.req,async(e,t)=>{Q.debug`received request ${`RegisterProject`}`,n.ManualLayouts.clearCaches();let r;return r=`configUri`in e?await n.ProjectsManager.registerConfigFile(_n.parse(e.configUri),t):await n.ProjectsManager.registerProject(e,t),{id:r.id}}),e.onRequest(dw.req,async e=>{Q.debug`received request ${`FetchViewsFromAllProjects`}`;let r=[];for(let i of n.ProjectsManager.all){await vn(e);try{let n=await t.Views.computedViews(i,e);r.push(...T(n,b(e=>({id:e.id,title:e.title??e.id,projectId:i})),De((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){Q.warn(`Failed to fetch views for project ${i}:`,{error:e})}}return{views:r}}),e.onRequest(vw.req,async({docs:t},n)=>{let a=t.map(e=>_n.parse(e)),o=r.userDocuments.map(e=>e.uri).filter(e=>!a.some(t=>mn.equals(t,e))).toArray();Q.debug(`[ServerRpc] received request to build:
1239
1240
  changed (total ${a.length}):${t.map(e=>`
1240
1241
  - `+e).join(``)}
1241
1242
  deleted (total ${o.length}):${o.map(e=>`
1242
1243
  - `+e.toString()).join(`
1243
- `)}`),!s&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),s=!1,await sn(n),await i.update(a,o,n)}),e.onRequest(ww.req,e=>{Q.debug`received request ${`locate`}, ${e}`;let n=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,n);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,n);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:n});case`view`in e:return t.ModelLocator.locateView(e.view,n);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,n);default:F(e)}}),e.onRequest(Tw.req,async(e,r)=>{Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`;let i=await t.ModelChanges.applyChange(e),a=e.change.op;return e.projectId&&(a===`save-view-snapshot`||a===`reset-manual-layout`)&&await n.ProjectsManager.rebuildProject(e.projectId,r),i}),e.onRequest(Ew.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===Lc.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=ee(n.specification.elements).length,r.deploymentKinds+=ee(n.specification.deployments).length,r.relationshipKinds+=ee(n.specification.relationships).length,r.tags+=ee(n.specification.tags).length,r.customColors+=ee(n.specification.customColors??{}).length,r.elements+=ee(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=ee(n.$data.relations).length,r.views+=ee(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await sn(e),{metrics:r}}),e.onRequest(Dw.req,async({documentUri:e},r)=>{let i=fn.parse(e);Q.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(Ow.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Gn.create(()=>{a.cancel()}));function c(e){return w(e,S(e=>!!e.hasLayoutDrift),y(e=>{let n=t.ModelLocator.locateView(e.id);return P(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Yx.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(mw.type,e)}};Bn();var Aw=class{constructor(e){this.services=e}getSymbolKind(e){let t=on(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Vf,mp,cf,rf,$p):return Zn.Constructor;case n(Tm,km,Dm,Ip,Dh):return Zn.Namespace;case n(id):return Zn.Class;case n(`Tag`,sm,Qd,kh):return Zn.EnumMember;case n(rh,Ch):return Zn.Event;case n(Gf,ff,yh,_h):return Zn.TypeParameter}return Zn.Field}getCompletionItemKind(e){let t=on(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Qd):return D.Color;case n(Vf,cf,rf,mp,$p):return D.Constructor;case n(Tm,km,Dm,Ip,Dh):return D.Module;case n(id):return D.Class;case n(`Tag`,sm,Qd,kh):return D.EnumMember;case n(rh,Ch):return D.Event;case n(Gf,yh,ff,_h):return D.TypeParameter;default:return D.Reference}}},jw=class extends er{};const Mw=K.getChild(`views`);var Nw=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.cache=new WeakMap})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Ye((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Ye(e.$data.views);if(n.length===0)return[];let r=G_(),i=e.project.id,a=Mw.getChild(i);a.debug`layoutAll: ${n.length} views`;let o=[],s=e.$styles,c=[];for(let e of n){let t=this.cache.get(e);if(t){a.debug`layout ${e.id} from cache`,c.push(t);continue}o.push({view:e,styles:s})}return o.length>0&&await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(t,n)=>{c.push(this.viewSucceed(t.view,e,n))},onError:(e,t)=>{a.warn(`Fail layout view ${e.view.id}`,{error:t})}}),t&&t.isCancellationRequested&&await sn(t),c.length===n.length?c.length>0&&a.debug`layouted all ${c.length} views in ${r.pretty}`:a.warn`layouted ${c.length} of ${n.length} views in ${r.pretty}`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=Mw.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}try{let n=G_(),r=this.cache.get(a)??await this.layouter.layout({view:a,styles:i.$styles});return this.cache.has(a)?o.debug`layout ${e} from cache`:(this.viewSucceed(a,i,r),o.debug(`layout {viewId} in ${n.pretty}`,{viewId:e})),C(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,i,t)}:r}catch(e){let t=U(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Ye(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):q(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){Mw.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=Px(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return Mw.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){let r=`${t}-${e.id}`;this.cache.delete(e),this.viewsWithReportedErrors.has(r)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`),this.viewsWithReportedErrors.add(r))}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[Ga]===`manual`?(Mw.error(`View ${e.id} already has manual layout, this should not happen`),e):Yo(e,r):Qo(e,r):e}viewSucceed(e,t,n){let r=`${t.project.id}-${e.id}`;return this.viewsWithReportedErrors.delete(r),this.cache.set(e,n),n}};const Pw={graphviz(){return new mc}};function Fw(e){return{graphviz(){return e}}}function Iw(e){return{lsp:{NodeKindProvider:e=>new Aw(e),WorkspaceSymbolProvider:e=>new jw(e)},workspace:{Cache:e=>new In(e,Yn.Validated),IndexManager:e=>new l_(e),LangiumDocuments:e=>new M_(e),ProjectsManager:e=>new lv(e),WorkspaceManager:e=>new uv(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function $(e){return t=>new e(t)}function Lw(e){return{documentation:{DocumentationProvider:$(oy)},validation:{DocumentValidator:$(yC)},Rpc:$(kw),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:$(Lx),Graphviz:t=>e.graphviz(t),Layouter:e=>new yc({graphviz:e.likec4.Graphviz}),Views:$(Nw),DeploymentsIndex:$(lS),ModelChanges:$(iw),FqnIndex:$(aS),ModelParser:$(JC),ModelBuilder:$(ES),ModelLocator:$(NS),LastSeen:$(pS)},lsp:{CompletionProvider:$(Vx),DocumentHighlightProvider:$(Ux),DocumentSymbolProvider:$(Kx),SemanticTokenProvider:$(rS),HoverProvider:$(Jx),CodeLensProvider:$(Rx),DocumentLinkProvider:$(Wx),Formatter:$(dy),CodeActionProvider:$(Xx)},workspace:{AstNodeDescriptionProvider:$(c_)},references:{NameProvider:$(aw),ScopeComputation:$(sw),ScopeProvider:$(lw)},parser:{ValueConverter:$(YC)}}}function Rw(e={},t,n,r){let i=zw(e),a=Nn([Kn({shared:i}),Fg,Lw({...t_,...Jg,...Yg,...Pw,...e}),t,n,r].reduce(Bw,{}));return i.ServiceRegistry.register(a),CC(a),e.connection?ya(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function zw(e={}){let t={...t_,...Jg,...Yg,...e};return Nn(Pn(t),Pg,Iw(t))}function Bw(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=Bw(t,r):e[n]=r}}return e}Bn();var Vw=class{langium;logger;constructor(e,t=hs){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:
1244
+ `)}`),!c&&a.length+o.length>0&&await Promise.allSettled([...a,...o].map(async t=>{let n=t.toString();Q.debug(`clear diagnostics for ${n}`);try{await e.sendDiagnostics({uri:n,diagnostics:[]})}catch(e){Q.warn(`error clearing diagnostics for ${n}: ${e}`)}})),c=!1,await vn(n),await i.update(a,o,n)}),e.onRequest(yw.req,e=>{Q.debug`received request ${`locate`}, ${e}`;let n=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,n);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,n);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:n});case`view`in e:return t.ModelLocator.locateView(e.view,n);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,n);default:F(e)}}),e.onRequest(bw.req,async e=>(Q.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(xw.req,async e=>{let r=null;for(let i of n.ProjectsManager.all)try{let n=await t.ModelBuilder.computeModel(i,e);if(n===Oc.EMPTY)continue;r??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},r.elementKinds+=te(n.specification.elements).length,r.deploymentKinds+=te(n.specification.deployments).length,r.relationshipKinds+=te(n.specification.relationships).length,r.tags+=te(n.specification.tags).length,r.customColors+=te(n.specification.customColors??{}).length,r.elements+=te(n.$data.elements).length,r.deploymentNodes+=[...n.deployment.nodes()].length,r.relationships+=te(n.$data.relations).length,r.views+=te(n.$data.views).length,r.projects+=1}catch(e){Q.warn(`Error fetching telemetry metrics for project ${i}`,{err:e})}return await vn(e),{metrics:r}}),e.onRequest(Sw.req,async({documentUri:e},r)=>{let i=_n.parse(e);Q.debug`received request ${`GetDocumentTags`} for document ${i}`;let a=await t.ModelLocator.locateDocumentTags(i,r);return{projectId:n.ProjectsManager.ownerProjectId(i),tags:a??[]}}),e.onRequest(Cw.req,async e=>(Q.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})),Wn.create(()=>{o.cancel()}));function l(e){return T(e,S(e=>!!e.hasLayoutDrift),b(e=>{let n=t.ModelLocator.locateView(e.id);return P(n,`View ${e.id} not found`),{uri:n.uri,viewId:e.id,severity:Zx.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:n.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){Q.warn(`No LSP connection`);return}await t.sendNotification(lw.type,e)}};ir();var Tw=class{constructor(e){this.services=e}getSymbolKind(e){let t=dr(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(Of,tp,Jd,Wd,Bp):return zn.Constructor;case n(fm,gm,mm,Cp,mh):return zn.Namespace;case n(Uu):return zn.Class;case n(`Tag`,Jp,zd,gh):return zn.EnumMember;case n(Wm,uh):return zn.Event;case n(Mf,Qd,oh,ih):return zn.TypeParameter}return zn.Field}getCompletionItemKind(e){let t=dr(e)?e.$type:e.type,n=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case n(zd):return Kn.Color;case n(Of,Jd,Wd,tp,Bp):return Kn.Constructor;case n(fm,gm,mm,Cp,mh):return Kn.Module;case n(Uu):return Kn.Class;case n(`Tag`,Jp,zd,gh):return Kn.EnumMember;case n(Wm,uh):return Kn.Event;case n(Mf,oh,Qd,ih):return Kn.TypeParameter;default:return Kn.Reference}}},Ew=class extends tr{};const Dw=K.getChild(`views`);var Ow=class{#e;#t=new E.default(e=>new kw({projectId:e,storage:Xr(this.#e,e),layouter:this.layouter.layout.bind(this.layouter)}));ModelBuilder;constructor(e){this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Zr(),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{Dw.info`force clean cache`,this.#e.clear()})}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){return Xe((await this.ModelBuilder.computeModel(e,t)).$data.views)}async _layoutAllViews(e,t){let n=Xe(e.$data.views);if(n.length===0)return[];let r=e.project.id,i=Dw.getChild(r),a=this.projectStorage(r),o=[],s=e.$styles,c=[];for(let e of n){let t={view:e,styles:s},n=await a.get(t);if(n){c.push(n);continue}o.push(t)}if(o.length>0){let e=P_();await this.layouter.batchLayout({batch:o,cancelToken:t,onSuccess:(e,t)=>{c.push(a.remember(e,t))},onError:(e,t)=>{i.warn(`Fail layout view ${e.view.id}`,{error:t})}}),i.trace`layouted ${o.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await vn(t),c.length!==n.length&&i.warn`layouted ${c.length} of ${n.length} views`,c}async layoutAllViews(e,t){let n=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(n,t)}async layoutView({viewId:e,layoutType:t,projectId:n,cancelToken:r}){let i=await this.ModelBuilder.computeModel(n,r),a=i.findView(e)?.$view;n=i.project.id;let o=Dw.getChild(n);if(!a){o.warn`layoutView ${e} not found`;let t=i.findManualLayout(e);if(t){o.debug`found manual layout for ${e}`;let n={...t};return n.drifts=[`not-exists`],n._layout=`manual`,{diagram:n,dot:`# manual layout`}}return null}let s=this.projectStorage(n);try{let e={view:a,styles:i.$styles},n=await s.getOrExecute(e);return y(t)?{dot:n.dot,diagram:this.withLayoutType(n.diagram,i,t)}:n}catch(e){let t=U(e);return o.warn(t),this.reportViewError(a,n,t),Promise.reject(e)}}async diagrams(e,t){let n=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(n,t)).map(({diagram:e})=>this.withLayoutType(e,n,`manual`))}async viewsAsGraphvizOut(e,t){let n=`All-LayoutedViews-DotWithSvg`,r=this.services.shared.workspace.Cache;if(r.has(n))return await Promise.resolve(r.get(n));let i=await this.ModelBuilder.computeModel(e,t),a=Xe(i.$data.views);if(a.length===0)return[];let o=a.map(async e=>{let{dot:t,svg:n}=await this.layouter.svg({view:e,styles:i.$styles});return{id:e.id,dot:t,svg:n}}),s=[],c=await Promise.allSettled(o);for(let e of c)e.status===`fulfilled`?s.push(e.value):q(e.reason);return r.set(n,s),s}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){Dw.debug`layouting adhoc view...`;let n=await this.ModelBuilder.computeModel(t),r=Fx(n,e),{diagram:i}=await this.layouter.layout({view:{...r,hash:``,_type:`element`},styles:n.$styles});return Dw.debug`layouting adhoc view... done`,i}reportViewError(e,t,n){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${n}`)})}withLayoutType(e,t,n){if(!n)return e;let r=t.findManualLayout(e.id);return r?n===`manual`?e[Wa]===`manual`?(Dw.error(`View ${e.id} already has manual layout, this should not happen`),e):Yo(e,r):Qo(e,r):e}projectStorage(e){return this.#t.get(e)}},kw=class{#e;#t;#n;#r;constructor(e){this.#e=Dw.getChild(e.projectId),this.#t=e.projectId,this.#n=e.storage,this.#r=e.layouter}async get(e){let t=Aw(e),n=await this.#n.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,jw(e.view,n);K.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=Aw(e),n=await this.#n.get(t);if(n)return this.#e.trace`cache hit for ${e.view.id}`,jw(e.view,n);K.trace`cache miss for ${e.view.id}`;let r=P_(),i=await this.#r(e);return K.trace(`layouted {view} in ${r.pretty}`,{view:e.view.id}),await this.#n.set(t,i),this.resetViewError(e.view),i}remember=(e,t)=>{let n=Aw(e);return t&&(this.#n.set(n,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let n=`error-${e.id}`;this.#n.has(n).then(e=>{e||(this.#n.set(n,`true`),t())})}resetViewError(e){this.#n.del(`error-${e.id}`)}};function Aw(e){return`${e.view.hash}-${e.styles.fingerprint}`}function jw(e,t){return{dot:t.dot,diagram:Bo(e,t.diagram)}}const Mw={graphviz(){return new ac}};function Nw(e){return{graphviz(){return e}}}function Pw(e){return{lsp:{NodeKindProvider:e=>new Tw(e),WorkspaceSymbolProvider:e=>new Ew(e)},workspace:{Cache:e=>new gr(e,on.Validated),IndexManager:e=>new n_(e),LangiumDocuments:e=>new a_(e),ProjectsManager:e=>new w_(e),WorkspaceManager:e=>new k_(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function $(e){return t=>new e(t)}function Fw(e){return{documentation:{DocumentationProvider:$(sy)},validation:{DocumentValidator:$(mC)},Rpc:$(ww),mcp:{Server:t=>e.mcpServer(t),ServerFactory:t=>e.mcpServerFactory(t)},likec4:{LanguageServices:$(Rx),Graphviz:t=>e.graphviz(t),Layouter:e=>new uc({graphviz:e.likec4.Graphviz}),Views:$(Ow),DeploymentsIndex:$(dS),ModelChanges:$($C),FqnIndex:$(sS),ModelParser:$(WC),ModelBuilder:$(bS),ModelLocator:$(DS),LastSeen:$(hS)},lsp:{CompletionProvider:$(Ux),DocumentHighlightProvider:$(Gx),DocumentSymbolProvider:$(Jx),SemanticTokenProvider:$(aS),HoverProvider:$(Xx),CodeLensProvider:$(Bx),DocumentLinkProvider:$(Kx),Formatter:$(fy),CodeActionProvider:$(Qx)},workspace:{AstNodeDescriptionProvider:$(t_)},references:{NameProvider:$(ew),ScopeComputation:$(nw),ScopeProvider:$(iw)},parser:{ValueConverter:$(GC)}}}function Iw(e={},t,n,r){let i=Lw(e),a=Mn([Gn({shared:i}),Og,Fw({...av,...Q_,...$_,...Mw,...e}),t,n,r].reduce(Rw,{}));return i.ServiceRegistry.register(a),vC(a),e.connection?xa(()=>a.Rpc.init()):i.workspace.ConfigurationProvider.initialized({}),{shared:i,likec4:a}}function Lw(e={}){let t={...av,...Q_,...$_,...e};return Mn(Nn(t),Dg,Pw(t))}function Rw(e,t){if(t){for(let[n,r]of Object.entries(t))if(r!==void 0){let t=e[n];t!==null&&r!==null&&typeof t==`object`&&typeof r==`object`?e[n]=Rw(t,r):e[n]=r}}return e}const zw=e=>e.severity===1,Bw=e=>{let t=e.split(`
1245
+ `);return t.length>5&&(t.length=5,t.push(`...`)),t.join(`
1246
+ `)};var Vw=class{langium;logger;constructor(e,t=hs){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:
1244
1247
  ${e.map(e=>` - ${e.folder.fsPath}`).join(`
1245
1248
  `)}
1246
1249
 
1247
- 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)}projects(){return y(this.languageServices.projects(),x(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return this.LangiumDocuments.all.toArray().flatMap(e=>(e.diagnostics??[]).filter(e=>e.severity===ar.Error).map(({message:t,range:n})=>({message:t,line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.all.some(e=>e.diagnostics?.some(e=>e.severity===ar.Error)??!1)}printErrors(){let e=!1;for(let t of this.LangiumDocuments.all){let n=t.diagnostics?.filter(e=>e.severity===1);if(n&&n.length>0){e=!0;let r=n.flatMap(e=>{let t=e.range.start.line,n=e.message.split(`
1248
- `);return n.length>10&&(n.length=10,n.push(`...`)),n.map((e,n)=>n===0?` `+Qr.dim(`Line ${t}: `)+Qr.red(e):` `.repeat(10)+Qr.red(e))}).join(`
1249
- `);this.logger.error(`Invalid ${t.uri.fsPath}\n${r}`)}}return e}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(()=>e());return()=>{t.dispose()}}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const Hw={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,mcp:!1,configureLogger:!1,logLevel:void 0},Uw=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
1250
- `)}`);async function Ww(e,t=hs,n){let r=new Vw(e,t);return(n?.throwIfInvalid??Hw.throwIfInvalid)===!0&&r.hasErrors()?(await r.dispose(),Promise.reject(Uw(r))):((n?.printErrors??Hw.printErrors)&&r.hasErrors()&&r.printErrors(),r)}function Gw(e){let t=e?.configureLogger??`console`;if(t!==!1){if(t===`stderr`||e?.mcp===`stdio`){vl({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}vl({colors:ui,logLevel:e?.logLevel})}}function Kw(e){let t=hs.getChild(`lang`),n=bt(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`,mcp:!1}),r=n.graphviz===`binary`;t.info(`${Qr.dim(`layout`)} ${r?`binary`:`wasm`}`);let i=Rw({...n.useFileSystem?{...$g(n.watch),...n.manualLayouts?Ou:Yg}:{...Jg,...Yg},...n.mcp?ay(n.mcp===`stdio`?`stdio`:n.mcp):{},...Fw(r?new gl:new mc)});return typeof n.mcp==`object`&&n.mcp.port&&i.likec4.mcp.Server.start(n.mcp.port).catch(e=>{t.error(U(e))}),n.mcp===`stdio`&&i.likec4.mcp.Server.start().catch(e=>{t.error(U(e))}),i}async function qw(e,t){Gw(t);let n=Xr(e),r=Hr(li(n).toString());return R(globalThis,`likec4:`+n,async()=>{let e=hs.getChild(`lang`),i=Kw(bt(t,{...Hw,useFileSystem:!0,manualLayouts:!0,watch:!1,mcp:!1})),a={name:Zr(n),uri:r},o=i.shared.workspace.WorkspaceManager;e.info(`${Qr.dim(`workspace:`)} ${n}`),o.initialize({capabilities:{},processId:null,rootUri:null,workspaceFolders:[a]}),await o.initializeWorkspace([a]);let s=i.shared.workspace.LangiumDocuments.userDocuments.toArray();if(s.length===0&&(e.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw Error(`no LikeC4 sources found`);return e.info(`${Qr.dim(`workspace:`)} found ${s.length} source files`),Ww(i,hs,t)})}$r(ei({meta:{name:`likec4-mcp-server`,description:`LikeC4 MCP server`},args:{stdio:{type:`boolean`,description:`use stdio transport (this is default)`,required:!1},http:{type:`boolean`,description:`use streamable http transport`,required:!1},port:{type:`string`,description:`change http port (default: 33335)`,valueHint:`number`,required:!1},graphviz:{type:`enum`,options:[`binary`,`wasm`],description:`use binary or wasm graphviz`,default:`wasm`,required:!1},watch:{type:`boolean`,description:`disable watch for changes (consume less resources if you have static workspace)`,default:!0,required:!1},workspace:{type:`positional`,description:`change workspace, defaults to current directory, can be set by LIKEC4_WORKSPACE env`,valueHint:`directory`,required:!1,default:process.env.LIKEC4_WORKSPACE||`.`},logLevel:{type:`enum`,options:[`trace`,`debug`,`info`,`warning`,`error`],description:`change log level`,required:!1}},setup({args:e}){if(e.stdio&&(e.http||e.port))throw Error(`stdio and http are mutually exclusive`)},async run({args:e}){let t=e.stdio||!e.http&&!e.port;vl({useStdErr:t,colors:Qr.isColorSupported,logLevel:e.logLevel}),process.on(`uncaughtException`,e=>{hs.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{hs.error(`unhandledRejection`,{err:e})});let n=e.port?parseInt(e.port):33335,r=ri(e.workspace||`.`);hs.info`Loading LikeC4 from workspace: ${r}`,e.watch&&hs.warn`watch for changes enabled, use ${`--no-watch`} to consume less resources`,await qw(r,{graphviz:e.graphviz,mcp:t?`stdio`:{port:n},configureLogger:!1,watch:e.watch})}})).catch(e=>{hs.error(e),process.exit(1)});export{};
1250
+ 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)}projects(){return b(this.languageServices.projects(),x(`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(zw)??[]).map(({message:t,range:n})=>({message:Bw(t),line:n.start.line,range:n,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.userDocuments.some(e=>e.diagnostics&&e.diagnostics.some(zw))}printErrors(){let e=!1;for(let t of this.LangiumDocuments.userDocuments){let n=t.diagnostics?.filter(zw)??[];if(!C(n,1))continue;e=!0;let r=T(n,w(e=>{let t=e.range.start.line;return Bw(e.message).split(`
1251
+ `).map((e,n)=>n===0?` `+ei.dim(`Line ${t}: `)+ei.red(e):` `.repeat(10)+ei.red(e))}),Le(`
1252
+ `));this.logger.error(`Invalid ${t.uri.fsPath}\n${r}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(()=>e());return()=>{t.dispose()}}async format(e){let{projects:t,...n}=e??{},r={...n,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(r)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const Hw={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,mcp:!1,configureLogger:!1,logLevel:void 0},Uw=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
1253
+ `)}`);async function Ww(e,t=hs,n){let r=new Vw(e,t);return(n?.throwIfInvalid??Hw.throwIfInvalid)===!0&&r.hasErrors()?(await r.dispose(),Promise.reject(Uw(r))):((n?.printErrors??Hw.printErrors)&&r.hasErrors()&&r.printErrors(),r)}function Gw(e){let t=e?.configureLogger??!1;if(t!==!1){if(t===`stderr`||e?.mcp===`stdio`){ll({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}ll({colors:fi,logLevel:e?.logLevel})}}function Kw(e){let t=hs.getChild(`lang`),n=bt(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`,mcp:!1}),r=n.graphviz===`binary`;t.info(`${ei.dim(`layout`)} ${r?`binary`:`wasm`}`);let i=Iw({...n.useFileSystem?{...rv(n.watch),...n.manualLayouts?V_:$_}:{...Q_,...$_},...n.mcp?oy(n.mcp===`stdio`?`stdio`:n.mcp):{},...Nw(r?new sl:new ac)});return typeof n.mcp==`object`&&n.mcp.port&&i.likec4.mcp.Server.start(n.mcp.port).catch(e=>{t.error(U(e))}),n.mcp===`stdio`&&i.likec4.mcp.Server.start().catch(e=>{t.error(U(e))}),i}async function qw(e,t){let n=Qr(e),r=Ir(di(n).toString());return R(globalThis,`likec4:`+n,async()=>{let e=hs.getChild(`lang`),i=bt(t,{...Hw,useFileSystem:!0,manualLayouts:!0,watch:!1,mcp:!1});Gw(i);let a=Kw(i),o={name:$r(n),uri:r},s=a.shared.workspace.WorkspaceManager;e.info(`${ei.dim(`workspace:`)} ${n}`),s.initialize({capabilities:{},processId:null,rootUri:null,workspaceFolders:[o]}),await s.initializeWorkspace([o]);let c=a.shared.workspace.LangiumDocuments.userDocuments.toArray();if(c.length===0&&(e.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw Error(`no LikeC4 sources found`);return e.info(`${ei.dim(`workspace:`)} found ${c.length} source files`),Ww(a,hs,t)})}ti(ni({meta:{name:`likec4-mcp-server`,description:`LikeC4 MCP server`},args:{stdio:{type:`boolean`,description:`use stdio transport (this is default)`,required:!1},http:{type:`boolean`,description:`use streamable http transport`,required:!1},port:{type:`string`,description:`change http port (default: 33335)`,valueHint:`number`,required:!1},graphviz:{type:`enum`,options:[`binary`,`wasm`],description:`use binary or wasm graphviz`,default:`wasm`,required:!1},watch:{type:`boolean`,description:`disable watch for changes (consume less resources if you have static workspace)`,default:!0,required:!1},workspace:{type:`positional`,description:`change workspace, defaults to current directory, can be set by LIKEC4_WORKSPACE env`,valueHint:`directory`,required:!1,default:process.env.LIKEC4_WORKSPACE||`.`},logLevel:{type:`enum`,options:[`trace`,`debug`,`info`,`warning`,`error`],description:`change log level`,required:!1}},setup({args:e}){if(e.stdio&&(e.http||e.port))throw Error(`stdio and http are mutually exclusive`)},async run({args:e}){let t=e.stdio||!e.http&&!e.port;ll({useStdErr:t,colors:ei.isColorSupported,logLevel:e.logLevel}),process.on(`uncaughtException`,e=>{hs.error(`uncaughtException`,{err:e})}),process.on(`unhandledRejection`,e=>{hs.error(`unhandledRejection`,{err:e})});let n=e.port?parseInt(e.port):33335,r=ai(e.workspace||`.`);hs.info`Loading LikeC4 from workspace: ${r}`,e.watch&&hs.warn`watch for changes enabled, use ${`--no-watch`} to consume less resources`,await qw(r,{graphviz:e.graphviz,mcp:t?`stdio`:{port:n},configureLogger:!1,watch:e.watch})}})).catch(e=>{hs.error(e),process.exit(1)});export{};