worldorbit 3.0.7 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/browser/core/dist/atlas-edit.js +5 -1
  2. package/dist/browser/core/dist/atlas-validate.js +1 -1
  3. package/dist/browser/core/dist/draft-parse.js +16 -9
  4. package/dist/browser/core/dist/draft.d.ts +1 -0
  5. package/dist/browser/core/dist/draft.js +4 -2
  6. package/dist/browser/core/dist/format.js +5 -3
  7. package/dist/browser/core/dist/load.js +7 -2
  8. package/dist/browser/core/dist/normalize.js +36 -0
  9. package/dist/browser/core/dist/parse.js +54 -0
  10. package/dist/browser/core/dist/scene.js +1 -0
  11. package/dist/browser/core/dist/types.d.ts +21 -1
  12. package/dist/unpkg/core/dist/atlas-edit.js +5 -1
  13. package/dist/unpkg/core/dist/atlas-validate.js +1 -1
  14. package/dist/unpkg/core/dist/draft-parse.js +16 -9
  15. package/dist/unpkg/core/dist/draft.d.ts +1 -0
  16. package/dist/unpkg/core/dist/draft.js +4 -2
  17. package/dist/unpkg/core/dist/format.js +5 -3
  18. package/dist/unpkg/core/dist/load.js +7 -2
  19. package/dist/unpkg/core/dist/normalize.js +36 -0
  20. package/dist/unpkg/core/dist/parse.js +54 -0
  21. package/dist/unpkg/core/dist/scene.js +1 -0
  22. package/dist/unpkg/core/dist/types.d.ts +21 -1
  23. package/dist/unpkg/worldorbit-core.min.js +9 -9
  24. package/dist/unpkg/worldorbit-editor.min.js +219 -219
  25. package/dist/unpkg/worldorbit-markdown.min.js +19 -19
  26. package/dist/unpkg/worldorbit-viewer.min.js +203 -203
  27. package/dist/unpkg/worldorbit.js +118 -14
  28. package/dist/unpkg/worldorbit.min.js +191 -191
  29. package/package.json +1 -1
  30. package/packages/core/dist/atlas-edit.js +5 -1
  31. package/packages/core/dist/atlas-validate.js +1 -1
  32. package/packages/core/dist/draft-parse.js +16 -9
  33. package/packages/core/dist/draft.d.ts +1 -0
  34. package/packages/core/dist/draft.js +4 -2
  35. package/packages/core/dist/format.js +5 -3
  36. package/packages/core/dist/load.js +7 -2
  37. package/packages/core/dist/normalize.js +36 -0
  38. package/packages/core/dist/parse.js +54 -0
  39. package/packages/core/dist/scene.js +1 -0
  40. package/packages/core/dist/types.d.ts +21 -1
