ldr 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -28,7 +28,7 @@ bunx ldr pack --ldraw ./ldraw -o public/car.pack.zst models/car.ldr
28
28
 
29
29
  ```
30
30
  ldr pack --ldraw <dir> -o <out.bin|.zst|.gz> [model.ldr ...] [--part 3001.dat ...] [--all-parts]
31
- [--studs low|full] [--prims full|low] [--no-weld] [--no-colors]
31
+ [--studs low|full] [--prims low|full] [--no-weld] [--no-colors]
32
32
  [--cond] [--textures] [--no-loose-geometry] [--no-lod] [--reorder]
33
33
  ```
34
34
 
@@ -162,7 +162,7 @@ Everything above, plus:
162
162
 
163
163
  | export | description |
164
164
  |---|---|
165
- | `buildPack(options) → { data, parts, studKinds, missing, warnings? }` | Builds a pack. Options: `ldrawRoot`, `models`, `parts`, `allParts`, `studs` (`"low"` \| `"full"`), `primitives` (`"full"` \| `"low"`), `weld` (`true`), `cond` (`false`), `textures` (`false`), `looseGeometry` (`true`), `colors` (`true`), `lod` (`true`: meshoptimizer-simplified LOD meshes, pack feature `lod`), `reorder` (`false`: vertex-cache order), `onProgress`. |
165
+ | `buildPack(options) → { data, parts, studKinds, missing, warnings? }` | Builds a pack. Options: `ldrawRoot`, `models`, `parts`, `allParts`, `studs` (`"low"` \| `"full"`), `primitives` (`"low"` \| `"full"`, default `"low"`), `weld` (`true`), `cond` (`false`), `textures` (`false`), `looseGeometry` (`true`), `colors` (`true`), `lod` (`true`: meshoptimizer-simplified LOD meshes, pack feature `lod`), `reorder` (`false`: vertex-cache order), `onProgress`. |
166
166
  | `Library(root, unofficialRoot?)` | Filesystem LDraw resolver: `where`, `flatten`, `mesh`, `colors`, `texture`, `register`. Handles case-insensitive lookup and `~Moved to` aliases. |
167
167
  | `Compiler`, `encodePack`, `writePack`, `loadColors` | Lower-level pack compiler. |
168
168
  | `ResolverLibrary`, `splitModel`, `flattenWithLibrary`, `collectDeps` | The resolver that `buildPack` uses. |
package/dist/cdn.d.ts CHANGED
@@ -2,7 +2,7 @@ import { type Pack } from "./pack-io.js";
2
2
  import type { PartInstance } from "./model.js";
3
3
  import { type LdrObject, type LdrObjectOptions } from "./scene.js";
4
4
  import { type PrepareOptions } from "./parts-cdn.js";
