worldorbit 3.2.0 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/core/dist/scene.js +98 -16
- package/dist/browser/core/dist/spatial-scene.js +1 -0
- package/dist/browser/core/dist/types.d.ts +3 -0
- package/dist/browser/editor/dist/editor.js +55 -12
- package/dist/browser/obsidian-plugin/dist/diagnostics.d.ts +3 -0
- package/dist/browser/obsidian-plugin/dist/diagnostics.js +23 -0
- package/dist/browser/obsidian-plugin/dist/examples.d.ts +3 -0
- package/dist/browser/obsidian-plugin/dist/examples.js +77 -0
- package/dist/browser/obsidian-plugin/dist/index.d.ts +9 -0
- package/dist/browser/obsidian-plugin/dist/index.js +8 -0
- package/dist/browser/obsidian-plugin/dist/main.d.ts +2 -0
- package/dist/browser/obsidian-plugin/dist/main.js +2 -0
- package/dist/browser/obsidian-plugin/dist/navigation.d.ts +6 -0
- package/dist/browser/obsidian-plugin/dist/navigation.js +44 -0
- package/dist/browser/obsidian-plugin/dist/plugin.d.ts +8 -0
- package/dist/browser/obsidian-plugin/dist/plugin.js +508 -0
- package/dist/browser/obsidian-plugin/dist/positions.d.ts +7 -0
- package/dist/browser/obsidian-plugin/dist/positions.js +14 -0
- package/dist/browser/obsidian-plugin/dist/settings.d.ts +2 -0
- package/dist/browser/obsidian-plugin/dist/settings.js +5 -0
- package/dist/browser/obsidian-plugin/dist/theme.d.ts +2 -0
- package/dist/browser/obsidian-plugin/dist/theme.js +31 -0
- package/dist/browser/obsidian-plugin/dist/types.d.ts +42 -0
- package/dist/browser/obsidian-plugin/dist/types.js +1 -0
- package/dist/browser/obsidian-plugin/dist/viewer-host.d.ts +14 -0
- package/dist/browser/obsidian-plugin/dist/viewer-host.js +110 -0
- package/dist/browser/viewer/dist/atlas-state.js +3 -0
- package/dist/browser/viewer/dist/index.d.ts +1 -0
- package/dist/browser/viewer/dist/index.js +1 -0
- package/dist/browser/viewer/dist/interactive-2d.d.ts +21 -0
- package/dist/browser/viewer/dist/interactive-2d.js +201 -0
- package/dist/browser/viewer/dist/render.d.ts +1 -1
- package/dist/browser/viewer/dist/render.js +2 -1
- package/dist/browser/viewer/dist/types.d.ts +1 -0
- package/dist/browser/viewer/dist/viewer-state.d.ts +1 -1
- package/dist/browser/viewer/dist/viewer-state.js +1 -1
- package/dist/browser/viewer/dist/viewer.js +2 -0
- package/dist/obsidian-plugin/LICENSE +21 -0
- package/dist/obsidian-plugin/README.md +124 -0
- package/dist/obsidian-plugin/main.js +108 -0
- package/dist/obsidian-plugin/manifest.json +9 -0
- package/dist/obsidian-plugin/obsidian_scsh_1.png +0 -0
- package/dist/obsidian-plugin/obsidian_scsh_2.png +0 -0
- package/dist/obsidian-plugin/styles.css +164 -0
- package/dist/unpkg/core/dist/scene.js +98 -16
- package/dist/unpkg/core/dist/spatial-scene.js +1 -0
- package/dist/unpkg/core/dist/types.d.ts +3 -0
- package/dist/unpkg/editor/dist/editor.js +55 -12
- package/dist/unpkg/obsidian-plugin/dist/diagnostics.d.ts +3 -0
- package/dist/unpkg/obsidian-plugin/dist/diagnostics.js +23 -0
- package/dist/unpkg/obsidian-plugin/dist/examples.d.ts +3 -0
- package/dist/unpkg/obsidian-plugin/dist/examples.js +77 -0
- package/dist/unpkg/obsidian-plugin/dist/index.d.ts +9 -0
- package/dist/unpkg/obsidian-plugin/dist/index.js +8 -0
- package/dist/unpkg/obsidian-plugin/dist/main.d.ts +2 -0
- package/dist/unpkg/obsidian-plugin/dist/main.js +2 -0
- package/dist/unpkg/obsidian-plugin/dist/navigation.d.ts +6 -0
- package/dist/unpkg/obsidian-plugin/dist/navigation.js +44 -0
- package/dist/unpkg/obsidian-plugin/dist/plugin.d.ts +8 -0
- package/dist/unpkg/obsidian-plugin/dist/plugin.js +508 -0
- package/dist/unpkg/obsidian-plugin/dist/positions.d.ts +7 -0
- package/dist/unpkg/obsidian-plugin/dist/positions.js +14 -0
- package/dist/unpkg/obsidian-plugin/dist/settings.d.ts +2 -0
- package/dist/unpkg/obsidian-plugin/dist/settings.js +5 -0
- package/dist/unpkg/obsidian-plugin/dist/theme.d.ts +2 -0
- package/dist/unpkg/obsidian-plugin/dist/theme.js +31 -0
- package/dist/unpkg/obsidian-plugin/dist/types.d.ts +42 -0
- package/dist/unpkg/obsidian-plugin/dist/types.js +1 -0
- package/dist/unpkg/obsidian-plugin/dist/viewer-host.d.ts +14 -0
- package/dist/unpkg/obsidian-plugin/dist/viewer-host.js +110 -0
- package/dist/unpkg/viewer/dist/atlas-state.js +3 -0
- package/dist/unpkg/viewer/dist/index.d.ts +1 -0
- package/dist/unpkg/viewer/dist/index.js +1 -0
- package/dist/unpkg/viewer/dist/interactive-2d.d.ts +21 -0
- package/dist/unpkg/viewer/dist/interactive-2d.js +201 -0
- package/dist/unpkg/viewer/dist/render.d.ts +1 -1
- package/dist/unpkg/viewer/dist/render.js +2 -1
- package/dist/unpkg/viewer/dist/types.d.ts +1 -0
- package/dist/unpkg/viewer/dist/viewer-state.d.ts +1 -1
- package/dist/unpkg/viewer/dist/viewer-state.js +1 -1
- package/dist/unpkg/viewer/dist/viewer.js +2 -0
- package/dist/unpkg/worldorbit-core.min.js +12 -12
- package/dist/unpkg/worldorbit-editor.min.js +342 -342
- package/dist/unpkg/worldorbit-markdown.min.js +23 -23
- package/dist/unpkg/worldorbit-viewer.min.js +197 -197
- package/dist/unpkg/worldorbit.js +297 -21
- package/dist/unpkg/worldorbit.min.js +201 -201
- package/package.json +18 -1
- package/packages/core/dist/scene.js +98 -16
- package/packages/core/dist/spatial-scene.js +1 -0
- package/packages/core/dist/types.d.ts +3 -0
- package/packages/editor/dist/editor.js +55 -12
- package/packages/viewer/dist/atlas-state.js +3 -0
- package/packages/viewer/dist/index.d.ts +1 -0
- package/packages/viewer/dist/index.js +1 -0
- package/packages/viewer/dist/interactive-2d.d.ts +21 -0
- package/packages/viewer/dist/interactive-2d.js +201 -0
- package/packages/viewer/dist/render.d.ts +1 -1
- package/packages/viewer/dist/render.js +2 -1
- package/packages/viewer/dist/types.d.ts +1 -0
- package/packages/viewer/dist/viewer-state.d.ts +1 -1
- package/packages/viewer/dist/viewer-state.js +1 -1
- package/packages/viewer/dist/viewer.js +2 -0
|
@@ -1,12 +1,12 @@
|
|
|
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&<(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
|
|
3
|
-
`)}function
|
|
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
|
-
`&&l!=="\r"&&(t[
|
|
6
|
-
`?(
|
|
7
|
-
`&&t[
|
|
8
|
-
`?(
|
|
9
|
-
`}function
|
|
10
|
-
`&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&
|
|
11
|
-
`&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function
|
|
12
|
-
`),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,
|
|
1
|
+
"use strict";var WorldOrbitCore=(()=>{var dt=Object.defineProperty;var kr=Object.getOwnPropertyDescriptor;var Or=Object.getOwnPropertyNames;var Sr=Object.prototype.hasOwnProperty;var Pr=(e,t)=>{for(var n in t)dt(e,n,{get:t[n],enumerable:!0})},Mr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Or(t))!Sr.call(e,i)&&i!==n&&dt(e,i,{get:()=>t[i],enumerable:!(r=kr(t,i))||r.enumerable});return e};var Tr=e=>Mr(dt({},"__esModule",{value:!0}),e);var ws={};Pr(ws,{WORLDORBIT_FIELD_KEYS:()=>Yt,WORLDORBIT_FIELD_SCHEMAS:()=>ft,WORLDORBIT_OBJECT_TYPES:()=>be,WorldOrbitError:()=>f,cloneAtlasDocument:()=>st,createDiagnostic:()=>Zt,createEmptyAtlasDocument:()=>Et,detectWorldOrbitSchemaVersion:()=>Bt,diagnosticFromError:()=>L,evaluateSpatialSceneAtTime:()=>On,extractWorldOrbitBlocks:()=>br,formatAtlasDocument:()=>Qe,formatDocument:()=>et,formatDraftDocument:()=>xt,getAtlasDocumentNode:()=>Ft,getFieldSchema:()=>D,isKnownFieldKey:()=>pt,listAtlasDocumentPaths:()=>sr,load:()=>ys,loadWorldOrbitSource:()=>lt,loadWorldOrbitSourceWithDiagnostics:()=>Ct,materializeAtlasDocument:()=>Pe,materializeDraftDocument:()=>Tn,normalizeDocument:()=>U,normalizeWithDiagnostics:()=>Jt,parse:()=>vr,parseSafe:()=>bs,parseWithDiagnostics:()=>Ne,parseWorldOrbit:()=>Z,parseWorldOrbitAtlas:()=>at,parseWorldOrbitDraft:()=>Zn,removeAtlasDocumentNode:()=>lr,render:()=>gs,renderDocumentToScene:()=>Y,renderDocumentToSpatialScene:()=>kn,resolveAtlasDiagnosticPath:()=>zt,resolveAtlasDiagnostics:()=>_t,rotatePoint:()=>ln,stringify:()=>vs,supportsObjectType:()=>mt,tokenizeLine:()=>qt,tokenizeLineDetailed:()=>oe,unitFamilyAllowsUnit:()=>ve,updateAtlasDocumentNode:()=>cr,upgradeDocumentToDraftV2:()=>Je,upgradeDocumentToV2:()=>Se,upsertAtlasDocumentNode:()=>Rt,validateAtlasDocumentWithDiagnostics:()=>ur,validateDocument:()=>W,validateDocumentWithDiagnostics:()=>Qt});var f=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 ye=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],F=ye.filter(e=>e!=="system"),Dr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Wt=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Ar=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function $(e,t){return{key:e,...t}}var be=new Set(ye),ft=new Map([$("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),$("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),$("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),$("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),$("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),$("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("at",{kind:"string",placement:!0,arity:"single",objectTypes:Wt}),$("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Wt}),$("free",{kind:"string",placement:!0,arity:"single",objectTypes:Ar}),$("kind",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("class",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("culture",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:ye}),$("color",{kind:"string",placement:!1,arity:"single",objectTypes:ye}),$("image",{kind:"string",placement:!1,arity:"single",objectTypes:Dr}),$("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:ye}),$("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"radius"}),$("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"mass"}),$("density",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:F}),$("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),$("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),$("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),$("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("on",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("source",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"duration"})].map(e=>[e.key,e])),Yt=new Set(ft.keys());function D(e){return ft.get(e)}function pt(e){return Yt.has(e)}function mt(e,t){return e.objectTypes.includes(t)}function ve(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 qt(e){return oe(e).map(t=>t.value)}function oe(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,o=!1,c=!1,s=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:o}),i="",a=null,o=!1)};for(let u=0;u<e.length;u++){let d=e[u],p=r+u+1;if(c&&d==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(d==='"'){c?c=!1:(a===null&&(a=p),o=!0,s=p,c=!0);continue}if(!c&&/\s/.test(d)){l();continue}a===null&&(a=p),i+=d}if(c)throw new f("Unclosed quote in line",t.line,s??r+e.length);return l(),n}function Re(e){return e.match(/^\s*/)?.[0].length??0}function Z(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,a=!1,o=!1,c=null,s=null,l=null,u=null;for(let d=0;d<t.length;d++){let p=t[d],m=d+1;if(!p.trim())continue;let g=Re(p),h=oe(p.slice(g),{line:m,columnOffset:g});if(h.length!==0){if(g===0){if(a=!1,o=!1,c=null,s=null,l=null,u=null,h.length>=1&&h[0].value==="theme"){o=!0,s=0,r={type:"theme",preset:h.length>=2?h[1].value:null,blocks:[],location:{line:m,column:h[0].column}};continue}let I=Lr(h,m);n.push(I),i=I;continue}if(o){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(Rr(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 f("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(_r(h,m)):i.blockFields.push(Fr(h,m))}}return{type:"document",theme:r,objects:n}}function Lr(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!be.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Er(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Er(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=D(i.value);if(!a)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(a.arity==="multiple")for(;r<e.length&&!pt(e[r].value);)o.push(e[r]),r++;else{let c=e[r];c&&(o.push(c),r++)}if(o.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(c=>c.value),location:{line:t,column:i.column}})}return n}function Fr(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!D(e[0].value))throw new f(`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 Rr(e,t){if(e.length<2)throw new f("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 _r(e,t){if(e.length<2)throw new f("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 Gt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,zr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Nr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function U(e){let t=null,n=[],r=e.theme?Br(e.theme):null;for(let i of e.objects){let a=Vr(i);if(i.objectType==="system"){if(t)throw f.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 Br(e){let t={};for(let n of e.blocks){let r=Ht(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];Ur(e.objectType,t);let n=Ht(t),r=Wr(e.objectType,n),i=Yr(n),a=Hr(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 Ur(e,t){for(let n of t){let r=D(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!mt(r,e))throw f.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Ht(e){let t=new Map;for(let n of e){if(t.has(n.key))throw f.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Wr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),o=[n,r,i,a].filter(Boolean).length;if(o>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&o>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:_e(t,"orbit"),distance:ue(t,"distance"),semiMajor:ue(t,"semiMajor"),eccentricity:Zr(t,"eccentricity"),period:ue(t,"period"),angle:ue(t,"angle"),inclination:ue(t,"inclination"),phase:ue(t,"phase")};if(r){let c=ze(t,"at"),s=_e(t,"at");return{mode:"at",target:s,reference:Kr(s,c.location)}}if(i)return{mode:"surface",target:_e(t,"surface")};if(a){let c=_e(t,"free"),s=Xr(c);return{mode:"free",distance:s??void 0,descriptor:s?void 0:c}}return null}function Yr(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]=Jr(r);break;case"number":t[n]=Xt(de(r),n,r.location);break;case"unit":t[n]=Kt(de(r),r.location,n);break;case"string":t[n]=qr(n,r);break}}return t}function qr(e,t){let n=t.values.join(" ").trim();return e==="image"&&Gr(n,t.location),n}function Gr(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Nr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Hr(e){let t={};for(let n of e){if(n.key in t)throw f.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Kr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 f.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 Kt(e,t,n){let r=e.match(Gt);if(!r)throw f.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&&!ve(a.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Xr(e){let t=e.match(Gt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ue(e,t){if(!e.has(t))return;let n=ze(e,t);return Kt(de(n),n.location,t)}function Zr(e,t){if(!e.has(t))return;let n=ze(e,t);return Xt(de(n),t,n.location)}function Xt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Jr(e){let t=de(e).toLowerCase(),n=zr.get(t);if(n===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function ze(e,t){let n=e.get(t);if(!n)throw new f(`Missing value for key "${t}"`);return n}function _e(e,t){return de(ze(e,t))}function de(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Qr=new Set(["star","planet","moon","asteroid","comet"]);function W(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new f(`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 f(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Qr.has(i.type))throw new f(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&ei(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&ti(r,r.placement.reference,t))}}function ei(e,t,n){if(!n.has(t.primary))throw new f(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new f(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function ti(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Zt(e){return{...e}}function L(e,t,n=`${t}.failed`){return e instanceof f?{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 Ne(e){let t;try{t=Z(e)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"parse")]}}let n;try{n=U(t)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"normalize")]}}try{W(n)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Jt(e){try{return{ok:!0,value:U(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"normalize")]}}}function Qt(e){try{return W(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"validate")]}}}var we=1495978707e-1,ni=6371,ri=71492,ii=695700,ai=63241.077,oi=206264.806,si=206264806,sn=.68,ci=.2,cn=28;function Y(e,t={}){let n=di(t),r=n.width,i=n.height,a=n.padding,o=ui(e),c=pi(e,t.projection),s=vt(t.camera??null),l=bt(c,s),u=bi(o),d=gi(o,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,m=t.activeEventId??null,g=li(e.objects,e.events??[],m),h=vi(g,r,i,a,u,d),I=new Map(g.map(v=>[v.id,v])),P=na(g,I),b=new Map,k=[],T=[],B=[],A=[],C=[],G=new Map,ie=new Map;for(let v of g){let E=v.placement;if(!E){B.push(v);continue}if(E.mode==="orbit"){rn(ie,E.target,v);continue}if(E.mode==="surface"){rn(G,E.target,v);continue}if(E.mode==="at"){C.push(v);continue}A.push(v)}let M=A.length>0?r*.42:r/2,le=i/2,_={orbitChildren:ie,surfaceChildren:G,objectMap:I,spacingFactor:u,projection:l,scaleModel:d,sceneMetricScale:h},V=B.find(v=>v.type==="star")??B[0]??null;V&>(V,M,le,0,b,k,T,_);let H=B.filter(v=>v.id!==V?.id);if(H.length>0){let v=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;H.forEach((E,S)=>{let ut=ke(S,H.length,-Math.PI/2),ae=Oe(ut,v,l,1);gt(E,M+ae.x,le+ae.y,0,b,k,T,_)})}A.forEach((v,E)=>{let S=r-a-140-ca(v.placement?.mode==="free"?v.placement.distance:void 0,d,h),ut=Math.max(76,(i-a*2-180)/Math.max(1,A.length)*u)*d.freePlacementMultiplier,ae=a+92+E*ut;b.set(v.id,{object:v,x:S,y:ae,radius:We(v,0,d,h),sortKey:qe(S,ae,0)}),T.push({object:v,groupId:P.groupIds.get(v.id)??null,x1:S-60,y1:ae,x2:S-18,y2:ae,mode:"free"}),Ve(v,b,k,T,_,1)}),C.forEach((v,E)=>{if(b.has(v.id)||!v.placement||v.placement.mode!=="at")return;let S=ea(v.placement.reference,b,I,E,C.length,r,i,a,_);b.set(v.id,{object:v,x:S.x,y:S.y,radius:We(v,2,d,h),sortKey:qe(S.x,S.y,2),anchorX:S.anchorX,anchorY:S.anchorY}),S.anchorX!==void 0&&S.anchorY!==void 0&&T.push({object:v,groupId:P.groupIds.get(v.id)??null,x1:S.anchorX,y1:S.anchorY,x2:S.x,y2:S.y,mode:"at"}),Ve(v,b,k,T,_,2)});let K=[...b.values()].map(v=>wi(v,d,P)),Le=k.map(v=>Ii(v,P.groupIds.get(v.object.id)??null)),Ee=T.map(v=>$i(v)),Fe=xi(K,r,i,d.labelMultiplier),Vt=Di(e,K),Ut=Ai(e.events??[],K,m),wr=Pi(Le,Vt,Ut,Ee,K,Fe),Ir=Mi(K,Le,Ee,Fe,P,d.labelMultiplier),$r=Ti(e,K),xr=Li(e,c,n.preset,P,I),jr=Yi(r,i,K,Le,Ee,Fe,d.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:c,renderProjection:l,camera:s,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:hi(c,l,o,s),systemId:p,viewMode:c,layoutPreset:o,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":d.bodyScaleMode,...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:jr,layers:wr,groups:Ir,semanticGroups:$r,viewpoints:xr,events:Ut,activeEventId:m,objects:K,orbitVisuals:Le,relations:Vt,leaders:Ee,labels:Fe}}function ln(e,t,n){let r=Ge(n),i=Math.cos(r),a=Math.sin(r),o=e.x-t.x,c=e.y-t.y;return{x:t.x+o*i-c*a,y:t.y+o*a+c*i}}function li(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])),o=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of o){let s=a.get(c);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let c of i.positions){let s=a.get(c.objectId);s&&(c.placement&&(s.placement=structuredClone(c.placement)),c.inner&&(s.properties.inner={...c.inner}),c.outer&&(s.properties.outer={...c.outer}),c.epoch&&(s.epoch=c.epoch),c.referencePlane&&(s.referencePlane=c.referencePlane))}return r}function ui(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 di(e){let t=fi(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function fi(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 pi(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return fn(n)??"topdown"}function bt(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 vt(e){if(!e)return null;let t={azimuth:ht(e.azimuth),elevation:ht(e.elevation),roll:ht(e.roll),distance:mi(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function ht(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function mi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function hi(e,t,n,r){let i=[`${an(e)} view`,`${an(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 gi(e,t,n){return{...yi(e),...n?{bodyScaleMode:n}:{},...t}}function yi(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36,bodyScaleMode:"readable"};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48,bodyScaleMode:"readable"};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40,bodyScaleMode:"readable"}}}function bi(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function vi(e,t,n,r,i,a){let o=[],c=[];for(let m of e){let g=ua(m);g!==null&&g>0&&c.push(g);let h=m.placement;if(h){if(h.mode==="orbit"){let I=J(h.semiMajor??h.distance??null);I!==null&&I>0&&o.push(I);continue}if(h.mode==="free"){let I=J(h.distance??null);I!==null&&I>0&&o.push(I)}}}let s=Math.max(...o,0),l=Math.max(...c,0),u=Math.max(s,l*6,0),d=u+Math.max(Math.sqrt(u),l*2,s>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*a.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function wi(e,t,n){let{object:r,x:i,y:a,radius:o,sortKey:c,anchorX:s,anchorY:l}=e,u=r.renderHints?.renderPriority??0;return{renderId:fe(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:o,visualRadius:sa(r,o,t),sortKey:c+u*.001,anchorX:s,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:da(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Ii(e,t){return{renderId:`${fe(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 $i(e){return{renderId:`${fe(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 xi(e,t,n,r){let i=[],a=[],o=new Map(e.map(s=>[s.objectId,s])),c=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(ji);for(let s of c){let l=ki(s,o,a,t,n,r)??dn(s,un(s,o.get(s.parentId??"")??null,n),0,r);a.push(yn(s,l,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:s.hidden})}return i}function ji(e,t){let n=en(e)-en(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 en(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 ki(e,t,n,r,i,a){for(let o of Oi(e,t,r,i)){let c=o==="left"||o==="right"?4:6;for(let s=0;s<=c;s+=1){let l=dn(e,o,s,a),u=yn(e,l,a);if(!n.some(d=>aa(d,u)))return l}}return null}function Oi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=un(e,i,r),o=a==="below"?"above":"below",c=Si(e,i,n),s=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,s,o]:[a,c,o,s]}function un(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 Si(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 dn(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),o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"start",direction:t}}}}function Pi(e,t,n,r,i,a){let o=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),c=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:o},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:a.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Mi(e,t,n,r,i,a){let o=new Map,c=s=>{if(!s)return null;let l=o.get(s);if(l)return l;let u=i.groupRoots.get(s)??null,d={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:je(0,0,0,0)};return o.set(s,d),d};for(let s of e){let l=c(s.groupId);l&&!s.hidden&&l.objectIds.push(s.objectId)}for(let s of t){let l=c(s.groupId);l&&!s.hidden&&l.orbitIds.push(s.objectId)}for(let s of n){let l=c(s.groupId);l&&!s.hidden&&l.leaderIds.push(s.objectId)}for(let s of r){let l=c(s.groupId);l&&!s.hidden&&l.labelIds.push(s.objectId)}for(let s of o.values())s.contentBounds=ra(s,e,t,n,r,a);return[...o.values()].sort((s,l)=>s.label.localeCompare(l.label))}function Ti(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 Di(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:`${fe(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 Ai(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])],o=a.map(l=>r.get(l)).filter(Boolean),c=o.length>0?o.reduce((l,u)=>l+u.x,0)/o.length:0,s=o.length>0?o.reduce((l,u)=>l+u.y,0)/o.length:0;return{renderId:`${fe(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:s,hidden:i.hidden||o.length===0||o.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Li(e,t,n,r,i){let a=Ei(e,t,n),o=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[d,p,...m]=l.split(".");if(d!=="viewpoint"||!p||m.length===0)continue;let g=Vi(p);if(!g)continue;let h=m.join(".").toLowerCase(),I=o.get(g)??{id:g};Fi(I,h,u,e,t,n,r,i),o.set(g,I)}let c=[...o.values()].map(l=>Ri(l,t,n,i)).filter(Boolean),s=c.findIndex(l=>l.id===a.id);return s>=0?c.splice(s,1,{...a,...c[s],layers:{...a.layers,...c[s].layers},filter:c[s].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 Ei(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",a=vt(null),o=bt(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:o,camera:a,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Fi(e,t,n,r,i,a,o,c){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=xe(s);return;case"projection":case"view":e.projection=fn(s)??i;return;case"preset":e.preset=zi(s)??a;return;case"rotation":case"angle":e.rotationDeg=Ie(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ce(),azimuth:Ie(s)};return;case"camera.elevation":e.camera={...e.camera??Ce(),elevation:Ie(s)};return;case"camera.roll":e.camera={...e.camera??Ce(),roll:Ie(s)};return;case"camera.distance":e.camera={...e.camera??Ce(),distance:tn(s)};return;case"zoom":case"scale":e.scale=tn(s);return;case"layers":e.layers=Ni(s);return;case"query":e.filter={...e.filter??Be(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Be(),objectTypes:Bi(s)};return;case"tags":e.filter={...e.filter??Be(),tags:xe(s)};return;case"groups":e.filter={...e.filter??Be(),groupIds:Ci(s,r,o,c)};return}}function Ri(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,o=_i(e.filter),c=e.label?.trim()||Ui(e.id),s=e.projection??t,l=vt(e.camera??null),u=bt(s,l);return{id:e.id,label:c,summary:e.summary?.trim()||Wi(c,i,o),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function Be(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ce(){return{azimuth:null,elevation:null,roll:null,distance:null}}function _i(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 fn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function zi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Ie(e){let t=Number(e);return Number.isFinite(t)?t:null}function tn(e){let t=Ie(e);return t!==null&&t>0?t:null}function Ni(e){let t={};for(let n of xe(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 Bi(e){return xe(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Ci(e,t,n,r){return xe(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)??$e(i):(r.has(i),$e(i)))}function xe(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Vi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ui(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Wi(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 Yi(e,t,n,r,i,a,o){let c=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(p,m)=>{c=Math.min(c,p),s=Math.min(s,m),l=Math.max(l,p),u=Math.max(u,m)};for(let p of r)p.hidden||pn(p,d);for(let p of i)p.hidden||(d(p.x1,p.y1),d(p.x2,p.y2));for(let p of n)p.hidden||mn(p,d);for(let p of a)p.hidden||hn(p,d,o);return!Number.isFinite(c)||!Number.isFinite(s)?je(0,0,e,t):je(c,s,l,u)}function pn(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=vn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,cn*2);for(let o of a)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function je(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 mn(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 hn(e,t,n){let r=bn(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 gt(e,t,n,r,i,a,o,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:We(e,r,c.scaleModel,c.sceneMetricScale),sortKey:qe(t,n,r)}),Ve(e,i,a,o,c,r+1))}function Ve(e,t,n,r,i,a){let o=t.get(e.id);if(!o)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(qi),s=Gi(c,o.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),l=Xi(c,s);c.forEach((d,p)=>{let m=Hi(d,p,c.length,o,s,l[p]??s.innerPx,i);n.push({object:d,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}),gt(d,m.objectX,m.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,p)=>{let m=ke(p,u.length,-Math.PI/3),g=28*i.spacingFactor,h=Oe(m,o.radius,i.projection,i.projection==="isometric"?.9:1),I=Oe(m,o.radius+g,i.projection,i.projection==="isometric"?.9:1),P=o.x+h.x,b=o.y+h.y,k=o.x+I.x,T=o.y+I.y;t.set(d.id,{object:d,x:k,y:T,radius:We(d,a+1,i.scaleModel,i.sceneMetricScale),sortKey:qe(k,T,a+1),anchorX:P,anchorY:b}),r.push({object:d,groupId:i.objectMap.has(d.id)?$e(ia(d,i.objectMap)):null,x1:P,y1:b,x2:k,y2:T,mode:"surface"}),Ve(d,t,n,r,i,a+1)})}function qi(e,t){let n=Ue(e),r=Ue(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 Gi(e,t,n,r,i){let a=e.map(m=>Ue(m)),o=a.filter(m=>m!==null),c=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(c*1.2,24*n),l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:a,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...o),d=Math.max(...o),p=d-u;return{metrics:a,minMetric:u,maxMetric:d,metricSpread:p,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric}}function Hi(e,t,n,r,i,a,o){let c=e.placement,s=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let G=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:G,rotationDeg:0,band:s,bandThickness:s?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-G}}let l=O(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),u=a,d=Math.max(u*Math.sqrt(1-l*l),u*.18),p=yt(c.inclination)??0,m=o.projection==="isometric"?Math.max(ci,Math.cos(Ge(p)))*sn:1,g=Math.max(d*m,u*.14),h=yt(c.angle)??0,I=u*l,P=In(-I,0,h),b=r.x+P.x,k=r.y+P.y,T=Ji(c.phase,t,n),B=wn(b,k,u,g,h,T),A=o.projection==="topdown"&&l<=1e-4&&Math.abs(h)<=1e-4,C=s?Qi(e,u,i,o.scaleModel):void 0;return{kind:A?"circle":"ellipse",cx:A?r.x:b,cy:A?r.y:k,radius:A?u:void 0,rx:A?void 0:u,ry:A?void 0:g,rotationDeg:h,band:s,bandThickness:C,frontArcPath:o.projection==="isometric"||s?nn(b,k,u,g,h,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||s?nn(b,k,u,g,h,Math.PI,Math.PI*2):void 0,objectX:B.x,objectY:B.y}}function Ki(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Zi(Math.max(e,0)+1)}function Xi(e,t){let n=[];return e.forEach((r,i)=>{let a=Ue(r),o=t.innerPx+i*t.stepPx,c=a===null?o:Ki(a,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,s))}),n}function Ue(e){return!e.placement||e.placement.mode!=="orbit"?null:J(e.placement.semiMajor??e.placement.distance??null)}function Zi(e){return Math.log(e)/Math.log(2)}function Ji(e,t,n){let r=e?yt(e):null;return r!==null?Ge(r-90):ke(t,n,-Math.PI/2)}function Qi(e,t,n,r){let i=J(Ye(e.properties.inner)),a=J(Ye(e.properties.outer));if(i!==null&&a!==null){let c=Math.abs(a-i);if(n.pixelsPerMetric!==null){let l=c*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(l*r.ringThicknessMultiplier,1):O(Math.max(l*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return O(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,a),1e-4);return O(c/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function ea(e,t,n,r,i,a,o,c,s){if(e.kind==="lagrange")return ta(e,t,n,a,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=ke(r,i,Math.PI/5),d=(l.radius+36)*s.scaleModel.labelMultiplier,p=Oe(u,d,s.projection,s.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=ke(r,i,Math.PI/6),d=(l.radius+36)*s.scaleModel.labelMultiplier,p=Oe(u,d,s.projection,s.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:o-c-86-r*58*s.scaleModel.freePlacementMultiplier}}function ta(e,t,n,r,i){let a=e.secondary?t.get(e.primary):oa(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!a||!o)return{x:r*.7,y:i*.25};let c=o.x-a.x,s=o.y-a.y,l=Math.hypot(c,s)||1,u=c/l,d=s/l,p=-d,m=u,g=O(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*g,y:o.y-d*g,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*g,y:o.y+d*g,anchorX:o.x,anchorY:o.y};case"L3":return{x:a.x-u*g,y:a.y-d*g,anchorX:a.x,anchorY:a.y};case"L4":return{x:o.x+(u*.5-p*.8660254)*g,y:o.y+(d*.5-m*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+p*.8660254)*g,y:o.y+(d*.5+m*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function na(e,t){let n=new Map,r=new Map;for(let l of e){let u=gn(l,t);if(n.set(l.id,u),u){let d=r.get(u);d?d.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,o=new Map,c=l=>{let u=i.get(l);if(u)return u;let d=new Set,p=[],m=n.get(l)??null;for(;m&&!d.has(m);)p.push(m),d.add(m),m=n.get(m)??null;return i.set(l,p),p},s=l=>{let u=o.get(a.get(l)??"");if(u)return u;let d=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&d&&(m=s(d)),m};for(let l of e){c(l.id);let u=s(l.id),d=$e(u);a.set(l.id,d),o.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:o}}function gn(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 ra(e,t,n,r,i,a){let o=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(d,p)=>{o=Math.min(o,d),c=Math.min(c,p),s=Math.max(s,d),l=Math.max(l,p)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&mn(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&pn(d,u);for(let d of r)!d.hidden&&e.leaderIds.includes(d.objectId)&&(u(d.x1,d.y1),u(d.x2,d.y2));for(let d of i)!d.hidden&&e.labelIds.includes(d.objectId)&&hn(d,u,a);return!Number.isFinite(o)||!Number.isFinite(c)?je(0,0,0,0):je(o,c,s,l)}function ia(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=gn(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function yn(e,t,n){return bn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function bn(e,t,n,r,i,a,o,c){let s=fa(a,o,c),l=s*2,u=i==="above"?18:12,d=i==="above"?8:12,p=e-s,m=e+s;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)+d}}function aa(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function oa(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function We(e,t,n,r){let i=la(e.properties.radius,n,r);if(i!==null)return i;let a=n.bodyRadiusMultiplier;switch(e.type){case"star":return O((t===0?28:20)*a,n.minBodyRadius,n.maxBodyRadius);case"planet":return O(12*a,n.minBodyRadius,n.maxBodyRadius);case"moon":return O(7*a,n.minBodyRadius,n.maxBodyRadius);case"belt":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"comet":return O(6*a,n.minBodyRadius,n.maxBodyRadius);case"ring":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"structure":return O(6*a,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return O(8*a,n.minBodyRadius,n.maxBodyRadius)}}function sa(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 J(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/we;case"m":return e.value/1e3/we;case"ly":return e.value*ai;case"pc":return e.value*oi;case"kpc":return e.value*si;case"re":return e.value*ni/we;case"rj":return e.value*ri/we;case"sol":return e.value*ii/we;default:return e.value}}function ca(e,t,n){let r=J(e??null);if(r===null||r<=0)return 0;if(n.pixelsPerMetric!==null){let i=r*n.pixelsPerMetric*t.freePlacementMultiplier;return t.bodyScaleMode==="strict"?Math.max(i,0):O(i,0,420)}return O(r*96*t.freePlacementMultiplier,0,420)}function la(e,t,n){let r=Ye(e);if(!r)return null;let i=J(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let o=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(o,.1):O(Math.max(o,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let a;switch(r.unit){case"sol":a=O(r.value*22,14,40);break;case"re":a=O(r.value*10,6,18);break;case"km":a=O(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:a=O(r.value*4,4,20);break}return O(a*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ua(e){return J(Ye(e.properties.radius))}function Ye(e){return!e||typeof e!="object"||!("value"in e)?null:e}function yt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ke(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function nn(e,t,n,r,i,a,o){let c=vn(e,t,n,r,i,a,o,cn);return c.length===0?"":c.map((s,l)=>`${l===0?"M":"L"} ${on(s.x)} ${on(s.y)}`).join(" ")}function vn(e,t,n,r,i,a,o,c){let s=[];for(let l=0;l<=c;l+=1){let u=a+(o-a)*l/c;s.push(wn(e,t,n,r,i,u))}return s}function wn(e,t,n,r,i,a){let o=n*Math.cos(a),c=r*Math.sin(a),s=In(o,c,i);return{x:e+s.x,y:t+s.y}}function In(e,t,n){let r=Ge(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Oe(e,t,n,r){let i=n==="isometric"?sn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function qe(e,t,n){return t*1e3+e+n*.01}function O(e,t,n){return Math.min(Math.max(e,t),n)}function rn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function fe(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function $e(e){return`${fe(e)}-group`}function da(e){return typeof e=="string"&&e.trim()?e:void 0}function fa(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 an(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ge(e){return e*Math.PI/180}function on(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var jn=86400,He=jn*365.25,Ke=18,$n=180;function kn(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,bodyScaleMode:t.bodyScaleMode,activeEventId:t.activeEventId},r=Y(e,n),i=ga(r.layoutPreset,t.spatialScaleModel),a={x:r.contentBounds.centerX,y:r.contentBounds.centerY},o=new Map(r.objects.map(h=>[h.objectId,h])),c=new Map(r.orbitVisuals.map(h=>[h.objectId,h])),s=new Map;for(let h of r.objects){let I=h.object.placement;!I||I.mode!=="orbit"||s.set(h.objectId,It(I))}let l=Math.min(...[...s.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,d=r.objects.map(h=>pa(h,r,a,o,c,i,u,l)),p=new Map(d.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>ma(h,p,l,r.activeEventId!==null)),g=d.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:ba(d),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:d,orbits:m,focusTargets:g}}function pa(e,t,n,r,i,a,o,c){let s=Xe(e,t,n,r,i,o),l=$t(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:s,radius:pe(e.radius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius),visualRadius:pe(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 ma(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??Ze(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??$t(e.object,e,n,r)}}function Xe(e,t,n,r,i,a){let o=a.get(e.objectId);if(o)return o;let c=e.object.placement,s;if(c?.mode==="orbit"&&e.parentId){let l=r.get(e.parentId),u=l?Xe(l,t,n,r,i,a):{x:0,y:0,z:0},d=i.get(e.objectId),p=$t(e.object,d,1,t.activeEventId!==null),m=p?Sn(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=Pn(u,m)}else if(c?.mode==="surface"&&e.parentId){let l=r.get(e.parentId),u=l?Xe(l,t,n,r,i,a):{x:0,y:0,z:0},d=l?.visualRadius??16,p=va(e.objectId),m=p*Math.PI*2;s={x:u.x+Math.cos(m)*(d+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(m)*(d+e.visualRadius*.9)}}else if(c?.mode==="at"&&e.parentId){let l=r.get(e.parentId),u=l?Xe(l,t,n,r,i,a):{x:0,y:0,z:0},d=e.anchorX??l?.x??n.x,p=e.anchorY??l?.y??n.y;s={x:u.x+(e.x-d),y:u.y,z:u.z+(e.y-p)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return a.set(e.objectId,s),s}function On(e,t){let n=new Map(e.objects.map(a=>[a.objectId,a])),r=new Map,i=a=>{let o=r.get(a);if(o)return o;let c=n.get(a);if(!c)return{x:0,y:0,z:0};let s={...c.position};if(c.motion&&c.parentId){let l=i(c.parentId),u=Sn(c.motion,e.timeFrozen?0:t);s=Pn(l,u)}return r.set(a,s),s};for(let a of e.objects)i(a.objectId);return r}function Sn(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=wt(n),i=wt(e.rotationDeg),a=wt(e.inclinationDeg),o=Math.cos(r)*e.semiMajor,c=Math.sin(r)*e.semiMinor,s=o*Math.cos(i)-c*Math.sin(i),l=o*Math.sin(i)+c*Math.cos(i);return{x:s,y:l*Math.sin(a),z:l*Math.cos(a)}}function $t(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let a=t?.radius??t?.rx??pe(It(i)*48,24,1200),o=t?.radius??t?.ry??a,c=ha(i.period),s=It(i),l=pe(s/Math.max(n,1e-4),1,20),u=pe(c?Ke*l:Ke*Math.pow(l,.75),Ke,$n);return{phase0Deg:Ze(i.phase)??0,rotationDeg:Ze(i.angle)??t?.rotationDeg??0,inclinationDeg:Ze(i.inclination)??0,semiMajor:a,semiMinor:o,eccentricity:i.eccentricity??0,periodSeconds:c,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:c===null,frozen:r}}function It(e){let t=xn(e.semiMajor)??xn(e.distance)??1;return Math.max(t,.01)}function xn(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 ha(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*He;case"ky":return e.value*He*1e3;case"my":return e.value*He*1e6;case"gy":return e.value*He*1e9;default:return null}}function Ze(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ga(e,t){return{...ya(e),...t}}function ya(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 ba(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,o=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),o=Math.max(o,c.position.z+c.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:a,maxZ:o,width:i-t,height:a-n,depth:o-r,center:{x:(t+i)/2,y:(n+a)/2,z:(r+o)/2}}}function Pn(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function va(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 pe(e,t,n){return Math.min(Math.max(e,t),n)}function wt(e){return e*Math.PI/180}function Se(e,t={}){let n=Y(e,t),r=[],i=$a(e,r),a=xa(e,r),o=Ia(e,n.renderPreset??t.preset??null,n.projection),c=e.system?wa(e,o,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(s=>!s.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(s=>!s.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 Je(e,t={}){return Ea(Se(e,t))}function Pe(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:Da(e.system),info:Aa(e.system)}:null,r=e.objects.map(Dn);return Sa(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(ka),objects:r}}function Tn(e){return Pe(e)}function wa(e,t,n,r,i,a){let o=Y(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:o.viewpoints.map(ja),annotations:r}}function Ia(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 $a(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 xa(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...o]=r.split(".");if(!a||o.length===0)continue;let c=Mn(a);if(!c)continue;let s=n.get(c)??{id:c};switch(o.join(".").toLowerCase()){case"label":s.label=i;break;case"target":case"object":s.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":s.body=i;break;case"tags":s.tags=Ma(i);break}n.set(c,s)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Mn(`${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(o=>typeof o=="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??Ta(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 ja(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:Pa(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function ka(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Oa)}}function Oa(e){return{objectId:e.objectId,placement:An(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 An(e){return e?structuredClone(e):null}function Sa(e,t,n){if(!n)return;let r=t.find(o=>o.id===n);if(!r)return;let i=new Map(e.map(o=>[o.id,o])),a=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(o=>o.objectId)]);for(let o of a){let c=i.get(o);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let o of r.positions){let c=i.get(o.objectId);c&&(o.placement&&(c.placement=An(o.placement)),o.inner&&(c.properties.inner={...o.inner}),o.outer&&(c.properties.outer={...o.outer}),o.epoch&&(c.epoch=o.epoch),o.referencePlane&&(c.referencePlane=o.referencePlane))}}function Pa(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 Ma(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Mn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ta(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Da(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 Aa(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=La(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 La(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 Ea(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Ln=["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 et(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 s=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"}:Je(e);return xt(s)}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"}:Se(e);return(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6")&&c.version!==n?Qe({...c,version:n,schemaVersion:n}):Qe(c)}let i=[],a=e;a.system&&i.push(...Fa(a.system));let o=[...a.objects].sort(Ot);for(let c of o)i.length>0&&i.push(""),i.push(..._a(c));return i.join(`
|
|
2
|
+
`)}function Qe(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Fn(e.system));for(let r of[...e.groups].sort(me))t.push(""),t.push(...Nn(r));for(let r of[...e.relations].sort(me))t.push(""),t.push(...Bn(r));for(let r of[...e.events].sort(me))t.push(""),t.push(...Cn(r));let n=[...e.objects].sort(Ot);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Rn(r))}),t.join(`
|
|
3
|
+
`)}function xt(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(me))n.push(""),n.push(...Nn(i));for(let i of[...t.relations].sort(me))n.push(""),n.push(...Bn(i));for(let i of[...t.events].sort(me))n.push(""),n.push(...Cn(i));let r=[...t.objects].sort(Ot);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...Rn(i))}),n.join(`
|
|
4
|
+
`)}function Fa(e){return Ra("system",e.id,e.properties,null,e.info)}function Ra(e,t,n,r,i){let a=[`${e} ${t}`],o=[...jt(r),...zn(n)];for(let s of o)a.push(` ${s}`);let c=Object.entries(i).sort(([s],[l])=>s.localeCompare(l));if(c.length>0){o.length>0&&a.push(""),a.push(" info");for(let[s,l]of c)a.push(` ${s} ${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(...Na(n));for(let n of e.annotations)t.push(""),t.push(...Ba(n));return t}function _a(e){return _n(e.type,e.id,e)}function Rn(e){return _n(`object ${e.type}`,e.id,e)}function _n(e,t,n){let r=[`${e} ${t}`],i=[...jt(n.placement),...zn(n.properties),...za(n)];for(let o of i)r.push(` ${o}`);let a=Object.entries(n.info).sort(([o],[c])=>o.localeCompare(c));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[o,c]of a)r.push(` ${o} ${y(c)}`)}for(let o of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[o]??{}).sort(([s],[l])=>s.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${o}`);for(let[s,l]of c)r.push(` ${s} ${y(l)}`)}}return r}function jt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...Q("distance",e.distance),...Q("semiMajor",e.semiMajor),...Ua("eccentricity",e.eccentricity),...Q("period",e.period),...Q("angle",e.angle),...Q("inclination",e.inclination),...Q("phase",e.phase)];case"at":return[`at ${Wa(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?kt(e.distance):e.descriptor??""}`.trim()]}}function zn(e){return Object.keys(e).sort(qa).map(t=>`${t} ${Vn(e[t])}`)}function za(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 Na(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&&Va(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=Ya(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 Ba(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 Nn(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 Bn(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(Ga)){t.push(` pose ${n.objectId}`);for(let r of Ca(n))t.push(` ${r}`)}}return t}function Ca(e){return[...jt(e.placement),...e.epoch?[`epoch ${y(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${y(e.referencePlane)}`]:[],...Q("inner",e.inner),...Q("outer",e.outer)]}function Va(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):kt(e)}function kt(e){return`${e.value}${e.unit??""}`}function Q(e,t){return t?[`${e} ${kt(t)}`]:[]}function Ua(e,t){return t===void 0?[]:[`${e} ${t}`]}function Wa(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 Ya(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 qa(e,t){let n=Ln.indexOf(e),r=Ln.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Ot(e,t){let n=En(e.type),r=En(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function me(e,t){return e.id.localeCompare(t.id)}function Ga(e,t){return e.objectId.localeCompare(t.objectId)}function En(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 Un=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Ha=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Ka=/^[A-Za-z][A-Za-z0-9+.-]*:/;function he(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Te(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function St(e,t,n){let r=e.match(Un);if(!r)throw f.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&&!ve(a.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Pt(e){let t=e.match(Un);return t?{value:Number(t[1]),unit:t[2]??null}:null}function tt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function ee(e,t,n){let r=Ha.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Wn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 f.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 Xa(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Ka);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Yn(e,t,n){let r=D(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw f.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return ee(Me(t,e,n),e,n);case"number":return tt(Me(t,e,n),e,n);case"unit":return St(Me(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Xa(i,n),i}}}function Mt(e,t,n){let r=D(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw f.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function Me(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Gn=new Set(["star","planet","moon","asteroid","comet"]),Za=332946.0487,Ja=1047.3486,nt=1495978707e-1,Qa=6371,eo=695700,to=63241.077,no=206264.806,ro=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 o=new Map;for(let[c,s]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 s){let u=o.get(l);u?n.push(w("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${u}.`)):o.set(l,c)}for(let c of e.relations)io(c,r,n);for(let c of e.system?.viewpoints??[])ao(c,i,a,t,n,r);for(let c of e.objects)oo(c,e.system,r,i,n);for(let c of e.events)so(c,e.system,r,n);return n}function io(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 ao(e,t,n,r,i,a){let o=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(o)for(let c of o.groupIds)t.has(c)||i.push(j("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(j("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}fo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),po(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,o,a)}function oo(e,t,n,r,i){let a=e.placement,o=a?.mode==="orbit"?a:null,c=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(j("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(j("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(j("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),o&&(n.has(o.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"orbit")),o.distance&&o.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),o.phase&&!e.epoch&&!t?.epoch&&i.push(j("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),o.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(j("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),o.period&&!Dt(c?.properties.mass)&&i.push(j("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let s=n.get(a.target);s?Gn.has(s.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")),lo(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 s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(j("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 s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(j("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=qn(e,c);if(l===null){i.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}o?.period||i.push(Tt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${yo(l)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(j("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=Hn(o?.period),u=qn(e,c);if(l===null||u===null)continue;let d=go(e,"period");Math.abs(l-u)>d&&i.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function so(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(j("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(j("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 o=new Set;for(let l of e.participantObjectIds){if(a.add(l),o.has(l)){r.push(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}o.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(j("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(j("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(j("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 d=n.get(l.objectId);if(!d){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(j("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),co(l,d,e,t,n,r,u,e.id)}let s=[...a].filter(l=>!c.has(l));e.positions.length>0&&s.length>0&&r.push(j("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function co(e,t,n,r,i,a,o,c){let s=e.placement;if(!s){a.push(w("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(s.mode==="orbit"){i.has(s.target)||a.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.orbit`)),s.distance&&s.semiMajor&&a.push(w("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`)),s.phase&&!mo(r,t,n,e)&&a.push(j("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${o}.phase`)),s.inclination&&!ho(r,t,n,e)&&a.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${o}.inclination`)),s.period&&!Dt(i.get(s.target)?.properties.mass)&&a.push(j("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${o}.period`));return}if(s.mode==="surface"){let l=i.get(s.target);l?Gn.has(l.type)||a.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):a.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.surface`));return}if(s.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,`${o}.at`));let l=s.reference;l.kind==="named"&&!i.has(l.name)?a.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.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,`${o}.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,`${o}.at`)):a.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)))}}function lo(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 qn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=uo(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 uo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/nt;case"m":return e.value/(nt*1e3);case"ly":return e.value*to;case"pc":return e.value*no;case"kpc":return e.value*ro;case"re":return e.value*Qa/nt;case"sol":return e.value*eo/nt;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/Za;case"mj":return t.value/Ja;default:return null}}function Hn(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 fo(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 po(e,t,n,r,i,a,o,c,s){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[d,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||d==="distance"&&p<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${d}`));e.distance!==null&&t!=="perspective"&&r.push(j("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(j("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(j("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&&s.has(a)||o!==null&&s.has(o)||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 mo(e,t,n,r){return te(r?.epoch)??te(n?.epoch)??te(t.epoch)??te(e?.epoch)??null}function ho(e,t,n,r){return te(r?.referencePlane)??te(n?.referencePlane)??te(t.referencePlane)??te(e?.referencePlane)??null}function te(e){return typeof e=="string"&&e.trim()?e.trim():null}function go(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Hn(n)??0:0}function yo(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 j(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 bo=new Set(["climate","habitability","settlement"]),it=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&&it.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}])it.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var vo=new Set(it.keys()),Xn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function at(e){return Jn(e)}function Zn(e){return Jn(e,"2.0-draft")}function Jn(e,t){let n=as(e),r=n.source.split(/\r?\n/),i=[],a=!1,o="2.0",c=null,s=null,l=[],u=[],d=[],p=[],m=new Map,g=!1,h=!1,I=new Set,P=new Set,b=new Set,k=new Set,T=new Set;for(let M=0;M<r.length;M++){let le=r[M],_=M+1;if(!le.trim())continue;let V=Re(le),H=oe(le.slice(V),{line:_,columnOffset:V});if(H.length!==0){if(!a){o=wo(H,_),a=!0,n.comments.length>0&&ot(o,"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 ${o}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(V===0){s=Io(H,_,o,i,c,l,u,d,p,m,I,P,b,k,T,{sawDefaults:g,sawAtlas:h}),s.kind==="system"?c=s.system:s.kind==="defaults"?g=!0:s.kind==="atlas"&&(h=!0);continue}if(!s)throw new f("Indented line without parent atlas section",_,V+1);Mo(s,V,H,_)}}if(!a)throw new f('Missing required atlas schema header "schema 2.0"');let B=l.map(M=>Ho(M,o,i)),A=p.map(M=>Ko(M,m.get(M.id)??[])),C=t??(o==="2.0-draft"?"2.0":o),G={format:"worldorbit",sourceVersion:"1.0",theme:null,system:c,groups:u,relations:d,events:A,objects:B,diagnostics:i};if(C==="2.0-draft"){let M={...G,version:"2.0-draft",schemaVersion:"2.0-draft"};return M.diagnostics.push(...De(M,o)),M}let ie={...G,version:C,schemaVersion:C};return o==="2.0-draft"&&ie.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".'}),ie.diagnostics.push(...De(ie,o)),ie}function wo(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 f('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 Io(e,t,n,r,i,a,o,c,s,l,u,d,p,m,g,h){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return $o(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(h.sawDefaults)throw new f('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 f('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(h.sawAtlas)throw new f('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 f('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return xo(e,t,i,u,n,r);case"annotation":if(!i)throw new f('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return jo(e,t,i,d);case"group":return R(n,r,"group",{line:t,column:e[0].column}),ko(e,t,o,p);case"relation":return R(n,r,"relation",{line:t,column:e[0].column}),Oo(e,t,c,m);case"event":return R(n,r,"event",{line:t,column:e[0].column}),So(e,t,s,l,g,n,r);case"object":return Po(e,t,n,r,a);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function $o(e,t,n,r){if(e.length!==2)throw new f("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 xo(e,t,n,r,i,a){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let o=he(e[1].value);if(!o)throw new f("Viewpoint id must not be empty",t,e[1].column);if(r.has(o))throw new f(`Duplicate viewpoint id "${o}"`,t,e[1].column);let c={id:o,label:Te(o),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(o),{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 jo(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new f("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:Te(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function ko(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new f("Group id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:Te(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function Oo(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=he(e[1].value);if(!i)throw new f("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`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 So(e,t,n,r,i,a,o){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let c=he(e[1].value);if(!c)throw new f("Event id must not be empty",t,e[1].column);if(i.has(c))throw new f(`Duplicate event id "${c}"`,t,e[1].column);let s={id:c,kind:"",label:Te(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(s),r.set(c,l),i.add(c),{kind:"event",event:s,sourceSchemaVersion:a,diagnostics:o,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Po(e,t,n,r,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],o=e[2],c=a.value;if(!be.has(c)||c==="system")throw new f(`Unknown object type "${a.value}"`,t,a.column);let s={objectType:c,id:o.value,fields:qo(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Mo(e,t,n,r){switch(e.kind){case"system":To(e,n,r);return;case"defaults":Do(e,n,r);return;case"atlas":Ao(e,t,n,r);return;case"viewpoint":Lo(e,t,n,r);return;case"annotation":Ro(e,n,r);return;case"group":_o(e,n,r);return;case"relation":zo(e,n,r);return;case"event":No(e,t,n,r);return;case"object":Co(e,t,n,r);return}}function To(e,t,n){let r=q(t,e.seenFields,n),i=x(t,n);switch(r){case"title":e.system.title=i;return;case"description":R(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":R(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":R(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new f(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Do(e,t,n){let r=q(t,e.seenFields,n),i=x(t,n);switch(r){case"view":er(i)&&se(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Qn(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=tr(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new f(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Ao(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=nr(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new f(`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 f(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Lo(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){Eo(e,n,r);return}if(e.inFilter){Fo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new f('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Lt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new f('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=q(n,e.seenFields,r),a=x(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":er(a)&&se(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Qn(a,r,n[0].column);return;case"preset":e.viewpoint.preset=tr(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=At(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=re(a,r,n[0].column,"rotation");return;case"camera":se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Yo(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=Uo(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":R(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 f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Eo(e,t,n){let r=q(t,e.seenCameraFields,n),i=x(t,n),a=e.viewpoint.camera??Lt();switch(r){case"azimuth":a.azimuth=re(i,n,t[0].column,"camera.azimuth");break;case"elevation":a.elevation=re(i,n,t[0].column,"camera.elevation");break;case"roll":a.roll=re(i,n,t[0].column,"camera.roll");break;case"distance":a.distance=At(i,n,t[0].column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=a}function Fo(e,t,n){let r=q(t,e.seenFilterFields,n),i=e.viewpoint.filter??Wo();switch(r){case"query":i.query=x(t,n);break;case"objecttypes":i.objectTypes=Vo(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 f(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function Ro(e,t,n){switch(q(t,e.seenFields,n)){case"label":e.annotation.label=x(t,n);return;case"target":e.annotation.targetObjectId=x(t,n);return;case"body":e.annotation.body=x(t,n);return;case"tags":e.annotation.tags=N(t.slice(1),n,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function _o(e,t,n){switch(q(t,e.seenFields,n)){case"label":e.group.label=x(t,n);return;case"summary":e.group.summary=x(t,n);return;case"color":e.group.color=x(t,n);return;case"tags":e.group.tags=N(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=ee(x(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function zo(e,t,n){switch(q(t,e.seenFields,n)){case"from":e.relation.from=x(t,n);return;case"to":e.relation.to=x(t,n);return;case"kind":e.relation.kind=x(t,n);return;case"label":e.relation.label=x(t,n);return;case"summary":e.relation.summary=x(t,n);return;case"tags":e.relation.tags=N(t.slice(1),n,"tags");return;case"color":e.relation.color=x(t,n);return;case"hidden":e.relation.hidden=ee(x(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function No(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")&&se(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Bo(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new f(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let a=n[1].value;if(!a.trim())throw new f("Event pose object id must not be empty",r,n[1].column);let o={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(o),e.activePose=o,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new f('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(q(n,e.seenFields,r)){case"kind":e.event.kind=x(n,r);return;case"label":e.event.label=x(n,r);return;case"summary":e.event.summary=x(n,r);return;case"target":e.event.targetObjectId=x(n,r);return;case"participants":e.event.participantObjectIds=N(n.slice(1),r,"participants");return;case"timing":e.event.timing=x(n,r);return;case"visibility":e.event.visibility=x(n,r);return;case"epoch":se(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=x(n,r);return;case"referenceplane":se(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=x(n,r);return;case"tags":e.event.tags=N(n.slice(1),r,"tags");return;case"color":e.event.color=x(n,r);return;case"hidden":e.event.hidden=ee(x(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Bo(e,t,n){if(e.length<2)throw new f("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Xn.has(r))throw new f(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new f(`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 Co(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"||bo.has(i)){i!=="info"&&R(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=nr(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new f(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,o=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(o.has(i.key))throw new f(`Duplicate ${a} key "${i.key}"`,r,n[0].column);o.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(Go(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function q(e,t,n){if(e.length<2)throw new f("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new f(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function x(e,t){if(e.length<2)throw new f("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function Vo(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 Uo(e,t,n,r){let i={};for(let a of N(e,t,"layers")){let o=!a.startsWith("-")&&!a.startsWith("!"),c=a.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=o,i["orbits-front"]=o;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&&R(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=o)}return i}function N(e,t,n){if(e.length===0)throw new f(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new f(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Qn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new f(`Unknown projection "${e}"`,t,n);return r}function er(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function tr(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new f(`Unknown render preset "${e}"`,t,n)}function At(e,t,n,r){let i=re(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function re(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new f(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function Wo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Lt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Yo(e,t,n){if(e.length===0||e.length%2!==0)throw new f('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:Lt(),i=new Set;for(let a=0;a<e.length;a+=2){let o=e[a],c=e[a+1],s=o.value.toLowerCase();if(i.has(s))throw new f(`Duplicate viewpoint camera field "${o.value}"`,t,o.column);i.add(s);let l=c.value;switch(s){case"azimuth":r.azimuth=re(l,t,o.column,"camera.azimuth");break;case"elevation":r.elevation=re(l,t,o.column,"camera.elevation");break;case"roll":r.roll=re(l,t,o.column,"camera.roll");break;case"distance":r.distance=At(l,t,o.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${o.value}"`,t,o.column)}}return r}function qo(e,t,n,r,i){let a=[],o=0;for(;o<e.length;){let c=e[o],s=Ae(c.value);if(!s)throw new f(`Unknown field "${c.value}"`,t,c.column);s.version==="2.1"&&R(r,i,c.value,{line:t,column:c.column}),o++;let l=[];if(s.inlineMode==="single"){let u=e[o];u&&(l.push(u),o++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[o];if(!d)break;l.push(d),o++}else for(;o<e.length&&!vo.has(e[o].value);)l.push(e[o]),o++;if(l.length===0)throw new f(`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 or(a,n),a}function Go(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let a=Ae(e[0].value);if(!a)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&R(r,i,e[0].value,{line:t,column:e[0].column});let o={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return or([o],n),o}function nr(e,t,n){if(e.length<2)throw new f(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 Ho(e,t,n){let r=rr(e.fields),i=ir(r),a=Zo(e.objectType,r),o=rs(r.get("groups")?.[0]),c=rt(r.get("epoch")?.[0]),s=rt(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?ee(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?es(r.get("resonance")[0]):void 0,d=Qo(r),p=r.get("derive")?.map(k=>ts(k)),m=r.get("validate")?.map(k=>({rule:z(k)})),g=r.has("locked")?[...new Set(r.get("locked").flatMap(k=>k.values))]:void 0,h=r.get("tolerance")?.map(k=>ns(k)),I=Jo(e.typedBlockEntries),P=ar(e.infoEntries,"info"),b={type:e.objectType,id:e.id,properties:a,placement:i,info:P};return o.length>0&&(b.groups=o),c&&(b.epoch=c),s&&(b.referencePlane=s),l!==void 0&&(b.tidalLock=l),u&&(b.resonance=u),d&&(b.renderHints=d),p?.length&&(b.deriveRules=p),m?.length&&(b.validationRules=m),g?.length&&(b.lockedFields=g),h?.length&&(b.tolerances=h),I&&Object.keys(I).length>0&&(b.typedBlocks=I),ot(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)&&R(t,n,e.id,e.location),b}function Ko(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Xo(n))}}function Xo(e){let t=rr(e.fields,"event-pose"),n=ir(t);return{objectId:e.objectId,placement:n,inner:ne(t.get("inner")?.[0],"inner"),outer:ne(t.get("outer")?.[0],"outer"),epoch:rt(t.get("epoch")?.[0]),referencePlane:rt(t.get("referencePlane")?.[0])}}function rr(e,t="object"){let n=new Map;for(let r of e){let i=Ae(r.key);if(!i&&!Xn.has(r.key))throw f.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw f.fromLocation(`Duplicate field "${r.key}"`,r.location);let a=n.get(r.key)??[];a.push(r),n.set(r.key,a)}return n}function ir(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 o=t??n??r??i;throw f.fromLocation("Object has multiple placement modes",o?.location)}if(t)return{mode:"orbit",target:z(t),distance:ne(e.get("distance")?.[0],"distance"),semiMajor:ne(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:is(e.get("eccentricity")?.[0],"eccentricity"),period:ne(e.get("period")?.[0],"period"),angle:ne(e.get("angle")?.[0],"angle"),inclination:ne(e.get("inclination")?.[0],"inclination"),phase:ne(e.get("phase")?.[0],"phase")};if(n){let o=z(n);return{mode:"at",target:o,reference:Wn(o,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let o=z(i),c=Pt(o);return{mode:"free",distance:c??void 0,descriptor:c?void 0:o}}return null}function Zo(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],o=Ae(r);!a||!o?.legacySchema||o.legacySchema.placement||(Mt(r,e,a.location),n[r]=Yn(r,a.values,a.location))}return n}function ar(e,t){let n={};for(let r of e){if(r.key in n)throw f.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Jo(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=ar(r,n))}return t}function Qo(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=ee(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=ee(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=tt(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function es(e){if(e.values.length!==2)throw f.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw f.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function ts(e){if(e.values.length!==2)throw f.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function ns(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Pt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function rs(e){return e?[...new Set(e.values)]:[]}function rt(e){return e&&e.values.join(" ").trim()||null}function ne(e,t){return e?St(z(e),e.location,t):void 0}function is(e,t){return e?tt(z(e),t,e.location):void 0}function z(e){return Me(e.values,e.key,e.location)}function Ae(e){return it.get(e)}function or(e,t){for(let n of e){let r=Ae(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Mt(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function R(e,t,n,r){ot(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 se(e,t,n,r){ot(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 ot(e,t){return Kn(e)<Kn(t)}function Kn(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 as(e){let t=[...e],n=[],r=!1,i=!1,a=null,o=1,c=1;for(let s=0;s<t.length;s++){let l=t[s],u=t[s+1];if(i){if(l==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,a=null,s++,c+=2;continue}l!==`
|
|
5
|
+
`&&l!=="\r"&&(t[s]=" "),l===`
|
|
6
|
+
`?(o++,c=1):c++;continue}if(!r&&l==="/"&&u==="*"){n.push({kind:"block",line:o,column:c}),t[s]=" ",t[s+1]=" ",i=!0,a={line:o,column:c},s++,c+=2;continue}if(!r&&l==="#"&&!os(t,s)){n.push({kind:"line",line:o,column:c}),t[s]=" ";let d=s+1;for(;d<t.length&&t[d]!==`
|
|
7
|
+
`&&t[d]!=="\r";)t[d]=" ",d++;c+=d-s,s=d-1;continue}l==='"'&&t[s-1]!=="\\"&&(r=!r),l===`
|
|
8
|
+
`?(o++,c=1):c++}if(i)throw f.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function os(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 Et(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 st(e){return structuredClone(e)}function sr(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(ce))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(ce))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(ce))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(ce))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(ce)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(yr))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(ce))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?fr(e,t.id):null;case"event":return t.id?ct(e,t.id):null;case"event-pose":return t.id&&t.key?mr(e,t.id,t.key):null;case"object":return t.id?dr(e,t.id):null;case"viewpoint":return t.id?hr(e.system,t.id):null;case"annotation":return t.id?gr(e.system,t.id):null;case"relation":return t.id?pr(e,t.id):null}}function Rt(e,t,n){let r=st(e),i=Nt(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 ge(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return ge(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 ss(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return ge(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return ge(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return ge(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return ge(r.relations,n),r}}function cr(e,t,n){return Rt(e,t,n(Ft(e,t)))}function lr(e,t){let n=st(e),r=Nt(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=ct(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 _t(e,t){return t.map(n=>({diagnostic:n,path:zt(e,n)}))}function zt(e,t){if(t.objectId&&dr(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&fr(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&hr(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&gr(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&pr(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&ct(e,n[1]))return n[2]==="pose"&&n[3]&&mr(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 Nt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function ur(e){let t=[...e.diagnostics,...De(e,e.version)];return _t(e,t)}function Nt(e){return e.system||(e.system=Et().system),e.system}function dr(e,t){return e.objects.find(n=>n.id===t)??null}function fr(e,t){return e.groups.find(n=>n.id===t)??null}function pr(e,t){return e.relations.find(n=>n.id===t)??null}function ct(e,t){return e.events.find(n=>n.id===t)??null}function mr(e,t,n){return ct(e,t)?.positions.find(r=>r.objectId===n)??null}function hr(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function gr(e,t){return e?.annotations.find(n=>n.id===t)??null}function ge(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(ce);return}e[n]=t}function ss(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(yr);return}r.positions[i]=n}function ce(e,t){return e.id.localeCompare(t.id)}function yr(e,t){return e.objectId.localeCompare(t.objectId)}var cs=/^schema\s+2(?:\.0|\.1|\.5|\.6)?$/i,ls=/^schema\s+2\.1$/i,us=/^schema\s+2\.5$/i,ds=/^schema\s+2\.6$/i,fs=/^schema\s+2\.0-draft$/i;function Bt(e){for(let t of ps(e).split(/\r?\n/)){let n=t.trim();if(n)return fs.test(n)?"2.0-draft":ls.test(n)?"2.1":us.test(n)?"2.5":ds.test(n)?"2.6":cs.test(n)?"2.0":"1.0"}return"1.0"}function ps(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],o=t[i+1];if(r){if(a==="*"&&o==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
|
|
10
|
+
`&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&o==="*"){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 lt(e){let t=Ct(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new f(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Ct(e){let t=Bt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6")return ms(e,t);let n;try{n=Z(e)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"parse")]}}let r;try{r=U(n)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"normalize")]}}try{W(r)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function ms(e,t){let n;try{n=at(e)}catch(o){return{ok:!1,value:null,diagnostics:[L(o,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(o=>o.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Pe(n)}catch(o){return{ok:!1,value:null,diagnostics:[L(o,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var hs=/^```worldorbit(?:\s+(.*))?\s*$/;function br(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,o=[];return t.forEach((c,s)=>{let l=s+1;if(!r){let u=c.match(hs);u&&(r=!0,i=u[1]??null,a=l,o=[]);return}if(c.trim()==="```"){n.push({source:o.join(`
|
|
12
|
+
`),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,o=[];return}o.push(c)}),n}function vr(e){let t=Z(e),n=U(t);return W(n),{ast:t,document:n}}function gs(e){let t=vr(e);return{...t,scene:Y(t.document)}}function ys(e){return lt(e)}function bs(e){return Ne(e)}function vs(e,t={}){return et(e,t)}return Tr(ws);})();
|