@@ -1,12 +1,12 @@
1
- "use strict";var WorldOrbitCore=(()=>{var lt=Object.defineProperty;var jr=Object.getOwnPropertyDescriptor;var xr=Object.getOwnPropertyNames;var kr=Object.prototype.hasOwnProperty;var Or=(e,t)=>{for(var n in t)lt(e,n,{get:t[n],enumerable:!0})},Sr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of xr(t))!kr.call(e,i)&&i!==n&&lt(e,i,{get:()=>t[i],enumerable:!(r=jr(t,i))||r.enumerable});return e};var Pr=e=>Sr(lt({},"__esModule",{value:!0}),e);var ps={};Or(ps,{WORLDORBIT_FIELD_KEYS:()=>Wt,WORLDORBIT_FIELD_SCHEMAS:()=>ut,WORLDORBIT_OBJECT_TYPES:()=>ge,WorldOrbitError:()=>d,cloneAtlasDocument:()=>at,createDiagnostic:()=>Kt,createEmptyAtlasDocument:()=>Lt,detectWorldOrbitSchemaVersion:()=>Nt,diagnosticFromError:()=>A,evaluateSpatialSceneAtTime:()=>xn,extractWorldOrbitBlocks:()=>gr,formatAtlasDocument:()=>Ze,formatDocument:()=>Je,formatDraftDocument:()=>$t,getAtlasDocumentNode:()=>Ft,getFieldSchema:()=>T,isKnownFieldKey:()=>dt,listAtlasDocumentPaths:()=>ar,load:()=>us,loadWorldOrbitSource:()=>st,loadWorldOrbitSourceWithDiagnostics:()=>Ct,materializeAtlasDocument:()=>Oe,materializeDraftDocument:()=>Pn,normalizeDocument:()=>W,normalizeWithDiagnostics:()=>Xt,parse:()=>yr,parseSafe:()=>ds,parseWithDiagnostics:()=>_e,parseWorldOrbit:()=>Z,parseWorldOrbitAtlas:()=>rt,parseWorldOrbitDraft:()=>Kn,removeAtlasDocumentNode:()=>sr,render:()=>ls,renderDocumentToScene:()=>q,renderDocumentToSpatialScene:()=>jn,resolveAtlasDiagnosticPath:()=>_t,resolveAtlasDiagnostics:()=>Rt,rotatePoint:()=>sn,stringify:()=>fs,supportsObjectType:()=>ft,tokenizeLine:()=>Yt,tokenizeLineDetailed:()=>ae,unitFamilyAllowsUnit:()=>ye,updateAtlasDocumentNode:()=>or,upgradeDocumentToDraftV2:()=>Xe,upgradeDocumentToV2:()=>ke,upsertAtlasDocumentNode:()=>Et,validateAtlasDocumentWithDiagnostics:()=>cr,validateDocument:()=>Y,validateDocumentWithDiagnostics:()=>Zt});var d=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var he=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],R=he.filter(e=>e!=="system"),Dr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Ut=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Tr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function I(e,t){return{key:e,...t}}var ge=new Set(he),ut=new Map([I("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),I("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),I("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),I("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),I("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),I("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("at",{kind:"string",placement:!0,arity:"single",objectTypes:Ut}),I("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Ut}),I("free",{kind:"string",placement:!0,arity:"single",objectTypes:Tr}),I("kind",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("class",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("culture",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:he}),I("color",{kind:"string",placement:!1,arity:"single",objectTypes:he}),I("image",{kind:"string",placement:!1,arity:"single",objectTypes:Dr}),I("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:he}),I("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"radius"}),I("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"mass"}),I("density",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),I("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),I("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),I("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:R}),I("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),I("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("on",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("source",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"duration"})].map(e=>[e.key,e])),Wt=new Set(ut.keys());function T(e){return ut.get(e)}function dt(e){return Wt.has(e)}function ft(e,t){return e.objectTypes.includes(t)}function ye(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function Yt(e){return ae(e).map(t=>t.value)}function ae(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,s=!1,c=!1,o=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:s}),i="",a=null,s=!1)};for(let u=0;u<e.length;u++){let f=e[u],p=r+u+1;if(c&&f==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(f==='"'){c?c=!1:(a===null&&(a=p),s=!0,o=p,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}a===null&&(a=p),i+=f}if(c)throw new d("Unclosed quote in line",t.line,o??r+e.length);return l(),n}function Fe(e){return e.match(/^\s*/)?.[0].length??0}function Z(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,a=null;for(let s=0;s<t.length;s++){let c=t[s],o=s+1;if(!c.trim())continue;let l=Fe(c),u=ae(c.slice(l),{line:o,columnOffset:l});if(u.length!==0){if(l===0){i=!1,a=null;let f=Mr(u,o);n.push(f),r=f;continue}if(!r)throw new d("Indented line without parent object",o,l+1);if(u.length===1&&u[0].value==="info"){i=!0,a=l;continue}i&&l<=(a??0)&&(i=!1),i?r.infoEntries.push(Fr(u,o)):r.blockFields.push(Lr(u,o))}}return{type:"document",objects:n}}function Mr(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!ge.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Ar(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Ar(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=T(i.value);if(!a)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let s=[];if(a.arity==="multiple")for(;r<e.length&&!dt(e[r].value);)s.push(e[r]),r++;else{let c=e[r];c&&(s.push(c),r++)}if(s.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:s.map(c=>c.value),location:{line:t,column:i.column}})}return n}function Lr(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!T(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Fr(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var qt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Er=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Rr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function W(e){let t=null,n=[];for(let r of e.objects){let i=_r(r);if(r.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function _r(e){let t=[...e.inlineFields,...e.blockFields];zr(e.objectType,t);let n=Nr(t),r=Cr(e.objectType,n),i=Vr(n),a=Wr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function zr(e,t){for(let n of t){let r=T(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!ft(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Nr(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Cr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),s=[n,r,i,a].filter(Boolean).length;if(s>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&s>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ee(t,"orbit"),distance:ce(t,"distance"),semiMajor:ce(t,"semiMajor"),eccentricity:Gr(t,"eccentricity"),period:ce(t,"period"),angle:ce(t,"angle"),inclination:ce(t,"inclination"),phase:ce(t,"phase")};if(r){let c=Re(t,"at"),o=Ee(t,"at");return{mode:"at",target:o,reference:Yr(o,c.location)}}if(i)return{mode:"surface",target:Ee(t,"surface")};if(a){let c=Ee(t,"free"),o=qr(c);return{mode:"free",distance:o??void 0,descriptor:o?void 0:c}}return null}function Vr(e){let t={};for(let[n,r]of e.entries()){let i=T(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Hr(r);break;case"number":t[n]=Ht(le(r),n,r.location);break;case"unit":t[n]=Gt(le(r),r.location,n);break;case"string":t[n]=Br(n,r);break}}return t}function Br(e,t){let n=t.values.join(" ").trim();return e==="image"&&Ur(n,t.location),n}function Ur(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Rr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Wr(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Yr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Gt(e,t,n){let r=e.match(qt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=T(n);if(a?.unitFamily&&!ye(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function qr(e){let t=e.match(qt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ce(e,t){if(!e.has(t))return;let n=Re(e,t);return Gt(le(n),n.location,t)}function Gr(e,t){if(!e.has(t))return;let n=Re(e,t);return Ht(le(n),t,n.location)}function Ht(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Hr(e){let t=le(e).toLowerCase(),n=Er.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Re(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function Ee(e,t){return le(Re(e,t))}function le(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Kr=new Set(["star","planet","moon","asteroid","comet"]);function Y(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Kr.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Xr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Zr(r,r.placement.reference,t))}}function Xr(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Zr(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Kt(e){return{...e}}function A(e,t,n=`${t}.failed`){return e instanceof d?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function _e(e){let t;try{t=Z(e)}catch(r){return{ok:!1,value:null,diagnostics:[A(r,"parse")]}}let n;try{n=W(t)}catch(r){return{ok:!1,value:null,diagnostics:[A(r,"normalize")]}}try{Y(n)}catch(r){return{ok:!1,value:null,diagnostics:[A(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Xt(e){try{return{ok:!0,value:W(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[A(t,"normalize")]}}}function Zt(e){try{return Y(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[A(t,"validate")]}}}var be=1495978707e-1,Jr=6371,Qr=71492,ei=695700,ti=63241.077,ni=206264.806,ri=206264806,an=.68,ii=.2,on=28;function q(e,t={}){let n=si(t),r=n.width,i=n.height,a=n.padding,s=oi(e),c=li(e,t.projection),o=bt(t.camera??null),l=yt(c,o),u=fi(s,t.scaleModel),f=mi(s),p=e.system?.id??null,m=t.activeEventId??null,v=ai(e.objects,e.events??[],m),h=new Map(v.map(y=>[y.id,y])),k=Zi(v,h),O=new Map,b=[],j=[],L=[],C=[],F=[],H=new Map,K=new Map;for(let y of v){let E=y.placement;if(!E){L.push(y);continue}if(E.mode==="orbit"){tn(K,E.target,y);continue}if(E.mode==="surface"){tn(H,E.target,y);continue}if(E.mode==="at"){F.push(y);continue}C.push(y)}let re=C.length>0?r*.42:r/2,D=i/2,V={orbitChildren:K,surfaceChildren:H,objectMap:h,spacingFactor:f,projection:l,scaleModel:u},B=L.find(y=>y.type==="star")??L[0]??null;B&&mt(B,re,D,0,O,b,j,V);let U=L.filter(y=>y.id!==B?.id);if(U.length>0){let y=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;U.forEach((E,S)=>{let ct=je(S,U.length,-Math.PI/2),ie=xe(ct,y,l,1);mt(E,re+ie.x,D+ie.y,0,O,b,j,V)})}C.forEach((y,E)=>{let S=r-a-140-ra(y.placement?.mode==="free"?y.placement.distance:void 0,u),ct=Math.max(76,(i-a*2-180)/Math.max(1,C.length)*f)*u.freePlacementMultiplier,ie=a+92+E*ct;O.set(y.id,{object:y,x:S,y:ie,radius:Be(y,0,u),sortKey:We(S,ie,0)}),j.push({object:y,groupId:k.groupIds.get(y.id)??null,x1:S-60,y1:ie,x2:S-18,y2:ie,mode:"free"}),Ce(y,O,b,j,V,1)}),F.forEach((y,E)=>{if(O.has(y.id)||!y.placement||y.placement.mode!=="at")return;let S=Ki(y.placement.reference,O,h,E,F.length,r,i,a,V);O.set(y.id,{object:y,x:S.x,y:S.y,radius:Be(y,2,u),sortKey:We(S.x,S.y,2),anchorX:S.anchorX,anchorY:S.anchorY}),S.anchorX!==void 0&&S.anchorY!==void 0&&j.push({object:y,groupId:k.groupIds.get(y.id)??null,x1:S.anchorX,y1:S.anchorY,x2:S.x,y2:S.y,mode:"at"}),Ce(y,O,b,j,V,2)});let M=[...O.values()].map(y=>hi(y,u,k)),Me=b.map(y=>gi(y,k.groupIds.get(y.object.id)??null)),Ae=j.map(y=>yi(y)),Le=bi(M,r,i,u.labelMultiplier),Vt=Oi(e,M),Bt=Si(e.events??[],M,m),br=ji(Me,Vt,Bt,Ae,M,Le),vr=xi(M,Me,Ae,Le,k,u.labelMultiplier),wr=ki(e,M),Ir=Pi(e,c,n.preset,k,h),$r=Ci(r,i,M,Me,Ae,Le,u.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:c,renderProjection:l,camera:o,scaleModel:u,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:di(c,l,s,o),systemId:p,viewMode:c,layoutPreset:s,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...o?.azimuth!==null?{"camera.azimuth":String(o?.azimuth)}:{},...o?.elevation!==null?{"camera.elevation":String(o?.elevation)}:{},...o?.roll!==null?{"camera.roll":String(o?.roll)}:{},...o?.distance!==null?{"camera.distance":String(o?.distance)}:{}},contentBounds:$r,layers:br,groups:vr,semanticGroups:wr,viewpoints:Ir,events:Bt,activeEventId:m,objects:M,orbitVisuals:Me,relations:Vt,leaders:Ae,labels:Le}}function sn(e,t,n){let r=Ye(n),i=Math.cos(r),a=Math.sin(r),s=e.x-t.x,c=e.y-t.y;return{x:t.x+s*i-c*a,y:t.y+s*a+c*i}}function ai(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let a=new Map(r.map(c=>[c.id,c])),s=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of s){let o=a.get(c);o&&(i.epoch&&(o.epoch=i.epoch),i.referencePlane&&(o.referencePlane=i.referencePlane))}for(let c of i.positions){let o=a.get(c.objectId);o&&(c.placement&&(o.placement=structuredClone(c.placement)),c.inner&&(o.properties.inner={...c.inner}),c.outer&&(o.properties.outer={...c.outer}),c.epoch&&(o.epoch=c.epoch),c.referencePlane&&(o.referencePlane=c.referencePlane))}return r}function oi(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function si(e){let t=ci(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function ci(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function li(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return un(n)??"topdown"}function yt(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function bt(e){if(!e)return null;let t={azimuth:pt(e.azimuth),elevation:pt(e.elevation),roll:pt(e.roll),distance:ui(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function pt(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ui(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function di(e,t,n,r){let i=[`${nn(e)} view`,`${nn(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let a=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);a.length>0&&i.push(`camera ${a.join(" / ")}`)}return i.join(" - ")}function fi(e,t){return{...pi(e),...t}}function pi(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function mi(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function hi(e,t,n){let{object:r,x:i,y:a,radius:s,sortKey:c,anchorX:o,anchorY:l}=e,u=r.renderHints?.renderPriority??0;return{renderId:ue(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:s,visualRadius:na(r,s,t),sortKey:c+u*.001,anchorX:o,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:aa(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function gi(e,t){return{renderId:`${ue(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function yi(e){return{renderId:`${ue(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function bi(e,t,n,r){let i=[],a=[],s=new Map(e.map(o=>[o.objectId,o])),c=[...e].filter(o=>!o.hidden&&o.object.renderHints?.renderLabel!==!1).sort(vi);for(let o of c){let l=wi(o,s,a,t,n,r)??ln(o,cn(o,s.get(o.parentId??"")??null,n),0,r);a.push(hn(o,l,r)),i.push({renderId:`${o.renderId}-label`,objectId:o.objectId,object:o.object,groupId:o.groupId,semanticGroupIds:[...o.semanticGroupIds],label:o.label,secondaryLabel:o.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:o.hidden})}return i}function vi(e,t){let n=Jt(e)-Jt(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function Jt(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function wi(e,t,n,r,i,a){for(let s of Ii(e,t,r,i)){let c=s==="left"||s==="right"?4:6;for(let o=0;o<=c;o+=1){let l=ln(e,s,o,a),u=hn(e,l,a);if(!n.some(f=>ea(f,u)))return l}}return null}function Ii(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=cn(e,i,r),s=a==="below"?"above":"below",c=$i(e,i,n),o=c==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,a,o,s]:[a,c,s,o]}function cn(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function $i(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function ln(e,t,n,r){let i=14*r;switch(t){case"above":{let a=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:a,secondaryY:a-16*r,textAnchor:"middle",direction:t}}case"below":{let a=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:a,secondaryY:a+16*r,textAnchor:"middle",direction:t}}case"left":{let a=e.x-(e.visualRadius+16*r+n*i),s=e.y-4*r;return{x:a,labelY:s,secondaryY:s+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,s=e.y-4*r;return{x:a,labelY:s,secondaryY:s+16*r,textAnchor:"start",direction:t}}}}function ji(e,t,n,r,i,a){let s=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),c=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"events",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"objects",renderIds:i.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:a.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function xi(e,t,n,r,i,a){let s=new Map,c=o=>{if(!o)return null;let l=s.get(o);if(l)return l;let u=i.groupRoots.get(o)??null,f={renderId:o,rootObjectId:u,label:u??o,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:$e(0,0,0,0)};return s.set(o,f),f};for(let o of e){let l=c(o.groupId);l&&!o.hidden&&l.objectIds.push(o.objectId)}for(let o of t){let l=c(o.groupId);l&&!o.hidden&&l.orbitIds.push(o.objectId)}for(let o of n){let l=c(o.groupId);l&&!o.hidden&&l.leaderIds.push(o.objectId)}for(let o of r){let l=c(o.groupId);l&&!o.hidden&&l.labelIds.push(o.objectId)}for(let o of s.values())o.contentBounds=Ji(o,e,t,n,r,a);return[...s.values()].sort((o,l)=>o.label.localeCompare(l.label))}function ki(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function Oi(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${ue(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Si(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let a=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],s=a.map(l=>r.get(l)).filter(Boolean),c=s.length>0?s.reduce((l,u)=>l+u.x,0)/s.length:0,o=s.length>0?s.reduce((l,u)=>l+u.y,0)/s.length:0;return{renderId:`${ue(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:o,hidden:i.hidden||s.length===0||s.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Pi(e,t,n,r,i){let a=Di(e,t,n),s=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...m]=l.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let v=_i(p);if(!v)continue;let h=m.join(".").toLowerCase(),k=s.get(v)??{id:v};Ti(k,h,u,e,t,n,r,i),s.set(v,k)}let c=[...s.values()].map(l=>Mi(l,t,n,i)).filter(Boolean),o=c.findIndex(l=>l.id===a.id);return o>=0?c.splice(o,1,{...a,...c[o],layers:{...a.layers,...c[o].layers},filter:c[o].filter??a.filter,generated:!1}):c.unshift(a),c.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function Di(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",a=bt(null),s=yt(t,a);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:s,camera:a,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Ti(e,t,n,r,i,a,s,c){let o=n.trim();switch(t){case"label":case"title":o&&(e.label=o);return;case"summary":case"description":o&&(e.summary=o);return;case"focus":case"object":o&&(e.focus=o);return;case"select":case"selection":o&&(e.select=o);return;case"events":e.eventIds=Ie(o);return;case"projection":case"view":e.projection=un(o)??i;return;case"preset":e.preset=Li(o)??a;return;case"rotation":case"angle":e.rotationDeg=ve(o)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ne(),azimuth:ve(o)};return;case"camera.elevation":e.camera={...e.camera??Ne(),elevation:ve(o)};return;case"camera.roll":e.camera={...e.camera??Ne(),roll:ve(o)};return;case"camera.distance":e.camera={...e.camera??Ne(),distance:Qt(o)};return;case"zoom":case"scale":e.scale=Qt(o);return;case"layers":e.layers=Fi(o);return;case"query":e.filter={...e.filter??ze(),query:o||null};return;case"types":case"objecttypes":e.filter={...e.filter??ze(),objectTypes:Ei(o)};return;case"tags":e.filter={...e.filter??ze(),tags:Ie(o)};return;case"groups":e.filter={...e.filter??ze(),groupIds:Ri(o,r,s,c)};return}}function Mi(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,s=Ai(e.filter),c=e.label?.trim()||zi(e.id),o=e.projection??t,l=bt(e.camera??null),u=yt(o,l);return{id:e.id,label:c,summary:e.summary?.trim()||Ni(c,i,s),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:o,renderProjection:u,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function ze(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ne(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ai(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function un(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function Li(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function ve(e){let t=Number(e);return Number.isFinite(t)?t:null}function Qt(e){let t=ve(e);return t!==null&&t>0?t:null}function Fi(e){let t={};for(let n of Ie(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Ei(e){return Ie(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Ri(e,t,n,r){return Ie(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??we(i):(r.has(i),we(i)))}function Ie(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function _i(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function zi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ni(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function Ci(e,t,n,r,i,a,s){let c=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(p,m)=>{c=Math.min(c,p),o=Math.min(o,m),l=Math.max(l,p),u=Math.max(u,m)};for(let p of r)p.hidden||dn(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||fn(p,f);for(let p of a)p.hidden||pn(p,f,s);return!Number.isFinite(c)||!Number.isFinite(o)?$e(0,0,e,t):$e(c,o,l,u)}function dn(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,a=yn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,on*2);for(let s of a)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function $e(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function fn(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function pn(e,t,n){let r=gn(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function mt(e,t,n,r,i,a,s,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Be(e,r,c.scaleModel),sortKey:We(t,n,r)}),Ce(e,i,a,s,c,r+1))}function Ce(e,t,n,r,i,a){let s=t.get(e.id);if(!s)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(Vi),o=Bi(c,s.radius,i.spacingFactor,i.scaleModel),l=Yi(c,o);c.forEach((f,p)=>{let m=Ui(f,p,c.length,s,o,l[p]??o.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),mt(f,m.objectX,m.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,p)=>{let m=je(p,u.length,-Math.PI/3),v=28*i.spacingFactor,h=xe(m,s.radius,i.projection,i.projection==="isometric"?.9:1),k=xe(m,s.radius+v,i.projection,i.projection==="isometric"?.9:1),O=s.x+h.x,b=s.y+h.y,j=s.x+k.x,L=s.y+k.y;t.set(f.id,{object:f,x:j,y:L,radius:Be(f,a+1,i.scaleModel),sortKey:We(j,L,a+1),anchorX:O,anchorY:b}),r.push({object:f,groupId:i.objectMap.has(f.id)?we(Qi(f,i.objectMap)):null,x1:O,y1:b,x2:j,y2:L,mode:"surface"}),Ce(f,t,n,r,i,a+1)})}function Vi(e,t){let n=Ve(e),r=Ve(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Bi(e,t,n,r){let i=e.map(f=>Ve(f)),a=i.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42};let o=Math.min(...a),l=Math.max(...a),u=l-o;return{metrics:i,minMetric:o,maxMetric:l,metricSpread:u,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function Ui(e,t,n,r,i,a,s){let c=e.placement,o=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let K=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:K,rotationDeg:0,band:o,bandThickness:o?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-K}}let l=P(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),u=a,f=Math.max(u*Math.sqrt(1-l*l),u*.18),p=gt(c.inclination)??0,m=s.projection==="isometric"?Math.max(ii,Math.cos(Ye(p)))*an:1,v=Math.max(f*m,u*.14),h=gt(c.angle)??0,k=u*l,O=vn(-k,0,h),b=r.x+O.x,j=r.y+O.y,L=Gi(c.phase,t,n),C=bn(b,j,u,v,h,L),F=s.projection==="topdown"&&l<=1e-4&&Math.abs(h)<=1e-4,H=o?Hi(e,u,i,s.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:b,cy:F?r.y:j,radius:F?u:void 0,rx:F?void 0:u,ry:F?void 0:v,rotationDeg:h,band:o,bandThickness:H,frontArcPath:s.projection==="isometric"||o?en(b,j,u,v,h,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||o?en(b,j,u,v,h,Math.PI,Math.PI*2):void 0,objectX:C.x,objectY:C.y}}function Wi(e,t){return t.innerPx+t.stepPx*qi(Math.max(e,0)+1)}function Yi(e,t){let n=[];return e.forEach((r,i)=>{let a=Ve(r),s=t.innerPx+i*t.stepPx,c=a===null?s:Wi(a,t),o=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,o))}),n}function Ve(e){return!e.placement||e.placement.mode!=="orbit"?null:Ue(e.placement.semiMajor??e.placement.distance??null)}function qi(e){return Math.log(e)/Math.log(2)}function Gi(e,t,n){let r=e?gt(e):null;return r!==null?Ye(r-90):je(t,n,-Math.PI/2)}function Hi(e,t,n,r){let i=Ue(ht(e.properties.inner)),a=Ue(ht(e.properties.outer));if(i!==null&&a!==null){let c=Math.abs(a-i);if(n.metricSpread>0)return P(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let o=Math.max(Math.max(i,a),1e-4);return P(c/o*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Ki(e,t,n,r,i,a,s,c,o){if(e.kind==="lagrange")return Xi(e,t,n,a,s);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=je(r,i,Math.PI/5),f=(l.radius+36)*o.scaleModel.labelMultiplier,p=xe(u,f,o.projection,o.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=je(r,i,Math.PI/6),f=(l.radius+36)*o.scaleModel.labelMultiplier,p=xe(u,f,o.projection,o.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:a-c-170,y:s-c-86-r*58*o.scaleModel.freePlacementMultiplier}}function Xi(e,t,n,r,i){let a=e.secondary?t.get(e.primary):ta(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!a||!s)return{x:r*.7,y:i*.25};let c=s.x-a.x,o=s.y-a.y,l=Math.hypot(c,o)||1,u=c/l,f=o/l,p=-f,m=u,v=P(l*.25,24,68);switch(e.point){case"L1":return{x:s.x-u*v,y:s.y-f*v,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+u*v,y:s.y+f*v,anchorX:s.x,anchorY:s.y};case"L3":return{x:a.x-u*v,y:a.y-f*v,anchorX:a.x,anchorY:a.y};case"L4":return{x:s.x+(u*.5-p*.8660254)*v,y:s.y+(f*.5-m*.8660254)*v,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(u*.5+p*.8660254)*v,y:s.y+(f*.5+m*.8660254)*v,anchorX:s.x,anchorY:s.y}}}function Zi(e,t){let n=new Map,r=new Map;for(let l of e){let u=mn(l,t);if(n.set(l.id,u),u){let f=r.get(u);f?f.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,s=new Map,c=l=>{let u=i.get(l);if(u)return u;let f=new Set,p=[],m=n.get(l)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(l,p),p},o=l=>{let u=s.get(a.get(l)??"");if(u)return u;let f=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&f&&(m=o(f)),m};for(let l of e){c(l.id);let u=o(l.id),f=we(u);a.set(l.id,f),s.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:s}}function mn(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Ji(e,t,n,r,i,a){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(f,p)=>{s=Math.min(s,f),c=Math.min(c,p),o=Math.max(o,f),l=Math.max(l,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&fn(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&dn(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&pn(f,u,a);return!Number.isFinite(s)||!Number.isFinite(c)?$e(0,0,0,0):$e(s,c,o,l)}function Qi(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=mn(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function hn(e,t,n){return gn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function gn(e,t,n,r,i,a,s,c){let o=oa(a,s,c),l=o*2,u=i==="above"?18:12,f=i==="above"?8:12,p=e-o,m=e+o;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function ea(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function ta(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Be(e,t,n){let r=ia(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return P((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return P(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return P(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return P(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return P(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return P(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return P(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return P(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return P(8*i,n.minBodyRadius,n.maxBodyRadius)}}function na(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Ue(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/be;case"m":return e.value/1e3/be;case"ly":return e.value*ti;case"pc":return e.value*ni;case"kpc":return e.value*ri;case"re":return e.value*Jr/be;case"rj":return e.value*Qr/be;case"sol":return e.value*ei/be;default:return e.value}}function ra(e,t){let n=Ue(e??null);return n===null||n<=0?0:P(n*96*t.freePlacementMultiplier,0,420)}function ia(e,t){let n=ht(e);if(!n)return null;let r;switch(n.unit){case"sol":r=P(n.value*22,14,40);break;case"re":r=P(n.value*10,6,18);break;case"km":r=P(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=P(n.value*4,4,20);break}return P(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ht(e){return!e||typeof e!="object"||!("value"in e)?null:e}function gt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function je(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function en(e,t,n,r,i,a,s){let c=yn(e,t,n,r,i,a,s,on);return c.length===0?"":c.map((o,l)=>`${l===0?"M":"L"} ${rn(o.x)} ${rn(o.y)}`).join(" ")}function yn(e,t,n,r,i,a,s,c){let o=[];for(let l=0;l<=c;l+=1){let u=a+(s-a)*l/c;o.push(bn(e,t,n,r,i,u))}return o}function bn(e,t,n,r,i,a){let s=n*Math.cos(a),c=r*Math.sin(a),o=vn(s,c,i);return{x:e+o.x,y:t+o.y}}function vn(e,t,n){let r=Ye(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function xe(e,t,n,r){let i=n==="isometric"?an*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function We(e,t,n){return t*1e3+e+n*.01}function P(e,t,n){return Math.min(Math.max(e,t),n)}function tn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ue(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function we(e){return`${ue(e)}-group`}function aa(e){return typeof e=="string"&&e.trim()?e:void 0}function oa(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function nn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ye(e){return e*Math.PI/180}function rn(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var $n=86400,qe=$n*365.25,Ge=18,wn=180;function jn(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,activeEventId:t.activeEventId},r=q(e,n),i=ua(r.layoutPreset,t.spatialScaleModel),a={x:r.contentBounds.centerX,y:r.contentBounds.centerY},s=new Map(r.objects.map(h=>[h.objectId,h])),c=new Map(r.orbitVisuals.map(h=>[h.objectId,h])),o=new Map;for(let h of r.objects){let k=h.object.placement;!k||k.mode!=="orbit"||o.set(h.objectId,wt(k))}let l=Math.min(...[...o.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,f=r.objects.map(h=>sa(h,r,a,s,c,i,u,l)),p=new Map(f.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>ca(h,p,l,r.activeEventId!==null)),v=f.map(h=>({objectId:h.objectId,center:{...h.position},radius:h.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:fa(f),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:f,orbits:m,focusTargets:v}}function sa(e,t,n,r,i,a,s,c){let o=He(e,t,n,r,i,s),l=It(e.object,i.get(e.objectId),c,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:o,radius:de(e.radius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius),visualRadius:de(e.visualRadius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:l}}function ca(e,t,n,r){let i=t.get(e.objectId),a=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:a?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??Ke(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??It(e.object,e,n,r)}}function He(e,t,n,r,i,a){let s=a.get(e.objectId);if(s)return s;let c=e.object.placement,o;if(c?.mode==="orbit"&&e.parentId){let l=r.get(e.parentId),u=l?He(l,t,n,r,i,a):{x:0,y:0,z:0},f=i.get(e.objectId),p=It(e.object,f,1,t.activeEventId!==null),m=p?kn(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};o=On(u,m)}else if(c?.mode==="surface"&&e.parentId){let l=r.get(e.parentId),u=l?He(l,t,n,r,i,a):{x:0,y:0,z:0},f=l?.visualRadius??16,p=pa(e.objectId),m=p*Math.PI*2;o={x:u.x+Math.cos(m)*(f+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(m)*(f+e.visualRadius*.9)}}else if(c?.mode==="at"&&e.parentId){let l=r.get(e.parentId),u=l?He(l,t,n,r,i,a):{x:0,y:0,z:0},f=e.anchorX??l?.x??n.x,p=e.anchorY??l?.y??n.y;o={x:u.x+(e.x-f),y:u.y,z:u.z+(e.y-p)}}else o={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return a.set(e.objectId,o),o}function xn(e,t){let n=new Map(e.objects.map(a=>[a.objectId,a])),r=new Map,i=a=>{let s=r.get(a);if(s)return s;let c=n.get(a);if(!c)return{x:0,y:0,z:0};let o={...c.position};if(c.motion&&c.parentId){let l=i(c.parentId),u=kn(c.motion,e.timeFrozen?0:t);o=On(l,u)}return r.set(a,o),o};for(let a of e.objects)i(a.objectId);return r}function kn(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=vt(n),i=vt(e.rotationDeg),a=vt(e.inclinationDeg),s=Math.cos(r)*e.semiMajor,c=Math.sin(r)*e.semiMinor,o=s*Math.cos(i)-c*Math.sin(i),l=s*Math.sin(i)+c*Math.cos(i);return{x:o,y:l*Math.sin(a),z:l*Math.cos(a)}}function It(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let a=t?.radius??t?.rx??de(wt(i)*48,24,1200),s=t?.radius??t?.ry??a,c=la(i.period),o=wt(i),l=de(o/Math.max(n,1e-4),1,20),u=de(c?Ge*l:Ge*Math.pow(l,.75),Ge,wn);return{phase0Deg:Ke(i.phase)??0,rotationDeg:Ke(i.angle)??t?.rotationDeg??0,inclinationDeg:Ke(i.inclination)??0,semiMajor:a,semiMinor:s,eccentricity:i.eccentricity??0,periodSeconds:c,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:c===null,frozen:r}}function wt(e){let t=In(e.semiMajor)??In(e.distance)??1;return Math.max(t,.01)}function In(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function la(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*$n;case"y":return e.value*qe;case"ky":return e.value*qe*1e3;case"my":return e.value*qe*1e6;case"gy":return e.value*qe*1e9;default:return null}}function Ke(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ua(e,t){return{...da(e),...t}}function da(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function fa(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY,s=Number.NEGATIVE_INFINITY;for(let c of e)t=Math.min(t,c.position.x-c.visualRadius),n=Math.min(n,c.position.y-c.visualRadius),r=Math.min(r,c.position.z-c.visualRadius),i=Math.max(i,c.position.x+c.visualRadius),a=Math.max(a,c.position.y+c.visualRadius),s=Math.max(s,c.position.z+c.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:a,maxZ:s,width:i-t,height:a-n,depth:s-r,center:{x:(t+i)/2,y:(n+a)/2,z:(r+s)/2}}}function On(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function pa(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function de(e,t,n){return Math.min(Math.max(e,t),n)}function vt(e){return e*Math.PI/180}function ke(e,t={}){let n=q(e,t),r=[],i=ga(e,r),a=ya(e,r),s=ha(e,n.renderPreset??t.preset??null,n.projection),c=e.system?ma(e,s,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(o=>!o.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(o=>!o.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.5",schemaVersion:"2.5",sourceVersion:e.version,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Dn),diagnostics:r}}function Xe(e,t={}){return Pa(ke(e,t))}function Oe(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:ka(e.system),info:Oa(e.system)}:null,r=e.objects.map(Dn);return Ia(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(va),objects:r}}function Pn(e){return Oe(e)}function ma(e,t,n,r,i,a){let s=q(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:s.viewpoints.map(ba),annotations:r}}function ha(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function ga(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function ya(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...s]=r.split(".");if(!a||s.length===0)continue;let c=Sn(a);if(!c)continue;let o=n.get(c)??{id:c};switch(s.join(".").toLowerCase()){case"label":o.label=i;break;case"target":case"object":o.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":o.body=i;break;case"tags":o.tags=ja(i);break}n.set(c,o)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Sn(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(s=>typeof s=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??xa(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function ba(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Dn(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:$a(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function va(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(wa)}}function wa(e){return{objectId:e.objectId,placement:Tn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function Tn(e){return e?structuredClone(e):null}function Ia(e,t,n){if(!n)return;let r=t.find(s=>s.id===n);if(!r)return;let i=new Map(e.map(s=>[s.id,s])),a=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(s=>s.objectId)]);for(let s of a){let c=i.get(s);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let s of r.positions){let c=i.get(s.objectId);c&&(s.placement&&(c.placement=Tn(s.placement)),s.inner&&(c.properties.inner={...s.inner}),s.outer&&(c.properties.outer={...s.outer}),s.epoch&&(c.epoch=s.epoch),s.referencePlane&&(c.referencePlane=s.referencePlane))}}function $a(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function ja(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Sn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function xa(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ka(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function Oa(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=Sa(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Sa(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function Pa(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Mn=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Je(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.0-draft"){if(n==="2.0-draft"){let o=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Xe(e);return $t(o)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:ke(e);return(n==="2.0"||n==="2.1"||n==="2.5")&&c.version!==n?Ze({...c,version:n,schemaVersion:n}):Ze(c)}let i=[],a=e;a.system&&i.push(...Da(a.system));let s=[...a.objects].sort(kt);for(let c of s)i.length>0&&i.push(""),i.push(...Ma(c));return i.join(`
2
- `)}function Ze(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Ln(e.system));for(let r of[...e.groups].sort(fe))t.push(""),t.push(..._n(r));for(let r of[...e.relations].sort(fe))t.push(""),t.push(...zn(r));for(let r of[...e.events].sort(fe))t.push(""),t.push(...Nn(r));let n=[...e.objects].sort(kt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Fn(r))}),t.join(`
3
- `)}function $t(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Ln(t.system));for(let i of[...t.groups].sort(fe))n.push(""),n.push(..._n(i));for(let i of[...t.relations].sort(fe))n.push(""),n.push(...zn(i));for(let i of[...t.events].sort(fe))n.push(""),n.push(...Nn(i));let r=[...t.objects].sort(kt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...Fn(i))}),n.join(`
4
- `)}function Da(e){return Ta("system",e.id,e.properties,null,e.info)}function Ta(e,t,n,r,i){let a=[`${e} ${t}`],s=[...jt(r),...Rn(n)];for(let o of s)a.push(` ${o}`);let c=Object.entries(i).sort(([o],[l])=>o.localeCompare(l));if(c.length>0){s.length>0&&a.push(""),a.push(" info");for(let[o,l]of c)a.push(` ${o} ${g(l)}`)}return a}function Ln(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${g(e.title)}`),e.description&&t.push(` description ${g(e.description)}`),e.epoch&&t.push(` epoch ${g(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${g(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${g(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${g(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${g(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${g(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...La(n));for(let n of e.annotations)t.push(""),t.push(...Fa(n));return t}function Ma(e){return En(e.type,e.id,e)}function Fn(e){return En(`object ${e.type}`,e.id,e)}function En(e,t,n){let r=[`${e} ${t}`],i=[...jt(n.placement),...Rn(n.properties),...Aa(n)];for(let s of i)r.push(` ${s}`);let a=Object.entries(n.info).sort(([s],[c])=>s.localeCompare(c));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[s,c]of a)r.push(` ${s} ${g(c)}`)}for(let s of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[s]??{}).sort(([o],[l])=>o.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${s}`);for(let[o,l]of c)r.push(` ${o} ${g(l)}`)}}return r}function jt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...J("distance",e.distance),...J("semiMajor",e.semiMajor),..._a("eccentricity",e.eccentricity),...J("period",e.period),...J("angle",e.angle),...J("inclination",e.inclination),...J("phase",e.phase)];case"at":return[`at ${za(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?xt(e.distance):e.descriptor??""}`.trim()]}}function Rn(e){return Object.keys(e).sort(Ca).map(t=>`${t} ${Cn(e[t])}`)}function Aa(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${g(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${g(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Cn(n.value)}`);return t}function La(e){let t=[`viewpoint ${e.id}`,` label ${g(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${g(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&Ra(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=Na(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${g(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(g).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Fa(e){let t=[`annotation ${e.id}`,` label ${g(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${g(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(g).join(" ")}`),t}function _n(e){let t=[`group ${e.id}`,` label ${g(e.label)}`];return e.summary&&t.push(` summary ${g(e.summary)}`),e.color&&t.push(` color ${g(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(g).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function zn(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${g(e.from)}`),e.to&&t.push(` to ${g(e.to)}`),e.kind&&t.push(` kind ${g(e.kind)}`),e.label&&t.push(` label ${g(e.label)}`),e.summary&&t.push(` summary ${g(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(g).join(" ")}`),e.color&&t.push(` color ${g(e.color)}`),e.hidden&&t.push(" hidden true"),t}function Nn(e){let t=[`event ${e.id}`,` kind ${g(e.kind)}`];if(e.label&&t.push(` label ${g(e.label)}`),e.summary&&t.push(` summary ${g(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${g(e.timing)}`),e.visibility&&t.push(` visibility ${g(e.visibility)}`),e.epoch&&t.push(` epoch ${g(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${g(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(g).join(" ")}`),e.color&&t.push(` color ${g(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(Va)){t.push(` pose ${n.objectId}`);for(let r of Ea(n))t.push(` ${r}`)}}return t}function Ea(e){return[...jt(e.placement),...e.epoch?[`epoch ${g(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${g(e.referencePlane)}`]:[],...J("inner",e.inner),...J("outer",e.outer)]}function Ra(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Cn(e){return Array.isArray(e)?e.map(t=>g(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?g(e):xt(e)}function xt(e){return`${e.value}${e.unit??""}`}function J(e,t){return t?[`${e} ${xt(t)}`]:[]}function _a(e,t){return t===void 0?[]:[`${e} ${t}`]}function za(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Na(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function Ca(e,t){let n=Mn.indexOf(e),r=Mn.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function kt(e,t){let n=An(e.type),r=An(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function fe(e,t){return e.id.localeCompare(t.id)}function Va(e,t){return e.objectId.localeCompare(t.objectId)}function An(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function g(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Vn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Ba=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Ua=/^[A-Za-z][A-Za-z0-9+.-]*:/;function pe(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Pe(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ot(e,t,n){let r=e.match(Vn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=T(n);if(a?.unitFamily&&!ye(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function St(e){let t=e.match(Vn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Qe(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Q(e,t,n){let r=Ba.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Bn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Wa(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Ua);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Un(e,t,n){let r=T(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw d.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return Q(Se(t,e,n),e,n);case"number":return Qe(Se(t,e,n),e,n);case"unit":return Ot(Se(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Wa(i,n),i}}}function Pt(e,t,n){let r=T(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw d.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function Se(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Yn=new Set(["star","planet","moon","asteroid","comet"]),Ya=332946.0487,qa=1047.3486,et=1495978707e-1,Ga=6371,Ha=695700,Ka=63241.077,Xa=206264.806,Za=206264806;function De(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),a=new Set(e.events.map(c=>c.id));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[c,o]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of o){let u=s.get(l);u?n.push(w("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${u}.`)):s.set(l,c)}for(let c of e.relations)Ja(c,r,n);for(let c of e.system?.viewpoints??[])Qa(c,i,a,t,n,r);for(let c of e.objects)eo(c,e.system,r,i,n);for(let c of e.events)to(c,e.system,r,n);return n}function Ja(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Qa(e,t,n,r,i,a){let s=e.filter;if(r==="2.1"||r==="2.5"){if(s)for(let c of s.groupIds)t.has(c)||i.push(x("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(x("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}ao(e.projection,i,`viewpoint.${e.id}.projection`,e.id),oo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,s,a)}function eo(e,t,n,r,i){let a=e.placement,s=a?.mode==="orbit"?a:null,c=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let o of e.groups)r.has(o)||i.push(x("validate.group.unknown",`Unknown group "${o}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(x("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(x("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),s&&(n.has(s.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&i.push(x("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(x("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!Tt(c?.properties.mass)&&i.push(x("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let o=n.get(a.target);o?Yn.has(o.type)||i.push(w("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(w("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),ro(e,n,i)||i.push(w("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let o=n.get(e.resonance.targetObjectId);o?(e.placement?.mode!=="orbit"||o.placement?.mode!=="orbit"||e.placement.target!==o.placement.target)&&i.push(x("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let o of e.deriveRules??[]){if(o.field!=="period"||o.strategy!=="kepler"){i.push(x("validate.derive.unsupported",`Unsupported derive rule "${o.field} ${o.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Wn(e,c);if(l===null){i.push(x("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||i.push(Dt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${uo(l)}.`,e.id,"derive"))}for(let o of e.validationRules??[]){if(o.rule!=="kepler"){i.push(x("validate.rule.unsupported",`Unsupported validation rule "${o.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=qn(s?.period),u=Wn(e,c);if(l===null||u===null)continue;let f=lo(e,"period");Math.abs(l-u)>f&&i.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function to(e,t,n,r){let i=`event.${e.id}`,a=new Set;e.kind.trim()||r.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(x("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(x("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(a.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let s=new Set;for(let l of e.participantObjectIds){if(a.add(l),s.has(l)){r.push(x("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}s.add(l),n.has(l)||r.push(w("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(x("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(x("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&a.size<3&&r.push(x("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let c=new Set;for(let l of e.positions){let u=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,u));continue}c.add(l.objectId);let f=n.get(l.objectId);if(!f){r.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,u));continue}a.has(l.objectId)||r.push(x("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),no(l,f,e,t,n,r,u,e.id)}let o=[...a].filter(l=>!c.has(l));e.positions.length>0&&o.length>0&&r.push(x("validate.event.positions.partial",`Event "${e.id}" leaves ${o.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function no(e,t,n,r,i,a,s,c){let o=e.placement;if(!o){a.push(w("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,s));return}if(o.mode==="orbit"){i.has(o.target)||a.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${s}.orbit`)),o.distance&&o.semiMajor&&a.push(w("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${s}.distance`)),o.phase&&!so(r,t,n,e)&&a.push(x("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${s}.phase`)),o.inclination&&!co(r,t,n,e)&&a.push(x("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${s}.inclination`)),o.period&&!Tt(i.get(o.target)?.properties.mass)&&a.push(x("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${s}.period`));return}if(o.mode==="surface"){let l=i.get(o.target);l?Yn.has(l.type)||a.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${o.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${s}.surface`)):a.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${s}.surface`));return}if(o.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&a.push(w("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${s}.at`));let l=o.reference;l.kind==="named"&&!i.has(l.name)?a.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?a.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&a.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):a.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)))}}function ro(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(w("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Wn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=io(n.semiMajor??n.distance),i=Tt(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function io(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/et;case"m":return e.value/(et*1e3);case"ly":return e.value*Ka;case"pc":return e.value*Xa;case"kpc":return e.value*Za;case"re":return e.value*Ga/et;case"sol":return e.value*Ha/et;default:return null}}function Tt(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Ya;case"mj":return t.value/qa;default:return null}}function qn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function ao(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function oo(e,t,n,r,i,a,s,c,o){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||f==="distance"&&p<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(x("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(x("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,l)),t==="isometric"&&e.elevation!==null&&r.push(Dt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(x("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),a!==null&&o.has(a)||s!==null&&o.has(s)||c||r.push(Dt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function so(e,t,n,r){return ee(r?.epoch)??ee(n?.epoch)??ee(t.epoch)??ee(e?.epoch)??null}function co(e,t,n,r){return ee(r?.referencePlane)??ee(n?.referencePlane)??ee(t.referencePlane)??ee(e?.referencePlane)??null}function ee(e){return typeof e=="string"&&e.trim()?e.trim():null}function lo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?qn(n)??0:0}function uo(e){return`${Math.round(e*100)/100}d`}function w(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function x(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Dt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var fo=new Set(["climate","habitability","settlement"]),nt=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=T(e);t&&nt.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])nt.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var po=new Set(nt.keys()),Hn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function rt(e){return Xn(e)}function Kn(e){return Xn(e,"2.0-draft")}function Xn(e,t){let n=Qo(e),r=n.source.split(/\r?\n/),i=[],a=!1,s="2.0",c=null,o=null,l=[],u=[],f=[],p=[],m=new Map,v=!1,h=!1,k=new Set,O=new Set,b=new Set,j=new Set,L=new Set;for(let D=0;D<r.length;D++){let V=r[D],B=D+1;if(!V.trim())continue;let U=Fe(V),M=ae(V.slice(U),{line:B,columnOffset:U});if(M.length!==0){if(!a){s=mo(M,B),a=!0,n.comments.length>0&&it(s,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(U===0){o=ho(M,B,s,i,c,l,u,f,p,m,k,O,b,j,L,{sawDefaults:v,sawAtlas:h}),o.kind==="system"?c=o.system:o.kind==="defaults"?v=!0:o.kind==="atlas"&&(h=!0);continue}if(!o)throw new d("Indented line without parent atlas section",B,U+1);jo(o,U,M,B)}}if(!a)throw new d('Missing required atlas schema header "schema 2.0"');let C=l.map(D=>Bo(D,s,i)),F=p.map(D=>Uo(D,m.get(D.id)??[])),H=t??(s==="2.0-draft"?"2.0":s),K={format:"worldorbit",sourceVersion:"1.0",system:c,groups:u,relations:f,events:F,objects:C,diagnostics:i};if(H==="2.0-draft"){let D={...K,version:"2.0-draft",schemaVersion:"2.0-draft"};return D.diagnostics.push(...De(D,s)),D}let re={...K,version:H,schemaVersion:H};return s==="2.0-draft"&&re.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),re.diagnostics.push(...De(re,s)),re}function mo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function ho(e,t,n,r,i,a,s,c,o,l,u,f,p,m,v,h){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return go(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(h.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(h.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return yo(e,t,i,u,n,r);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return bo(e,t,i,f);case"group":return _(n,r,"group",{line:t,column:e[0].column}),vo(e,t,s,p);case"relation":return _(n,r,"relation",{line:t,column:e[0].column}),wo(e,t,c,m);case"event":return _(n,r,"event",{line:t,column:e[0].column}),Io(e,t,o,l,v,n,r);case"object":return $o(e,t,n,r,a);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function go(e,t,n,r){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function yo(e,t,n,r,i,a){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let s=pe(e[1].value);if(!s)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(s))throw new d(`Duplicate viewpoint id "${s}"`,t,e[1].column);let c={id:s,label:Pe(s),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(c),r.add(s),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function bo(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=pe(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:Pe(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function vo(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=pe(e[1].value);if(!i)throw new d("Group id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:Pe(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function wo(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=pe(e[1].value);if(!i)throw new d("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate relation id "${i}"`,t,e[1].column);let a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function Io(e,t,n,r,i,a,s){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let c=pe(e[1].value);if(!c)throw new d("Event id must not be empty",t,e[1].column);if(i.has(c))throw new d(`Duplicate event id "${c}"`,t,e[1].column);let o={id:c,kind:"",label:Pe(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(o),r.set(c,l),i.add(c),{kind:"event",event:o,sourceSchemaVersion:a,diagnostics:s,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function $o(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],s=e[2],c=a.value;if(!ge.has(c)||c==="system")throw new d(`Unknown object type "${a.value}"`,t,a.column);let o={objectType:c,id:s.value,fields:Co(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(o),{kind:"object",objectNode:o,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function jo(e,t,n,r){switch(e.kind){case"system":xo(e,n,r);return;case"defaults":ko(e,n,r);return;case"atlas":Oo(e,t,n,r);return;case"viewpoint":So(e,t,n,r);return;case"annotation":To(e,n,r);return;case"group":Mo(e,n,r);return;case"relation":Ao(e,n,r);return;case"event":Lo(e,t,n,r);return;case"object":Eo(e,t,n,r);return}}function xo(e,t,n){let r=G(t,e.seenFields,n),i=$(t,n);switch(r){case"title":e.system.title=i;return;case"description":_(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":_(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":_(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function ko(e,t,n){let r=G(t,e.seenFields,n),i=$(t,n);switch(r){case"view":Jn(i)&&oe(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Zn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=Qn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Oo(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=er(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function So(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){Po(e,n,r);return}if(e.inFilter){Do(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(oe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new d('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??At();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=G(n,e.seenFields,r),a=$(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":Jn(a)&&oe(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Zn(a,r,n[0].column);return;case"preset":e.viewpoint.preset=Qn(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Mt(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=ne(a,r,n[0].column,"rotation");return;case"camera":oe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=No(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=_o(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":_(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=N(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Po(e,t,n){let r=G(t,e.seenCameraFields,n),i=$(t,n),a=e.viewpoint.camera??At();switch(r){case"azimuth":a.azimuth=ne(i,n,t[0].column,"camera.azimuth");break;case"elevation":a.elevation=ne(i,n,t[0].column,"camera.elevation");break;case"roll":a.roll=ne(i,n,t[0].column,"camera.roll");break;case"distance":a.distance=Mt(i,n,t[0].column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=a}function Do(e,t,n){let r=G(t,e.seenFilterFields,n),i=e.viewpoint.filter??zo();switch(r){case"query":i.query=$(t,n);break;case"objecttypes":i.objectTypes=Ro(t.slice(1),n);break;case"tags":i.tags=N(t.slice(1),n,"tags");break;case"groups":i.groupIds=N(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function To(e,t,n){switch(G(t,e.seenFields,n)){case"label":e.annotation.label=$(t,n);return;case"target":e.annotation.targetObjectId=$(t,n);return;case"body":e.annotation.body=$(t,n);return;case"tags":e.annotation.tags=N(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Mo(e,t,n){switch(G(t,e.seenFields,n)){case"label":e.group.label=$(t,n);return;case"summary":e.group.summary=$(t,n);return;case"color":e.group.color=$(t,n);return;case"tags":e.group.tags=N(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=Q($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Ao(e,t,n){switch(G(t,e.seenFields,n)){case"from":e.relation.from=$(t,n);return;case"to":e.relation.to=$(t,n);return;case"kind":e.relation.kind=$(t,n);return;case"label":e.relation.label=$(t,n);return;case"summary":e.relation.summary=$(t,n);return;case"tags":e.relation.tags=N(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=Q($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Lo(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&oe(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Fo(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new d(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let a=n[1].value;if(!a.trim())throw new d("Event pose object id must not be empty",r,n[1].column);let s={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(s),e.activePose=s,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new d('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(G(n,e.seenFields,r)){case"kind":e.event.kind=$(n,r);return;case"label":e.event.label=$(n,r);return;case"summary":e.event.summary=$(n,r);return;case"target":e.event.targetObjectId=$(n,r);return;case"participants":e.event.participantObjectIds=N(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"epoch":oe(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=$(n,r);return;case"referenceplane":oe(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=$(n,r);return;case"tags":e.event.tags=N(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=Q($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Fo(e,t,n){if(e.length<2)throw new d("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Hn.has(r))throw new d(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new d(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function Eo(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||fo.has(i)){i!=="info"&&_(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=er(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new d(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,s=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(s.has(i.key))throw new d(`Duplicate ${a} key "${i.key}"`,r,n[0].column);s.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(Vo(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function G(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function Ro(e,t){return N(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function _o(e,t,n,r){let i={};for(let a of N(e,t,"layers")){let s=!a.startsWith("-")&&!a.startsWith("!"),c=a.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=s,i["orbits-front"]=s;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&_(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=s)}return i}function N(e,t,n){if(e.length===0)throw new d(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new d(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Zn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new d(`Unknown projection "${e}"`,t,n);return r}function Jn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function Qn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function Mt(e,t,n,r){let i=ne(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function ne(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function zo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function At(){return{azimuth:null,elevation:null,roll:null,distance:null}}function No(e,t,n){if(e.length===0||e.length%2!==0)throw new d('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:At(),i=new Set;for(let a=0;a<e.length;a+=2){let s=e[a],c=e[a+1],o=s.value.toLowerCase();if(i.has(o))throw new d(`Duplicate viewpoint camera field "${s.value}"`,t,s.column);i.add(o);let l=c.value;switch(o){case"azimuth":r.azimuth=ne(l,t,s.column,"camera.azimuth");break;case"elevation":r.elevation=ne(l,t,s.column,"camera.elevation");break;case"roll":r.roll=ne(l,t,s.column,"camera.roll");break;case"distance":r.distance=Mt(l,t,s.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${s.value}"`,t,s.column)}}return r}function Co(e,t,n,r,i){let a=[],s=0;for(;s<e.length;){let c=e[s],o=Te(c.value);if(!o)throw new d(`Unknown field "${c.value}"`,t,c.column);o.version==="2.1"&&_(r,i,c.value,{line:t,column:c.column}),s++;let l=[];if(o.inlineMode==="single"){let u=e[s];u&&(l.push(u),s++)}else if(o.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[s];if(!f)break;l.push(f),s++}else for(;s<e.length&&!po.has(e[s].value);)l.push(e[s]),s++;if(l.length===0)throw new d(`Missing value for field "${c.value}"`,t,c.column);a.push({type:"field",key:c.value,values:l.map(u=>u.value),location:{line:t,column:c.column}})}return ir(a,n),a}function Vo(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let a=Te(e[0].value);if(!a)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&_(r,i,e[0].value,{line:t,column:e[0].column});let s={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return ir([s],n),s}function er(e,t,n){if(e.length<2)throw new d(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function Bo(e,t,n){let r=tr(e.fields),i=nr(r),a=Yo(e.objectType,r),s=Zo(r.get("groups")?.[0]),c=tt(r.get("epoch")?.[0]),o=tt(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?Q(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Ho(r.get("resonance")[0]):void 0,f=Go(r),p=r.get("derive")?.map(j=>Ko(j)),m=r.get("validate")?.map(j=>({rule:z(j)})),v=r.has("locked")?[...new Set(r.get("locked").flatMap(j=>j.values))]:void 0,h=r.get("tolerance")?.map(j=>Xo(j)),k=qo(e.typedBlockEntries),O=rr(e.infoEntries,"info"),b={type:e.objectType,id:e.id,properties:a,placement:i,info:O};return s.length>0&&(b.groups=s),c&&(b.epoch=c),o&&(b.referencePlane=o),l!==void 0&&(b.tidalLock=l),u&&(b.resonance=u),f&&(b.renderHints=f),p?.length&&(b.deriveRules=p),m?.length&&(b.validationRules=m),v?.length&&(b.lockedFields=v),h?.length&&(b.tolerances=h),k&&Object.keys(k).length>0&&(b.typedBlocks=k),it(t,"2.1")&&(b.groups||b.epoch||b.referencePlane||b.tidalLock!==void 0||b.resonance||b.renderHints||b.deriveRules?.length||b.validationRules?.length||b.lockedFields?.length||b.tolerances?.length||b.typedBlocks)&&_(t,n,e.id,e.location),b}function Uo(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Wo(n))}}function Wo(e){let t=tr(e.fields,"event-pose"),n=nr(t);return{objectId:e.objectId,placement:n,inner:te(t.get("inner")?.[0],"inner"),outer:te(t.get("outer")?.[0],"outer"),epoch:tt(t.get("epoch")?.[0]),referencePlane:tt(t.get("referencePlane")?.[0])}}function tr(e,t="object"){let n=new Map;for(let r of e){let i=Te(r.key);if(!i&&!Hn.has(r.key))throw d.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw d.fromLocation(`Duplicate field "${r.key}"`,r.location);let a=n.get(r.key)??[];a.push(r),n.set(r.key,a)}return n}function nr(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let s=t??n??r??i;throw d.fromLocation("Object has multiple placement modes",s?.location)}if(t)return{mode:"orbit",target:z(t),distance:te(e.get("distance")?.[0],"distance"),semiMajor:te(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Jo(e.get("eccentricity")?.[0],"eccentricity"),period:te(e.get("period")?.[0],"period"),angle:te(e.get("angle")?.[0],"angle"),inclination:te(e.get("inclination")?.[0],"inclination"),phase:te(e.get("phase")?.[0],"phase")};if(n){let s=z(n);return{mode:"at",target:s,reference:Bn(s,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let s=z(i),c=St(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function Yo(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],s=Te(r);!a||!s?.legacySchema||s.legacySchema.placement||(Pt(r,e,a.location),n[r]=Un(r,a.values,a.location))}return n}function rr(e,t){let n={};for(let r of e){if(r.key in n)throw d.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function qo(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=rr(r,n))}return t}function Go(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=Q(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=Q(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=Qe(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Ho(e){if(e.values.length!==2)throw d.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw d.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Ko(e){if(e.values.length!==2)throw d.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Xo(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=St(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Zo(e){return e?[...new Set(e.values)]:[]}function tt(e){return e&&e.values.join(" ").trim()||null}function te(e,t){return e?Ot(z(e),e.location,t):void 0}function Jo(e,t){return e?Qe(z(e),t,e.location):void 0}function z(e){return Se(e.values,e.key,e.location)}function Te(e){return nt.get(e)}function ir(e,t){for(let n of e){let r=Te(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Pt(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function _(e,t,n,r){it(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function oe(e,t,n,r){it(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function it(e,t){return Gn(e)<Gn(t)}function Gn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function Qo(e){let t=[...e],n=[],r=!1,i=!1,a=null,s=1,c=1;for(let o=0;o<t.length;o++){let l=t[o],u=t[o+1];if(i){if(l==="*"&&u==="/"){t[o]=" ",t[o+1]=" ",i=!1,a=null,o++,c+=2;continue}l!==`
1
+ "use strict";var WorldOrbitCore=(()=>{var lt=Object.defineProperty;var xr=Object.getOwnPropertyDescriptor;var kr=Object.getOwnPropertyNames;var Or=Object.prototype.hasOwnProperty;var Sr=(e,t)=>{for(var n in t)lt(e,n,{get:t[n],enumerable:!0})},Pr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of kr(t))!Or.call(e,i)&&i!==n&&lt(e,i,{get:()=>t[i],enumerable:!(r=xr(t,i))||r.enumerable});return e};var Tr=e=>Pr(lt({},"__esModule",{value:!0}),e);var ys={};Sr(ys,{WORLDORBIT_FIELD_KEYS:()=>Wt,WORLDORBIT_FIELD_SCHEMAS:()=>ut,WORLDORBIT_OBJECT_TYPES:()=>ge,WorldOrbitError:()=>d,cloneAtlasDocument:()=>at,createDiagnostic:()=>Xt,createEmptyAtlasDocument:()=>Lt,detectWorldOrbitSchemaVersion:()=>Nt,diagnosticFromError:()=>A,evaluateSpatialSceneAtTime:()=>kn,extractWorldOrbitBlocks:()=>yr,formatAtlasDocument:()=>Ze,formatDocument:()=>Je,formatDraftDocument:()=>$t,getAtlasDocumentNode:()=>Ft,getFieldSchema:()=>D,isKnownFieldKey:()=>dt,listAtlasDocumentPaths:()=>or,load:()=>ms,loadWorldOrbitSource:()=>st,loadWorldOrbitSourceWithDiagnostics:()=>Ct,materializeAtlasDocument:()=>Oe,materializeDraftDocument:()=>Tn,normalizeDocument:()=>W,normalizeWithDiagnostics:()=>Zt,parse:()=>br,parseSafe:()=>hs,parseWithDiagnostics:()=>_e,parseWorldOrbit:()=>Z,parseWorldOrbitAtlas:()=>rt,parseWorldOrbitDraft:()=>Xn,removeAtlasDocumentNode:()=>cr,render:()=>ps,renderDocumentToScene:()=>q,renderDocumentToSpatialScene:()=>xn,resolveAtlasDiagnosticPath:()=>_t,resolveAtlasDiagnostics:()=>Rt,rotatePoint:()=>cn,stringify:()=>gs,supportsObjectType:()=>ft,tokenizeLine:()=>Yt,tokenizeLineDetailed:()=>ae,unitFamilyAllowsUnit:()=>ye,updateAtlasDocumentNode:()=>sr,upgradeDocumentToDraftV2:()=>Xe,upgradeDocumentToV2:()=>ke,upsertAtlasDocumentNode:()=>Et,validateAtlasDocumentWithDiagnostics:()=>lr,validateDocument:()=>Y,validateDocumentWithDiagnostics:()=>Jt});var d=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var he=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],R=he.filter(e=>e!=="system"),Dr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Ut=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Mr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function I(e,t){return{key:e,...t}}var ge=new Set(he),ut=new Map([I("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),I("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),I("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),I("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),I("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),I("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("at",{kind:"string",placement:!0,arity:"single",objectTypes:Ut}),I("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Ut}),I("free",{kind:"string",placement:!0,arity:"single",objectTypes:Mr}),I("kind",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("class",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("culture",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:he}),I("color",{kind:"string",placement:!1,arity:"single",objectTypes:he}),I("image",{kind:"string",placement:!1,arity:"single",objectTypes:Dr}),I("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:he}),I("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"radius"}),I("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"mass"}),I("density",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),I("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),I("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),I("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:R}),I("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),I("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("on",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("source",{kind:"string",placement:!1,arity:"single",objectTypes:R}),I("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"duration"})].map(e=>[e.key,e])),Wt=new Set(ut.keys());function D(e){return ut.get(e)}function dt(e){return Wt.has(e)}function ft(e,t){return e.objectTypes.includes(t)}function ye(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function Yt(e){return ae(e).map(t=>t.value)}function ae(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,s=!1,c=!1,o=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:s}),i="",a=null,s=!1)};for(let u=0;u<e.length;u++){let f=e[u],p=r+u+1;if(c&&f==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(f==='"'){c?c=!1:(a===null&&(a=p),s=!0,o=p,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}a===null&&(a=p),i+=f}if(c)throw new d("Unclosed quote in line",t.line,o??r+e.length);return l(),n}function Fe(e){return e.match(/^\s*/)?.[0].length??0}function Z(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,a=!1,s=!1,c=null,o=null,l=null,u=null;for(let f=0;f<t.length;f++){let p=t[f],m=f+1;if(!p.trim())continue;let g=Fe(p),h=ae(p.slice(g),{line:m,columnOffset:g});if(h.length!==0){if(g===0){if(a=!1,s=!1,c=null,o=null,l=null,u=null,h.length>=1&&h[0].value==="theme"){s=!0,o=0,r={type:"theme",preset:h.length>=2?h[1].value:null,blocks:[],location:{line:m,column:h[0].column}};continue}let j=Ar(h,m);n.push(j),i=j;continue}if(s){if(h.length>=2&&h[0].value==="preset"&&(!l||g<=l)){r&&(r.preset=h[1].value);continue}u&&l!==null&&g>l?u.fields.push(Er(h,m)):(l=g,u={type:"theme-block",target:h[0].value,fields:[],location:{line:m,column:h[0].column}},r?.blocks.push(u));continue}if(!i)throw new d("Indented line without parent object",m,g+1);if(h.length===1&&h[0].value==="info"){a=!0,c=g;continue}a&&g<=(c??0)&&(a=!1),a?i.infoEntries.push(Rr(h,m)):i.blockFields.push(Fr(h,m))}}return{type:"document",theme:r,objects:n}}function Ar(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!ge.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Lr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Lr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=D(i.value);if(!a)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let s=[];if(a.arity==="multiple")for(;r<e.length&&!dt(e[r].value);)s.push(e[r]),r++;else{let c=e[r];c&&(s.push(c),r++)}if(s.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:s.map(c=>c.value),location:{line:t,column:i.column}})}return n}function Fr(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!D(e[0].value))throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Er(e,t){if(e.length<2)throw new d("Invalid theme field line",t,e[0]?.column??1);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Rr(e,t){if(e.length<2)throw new d("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var qt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,_r=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),zr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function W(e){let t=null,n=[],r=e.theme?Nr(e.theme):null;for(let i of e.objects){let a=Vr(i);if(i.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",i.location);t=a}else n.push(a)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],objects:n}}function Nr(e){let t={};for(let n of e.blocks){let r=Gt(n.fields);t[n.target]=Cr(r)}return{preset:e.preset,styles:t}}function Cr(e){let t={};for(let[n,r]of e.entries()){if(r.values.length===1){let i=r.values[0];if(i==="true"){t[n]=!0;continue}if(i==="false"){t[n]=!1;continue}let a=Number(i);if(!Number.isNaN(a)&&i.trim()!==""){t[n]=a;continue}}t[n]=r.values.join(" ")}return t}function Vr(e){let t=[...e.inlineFields,...e.blockFields];Br(e.objectType,t);let n=Gt(t),r=Ur(e.objectType,n),i=Wr(n),a=Gr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function Br(e,t){for(let n of t){let r=D(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!ft(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Gt(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Ur(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),s=[n,r,i,a].filter(Boolean).length;if(s>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&s>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ee(t,"orbit"),distance:ce(t,"distance"),semiMajor:ce(t,"semiMajor"),eccentricity:Xr(t,"eccentricity"),period:ce(t,"period"),angle:ce(t,"angle"),inclination:ce(t,"inclination"),phase:ce(t,"phase")};if(r){let c=Re(t,"at"),o=Ee(t,"at");return{mode:"at",target:o,reference:Hr(o,c.location)}}if(i)return{mode:"surface",target:Ee(t,"surface")};if(a){let c=Ee(t,"free"),o=Kr(c);return{mode:"free",distance:o??void 0,descriptor:o?void 0:c}}return null}function Wr(e){let t={};for(let[n,r]of e.entries()){let i=D(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Zr(r);break;case"number":t[n]=Kt(le(r),n,r.location);break;case"unit":t[n]=Ht(le(r),r.location,n);break;case"string":t[n]=Yr(n,r);break}}return t}function Yr(e,t){let n=t.values.join(" ").trim();return e==="image"&&qr(n,t.location),n}function qr(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(zr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Gr(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Hr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Ht(e,t,n){let r=e.match(qt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!ye(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Kr(e){let t=e.match(qt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ce(e,t){if(!e.has(t))return;let n=Re(e,t);return Ht(le(n),n.location,t)}function Xr(e,t){if(!e.has(t))return;let n=Re(e,t);return Kt(le(n),t,n.location)}function Kt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Zr(e){let t=le(e).toLowerCase(),n=_r.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Re(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function Ee(e,t){return le(Re(e,t))}function le(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Jr=new Set(["star","planet","moon","asteroid","comet"]);function Y(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Jr.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Qr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&ei(r,r.placement.reference,t))}}function Qr(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function ei(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Xt(e){return{...e}}function A(e,t,n=`${t}.failed`){return e instanceof d?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function _e(e){let t;try{t=Z(e)}catch(r){return{ok:!1,value:null,diagnostics:[A(r,"parse")]}}let n;try{n=W(t)}catch(r){return{ok:!1,value:null,diagnostics:[A(r,"normalize")]}}try{Y(n)}catch(r){return{ok:!1,value:null,diagnostics:[A(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Zt(e){try{return{ok:!0,value:W(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[A(t,"normalize")]}}}function Jt(e){try{return Y(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[A(t,"validate")]}}}var be=1495978707e-1,ti=6371,ni=71492,ri=695700,ii=63241.077,ai=206264.806,oi=206264806,on=.68,si=.2,sn=28;function q(e,t={}){let n=ui(t),r=n.width,i=n.height,a=n.padding,s=li(e),c=fi(e,t.projection),o=bt(t.camera??null),l=yt(c,o),u=hi(s,t.scaleModel),f=yi(s),p=e.system?.id??null,m=t.activeEventId??null,g=ci(e.objects,e.events??[],m),h=new Map(g.map(b=>[b.id,b])),j=ea(g,h),O=new Map,v=[],x=[],L=[],C=[],F=[],H=new Map,K=new Map;for(let b of g){let E=b.placement;if(!E){L.push(b);continue}if(E.mode==="orbit"){nn(K,E.target,b);continue}if(E.mode==="surface"){nn(H,E.target,b);continue}if(E.mode==="at"){F.push(b);continue}C.push(b)}let re=C.length>0?r*.42:r/2,T=i/2,V={orbitChildren:K,surfaceChildren:H,objectMap:h,spacingFactor:f,projection:l,scaleModel:u},B=L.find(b=>b.type==="star")??L[0]??null;B&&mt(B,re,T,0,O,v,x,V);let U=L.filter(b=>b.id!==B?.id);if(U.length>0){let b=Math.min(r,i)*.28*f*u.orbitDistanceMultiplier;U.forEach((E,S)=>{let ct=je(S,U.length,-Math.PI/2),ie=xe(ct,b,l,1);mt(E,re+ie.x,T+ie.y,0,O,v,x,V)})}C.forEach((b,E)=>{let S=r-a-140-oa(b.placement?.mode==="free"?b.placement.distance:void 0,u),ct=Math.max(76,(i-a*2-180)/Math.max(1,C.length)*f)*u.freePlacementMultiplier,ie=a+92+E*ct;O.set(b.id,{object:b,x:S,y:ie,radius:Be(b,0,u),sortKey:We(S,ie,0)}),x.push({object:b,groupId:j.groupIds.get(b.id)??null,x1:S-60,y1:ie,x2:S-18,y2:ie,mode:"free"}),Ce(b,O,v,x,V,1)}),F.forEach((b,E)=>{if(O.has(b.id)||!b.placement||b.placement.mode!=="at")return;let S=Ji(b.placement.reference,O,h,E,F.length,r,i,a,V);O.set(b.id,{object:b,x:S.x,y:S.y,radius:Be(b,2,u),sortKey:We(S.x,S.y,2),anchorX:S.anchorX,anchorY:S.anchorY}),S.anchorX!==void 0&&S.anchorY!==void 0&&x.push({object:b,groupId:j.groupIds.get(b.id)??null,x1:S.anchorX,y1:S.anchorY,x2:S.x,y2:S.y,mode:"at"}),Ce(b,O,v,x,V,2)});let M=[...O.values()].map(b=>bi(b,u,j)),Me=v.map(b=>vi(b,j.groupIds.get(b.object.id)??null)),Ae=x.map(b=>wi(b)),Le=Ii(M,r,i,u.labelMultiplier),Vt=Ti(e,M),Bt=Di(e.events??[],M,m),vr=Oi(Me,Vt,Bt,Ae,M,Le),wr=Si(M,Me,Ae,Le,j,u.labelMultiplier),Ir=Pi(e,M),$r=Mi(e,c,n.preset,j,h),jr=Ui(r,i,M,Me,Ae,Le,u.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:c,renderProjection:l,camera:o,scaleModel:u,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:mi(c,l,s,o),systemId:p,viewMode:c,layoutPreset:s,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??s),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...o?.azimuth!==null?{"camera.azimuth":String(o?.azimuth)}:{},...o?.elevation!==null?{"camera.elevation":String(o?.elevation)}:{},...o?.roll!==null?{"camera.roll":String(o?.roll)}:{},...o?.distance!==null?{"camera.distance":String(o?.distance)}:{}},contentBounds:jr,layers:vr,groups:wr,semanticGroups:Ir,viewpoints:$r,events:Bt,activeEventId:m,objects:M,orbitVisuals:Me,relations:Vt,leaders:Ae,labels:Le}}function cn(e,t,n){let r=Ye(n),i=Math.cos(r),a=Math.sin(r),s=e.x-t.x,c=e.y-t.y;return{x:t.x+s*i-c*a,y:t.y+s*a+c*i}}function ci(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let a=new Map(r.map(c=>[c.id,c])),s=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of s){let o=a.get(c);o&&(i.epoch&&(o.epoch=i.epoch),i.referencePlane&&(o.referencePlane=i.referencePlane))}for(let c of i.positions){let o=a.get(c.objectId);o&&(c.placement&&(o.placement=structuredClone(c.placement)),c.inner&&(o.properties.inner={...c.inner}),c.outer&&(o.properties.outer={...c.outer}),c.epoch&&(o.epoch=c.epoch),c.referencePlane&&(o.referencePlane=c.referencePlane))}return r}function li(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function ui(e){let t=di(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function di(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function fi(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return dn(n)??"topdown"}function yt(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function bt(e){if(!e)return null;let t={azimuth:pt(e.azimuth),elevation:pt(e.elevation),roll:pt(e.roll),distance:pi(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function pt(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function pi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function mi(e,t,n,r){let i=[`${rn(e)} view`,`${rn(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let a=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);a.length>0&&i.push(`camera ${a.join(" / ")}`)}return i.join(" - ")}function hi(e,t){return{...gi(e),...t}}function gi(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function yi(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function bi(e,t,n){let{object:r,x:i,y:a,radius:s,sortKey:c,anchorX:o,anchorY:l}=e,u=r.renderHints?.renderPriority??0;return{renderId:ue(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:s,visualRadius:aa(r,s,t),sortKey:c+u*.001,anchorX:o,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:ca(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function vi(e,t){return{renderId:`${ue(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function wi(e){return{renderId:`${ue(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Ii(e,t,n,r){let i=[],a=[],s=new Map(e.map(o=>[o.objectId,o])),c=[...e].filter(o=>!o.hidden&&o.object.renderHints?.renderLabel!==!1).sort($i);for(let o of c){let l=ji(o,s,a,t,n,r)??un(o,ln(o,s.get(o.parentId??"")??null,n),0,r);a.push(gn(o,l,r)),i.push({renderId:`${o.renderId}-label`,objectId:o.objectId,object:o.object,groupId:o.groupId,semanticGroupIds:[...o.semanticGroupIds],label:o.label,secondaryLabel:o.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:o.hidden})}return i}function $i(e,t){let n=Qt(e)-Qt(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function Qt(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function ji(e,t,n,r,i,a){for(let s of xi(e,t,r,i)){let c=s==="left"||s==="right"?4:6;for(let o=0;o<=c;o+=1){let l=un(e,s,o,a),u=gn(e,l,a);if(!n.some(f=>ra(f,u)))return l}}return null}function xi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=ln(e,i,r),s=a==="below"?"above":"below",c=ki(e,i,n),o=c==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,a,o,s]:[a,c,s,o]}function ln(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function ki(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function un(e,t,n,r){let i=14*r;switch(t){case"above":{let a=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:a,secondaryY:a-16*r,textAnchor:"middle",direction:t}}case"below":{let a=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:a,secondaryY:a+16*r,textAnchor:"middle",direction:t}}case"left":{let a=e.x-(e.visualRadius+16*r+n*i),s=e.y-4*r;return{x:a,labelY:s,secondaryY:s+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,s=e.y-4*r;return{x:a,labelY:s,secondaryY:s+16*r,textAnchor:"start",direction:t}}}}function Oi(e,t,n,r,i,a){let s=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),c=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"events",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"objects",renderIds:i.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:a.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Si(e,t,n,r,i,a){let s=new Map,c=o=>{if(!o)return null;let l=s.get(o);if(l)return l;let u=i.groupRoots.get(o)??null,f={renderId:o,rootObjectId:u,label:u??o,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:$e(0,0,0,0)};return s.set(o,f),f};for(let o of e){let l=c(o.groupId);l&&!o.hidden&&l.objectIds.push(o.objectId)}for(let o of t){let l=c(o.groupId);l&&!o.hidden&&l.orbitIds.push(o.objectId)}for(let o of n){let l=c(o.groupId);l&&!o.hidden&&l.leaderIds.push(o.objectId)}for(let o of r){let l=c(o.groupId);l&&!o.hidden&&l.labelIds.push(o.objectId)}for(let o of s.values())o.contentBounds=ta(o,e,t,n,r,a);return[...s.values()].sort((o,l)=>o.label.localeCompare(l.label))}function Pi(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function Ti(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${ue(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Di(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let a=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],s=a.map(l=>r.get(l)).filter(Boolean),c=s.length>0?s.reduce((l,u)=>l+u.x,0)/s.length:0,o=s.length>0?s.reduce((l,u)=>l+u.y,0)/s.length:0;return{renderId:`${ue(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:o,hidden:i.hidden||s.length===0||s.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Mi(e,t,n,r,i){let a=Ai(e,t,n),s=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...m]=l.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let g=Ci(p);if(!g)continue;let h=m.join(".").toLowerCase(),j=s.get(g)??{id:g};Li(j,h,u,e,t,n,r,i),s.set(g,j)}let c=[...s.values()].map(l=>Fi(l,t,n,i)).filter(Boolean),o=c.findIndex(l=>l.id===a.id);return o>=0?c.splice(o,1,{...a,...c[o],layers:{...a.layers,...c[o].layers},filter:c[o].filter??a.filter,generated:!1}):c.unshift(a),c.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function Ai(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",a=bt(null),s=yt(t,a);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:s,camera:a,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Li(e,t,n,r,i,a,s,c){let o=n.trim();switch(t){case"label":case"title":o&&(e.label=o);return;case"summary":case"description":o&&(e.summary=o);return;case"focus":case"object":o&&(e.focus=o);return;case"select":case"selection":o&&(e.select=o);return;case"events":e.eventIds=Ie(o);return;case"projection":case"view":e.projection=dn(o)??i;return;case"preset":e.preset=Ri(o)??a;return;case"rotation":case"angle":e.rotationDeg=ve(o)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ne(),azimuth:ve(o)};return;case"camera.elevation":e.camera={...e.camera??Ne(),elevation:ve(o)};return;case"camera.roll":e.camera={...e.camera??Ne(),roll:ve(o)};return;case"camera.distance":e.camera={...e.camera??Ne(),distance:en(o)};return;case"zoom":case"scale":e.scale=en(o);return;case"layers":e.layers=_i(o);return;case"query":e.filter={...e.filter??ze(),query:o||null};return;case"types":case"objecttypes":e.filter={...e.filter??ze(),objectTypes:zi(o)};return;case"tags":e.filter={...e.filter??ze(),tags:Ie(o)};return;case"groups":e.filter={...e.filter??ze(),groupIds:Ni(o,r,s,c)};return}}function Fi(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,s=Ei(e.filter),c=e.label?.trim()||Vi(e.id),o=e.projection??t,l=bt(e.camera??null),u=yt(o,l);return{id:e.id,label:c,summary:e.summary?.trim()||Bi(c,i,s),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:o,renderProjection:u,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:s,generated:!1}}function ze(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ne(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ei(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function dn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function Ri(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function ve(e){let t=Number(e);return Number.isFinite(t)?t:null}function en(e){let t=ve(e);return t!==null&&t>0?t:null}function _i(e){let t={};for(let n of Ie(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function zi(e){return Ie(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Ni(e,t,n,r){return Ie(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??we(i):(r.has(i),we(i)))}function Ie(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ci(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Vi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Bi(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function Ui(e,t,n,r,i,a,s){let c=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(p,m)=>{c=Math.min(c,p),o=Math.min(o,m),l=Math.max(l,p),u=Math.max(u,m)};for(let p of r)p.hidden||fn(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||pn(p,f);for(let p of a)p.hidden||mn(p,f,s);return!Number.isFinite(c)||!Number.isFinite(o)?$e(0,0,e,t):$e(c,o,l,u)}function fn(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,a=bn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,sn*2);for(let s of a)t(s.x-n,s.y-n),t(s.x+n,s.y+n)}function $e(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function pn(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function mn(e,t,n){let r=yn(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function mt(e,t,n,r,i,a,s,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Be(e,r,c.scaleModel),sortKey:We(t,n,r)}),Ce(e,i,a,s,c,r+1))}function Ce(e,t,n,r,i,a){let s=t.get(e.id);if(!s)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(Wi),o=Yi(c,s.radius,i.spacingFactor,i.scaleModel),l=Hi(c,o);c.forEach((f,p)=>{let m=qi(f,p,c.length,s,o,l[p]??o.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),mt(f,m.objectX,m.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,p)=>{let m=je(p,u.length,-Math.PI/3),g=28*i.spacingFactor,h=xe(m,s.radius,i.projection,i.projection==="isometric"?.9:1),j=xe(m,s.radius+g,i.projection,i.projection==="isometric"?.9:1),O=s.x+h.x,v=s.y+h.y,x=s.x+j.x,L=s.y+j.y;t.set(f.id,{object:f,x,y:L,radius:Be(f,a+1,i.scaleModel),sortKey:We(x,L,a+1),anchorX:O,anchorY:v}),r.push({object:f,groupId:i.objectMap.has(f.id)?we(na(f,i.objectMap)):null,x1:O,y1:v,x2:x,y2:L,mode:"surface"}),Ce(f,t,n,r,i,a+1)})}function Wi(e,t){let n=Ve(e),r=Ve(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Yi(e,t,n,r){let i=e.map(f=>Ve(f)),a=i.filter(f=>f!==null),s=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42};let o=Math.min(...a),l=Math.max(...a),u=l-o;return{metrics:i,minMetric:o,maxMetric:l,metricSpread:u,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function qi(e,t,n,r,i,a,s){let c=e.placement,o=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let K=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:K,rotationDeg:0,band:o,bandThickness:o?12*s.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-K}}let l=P(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),u=a,f=Math.max(u*Math.sqrt(1-l*l),u*.18),p=gt(c.inclination)??0,m=s.projection==="isometric"?Math.max(si,Math.cos(Ye(p)))*on:1,g=Math.max(f*m,u*.14),h=gt(c.angle)??0,j=u*l,O=wn(-j,0,h),v=r.x+O.x,x=r.y+O.y,L=Xi(c.phase,t,n),C=vn(v,x,u,g,h,L),F=s.projection==="topdown"&&l<=1e-4&&Math.abs(h)<=1e-4,H=o?Zi(e,u,i,s.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:v,cy:F?r.y:x,radius:F?u:void 0,rx:F?void 0:u,ry:F?void 0:g,rotationDeg:h,band:o,bandThickness:H,frontArcPath:s.projection==="isometric"||o?tn(v,x,u,g,h,0,Math.PI):void 0,backArcPath:s.projection==="isometric"||o?tn(v,x,u,g,h,Math.PI,Math.PI*2):void 0,objectX:C.x,objectY:C.y}}function Gi(e,t){return t.innerPx+t.stepPx*Ki(Math.max(e,0)+1)}function Hi(e,t){let n=[];return e.forEach((r,i)=>{let a=Ve(r),s=t.innerPx+i*t.stepPx,c=a===null?s:Gi(a,t),o=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,o))}),n}function Ve(e){return!e.placement||e.placement.mode!=="orbit"?null:Ue(e.placement.semiMajor??e.placement.distance??null)}function Ki(e){return Math.log(e)/Math.log(2)}function Xi(e,t,n){let r=e?gt(e):null;return r!==null?Ye(r-90):je(t,n,-Math.PI/2)}function Zi(e,t,n,r){let i=Ue(ht(e.properties.inner)),a=Ue(ht(e.properties.outer));if(i!==null&&a!==null){let c=Math.abs(a-i);if(n.metricSpread>0)return P(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let o=Math.max(Math.max(i,a),1e-4);return P(c/o*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Ji(e,t,n,r,i,a,s,c,o){if(e.kind==="lagrange")return Qi(e,t,n,a,s);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=je(r,i,Math.PI/5),f=(l.radius+36)*o.scaleModel.labelMultiplier,p=xe(u,f,o.projection,o.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=je(r,i,Math.PI/6),f=(l.radius+36)*o.scaleModel.labelMultiplier,p=xe(u,f,o.projection,o.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:a-c-170,y:s-c-86-r*58*o.scaleModel.freePlacementMultiplier}}function Qi(e,t,n,r,i){let a=e.secondary?t.get(e.primary):ia(e.primary,t,n),s=t.get(e.secondary??e.primary);if(!a||!s)return{x:r*.7,y:i*.25};let c=s.x-a.x,o=s.y-a.y,l=Math.hypot(c,o)||1,u=c/l,f=o/l,p=-f,m=u,g=P(l*.25,24,68);switch(e.point){case"L1":return{x:s.x-u*g,y:s.y-f*g,anchorX:s.x,anchorY:s.y};case"L2":return{x:s.x+u*g,y:s.y+f*g,anchorX:s.x,anchorY:s.y};case"L3":return{x:a.x-u*g,y:a.y-f*g,anchorX:a.x,anchorY:a.y};case"L4":return{x:s.x+(u*.5-p*.8660254)*g,y:s.y+(f*.5-m*.8660254)*g,anchorX:s.x,anchorY:s.y};case"L5":return{x:s.x+(u*.5+p*.8660254)*g,y:s.y+(f*.5+m*.8660254)*g,anchorX:s.x,anchorY:s.y}}}function ea(e,t){let n=new Map,r=new Map;for(let l of e){let u=hn(l,t);if(n.set(l.id,u),u){let f=r.get(u);f?f.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,s=new Map,c=l=>{let u=i.get(l);if(u)return u;let f=new Set,p=[],m=n.get(l)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(l,p),p},o=l=>{let u=s.get(a.get(l)??"");if(u)return u;let f=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&f&&(m=o(f)),m};for(let l of e){c(l.id);let u=o(l.id),f=we(u);a.set(l.id,f),s.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:s}}function hn(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function ta(e,t,n,r,i,a){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(f,p)=>{s=Math.min(s,f),c=Math.min(c,p),o=Math.max(o,f),l=Math.max(l,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&pn(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&fn(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&mn(f,u,a);return!Number.isFinite(s)||!Number.isFinite(c)?$e(0,0,0,0):$e(s,c,o,l)}function na(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=hn(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function gn(e,t,n){return yn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function yn(e,t,n,r,i,a,s,c){let o=la(a,s,c),l=o*2,u=i==="above"?18:12,f=i==="above"?8:12,p=e-o,m=e+o;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function ra(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function ia(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Be(e,t,n){let r=sa(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return P((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return P(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return P(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return P(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return P(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return P(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return P(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return P(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return P(8*i,n.minBodyRadius,n.maxBodyRadius)}}function aa(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Ue(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/be;case"m":return e.value/1e3/be;case"ly":return e.value*ii;case"pc":return e.value*ai;case"kpc":return e.value*oi;case"re":return e.value*ti/be;case"rj":return e.value*ni/be;case"sol":return e.value*ri/be;default:return e.value}}function oa(e,t){let n=Ue(e??null);return n===null||n<=0?0:P(n*96*t.freePlacementMultiplier,0,420)}function sa(e,t){let n=ht(e);if(!n)return null;let r;switch(n.unit){case"sol":r=P(n.value*22,14,40);break;case"re":r=P(n.value*10,6,18);break;case"km":r=P(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=P(n.value*4,4,20);break}return P(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ht(e){return!e||typeof e!="object"||!("value"in e)?null:e}function gt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function je(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function tn(e,t,n,r,i,a,s){let c=bn(e,t,n,r,i,a,s,sn);return c.length===0?"":c.map((o,l)=>`${l===0?"M":"L"} ${an(o.x)} ${an(o.y)}`).join(" ")}function bn(e,t,n,r,i,a,s,c){let o=[];for(let l=0;l<=c;l+=1){let u=a+(s-a)*l/c;o.push(vn(e,t,n,r,i,u))}return o}function vn(e,t,n,r,i,a){let s=n*Math.cos(a),c=r*Math.sin(a),o=wn(s,c,i);return{x:e+o.x,y:t+o.y}}function wn(e,t,n){let r=Ye(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function xe(e,t,n,r){let i=n==="isometric"?on*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function We(e,t,n){return t*1e3+e+n*.01}function P(e,t,n){return Math.min(Math.max(e,t),n)}function nn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ue(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function we(e){return`${ue(e)}-group`}function ca(e){return typeof e=="string"&&e.trim()?e:void 0}function la(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function rn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ye(e){return e*Math.PI/180}function an(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var jn=86400,qe=jn*365.25,Ge=18,In=180;function xn(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,activeEventId:t.activeEventId},r=q(e,n),i=pa(r.layoutPreset,t.spatialScaleModel),a={x:r.contentBounds.centerX,y:r.contentBounds.centerY},s=new Map(r.objects.map(h=>[h.objectId,h])),c=new Map(r.orbitVisuals.map(h=>[h.objectId,h])),o=new Map;for(let h of r.objects){let j=h.object.placement;!j||j.mode!=="orbit"||o.set(h.objectId,wt(j))}let l=Math.min(...[...o.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,f=r.objects.map(h=>ua(h,r,a,s,c,i,u,l)),p=new Map(f.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>da(h,p,l,r.activeEventId!==null)),g=f.map(h=>({objectId:h.objectId,center:{...h.position},radius:h.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:ha(f),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:f,orbits:m,focusTargets:g}}function ua(e,t,n,r,i,a,s,c){let o=He(e,t,n,r,i,s),l=It(e.object,i.get(e.objectId),c,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:o,radius:de(e.radius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius),visualRadius:de(e.visualRadius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:l}}function da(e,t,n,r){let i=t.get(e.objectId),a=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:a?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??Ke(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??It(e.object,e,n,r)}}function He(e,t,n,r,i,a){let s=a.get(e.objectId);if(s)return s;let c=e.object.placement,o;if(c?.mode==="orbit"&&e.parentId){let l=r.get(e.parentId),u=l?He(l,t,n,r,i,a):{x:0,y:0,z:0},f=i.get(e.objectId),p=It(e.object,f,1,t.activeEventId!==null),m=p?On(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};o=Sn(u,m)}else if(c?.mode==="surface"&&e.parentId){let l=r.get(e.parentId),u=l?He(l,t,n,r,i,a):{x:0,y:0,z:0},f=l?.visualRadius??16,p=ga(e.objectId),m=p*Math.PI*2;o={x:u.x+Math.cos(m)*(f+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(m)*(f+e.visualRadius*.9)}}else if(c?.mode==="at"&&e.parentId){let l=r.get(e.parentId),u=l?He(l,t,n,r,i,a):{x:0,y:0,z:0},f=e.anchorX??l?.x??n.x,p=e.anchorY??l?.y??n.y;o={x:u.x+(e.x-f),y:u.y,z:u.z+(e.y-p)}}else o={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return a.set(e.objectId,o),o}function kn(e,t){let n=new Map(e.objects.map(a=>[a.objectId,a])),r=new Map,i=a=>{let s=r.get(a);if(s)return s;let c=n.get(a);if(!c)return{x:0,y:0,z:0};let o={...c.position};if(c.motion&&c.parentId){let l=i(c.parentId),u=On(c.motion,e.timeFrozen?0:t);o=Sn(l,u)}return r.set(a,o),o};for(let a of e.objects)i(a.objectId);return r}function On(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=vt(n),i=vt(e.rotationDeg),a=vt(e.inclinationDeg),s=Math.cos(r)*e.semiMajor,c=Math.sin(r)*e.semiMinor,o=s*Math.cos(i)-c*Math.sin(i),l=s*Math.sin(i)+c*Math.cos(i);return{x:o,y:l*Math.sin(a),z:l*Math.cos(a)}}function It(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let a=t?.radius??t?.rx??de(wt(i)*48,24,1200),s=t?.radius??t?.ry??a,c=fa(i.period),o=wt(i),l=de(o/Math.max(n,1e-4),1,20),u=de(c?Ge*l:Ge*Math.pow(l,.75),Ge,In);return{phase0Deg:Ke(i.phase)??0,rotationDeg:Ke(i.angle)??t?.rotationDeg??0,inclinationDeg:Ke(i.inclination)??0,semiMajor:a,semiMinor:s,eccentricity:i.eccentricity??0,periodSeconds:c,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:c===null,frozen:r}}function wt(e){let t=$n(e.semiMajor)??$n(e.distance)??1;return Math.max(t,.01)}function $n(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function fa(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*jn;case"y":return e.value*qe;case"ky":return e.value*qe*1e3;case"my":return e.value*qe*1e6;case"gy":return e.value*qe*1e9;default:return null}}function Ke(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function pa(e,t){return{...ma(e),...t}}function ma(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function ha(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY,s=Number.NEGATIVE_INFINITY;for(let c of e)t=Math.min(t,c.position.x-c.visualRadius),n=Math.min(n,c.position.y-c.visualRadius),r=Math.min(r,c.position.z-c.visualRadius),i=Math.max(i,c.position.x+c.visualRadius),a=Math.max(a,c.position.y+c.visualRadius),s=Math.max(s,c.position.z+c.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:a,maxZ:s,width:i-t,height:a-n,depth:s-r,center:{x:(t+i)/2,y:(n+a)/2,z:(r+s)/2}}}function Sn(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function ga(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function de(e,t,n){return Math.min(Math.max(e,t),n)}function vt(e){return e*Math.PI/180}function ke(e,t={}){let n=q(e,t),r=[],i=va(e,r),a=wa(e,r),s=ba(e,n.renderPreset??t.preset??null,n.projection),c=e.system?ya(e,s,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(o=>!o.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(o=>!o.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.6",schemaVersion:"2.6",sourceVersion:e.version,theme:e.theme??null,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Dn),diagnostics:r}}function Xe(e,t={}){return Ma(ke(e,t))}function Oe(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:Pa(e.system),info:Ta(e.system)}:null,r=e.objects.map(Dn);return xa(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map($a),objects:r}}function Tn(e){return Oe(e)}function ya(e,t,n,r,i,a){let s=q(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:s.viewpoints.map(Ia),annotations:r}}function ba(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function va(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function wa(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...s]=r.split(".");if(!a||s.length===0)continue;let c=Pn(a);if(!c)continue;let o=n.get(c)??{id:c};switch(s.join(".").toLowerCase()){case"label":o.label=i;break;case"target":case"object":o.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":o.body=i;break;case"tags":o.tags=Oa(i);break}n.set(c,o)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Pn(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(s=>typeof s=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Sa(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Ia(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Dn(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:ka(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function $a(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(ja)}}function ja(e){return{objectId:e.objectId,placement:Mn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function Mn(e){return e?structuredClone(e):null}function xa(e,t,n){if(!n)return;let r=t.find(s=>s.id===n);if(!r)return;let i=new Map(e.map(s=>[s.id,s])),a=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(s=>s.objectId)]);for(let s of a){let c=i.get(s);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let s of r.positions){let c=i.get(s.objectId);c&&(s.placement&&(c.placement=Mn(s.placement)),s.inner&&(c.properties.inner={...s.inner}),s.outer&&(c.properties.outer={...s.outer}),s.epoch&&(c.epoch=s.epoch),s.referencePlane&&(c.referencePlane=s.referencePlane))}}function ka(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function Oa(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Pn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Sa(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Pa(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function Ta(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=Da(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Da(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function Ma(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var An=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Je(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"||e.version==="2.0-draft"){if(n==="2.0-draft"){let o=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Xe(e);return $t(o)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:ke(e);return(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6")&&c.version!==n?Ze({...c,version:n,schemaVersion:n}):Ze(c)}let i=[],a=e;a.system&&i.push(...Aa(a.system));let s=[...a.objects].sort(kt);for(let c of s)i.length>0&&i.push(""),i.push(...Fa(c));return i.join(`
2
+ `)}function Ze(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Fn(e.system));for(let r of[...e.groups].sort(fe))t.push(""),t.push(...zn(r));for(let r of[...e.relations].sort(fe))t.push(""),t.push(...Nn(r));for(let r of[...e.events].sort(fe))t.push(""),t.push(...Cn(r));let n=[...e.objects].sort(kt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...En(r))}),t.join(`
3
+ `)}function $t(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Fn(t.system));for(let i of[...t.groups].sort(fe))n.push(""),n.push(...zn(i));for(let i of[...t.relations].sort(fe))n.push(""),n.push(...Nn(i));for(let i of[...t.events].sort(fe))n.push(""),n.push(...Cn(i));let r=[...t.objects].sort(kt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...En(i))}),n.join(`
4
+ `)}function Aa(e){return La("system",e.id,e.properties,null,e.info)}function La(e,t,n,r,i){let a=[`${e} ${t}`],s=[...jt(r),..._n(n)];for(let o of s)a.push(` ${o}`);let c=Object.entries(i).sort(([o],[l])=>o.localeCompare(l));if(c.length>0){s.length>0&&a.push(""),a.push(" info");for(let[o,l]of c)a.push(` ${o} ${y(l)}`)}return a}function Fn(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${y(e.title)}`),e.description&&t.push(` description ${y(e.description)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${y(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${y(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${y(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${y(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Ra(n));for(let n of e.annotations)t.push(""),t.push(..._a(n));return t}function Fa(e){return Rn(e.type,e.id,e)}function En(e){return Rn(`object ${e.type}`,e.id,e)}function Rn(e,t,n){let r=[`${e} ${t}`],i=[...jt(n.placement),..._n(n.properties),...Ea(n)];for(let s of i)r.push(` ${s}`);let a=Object.entries(n.info).sort(([s],[c])=>s.localeCompare(c));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[s,c]of a)r.push(` ${s} ${y(c)}`)}for(let s of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[s]??{}).sort(([o],[l])=>o.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${s}`);for(let[o,l]of c)r.push(` ${o} ${y(l)}`)}}return r}function jt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...J("distance",e.distance),...J("semiMajor",e.semiMajor),...Ca("eccentricity",e.eccentricity),...J("period",e.period),...J("angle",e.angle),...J("inclination",e.inclination),...J("phase",e.phase)];case"at":return[`at ${Va(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?xt(e.distance):e.descriptor??""}`.trim()]}}function _n(e){return Object.keys(e).sort(Ua).map(t=>`${t} ${Vn(e[t])}`)}function Ea(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${y(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${y(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Vn(n.value)}`);return t}function Ra(e){let t=[`viewpoint ${e.id}`,` label ${y(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&Na(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=Ba(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${y(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(y).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function _a(e){let t=[`annotation ${e.id}`,` label ${y(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${y(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),t}function zn(e){let t=[`group ${e.id}`,` label ${y(e.label)}`];return e.summary&&t.push(` summary ${y(e.summary)}`),e.color&&t.push(` color ${y(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Nn(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${y(e.from)}`),e.to&&t.push(` to ${y(e.to)}`),e.kind&&t.push(` kind ${y(e.kind)}`),e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),t}function Cn(e){let t=[`event ${e.id}`,` kind ${y(e.kind)}`];if(e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${y(e.timing)}`),e.visibility&&t.push(` visibility ${y(e.visibility)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(Wa)){t.push(` pose ${n.objectId}`);for(let r of za(n))t.push(` ${r}`)}}return t}function za(e){return[...jt(e.placement),...e.epoch?[`epoch ${y(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${y(e.referencePlane)}`]:[],...J("inner",e.inner),...J("outer",e.outer)]}function Na(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Vn(e){return Array.isArray(e)?e.map(t=>y(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?y(e):xt(e)}function xt(e){return`${e.value}${e.unit??""}`}function J(e,t){return t?[`${e} ${xt(t)}`]:[]}function Ca(e,t){return t===void 0?[]:[`${e} ${t}`]}function Va(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Ba(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function Ua(e,t){let n=An.indexOf(e),r=An.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function kt(e,t){let n=Ln(e.type),r=Ln(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function fe(e,t){return e.id.localeCompare(t.id)}function Wa(e,t){return e.objectId.localeCompare(t.objectId)}function Ln(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function y(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Bn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Ya=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),qa=/^[A-Za-z][A-Za-z0-9+.-]*:/;function pe(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Pe(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Ot(e,t,n){let r=e.match(Bn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!ye(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function St(e){let t=e.match(Bn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Qe(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Q(e,t,n){let r=Ya.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Un(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Ga(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(qa);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Wn(e,t,n){let r=D(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw d.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return Q(Se(t,e,n),e,n);case"number":return Qe(Se(t,e,n),e,n);case"unit":return Ot(Se(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Ga(i,n),i}}}function Pt(e,t,n){let r=D(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw d.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function Se(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var qn=new Set(["star","planet","moon","asteroid","comet"]),Ha=332946.0487,Ka=1047.3486,et=1495978707e-1,Xa=6371,Za=695700,Ja=63241.077,Qa=206264.806,eo=206264806;function Te(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),a=new Set(e.events.map(c=>c.id));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[c,o]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of o){let u=s.get(l);u?n.push(w("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${u}.`)):s.set(l,c)}for(let c of e.relations)to(c,r,n);for(let c of e.system?.viewpoints??[])no(c,i,a,t,n,r);for(let c of e.objects)ro(c,e.system,r,i,n);for(let c of e.events)io(c,e.system,r,n);return n}function to(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function no(e,t,n,r,i,a){let s=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(s)for(let c of s.groupIds)t.has(c)||i.push(k("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(k("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}co(e.projection,i,`viewpoint.${e.id}.projection`,e.id),lo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,s,a)}function ro(e,t,n,r,i){let a=e.placement,s=a?.mode==="orbit"?a:null,c=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let o of e.groups)r.has(o)||i.push(k("validate.group.unknown",`Unknown group "${o}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(k("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(k("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),s&&(n.has(s.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&i.push(k("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(k("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!Dt(c?.properties.mass)&&i.push(k("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let o=n.get(a.target);o?qn.has(o.type)||i.push(w("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(w("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),oo(e,n,i)||i.push(w("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let o=n.get(e.resonance.targetObjectId);o?(e.placement?.mode!=="orbit"||o.placement?.mode!=="orbit"||e.placement.target!==o.placement.target)&&i.push(k("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let o of e.deriveRules??[]){if(o.field!=="period"||o.strategy!=="kepler"){i.push(k("validate.derive.unsupported",`Unsupported derive rule "${o.field} ${o.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Yn(e,c);if(l===null){i.push(k("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||i.push(Tt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${mo(l)}.`,e.id,"derive"))}for(let o of e.validationRules??[]){if(o.rule!=="kepler"){i.push(k("validate.rule.unsupported",`Unsupported validation rule "${o.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=Gn(s?.period),u=Yn(e,c);if(l===null||u===null)continue;let f=po(e,"period");Math.abs(l-u)>f&&i.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function io(e,t,n,r){let i=`event.${e.id}`,a=new Set;e.kind.trim()||r.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(k("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(k("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(a.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let s=new Set;for(let l of e.participantObjectIds){if(a.add(l),s.has(l)){r.push(k("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}s.add(l),n.has(l)||r.push(w("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(k("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(k("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&a.size<3&&r.push(k("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let c=new Set;for(let l of e.positions){let u=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,u));continue}c.add(l.objectId);let f=n.get(l.objectId);if(!f){r.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,u));continue}a.has(l.objectId)||r.push(k("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),ao(l,f,e,t,n,r,u,e.id)}let o=[...a].filter(l=>!c.has(l));e.positions.length>0&&o.length>0&&r.push(k("validate.event.positions.partial",`Event "${e.id}" leaves ${o.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function ao(e,t,n,r,i,a,s,c){let o=e.placement;if(!o){a.push(w("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,s));return}if(o.mode==="orbit"){i.has(o.target)||a.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${s}.orbit`)),o.distance&&o.semiMajor&&a.push(w("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${s}.distance`)),o.phase&&!uo(r,t,n,e)&&a.push(k("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${s}.phase`)),o.inclination&&!fo(r,t,n,e)&&a.push(k("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${s}.inclination`)),o.period&&!Dt(i.get(o.target)?.properties.mass)&&a.push(k("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${s}.period`));return}if(o.mode==="surface"){let l=i.get(o.target);l?qn.has(l.type)||a.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${o.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${s}.surface`)):a.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${s}.surface`));return}if(o.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&a.push(w("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${s}.at`));let l=o.reference;l.kind==="named"&&!i.has(l.name)?a.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?a.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&a.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):a.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)))}}function oo(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(w("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Yn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=so(n.semiMajor??n.distance),i=Dt(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function so(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/et;case"m":return e.value/(et*1e3);case"ly":return e.value*Ja;case"pc":return e.value*Qa;case"kpc":return e.value*eo;case"re":return e.value*Xa/et;case"sol":return e.value*Za/et;default:return null}}function Dt(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Ha;case"mj":return t.value/Ka;default:return null}}function Gn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function co(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function lo(e,t,n,r,i,a,s,c,o){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||f==="distance"&&p<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(k("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(k("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,l)),t==="isometric"&&e.elevation!==null&&r.push(Tt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(k("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),a!==null&&o.has(a)||s!==null&&o.has(s)||c||r.push(Tt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function uo(e,t,n,r){return ee(r?.epoch)??ee(n?.epoch)??ee(t.epoch)??ee(e?.epoch)??null}function fo(e,t,n,r){return ee(r?.referencePlane)??ee(n?.referencePlane)??ee(t.referencePlane)??ee(e?.referencePlane)??null}function ee(e){return typeof e=="string"&&e.trim()?e.trim():null}function po(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Gn(n)??0:0}function mo(e){return`${Math.round(e*100)/100}d`}function w(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function k(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Tt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var ho=new Set(["climate","habitability","settlement"]),nt=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=D(e);t&&nt.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])nt.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var go=new Set(nt.keys()),Kn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function rt(e){return Zn(e)}function Xn(e){return Zn(e,"2.0-draft")}function Zn(e,t){let n=ns(e),r=n.source.split(/\r?\n/),i=[],a=!1,s="2.0",c=null,o=null,l=[],u=[],f=[],p=[],m=new Map,g=!1,h=!1,j=new Set,O=new Set,v=new Set,x=new Set,L=new Set;for(let T=0;T<r.length;T++){let V=r[T],B=T+1;if(!V.trim())continue;let U=Fe(V),M=ae(V.slice(U),{line:B,columnOffset:U});if(M.length!==0){if(!a){s=yo(M,B),a=!0,n.comments.length>0&&it(s,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${s}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(U===0){o=bo(M,B,s,i,c,l,u,f,p,m,j,O,v,x,L,{sawDefaults:g,sawAtlas:h}),o.kind==="system"?c=o.system:o.kind==="defaults"?g=!0:o.kind==="atlas"&&(h=!0);continue}if(!o)throw new d("Indented line without parent atlas section",B,U+1);Oo(o,U,M,B)}}if(!a)throw new d('Missing required atlas schema header "schema 2.0"');let C=l.map(T=>Yo(T,s,i)),F=p.map(T=>qo(T,m.get(T.id)??[])),H=t??(s==="2.0-draft"?"2.0":s),K={format:"worldorbit",sourceVersion:"1.0",theme:null,system:c,groups:u,relations:f,events:F,objects:C,diagnostics:i};if(H==="2.0-draft"){let T={...K,version:"2.0-draft",schemaVersion:"2.0-draft"};return T.diagnostics.push(...Te(T,s)),T}let re={...K,version:H,schemaVersion:H};return s==="2.0-draft"&&re.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),re.diagnostics.push(...Te(re,s)),re}function yo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function bo(e,t,n,r,i,a,s,c,o,l,u,f,p,m,g,h){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return vo(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(h.sawDefaults)throw new d('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(h.sawAtlas)throw new d('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return wo(e,t,i,u,n,r);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Io(e,t,i,f);case"group":return _(n,r,"group",{line:t,column:e[0].column}),$o(e,t,s,p);case"relation":return _(n,r,"relation",{line:t,column:e[0].column}),jo(e,t,c,m);case"event":return _(n,r,"event",{line:t,column:e[0].column}),xo(e,t,o,l,g,n,r);case"object":return ko(e,t,n,r,a);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function vo(e,t,n,r){if(e.length!==2)throw new d("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function wo(e,t,n,r,i,a){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let s=pe(e[1].value);if(!s)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(s))throw new d(`Duplicate viewpoint id "${s}"`,t,e[1].column);let c={id:s,label:Pe(s),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(c),r.add(s),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Io(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=pe(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:Pe(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function $o(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=pe(e[1].value);if(!i)throw new d("Group id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:Pe(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function jo(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=pe(e[1].value);if(!i)throw new d("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate relation id "${i}"`,t,e[1].column);let a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function xo(e,t,n,r,i,a,s){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let c=pe(e[1].value);if(!c)throw new d("Event id must not be empty",t,e[1].column);if(i.has(c))throw new d(`Duplicate event id "${c}"`,t,e[1].column);let o={id:c,kind:"",label:Pe(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(o),r.set(c,l),i.add(c),{kind:"event",event:o,sourceSchemaVersion:a,diagnostics:s,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function ko(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],s=e[2],c=a.value;if(!ge.has(c)||c==="system")throw new d(`Unknown object type "${a.value}"`,t,a.column);let o={objectType:c,id:s.value,fields:Uo(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(o),{kind:"object",objectNode:o,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Oo(e,t,n,r){switch(e.kind){case"system":So(e,n,r);return;case"defaults":Po(e,n,r);return;case"atlas":To(e,t,n,r);return;case"viewpoint":Do(e,t,n,r);return;case"annotation":Lo(e,n,r);return;case"group":Fo(e,n,r);return;case"relation":Eo(e,n,r);return;case"event":Ro(e,t,n,r);return;case"object":zo(e,t,n,r);return}}function So(e,t,n){let r=G(t,e.seenFields,n),i=$(t,n);switch(r){case"title":e.system.title=i;return;case"description":_(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":_(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":_(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Po(e,t,n){let r=G(t,e.seenFields,n),i=$(t,n);switch(r){case"view":Qn(i)&&oe(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Jn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=er(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function To(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=tr(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new d(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Do(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){Mo(e,n,r);return}if(e.inFilter){Ao(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(oe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new d('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??At();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=G(n,e.seenFields,r),a=$(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":Qn(a)&&oe(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Jn(a,r,n[0].column);return;case"preset":e.viewpoint.preset=er(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Mt(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=ne(a,r,n[0].column,"rotation");return;case"camera":oe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Bo(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=Co(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":_(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=N(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Mo(e,t,n){let r=G(t,e.seenCameraFields,n),i=$(t,n),a=e.viewpoint.camera??At();switch(r){case"azimuth":a.azimuth=ne(i,n,t[0].column,"camera.azimuth");break;case"elevation":a.elevation=ne(i,n,t[0].column,"camera.elevation");break;case"roll":a.roll=ne(i,n,t[0].column,"camera.roll");break;case"distance":a.distance=Mt(i,n,t[0].column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=a}function Ao(e,t,n){let r=G(t,e.seenFilterFields,n),i=e.viewpoint.filter??Vo();switch(r){case"query":i.query=$(t,n);break;case"objecttypes":i.objectTypes=No(t.slice(1),n);break;case"tags":i.tags=N(t.slice(1),n,"tags");break;case"groups":i.groupIds=N(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function Lo(e,t,n){switch(G(t,e.seenFields,n)){case"label":e.annotation.label=$(t,n);return;case"target":e.annotation.targetObjectId=$(t,n);return;case"body":e.annotation.body=$(t,n);return;case"tags":e.annotation.tags=N(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Fo(e,t,n){switch(G(t,e.seenFields,n)){case"label":e.group.label=$(t,n);return;case"summary":e.group.summary=$(t,n);return;case"color":e.group.color=$(t,n);return;case"tags":e.group.tags=N(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=Q($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Eo(e,t,n){switch(G(t,e.seenFields,n)){case"from":e.relation.from=$(t,n);return;case"to":e.relation.to=$(t,n);return;case"kind":e.relation.kind=$(t,n);return;case"label":e.relation.label=$(t,n);return;case"summary":e.relation.summary=$(t,n);return;case"tags":e.relation.tags=N(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=Q($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Ro(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&oe(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(_o(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new d(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let a=n[1].value;if(!a.trim())throw new d("Event pose object id must not be empty",r,n[1].column);let s={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(s),e.activePose=s,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new d('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(G(n,e.seenFields,r)){case"kind":e.event.kind=$(n,r);return;case"label":e.event.label=$(n,r);return;case"summary":e.event.summary=$(n,r);return;case"target":e.event.targetObjectId=$(n,r);return;case"participants":e.event.participantObjectIds=N(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"epoch":oe(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=$(n,r);return;case"referenceplane":oe(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=$(n,r);return;case"tags":e.event.tags=N(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=Q($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function _o(e,t,n){if(e.length<2)throw new d("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Kn.has(r))throw new d(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new d(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function zo(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||ho.has(i)){i!=="info"&&_(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=tr(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new d(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,s=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(s.has(i.key))throw new d(`Duplicate ${a} key "${i.key}"`,r,n[0].column);s.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(Wo(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function G(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function No(e,t){return N(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function Co(e,t,n,r){let i={};for(let a of N(e,t,"layers")){let s=!a.startsWith("-")&&!a.startsWith("!"),c=a.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=s,i["orbits-front"]=s;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&_(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=s)}return i}function N(e,t,n){if(e.length===0)throw new d(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new d(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Jn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new d(`Unknown projection "${e}"`,t,n);return r}function Qn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function er(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function Mt(e,t,n,r){let i=ne(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function ne(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function Vo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function At(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Bo(e,t,n){if(e.length===0||e.length%2!==0)throw new d('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:At(),i=new Set;for(let a=0;a<e.length;a+=2){let s=e[a],c=e[a+1],o=s.value.toLowerCase();if(i.has(o))throw new d(`Duplicate viewpoint camera field "${s.value}"`,t,s.column);i.add(o);let l=c.value;switch(o){case"azimuth":r.azimuth=ne(l,t,s.column,"camera.azimuth");break;case"elevation":r.elevation=ne(l,t,s.column,"camera.elevation");break;case"roll":r.roll=ne(l,t,s.column,"camera.roll");break;case"distance":r.distance=Mt(l,t,s.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${s.value}"`,t,s.column)}}return r}function Uo(e,t,n,r,i){let a=[],s=0;for(;s<e.length;){let c=e[s],o=De(c.value);if(!o)throw new d(`Unknown field "${c.value}"`,t,c.column);o.version==="2.1"&&_(r,i,c.value,{line:t,column:c.column}),s++;let l=[];if(o.inlineMode==="single"){let u=e[s];u&&(l.push(u),s++)}else if(o.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[s];if(!f)break;l.push(f),s++}else for(;s<e.length&&!go.has(e[s].value);)l.push(e[s]),s++;if(l.length===0)throw new d(`Missing value for field "${c.value}"`,t,c.column);a.push({type:"field",key:c.value,values:l.map(u=>u.value),location:{line:t,column:c.column}})}return ar(a,n),a}function Wo(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let a=De(e[0].value);if(!a)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&_(r,i,e[0].value,{line:t,column:e[0].column});let s={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return ar([s],n),s}function tr(e,t,n){if(e.length<2)throw new d(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function Yo(e,t,n){let r=nr(e.fields),i=rr(r),a=Ho(e.objectType,r),s=es(r.get("groups")?.[0]),c=tt(r.get("epoch")?.[0]),o=tt(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?Q(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Zo(r.get("resonance")[0]):void 0,f=Xo(r),p=r.get("derive")?.map(x=>Jo(x)),m=r.get("validate")?.map(x=>({rule:z(x)})),g=r.has("locked")?[...new Set(r.get("locked").flatMap(x=>x.values))]:void 0,h=r.get("tolerance")?.map(x=>Qo(x)),j=Ko(e.typedBlockEntries),O=ir(e.infoEntries,"info"),v={type:e.objectType,id:e.id,properties:a,placement:i,info:O};return s.length>0&&(v.groups=s),c&&(v.epoch=c),o&&(v.referencePlane=o),l!==void 0&&(v.tidalLock=l),u&&(v.resonance=u),f&&(v.renderHints=f),p?.length&&(v.deriveRules=p),m?.length&&(v.validationRules=m),g?.length&&(v.lockedFields=g),h?.length&&(v.tolerances=h),j&&Object.keys(j).length>0&&(v.typedBlocks=j),it(t,"2.1")&&(v.groups||v.epoch||v.referencePlane||v.tidalLock!==void 0||v.resonance||v.renderHints||v.deriveRules?.length||v.validationRules?.length||v.lockedFields?.length||v.tolerances?.length||v.typedBlocks)&&_(t,n,e.id,e.location),v}function qo(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Go(n))}}function Go(e){let t=nr(e.fields,"event-pose"),n=rr(t);return{objectId:e.objectId,placement:n,inner:te(t.get("inner")?.[0],"inner"),outer:te(t.get("outer")?.[0],"outer"),epoch:tt(t.get("epoch")?.[0]),referencePlane:tt(t.get("referencePlane")?.[0])}}function nr(e,t="object"){let n=new Map;for(let r of e){let i=De(r.key);if(!i&&!Kn.has(r.key))throw d.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw d.fromLocation(`Duplicate field "${r.key}"`,r.location);let a=n.get(r.key)??[];a.push(r),n.set(r.key,a)}return n}function rr(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let s=t??n??r??i;throw d.fromLocation("Object has multiple placement modes",s?.location)}if(t)return{mode:"orbit",target:z(t),distance:te(e.get("distance")?.[0],"distance"),semiMajor:te(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:ts(e.get("eccentricity")?.[0],"eccentricity"),period:te(e.get("period")?.[0],"period"),angle:te(e.get("angle")?.[0],"angle"),inclination:te(e.get("inclination")?.[0],"inclination"),phase:te(e.get("phase")?.[0],"phase")};if(n){let s=z(n);return{mode:"at",target:s,reference:Un(s,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let s=z(i),c=St(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function Ho(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],s=De(r);!a||!s?.legacySchema||s.legacySchema.placement||(Pt(r,e,a.location),n[r]=Wn(r,a.values,a.location))}return n}function ir(e,t){let n={};for(let r of e){if(r.key in n)throw d.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Ko(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=ir(r,n))}return t}function Xo(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=Q(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=Q(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=Qe(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Zo(e){if(e.values.length!==2)throw d.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw d.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Jo(e){if(e.values.length!==2)throw d.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Qo(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=St(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function es(e){return e?[...new Set(e.values)]:[]}function tt(e){return e&&e.values.join(" ").trim()||null}function te(e,t){return e?Ot(z(e),e.location,t):void 0}function ts(e,t){return e?Qe(z(e),t,e.location):void 0}function z(e){return Se(e.values,e.key,e.location)}function De(e){return nt.get(e)}function ar(e,t){for(let n of e){let r=De(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Pt(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function _(e,t,n,r){it(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function oe(e,t,n,r){it(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function it(e,t){return Hn(e)<Hn(t)}function Hn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;default:return 5}}function ns(e){let t=[...e],n=[],r=!1,i=!1,a=null,s=1,c=1;for(let o=0;o<t.length;o++){let l=t[o],u=t[o+1];if(i){if(l==="*"&&u==="/"){t[o]=" ",t[o+1]=" ",i=!1,a=null,o++,c+=2;continue}l!==`
5
5
  `&&l!=="\r"&&(t[o]=" "),l===`
6
- `?(s++,c=1):c++;continue}if(!r&&l==="/"&&u==="*"){n.push({kind:"block",line:s,column:c}),t[o]=" ",t[o+1]=" ",i=!0,a={line:s,column:c},o++,c+=2;continue}if(!r&&l==="#"&&!es(t,o)){n.push({kind:"line",line:s,column:c}),t[o]=" ";let f=o+1;for(;f<t.length&&t[f]!==`
6
+ `?(s++,c=1):c++;continue}if(!r&&l==="/"&&u==="*"){n.push({kind:"block",line:s,column:c}),t[o]=" ",t[o+1]=" ",i=!0,a={line:s,column:c},o++,c+=2;continue}if(!r&&l==="#"&&!rs(t,o)){n.push({kind:"line",line:s,column:c}),t[o]=" ";let f=o+1;for(;f<t.length&&t[f]!==`
7
7
  `&&t[f]!=="\r";)t[f]=" ",f++;c+=f-o,o=f-1;continue}l==='"'&&t[o-1]!=="\\"&&(r=!r),l===`
8
- `?(s++,c=1):c++}if(i)throw d.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function es(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
- `}function Lt(e="WorldOrbit",t="2.5"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function at(e){return structuredClone(e)}function ar(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(se))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(se))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(se))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(se))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(se)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(hr))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(se))t.push({kind:"object",id:n.id});return t}function Ft(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?ur(e,t.id):null;case"event":return t.id?ot(e,t.id):null;case"event-pose":return t.id&&t.key?fr(e,t.id,t.key):null;case"object":return t.id?lr(e,t.id):null;case"viewpoint":return t.id?pr(e.system,t.id):null;case"annotation":return t.id?mr(e.system,t.id):null;case"relation":return t.id?dr(e,t.id):null}}function Et(e,t,n){let r=at(e),i=zt(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return me(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return me(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return ts(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return me(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return me(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return me(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return me(r.relations,n),r}}function or(e,t,n){return Et(e,t,n(Ft(e,t)))}function sr(e,t){let n=at(e),r=zt(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=ot(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function Rt(e,t){return t.map(n=>({diagnostic:n,path:_t(e,n)}))}function _t(e,t){if(t.objectId&&lr(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&ur(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&pr(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&mr(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&dr(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&ot(e,n[1]))return n[2]==="pose"&&n[3]&&fr(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in zt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function cr(e){let t=[...e.diagnostics,...De(e,e.version)];return Rt(e,t)}function zt(e){return e.system||(e.system=Lt().system),e.system}function lr(e,t){return e.objects.find(n=>n.id===t)??null}function ur(e,t){return e.groups.find(n=>n.id===t)??null}function dr(e,t){return e.relations.find(n=>n.id===t)??null}function ot(e,t){return e.events.find(n=>n.id===t)??null}function fr(e,t,n){return ot(e,t)?.positions.find(r=>r.objectId===n)??null}function pr(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function mr(e,t){return e?.annotations.find(n=>n.id===t)??null}function me(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(se);return}e[n]=t}function ts(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(a=>a.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(hr);return}r.positions[i]=n}function se(e,t){return e.id.localeCompare(t.id)}function hr(e,t){return e.objectId.localeCompare(t.objectId)}var ns=/^schema\s+2(?:\.0|\.1|\.5)?$/i,rs=/^schema\s+2\.1$/i,is=/^schema\s+2\.5$/i,as=/^schema\s+2\.0-draft$/i;function Nt(e){for(let t of os(e).split(/\r?\n/)){let n=t.trim();if(n)return as.test(n)?"2.0-draft":rs.test(n)?"2.1":is.test(n)?"2.5":ns.test(n)?"2.0":"1.0"}return"1.0"}function os(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],s=t[i+1];if(r){if(a==="*"&&s==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
8
+ `?(s++,c=1):c++}if(i)throw d.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function rs(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
+ `}function Lt(e="WorldOrbit",t="2.6"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",theme:{preset:"blueprint",styles:{}},system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function at(e){return structuredClone(e)}function or(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(se))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(se))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(se))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(se))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(se)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(gr))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(se))t.push({kind:"object",id:n.id});return t}function Ft(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?dr(e,t.id):null;case"event":return t.id?ot(e,t.id):null;case"event-pose":return t.id&&t.key?pr(e,t.id,t.key):null;case"object":return t.id?ur(e,t.id):null;case"viewpoint":return t.id?mr(e.system,t.id):null;case"annotation":return t.id?hr(e.system,t.id):null;case"relation":return t.id?fr(e,t.id):null}}function Et(e,t,n){let r=at(e),i=zt(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return me(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return me(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return is(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return me(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return me(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return me(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return me(r.relations,n),r}}function sr(e,t,n){return Et(e,t,n(Ft(e,t)))}function cr(e,t){let n=at(e),r=zt(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=ot(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function Rt(e,t){return t.map(n=>({diagnostic:n,path:_t(e,n)}))}function _t(e,t){if(t.objectId&&ur(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&dr(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&mr(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&hr(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&fr(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&ot(e,n[1]))return n[2]==="pose"&&n[3]&&pr(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in zt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function lr(e){let t=[...e.diagnostics,...Te(e,e.version)];return Rt(e,t)}function zt(e){return e.system||(e.system=Lt().system),e.system}function ur(e,t){return e.objects.find(n=>n.id===t)??null}function dr(e,t){return e.groups.find(n=>n.id===t)??null}function fr(e,t){return e.relations.find(n=>n.id===t)??null}function ot(e,t){return e.events.find(n=>n.id===t)??null}function pr(e,t,n){return ot(e,t)?.positions.find(r=>r.objectId===n)??null}function mr(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function hr(e,t){return e?.annotations.find(n=>n.id===t)??null}function me(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(se);return}e[n]=t}function is(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(a=>a.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(gr);return}r.positions[i]=n}function se(e,t){return e.id.localeCompare(t.id)}function gr(e,t){return e.objectId.localeCompare(t.objectId)}var as=/^schema\s+2(?:\.0|\.1|\.5|\.6)?$/i,os=/^schema\s+2\.1$/i,ss=/^schema\s+2\.5$/i,cs=/^schema\s+2\.6$/i,ls=/^schema\s+2\.0-draft$/i;function Nt(e){for(let t of us(e).split(/\r?\n/)){let n=t.trim();if(n)return ls.test(n)?"2.0-draft":os.test(n)?"2.1":ss.test(n)?"2.5":cs.test(n)?"2.6":as.test(n)?"2.0":"1.0"}return"1.0"}function us(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],s=t[i+1];if(r){if(a==="*"&&s==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
10
10
  `&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&s==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&a==="#"){t[i]=" ";let c=i+1;for(;c<t.length&&t[c]!==`
11
- `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function st(e){let t=Ct(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Ct(e){let t=Nt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return ss(e,t);let n;try{n=Z(e)}catch(i){return{ok:!1,value:null,diagnostics:[A(i,"parse")]}}let r;try{r=W(n)}catch(i){return{ok:!1,value:null,diagnostics:[A(i,"normalize")]}}try{Y(r)}catch(i){return{ok:!1,value:null,diagnostics:[A(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function ss(e,t){let n;try{n=rt(e)}catch(s){return{ok:!1,value:null,diagnostics:[A(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Oe(n)}catch(s){return{ok:!1,value:null,diagnostics:[A(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var cs=/^```worldorbit(?:\s+(.*))?\s*$/;function gr(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,s=[];return t.forEach((c,o)=>{let l=o+1;if(!r){let u=c.match(cs);u&&(r=!0,i=u[1]??null,a=l,s=[]);return}if(c.trim()==="```"){n.push({source:s.join(`
12
- `),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,s=[];return}s.push(c)}),n}function yr(e){let t=Z(e),n=W(t);return Y(n),{ast:t,document:n}}function ls(e){let t=yr(e);return{...t,scene:q(t.document)}}function us(e){return st(e)}function ds(e){return _e(e)}function fs(e,t={}){return Je(e,t)}return Pr(ps);})();
11
+ `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function st(e){let t=Ct(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Ct(e){let t=Nt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6")return ds(e,t);let n;try{n=Z(e)}catch(i){return{ok:!1,value:null,diagnostics:[A(i,"parse")]}}let r;try{r=W(n)}catch(i){return{ok:!1,value:null,diagnostics:[A(i,"normalize")]}}try{Y(r)}catch(i){return{ok:!1,value:null,diagnostics:[A(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function ds(e,t){let n;try{n=rt(e)}catch(s){return{ok:!1,value:null,diagnostics:[A(s,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(s=>s.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Oe(n)}catch(s){return{ok:!1,value:null,diagnostics:[A(s,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var fs=/^```worldorbit(?:\s+(.*))?\s*$/;function yr(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,s=[];return t.forEach((c,o)=>{let l=o+1;if(!r){let u=c.match(fs);u&&(r=!0,i=u[1]??null,a=l,s=[]);return}if(c.trim()==="```"){n.push({source:s.join(`
12
+ `),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,s=[];return}s.push(c)}),n}function br(e){let t=Z(e),n=W(t);return Y(n),{ast:t,document:n}}function ps(e){let t=br(e);return{...t,scene:q(t.document)}}function ms(e){return st(e)}function hs(e){return _e(e)}function gs(e,t={}){return Je(e,t)}return Tr(ys);})();