5
- export { DEFAULT_PARTS_CDN, loadPartsIndex, loadParts, mergePacks, prepareModel, bodyTriangles, BudgetError, type PartsCdnIndex, type LoadPartsOptions, type PrepareOptions, type PreparedModel } from "./parts-cdn.js";
5
+ export { DEFAULT_PARTS_CDN, loadPartsIndex, loadParts, mergePacks, prepareModel, bodyTriangles, estimateBudgetFromIndex, BudgetError, type PartsCdnIndex, type LoadPartsOptions, type PrepareOptions, type PreparedModel } from "./parts-cdn.js";
6
6
  export interface LoadModelOptions extends LdrObjectOptions, PrepareOptions {
7
7
  /** Run parsing / part inflation / pack merging in a Web Worker (default true when available; ignored with a custom `fetch`). */
8
8
  worker?: boolean;
package/dist/cli.js CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // ../../../../../../../tmp/ldr-build-aOWXed/src/cli.ts
3
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/cli.ts
4
4
  import fs4 from "node:fs";
5
5
  import zlib from "node:zlib";
6
6
 
7
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/build-pack.ts
7
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/build-pack.ts
8
8
  import fs3 from "node:fs";
9
9
  import path3 from "node:path";
10
10
 
11
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/resolver.ts
11
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/resolver.ts
12
12
  import fs from "node:fs";
13
13
  import path from "node:path";
14
14
 
15
- // ../../../../../../../tmp/ldr-build-aOWXed/src/spec.ts
15
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/spec.ts
16
16
  var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
17
17
  function parseColor(tok) {
18
18
  if (/^0x/i.test(tok))
@@ -705,7 +705,7 @@ function fileStepViews(f) {
705
705
  return out;
706
706
  }
707
707
 
708
- // ../../../../../../../tmp/ldr-build-aOWXed/src/model.ts
708
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/model.ts
709
709
  var CALLOUT_END = 999999;
710
710
  var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
711
711
  function flatten(doc, opts = {}) {
@@ -1055,7 +1055,7 @@ function parseLDConfig(text) {
1055
1055
  return out;
1056
1056
  }
1057
1057
 
1058
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/resolver.ts
1058
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/resolver.ts
1059
1059
  var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
1060
1060
  var UNDER_STUD_RE = /^(stud3|stud3a|stud4.*|stud12|stud16.*|stud18a)\.dat$/i;
1061
1061
  var norm2 = (ref) => ref.trim().replace(/\\/g, "/").toLowerCase();
@@ -1325,11 +1325,11 @@ function collectDeps(lib, refs) {
1325
1325
  return out;
1326
1326
  }
1327
1327
 
1328
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/compile.ts
1328
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/compile.ts
1329
1329
  import fs2 from "node:fs";
1330
1330
  import path2 from "node:path";
1331
1331
 
1332
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/lod.ts
1332
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/lod.ts
1333
1333
  import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
1334
1334
  await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
1335
1335
  function reorderMesh(P, N, C, I) {
@@ -1521,7 +1521,7 @@ function lodChain(P, C, I) {
1521
1521
  return out;
1522
1522
  }
1523
1523
 
1524
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/compile.ts
1524
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/compile.ts
1525
1525
  function loadColors(root) {
1526
1526
  const map = new Map;
1527
1527
  for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
@@ -2104,7 +2104,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
2104
2104
  return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
2105
2105
  }
2106
2106
 
2107
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/build-pack.ts
2107
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/build-pack.ts
2108
2108
  function buildPack(o) {
2109
2109
  const lib = new Library(o.ldrawRoot);
2110
2110
  const refs = new Map;
@@ -2138,7 +2138,7 @@ function buildPack(o) {
2138
2138
  if (lib.isPart(k) && /\.dat$/.test(k))
2139
2139
  refs.set(k.slice(6), k);
2140
2140
  }
2141
- const comp = new Compiler(lib, { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures });
2141
+ const comp = new Compiler(lib, { studs: o.studs ?? "low", prims: o.primitives ?? "low", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures });
2142
2142
  const parts = new Map, kinds = new Map;
2143
2143
  let n = 0;
2144
2144
  for (const [ref, key] of refs) {
@@ -2172,7 +2172,7 @@ function buildPack(o) {
2172
2172
  return { data: encodePack(parts, kinds, comp.opts.weld, extra, { texture, lod: o.lod !== false, reorder: !!o.reorder }), parts: parts.size, studKinds: kinds.size, missing: [...missing], ...warnings.length ? { warnings } : {} };
2173
2173
  }
2174
2174
 
2175
- // ../../../../../../../tmp/ldr-build-aOWXed/src/cli.ts
2175
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/cli.ts
2176
2176
  var HELP = `ldr pack — build a parts pack for the ldr three.js renderer
2177
2177
 
2178
2178
  Usage:
@@ -2184,7 +2184,7 @@ Options:
2184
2184
  --part <ref> Include a part (repeatable), e.g. --part 3001.dat
2185
2185
  --all-parts Include every part in the library (large)
2186
2186
  --studs low|full Stud detail (default low)
2187
- --prims full|low Other primitive detail (default full)
2187
+ --prims low|full Other primitive detail (default low)
2188
2188
  --no-weld Don't index/weld vertices
2189
2189
  --cond Keep conditional (type-5) lines for curved-surface outlines (pack v2, ~+8-14% zstd)
2190
2190
  --textures Keep printed/sticker parts' !TEXMAP geometry + UVs and embed their PNGs (pack v2; packs without
@@ -2206,7 +2206,7 @@ var parts = [];
2206
2206
  var ldraw = "";
2207
2207
  var out = "";
2208
2208
  var studs = "low";
2209
- var prims = "full";
2209
+ var prims = "low";
2210
2210
  var weld = true;
2211
2211
  var colors = true;
2212
2212
  var all = false;
package/dist/index.d.ts CHANGED
@@ -10,6 +10,6 @@ export type { Pack, LdrParams, Inst, CullResult, BuildLdrSceneAsyncOptions } fro
10
10
  export { createLdrObject, createLdrObjectAsync } from "./scene.js";
11
11
  export type { LdrObject, LdrObjectOptions, LdrStats, ColorSource } from "./scene.js";
12
12
  export { decompressPack, decodeModelText, modelFileName } from "./pack-io.js";
13
- export { loadModel, loadParts, loadPartsIndex, mergePacks, prepareModel, bodyTriangles, BudgetError, DEFAULT_PARTS_CDN } from "./cdn.js";
13
+ export { loadModel, loadParts, loadPartsIndex, mergePacks, prepareModel, bodyTriangles, estimateBudgetFromIndex, BudgetError, DEFAULT_PARTS_CDN } from "./cdn.js";
14
14
  export type { LoadModelOptions, LoadedModel, LoadPartsOptions, PartsCdnIndex, PrepareOptions, PreparedModel } from "./cdn.js";
15
15
  export { embeddedKeys } from "./embedded.js";
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // ../../../../../../../tmp/ldr-build-aOWXed/src/spec.ts
1
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/spec.ts
2
2
  var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
3
3
  function parseColor(tok) {
4
4
  if (/^0x/i.test(tok))
@@ -689,7 +689,7 @@ function fileStepViews(f) {
689
689
  viewMemo.set(f, out);
690
690
  return out;
691
691
  }
692
- // ../../../../../../../tmp/ldr-build-aOWXed/src/model.ts
692
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/model.ts
693
693
  var CALLOUT_END = 999999;
694
694
  var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
695
695
  function flatten(doc, opts = {}) {
@@ -1038,7 +1038,7 @@ function parseLDConfig(text) {
1038
1038
  }
1039
1039
  return out;
1040
1040
  }
1041
- // ../../../../../../../tmp/ldr-build-aOWXed/src/instructions.ts
1041
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/instructions.ts
1042
1042
  var MIN_VIS = 0.5;
1043
1043
  var REORIENT = 0.35;
1044
1044
  var deg = Math.PI / 180;
@@ -1406,10 +1406,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
1406
1406
  }
1407
1407
  };
1408
1408
  }
1409
- // ../../../../../../../tmp/ldr-build-aOWXed/src/render.ts
1409
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/render.ts
1410
1410
  import * as THREE from "three";
1411
1411
 
1412
- // ../../../../../../../tmp/ldr-build-aOWXed/src/pack-io.ts
1412
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/pack-io.ts
1413
1413
  import { decompress } from "fzstd";
1414
1414
  async function decompressPack(data) {
1415
1415
  const u = data instanceof Uint8Array ? data : new Uint8Array(data);
@@ -1432,7 +1432,7 @@ function decodePack(buf) {
1432
1432
  return { header, arr, bytes: buf.byteLength, buffer: buf };
1433
1433
  }
1434
1434
 
1435
- // ../../../../../../../tmp/ldr-build-aOWXed/src/cull.ts
1435
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/cull.ts
1436
1436
  var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
1437
1437
  var prepCache = new WeakMap;
1438
1438
  function prepPart(H, part) {
@@ -1749,7 +1749,7 @@ function precomputeCull(instances, H, useTex = true) {
1749
1749
  return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
1750
1750
  }
1751
1751
 
1752
- // ../../../../../../../tmp/ldr-build-aOWXed/src/render.ts
1752
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/render.ts
1753
1753
  async function loadPack(url) {
1754
1754
  const res = await fetch(url);
1755
1755
  if (!res.ok)
@@ -3371,7 +3371,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
3371
3371
  await new Promise((r) => setTimeout(r, 0));
3372
3372
  }
3373
3373
  }
3374
- // ../../../../../../../tmp/ldr-build-aOWXed/src/scene.ts
3374
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/scene.ts
3375
3375
  import * as THREE2 from "three";
3376
3376
  function colorFn(src, pack, fallback) {
3377
3377
  const table = new Map;
@@ -3588,10 +3588,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
3588
3588
  return finish();
3589
3589
  })();
3590
3590
  }
3591
- // ../../../../../../../tmp/ldr-build-aOWXed/src/parts-cdn.ts
3591
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/parts-cdn.ts
3592
3592
  import { decompress as decompress2 } from "fzstd";
3593
3593
 
3594
- // ../../../../../../../tmp/ldr-build-aOWXed/src/embedded.ts
3594
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/embedded.ts
3595
3595
  function splitFiles(text, fallback) {
3596
3596
  const files = new Map;
3597
3597
  let cur = null, saw = false;
@@ -3663,7 +3663,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
3663
3663
  return out;
3664
3664
  }
3665
3665
 
3666
- // ../../../../../../../tmp/ldr-build-aOWXed/src/parts-cdn.ts
3666
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/parts-cdn.ts
3667
3667
  var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
3668
3668
  var indexCache = new Map;
3669
3669
  var shardCache = new Map;
@@ -3806,6 +3806,25 @@ function bodyTriangles(insts, pack) {
3806
3806
  }
3807
3807
  return n;
3808
3808
  }
3809
+ function estimateBudgetFromIndex(insts, emb, idx) {
3810
+ let bodyTris = 0, packBytes = 0, known = false;
3811
+ const seen = new Set;
3812
+ for (const i of insts) {
3813
+ const k = i.embedded ? emb.get(i.part) : norm(i.part);
3814
+ const e = k ? idx.parts[k] : undefined;
3815
+ if (!e)
3816
+ continue;
3817
+ if (e[3] != null) {
3818
+ known = true;
3819
+ bodyTris += e[3];
3820
+ }
3821
+ if (!seen.has(k)) {
3822
+ seen.add(k);
3823
+ packBytes += e[1];
3824
+ }
3825
+ }
3826
+ return { bodyTris, packBytes, known };
3827
+ }
3809
3828
 
3810
3829
  class BudgetError extends Error {
3811
3830
  code = "ldr-budget";
@@ -3843,6 +3862,12 @@ async function prepareModel(source, o = {}) {
3843
3862
  o.onParsed?.(insts);
3844
3863
  await idxP;
3845
3864
  const emb = embeddedKeys(text, new Set(insts.filter((i) => i.embedded).map((i) => i.part)), name);
3865
+ const over = (t, b) => o.maxBodyTris != null && t > o.maxBodyTris || o.maxPackBytes != null && b > o.maxPackBytes;
3866
+ if (o.maxBodyTris != null || o.maxPackBytes != null) {
3867
+ const est = estimateBudgetFromIndex(insts, emb, await idxP);
3868
+ if (over(est.known ? est.bodyTris : 0, est.packBytes))
3869
+ throw new BudgetError({ bodyTris: est.bodyTris, packBytes: est.packBytes, maxBodyTris: o.maxBodyTris, maxPackBytes: o.maxPackBytes });
3870
+ }
3846
3871
  const { pack, missing: miss, requests, bytes } = await loadParts([...insts.filter((i) => !i.embedded).map((i) => i.part), ...emb.values()], o);
3847
3872
  const back = new Map([...emb].map(([n, k]) => [k, n])), missing = miss.map((m) => back.get(m) ?? m);
3848
3873
  for (const [n, k] of emb) {
@@ -3854,17 +3879,17 @@ async function prepareModel(source, o = {}) {
3854
3879
  if (o.maxBodyTris != null || o.maxPackBytes != null) {
3855
3880
  const packBytes = pack.buffer?.byteLength ?? pack.bytes ?? 0;
3856
3881
  const bodyTris = bodyTriangles(insts, pack);
3857
- if (o.maxBodyTris != null && bodyTris > o.maxBodyTris || o.maxPackBytes != null && packBytes > o.maxPackBytes)
3882
+ if (over(bodyTris, packBytes))
3858
3883
  throw new BudgetError({ bodyTris, packBytes, maxBodyTris: o.maxBodyTris, maxPackBytes: o.maxPackBytes });
3859
3884
  }
3860
3885
  const cull = o.cull ? precomputeCull(insts, pack.header, o.textures !== false) : undefined;
3861
3886
  return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
3862
3887
  }
3863
3888
 
3864
- // ../../../../../../../tmp/ldr-build-aOWXed/src/load-worker.gen.ts
3865
- var load_worker_gen_default = 'var dt=ArrayBuffer,W=Uint8Array,ge=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},xt=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var wt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],K=function(e,t,n){var r=Error(t||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,m=je(e,a,c);a+=c;var p=l?1<<l:s,h=je(e,a,p)+(l==1&&256),d=h;if(!s){var T=1<<10+(e[5]>>3);d=T+(T>>3)*(e[5]&7)}if(d>2145386496)K(1);var u=new W((t==1?h||d:t?0:d)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+p,y:0,l:0,d:m,w:t&&t!=1?t:u.subarray(12),e:d,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return At(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,m=o,p=new dt(512+(o<<2)),h=new yt(p,0,256),d=new ge(p,0,256),T=new ge(p,512,o),u=512+(o<<1),b=new W(p,u,o),E=new W(p,u+o);while(l<255&&i>0){var g=re(i+1),f=r>>3,w=(1<<g+1)-1,U=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(r&7)&w,y=(1<<g)-1,v=w-i-1,S=U&y;if(S<v)r+=g,U=S;else if(r+=g+1,U>y)U-=v;if(h[++l]=--U,U==-1)i+=U,b[--m]=l;else i-=U;if(!U)do{var R=r>>3;a=(e[R]|e[R+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var C=0,D=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=h[H];if(M<1){d[H]=-M;continue}for(c=0;c<M;++c){b[C]=H;do C=C+D&X;while(C>=m)}}if(C)K(0);for(c=0;c<o;++c){var A=d[b[c]]++,P=E[c]=s-re(A);T[c]=(A<<P)-o}return[r+7>>3,{b:s,s:b,n:E,t:T}]},vt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),m=c[0],p=c[1];t+=o;var h=m<<3,d=e[t];if(!d)K(0);var T=0,u=0,b=p.b,E=b,g=(++t<<3)-8+re(d);for(;;){if(g-=b,g<h)break;var f=g>>3;if(T+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<b)-1,i[++r]=p.s[T],g-=E,g<h)break;f=g>>3,u+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<E)-1,i[++r]=p.s[u],b=p.n[T],T=p.t[T],E=p.n[u],u=p.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var U=0;for(n=0;n<r;++n){var y=i[n];if(y>11)K(0);U+=y&&1<<y-1}var v=re(U)+1,S=1<<v,R=S-U;if(R&R-1)K(0);i[r++]=re(R)+1;for(n=0;n<r;++n){var y=i[n];++l[i[n]=y&&v+1-y]}var C=new W(S<<1),D=C.subarray(0,S),X=C.subarray(S);a[v]=0;for(n=v;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<v-n))}if(a[0]!=S)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(D,n,A,a[M]=A+(1<<v-M))}}return[t,{n:X,b:v,s:D}]},Tt=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ct=ue(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Le=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Lt=Ve(Le,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,m=(r<<3)-8+re(o)-c,p=-1;for(;m>l&&p<s;){var h=m>>3,d=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(m&7);a=(a<<c|d)&i,t[++p]=n.s[a],m-=c=n.n[a]}if(m!=l||p+1!=s)K(0)},Pt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},kt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Ee(e,s,a)}if(i==2){var c=e[s],m=c&3,p=c>>2&3,h=c>>4,d=0,T=0;if(m<2)if(p&1)h|=e[++s]<<4|(p&2&&e[++s]<<12);else h=c>>3;else if(T=p,p<2)h|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(p==2)h|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(m==0)u.set(e.subarray(s,s+=h),b);else if(m==1)ce(u,e[s++],b);else{var E=t.h;if(m==2){var g=vt(e,s);d+=s-(s=g[0]),t.h=E=g[1]}else if(!E)K(0);(T?Pt:le)(e.subarray(s,s+=d),u.subarray(b),E)}var f=e[s++];if(f){if(f==255)f=(e[s++]|e[s++]<<8)+32512;else if(f>127)f=f-128<<8|e[s++];var w=e[s++];if(w&3)K(0);var U=[Ct,Et,Tt];for(var y=2;y>-1;--y){var v=w>>(y<<1)+2&3;if(v==1){var S=new W([0,0,e[s++]]);U[y]={s:S.subarray(2,3),n:S.subarray(0,1),t:new ge(S.buffer,0,1),b:0}}else if(v==2)r=ue(e,s,9-(y&1)),s=r[0],U[y]=r[1];else if(v==3){if(!t.t)K(0);U[y]=t.t[y]}}var R=t.t=U,C=R[0],D=R[1],X=R[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,P=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=D.b)>>3;var k=(e[A]|e[A+1]<<8)>>(M&7)&(1<<D.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++f;--f;){var L=X.s[V],x=X.n[V],O=C.s[N],F=C.n[N],B=D.s[k],z=D.n[k];A=(M-=B)>>3;var j=1<<B,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Le[O])>>3;var G=Lt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Le[O])-1);A=(M-=Se[L])>>3;var _=St[L]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[L])-1);if(A=(M-=x)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<x)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,k=D.t[k]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Z=I-(_!=0);if(Z){if(I=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var y=0;y<_;++y)u[P+y]=u[b+y];P+=_,b+=_;var q=P-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var y=0;y<J;++y)u[P+y]=t.w[ee+y];P+=J,G-=J,q=0}for(var y=0;y<G;++y)u[P+y]=u[q+y];P+=G}if(P!=b)while(b<u.length)u[P++]=u[b++];else P=u.length;if(n)t.y+=P;else u=Ee(u,0,P)}else if(n){if(t.y+=h,b)for(var y=0;y<h;++y)u[y]=u[b+y]}else if(b)u=Ee(u,b);return t.b=a,u}K(2)},It=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function de(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return It(n,o)}async function Ft(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(de(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function He(e){return new TextDecoder().decode(await Ft(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function ye(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Pe(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Bt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Qe=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Rt=new Set(["model","submodel","configuration"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let p=0;p<s;p++)l=l.replace(/^\\S+\\s*/,"");let a=Ut(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let m=a.findIndex((p,h)=>h>0&&p.toUpperCase()==="GLOSSMAP");if(m>0&&a[m+1])c.glossmap=a[m+1];if(t)c.next=!0;return c}var Ot=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Nt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let m=s();if(m===null)return null;i[c]=+m}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Pe(o),m:i,file:Y(a)}}function Ke(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Pe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Y(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function et(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],m=null,p=()=>{if(!a)return;let g=Ot(a.chunks.join("")),f=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Y(a.name),{name:a.name,bytes:g,...f?{mime:"image/png"}:{}}),a=null},h=!0,d=(g)=>{if(p(),o={name:Y(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],m=null,h=!0},T=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},E=(g,f)=>{if(m){g.tex=m,m=null;return}let w=c[c.length-1];if(!w)return;if(w.fallback){if(!f)g.fallback=!0}else g.tex=w.map};for(let g of e.split(`\n`)){let f=g.trim();if(!f)continue;if(r&&f.charCodeAt(0)>=50&&f.charCodeAt(0)<=53&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){if(a||T)continue;if(!o)d(t);let v=f.slice(2).trimStart(),S=v.search(/\\s/),R={t:f.charCodeAt(0)-48,color:Pe(S<0?v:v.slice(0,S)),p:[],src:f};E(R,!1),o.cmds.push(R),h=!1;continue}if(f.charCodeAt(0)===48&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){let v=2;while(f.charCodeAt(v)===32||f.charCodeAt(v)===9)v++;let S=v;while(S<f.length&&f.charCodeAt(S)!==32&&f.charCodeAt(S)!==9)S++;let R=f.slice(v,S);if(!Bt.has(R)){if(T||a)continue;if(!o)d(t);let C=f.slice(v),D={t:0,text:C};if(R.charCodeAt(0)===33)D.meta=R;if(m=null,h&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Y(H)}o.cmds.push(D);continue}}if(f.charCodeAt(0)===49&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)&&!a&&!T){let v=Nt(f);if(v){if(!o)d(t);E(v,!1),o.cmds.push(v),h=!1;continue}}let w=f.split(/\\s+/);if(+w[0]===0){let v=f.slice(1).trim();if(w[1]==="FILE"){b(),T=!1,d(v.slice(5));continue}if(w[1]==="NOFILE"){p(),o=null,T=!0;continue}if(w[1]==="!DATA"){b(),p(),o=null,T=!1,a={name:v.slice(5).trim(),chunks:[]};continue}if(T)continue;if(a){if(w[1]==="!:")a.chunks.push(w.slice(2).join(""));continue}if(!o)d(t);let S={t:0,text:v};if(w[1]==="STEP")S.step=!0,c=[],m=null;else if(w[1]==="BFC")S.bfc=w.slice(2).join(" ");else if(w[1]==="ROTSTEP")if(S.meta="ROTSTEP",S.step=!0,c=[],m=null,(w[2]??"").toUpperCase()==="END")S.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(w[5]??"REL").toUpperCase();S.rotstep={x:+w[2]||0,y:+w[3]||0,z:+w[4]||0,mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(w[1]==="BUFEXCHG"){S.meta="BUFEXCHG";let C=(w[2]??"").toUpperCase();S.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:w[3]??"A"}}else if(w[1]?.startsWith("!"))S.meta=w[1];if(h&&!o.org){let C=We(v);if(C)o.org=C}if(w[1]==="!TEXMAP"){let C=(w[2]??"").toUpperCase();if(m=null,C==="START"||C==="NEXT"){let D=zt(v.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(S.texmap={op:C,...D?{map:D}:{}},D)if((o.texmaps??=[]).push(D),C==="START")c.push({map:D,fallback:!1});else m=D}else if(C==="FALLBACK"){S.texmap={op:C};let D=c[c.length-1];if(D)D.fallback=!0}else if(C==="END")S.texmap={op:C},c.pop()}else if(w[1]==="!:"){m=null;let C=Ke(w.slice(2));if(C)E(C,!0),S.geom=C}else m=null;let R=v.match(_e);if(R&&!o.movedTo){let C=R[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Y(C)}o.cmds.push(S);continue}if(a||T)continue;if(!o)d(t);let y=Ke(w);if(!y)continue;E(y,!1),o.cmds.push(y),h=!1}return p(),l?{main:i,files:s,data:l}:{main:i,files:s}}var ln=Math.PI/180;function tt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function nt(e,t){let[n,r,s,o,i,l,a,c,m,p,h,d]=e,[T,u,b,E,g,f,w,U,y,v,S,R]=t;return[o*T+i*u+l*b+n,a*T+c*u+m*b+r,p*T+h*u+d*b+s,o*E+i*w+l*v,o*g+i*U+l*S,o*f+i*y+l*R,a*E+c*w+m*v,a*g+c*U+m*S,a*f+c*y+m*R,p*E+h*w+d*v,p*g+h*U+d*S,p*f+h*y+d*R]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Ie(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&$t.test(s.file))?"part":"model";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return Ze.set(e,t),t}var Ye=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(" ")}`,Fe=(e,t)=>`${Y(e)}#${t}`;function Vt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Fe(e.name,t),cmds:n}}function st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function ot(e){let[t,n,r,s,o,i,l,a,c,m,p,h]=e,d=a*h-c*p,T=-(l*h-c*m),u=l*p-a*m,b=s*d+o*T+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let E=1/b,g=[d*E,-(o*h-i*p)*E,(o*c-i*a)*E,T*E,(s*h-i*m)*E,-(s*c-i*l)*E,u*E,-(s*p-o*m)*E,(s*a-o*l)*E];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Gt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?" GLOSSMAP "+Je(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${Ht(r)}`,source:r}}var _t=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Wt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var qe=new WeakMap;function at(e){let t=qe.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Wt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Kt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(p,h)=>{let d=p.name+"#"+h,T=l.get(d);if(!T){let u;T=Object.assign(()=>u??=st(p,h),{file:p,step:h}),l.set(d,T)}return T},m=(p,h,d,T,u,b,E,g,f=null,w=[],U=[])=>{let y=p.files.get(h);if(!y||E>r)return;let v=0,S=E>0?++a:0,R=i&&S?[...w,S]:w,C=i&&S?[...U,d]:U,D=i&&!f?new Map:null,X=-1,H=0,M=(L,x,O,F,B,z)=>{if(X!==v)X=v,H=0;let j=D?.get(v+"|"+x);if(j)return j.n++,m(L,L===p?x:L.main,O,F,u+"/"+x,[...B,lt],E+1,z,[...B,lt],R,C);let I=[...B,H++],G=n.length;m(L,L===p?x:L.main,O,F,u+"/"+x,I,E+1,z,f,R,C),D?.set(v+"|"+x,{n:1,from:G,to:n.length})},A=at(y),P=s?rt(y):[],V=0,k=(L,x,O,F,B,z,j)=>{if(f)F=f;let I={part:L,color:x,m:O,step:F[0],steps:F,localStep:B,path:u};if(S){if(I.sub=S,i)I.subPath=R,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(L,j);I.texPart=_.name,I.texSource=_.source}let G=A[B];if(G)I.view=G;return n.push(I),I},N=(L)=>{while(V<P.length&&P[V]<=L){let x=P[V++];k(Fe(y.name,x),T,d,[...b,x],x,!1,null).source=c(y,x)}};for(let L of y.cmds){if(L.t===0&&L.step){v++;continue}let x=L;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){N(v);continue}if(x.t===0)if(o&&x.geom?.t===1)x=x.geom;else continue;if(x.t!==1)continue;if(o&&x.fallback)continue;let O=x.color===16?T:x.color,F=nt(d,x.m),B=[...b,v],z=o?x.tex??g:null,j=z?ot(x.m):null,I=z&&j?tt(z,j):null;if(p.files.has(x.file)){if(Ie(p,x.file)==="model"){M(p,x.file,F,O,B,I);continue}k(x.file,O,F,B,v,!0,I);continue}let G=t.resolveModel?.(x.file);if(G){M(G,x.file,F,O,B,I);continue}k(x.file,O,F,B,v,!1,I)}if(N(1/0),D){for(let L of D.values())if(L.n>1)for(let x=L.from;x<L.to;x++)n[x].mult??=L.n}};if(Ie(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return m(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t="main.ldr",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Y(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Y(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Yt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function ft(e,t,n="main.ldr"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Y(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let m of r.get(a.pop())){let p=Zt(m);if(p&&r.has(p)&&!l.has(p))l.add(p),a.push(p)}let c=[i,...[...l].filter((m)=>m!==i).sort()].map((m)=>"0 FILE "+(m===i?"":m)+`\n`+r.get(m).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,mt=new WeakMap;function Be(e,t){let n=mt.get(e);if(!n)mt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,d)=>{l.push(h[0]),a.push(h[1]);for(let T=0;T<12;T++)i[d*12+T]=h[2+T]});let c=null,m=0,p=0;if(s.mask){m=s.mask[0],p=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let d=0;d<h.length;d++)c[d]=h.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:m,nz:p}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],m=[],p=[],h=new Re(e.length*2),d=[],T=[];for(let M=0;M<e.length;M++){let A=e[M],P=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(P))continue;let k=V.bbox,N=1/0,L=-1/0,x=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?k[3]:k[0],G=j?k[5]:k[2],_=P[0]+P[3]*I+P[5]*G,Z=P[2]+P[9]*I+P[11]*G;if(_<N)N=_;if(_>L)L=_;if(Z<x)x=Z;if(Z>O)O=Z}let F=a.length;s.push(N),o.push(L),i.push(x),l.push(O),a.push(M),c.push(Be(t,A.part)),m.push(k[0]),p.push(k[2]);let B=Math.round((P[1]+k[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(L/40);z++)for(let j=Math.floor(x/40);j<=Math.floor(O/40);j++){if(!xe(B,z,j))continue;let I=T.length;T.push(F),d.push(h.put(B,z,j,I))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],E=NaN,g=NaN,f=NaN,w=-1,U=(M,A,P,V)=>{let k=Math.round(A*2),N=Math.floor(M/40),L=Math.floor(P/40);if(!xe(k,N,L))return fe;let x=fe;if(k!==E||N!==g||L!==f)E=k,g=N,f=L,w=h.get(k,N,L);for(let O=w;O>=0;O=d[O]){let F=T[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&P-6>=i[F]-0.5&&P+6<=l[F]+0.5))continue;let B=e[a[F]].m,z=c[F],j=m[F],I=p[F],G=M-B[0],_=A-B[1],Z=P-B[2],q=B[3]*G+B[6]*_+B[9]*Z,J=B[5]*G+B[8]*_+B[11]*Z,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-I)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[F]];if(Q<x)x=Q}}return x},y=0;for(let M of e){let A=Be(t,M.part);if(A)y+=A.nStuds}let v=new Uint8Array(y),S=new Uint8Array(y),R=new Re(y),C=0,D=n?new Int32Array(y).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let P=e[M],V=Be(t,P.part);if(!V)continue;let k=P.m,N=V.studM,L=k[0],x=k[1],O=k[2],F=k[3],B=k[4],z=k[5],j=k[6],I=k[7],G=k[8],_=k[9],Z=k[10],q=k[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+B*ae+z*oe)<0.001&&Math.abs(_*se+Z*ae+q*oe)<0.001))continue;S[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=L+F*Q+B*te+z*ne,Ue=x+j*Q+I*te+G*ne,ze=O+_*Q+Z*te+q*ne,Oe=U(De,Ue,ze,M);if(Oe!==fe){if(v[A]=1,C++,D)D[A]=Oe}let pe=Math.round(De),me=Math.round(Ue),he=Math.round(ze);if(!xe(pe,me,he))continue;if(!n){R.put(pe,me,he,1);continue}let Ne=n[M],$e=R.get(pe,me,he);if($e<0||Ne<$e)R.put(pe,me,he,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],P=t.parts[A.part];if(!P||!P.under||!pt(A.m))continue;let V=P.bbox,k=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!k||!N||k*N>4096)continue;let L=A.m,x=!0,O=0;for(let F=0;F<k&&x;F++)for(let B=0;B<N;B++){let z=V[0]+10+20*F,j=V[2]+10+20*B,I=L[0]+L[3]*z+L[5]*j,G=L[2]+L[9]*z+L[11]*j,_=Math.round(I),Z=Math.round(L[1]+V[4]),q=Math.round(G),J=xe(_,Z,q)?R.get(_,Z,q):-1;if(J<0){x=!1;break}if(J>O)O=J}if(x){if(X[M]=1,H)H[M]=O}}return{nStuds:y,studHidden:v,studUp:S,underHidden:X,studsHidden:C,studHideStep:D,underHideStep:H}}function qt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>ct(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function we(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te="https://ldr-demo.vercel.app/cdn/v1/",Me=new Map,Ae=new Map;function gt(e=Te,t=fetch){let n=Me.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Me.delete(e)),Me.set(e,n);return n}var Qt=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),ve=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ve(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ve(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let d=h.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let T=new DataView(d).getUint32(0,!0),u=new Uint8Array(d,4+T),b=r;n.push(u),r+=u.byteLength;let E=(4-r%4)%4;if(E)n.push(new Uint8Array(E)),r+=E;for(let[g,f]of Object.entries(h.header.parts??{}))if(!(g in s))s[g]=ve(f,b);for(let[g,f]of Object.entries(h.header.studKinds??{}))if(!(g in o))o[g]=ve(f,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,m=new Uint8Array(c+r);new DataView(m.buffer).setUint32(0,l.length+a,!0),m.set(l,4),m.fill(32,4+l.length,c);let p=c;for(let h of n)m.set(h,p),p+=h.byteLength;return ye(m.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;Me.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Y))],l=[],a=[];for(let u of i){if(Ae.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let m=0,p=0,h=async()=>{while(p<c.length){let u=c[p++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let E=new Uint8Array(await b.arrayBuffer());if(b.status===200)E=E.subarray(u.start,u.end);m+=E.byteLength;for(let g of u.items){let f=de(E.subarray(g.off-u.start,g.off-u.start+g.len)),w=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);Ae.set(n+g.name,ye(w))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let d=i.filter((u)=>Ae.has(n+u)).map((u)=>Ae.get(n+u));return{pack:d.length?en(d,{colors:o.colors}):ye(nn(o.colors)),missing:l,requests:c.length,bytes:m}}function nn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function rn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}class Ce extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function bt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(f)=>{if(!f.ok)throw Error(`ldr: ${f.status} fetching ${e}`);return He(await f.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let m=ft(o,new Set(a.filter((f)=>f.embedded).map((f)=>f.part)),l),{pack:p,missing:h,requests:d,bytes:T}=await tn([...a.filter((f)=>!f.embedded).map((f)=>f.part),...m.values()],t),u=new Map([...m].map(([f,w])=>[w,f])),b=h.map((f)=>u.get(f)??f);for(let[f,w]of m){let U=p.header.parts[w];if(U)p.header.parts[f]=U}let E=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let f=p.buffer?.byteLength??p.bytes??0,w=rn(a,p);if(t.maxBodyTris!=null&&w>t.maxBodyTris||t.maxPackBytes!=null&&f>t.maxPackBytes)throw new Ce({bodyTris:w,packBytes:f,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let g=t.cull?we(a,p.header,t.textures!==!1):void 0;return{insts:a,pack:p,missing:b,requests:d,bytes:T,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:E-c,...g?{cull:performance.now()-E}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await bt(n,{...r,cull:!1,onParsed:(m)=>self.postMessage({id:t,insts:m})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=we(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let m of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(m)c.push(m.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof Ce||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
3889
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/load-worker.gen.ts
3890
+ var load_worker_gen_default = 'var bt=ArrayBuffer,W=Uint8Array,de=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},xt=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var wt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],K=function(e,t,n){var r=Error(t||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,f=je(e,a,c);a+=c;var m=l?1<<l:s,h=je(e,a,m)+(l==1&&256),x=h;if(!s){var T=1<<10+(e[5]>>3);x=T+(T>>3)*(e[5]&7)}if(x>2145386496)K(1);var u=new W((t==1?h||x:t?0:x)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+m,y:0,l:0,d:f,w:t&&t!=1?t:u.subarray(12),e:x,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,x)}}else if((n>>4|e[3]<<20)==25481893)return At(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,f=o,m=new bt(512+(o<<2)),h=new yt(m,0,256),x=new de(m,0,256),T=new de(m,512,o),u=512+(o<<1),b=new W(m,u,o),S=new W(m,u+o);while(l<255&&i>0){var d=re(i+1),g=r>>3,p=(1<<d+1)-1,B=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(r&7)&p,y=(1<<d)-1,v=p-i-1,E=B&y;if(E<v)r+=d,B=E;else if(r+=d+1,B>y)B-=v;if(h[++l]=--B,B==-1)i+=B,b[--f]=l;else i-=B;if(!B)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var C=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=h[H];if(M<1){x[H]=-M;continue}for(c=0;c<M;++c){b[C]=H;do C=C+U&X;while(C>=f)}}if(C)K(0);for(c=0;c<o;++c){var A=x[b[c]]++,L=S[c]=s-re(A);T[c]=(A<<L)-o}return[r+7>>3,{b:s,s:b,n:S,t:T}]},vt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new de(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],m=c[1];t+=o;var h=f<<3,x=e[t];if(!x)K(0);var T=0,u=0,b=m.b,S=b,d=(++t<<3)-8+re(x);for(;;){if(d-=b,d<h)break;var g=d>>3;if(T+=(e[g]|e[g+1]<<8)>>(d&7)&(1<<b)-1,i[++r]=m.s[T],d-=S,d<h)break;g=d>>3,u+=(e[g]|e[g+1]<<8)>>(d&7)&(1<<S)-1,i[++r]=m.s[u],b=m.n[T],T=m.t[T],S=m.n[u],u=m.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var p=e[++t];i[n]=p>>4,i[n+1]=p&15}++t}var B=0;for(n=0;n<r;++n){var y=i[n];if(y>11)K(0);B+=y&&1<<y-1}var v=re(B)+1,E=1<<v,D=E-B;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var y=i[n];++l[i[n]=y&&v+1-y]}var C=new W(E<<1),U=C.subarray(0,E),X=C.subarray(E);a[v]=0;for(n=v;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<v-n))}if(a[0]!=E)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(U,n,A,a[M]=A+(1<<v-M))}}return[t,{n:X,b:v,s:U}]},Tt=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ct=ue(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Pe=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Pt=Ve(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,f=(r<<3)-8+re(o)-c,m=-1;for(;f>l&&m<s;){var h=f>>3,x=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(f&7);a=(a<<c|x)&i,t[++m]=n.s[a],f-=c=n.n[a]}if(f!=l||m+1!=s)K(0)},Lt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},kt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Ee(e,s,a)}if(i==2){var c=e[s],f=c&3,m=c>>2&3,h=c>>4,x=0,T=0;if(f<2)if(m&1)h|=e[++s]<<4|(m&2&&e[++s]<<12);else h=c>>3;else if(T=m,m<2)h|=(e[++s]&63)<<4,x=e[s]>>6|e[++s]<<2;else if(m==2)h|=e[++s]<<4|(e[++s]&3)<<12,x=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,x=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(f==0)u.set(e.subarray(s,s+=h),b);else if(f==1)ce(u,e[s++],b);else{var S=t.h;if(f==2){var d=vt(e,s);x+=s-(s=d[0]),t.h=S=d[1]}else if(!S)K(0);(T?Lt:le)(e.subarray(s,s+=x),u.subarray(b),S)}var g=e[s++];if(g){if(g==255)g=(e[s++]|e[s++]<<8)+32512;else if(g>127)g=g-128<<8|e[s++];var p=e[s++];if(p&3)K(0);var B=[Ct,Et,Tt];for(var y=2;y>-1;--y){var v=p>>(y<<1)+2&3;if(v==1){var E=new W([0,0,e[s++]]);B[y]={s:E.subarray(2,3),n:E.subarray(0,1),t:new de(E.buffer,0,1),b:0}}else if(v==2)r=ue(e,s,9-(y&1)),s=r[0],B[y]=r[1];else if(v==3){if(!t.t)K(0);B[y]=t.t[y]}}var D=t.t=B,C=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,L=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=U.b)>>3;var k=(e[A]|e[A+1]<<8)>>(M&7)&(1<<U.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++g;--g;){var P=X.s[V],w=X.n[V],O=C.s[N],F=C.n[N],R=U.s[k],z=U.n[k];A=(M-=R)>>3;var j=1<<R,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Pe[O])>>3;var G=Pt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Pe[O])-1);A=(M-=Se[P])>>3;var _=St[P]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[P])-1);if(A=(M-=w)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<w)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,k=U.t[k]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Y=I-(_!=0);if(Y){if(I=Y==3?t.o[0]-1:t.o[Y],Y>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var y=0;y<_;++y)u[L+y]=u[b+y];L+=_,b+=_;var q=L-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var y=0;y<J;++y)u[L+y]=t.w[ee+y];L+=J,G-=J,q=0}for(var y=0;y<G;++y)u[L+y]=u[q+y];L+=G}if(L!=b)while(b<u.length)u[L++]=u[b++];else L=u.length;if(n)t.y+=L;else u=Ee(u,0,L)}else if(n){if(t.y+=h,b)for(var y=0;y<h;++y)u[y]=u[b+y]}else if(b)u=Ee(u,b);return t.b=a,u}K(2)},Bt=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function ye(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Bt(n,o)}async function It(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(ye(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function He(e){return new TextDecoder().decode(await It(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function xe(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Z=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Ft=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Qe=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Rt=new Set(["model","submodel","configuration"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let m=0;m<s;m++)l=l.replace(/^\\S+\\s*/,"");let a=Ut(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=a.findIndex((m,h)=>h>0&&m.toUpperCase()==="GLOSSMAP");if(f>0&&a[f+1])c.glossmap=a[f+1];if(t)c.next=!0;return c}var Ot=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Nt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Le(o),m:i,file:Z(a)}}function Ke(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Le(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Z(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function et(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],f=null,m=()=>{if(!a)return;let d=Ot(a.chunks.join("")),g=d[0]===137&&d[1]===80&&d[2]===78&&d[3]===71;(l??=new Map).set(Z(a.name),{name:a.name,bytes:d,...g?{mime:"image/png"}:{}}),a=null},h=!0,x=(d)=>{if(m(),o={name:Z(d),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,h=!0},T=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},S=(d,g)=>{if(f){d.tex=f,f=null;return}let p=c[c.length-1];if(!p)return;if(p.fallback){if(!g)d.fallback=!0}else d.tex=p.map};for(let d of e.split(`\n`)){let g=d.trim();if(!g)continue;if(r&&g.charCodeAt(0)>=50&&g.charCodeAt(0)<=53&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){if(a||T)continue;if(!o)x(t);let v=g.slice(2).trimStart(),E=v.search(/\\s/),D={t:g.charCodeAt(0)-48,color:Le(E<0?v:v.slice(0,E)),p:[],src:g};S(D,!1),o.cmds.push(D),h=!1;continue}if(g.charCodeAt(0)===48&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){let v=2;while(g.charCodeAt(v)===32||g.charCodeAt(v)===9)v++;let E=v;while(E<g.length&&g.charCodeAt(E)!==32&&g.charCodeAt(E)!==9)E++;let D=g.slice(v,E);if(!Ft.has(D)){if(T||a)continue;if(!o)x(t);let C=g.slice(v),U={t:0,text:C};if(D.charCodeAt(0)===33)U.meta=D;if(f=null,h&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Z(H)}o.cmds.push(U);continue}}if(g.charCodeAt(0)===49&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)&&!a&&!T){let v=Nt(g);if(v){if(!o)x(t);S(v,!1),o.cmds.push(v),h=!1;continue}}let p=g.split(/\\s+/);if(+p[0]===0){let v=g.slice(1).trim();if(p[1]==="FILE"){b(),T=!1,x(v.slice(5));continue}if(p[1]==="NOFILE"){m(),o=null,T=!0;continue}if(p[1]==="!DATA"){b(),m(),o=null,T=!1,a={name:v.slice(5).trim(),chunks:[]};continue}if(T)continue;if(a){if(p[1]==="!:")a.chunks.push(p.slice(2).join(""));continue}if(!o)x(t);let E={t:0,text:v};if(p[1]==="STEP")E.step=!0,c=[],f=null;else if(p[1]==="BFC")E.bfc=p.slice(2).join(" ");else if(p[1]==="ROTSTEP")if(E.meta="ROTSTEP",E.step=!0,c=[],f=null,(p[2]??"").toUpperCase()==="END")E.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(p[5]??"REL").toUpperCase();E.rotstep={x:+p[2]||0,y:+p[3]||0,z:+p[4]||0,mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(p[1]==="BUFEXCHG"){E.meta="BUFEXCHG";let C=(p[2]??"").toUpperCase();E.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:p[3]??"A"}}else if(p[1]?.startsWith("!"))E.meta=p[1];if(h&&!o.org){let C=We(v);if(C)o.org=C}if(p[1]==="!TEXMAP"){let C=(p[2]??"").toUpperCase();if(f=null,C==="START"||C==="NEXT"){let U=zt(v.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(E.texmap={op:C,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),C==="START")c.push({map:U,fallback:!1});else f=U}else if(C==="FALLBACK"){E.texmap={op:C};let U=c[c.length-1];if(U)U.fallback=!0}else if(C==="END")E.texmap={op:C},c.pop()}else if(p[1]==="!:"){f=null;let C=Ke(p.slice(2));if(C)S(C,!0),E.geom=C}else f=null;let D=v.match(_e);if(D&&!o.movedTo){let C=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Z(C)}o.cmds.push(E);continue}if(a||T)continue;if(!o)x(t);let y=Ke(p);if(!y)continue;S(y,!1),o.cmds.push(y),h=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var cn=Math.PI/180;function tt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function nt(e,t){let[n,r,s,o,i,l,a,c,f,m,h,x]=e,[T,u,b,S,d,g,p,B,y,v,E,D]=t;return[o*T+i*u+l*b+n,a*T+c*u+f*b+r,m*T+h*u+x*b+s,o*S+i*p+l*v,o*d+i*B+l*E,o*g+i*y+l*D,a*S+c*p+f*v,a*d+c*B+f*E,a*g+c*y+f*D,m*S+h*p+x*v,m*d+h*B+x*E,m*g+h*y+x*D]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Be(e,t){let n=e.files.get(Z(t));if(!n)return"part";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&$t.test(s.file))?"part":"model";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return Ze.set(e,t),t}var Ye=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Z(e)}#${t}`;function Vt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ie(e.name,t),cmds:n}}function st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function ot(e){let[t,n,r,s,o,i,l,a,c,f,m,h]=e,x=a*h-c*m,T=-(l*h-c*f),u=l*m-a*f,b=s*x+o*T+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let S=1/b,d=[x*S,-(o*h-i*m)*S,(o*c-i*a)*S,T*S,(s*h-i*f)*S,-(s*c-i*l)*S,u*S,-(s*m-o*f)*S,(s*a-o*l)*S];return[-(d[0]*t+d[1]*n+d[2]*r),-(d[3]*t+d[4]*n+d[5]*r),-(d[6]*t+d[7]*n+d[8]*r),...d]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Gt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?" GLOSSMAP "+Je(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Z(e)}\n0 !TEXMAP END\n`;return{name:`${Z(e)}#tex-${Ht(r)}`,source:r}}var _t=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Wt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var qe=new WeakMap;function at(e){let t=qe.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Wt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Kt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(m,h)=>{let x=m.name+"#"+h,T=l.get(x);if(!T){let u;T=Object.assign(()=>u??=st(m,h),{file:m,step:h}),l.set(x,T)}return T},f=(m,h,x,T,u,b,S,d,g=null,p=[],B=[])=>{let y=m.files.get(h);if(!y||S>r)return;let v=0,E=S>0?++a:0,D=i&&E?[...p,E]:p,C=i&&E?[...B,x]:B,U=i&&!g?new Map:null,X=-1,H=0,M=(P,w,O,F,R,z)=>{if(X!==v)X=v,H=0;let j=U?.get(v+"|"+w);if(j)return j.n++,f(P,P===m?w:P.main,O,F,u+"/"+w,[...R,lt],S+1,z,[...R,lt],D,C);let I=[...R,H++],G=n.length;f(P,P===m?w:P.main,O,F,u+"/"+w,I,S+1,z,g,D,C),U?.set(v+"|"+w,{n:1,from:G,to:n.length})},A=at(y),L=s?rt(y):[],V=0,k=(P,w,O,F,R,z,j)=>{if(g)F=g;let I={part:P,color:w,m:O,step:F[0],steps:F,localStep:R,path:u};if(E){if(I.sub=E,i)I.subPath=D,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(P,j);I.texPart=_.name,I.texSource=_.source}let G=A[R];if(G)I.view=G;return n.push(I),I},N=(P)=>{while(V<L.length&&L[V]<=P){let w=L[V++];k(Ie(y.name,w),T,x,[...b,w],w,!1,null).source=c(y,w)}};for(let P of y.cmds){if(P.t===0&&P.step){v++;continue}let w=P;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){N(v);continue}if(w.t===0)if(o&&w.geom?.t===1)w=w.geom;else continue;if(w.t!==1)continue;if(o&&w.fallback)continue;let O=w.color===16?T:w.color,F=nt(x,w.m),R=[...b,v],z=o?w.tex??d:null,j=z?ot(w.m):null,I=z&&j?tt(z,j):null;if(m.files.has(w.file)){if(Be(m,w.file)==="model"){M(m,w.file,F,O,R,I);continue}k(w.file,O,F,R,v,!0,I);continue}let G=t.resolveModel?.(w.file);if(G){M(G,w.file,F,O,R,I);continue}k(w.file,O,F,R,v,!1,I)}if(N(1/0),U){for(let P of U.values())if(P.n>1)for(let w=P.from;w<P.to;w++)n[w].mult??=P.n}};if(Be(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t="main.ldr",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Z(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Z(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Z(t.slice(14).join(" ")):null};function Yt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function ft(e,t,n="main.ldr"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Z(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let f of r.get(a.pop())){let m=Zt(f);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,mt=new WeakMap;function Fe(e,t){let n=mt.get(e);if(!n)mt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,x)=>{l.push(h[0]),a.push(h[1]);for(let T=0;T<12;T++)i[x*12+T]=h[2+T]});let c=null,f=0,m=0;if(s.mask){f=s.mask[0],m=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let x=0;x<h.length;x++)c[x]=h.charCodeAt(x)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:f,nz:m}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var we=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],f=[],m=[],h=new Re(e.length*2),x=[],T=[];for(let M=0;M<e.length;M++){let A=e[M],L=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(L))continue;let k=V.bbox,N=1/0,P=-1/0,w=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?k[3]:k[0],G=j?k[5]:k[2],_=L[0]+L[3]*I+L[5]*G,Y=L[2]+L[9]*I+L[11]*G;if(_<N)N=_;if(_>P)P=_;if(Y<w)w=Y;if(Y>O)O=Y}let F=a.length;s.push(N),o.push(P),i.push(w),l.push(O),a.push(M),c.push(Fe(t,A.part)),f.push(k[0]),m.push(k[2]);let R=Math.round((L[1]+k[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(P/40);z++)for(let j=Math.floor(w/40);j<=Math.floor(O/40);j++){if(!we(R,z,j))continue;let I=T.length;T.push(F),x.push(h.put(R,z,j,I))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],S=NaN,d=NaN,g=NaN,p=-1,B=(M,A,L,V)=>{let k=Math.round(A*2),N=Math.floor(M/40),P=Math.floor(L/40);if(!we(k,N,P))return fe;let w=fe;if(k!==S||N!==d||P!==g)S=k,d=N,g=P,p=h.get(k,N,P);for(let O=p;O>=0;O=x[O]){let F=T[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&L-6>=i[F]-0.5&&L+6<=l[F]+0.5))continue;let R=e[a[F]].m,z=c[F],j=f[F],I=m[F],G=M-R[0],_=A-R[1],Y=L-R[2],q=R[3]*G+R[6]*_+R[9]*Y,J=R[5]*G+R[8]*_+R[11]*Y,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-I)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[F]];if(Q<w)w=Q}}return w},y=0;for(let M of e){let A=Fe(t,M.part);if(A)y+=A.nStuds}let v=new Uint8Array(y),E=new Uint8Array(y),D=new Re(y),C=0,U=n?new Int32Array(y).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let L=e[M],V=Fe(t,L.part);if(!V)continue;let k=L.m,N=V.studM,P=k[0],w=k[1],O=k[2],F=k[3],R=k[4],z=k[5],j=k[6],I=k[7],G=k[8],_=k[9],Y=k[10],q=k[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+R*ae+z*oe)<0.001&&Math.abs(_*se+Y*ae+q*oe)<0.001))continue;E[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=P+F*Q+R*te+z*ne,Ue=w+j*Q+I*te+G*ne,ze=O+_*Q+Y*te+q*ne,Oe=B(De,Ue,ze,M);if(Oe!==fe){if(v[A]=1,C++,U)U[A]=Oe}let me=Math.round(De),he=Math.round(Ue),ge=Math.round(ze);if(!we(me,he,ge))continue;if(!n){D.put(me,he,ge,1);continue}let Ne=n[M],$e=D.get(me,he,ge);if($e<0||Ne<$e)D.put(me,he,ge,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],L=t.parts[A.part];if(!L||!L.under||!pt(A.m))continue;let V=L.bbox,k=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!k||!N||k*N>4096)continue;let P=A.m,w=!0,O=0;for(let F=0;F<k&&w;F++)for(let R=0;R<N;R++){let z=V[0]+10+20*F,j=V[2]+10+20*R,I=P[0]+P[3]*z+P[5]*j,G=P[2]+P[9]*z+P[11]*j,_=Math.round(I),Y=Math.round(P[1]+V[4]),q=Math.round(G),J=we(_,Y,q)?D.get(_,Y,q):-1;if(J<0){w=!1;break}if(J>O)O=J}if(w){if(X[M]=1,H)H[M]=O}}return{nStuds:y,studHidden:v,studUp:E,underHidden:X,studsHidden:C,studHideStep:U,underHideStep:H}}function qt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>ct(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function Ae(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ce="https://ldr-demo.vercel.app/cdn/v1/",ve=new Map,Me=new Map;function gt(e=Ce,t=fetch){let n=ve.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>ve.delete(e)),ve.set(e,n);return n}var Qt=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Te=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Te(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Te(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let x=h.buffer;if(!x)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let T=new DataView(x).getUint32(0,!0),u=new Uint8Array(x,4+T),b=r;n.push(u),r+=u.byteLength;let S=(4-r%4)%4;if(S)n.push(new Uint8Array(S)),r+=S;for(let[d,g]of Object.entries(h.header.parts??{}))if(!(d in s))s[d]=Te(g,b);for(let[d,g]of Object.entries(h.header.studKinds??{}))if(!(d in o))o[d]=Te(g,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+a,!0),f.set(l,4),f.fill(32,4+l.length,c);let m=c;for(let h of n)f.set(h,m),m+=h.byteLength;return xe(f.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Ce,s=t.fetch??fetch;ve.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Ce,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Z))],l=[],a=[];for(let u of i){if(Me.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let f=0,m=0,h=async()=>{while(m<c.length){let u=c[m++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let S=new Uint8Array(await b.arrayBuffer());if(b.status===200)S=S.subarray(u.start,u.end);f+=S.byteLength;for(let d of u.items){let g=ye(S.subarray(d.off-u.start,d.off-u.start+d.len)),p=g.buffer.slice(g.byteOffset,g.byteOffset+g.byteLength);Me.set(n+d.name,xe(p))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let x=i.filter((u)=>Me.has(n+u)).map((u)=>Me.get(n+u));return{pack:x.length?en(x,{colors:o.colors}):xe(nn(o.colors)),missing:l,requests:c.length,bytes:f}}function nn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function rn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function sn(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let a=l.embedded?t.get(l.part):Z(l.part),c=a?n.parts[a]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(a))i.add(a),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class pe extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function dt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Ce,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(p)=>{if(!p.ok)throw Error(`ldr: ${p.status} fetching ${e}`);return He(await p.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let f=ft(o,new Set(a.filter((p)=>p.embedded).map((p)=>p.part)),l),m=(p,B)=>t.maxBodyTris!=null&&p>t.maxBodyTris||t.maxPackBytes!=null&&B>t.maxPackBytes;if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=sn(a,f,await s);if(m(p.known?p.bodyTris:0,p.packBytes))throw new pe({bodyTris:p.bodyTris,packBytes:p.packBytes,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let{pack:h,missing:x,requests:T,bytes:u}=await tn([...a.filter((p)=>!p.embedded).map((p)=>p.part),...f.values()],t),b=new Map([...f].map(([p,B])=>[B,p])),S=x.map((p)=>b.get(p)??p);for(let[p,B]of f){let y=h.header.parts[B];if(y)h.header.parts[p]=y}let d=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=h.buffer?.byteLength??h.bytes??0,B=rn(a,h);if(m(B,p))throw new pe({bodyTris:B,packBytes:p,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let g=t.cull?Ae(a,h.header,t.textures!==!1):void 0;return{insts:a,pack:h,missing:S,requests:T,bytes:u,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:d-c,...g?{cull:performance.now()-d}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await dt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=Ae(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof pe||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
3866
3891
 
3867
- // ../../../../../../../tmp/ldr-build-aOWXed/src/cdn.ts
3892
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/cdn.ts
3868
3893
  var worker;
3869
3894
  var seq = 0;
3870
3895
  var pending = new Map;
@@ -4002,6 +4027,7 @@ export {
4002
4027
  decodePack,
4003
4028
  decompressPack,
4004
4029
  embeddedKeys,
4030
+ estimateBudgetFromIndex,
4005
4031
  fileKind,
4006
4032
  fileStepViews,
4007
4033
  flatten,
@@ -1,2 +1,2 @@
1
- declare const _default: "var dt=ArrayBuffer,W=Uint8Array,ge=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},xt=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var wt=[\"invalid zstd data\",\"window size too large (>2046MB)\",\"invalid block type\",\"FSE accuracy too high\",\"match distance too far back\",\"unexpected EOF\"],K=function(e,t,n){var r=Error(t||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,m=je(e,a,c);a+=c;var p=l?1<<l:s,h=je(e,a,p)+(l==1&&256),d=h;if(!s){var T=1<<10+(e[5]>>3);d=T+(T>>3)*(e[5]&7)}if(d>2145386496)K(1);var u=new W((t==1?h||d:t?0:d)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+p,y:0,l:0,d:m,w:t&&t!=1?t:u.subarray(12),e:d,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return At(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,m=o,p=new dt(512+(o<<2)),h=new yt(p,0,256),d=new ge(p,0,256),T=new ge(p,512,o),u=512+(o<<1),b=new W(p,u,o),E=new W(p,u+o);while(l<255&&i>0){var g=re(i+1),f=r>>3,w=(1<<g+1)-1,U=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(r&7)&w,y=(1<<g)-1,v=w-i-1,S=U&y;if(S<v)r+=g,U=S;else if(r+=g+1,U>y)U-=v;if(h[++l]=--U,U==-1)i+=U,b[--m]=l;else i-=U;if(!U)do{var R=r>>3;a=(e[R]|e[R+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var C=0,D=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=h[H];if(M<1){d[H]=-M;continue}for(c=0;c<M;++c){b[C]=H;do C=C+D&X;while(C>=m)}}if(C)K(0);for(c=0;c<o;++c){var A=d[b[c]]++,P=E[c]=s-re(A);T[c]=(A<<P)-o}return[r+7>>3,{b:s,s:b,n:E,t:T}]},vt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),m=c[0],p=c[1];t+=o;var h=m<<3,d=e[t];if(!d)K(0);var T=0,u=0,b=p.b,E=b,g=(++t<<3)-8+re(d);for(;;){if(g-=b,g<h)break;var f=g>>3;if(T+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<b)-1,i[++r]=p.s[T],g-=E,g<h)break;f=g>>3,u+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<E)-1,i[++r]=p.s[u],b=p.n[T],T=p.t[T],E=p.n[u],u=p.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var U=0;for(n=0;n<r;++n){var y=i[n];if(y>11)K(0);U+=y&&1<<y-1}var v=re(U)+1,S=1<<v,R=S-U;if(R&R-1)K(0);i[r++]=re(R)+1;for(n=0;n<r;++n){var y=i[n];++l[i[n]=y&&v+1-y]}var C=new W(S<<1),D=C.subarray(0,S),X=C.subarray(S);a[v]=0;for(n=v;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<v-n))}if(a[0]!=S)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(D,n,A,a[M]=A+(1<<v-M))}}return[t,{n:X,b:v,s:D}]},Tt=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ct=ue(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Le=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Lt=Ve(Le,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,m=(r<<3)-8+re(o)-c,p=-1;for(;m>l&&p<s;){var h=m>>3,d=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(m&7);a=(a<<c|d)&i,t[++p]=n.s[a],m-=c=n.n[a]}if(m!=l||p+1!=s)K(0)},Pt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},kt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Ee(e,s,a)}if(i==2){var c=e[s],m=c&3,p=c>>2&3,h=c>>4,d=0,T=0;if(m<2)if(p&1)h|=e[++s]<<4|(p&2&&e[++s]<<12);else h=c>>3;else if(T=p,p<2)h|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(p==2)h|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(m==0)u.set(e.subarray(s,s+=h),b);else if(m==1)ce(u,e[s++],b);else{var E=t.h;if(m==2){var g=vt(e,s);d+=s-(s=g[0]),t.h=E=g[1]}else if(!E)K(0);(T?Pt:le)(e.subarray(s,s+=d),u.subarray(b),E)}var f=e[s++];if(f){if(f==255)f=(e[s++]|e[s++]<<8)+32512;else if(f>127)f=f-128<<8|e[s++];var w=e[s++];if(w&3)K(0);var U=[Ct,Et,Tt];for(var y=2;y>-1;--y){var v=w>>(y<<1)+2&3;if(v==1){var S=new W([0,0,e[s++]]);U[y]={s:S.subarray(2,3),n:S.subarray(0,1),t:new ge(S.buffer,0,1),b:0}}else if(v==2)r=ue(e,s,9-(y&1)),s=r[0],U[y]=r[1];else if(v==3){if(!t.t)K(0);U[y]=t.t[y]}}var R=t.t=U,C=R[0],D=R[1],X=R[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,P=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=D.b)>>3;var k=(e[A]|e[A+1]<<8)>>(M&7)&(1<<D.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++f;--f;){var L=X.s[V],x=X.n[V],O=C.s[N],F=C.n[N],B=D.s[k],z=D.n[k];A=(M-=B)>>3;var j=1<<B,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Le[O])>>3;var G=Lt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Le[O])-1);A=(M-=Se[L])>>3;var _=St[L]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[L])-1);if(A=(M-=x)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<x)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,k=D.t[k]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Z=I-(_!=0);if(Z){if(I=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var y=0;y<_;++y)u[P+y]=u[b+y];P+=_,b+=_;var q=P-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var y=0;y<J;++y)u[P+y]=t.w[ee+y];P+=J,G-=J,q=0}for(var y=0;y<G;++y)u[P+y]=u[q+y];P+=G}if(P!=b)while(b<u.length)u[P++]=u[b++];else P=u.length;if(n)t.y+=P;else u=Ee(u,0,P)}else if(n){if(t.y+=h,b)for(var y=0;y<h;++y)u[y]=u[b+y]}else if(b)u=Ee(u,b);return t.b=a,u}K(2)},It=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function de(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(e,r||t);if(typeof i==\"object\"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return It(n,o)}async function Ft(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(de(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream(\"gzip\"))).arrayBuffer();return n(t)}async function He(e){return new TextDecoder().decode(await Ft(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split(\"/\").pop()||\"main.ldr\").replace(/\\.(zst|gz)$/i,\"\")||\"main.ldr\";function ye(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]===\"f32\"?new Float32Array(e,r+o[0],o[1]):o[2]===\"u16\"?new Uint16Array(e,r+o[0],o[1]):o[2]===\"u8\"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,\"/\").replace(/\\/+/g,\"/\");function Pe(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Bt=new Set([\"FILE\",\"NOFILE\",\"!DATA\",\"!:\",\"STEP\",\"BFC\",\"ROTSTEP\",\"BUFEXCHG\",\"!TEXMAP\"]),Qe=new Set([\"part\",\"subpart\",\"primitive\",\"8_primitive\",\"48_primitive\",\"shortcut\",\"helper\"]),Rt=new Set([\"model\",\"submodel\",\"configuration\"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,\"\");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(e){let t=[],n=0;while(n<e.length){while(e[n]===\" \"||e[n]===\"\\t\")n++;if(n>=e.length)break;if(e[n]==='\"'){let r=\"\";n++;while(n<e.length&&e[n]!=='\"'){if(e[n]===\"\\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==\" \"&&e[r]!==\"\\t\")r++;t.push(e.slice(n,r)),n=r}}return t}function zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r===\"PLANAR\"?9:r===\"CYLINDRICAL\"?10:r===\"SPHERICAL\"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let p=0;p<s;p++)l=l.replace(/^\\S+\\s*/,\"\");let a=Ut(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let m=a.findIndex((p,h)=>h>0&&p.toUpperCase()===\"GLOSSMAP\");if(m>0&&a[m+1])c.glossmap=a[m+1];if(t)c.next=!0;return c}var Ot=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,\"\"),n=t+\"=\".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Nt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let m=s();if(m===null)return null;i[c]=+m}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(\" \"):l;return{t:1,color:Pe(o),m:i,file:Y(a)}}function Ke(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Pe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Y(e.slice(14).join(\" \"))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function et(e,t=\"main.ldr\",n={}){let r=!!n.geometryText,s=new Map,o=null,i=\"\",l,a=null,c=[],m=null,p=()=>{if(!a)return;let g=Ot(a.chunks.join(\"\")),f=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Y(a.name),{name:a.name,bytes:g,...f?{mime:\"image/png\"}:{}}),a=null},h=!0,d=(g)=>{if(p(),o={name:Y(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],m=null,h=!0},T=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=\"\"},E=(g,f)=>{if(m){g.tex=m,m=null;return}let w=c[c.length-1];if(!w)return;if(w.fallback){if(!f)g.fallback=!0}else g.tex=w.map};for(let g of e.split(`\n`)){let f=g.trim();if(!f)continue;if(r&&f.charCodeAt(0)>=50&&f.charCodeAt(0)<=53&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){if(a||T)continue;if(!o)d(t);let v=f.slice(2).trimStart(),S=v.search(/\\s/),R={t:f.charCodeAt(0)-48,color:Pe(S<0?v:v.slice(0,S)),p:[],src:f};E(R,!1),o.cmds.push(R),h=!1;continue}if(f.charCodeAt(0)===48&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){let v=2;while(f.charCodeAt(v)===32||f.charCodeAt(v)===9)v++;let S=v;while(S<f.length&&f.charCodeAt(S)!==32&&f.charCodeAt(S)!==9)S++;let R=f.slice(v,S);if(!Bt.has(R)){if(T||a)continue;if(!o)d(t);let C=f.slice(v),D={t:0,text:C};if(R.charCodeAt(0)===33)D.meta=R;if(m=null,h&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,\"/\");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=\".dat\";o.movedTo=Y(H)}o.cmds.push(D);continue}}if(f.charCodeAt(0)===49&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)&&!a&&!T){let v=Nt(f);if(v){if(!o)d(t);E(v,!1),o.cmds.push(v),h=!1;continue}}let w=f.split(/\\s+/);if(+w[0]===0){let v=f.slice(1).trim();if(w[1]===\"FILE\"){b(),T=!1,d(v.slice(5));continue}if(w[1]===\"NOFILE\"){p(),o=null,T=!0;continue}if(w[1]===\"!DATA\"){b(),p(),o=null,T=!1,a={name:v.slice(5).trim(),chunks:[]};continue}if(T)continue;if(a){if(w[1]===\"!:\")a.chunks.push(w.slice(2).join(\"\"));continue}if(!o)d(t);let S={t:0,text:v};if(w[1]===\"STEP\")S.step=!0,c=[],m=null;else if(w[1]===\"BFC\")S.bfc=w.slice(2).join(\" \");else if(w[1]===\"ROTSTEP\")if(S.meta=\"ROTSTEP\",S.step=!0,c=[],m=null,(w[2]??\"\").toUpperCase()===\"END\")S.rotstep={x:0,y:0,z:0,mode:\"END\"};else{let C=(w[5]??\"REL\").toUpperCase();S.rotstep={x:+w[2]||0,y:+w[3]||0,z:+w[4]||0,mode:[\"REL\",\"ABS\",\"ADD\"].includes(C)?C:\"REL\"}}else if(w[1]===\"BUFEXCHG\"){S.meta=\"BUFEXCHG\";let C=(w[2]??\"\").toUpperCase();S.bufexchg={op:C===\"RETRIEVE\"?\"RETRIEVE\":\"STORE\",buf:w[3]??\"A\"}}else if(w[1]?.startsWith(\"!\"))S.meta=w[1];if(h&&!o.org){let C=We(v);if(C)o.org=C}if(w[1]===\"!TEXMAP\"){let C=(w[2]??\"\").toUpperCase();if(m=null,C===\"START\"||C===\"NEXT\"){let D=zt(v.replace(/^!TEXMAP\\s+\\S+/i,\"\"),C===\"NEXT\");if(S.texmap={op:C,...D?{map:D}:{}},D)if((o.texmaps??=[]).push(D),C===\"START\")c.push({map:D,fallback:!1});else m=D}else if(C===\"FALLBACK\"){S.texmap={op:C};let D=c[c.length-1];if(D)D.fallback=!0}else if(C===\"END\")S.texmap={op:C},c.pop()}else if(w[1]===\"!:\"){m=null;let C=Ke(w.slice(2));if(C)E(C,!0),S.geom=C}else m=null;let R=v.match(_e);if(R&&!o.movedTo){let C=R[1].trim().replace(/\\\\/g,\"/\");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=\".dat\";o.movedTo=Y(C)}o.cmds.push(S);continue}if(a||T)continue;if(!o)d(t);let y=Ke(w);if(!y)continue;E(y,!1),o.cmds.push(y),h=!1}return p(),l?{main:i,files:s,data:l}:{main:i,files:s}}var ln=Math.PI/180;function tt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function nt(e,t){let[n,r,s,o,i,l,a,c,m,p,h,d]=e,[T,u,b,E,g,f,w,U,y,v,S,R]=t;return[o*T+i*u+l*b+n,a*T+c*u+m*b+r,p*T+h*u+d*b+s,o*E+i*w+l*v,o*g+i*U+l*S,o*f+i*y+l*R,a*E+c*w+m*v,a*g+c*U+m*S,a*f+c*y+m*R,p*E+h*w+d*v,p*g+h*U+d*S,p*f+h*y+d*R]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Ie(e,t){let n=e.files.get(Y(t));if(!n)return\"part\";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.has(n.org)?\"part\":\"model\";else if(n.name===e.main)r=\"model\";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&$t.test(s.file))?\"part\":\"model\";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return Ze.set(e,t),t}var Ye=(e)=>e>16777215?\"0x\"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?\"0 \"+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(\" \")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(\" \")}`,Fe=(e,t)=>`${Y(e)}#${t}`;function Vt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op===\"NEXT\";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Fe(e.name,t),cmds:n}}function st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,\"0\")}function ot(e){let[t,n,r,s,o,i,l,a,c,m,p,h]=e,d=a*h-c*p,T=-(l*h-c*m),u=l*p-a*m,b=s*d+o*T+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let E=1/b,g=[d*E,-(o*h-i*p)*E,(o*c-i*a)*E,T*E,(s*h-i*m)*E,-(s*c-i*l)*E,u*E,-(s*p-o*m)*E,(s*a-o*l)*E];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>'\"'+e.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,\"\\\\\\\"\")+'\"';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!==\"PLANAR\"?[t.a??360]:[],...t.method===\"SPHERICAL\"?[t.b??180]:[]].map(Gt).join(\" \"),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?\" GLOSSMAP \"+Je(t.glossmap):\"\"}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${Ht(r)}`,source:r}}var _t=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Wt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var qe=new WeakMap;function at(e){let t=qe.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode===\"END\")r=null;else{let i=Wt(o.x,o.y,o.z);r=o.mode===\"ABS\"?{abs:!0,m:i,rotstep:o}:o.mode===\"ADD\"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,\"0\")).join(\".\")+\"~\";function Kt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(p,h)=>{let d=p.name+\"#\"+h,T=l.get(d);if(!T){let u;T=Object.assign(()=>u??=st(p,h),{file:p,step:h}),l.set(d,T)}return T},m=(p,h,d,T,u,b,E,g,f=null,w=[],U=[])=>{let y=p.files.get(h);if(!y||E>r)return;let v=0,S=E>0?++a:0,R=i&&S?[...w,S]:w,C=i&&S?[...U,d]:U,D=i&&!f?new Map:null,X=-1,H=0,M=(L,x,O,F,B,z)=>{if(X!==v)X=v,H=0;let j=D?.get(v+\"|\"+x);if(j)return j.n++,m(L,L===p?x:L.main,O,F,u+\"/\"+x,[...B,lt],E+1,z,[...B,lt],R,C);let I=[...B,H++],G=n.length;m(L,L===p?x:L.main,O,F,u+\"/\"+x,I,E+1,z,f,R,C),D?.set(v+\"|\"+x,{n:1,from:G,to:n.length})},A=at(y),P=s?rt(y):[],V=0,k=(L,x,O,F,B,z,j)=>{if(f)F=f;let I={part:L,color:x,m:O,step:F[0],steps:F,localStep:B,path:u};if(S){if(I.sub=S,i)I.subPath=R,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(L,j);I.texPart=_.name,I.texSource=_.source}let G=A[B];if(G)I.view=G;return n.push(I),I},N=(L)=>{while(V<P.length&&P[V]<=L){let x=P[V++];k(Fe(y.name,x),T,d,[...b,x],x,!1,null).source=c(y,x)}};for(let L of y.cmds){if(L.t===0&&L.step){v++;continue}let x=L;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){N(v);continue}if(x.t===0)if(o&&x.geom?.t===1)x=x.geom;else continue;if(x.t!==1)continue;if(o&&x.fallback)continue;let O=x.color===16?T:x.color,F=nt(d,x.m),B=[...b,v],z=o?x.tex??g:null,j=z?ot(x.m):null,I=z&&j?tt(z,j):null;if(p.files.has(x.file)){if(Ie(p,x.file)===\"model\"){M(p,x.file,F,O,B,I);continue}k(x.file,O,F,B,v,!0,I);continue}let G=t.resolveModel?.(x.file);if(G){M(G,x.file,F,O,B,I);continue}k(x.file,O,F,B,v,!1,I)}if(N(1/0),D){for(let L of D.values())if(L.n>1)for(let x=L.from;x<L.to;x++)n[x].mult??=L.n}};if(Ie(e,e.main)===\"part\"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return m(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t=\"main.ldr\",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Y(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Y(t),r)}let l=o.trim().replace(/\\s+/g,\" \");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith(\"1 \"))return null;let t=e.split(\" \");return t.length>=15?Y(t.slice(14).join(\" \")):null};function Yt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,\"0\")+(n>>>0).toString(16).padStart(8,\"0\")}function ft(e,t,n=\"main.ldr\"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Y(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let m of r.get(a.pop())){let p=Zt(m);if(p&&r.has(p)&&!l.has(p))l.add(p),a.push(p)}let c=[i,...[...l].filter((m)=>m!==i).sort()].map((m)=>\"0 FILE \"+(m===i?\"\":m)+`\n`+r.get(m).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,mt=new WeakMap;function Be(e,t){let n=mt.get(e);if(!n)mt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,d)=>{l.push(h[0]),a.push(h[1]);for(let T=0;T<12;T++)i[d*12+T]=h[2+T]});let c=null,m=0,p=0;if(s.mask){m=s.mask[0],p=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let d=0;d<h.length;d++)c[d]=h.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:m,nz:p}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],m=[],p=[],h=new Re(e.length*2),d=[],T=[];for(let M=0;M<e.length;M++){let A=e[M],P=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(P))continue;let k=V.bbox,N=1/0,L=-1/0,x=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?k[3]:k[0],G=j?k[5]:k[2],_=P[0]+P[3]*I+P[5]*G,Z=P[2]+P[9]*I+P[11]*G;if(_<N)N=_;if(_>L)L=_;if(Z<x)x=Z;if(Z>O)O=Z}let F=a.length;s.push(N),o.push(L),i.push(x),l.push(O),a.push(M),c.push(Be(t,A.part)),m.push(k[0]),p.push(k[2]);let B=Math.round((P[1]+k[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(L/40);z++)for(let j=Math.floor(x/40);j<=Math.floor(O/40);j++){if(!xe(B,z,j))continue;let I=T.length;T.push(F),d.push(h.put(B,z,j,I))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],E=NaN,g=NaN,f=NaN,w=-1,U=(M,A,P,V)=>{let k=Math.round(A*2),N=Math.floor(M/40),L=Math.floor(P/40);if(!xe(k,N,L))return fe;let x=fe;if(k!==E||N!==g||L!==f)E=k,g=N,f=L,w=h.get(k,N,L);for(let O=w;O>=0;O=d[O]){let F=T[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&P-6>=i[F]-0.5&&P+6<=l[F]+0.5))continue;let B=e[a[F]].m,z=c[F],j=m[F],I=p[F],G=M-B[0],_=A-B[1],Z=P-B[2],q=B[3]*G+B[6]*_+B[9]*Z,J=B[5]*G+B[8]*_+B[11]*Z,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-I)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[F]];if(Q<x)x=Q}}return x},y=0;for(let M of e){let A=Be(t,M.part);if(A)y+=A.nStuds}let v=new Uint8Array(y),S=new Uint8Array(y),R=new Re(y),C=0,D=n?new Int32Array(y).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let P=e[M],V=Be(t,P.part);if(!V)continue;let k=P.m,N=V.studM,L=k[0],x=k[1],O=k[2],F=k[3],B=k[4],z=k[5],j=k[6],I=k[7],G=k[8],_=k[9],Z=k[10],q=k[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+B*ae+z*oe)<0.001&&Math.abs(_*se+Z*ae+q*oe)<0.001))continue;S[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=L+F*Q+B*te+z*ne,Ue=x+j*Q+I*te+G*ne,ze=O+_*Q+Z*te+q*ne,Oe=U(De,Ue,ze,M);if(Oe!==fe){if(v[A]=1,C++,D)D[A]=Oe}let pe=Math.round(De),me=Math.round(Ue),he=Math.round(ze);if(!xe(pe,me,he))continue;if(!n){R.put(pe,me,he,1);continue}let Ne=n[M],$e=R.get(pe,me,he);if($e<0||Ne<$e)R.put(pe,me,he,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],P=t.parts[A.part];if(!P||!P.under||!pt(A.m))continue;let V=P.bbox,k=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!k||!N||k*N>4096)continue;let L=A.m,x=!0,O=0;for(let F=0;F<k&&x;F++)for(let B=0;B<N;B++){let z=V[0]+10+20*F,j=V[2]+10+20*B,I=L[0]+L[3]*z+L[5]*j,G=L[2]+L[9]*z+L[11]*j,_=Math.round(I),Z=Math.round(L[1]+V[4]),q=Math.round(G),J=xe(_,Z,q)?R.get(_,Z,q):-1;if(J<0){x=!1;break}if(J>O)O=J}if(x){if(X[M]=1,H)H[M]=O}}return{nStuds:y,studHidden:v,studUp:S,underHidden:X,studsHidden:C,studHideStep:D,underHideStep:H}}function qt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>ct(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function we(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te=\"https://ldr-demo.vercel.app/cdn/v1/\",Me=new Map,Ae=new Map;function gt(e=Te,t=fetch){let n=Me.get(e);if(!n)n=t(e+\"parts.json\").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Me.delete(e)),Me.set(e,n);return n}var Qt=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]===\"number\"&&typeof e[1]===\"number\"&&(e[2]===\"f32\"||e[2]===\"u16\"||e[2]===\"u8\"||e[2]===\"u32\"),ve=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ve(n,t)):e&&typeof e===\"object\"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ve(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let d=h.buffer;if(!d)throw Error(\"ldr: mergePacks needs packs from decodePack/loadPack\");let T=new DataView(d).getUint32(0,!0),u=new Uint8Array(d,4+T),b=r;n.push(u),r+=u.byteLength;let E=(4-r%4)%4;if(E)n.push(new Uint8Array(E)),r+=E;for(let[g,f]of Object.entries(h.header.parts??{}))if(!(g in s))s[g]=ve(f,b);for(let[g,f]of Object.entries(h.header.studKinds??{}))if(!(g in o))o[g]=ve(f,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,m=new Uint8Array(c+r);new DataView(m.buffer).setUint32(0,l.length+a,!0),m.set(l,4),m.fill(32,4+l.length,c);let p=c;for(let h of n)m.set(h,p),p+=h.byteLength;return ye(m.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;Me.delete(r);let o=(i,l)=>s(i,{...l,cache:\"reload\"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Y))],l=[],a=[];for(let u of i){if(Ae.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let m=0,p=0,h=async()=>{while(p<c.length){let u=c[p++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let E=new Uint8Array(await b.arrayBuffer());if(b.status===200)E=E.subarray(u.start,u.end);m+=E.byteLength;for(let g of u.items){let f=de(E.subarray(g.off-u.start,g.off-u.start+g.len)),w=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);Ae.set(n+g.name,ye(w))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let d=i.filter((u)=>Ae.has(n+u)).map((u)=>Ae.get(n+u));return{pack:d.length?en(d,{colors:o.colors}):ye(nn(o.colors)),missing:l,requests:c.length,bytes:m}}function nn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function rn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}class Ce extends Error{code=\"ldr-budget\";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:\"\",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:\"\"].filter(Boolean).join(\", \");super(`ldr: model exceeds device budget: ${t}`);this.name=\"BudgetError\",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function bt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(f)=>{if(!f.ok)throw Error(`ldr: ${f.status} fetching ${e}`);return He(await f.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?\"main.ldr\":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let m=ft(o,new Set(a.filter((f)=>f.embedded).map((f)=>f.part)),l),{pack:p,missing:h,requests:d,bytes:T}=await tn([...a.filter((f)=>!f.embedded).map((f)=>f.part),...m.values()],t),u=new Map([...m].map(([f,w])=>[w,f])),b=h.map((f)=>u.get(f)??f);for(let[f,w]of m){let U=p.header.parts[w];if(U)p.header.parts[f]=U}let E=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let f=p.buffer?.byteLength??p.bytes??0,w=rn(a,p);if(t.maxBodyTris!=null&&w>t.maxBodyTris||t.maxPackBytes!=null&&f>t.maxPackBytes)throw new Ce({bodyTris:w,packBytes:f,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let g=t.cull?we(a,p.header,t.textures!==!1):void 0;return{insts:a,pack:p,missing:b,requests:d,bytes:T,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:E-c,...g?{cull:performance.now()-E}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await bt(n,{...r,cull:!1,onParsed:(m)=>self.postMessage({id:t,insts:m})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=we(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let m of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(m)c.push(m.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof Ce||s?.code===\"ldr-budget\")self.postMessage({id:t,phase:\"error\",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:\"error\",error:String(s?.message??s)})}};\n";
1
+ declare const _default: "var bt=ArrayBuffer,W=Uint8Array,de=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},xt=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var wt=[\"invalid zstd data\",\"window size too large (>2046MB)\",\"invalid block type\",\"FSE accuracy too high\",\"match distance too far back\",\"unexpected EOF\"],K=function(e,t,n){var r=Error(t||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,f=je(e,a,c);a+=c;var m=l?1<<l:s,h=je(e,a,m)+(l==1&&256),x=h;if(!s){var T=1<<10+(e[5]>>3);x=T+(T>>3)*(e[5]&7)}if(x>2145386496)K(1);var u=new W((t==1?h||x:t?0:x)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+m,y:0,l:0,d:f,w:t&&t!=1?t:u.subarray(12),e:x,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,x)}}else if((n>>4|e[3]<<20)==25481893)return At(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,f=o,m=new bt(512+(o<<2)),h=new yt(m,0,256),x=new de(m,0,256),T=new de(m,512,o),u=512+(o<<1),b=new W(m,u,o),S=new W(m,u+o);while(l<255&&i>0){var d=re(i+1),g=r>>3,p=(1<<d+1)-1,B=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(r&7)&p,y=(1<<d)-1,v=p-i-1,E=B&y;if(E<v)r+=d,B=E;else if(r+=d+1,B>y)B-=v;if(h[++l]=--B,B==-1)i+=B,b[--f]=l;else i-=B;if(!B)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var C=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=h[H];if(M<1){x[H]=-M;continue}for(c=0;c<M;++c){b[C]=H;do C=C+U&X;while(C>=f)}}if(C)K(0);for(c=0;c<o;++c){var A=x[b[c]]++,L=S[c]=s-re(A);T[c]=(A<<L)-o}return[r+7>>3,{b:s,s:b,n:S,t:T}]},vt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new de(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],m=c[1];t+=o;var h=f<<3,x=e[t];if(!x)K(0);var T=0,u=0,b=m.b,S=b,d=(++t<<3)-8+re(x);for(;;){if(d-=b,d<h)break;var g=d>>3;if(T+=(e[g]|e[g+1]<<8)>>(d&7)&(1<<b)-1,i[++r]=m.s[T],d-=S,d<h)break;g=d>>3,u+=(e[g]|e[g+1]<<8)>>(d&7)&(1<<S)-1,i[++r]=m.s[u],b=m.n[T],T=m.t[T],S=m.n[u],u=m.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var p=e[++t];i[n]=p>>4,i[n+1]=p&15}++t}var B=0;for(n=0;n<r;++n){var y=i[n];if(y>11)K(0);B+=y&&1<<y-1}var v=re(B)+1,E=1<<v,D=E-B;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var y=i[n];++l[i[n]=y&&v+1-y]}var C=new W(E<<1),U=C.subarray(0,E),X=C.subarray(E);a[v]=0;for(n=v;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<v-n))}if(a[0]!=E)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(U,n,A,a[M]=A+(1<<v-M))}}return[t,{n:X,b:v,s:U}]},Tt=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ct=ue(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Pe=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Pt=Ve(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,f=(r<<3)-8+re(o)-c,m=-1;for(;f>l&&m<s;){var h=f>>3,x=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(f&7);a=(a<<c|x)&i,t[++m]=n.s[a],f-=c=n.n[a]}if(f!=l||m+1!=s)K(0)},Lt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},kt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Ee(e,s,a)}if(i==2){var c=e[s],f=c&3,m=c>>2&3,h=c>>4,x=0,T=0;if(f<2)if(m&1)h|=e[++s]<<4|(m&2&&e[++s]<<12);else h=c>>3;else if(T=m,m<2)h|=(e[++s]&63)<<4,x=e[s]>>6|e[++s]<<2;else if(m==2)h|=e[++s]<<4|(e[++s]&3)<<12,x=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,x=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(f==0)u.set(e.subarray(s,s+=h),b);else if(f==1)ce(u,e[s++],b);else{var S=t.h;if(f==2){var d=vt(e,s);x+=s-(s=d[0]),t.h=S=d[1]}else if(!S)K(0);(T?Lt:le)(e.subarray(s,s+=x),u.subarray(b),S)}var g=e[s++];if(g){if(g==255)g=(e[s++]|e[s++]<<8)+32512;else if(g>127)g=g-128<<8|e[s++];var p=e[s++];if(p&3)K(0);var B=[Ct,Et,Tt];for(var y=2;y>-1;--y){var v=p>>(y<<1)+2&3;if(v==1){var E=new W([0,0,e[s++]]);B[y]={s:E.subarray(2,3),n:E.subarray(0,1),t:new de(E.buffer,0,1),b:0}}else if(v==2)r=ue(e,s,9-(y&1)),s=r[0],B[y]=r[1];else if(v==3){if(!t.t)K(0);B[y]=t.t[y]}}var D=t.t=B,C=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,L=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=U.b)>>3;var k=(e[A]|e[A+1]<<8)>>(M&7)&(1<<U.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++g;--g;){var P=X.s[V],w=X.n[V],O=C.s[N],F=C.n[N],R=U.s[k],z=U.n[k];A=(M-=R)>>3;var j=1<<R,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Pe[O])>>3;var G=Pt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Pe[O])-1);A=(M-=Se[P])>>3;var _=St[P]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[P])-1);if(A=(M-=w)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<w)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,k=U.t[k]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Y=I-(_!=0);if(Y){if(I=Y==3?t.o[0]-1:t.o[Y],Y>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var y=0;y<_;++y)u[L+y]=u[b+y];L+=_,b+=_;var q=L-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var y=0;y<J;++y)u[L+y]=t.w[ee+y];L+=J,G-=J,q=0}for(var y=0;y<G;++y)u[L+y]=u[q+y];L+=G}if(L!=b)while(b<u.length)u[L++]=u[b++];else L=u.length;if(n)t.y+=L;else u=Ee(u,0,L)}else if(n){if(t.y+=h,b)for(var y=0;y<h;++y)u[y]=u[b+y]}else if(b)u=Ee(u,b);return t.b=a,u}K(2)},Bt=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function ye(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(e,r||t);if(typeof i==\"object\"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Bt(n,o)}async function It(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(ye(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream(\"gzip\"))).arrayBuffer();return n(t)}async function He(e){return new TextDecoder().decode(await It(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split(\"/\").pop()||\"main.ldr\").replace(/\\.(zst|gz)$/i,\"\")||\"main.ldr\";function xe(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]===\"f32\"?new Float32Array(e,r+o[0],o[1]):o[2]===\"u16\"?new Uint16Array(e,r+o[0],o[1]):o[2]===\"u8\"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Z=(e)=>e.trim().toLowerCase().replace(/\\\\/g,\"/\").replace(/\\/+/g,\"/\");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Ft=new Set([\"FILE\",\"NOFILE\",\"!DATA\",\"!:\",\"STEP\",\"BFC\",\"ROTSTEP\",\"BUFEXCHG\",\"!TEXMAP\"]),Qe=new Set([\"part\",\"subpart\",\"primitive\",\"8_primitive\",\"48_primitive\",\"shortcut\",\"helper\"]),Rt=new Set([\"model\",\"submodel\",\"configuration\"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,\"\");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(e){let t=[],n=0;while(n<e.length){while(e[n]===\" \"||e[n]===\"\\t\")n++;if(n>=e.length)break;if(e[n]==='\"'){let r=\"\";n++;while(n<e.length&&e[n]!=='\"'){if(e[n]===\"\\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==\" \"&&e[r]!==\"\\t\")r++;t.push(e.slice(n,r)),n=r}}return t}function zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r===\"PLANAR\"?9:r===\"CYLINDRICAL\"?10:r===\"SPHERICAL\"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let m=0;m<s;m++)l=l.replace(/^\\S+\\s*/,\"\");let a=Ut(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=a.findIndex((m,h)=>h>0&&m.toUpperCase()===\"GLOSSMAP\");if(f>0&&a[f+1])c.glossmap=a[f+1];if(t)c.next=!0;return c}var Ot=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,\"\"),n=t+\"=\".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Nt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(\" \"):l;return{t:1,color:Le(o),m:i,file:Z(a)}}function Ke(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Le(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Z(e.slice(14).join(\" \"))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function et(e,t=\"main.ldr\",n={}){let r=!!n.geometryText,s=new Map,o=null,i=\"\",l,a=null,c=[],f=null,m=()=>{if(!a)return;let d=Ot(a.chunks.join(\"\")),g=d[0]===137&&d[1]===80&&d[2]===78&&d[3]===71;(l??=new Map).set(Z(a.name),{name:a.name,bytes:d,...g?{mime:\"image/png\"}:{}}),a=null},h=!0,x=(d)=>{if(m(),o={name:Z(d),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,h=!0},T=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=\"\"},S=(d,g)=>{if(f){d.tex=f,f=null;return}let p=c[c.length-1];if(!p)return;if(p.fallback){if(!g)d.fallback=!0}else d.tex=p.map};for(let d of e.split(`\n`)){let g=d.trim();if(!g)continue;if(r&&g.charCodeAt(0)>=50&&g.charCodeAt(0)<=53&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){if(a||T)continue;if(!o)x(t);let v=g.slice(2).trimStart(),E=v.search(/\\s/),D={t:g.charCodeAt(0)-48,color:Le(E<0?v:v.slice(0,E)),p:[],src:g};S(D,!1),o.cmds.push(D),h=!1;continue}if(g.charCodeAt(0)===48&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){let v=2;while(g.charCodeAt(v)===32||g.charCodeAt(v)===9)v++;let E=v;while(E<g.length&&g.charCodeAt(E)!==32&&g.charCodeAt(E)!==9)E++;let D=g.slice(v,E);if(!Ft.has(D)){if(T||a)continue;if(!o)x(t);let C=g.slice(v),U={t:0,text:C};if(D.charCodeAt(0)===33)U.meta=D;if(f=null,h&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,\"/\");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=\".dat\";o.movedTo=Z(H)}o.cmds.push(U);continue}}if(g.charCodeAt(0)===49&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)&&!a&&!T){let v=Nt(g);if(v){if(!o)x(t);S(v,!1),o.cmds.push(v),h=!1;continue}}let p=g.split(/\\s+/);if(+p[0]===0){let v=g.slice(1).trim();if(p[1]===\"FILE\"){b(),T=!1,x(v.slice(5));continue}if(p[1]===\"NOFILE\"){m(),o=null,T=!0;continue}if(p[1]===\"!DATA\"){b(),m(),o=null,T=!1,a={name:v.slice(5).trim(),chunks:[]};continue}if(T)continue;if(a){if(p[1]===\"!:\")a.chunks.push(p.slice(2).join(\"\"));continue}if(!o)x(t);let E={t:0,text:v};if(p[1]===\"STEP\")E.step=!0,c=[],f=null;else if(p[1]===\"BFC\")E.bfc=p.slice(2).join(\" \");else if(p[1]===\"ROTSTEP\")if(E.meta=\"ROTSTEP\",E.step=!0,c=[],f=null,(p[2]??\"\").toUpperCase()===\"END\")E.rotstep={x:0,y:0,z:0,mode:\"END\"};else{let C=(p[5]??\"REL\").toUpperCase();E.rotstep={x:+p[2]||0,y:+p[3]||0,z:+p[4]||0,mode:[\"REL\",\"ABS\",\"ADD\"].includes(C)?C:\"REL\"}}else if(p[1]===\"BUFEXCHG\"){E.meta=\"BUFEXCHG\";let C=(p[2]??\"\").toUpperCase();E.bufexchg={op:C===\"RETRIEVE\"?\"RETRIEVE\":\"STORE\",buf:p[3]??\"A\"}}else if(p[1]?.startsWith(\"!\"))E.meta=p[1];if(h&&!o.org){let C=We(v);if(C)o.org=C}if(p[1]===\"!TEXMAP\"){let C=(p[2]??\"\").toUpperCase();if(f=null,C===\"START\"||C===\"NEXT\"){let U=zt(v.replace(/^!TEXMAP\\s+\\S+/i,\"\"),C===\"NEXT\");if(E.texmap={op:C,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),C===\"START\")c.push({map:U,fallback:!1});else f=U}else if(C===\"FALLBACK\"){E.texmap={op:C};let U=c[c.length-1];if(U)U.fallback=!0}else if(C===\"END\")E.texmap={op:C},c.pop()}else if(p[1]===\"!:\"){f=null;let C=Ke(p.slice(2));if(C)S(C,!0),E.geom=C}else f=null;let D=v.match(_e);if(D&&!o.movedTo){let C=D[1].trim().replace(/\\\\/g,\"/\");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=\".dat\";o.movedTo=Z(C)}o.cmds.push(E);continue}if(a||T)continue;if(!o)x(t);let y=Ke(p);if(!y)continue;S(y,!1),o.cmds.push(y),h=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var cn=Math.PI/180;function tt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function nt(e,t){let[n,r,s,o,i,l,a,c,f,m,h,x]=e,[T,u,b,S,d,g,p,B,y,v,E,D]=t;return[o*T+i*u+l*b+n,a*T+c*u+f*b+r,m*T+h*u+x*b+s,o*S+i*p+l*v,o*d+i*B+l*E,o*g+i*y+l*D,a*S+c*p+f*v,a*d+c*B+f*E,a*g+c*y+f*D,m*S+h*p+x*v,m*d+h*B+x*E,m*g+h*y+x*D]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Be(e,t){let n=e.files.get(Z(t));if(!n)return\"part\";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.has(n.org)?\"part\":\"model\";else if(n.name===e.main)r=\"model\";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&$t.test(s.file))?\"part\":\"model\";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return Ze.set(e,t),t}var Ye=(e)=>e>16777215?\"0x\"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?\"0 \"+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(\" \")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(\" \")}`,Ie=(e,t)=>`${Z(e)}#${t}`;function Vt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op===\"NEXT\";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ie(e.name,t),cmds:n}}function st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,\"0\")}function ot(e){let[t,n,r,s,o,i,l,a,c,f,m,h]=e,x=a*h-c*m,T=-(l*h-c*f),u=l*m-a*f,b=s*x+o*T+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let S=1/b,d=[x*S,-(o*h-i*m)*S,(o*c-i*a)*S,T*S,(s*h-i*f)*S,-(s*c-i*l)*S,u*S,-(s*m-o*f)*S,(s*a-o*l)*S];return[-(d[0]*t+d[1]*n+d[2]*r),-(d[3]*t+d[4]*n+d[5]*r),-(d[6]*t+d[7]*n+d[8]*r),...d]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>'\"'+e.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,\"\\\\\\\"\")+'\"';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!==\"PLANAR\"?[t.a??360]:[],...t.method===\"SPHERICAL\"?[t.b??180]:[]].map(Gt).join(\" \"),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?\" GLOSSMAP \"+Je(t.glossmap):\"\"}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Z(e)}\n0 !TEXMAP END\n`;return{name:`${Z(e)}#tex-${Ht(r)}`,source:r}}var _t=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Wt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var qe=new WeakMap;function at(e){let t=qe.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode===\"END\")r=null;else{let i=Wt(o.x,o.y,o.z);r=o.mode===\"ABS\"?{abs:!0,m:i,rotstep:o}:o.mode===\"ADD\"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,\"0\")).join(\".\")+\"~\";function Kt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(m,h)=>{let x=m.name+\"#\"+h,T=l.get(x);if(!T){let u;T=Object.assign(()=>u??=st(m,h),{file:m,step:h}),l.set(x,T)}return T},f=(m,h,x,T,u,b,S,d,g=null,p=[],B=[])=>{let y=m.files.get(h);if(!y||S>r)return;let v=0,E=S>0?++a:0,D=i&&E?[...p,E]:p,C=i&&E?[...B,x]:B,U=i&&!g?new Map:null,X=-1,H=0,M=(P,w,O,F,R,z)=>{if(X!==v)X=v,H=0;let j=U?.get(v+\"|\"+w);if(j)return j.n++,f(P,P===m?w:P.main,O,F,u+\"/\"+w,[...R,lt],S+1,z,[...R,lt],D,C);let I=[...R,H++],G=n.length;f(P,P===m?w:P.main,O,F,u+\"/\"+w,I,S+1,z,g,D,C),U?.set(v+\"|\"+w,{n:1,from:G,to:n.length})},A=at(y),L=s?rt(y):[],V=0,k=(P,w,O,F,R,z,j)=>{if(g)F=g;let I={part:P,color:w,m:O,step:F[0],steps:F,localStep:R,path:u};if(E){if(I.sub=E,i)I.subPath=D,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(P,j);I.texPart=_.name,I.texSource=_.source}let G=A[R];if(G)I.view=G;return n.push(I),I},N=(P)=>{while(V<L.length&&L[V]<=P){let w=L[V++];k(Ie(y.name,w),T,x,[...b,w],w,!1,null).source=c(y,w)}};for(let P of y.cmds){if(P.t===0&&P.step){v++;continue}let w=P;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){N(v);continue}if(w.t===0)if(o&&w.geom?.t===1)w=w.geom;else continue;if(w.t!==1)continue;if(o&&w.fallback)continue;let O=w.color===16?T:w.color,F=nt(x,w.m),R=[...b,v],z=o?w.tex??d:null,j=z?ot(w.m):null,I=z&&j?tt(z,j):null;if(m.files.has(w.file)){if(Be(m,w.file)===\"model\"){M(m,w.file,F,O,R,I);continue}k(w.file,O,F,R,v,!0,I);continue}let G=t.resolveModel?.(w.file);if(G){M(G,w.file,F,O,R,I);continue}k(w.file,O,F,R,v,!1,I)}if(N(1/0),U){for(let P of U.values())if(P.n>1)for(let w=P.from;w<P.to;w++)n[w].mult??=P.n}};if(Be(e,e.main)===\"part\"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t=\"main.ldr\",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Z(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Z(t),r)}let l=o.trim().replace(/\\s+/g,\" \");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith(\"1 \"))return null;let t=e.split(\" \");return t.length>=15?Z(t.slice(14).join(\" \")):null};function Yt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,\"0\")+(n>>>0).toString(16).padStart(8,\"0\")}function ft(e,t,n=\"main.ldr\"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Z(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let f of r.get(a.pop())){let m=Zt(f);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>\"0 FILE \"+(f===i?\"\":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,mt=new WeakMap;function Fe(e,t){let n=mt.get(e);if(!n)mt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,x)=>{l.push(h[0]),a.push(h[1]);for(let T=0;T<12;T++)i[x*12+T]=h[2+T]});let c=null,f=0,m=0;if(s.mask){f=s.mask[0],m=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let x=0;x<h.length;x++)c[x]=h.charCodeAt(x)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:f,nz:m}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var we=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],f=[],m=[],h=new Re(e.length*2),x=[],T=[];for(let M=0;M<e.length;M++){let A=e[M],L=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(L))continue;let k=V.bbox,N=1/0,P=-1/0,w=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?k[3]:k[0],G=j?k[5]:k[2],_=L[0]+L[3]*I+L[5]*G,Y=L[2]+L[9]*I+L[11]*G;if(_<N)N=_;if(_>P)P=_;if(Y<w)w=Y;if(Y>O)O=Y}let F=a.length;s.push(N),o.push(P),i.push(w),l.push(O),a.push(M),c.push(Fe(t,A.part)),f.push(k[0]),m.push(k[2]);let R=Math.round((L[1]+k[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(P/40);z++)for(let j=Math.floor(w/40);j<=Math.floor(O/40);j++){if(!we(R,z,j))continue;let I=T.length;T.push(F),x.push(h.put(R,z,j,I))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],S=NaN,d=NaN,g=NaN,p=-1,B=(M,A,L,V)=>{let k=Math.round(A*2),N=Math.floor(M/40),P=Math.floor(L/40);if(!we(k,N,P))return fe;let w=fe;if(k!==S||N!==d||P!==g)S=k,d=N,g=P,p=h.get(k,N,P);for(let O=p;O>=0;O=x[O]){let F=T[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&L-6>=i[F]-0.5&&L+6<=l[F]+0.5))continue;let R=e[a[F]].m,z=c[F],j=f[F],I=m[F],G=M-R[0],_=A-R[1],Y=L-R[2],q=R[3]*G+R[6]*_+R[9]*Y,J=R[5]*G+R[8]*_+R[11]*Y,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-I)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[F]];if(Q<w)w=Q}}return w},y=0;for(let M of e){let A=Fe(t,M.part);if(A)y+=A.nStuds}let v=new Uint8Array(y),E=new Uint8Array(y),D=new Re(y),C=0,U=n?new Int32Array(y).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let L=e[M],V=Fe(t,L.part);if(!V)continue;let k=L.m,N=V.studM,P=k[0],w=k[1],O=k[2],F=k[3],R=k[4],z=k[5],j=k[6],I=k[7],G=k[8],_=k[9],Y=k[10],q=k[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+R*ae+z*oe)<0.001&&Math.abs(_*se+Y*ae+q*oe)<0.001))continue;E[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=P+F*Q+R*te+z*ne,Ue=w+j*Q+I*te+G*ne,ze=O+_*Q+Y*te+q*ne,Oe=B(De,Ue,ze,M);if(Oe!==fe){if(v[A]=1,C++,U)U[A]=Oe}let me=Math.round(De),he=Math.round(Ue),ge=Math.round(ze);if(!we(me,he,ge))continue;if(!n){D.put(me,he,ge,1);continue}let Ne=n[M],$e=D.get(me,he,ge);if($e<0||Ne<$e)D.put(me,he,ge,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],L=t.parts[A.part];if(!L||!L.under||!pt(A.m))continue;let V=L.bbox,k=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!k||!N||k*N>4096)continue;let P=A.m,w=!0,O=0;for(let F=0;F<k&&w;F++)for(let R=0;R<N;R++){let z=V[0]+10+20*F,j=V[2]+10+20*R,I=P[0]+P[3]*z+P[5]*j,G=P[2]+P[9]*z+P[11]*j,_=Math.round(I),Y=Math.round(P[1]+V[4]),q=Math.round(G),J=we(_,Y,q)?D.get(_,Y,q):-1;if(J<0){w=!1;break}if(J>O)O=J}if(w){if(X[M]=1,H)H[M]=O}}return{nStuds:y,studHidden:v,studUp:E,underHidden:X,studsHidden:C,studHideStep:U,underHideStep:H}}function qt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>ct(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function Ae(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ce=\"https://ldr-demo.vercel.app/cdn/v1/\",ve=new Map,Me=new Map;function gt(e=Ce,t=fetch){let n=ve.get(e);if(!n)n=t(e+\"parts.json\").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>ve.delete(e)),ve.set(e,n);return n}var Qt=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]===\"number\"&&typeof e[1]===\"number\"&&(e[2]===\"f32\"||e[2]===\"u16\"||e[2]===\"u8\"||e[2]===\"u32\"),Te=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Te(n,t)):e&&typeof e===\"object\"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Te(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let x=h.buffer;if(!x)throw Error(\"ldr: mergePacks needs packs from decodePack/loadPack\");let T=new DataView(x).getUint32(0,!0),u=new Uint8Array(x,4+T),b=r;n.push(u),r+=u.byteLength;let S=(4-r%4)%4;if(S)n.push(new Uint8Array(S)),r+=S;for(let[d,g]of Object.entries(h.header.parts??{}))if(!(d in s))s[d]=Te(g,b);for(let[d,g]of Object.entries(h.header.studKinds??{}))if(!(d in o))o[d]=Te(g,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+a,!0),f.set(l,4),f.fill(32,4+l.length,c);let m=c;for(let h of n)f.set(h,m),m+=h.byteLength;return xe(f.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Ce,s=t.fetch??fetch;ve.delete(r);let o=(i,l)=>s(i,{...l,cache:\"reload\"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Ce,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Z))],l=[],a=[];for(let u of i){if(Me.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let f=0,m=0,h=async()=>{while(m<c.length){let u=c[m++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let S=new Uint8Array(await b.arrayBuffer());if(b.status===200)S=S.subarray(u.start,u.end);f+=S.byteLength;for(let d of u.items){let g=ye(S.subarray(d.off-u.start,d.off-u.start+d.len)),p=g.buffer.slice(g.byteOffset,g.byteOffset+g.byteLength);Me.set(n+d.name,xe(p))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let x=i.filter((u)=>Me.has(n+u)).map((u)=>Me.get(n+u));return{pack:x.length?en(x,{colors:o.colors}):xe(nn(o.colors)),missing:l,requests:c.length,bytes:f}}function nn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function rn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function sn(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let a=l.embedded?t.get(l.part):Z(l.part),c=a?n.parts[a]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(a))i.add(a),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class pe extends Error{code=\"ldr-budget\";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:\"\",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:\"\"].filter(Boolean).join(\", \");super(`ldr: model exceeds device budget: ${t}`);this.name=\"BudgetError\",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function dt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Ce,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(p)=>{if(!p.ok)throw Error(`ldr: ${p.status} fetching ${e}`);return He(await p.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?\"main.ldr\":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let f=ft(o,new Set(a.filter((p)=>p.embedded).map((p)=>p.part)),l),m=(p,B)=>t.maxBodyTris!=null&&p>t.maxBodyTris||t.maxPackBytes!=null&&B>t.maxPackBytes;if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=sn(a,f,await s);if(m(p.known?p.bodyTris:0,p.packBytes))throw new pe({bodyTris:p.bodyTris,packBytes:p.packBytes,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let{pack:h,missing:x,requests:T,bytes:u}=await tn([...a.filter((p)=>!p.embedded).map((p)=>p.part),...f.values()],t),b=new Map([...f].map(([p,B])=>[B,p])),S=x.map((p)=>b.get(p)??p);for(let[p,B]of f){let y=h.header.parts[B];if(y)h.header.parts[p]=y}let d=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=h.buffer?.byteLength??h.bytes??0,B=rn(a,h);if(m(B,p))throw new pe({bodyTris:B,packBytes:p,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let g=t.cull?Ae(a,h.header,t.textures!==!1):void 0;return{insts:a,pack:h,missing:S,requests:T,bytes:u,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:d-c,...g?{cull:performance.now()-d}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await dt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=Ae(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof pe||s?.code===\"ldr-budget\")self.postMessage({id:t,phase:\"error\",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:\"error\",error:String(s?.message??s)})}};\n";
2
2
  export default _default;
@@ -12,7 +12,7 @@ export interface BuildPackOptions {
12
12
  allParts?: boolean;
13
13
  /** Stud geometry: 'low' uses p/8 low-res primitives (default, ~visually lossless at distance); 'full' keeps full detail. */
14
14
  studs?: "low" | "full";
15
- /** Non-stud primitive detail. Default 'full'. */
15
+ /** Non-stud primitive detail: 'low' uses p/8 (default, matches studs; ~25% fewer body tris on Technic). 'full' keeps hi-res / 48 primitives. */
16
16
  primitives?: "low" | "full";
17
17
  /** Weld + index vertices (smaller GPU buffers, faster). Default true. */
18
18
  weld?: boolean;
@@ -1,4 +1,4 @@
1
- // ../../../../../../../tmp/ldr-build-aOWXed/src/spec.ts
1
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/spec.ts
2
2
  var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
3
3
  function parseColor(tok) {
4
4
  if (/^0x/i.test(tok))
@@ -690,7 +690,7 @@ function fileStepViews(f) {
690
690
  viewMemo.set(f, out);
691
691
  return out;
692
692
  }
693
- // ../../../../../../../tmp/ldr-build-aOWXed/src/model.ts
693
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/model.ts
694
694
  var CALLOUT_END = 999999;
695
695
  var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
696
696
  function flatten(doc, opts = {}) {
@@ -1039,7 +1039,7 @@ function parseLDConfig(text) {
1039
1039
  }
1040
1040
  return out;
1041
1041
  }
1042
- // ../../../../../../../tmp/ldr-build-aOWXed/src/instructions.ts
1042
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/instructions.ts
1043
1043
  var MIN_VIS = 0.5;
1044
1044
  var REORIENT = 0.35;
1045
1045
  var deg = Math.PI / 180;
@@ -1407,10 +1407,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
1407
1407
  }
1408
1408
  };
1409
1409
  }
1410
- // ../../../../../../../tmp/ldr-build-aOWXed/src/render.ts
1410
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/render.ts
1411
1411
  import * as THREE from "three";
1412
1412
 
1413
- // ../../../../../../../tmp/ldr-build-aOWXed/src/pack-io.ts
1413
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/pack-io.ts
1414
1414
  import { decompress } from "fzstd";
1415
1415
  async function decompressPack(data) {
1416
1416
  const u = data instanceof Uint8Array ? data : new Uint8Array(data);
@@ -1433,7 +1433,7 @@ function decodePack(buf) {
1433
1433
  return { header, arr, bytes: buf.byteLength, buffer: buf };
1434
1434
  }
1435
1435
 
1436
- // ../../../../../../../tmp/ldr-build-aOWXed/src/cull.ts
1436
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/cull.ts
1437
1437
  var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
1438
1438
  var prepCache = new WeakMap;
1439
1439
  function prepPart(H, part) {
@@ -1750,7 +1750,7 @@ function precomputeCull(instances, H, useTex = true) {
1750
1750
  return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
1751
1751
  }
1752
1752
 
1753
- // ../../../../../../../tmp/ldr-build-aOWXed/src/render.ts
1753
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/render.ts
1754
1754
  async function loadPack(url) {
1755
1755
  const res = await fetch(url);
1756
1756
  if (!res.ok)
@@ -3372,7 +3372,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
3372
3372
  await new Promise((r) => setTimeout(r, 0));
3373
3373
  }
3374
3374
  }
3375
- // ../../../../../../../tmp/ldr-build-aOWXed/src/scene.ts
3375
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/scene.ts
3376
3376
  import * as THREE2 from "three";
3377
3377
  function colorFn(src, pack, fallback) {
3378
3378
  const table = new Map;
@@ -3589,10 +3589,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
3589
3589
  return finish();
3590
3590
  })();
3591
3591
  }
3592
- // ../../../../../../../tmp/ldr-build-aOWXed/src/parts-cdn.ts
3592
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/parts-cdn.ts
3593
3593
  import { decompress as decompress2 } from "fzstd";
3594
3594
 
3595
- // ../../../../../../../tmp/ldr-build-aOWXed/src/embedded.ts
3595
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/embedded.ts
3596
3596
  function splitFiles(text, fallback) {
3597
3597
  const files = new Map;
3598
3598
  let cur = null, saw = false;
@@ -3664,7 +3664,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
3664
3664
  return out;
3665
3665
  }
3666
3666
 
3667
- // ../../../../../../../tmp/ldr-build-aOWXed/src/parts-cdn.ts
3667
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/parts-cdn.ts
3668
3668
  var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
3669
3669
  var indexCache = new Map;
3670
3670
  var shardCache = new Map;
@@ -3807,6 +3807,25 @@ function bodyTriangles(insts, pack) {
3807
3807
  }
3808
3808
  return n;
3809
3809
  }
3810
+ function estimateBudgetFromIndex(insts, emb, idx) {
3811
+ let bodyTris = 0, packBytes = 0, known = false;
3812
+ const seen = new Set;
3813
+ for (const i of insts) {
3814
+ const k = i.embedded ? emb.get(i.part) : norm(i.part);
3815
+ const e = k ? idx.parts[k] : undefined;
3816
+ if (!e)
3817
+ continue;
3818
+ if (e[3] != null) {
3819
+ known = true;
3820
+ bodyTris += e[3];
3821
+ }
3822
+ if (!seen.has(k)) {
3823
+ seen.add(k);
3824
+ packBytes += e[1];
3825
+ }
3826
+ }
3827
+ return { bodyTris, packBytes, known };
3828
+ }
3810
3829
 
3811
3830
  class BudgetError extends Error {
3812
3831
  code = "ldr-budget";
@@ -3844,6 +3863,12 @@ async function prepareModel(source, o = {}) {
3844
3863
  o.onParsed?.(insts);
3845
3864
  await idxP;
3846
3865
  const emb = embeddedKeys(text, new Set(insts.filter((i) => i.embedded).map((i) => i.part)), name);
3866
+ const over = (t, b) => o.maxBodyTris != null && t > o.maxBodyTris || o.maxPackBytes != null && b > o.maxPackBytes;
3867
+ if (o.maxBodyTris != null || o.maxPackBytes != null) {
3868
+ const est = estimateBudgetFromIndex(insts, emb, await idxP);
3869
+ if (over(est.known ? est.bodyTris : 0, est.packBytes))
3870
+ throw new BudgetError({ bodyTris: est.bodyTris, packBytes: est.packBytes, maxBodyTris: o.maxBodyTris, maxPackBytes: o.maxPackBytes });
3871
+ }
3847
3872
  const { pack, missing: miss, requests, bytes } = await loadParts([...insts.filter((i) => !i.embedded).map((i) => i.part), ...emb.values()], o);
3848
3873
  const back = new Map([...emb].map(([n, k]) => [k, n])), missing = miss.map((m) => back.get(m) ?? m);
3849
3874
  for (const [n, k] of emb) {
@@ -3855,17 +3880,17 @@ async function prepareModel(source, o = {}) {
3855
3880
  if (o.maxBodyTris != null || o.maxPackBytes != null) {
3856
3881
  const packBytes = pack.buffer?.byteLength ?? pack.bytes ?? 0;
3857
3882
  const bodyTris = bodyTriangles(insts, pack);
3858
- if (o.maxBodyTris != null && bodyTris > o.maxBodyTris || o.maxPackBytes != null && packBytes > o.maxPackBytes)
3883
+ if (over(bodyTris, packBytes))
3859
3884
  throw new BudgetError({ bodyTris, packBytes, maxBodyTris: o.maxBodyTris, maxPackBytes: o.maxPackBytes });
3860
3885
  }
3861
3886
  const cull = o.cull ? precomputeCull(insts, pack.header, o.textures !== false) : undefined;
3862
3887
  return { insts, pack, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
3863
3888
  }
3864
3889
 
3865
- // ../../../../../../../tmp/ldr-build-aOWXed/src/load-worker.gen.ts
3866
- var load_worker_gen_default = 'var dt=ArrayBuffer,W=Uint8Array,ge=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},xt=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var wt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],K=function(e,t,n){var r=Error(t||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,m=je(e,a,c);a+=c;var p=l?1<<l:s,h=je(e,a,p)+(l==1&&256),d=h;if(!s){var T=1<<10+(e[5]>>3);d=T+(T>>3)*(e[5]&7)}if(d>2145386496)K(1);var u=new W((t==1?h||d:t?0:d)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+p,y:0,l:0,d:m,w:t&&t!=1?t:u.subarray(12),e:d,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return At(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,m=o,p=new dt(512+(o<<2)),h=new yt(p,0,256),d=new ge(p,0,256),T=new ge(p,512,o),u=512+(o<<1),b=new W(p,u,o),E=new W(p,u+o);while(l<255&&i>0){var g=re(i+1),f=r>>3,w=(1<<g+1)-1,U=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(r&7)&w,y=(1<<g)-1,v=w-i-1,S=U&y;if(S<v)r+=g,U=S;else if(r+=g+1,U>y)U-=v;if(h[++l]=--U,U==-1)i+=U,b[--m]=l;else i-=U;if(!U)do{var R=r>>3;a=(e[R]|e[R+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var C=0,D=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=h[H];if(M<1){d[H]=-M;continue}for(c=0;c<M;++c){b[C]=H;do C=C+D&X;while(C>=m)}}if(C)K(0);for(c=0;c<o;++c){var A=d[b[c]]++,P=E[c]=s-re(A);T[c]=(A<<P)-o}return[r+7>>3,{b:s,s:b,n:E,t:T}]},vt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),m=c[0],p=c[1];t+=o;var h=m<<3,d=e[t];if(!d)K(0);var T=0,u=0,b=p.b,E=b,g=(++t<<3)-8+re(d);for(;;){if(g-=b,g<h)break;var f=g>>3;if(T+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<b)-1,i[++r]=p.s[T],g-=E,g<h)break;f=g>>3,u+=(e[f]|e[f+1]<<8)>>(g&7)&(1<<E)-1,i[++r]=p.s[u],b=p.n[T],T=p.t[T],E=p.n[u],u=p.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var U=0;for(n=0;n<r;++n){var y=i[n];if(y>11)K(0);U+=y&&1<<y-1}var v=re(U)+1,S=1<<v,R=S-U;if(R&R-1)K(0);i[r++]=re(R)+1;for(n=0;n<r;++n){var y=i[n];++l[i[n]=y&&v+1-y]}var C=new W(S<<1),D=C.subarray(0,S),X=C.subarray(S);a[v]=0;for(n=v;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<v-n))}if(a[0]!=S)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(D,n,A,a[M]=A+(1<<v-M))}}return[t,{n:X,b:v,s:D}]},Tt=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ct=ue(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Le=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Lt=Ve(Le,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,m=(r<<3)-8+re(o)-c,p=-1;for(;m>l&&p<s;){var h=m>>3,d=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(m&7);a=(a<<c|d)&i,t[++p]=n.s[a],m-=c=n.n[a]}if(m!=l||p+1!=s)K(0)},Pt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},kt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Ee(e,s,a)}if(i==2){var c=e[s],m=c&3,p=c>>2&3,h=c>>4,d=0,T=0;if(m<2)if(p&1)h|=e[++s]<<4|(p&2&&e[++s]<<12);else h=c>>3;else if(T=p,p<2)h|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(p==2)h|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(m==0)u.set(e.subarray(s,s+=h),b);else if(m==1)ce(u,e[s++],b);else{var E=t.h;if(m==2){var g=vt(e,s);d+=s-(s=g[0]),t.h=E=g[1]}else if(!E)K(0);(T?Pt:le)(e.subarray(s,s+=d),u.subarray(b),E)}var f=e[s++];if(f){if(f==255)f=(e[s++]|e[s++]<<8)+32512;else if(f>127)f=f-128<<8|e[s++];var w=e[s++];if(w&3)K(0);var U=[Ct,Et,Tt];for(var y=2;y>-1;--y){var v=w>>(y<<1)+2&3;if(v==1){var S=new W([0,0,e[s++]]);U[y]={s:S.subarray(2,3),n:S.subarray(0,1),t:new ge(S.buffer,0,1),b:0}}else if(v==2)r=ue(e,s,9-(y&1)),s=r[0],U[y]=r[1];else if(v==3){if(!t.t)K(0);U[y]=t.t[y]}}var R=t.t=U,C=R[0],D=R[1],X=R[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,P=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=D.b)>>3;var k=(e[A]|e[A+1]<<8)>>(M&7)&(1<<D.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++f;--f;){var L=X.s[V],x=X.n[V],O=C.s[N],F=C.n[N],B=D.s[k],z=D.n[k];A=(M-=B)>>3;var j=1<<B,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Le[O])>>3;var G=Lt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Le[O])-1);A=(M-=Se[L])>>3;var _=St[L]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[L])-1);if(A=(M-=x)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<x)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,k=D.t[k]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Z=I-(_!=0);if(Z){if(I=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var y=0;y<_;++y)u[P+y]=u[b+y];P+=_,b+=_;var q=P-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var y=0;y<J;++y)u[P+y]=t.w[ee+y];P+=J,G-=J,q=0}for(var y=0;y<G;++y)u[P+y]=u[q+y];P+=G}if(P!=b)while(b<u.length)u[P++]=u[b++];else P=u.length;if(n)t.y+=P;else u=Ee(u,0,P)}else if(n){if(t.y+=h,b)for(var y=0;y<h;++y)u[y]=u[b+y]}else if(b)u=Ee(u,b);return t.b=a,u}K(2)},It=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function de(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return It(n,o)}async function Ft(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(de(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function He(e){return new TextDecoder().decode(await Ft(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function ye(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Pe(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Bt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Qe=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Rt=new Set(["model","submodel","configuration"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let p=0;p<s;p++)l=l.replace(/^\\S+\\s*/,"");let a=Ut(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let m=a.findIndex((p,h)=>h>0&&p.toUpperCase()==="GLOSSMAP");if(m>0&&a[m+1])c.glossmap=a[m+1];if(t)c.next=!0;return c}var Ot=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Nt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let m=s();if(m===null)return null;i[c]=+m}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Pe(o),m:i,file:Y(a)}}function Ke(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Pe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Y(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function et(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],m=null,p=()=>{if(!a)return;let g=Ot(a.chunks.join("")),f=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Y(a.name),{name:a.name,bytes:g,...f?{mime:"image/png"}:{}}),a=null},h=!0,d=(g)=>{if(p(),o={name:Y(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],m=null,h=!0},T=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},E=(g,f)=>{if(m){g.tex=m,m=null;return}let w=c[c.length-1];if(!w)return;if(w.fallback){if(!f)g.fallback=!0}else g.tex=w.map};for(let g of e.split(`\n`)){let f=g.trim();if(!f)continue;if(r&&f.charCodeAt(0)>=50&&f.charCodeAt(0)<=53&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){if(a||T)continue;if(!o)d(t);let v=f.slice(2).trimStart(),S=v.search(/\\s/),R={t:f.charCodeAt(0)-48,color:Pe(S<0?v:v.slice(0,S)),p:[],src:f};E(R,!1),o.cmds.push(R),h=!1;continue}if(f.charCodeAt(0)===48&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)){let v=2;while(f.charCodeAt(v)===32||f.charCodeAt(v)===9)v++;let S=v;while(S<f.length&&f.charCodeAt(S)!==32&&f.charCodeAt(S)!==9)S++;let R=f.slice(v,S);if(!Bt.has(R)){if(T||a)continue;if(!o)d(t);let C=f.slice(v),D={t:0,text:C};if(R.charCodeAt(0)===33)D.meta=R;if(m=null,h&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Y(H)}o.cmds.push(D);continue}}if(f.charCodeAt(0)===49&&(f.charCodeAt(1)===32||f.charCodeAt(1)===9)&&!a&&!T){let v=Nt(f);if(v){if(!o)d(t);E(v,!1),o.cmds.push(v),h=!1;continue}}let w=f.split(/\\s+/);if(+w[0]===0){let v=f.slice(1).trim();if(w[1]==="FILE"){b(),T=!1,d(v.slice(5));continue}if(w[1]==="NOFILE"){p(),o=null,T=!0;continue}if(w[1]==="!DATA"){b(),p(),o=null,T=!1,a={name:v.slice(5).trim(),chunks:[]};continue}if(T)continue;if(a){if(w[1]==="!:")a.chunks.push(w.slice(2).join(""));continue}if(!o)d(t);let S={t:0,text:v};if(w[1]==="STEP")S.step=!0,c=[],m=null;else if(w[1]==="BFC")S.bfc=w.slice(2).join(" ");else if(w[1]==="ROTSTEP")if(S.meta="ROTSTEP",S.step=!0,c=[],m=null,(w[2]??"").toUpperCase()==="END")S.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(w[5]??"REL").toUpperCase();S.rotstep={x:+w[2]||0,y:+w[3]||0,z:+w[4]||0,mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(w[1]==="BUFEXCHG"){S.meta="BUFEXCHG";let C=(w[2]??"").toUpperCase();S.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:w[3]??"A"}}else if(w[1]?.startsWith("!"))S.meta=w[1];if(h&&!o.org){let C=We(v);if(C)o.org=C}if(w[1]==="!TEXMAP"){let C=(w[2]??"").toUpperCase();if(m=null,C==="START"||C==="NEXT"){let D=zt(v.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(S.texmap={op:C,...D?{map:D}:{}},D)if((o.texmaps??=[]).push(D),C==="START")c.push({map:D,fallback:!1});else m=D}else if(C==="FALLBACK"){S.texmap={op:C};let D=c[c.length-1];if(D)D.fallback=!0}else if(C==="END")S.texmap={op:C},c.pop()}else if(w[1]==="!:"){m=null;let C=Ke(w.slice(2));if(C)E(C,!0),S.geom=C}else m=null;let R=v.match(_e);if(R&&!o.movedTo){let C=R[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Y(C)}o.cmds.push(S);continue}if(a||T)continue;if(!o)d(t);let y=Ke(w);if(!y)continue;E(y,!1),o.cmds.push(y),h=!1}return p(),l?{main:i,files:s,data:l}:{main:i,files:s}}var ln=Math.PI/180;function tt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function nt(e,t){let[n,r,s,o,i,l,a,c,m,p,h,d]=e,[T,u,b,E,g,f,w,U,y,v,S,R]=t;return[o*T+i*u+l*b+n,a*T+c*u+m*b+r,p*T+h*u+d*b+s,o*E+i*w+l*v,o*g+i*U+l*S,o*f+i*y+l*R,a*E+c*w+m*v,a*g+c*U+m*S,a*f+c*y+m*R,p*E+h*w+d*v,p*g+h*U+d*S,p*f+h*y+d*R]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Ie(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&$t.test(s.file))?"part":"model";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return Ze.set(e,t),t}var Ye=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(" ")}`,Fe=(e,t)=>`${Y(e)}#${t}`;function Vt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Fe(e.name,t),cmds:n}}function st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function ot(e){let[t,n,r,s,o,i,l,a,c,m,p,h]=e,d=a*h-c*p,T=-(l*h-c*m),u=l*p-a*m,b=s*d+o*T+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let E=1/b,g=[d*E,-(o*h-i*p)*E,(o*c-i*a)*E,T*E,(s*h-i*m)*E,-(s*c-i*l)*E,u*E,-(s*p-o*m)*E,(s*a-o*l)*E];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Gt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?" GLOSSMAP "+Je(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${Ht(r)}`,source:r}}var _t=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Wt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var qe=new WeakMap;function at(e){let t=qe.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Wt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Kt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(p,h)=>{let d=p.name+"#"+h,T=l.get(d);if(!T){let u;T=Object.assign(()=>u??=st(p,h),{file:p,step:h}),l.set(d,T)}return T},m=(p,h,d,T,u,b,E,g,f=null,w=[],U=[])=>{let y=p.files.get(h);if(!y||E>r)return;let v=0,S=E>0?++a:0,R=i&&S?[...w,S]:w,C=i&&S?[...U,d]:U,D=i&&!f?new Map:null,X=-1,H=0,M=(L,x,O,F,B,z)=>{if(X!==v)X=v,H=0;let j=D?.get(v+"|"+x);if(j)return j.n++,m(L,L===p?x:L.main,O,F,u+"/"+x,[...B,lt],E+1,z,[...B,lt],R,C);let I=[...B,H++],G=n.length;m(L,L===p?x:L.main,O,F,u+"/"+x,I,E+1,z,f,R,C),D?.set(v+"|"+x,{n:1,from:G,to:n.length})},A=at(y),P=s?rt(y):[],V=0,k=(L,x,O,F,B,z,j)=>{if(f)F=f;let I={part:L,color:x,m:O,step:F[0],steps:F,localStep:B,path:u};if(S){if(I.sub=S,i)I.subPath=R,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(L,j);I.texPart=_.name,I.texSource=_.source}let G=A[B];if(G)I.view=G;return n.push(I),I},N=(L)=>{while(V<P.length&&P[V]<=L){let x=P[V++];k(Fe(y.name,x),T,d,[...b,x],x,!1,null).source=c(y,x)}};for(let L of y.cmds){if(L.t===0&&L.step){v++;continue}let x=L;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){N(v);continue}if(x.t===0)if(o&&x.geom?.t===1)x=x.geom;else continue;if(x.t!==1)continue;if(o&&x.fallback)continue;let O=x.color===16?T:x.color,F=nt(d,x.m),B=[...b,v],z=o?x.tex??g:null,j=z?ot(x.m):null,I=z&&j?tt(z,j):null;if(p.files.has(x.file)){if(Ie(p,x.file)==="model"){M(p,x.file,F,O,B,I);continue}k(x.file,O,F,B,v,!0,I);continue}let G=t.resolveModel?.(x.file);if(G){M(G,x.file,F,O,B,I);continue}k(x.file,O,F,B,v,!1,I)}if(N(1/0),D){for(let L of D.values())if(L.n>1)for(let x=L.from;x<L.to;x++)n[x].mult??=L.n}};if(Ie(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return m(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t="main.ldr",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Y(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Y(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function Yt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function ft(e,t,n="main.ldr"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Y(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let m of r.get(a.pop())){let p=Zt(m);if(p&&r.has(p)&&!l.has(p))l.add(p),a.push(p)}let c=[i,...[...l].filter((m)=>m!==i).sort()].map((m)=>"0 FILE "+(m===i?"":m)+`\n`+r.get(m).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,mt=new WeakMap;function Be(e,t){let n=mt.get(e);if(!n)mt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,d)=>{l.push(h[0]),a.push(h[1]);for(let T=0;T<12;T++)i[d*12+T]=h[2+T]});let c=null,m=0,p=0;if(s.mask){m=s.mask[0],p=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let d=0;d<h.length;d++)c[d]=h.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:m,nz:p}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],m=[],p=[],h=new Re(e.length*2),d=[],T=[];for(let M=0;M<e.length;M++){let A=e[M],P=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(P))continue;let k=V.bbox,N=1/0,L=-1/0,x=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?k[3]:k[0],G=j?k[5]:k[2],_=P[0]+P[3]*I+P[5]*G,Z=P[2]+P[9]*I+P[11]*G;if(_<N)N=_;if(_>L)L=_;if(Z<x)x=Z;if(Z>O)O=Z}let F=a.length;s.push(N),o.push(L),i.push(x),l.push(O),a.push(M),c.push(Be(t,A.part)),m.push(k[0]),p.push(k[2]);let B=Math.round((P[1]+k[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(L/40);z++)for(let j=Math.floor(x/40);j<=Math.floor(O/40);j++){if(!xe(B,z,j))continue;let I=T.length;T.push(F),d.push(h.put(B,z,j,I))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],E=NaN,g=NaN,f=NaN,w=-1,U=(M,A,P,V)=>{let k=Math.round(A*2),N=Math.floor(M/40),L=Math.floor(P/40);if(!xe(k,N,L))return fe;let x=fe;if(k!==E||N!==g||L!==f)E=k,g=N,f=L,w=h.get(k,N,L);for(let O=w;O>=0;O=d[O]){let F=T[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&P-6>=i[F]-0.5&&P+6<=l[F]+0.5))continue;let B=e[a[F]].m,z=c[F],j=m[F],I=p[F],G=M-B[0],_=A-B[1],Z=P-B[2],q=B[3]*G+B[6]*_+B[9]*Z,J=B[5]*G+B[8]*_+B[11]*Z,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-I)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[F]];if(Q<x)x=Q}}return x},y=0;for(let M of e){let A=Be(t,M.part);if(A)y+=A.nStuds}let v=new Uint8Array(y),S=new Uint8Array(y),R=new Re(y),C=0,D=n?new Int32Array(y).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let P=e[M],V=Be(t,P.part);if(!V)continue;let k=P.m,N=V.studM,L=k[0],x=k[1],O=k[2],F=k[3],B=k[4],z=k[5],j=k[6],I=k[7],G=k[8],_=k[9],Z=k[10],q=k[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+B*ae+z*oe)<0.001&&Math.abs(_*se+Z*ae+q*oe)<0.001))continue;S[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=L+F*Q+B*te+z*ne,Ue=x+j*Q+I*te+G*ne,ze=O+_*Q+Z*te+q*ne,Oe=U(De,Ue,ze,M);if(Oe!==fe){if(v[A]=1,C++,D)D[A]=Oe}let pe=Math.round(De),me=Math.round(Ue),he=Math.round(ze);if(!xe(pe,me,he))continue;if(!n){R.put(pe,me,he,1);continue}let Ne=n[M],$e=R.get(pe,me,he);if($e<0||Ne<$e)R.put(pe,me,he,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],P=t.parts[A.part];if(!P||!P.under||!pt(A.m))continue;let V=P.bbox,k=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!k||!N||k*N>4096)continue;let L=A.m,x=!0,O=0;for(let F=0;F<k&&x;F++)for(let B=0;B<N;B++){let z=V[0]+10+20*F,j=V[2]+10+20*B,I=L[0]+L[3]*z+L[5]*j,G=L[2]+L[9]*z+L[11]*j,_=Math.round(I),Z=Math.round(L[1]+V[4]),q=Math.round(G),J=xe(_,Z,q)?R.get(_,Z,q):-1;if(J<0){x=!1;break}if(J>O)O=J}if(x){if(X[M]=1,H)H[M]=O}}return{nStuds:y,studHidden:v,studUp:S,underHidden:X,studsHidden:C,studHideStep:D,underHideStep:H}}function qt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>ct(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function we(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te="https://ldr-demo.vercel.app/cdn/v1/",Me=new Map,Ae=new Map;function gt(e=Te,t=fetch){let n=Me.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Me.delete(e)),Me.set(e,n);return n}var Qt=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),ve=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ve(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ve(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let d=h.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let T=new DataView(d).getUint32(0,!0),u=new Uint8Array(d,4+T),b=r;n.push(u),r+=u.byteLength;let E=(4-r%4)%4;if(E)n.push(new Uint8Array(E)),r+=E;for(let[g,f]of Object.entries(h.header.parts??{}))if(!(g in s))s[g]=ve(f,b);for(let[g,f]of Object.entries(h.header.studKinds??{}))if(!(g in o))o[g]=ve(f,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,m=new Uint8Array(c+r);new DataView(m.buffer).setUint32(0,l.length+a,!0),m.set(l,4),m.fill(32,4+l.length,c);let p=c;for(let h of n)m.set(h,p),p+=h.byteLength;return ye(m.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;Me.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Y))],l=[],a=[];for(let u of i){if(Ae.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let m=0,p=0,h=async()=>{while(p<c.length){let u=c[p++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let E=new Uint8Array(await b.arrayBuffer());if(b.status===200)E=E.subarray(u.start,u.end);m+=E.byteLength;for(let g of u.items){let f=de(E.subarray(g.off-u.start,g.off-u.start+g.len)),w=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);Ae.set(n+g.name,ye(w))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let d=i.filter((u)=>Ae.has(n+u)).map((u)=>Ae.get(n+u));return{pack:d.length?en(d,{colors:o.colors}):ye(nn(o.colors)),missing:l,requests:c.length,bytes:m}}function nn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function rn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}class Ce extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function bt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(f)=>{if(!f.ok)throw Error(`ldr: ${f.status} fetching ${e}`);return He(await f.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let m=ft(o,new Set(a.filter((f)=>f.embedded).map((f)=>f.part)),l),{pack:p,missing:h,requests:d,bytes:T}=await tn([...a.filter((f)=>!f.embedded).map((f)=>f.part),...m.values()],t),u=new Map([...m].map(([f,w])=>[w,f])),b=h.map((f)=>u.get(f)??f);for(let[f,w]of m){let U=p.header.parts[w];if(U)p.header.parts[f]=U}let E=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let f=p.buffer?.byteLength??p.bytes??0,w=rn(a,p);if(t.maxBodyTris!=null&&w>t.maxBodyTris||t.maxPackBytes!=null&&f>t.maxPackBytes)throw new Ce({bodyTris:w,packBytes:f,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let g=t.cull?we(a,p.header,t.textures!==!1):void 0;return{insts:a,pack:p,missing:b,requests:d,bytes:T,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:E-c,...g?{cull:performance.now()-E}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await bt(n,{...r,cull:!1,onParsed:(m)=>self.postMessage({id:t,insts:m})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=we(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let m of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(m)c.push(m.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof Ce||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
3890
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/load-worker.gen.ts
3891
+ var load_worker_gen_default = 'var bt=ArrayBuffer,W=Uint8Array,de=Uint16Array,yt=Int16Array;var be=Int32Array,Ee=function(e,t,n){if(W.prototype.slice)return W.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new W(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(W.prototype.fill)return W.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},xt=function(e,t,n,r){if(W.prototype.copyWithin)return W.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var wt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],K=function(e,t,n){var r=Error(t||wt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,K);if(!n)throw r;return r},je=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},At=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Mt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)K(0);var a=6-s,c=i==3?4:i,f=je(e,a,c);a+=c;var m=l?1<<l:s,h=je(e,a,m)+(l==1&&256),x=h;if(!s){var T=1<<10+(e[5]>>3);x=T+(T>>3)*(e[5]&7)}if(x>2145386496)K(1);var u=new W((t==1?h||x:t?0:x)+12);return u[0]=1,u[4]=4,u[8]=8,{b:a+m,y:0,l:0,d:f,w:t&&t!=1?t:u.subarray(12),e:x,o:new be(u.buffer,0,3),u:h,c:o,m:Math.min(131072,x)}}else if((n>>4|e[3]<<20)==25481893)return At(e,4)+8;K(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)K(3);var o=1<<s,i=o,l=-1,a=-1,c=-1,f=o,m=new bt(512+(o<<2)),h=new yt(m,0,256),x=new de(m,0,256),T=new de(m,512,o),u=512+(o<<1),b=new W(m,u,o),S=new W(m,u+o);while(l<255&&i>0){var d=re(i+1),g=r>>3,p=(1<<d+1)-1,B=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(r&7)&p,y=(1<<d)-1,v=p-i-1,E=B&y;if(E<v)r+=d,B=E;else if(r+=d+1,B>y)B-=v;if(h[++l]=--B,B==-1)i+=B,b[--f]=l;else i-=B;if(!B)do{var D=r>>3;a=(e[D]|e[D+1]<<8)>>(r&7)&3,r+=2,l+=a}while(a==3)}if(l>255||i)K(0);var C=0,U=(o>>1)+(o>>3)+3,X=o-1;for(var H=0;H<=l;++H){var M=h[H];if(M<1){x[H]=-M;continue}for(c=0;c<M;++c){b[C]=H;do C=C+U&X;while(C>=f)}}if(C)K(0);for(c=0;c<o;++c){var A=x[b[c]]++,L=S[c]=s-re(A);T[c]=(A<<L)-o}return[r+7>>3,{b:s,s:b,n:S,t:T}]},vt=function(e,t){var n=0,r=-1,s=new W(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),a=new de(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],m=c[1];t+=o;var h=f<<3,x=e[t];if(!x)K(0);var T=0,u=0,b=m.b,S=b,d=(++t<<3)-8+re(x);for(;;){if(d-=b,d<h)break;var g=d>>3;if(T+=(e[g]|e[g+1]<<8)>>(d&7)&(1<<b)-1,i[++r]=m.s[T],d-=S,d<h)break;g=d>>3,u+=(e[g]|e[g+1]<<8)>>(d&7)&(1<<S)-1,i[++r]=m.s[u],b=m.n[T],T=m.t[T],S=m.n[u],u=m.t[u]}if(++r>255)K(0)}else{r=o-127;for(;n<r;n+=2){var p=e[++t];i[n]=p>>4,i[n+1]=p&15}++t}var B=0;for(n=0;n<r;++n){var y=i[n];if(y>11)K(0);B+=y&&1<<y-1}var v=re(B)+1,E=1<<v,D=E-B;if(D&D-1)K(0);i[r++]=re(D)+1;for(n=0;n<r;++n){var y=i[n];++l[i[n]=y&&v+1-y]}var C=new W(E<<1),U=C.subarray(0,E),X=C.subarray(E);a[v]=0;for(n=v;n>0;--n){var H=a[n];ce(X,n,H,a[n-1]=H+l[n]*(1<<v-n))}if(a[0]!=E)K(0);for(n=0;n<r;++n){var M=i[n];if(M){var A=a[M];ce(U,n,A,a[M]=A+(1<<v-M))}}return[t,{n:X,b:v,s:U}]},Tt=ue(new W([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ct=ue(new W([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Et=ue(new W([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Ve=function(e,t){var n=e.length,r=new be(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new W(new be([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),St=Ve(Se,0),Pe=new W(new be([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Pt=Ve(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)K(0);var a=0,c=n.b,f=(r<<3)-8+re(o)-c,m=-1;for(;f>l&&m<s;){var h=f>>3,x=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(f&7);a=(a<<c|x)&i,t[++m]=n.s[a],f-=c=n.n[a]}if(f!=l||m+1!=s)K(0)},Lt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},kt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,a=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new W(l),e[s])}if(a>e.length)return;if(i==0){if(t.b=a,n)return n.set(e.subarray(s,a),t.y),t.y+=l,n;return Ee(e,s,a)}if(i==2){var c=e[s],f=c&3,m=c>>2&3,h=c>>4,x=0,T=0;if(f<2)if(m&1)h|=e[++s]<<4|(m&2&&e[++s]<<12);else h=c>>3;else if(T=m,m<2)h|=(e[++s]&63)<<4,x=e[s]>>6|e[++s]<<2;else if(m==2)h|=e[++s]<<4|(e[++s]&3)<<12,x=e[s]>>2|e[++s]<<6;else h|=e[++s]<<4|(e[++s]&63)<<12,x=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var u=n?n.subarray(t.y,t.y+t.m):new W(t.m),b=u.length-h;if(f==0)u.set(e.subarray(s,s+=h),b);else if(f==1)ce(u,e[s++],b);else{var S=t.h;if(f==2){var d=vt(e,s);x+=s-(s=d[0]),t.h=S=d[1]}else if(!S)K(0);(T?Lt:le)(e.subarray(s,s+=x),u.subarray(b),S)}var g=e[s++];if(g){if(g==255)g=(e[s++]|e[s++]<<8)+32512;else if(g>127)g=g-128<<8|e[s++];var p=e[s++];if(p&3)K(0);var B=[Ct,Et,Tt];for(var y=2;y>-1;--y){var v=p>>(y<<1)+2&3;if(v==1){var E=new W([0,0,e[s++]]);B[y]={s:E.subarray(2,3),n:E.subarray(0,1),t:new de(E.buffer,0,1),b:0}}else if(v==2)r=ue(e,s,9-(y&1)),s=r[0],B[y]=r[1];else if(v==3){if(!t.t)K(0);B[y]=t.t[y]}}var D=t.t=B,C=D[0],U=D[1],X=D[2],H=e[a-1];if(!H)K(0);var M=(a<<3)-8+re(H)-X.b,A=M>>3,L=0,V=(e[A]|e[A+1]<<8)>>(M&7)&(1<<X.b)-1;A=(M-=U.b)>>3;var k=(e[A]|e[A+1]<<8)>>(M&7)&(1<<U.b)-1;A=(M-=C.b)>>3;var N=(e[A]|e[A+1]<<8)>>(M&7)&(1<<C.b)-1;for(++g;--g;){var P=X.s[V],w=X.n[V],O=C.s[N],F=C.n[N],R=U.s[k],z=U.n[k];A=(M-=R)>>3;var j=1<<R,I=j+((e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>(M&7)&j-1);A=(M-=Pe[O])>>3;var G=Pt[O]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Pe[O])-1);A=(M-=Se[P])>>3;var _=St[P]+((e[A]|e[A+1]<<8|e[A+2]<<16)>>(M&7)&(1<<Se[P])-1);if(A=(M-=w)>>3,V=X.t[V]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<w)-1),A=(M-=F)>>3,N=C.t[N]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<F)-1),A=(M-=z)>>3,k=U.t[k]+((e[A]|e[A+1]<<8)>>(M&7)&(1<<z)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Y=I-(_!=0);if(Y){if(I=Y==3?t.o[0]-1:t.o[Y],Y>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var y=0;y<_;++y)u[L+y]=u[b+y];L+=_,b+=_;var q=L-I;if(q<0){var J=-q,ee=t.e+q;if(J>G)J=G;for(var y=0;y<J;++y)u[L+y]=t.w[ee+y];L+=J,G-=J,q=0}for(var y=0;y<G;++y)u[L+y]=u[q+y];L+=G}if(L!=b)while(b<u.length)u[L++]=u[b++];else L=u.length;if(n)t.y+=L;else u=Ee(u,0,L)}else if(n){if(t.y+=h,b)for(var y=0;y<h;++y)u[y]=u[b+y]}else if(b)u=Ee(u,b);return t.b=a,u}K(2)},Bt=function(e,t){if(e.length==1)return e[0];var n=new W(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function ye(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Mt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=kt(e,i,t);if(!l)K(5);if(t)i.e=i.y;else n.push(l),o+=l.length,xt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Bt(n,o)}async function It(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(ye(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function He(e){return new TextDecoder().decode(await It(e))}var Ge=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function xe(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Z=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/");function Le(e){if(/^0x/i.test(e))return parseInt(e,16);return+e}var _e=/^~?\\s*moved\\s+to\\s+(.+)$/i,Ft=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Qe=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Rt=new Set(["model","submodel","configuration"]),Dt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function We(e){let t=Dt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Qe.has(n)||Rt.has(n)?n:void 0}function Ut(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let m=0;m<s;m++)l=l.replace(/^\\S+\\s*/,"");let a=Ut(l);if(!a.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:a[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=a.findIndex((m,h)=>h>0&&m.toUpperCase()==="GLOSSMAP");if(f>0&&a[f+1])c.glossmap=a[f+1];if(t)c.next=!0;return c}var Ot=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Nt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),a=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Le(o),m:i,file:Z(a)}}function Ke(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Le(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Z(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function et(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,a=null,c=[],f=null,m=()=>{if(!a)return;let d=Ot(a.chunks.join("")),g=d[0]===137&&d[1]===80&&d[2]===78&&d[3]===71;(l??=new Map).set(Z(a.name),{name:a.name,bytes:d,...g?{mime:"image/png"}:{}}),a=null},h=!0,x=(d)=>{if(m(),o={name:Z(d),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,h=!0},T=!1,u=!1,b=()=>{if(u)return;u=!0,s.clear(),o=null,i=""},S=(d,g)=>{if(f){d.tex=f,f=null;return}let p=c[c.length-1];if(!p)return;if(p.fallback){if(!g)d.fallback=!0}else d.tex=p.map};for(let d of e.split(`\n`)){let g=d.trim();if(!g)continue;if(r&&g.charCodeAt(0)>=50&&g.charCodeAt(0)<=53&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){if(a||T)continue;if(!o)x(t);let v=g.slice(2).trimStart(),E=v.search(/\\s/),D={t:g.charCodeAt(0)-48,color:Le(E<0?v:v.slice(0,E)),p:[],src:g};S(D,!1),o.cmds.push(D),h=!1;continue}if(g.charCodeAt(0)===48&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){let v=2;while(g.charCodeAt(v)===32||g.charCodeAt(v)===9)v++;let E=v;while(E<g.length&&g.charCodeAt(E)!==32&&g.charCodeAt(E)!==9)E++;let D=g.slice(v,E);if(!Ft.has(D)){if(T||a)continue;if(!o)x(t);let C=g.slice(v),U={t:0,text:C};if(D.charCodeAt(0)===33)U.meta=D;if(f=null,h&&!o.org){let H=We(C);if(H)o.org=H}let X=C.match(_e);if(X&&!o.movedTo){let H=X[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(H))H+=".dat";o.movedTo=Z(H)}o.cmds.push(U);continue}}if(g.charCodeAt(0)===49&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)&&!a&&!T){let v=Nt(g);if(v){if(!o)x(t);S(v,!1),o.cmds.push(v),h=!1;continue}}let p=g.split(/\\s+/);if(+p[0]===0){let v=g.slice(1).trim();if(p[1]==="FILE"){b(),T=!1,x(v.slice(5));continue}if(p[1]==="NOFILE"){m(),o=null,T=!0;continue}if(p[1]==="!DATA"){b(),m(),o=null,T=!1,a={name:v.slice(5).trim(),chunks:[]};continue}if(T)continue;if(a){if(p[1]==="!:")a.chunks.push(p.slice(2).join(""));continue}if(!o)x(t);let E={t:0,text:v};if(p[1]==="STEP")E.step=!0,c=[],f=null;else if(p[1]==="BFC")E.bfc=p.slice(2).join(" ");else if(p[1]==="ROTSTEP")if(E.meta="ROTSTEP",E.step=!0,c=[],f=null,(p[2]??"").toUpperCase()==="END")E.rotstep={x:0,y:0,z:0,mode:"END"};else{let C=(p[5]??"REL").toUpperCase();E.rotstep={x:+p[2]||0,y:+p[3]||0,z:+p[4]||0,mode:["REL","ABS","ADD"].includes(C)?C:"REL"}}else if(p[1]==="BUFEXCHG"){E.meta="BUFEXCHG";let C=(p[2]??"").toUpperCase();E.bufexchg={op:C==="RETRIEVE"?"RETRIEVE":"STORE",buf:p[3]??"A"}}else if(p[1]?.startsWith("!"))E.meta=p[1];if(h&&!o.org){let C=We(v);if(C)o.org=C}if(p[1]==="!TEXMAP"){let C=(p[2]??"").toUpperCase();if(f=null,C==="START"||C==="NEXT"){let U=zt(v.replace(/^!TEXMAP\\s+\\S+/i,""),C==="NEXT");if(E.texmap={op:C,...U?{map:U}:{}},U)if((o.texmaps??=[]).push(U),C==="START")c.push({map:U,fallback:!1});else f=U}else if(C==="FALLBACK"){E.texmap={op:C};let U=c[c.length-1];if(U)U.fallback=!0}else if(C==="END")E.texmap={op:C},c.pop()}else if(p[1]==="!:"){f=null;let C=Ke(p.slice(2));if(C)S(C,!0),E.geom=C}else f=null;let D=v.match(_e);if(D&&!o.movedTo){let C=D[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(C))C+=".dat";o.movedTo=Z(C)}o.cmds.push(E);continue}if(a||T)continue;if(!o)x(t);let y=Ke(p);if(!y)continue;S(y,!1),o.cmds.push(y),h=!1}return m(),l?{main:i,files:s,data:l}:{main:i,files:s}}var cn=Math.PI/180;function tt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function nt(e,t){let[n,r,s,o,i,l,a,c,f,m,h,x]=e,[T,u,b,S,d,g,p,B,y,v,E,D]=t;return[o*T+i*u+l*b+n,a*T+c*u+f*b+r,m*T+h*u+x*b+s,o*S+i*p+l*v,o*d+i*B+l*E,o*g+i*y+l*D,a*S+c*p+f*v,a*d+c*B+f*E,a*g+c*y+f*D,m*S+h*p+x*v,m*d+h*B+x*E,m*g+h*y+x*D]}var ke=[0,0,0,1,0,0,0,1,0,0,0,1];var Xe=new WeakMap,$t=/^(s|8|48)\\//;function Be(e,t){let n=e.files.get(Z(t));if(!n)return"part";let r=Xe.get(n);if(r)return r;if(n.org)r=Qe.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&$t.test(s.file))?"part":"model";return Xe.set(n,r),r}var Ze=new WeakMap;function rt(e){let t=Ze.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return Ze.set(e,t),t}var Ye=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():String(e),jt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${Ye(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${Ye(e.color)} ${e.p.join(" ")}`,Ie=(e,t)=>`${Z(e)}#${t}`;function Vt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ie(e.name,t),cmds:n}}function st(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Vt(e,t).cmds.map(jt)].join(`\n`)+`\n`}function Ht(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function ot(e){let[t,n,r,s,o,i,l,a,c,f,m,h]=e,x=a*h-c*m,T=-(l*h-c*f),u=l*m-a*f,b=s*x+o*T+i*u;if(!Number.isFinite(b)||Math.abs(b)<0.000000000001)return null;let S=1/b,d=[x*S,-(o*h-i*m)*S,(o*c-i*a)*S,T*S,(s*h-i*f)*S,-(s*c-i*l)*S,u*S,-(s*m-o*f)*S,(s*a-o*l)*S];return[-(d[0]*t+d[1]*n+d[2]*r),-(d[3]*t+d[4]*n+d[5]*r),-(d[6]*t+d[7]*n+d[8]*r),...d]}var Gt=(e)=>String(+e.toFixed(6)||0),Je=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function it(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Gt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Je(t.texture)}${t.glossmap?" GLOSSMAP "+Je(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Z(e)}\n0 !TEXMAP END\n`;return{name:`${Z(e)}#tex-${Ht(r)}`,source:r}}var _t=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Wt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),a=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*a,i,o*a+s*i*c,o*c-s*i*a,-s*l,s*a-o*i*c,s*c+o*i*a,o*l]}var qe=new WeakMap;function at(e){let t=qe.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Wt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:_t(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),qe.set(e,n),n}var lt=999999,ct=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function Kt(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,a=0,c=(m,h)=>{let x=m.name+"#"+h,T=l.get(x);if(!T){let u;T=Object.assign(()=>u??=st(m,h),{file:m,step:h}),l.set(x,T)}return T},f=(m,h,x,T,u,b,S,d,g=null,p=[],B=[])=>{let y=m.files.get(h);if(!y||S>r)return;let v=0,E=S>0?++a:0,D=i&&E?[...p,E]:p,C=i&&E?[...B,x]:B,U=i&&!g?new Map:null,X=-1,H=0,M=(P,w,O,F,R,z)=>{if(X!==v)X=v,H=0;let j=U?.get(v+"|"+w);if(j)return j.n++,f(P,P===m?w:P.main,O,F,u+"/"+w,[...R,lt],S+1,z,[...R,lt],D,C);let I=[...R,H++],G=n.length;f(P,P===m?w:P.main,O,F,u+"/"+w,I,S+1,z,g,D,C),U?.set(v+"|"+w,{n:1,from:G,to:n.length})},A=at(y),L=s?rt(y):[],V=0,k=(P,w,O,F,R,z,j)=>{if(g)F=g;let I={part:P,color:w,m:O,step:F[0],steps:F,localStep:R,path:u};if(E){if(I.sub=E,i)I.subPath=D,I.subMats=C}if(z)I.embedded=!0;if(j){let _=it(P,j);I.texPart=_.name,I.texSource=_.source}let G=A[R];if(G)I.view=G;return n.push(I),I},N=(P)=>{while(V<L.length&&L[V]<=P){let w=L[V++];k(Ie(y.name,w),T,x,[...b,w],w,!1,null).source=c(y,w)}};for(let P of y.cmds){if(P.t===0&&P.step){v++;continue}let w=P;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){N(v);continue}if(w.t===0)if(o&&w.geom?.t===1)w=w.geom;else continue;if(w.t!==1)continue;if(o&&w.fallback)continue;let O=w.color===16?T:w.color,F=nt(x,w.m),R=[...b,v],z=o?w.tex??d:null,j=z?ot(w.m):null,I=z&&j?tt(z,j):null;if(m.files.has(w.file)){if(Be(m,w.file)==="model"){M(m,w.file,F,O,R,I);continue}k(w.file,O,F,R,v,!0,I);continue}let G=t.resolveModel?.(w.file);if(G){M(G,w.file,F,O,R,I);continue}k(w.file,O,F,R,v,!1,I)}if(N(1/0),U){for(let P of U.values())if(P.n>1)for(let w=P.from;w<P.to;w++)n[w].mult??=P.n}};if(Be(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,ke,16,e.main,[],0,null),n}function ut(e,t="main.ldr",n){return Kt(et(e,t,{geometryText:!0}),n)}function Xt(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Z(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Z(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var Zt=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Z(t.slice(14).join(" ")):null};function Yt(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function ft(e,t,n="main.ldr"){let r=Xt(e,n),s=new Map;for(let o of t){let i=Z(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),a=[i];while(a.length)for(let f of r.get(a.pop())){let m=Zt(f);if(m&&r.has(m)&&!l.has(m))l.add(m),a.push(m)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${Yt(c)}.dat`)}return s}var pt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,mt=new WeakMap;function Fe(e,t){let n=mt.get(e);if(!n)mt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],a=[];s.studs.forEach((h,x)=>{l.push(h[0]),a.push(h[1]);for(let T=0;T<12;T++)i[x*12+T]=h[2+T]});let c=null,f=0,m=0;if(s.mask){f=s.mask[0],m=s.mask[1];let h=s.mask[2];c=new Uint8Array(h.length);for(let x=0;x<h.length;x++)c[x]=h.charCodeAt(x)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:a,mask:c,nx:f,nz:m}),r}var ie=1073741824;class Re{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,a=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,a[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&a[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var we=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function Jt(e,t,n){let s=[],o=[],i=[],l=[],a=[],c=[],f=[],m=[],h=new Re(e.length*2),x=[],T=[];for(let M=0;M<e.length;M++){let A=e[M],L=A.m,V=t.parts[A.part];if(!V||!V.mask||!pt(L))continue;let k=V.bbox,N=1/0,P=-1/0,w=1/0,O=-1/0;for(let z=0;z<2;z++)for(let j=0;j<2;j++){let I=z?k[3]:k[0],G=j?k[5]:k[2],_=L[0]+L[3]*I+L[5]*G,Y=L[2]+L[9]*I+L[11]*G;if(_<N)N=_;if(_>P)P=_;if(Y<w)w=Y;if(Y>O)O=Y}let F=a.length;s.push(N),o.push(P),i.push(w),l.push(O),a.push(M),c.push(Fe(t,A.part)),f.push(k[0]),m.push(k[2]);let R=Math.round((L[1]+k[4])*2);for(let z=Math.floor(N/40);z<=Math.floor(P/40);z++)for(let j=Math.floor(w/40);j<=Math.floor(O/40);j++){if(!we(R,z,j))continue;let I=T.length;T.push(F),x.push(h.put(R,z,j,I))}}let u=[0,5,-5,5,-5],b=[0,5,5,-5,-5],S=NaN,d=NaN,g=NaN,p=-1,B=(M,A,L,V)=>{let k=Math.round(A*2),N=Math.floor(M/40),P=Math.floor(L/40);if(!we(k,N,P))return fe;let w=fe;if(k!==S||N!==d||P!==g)S=k,d=N,g=P,p=h.get(k,N,P);for(let O=p;O>=0;O=x[O]){let F=T[O];if(a[F]===V||!(M-6>=s[F]-0.5&&M+6<=o[F]+0.5&&L-6>=i[F]-0.5&&L+6<=l[F]+0.5))continue;let R=e[a[F]].m,z=c[F],j=f[F],I=m[F],G=M-R[0],_=A-R[1],Y=L-R[2],q=R[3]*G+R[6]*_+R[9]*Y,J=R[5]*G+R[8]*_+R[11]*Y,{nx:ee,nz:se,mask:ae}=z,oe=!0;for(let Q=0;Q<5;Q++){let te=Math.floor((q+u[Q]-j)/20),ne=Math.floor((J+b[Q]-I)/20);if(te<0||ne<0||te>=ee||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let Q=n[a[F]];if(Q<w)w=Q}}return w},y=0;for(let M of e){let A=Fe(t,M.part);if(A)y+=A.nStuds}let v=new Uint8Array(y),E=new Uint8Array(y),D=new Re(y),C=0,U=n?new Int32Array(y).fill(fe):void 0;for(let M=0,A=0;M<e.length;M++){let L=e[M],V=Fe(t,L.part);if(!V)continue;let k=L.m,N=V.studM,P=k[0],w=k[1],O=k[2],F=k[3],R=k[4],z=k[5],j=k[6],I=k[7],G=k[8],_=k[9],Y=k[10],q=k[11];for(let J=0;J<V.nStuds;J++,A++){let ee=J*12,se=N[ee+4],ae=N[ee+7],oe=N[ee+10];if(!(Math.abs(j*se+I*ae+G*oe-1)<0.001&&Math.abs(F*se+R*ae+z*oe)<0.001&&Math.abs(_*se+Y*ae+q*oe)<0.001))continue;E[A]=1;let Q=N[ee],te=N[ee+1],ne=N[ee+2],De=P+F*Q+R*te+z*ne,Ue=w+j*Q+I*te+G*ne,ze=O+_*Q+Y*te+q*ne,Oe=B(De,Ue,ze,M);if(Oe!==fe){if(v[A]=1,C++,U)U[A]=Oe}let me=Math.round(De),he=Math.round(Ue),ge=Math.round(ze);if(!we(me,he,ge))continue;if(!n){D.put(me,he,ge,1);continue}let Ne=n[M],$e=D.get(me,he,ge);if($e<0||Ne<$e)D.put(me,he,ge,Ne)}}let X=new Uint8Array(e.length),H=n?new Int32Array(e.length).fill(fe):void 0;for(let M=0;M<e.length;M++){let A=e[M],L=t.parts[A.part];if(!L||!L.under||!pt(A.m))continue;let V=L.bbox,k=Math.round((V[3]-V[0])/20),N=Math.round((V[5]-V[2])/20);if(!k||!N||k*N>4096)continue;let P=A.m,w=!0,O=0;for(let F=0;F<k&&w;F++)for(let R=0;R<N;R++){let z=V[0]+10+20*F,j=V[2]+10+20*R,I=P[0]+P[3]*z+P[5]*j,G=P[2]+P[9]*z+P[11]*j,_=Math.round(I),Y=Math.round(P[1]+V[4]),q=Math.round(G),J=we(_,Y,q)?D.get(_,Y,q):-1;if(J<0){w=!1;break}if(J>O)O=J}if(w){if(X[M]=1,H)H[M]=O}}return{nStuds:y,studHidden:v,studUp:E,underHidden:X,studsHidden:C,studHideStep:U,underHideStep:H}}function qt(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=e.map((a)=>({part:r(a),color:String(a.color),m:a.m,steps:a.steps})),o=s.map((a)=>ct(a.steps)),i=[...new Set(o)].sort(),l=new Map(i.map((a,c)=>[a,c]));return{all:s,stepOf:o.map((a)=>l.get(a)),nSteps:i.length}}function Ae(e,t,n=!0){let r=qt(e,t,n);return Jt(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ce="https://ldr-demo.vercel.app/cdn/v1/",ve=new Map,Me=new Map;function gt(e=Ce,t=fetch){let n=ve.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>ve.delete(e)),ve.set(e,n);return n}var Qt=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Te=(e,t)=>Qt(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Te(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Te(r,t)])):e;function en(e,t={}){let n=[],r=0,s={},o={};for(let h of e){let x=h.buffer;if(!x)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let T=new DataView(x).getUint32(0,!0),u=new Uint8Array(x,4+T),b=r;n.push(u),r+=u.byteLength;let S=(4-r%4)%4;if(S)n.push(new Uint8Array(S)),r+=S;for(let[d,g]of Object.entries(h.header.parts??{}))if(!(d in s))s[d]=Te(g,b);for(let[d,g]of Object.entries(h.header.studKinds??{}))if(!(d in o))o[d]=Te(g,b)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),a=(4-(4+l.length)%4)%4,c=4+l.length+a,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+a,!0),f.set(l,4),f.fill(32,4+l.length,c);let m=c;for(let h of n)f.set(h,m),m+=h.byteLength;return xe(f.buffer)}async function tn(e,t={}){e=[...e];try{return await ht(e,t)}catch(n){let r=t.cdn??Ce,s=t.fetch??fetch;ve.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await ht(e,{...t,fetch:o})}catch{throw n}}}async function ht(e,t){let n=t.cdn??Ce,r=t.fetch??fetch,s=t.gap??16384,o=await gt(n,r),i=[...new Set([...e].map(Z))],l=[],a=[];for(let u of i){if(Me.has(n+u))continue;let b=o.parts[u];if(b)a.push({name:u,off:b[0],len:b[1],file:b[2]??0});else l.push(u)}a.sort((u,b)=>u.file-b.file||u.off-b.off);let c=[];for(let u of a){let b=c[c.length-1];if(b&&b.file===u.file&&u.off-b.end<=s)b.end=Math.max(b.end,u.off+u.len),b.items.push(u);else c.push({file:u.file,start:u.off,end:u.off+u.len,items:[u]})}let f=0,m=0,h=async()=>{while(m<c.length){let u=c[m++],b=await r(new URL(o.archives[u.file],n).href,{headers:{Range:`bytes=${u.start}-${u.end-1}`}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);let S=new Uint8Array(await b.arrayBuffer());if(b.status===200)S=S.subarray(u.start,u.end);f+=S.byteLength;for(let d of u.items){let g=ye(S.subarray(d.off-u.start,d.off-u.start+d.len)),p=g.buffer.slice(g.byteOffset,g.byteOffset+g.byteLength);Me.set(n+d.name,xe(p))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},h));let x=i.filter((u)=>Me.has(n+u)).map((u)=>Me.get(n+u));return{pack:x.length?en(x,{colors:o.colors}):xe(nn(o.colors)),missing:l,requests:c.length,bytes:f}}function nn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function rn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function sn(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let a=l.embedded?t.get(l.part):Z(l.part),c=a?n.parts[a]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(a))i.add(a),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class pe extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function dt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=gt(t.cdn??Ce,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(p)=>{if(!p.ok)throw Error(`ldr: ${p.status} fetching ${e}`);return He(await p.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Ge(e)),a=ut(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(a),await s;let f=ft(o,new Set(a.filter((p)=>p.embedded).map((p)=>p.part)),l),m=(p,B)=>t.maxBodyTris!=null&&p>t.maxBodyTris||t.maxPackBytes!=null&&B>t.maxPackBytes;if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=sn(a,f,await s);if(m(p.known?p.bodyTris:0,p.packBytes))throw new pe({bodyTris:p.bodyTris,packBytes:p.packBytes,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let{pack:h,missing:x,requests:T,bytes:u}=await tn([...a.filter((p)=>!p.embedded).map((p)=>p.part),...f.values()],t),b=new Map([...f].map(([p,B])=>[B,p])),S=x.map((p)=>b.get(p)??p);for(let[p,B]of f){let y=h.header.parts[B];if(y)h.header.parts[p]=y}let d=performance.now();if(t.maxBodyTris!=null||t.maxPackBytes!=null){let p=h.buffer?.byteLength??h.bytes??0,B=rn(a,h);if(m(B,p))throw new pe({bodyTris:B,packBytes:p,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes})}let g=t.cull?Ae(a,h.header,t.textures!==!1):void 0;return{insts:a,pack:h,missing:S,requests:T,bytes:u,cull:g,timings:{fetchModel:i-n,parse:c-i,parts:d-c,...g?{cull:performance.now()-d}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await dt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=Ae(s.insts,s.pack.header,r.textures!==!1),a=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:a},c)}catch(s){if(s instanceof pe||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
3867
3892
 
3868
- // ../../../../../../../tmp/ldr-build-aOWXed/src/cdn.ts
3893
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/cdn.ts
3869
3894
  var worker;
3870
3895
  var seq = 0;
3871
3896
  var pending = new Map;
@@ -3978,7 +4003,7 @@ async function loadModel(source, o = {}) {
3978
4003
  timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
3979
4004
  });
3980
4005
  }
3981
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/library.ts
4006
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/library.ts
3982
4007
  import { existsSync, readFileSync } from "fs";
3983
4008
  import { join } from "path";
3984
4009
  var xf = (m, x, y, z) => [m[3] * x + m[4] * y + m[5] * z + m[0], m[6] * x + m[7] * y + m[8] * z + m[1], m[9] * x + m[10] * y + m[11] * z + m[2]];
@@ -4229,11 +4254,11 @@ class Library {
4229
4254
  return insts;
4230
4255
  }
4231
4256
  }
4232
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/build-pack.ts
4257
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/build-pack.ts
4233
4258
  import fs3 from "node:fs";
4234
4259
  import path3 from "node:path";
4235
4260
 
4236
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/resolver.ts
4261
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/resolver.ts
4237
4262
  import fs from "node:fs";
4238
4263
  import path from "node:path";
4239
4264
  var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
@@ -4505,11 +4530,11 @@ function collectDeps(lib, refs) {
4505
4530
  return out;
4506
4531
  }
4507
4532
 
4508
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/compile.ts
4533
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/compile.ts
4509
4534
  import fs2 from "node:fs";
4510
4535
  import path2 from "node:path";
4511
4536
 
4512
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/lod.ts
4537
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/lod.ts
4513
4538
  import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
4514
4539
  await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
4515
4540
  function reorderMesh(P, N, C, I) {
@@ -4701,7 +4726,7 @@ function lodChain(P, C, I) {
4701
4726
  return out;
4702
4727
  }
4703
4728
 
4704
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/compile.ts
4729
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/compile.ts
4705
4730
  function loadColors(root) {
4706
4731
  const map = new Map;
4707
4732
  for (const l of fs2.readFileSync(path2.join(root, "LDConfig.ldr"), "latin1").split(/\r?\n/)) {
@@ -5284,7 +5309,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
5284
5309
  return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
5285
5310
  }
5286
5311
 
5287
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/build-pack.ts
5312
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/build-pack.ts
5288
5313
  function buildPack(o) {
5289
5314
  const lib = new Library2(o.ldrawRoot);
5290
5315
  const refs = new Map;
@@ -5318,7 +5343,7 @@ function buildPack(o) {
5318
5343
  if (lib.isPart(k) && /\.dat$/.test(k))
5319
5344
  refs.set(k.slice(6), k);
5320
5345
  }
5321
- const comp = new Compiler(lib, { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures });
5346
+ const comp = new Compiler(lib, { studs: o.studs ?? "low", prims: o.primitives ?? "low", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures });
5322
5347
  const parts = new Map, kinds = new Map;
5323
5348
  let n = 0;
5324
5349
  for (const [ref, key] of refs) {
@@ -5351,7 +5376,7 @@ function buildPack(o) {
5351
5376
  const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
5352
5377
  return { data: encodePack(parts, kinds, comp.opts.weld, extra, { texture, lod: o.lod !== false, reorder: !!o.reorder }), parts: parts.size, studKinds: kinds.size, missing: [...missing], ...warnings.length ? { warnings } : {} };
5353
5378
  }
5354
- // ../../../../../../../tmp/ldr-build-aOWXed/src/node/promote.ts
5379
+ // ../../../../../../../tmp/ldr-build-MfGfTR/src/node/promote.ts
5355
5380
  var GEOM = /^\s*[2-5]\s/;
5356
5381
  var REF = /^\s*1\s/;
5357
5382
  var FILE = /^\s*0\s+FILE\s+(.+?)\s*$/i;
@@ -5623,6 +5648,7 @@ export {
5623
5648
  decompressPack,
5624
5649
  embeddedKeys,
5625
5650
  encodePack,
5651
+ estimateBudgetFromIndex,
5626
5652
  fileKind,
5627
5653
  fileStepViews,
5628
5654
  flatten,
@@ -10,7 +10,7 @@ export interface PartsCdnIndex {
10
10
  archives: string[];
11
11
  bytes: number;
12
12
  colors: Record<string, string>;
13
- parts: Record<string, [number, number, number]>;
13
+ parts: Record<string, [offset: number, length: number, archive: number, bodyTris?: number]>;
14
14
  }
15
15
  export interface LoadPartsOptions {
16
16
  /** Base URL of the parts CDN (ending in /). Default `DEFAULT_PARTS_CDN`. */
@@ -47,9 +47,10 @@ export interface PrepareOptions extends LoadPartsOptions {
47
47
  name?: string;
48
48
  /** Instruction-booklet step order for repeated submodels (see `FlattenOptions.callouts`). Default false. */
49
49
  callouts?: boolean;
50
- /** Abort after parts are merged when full-detail body triangles exceed this (phones: avoid OOM). See `BudgetError`. */
50
+ /** Abort when full-detail body triangles exceed this (phones: avoid OOM). See `BudgetError`. Checked from the CDN index before any
51
+ * part is downloaded when the index has per-part triangle counts, and exactly after the parts are merged. */
51
52
  maxBodyTris?: number;
52
- /** Abort when the merged parts pack byte length exceeds this. See `BudgetError`. */
53
+ /** Abort when the merged parts pack byte length exceeds this. See `BudgetError`. Also checked early against the compressed shard bytes. */
53
54
  maxPackBytes?: number;
54
55
  }
55
56
  export interface PreparedModel {
@@ -68,6 +69,18 @@ export interface PreparedModel {
68
69
  }
69
70
  /** Full-detail body triangles across all instances that have a pack entry (sum of `part.body.tris`). */
70
71
  export declare function bodyTriangles(insts: PartInstance[], pack: Pack): number;
72
+ /**
73
+ * Budget estimate from the CDN index alone (no shard fetched): `bodyTris` sums each instance's index `bodyTris` (4th field, Round 39),
74
+ * `packBytes` sums the compressed shard lengths of the distinct parts needed. Both are lower bounds of the exact post-merge values
75
+ * (missing parts count 0; the merged pack is uncompressed), so an early refusal never rejects a model the exact check would accept.
76
+ * `known` is false when no needed index entry has `bodyTris` (an older CDN): then the estimate says nothing about triangles.
77
+ * `emb` maps embedded part names to their CDN content keys (`embeddedKeys`).
78
+ */
79
+ export declare function estimateBudgetFromIndex(insts: PartInstance[], emb: Map<string, string>, idx: PartsCdnIndex): {
80
+ bodyTris: number;
81
+ packBytes: number;
82
+ known: boolean;
83
+ };
71
84
  /** Thrown by `prepareModel` / `loadModel` when `maxBodyTris` or `maxPackBytes` is set and the prepared model exceeds it. */
72
85
  export declare class BudgetError extends Error {
73
86
  readonly code: "ldr-budget";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ldr",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "description": "High-performance LEGO (LDraw) rendering for three.js: instanced parts packs, hidden stud/tube culling, low-detail studs, indexed edges, build steps.",
5
5
  "license": "MIT",
6
6
  "author": "Evan Bacon",