ldr 0.33.10 → 0.33.12

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.
@@ -1,4 +1,4 @@
1
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/spec.ts
1
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/spec.ts
2
2
  var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
3
3
  var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
4
4
  var namedCodes = new Map;
@@ -802,7 +802,7 @@ function fileStepViews(f) {
802
802
  viewMemo.set(f, out);
803
803
  return out;
804
804
  }
805
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/model.ts
805
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/model.ts
806
806
  class ModelLimitError extends Error {
807
807
  limit;
808
808
  code = "ldr-model-limit";
@@ -1243,7 +1243,7 @@ function blendedColourHex(code) {
1243
1243
  const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
1244
1244
  return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
1245
1245
  }
1246
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/instructions.ts
1246
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/instructions.ts
1247
1247
  var MIN_VIS = 0.5;
1248
1248
  var REORIENT = 0.35;
1249
1249
  var deg = Math.PI / 180;
@@ -1611,10 +1611,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
1611
1611
  }
1612
1612
  };
1613
1613
  }
1614
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/render.ts
1614
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/render.ts
1615
1615
  import * as THREE from "three";
1616
1616
 
1617
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/pack-io.ts
1617
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/pack-io.ts
1618
1618
  import { decompress } from "fzstd";
1619
1619
  async function decompressPack(data) {
1620
1620
  const u = data instanceof Uint8Array ? data : new Uint8Array(data);
@@ -1637,16 +1637,25 @@ function decodePack(buf) {
1637
1637
  return { header, arr, bytes: buf.byteLength, buffer: buf };
1638
1638
  }
1639
1639
 
1640
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/cull.ts
1640
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/cull.ts
1641
1641
  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;
1642
1642
  var prepCache = new WeakMap;
1643
+ var lastH = null;
1644
+ var lastPart = "";
1645
+ var lastPrep = null;
1643
1646
  function prepPart(H, part) {
1647
+ if (H === lastH && part === lastPart)
1648
+ return lastPrep;
1644
1649
  let c = prepCache.get(H);
1645
1650
  if (!c)
1646
1651
  prepCache.set(H, c = new Map);
1647
1652
  let r = c.get(part);
1648
- if (r !== undefined)
1653
+ if (r !== undefined) {
1654
+ lastH = H;
1655
+ lastPart = part;
1656
+ lastPrep = r;
1649
1657
  return r;
1658
+ }
1650
1659
  const p = H.parts[part];
1651
1660
  if (!p) {
1652
1661
  c.set(part, null);
@@ -1671,6 +1680,9 @@ function prepPart(H, part) {
1671
1680
  mask[i] = bits.charCodeAt(i) === 49 ? 1 : 0;
1672
1681
  }
1673
1682
  c.set(part, r = { nStuds: n, studM, kind, color, mask, nx, nz });
1683
+ lastH = H;
1684
+ lastPart = part;
1685
+ lastPrep = r;
1674
1686
  return r;
1675
1687
  }
1676
1688
  function mul12To(a, b, bo, w, ao = 0) {
@@ -1687,78 +1699,91 @@ var singular12 = (m, d = det12(m)) => d * d <= 0.000000000000000001 * (m[3] * m[
1687
1699
  var BIG = 1073741824;
1688
1700
 
1689
1701
  class Int3Table {
1690
- a;
1691
- b;
1692
- c;
1693
- vals;
1694
- used;
1702
+ t;
1703
+ tag;
1695
1704
  mask;
1696
1705
  size = 0;
1697
- constructor(cap = 1024) {
1706
+ shift;
1707
+ constructor(cap = 1024, shift = -1) {
1698
1708
  let n = 1024;
1699
1709
  while (n < cap * 2)
1700
1710
  n *= 2;
1701
- this.a = new Int32Array(n);
1702
- this.b = new Int32Array(n);
1703
- this.c = new Int32Array(n);
1704
- this.vals = new Int32Array(n);
1705
- this.used = new Uint8Array(n);
1711
+ this.t = new Int32Array(n * 4);
1712
+ this.tag = new Uint8Array(n);
1706
1713
  this.mask = n - 1;
1714
+ this.shift = shift;
1707
1715
  }
1708
1716
  slot(x, y, z) {
1709
- let h = Math.imul(x, 2654435761) ^ Math.imul(y, 2246822507) ^ Math.imul(z, 3266489909);
1717
+ const s = this.shift;
1718
+ if (s < 0) {
1719
+ let h = Math.imul(x, 2654435761) ^ Math.imul(y, 2246822507) ^ Math.imul(z, 3266489909);
1720
+ h ^= h >>> 15;
1721
+ h = Math.imul(h, 739982445);
1722
+ h ^= h >>> 12;
1723
+ return h & this.mask;
1724
+ }
1725
+ let h = Math.imul(x >> s + 2, 2654435761) ^ Math.imul(y, 2246822507) ^ Math.imul(z >> s + 2, 3266489909);
1710
1726
  h ^= h >>> 15;
1711
1727
  h = Math.imul(h, 739982445);
1712
1728
  h ^= h >>> 12;
1713
- return h & this.mask;
1729
+ return (h << 4 | (x >> s & 3) << 2 | z >> s & 3) & this.mask;
1730
+ }
1731
+ static tagOf(x, y, z) {
1732
+ const g = Math.imul(x ^ Math.imul(y, 374761393) ^ Math.imul(z, 668265261), 2654435761);
1733
+ return g >>> 24 | 1;
1714
1734
  }
1715
1735
  get(x, y, z) {
1736
+ const g = Int3Table.tagOf(x, y, z), G = this.tag, T = this.t, M = this.mask;
1716
1737
  let i = this.slot(x, y, z);
1717
- const U = this.used, A = this.a, B = this.b, C = this.c;
1718
1738
  for (;; ) {
1719
- if (!U[i])
1739
+ const q = G[i];
1740
+ if (q === 0)
1720
1741
  return -1;
1721
- if (A[i] === x && B[i] === y && C[i] === z)
1722
- return this.vals[i];
1723
- i = i + 1 & this.mask;
1742
+ if (q === g) {
1743
+ const o = i << 2;
1744
+ if (T[o] === x && T[o + 1] === y && T[o + 2] === z)
1745
+ return T[o + 3];
1746
+ }
1747
+ i = i + 1 & M;
1724
1748
  }
1725
1749
  }
1726
1750
  put(x, y, z, v) {
1727
- if ((this.size + 1) * 2 > this.used.length)
1751
+ if ((this.size + 1) * 2 > this.tag.length)
1728
1752
  this.grow();
1753
+ const g = Int3Table.tagOf(x, y, z), G = this.tag, T = this.t, M = this.mask;
1729
1754
  let i = this.slot(x, y, z);
1730
- const U = this.used, A = this.a, B = this.b, C = this.c;
1731
1755
  for (;; ) {
1732
- if (!U[i]) {
1733
- U[i] = 1;
1734
- A[i] = x;
1735
- B[i] = y;
1736
- C[i] = z;
1737
- this.vals[i] = v;
1756
+ const q = G[i];
1757
+ const o = i << 2;
1758
+ if (q === 0) {
1759
+ G[i] = g;
1760
+ T[o] = x;
1761
+ T[o + 1] = y;
1762
+ T[o + 2] = z;
1763
+ T[o + 3] = v;
1738
1764
  this.size++;
1739
1765
  return -1;
1740
1766
  }
1741
- if (A[i] === x && B[i] === y && C[i] === z) {
1742
- const o = this.vals[i];
1743
- this.vals[i] = v;
1744
- return o;
1767
+ if (q === g && T[o] === x && T[o + 1] === y && T[o + 2] === z) {
1768
+ const w = T[o + 3];
1769
+ T[o + 3] = v;
1770
+ return w;
1745
1771
  }
1746
- i = i + 1 & this.mask;
1772
+ i = i + 1 & M;
1747
1773
  }
1748
1774
  }
1749
1775
  grow() {
1750
- const { a, b, c, vals, used } = this;
1751
- const n = used.length * 2;
1752
- this.a = new Int32Array(n);
1753
- this.b = new Int32Array(n);
1754
- this.c = new Int32Array(n);
1755
- this.vals = new Int32Array(n);
1756
- this.used = new Uint8Array(n);
1776
+ const T = this.t, G = this.tag;
1777
+ const n = G.length * 2;
1778
+ this.t = new Int32Array(n * 4);
1779
+ this.tag = new Uint8Array(n);
1757
1780
  this.mask = n - 1;
1758
1781
  this.size = 0;
1759
- for (let i = 0;i < used.length; i++)
1760
- if (used[i])
1761
- this.put(a[i], b[i], c[i], vals[i]);
1782
+ for (let i = 0;i < G.length; i++)
1783
+ if (G[i]) {
1784
+ const o = i << 2;
1785
+ this.put(T[o], T[o + 1], T[o + 2], T[o + 3]);
1786
+ }
1762
1787
  }
1763
1788
  }
1764
1789
  var inRange = (x, y, z) => x > -BIG && x < BIG && y > -BIG && y < BIG && z > -BIG && z < BIG;
@@ -1794,6 +1819,7 @@ function cullCore(insts, H, steps) {
1794
1819
  return v;
1795
1820
  };
1796
1821
  const rx0 = [], rx1 = [], rz0 = [], rz1 = [], rInst = [], rInst2 = [], rPrep = [], rBx = [], rBz = [];
1822
+ const rLv = [], rM = [];
1797
1823
  const cells = new Int3Table(insts.length * 2);
1798
1824
  const nextE = [], rectE = [];
1799
1825
  for (let idx = 0;idx < insts.length; idx++) {
@@ -1858,6 +1884,8 @@ function cullCore(insts, H, steps) {
1858
1884
  rPrep.push(pp);
1859
1885
  rBx.push(b[0]);
1860
1886
  rBz.push(b[2]);
1887
+ rLv.push(lv2);
1888
+ rM.push(m[0], m[1], m[2], m[3], m[6], m[9], m[5], m[8], m[11]);
1861
1889
  for (let cx = cx0;cx <= cx1; cx++)
1862
1890
  for (let cz = cz0;cz <= cz1; cz++) {
1863
1891
  if (!inRange(lv2, cx, cz))
@@ -1868,12 +1896,29 @@ function cullCore(insts, H, steps) {
1868
1896
  }
1869
1897
  }
1870
1898
  const SX = [0, 5, -5, 5, -5], SZ = [0, 5, 5, -5, -5];
1899
+ const covers = (ri, x, y, z) => {
1900
+ if (!(x - 6 >= rx0[ri] - 0.5 && x + 6 <= rx1[ri] + 0.5 && z - 6 >= rz0[ri] - 0.5 && z + 6 <= rz1[ri] + 0.5))
1901
+ return false;
1902
+ const o = ri * 9, pp = rPrep[ri], bx = rBx[ri], bz = rBz[ri];
1903
+ const dx = x - rM[o], dy = y - rM[o + 1], dz = z - rM[o + 2];
1904
+ const lx = rM[o + 3] * dx + rM[o + 4] * dy + rM[o + 5] * dz, lz = rM[o + 6] * dx + rM[o + 7] * dy + rM[o + 8] * dz;
1905
+ const { nx, nz, mask: bits } = pp;
1906
+ for (let s = 0;s < 5; s++) {
1907
+ const ca = Math.floor((lx + SX[s] - bx) / 20), cb = Math.floor((lz + SZ[s] - bz) / 20);
1908
+ if (ca < 0 || cb < 0 || ca >= nx || cb >= nz || bits[ca * nz + cb] !== 1)
1909
+ return false;
1910
+ }
1911
+ return true;
1912
+ };
1871
1913
  let kl = NaN, kx = NaN, kz = NaN, ke = -1;
1914
+ let lastRi = -1;
1872
1915
  const coverStep = (x, y, z, self) => {
1873
1916
  const l2 = Math.round(y * 2), gx = Math.floor(x / CELL), gz = Math.floor(z / CELL);
1874
1917
  if (!inRange(l2, gx, gz))
1875
1918
  return STEP_NEVER;
1876
1919
  let best = STEP_NEVER;
1920
+ if (!steps && lastRi >= 0 && rLv[lastRi] === l2 && (rInst[lastRi] !== self || rInst2[lastRi] >= 0) && covers(lastRi, x, y, z))
1921
+ return 0;
1877
1922
  if (l2 !== kl || gx !== kx || gz !== kz) {
1878
1923
  kl = l2;
1879
1924
  kx = gx;
@@ -1885,29 +1930,15 @@ function cullCore(insts, H, steps) {
1885
1930
  let by = rInst[ri];
1886
1931
  if (by === self && (by = rInst2[ri]) < 0)
1887
1932
  continue;
1888
- if (!(x - 6 >= rx0[ri] - 0.5 && x + 6 <= rx1[ri] + 0.5 && z - 6 >= rz0[ri] - 0.5 && z + 6 <= rz1[ri] + 0.5))
1933
+ if (!covers(ri, x, y, z))
1889
1934
  continue;
1890
- const m = insts[rInst[ri]].m;
1891
- const pp = rPrep[ri];
1892
- const bx = rBx[ri], bz = rBz[ri];
1893
- const dx = x - m[0], dy = y - m[1], dz = z - m[2];
1894
- const lx = m[3] * dx + m[6] * dy + m[9] * dz, lz = m[5] * dx + m[8] * dy + m[11] * dz;
1895
- const { nx, nz, mask: bits } = pp;
1896
- let ok = true;
1897
- for (let s = 0;s < 5; s++) {
1898
- const ca = Math.floor((lx + SX[s] - bx) / 20), cb = Math.floor((lz + SZ[s] - bz) / 20);
1899
- if (ca < 0 || cb < 0 || ca >= nx || cb >= nz || bits[ca * nz + cb] !== 1) {
1900
- ok = false;
1901
- break;
1902
- }
1903
- }
1904
- if (ok) {
1905
- if (!steps)
1906
- return 0;
1907
- const st = steps[by];
1908
- if (st < best)
1909
- best = st;
1935
+ if (!steps) {
1936
+ lastRi = ri;
1937
+ return 0;
1910
1938
  }
1939
+ const st = steps[by];
1940
+ if (st < best)
1941
+ best = st;
1911
1942
  }
1912
1943
  return best;
1913
1944
  };
@@ -1918,7 +1949,7 @@ function cullCore(insts, H, steps) {
1918
1949
  nStuds += pp.nStuds;
1919
1950
  }
1920
1951
  const studHidden = new Uint8Array(nStuds), studUp = new Uint8Array(nStuds);
1921
- const tops = new Int3Table(nStuds);
1952
+ const tops = new Int3Table(nStuds, 4);
1922
1953
  let studsHidden = 0;
1923
1954
  const studHideStep = steps ? new Int32Array(nStuds).fill(STEP_NEVER) : undefined;
1924
1955
  for (let idx = 0, j = 0;idx < insts.length; idx++) {
@@ -1966,13 +1997,13 @@ function cullCore(insts, H, steps) {
1966
1997
  const nx = Math.round((b[3] - b[0]) / 20), nz = Math.round((b[5] - b[2]) / 20);
1967
1998
  if (!nx || !nz || nx * nz > 4096)
1968
1999
  continue;
1969
- const m = it.m;
2000
+ const m = it.m, ry = Math.round(m[1] + b[4]);
1970
2001
  let all = true, at = 0;
1971
2002
  for (let a = 0;a < nx && all; a++)
1972
2003
  for (let c = 0;c < nz; c++) {
1973
2004
  const lx = b[0] + 10 + 20 * a, lz = b[2] + 10 + 20 * c;
1974
2005
  const x = m[0] + m[3] * lx + m[5] * lz, z = m[2] + m[9] * lx + m[11] * lz;
1975
- const rx = Math.round(x), ry = Math.round(m[1] + b[4]), rz = Math.round(z);
2006
+ const rx = Math.round(x), rz = Math.round(z);
1976
2007
  const t = inRange(rx, ry, rz) ? tops.get(rx, ry, rz) : -1;
1977
2008
  if (t < 0) {
1978
2009
  all = false;
@@ -2020,7 +2051,7 @@ function precomputeCull(instances, H, useTex = true) {
2020
2051
  return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
2021
2052
  }
2022
2053
 
2023
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/render.ts
2054
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/render.ts
2024
2055
  async function loadPack(url) {
2025
2056
  const res = await fetch(url);
2026
2057
  if (!res.ok)
@@ -2941,6 +2972,7 @@ function studTopClosed(b, arr) {
2941
2972
  _topClosed.set(b, v);
2942
2973
  return v;
2943
2974
  }
2975
+ var EDGE_CAP_MIN = 4;
2944
2976
 
2945
2977
  class LdrLodRoot extends THREE.LOD {
2946
2978
  clusters = [];
@@ -2948,6 +2980,7 @@ class LdrLodRoot extends THREE.LOD {
2948
2980
  px = 0.5;
2949
2981
  edgePpl = 0.5 / 20;
2950
2982
  edgeMinPx = 0.15;
2983
+ edgeCap = 0;
2951
2984
  enabled = true;
2952
2985
  apply = () => {};
2953
2986
  inv = new THREE.Matrix4;
@@ -2999,7 +3032,7 @@ class LdrLodRoot extends THREE.LOD {
2999
3032
  this.inv.copy(this.matrixWorld).invert();
3000
3033
  this.cp.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(this.inv);
3001
3034
  const { x, y, z } = this.cp;
3002
- const tau = this.px, eppl = this.edgePpl;
3035
+ const tau = this.px, eppl = this.edgePpl, cap = this.edgeCap;
3003
3036
  for (const c of this.clusters) {
3004
3037
  let d;
3005
3038
  const B = c.b;
@@ -3063,6 +3096,13 @@ class LdrLodRoot extends THREE.LOD {
3063
3096
  else
3064
3097
  hi = mid;
3065
3098
  }
3099
+ const D = l.userData.ldrD;
3100
+ if (cap > 0 && D) {
3101
+ const dp = D * ppl;
3102
+ const n = Math.max(EDGE_CAP_MIN, Math.ceil(cap * dp * dp));
3103
+ if (n < lo)
3104
+ lo = n;
3105
+ }
3066
3106
  l.geometry.drawRange.count = lo * 2;
3067
3107
  l.visible = lo > 0 && l.userData.ldrVis !== false;
3068
3108
  }
@@ -3281,6 +3321,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3281
3321
  root.px = P.lodPx ?? 0.5;
3282
3322
  root.edgePpl = (P.lodEdgePx ?? 0.5) / 20;
3283
3323
  root.edgeMinPx = P.lodEdgeMinPx ?? 0.4;
3324
+ root.edgeCap = P.lodEdgeCap ?? 0.75;
3284
3325
  yield root;
3285
3326
  const trackVp = (r) => {
3286
3327
  const rt = r.getRenderTarget();
@@ -3341,6 +3382,8 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3341
3382
  return m;
3342
3383
  };
3343
3384
  const byPart = new Map;
3385
+ const matMemo = new Map;
3386
+ const bucketMemo = new Map;
3344
3387
  const bucketRange = (i0, i1) => {
3345
3388
  for (let i = i0;i < i1; i++) {
3346
3389
  const it = insts[i];
@@ -3348,13 +3391,27 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3348
3391
  if (!p)
3349
3392
  continue;
3350
3393
  const d = det12(it.m), mirror = d < 0;
3351
- const mat = materialFor(String(it.color), mirror, !!p.uncert || singular12(it.m, d));
3352
- const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
3353
- let b = byPart.get(k);
3394
+ const code = String(it.color), uncert = !!p.uncert || singular12(it.m, d), role = uncert ? 2 : mirror ? 1 : 0;
3395
+ let me = matMemo.get(code);
3396
+ if (!me)
3397
+ matMemo.set(code, me = [undefined, undefined, undefined]);
3398
+ const mat = me[role] ?? (me[role] = materialFor(code, mirror, uncert));
3399
+ let pm = bucketMemo.get(it.part);
3400
+ if (!pm)
3401
+ bucketMemo.set(it.part, pm = new Map);
3402
+ let pb = pm.get(mat);
3403
+ if (!pb)
3404
+ pm.set(mat, pb = [undefined, undefined]);
3405
+ let b = pb[mirror ? 1 : 0];
3354
3406
  if (!b) {
3355
- if (p.uncert)
3356
- nUncert++;
3357
- byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
3407
+ const k = it.part + "\x00" + mat.uuid + (mirror ? "\x00m" : "");
3408
+ b = byPart.get(k);
3409
+ if (!b) {
3410
+ if (p.uncert)
3411
+ nUncert++;
3412
+ byPart.set(k, b = { part: it.part, mirror, ids: [], mat });
3413
+ }
3414
+ pb[mirror ? 1 : 0] = b;
3358
3415
  }
3359
3416
  b.ids.push(i);
3360
3417
  }
@@ -3464,6 +3521,14 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3464
3521
  edgeObjs.push(l);
3465
3522
  cl.lines.push(l);
3466
3523
  root.add(l);
3524
+ if (LOD && !im.userData.ldrStud && im.geometry.getAttribute("position")) {
3525
+ const gg = im.geometry;
3526
+ if (!gg.boundingSphere)
3527
+ gg.computeBoundingSphere();
3528
+ const r = gg.boundingSphere.radius;
3529
+ if (r > 0)
3530
+ l.userData.ldrD = 2 * r;
3531
+ }
3467
3532
  return l;
3468
3533
  };
3469
3534
  const stats = { studsTotal: cull.nStuds, studsHidden: cull.studsHidden, undersTotal: 0, undersHidden: 0 };
@@ -4323,7 +4388,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
4323
4388
  await new Promise((r) => setTimeout(r, 0));
4324
4389
  }
4325
4390
  }
4326
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/scene.ts
4391
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/scene.ts
4327
4392
  import * as THREE2 from "three";
4328
4393
  var _box = new THREE2.Box3;
4329
4394
  var _m4 = new THREE2.Matrix4;
@@ -4530,7 +4595,7 @@ function createLdrObjectInner(instances, pack, options, progressive) {
4530
4595
  })();
4531
4596
  const multiStep = uniq.length > 1;
4532
4597
  const drawnAt = (step, mask) => all.filter((i, k) => (step == null || stepOf[k] <= step) && (!mask || mask[k]) && pack.header.parts[i.part]).length;
4533
- const sceneOpts = () => ({ localColours: localColours.size ? localColours : undefined, cullStuds: cs, cullUnder: cu, edges: o.edges, side, cond: o.conditionalLines, condStuds: o.conditionalStudLines !== false, tex: o.textures !== false, lod: o.lod !== false, lodPx: o.lodPx, lodEdgePx: o.lodEdgePx, lodEdgeMinPx: o.lodEdgeMinPx, lodUnder: o.lodUnder, steps: multiStep ? stepOf : undefined, cull: o.precomputedCull });
4598
+ const sceneOpts = () => ({ localColours: localColours.size ? localColours : undefined, cullStuds: cs, cullUnder: cu, edges: o.edges, side, cond: o.conditionalLines, condStuds: o.conditionalStudLines !== false, tex: o.textures !== false, lod: o.lod !== false, lodPx: o.lodPx, lodEdgePx: o.lodEdgePx, lodEdgeMinPx: o.lodEdgeMinPx, lodEdgeCap: o.lodEdgeCap, lodUnder: o.lodUnder, steps: multiStep ? stepOf : undefined, cull: o.precomputedCull });
4534
4599
  const applyBuilt = (built, t0) => {
4535
4600
  cur = built;
4536
4601
  pairs.clear();
@@ -4678,10 +4743,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
4678
4743
  return finish();
4679
4744
  })();
4680
4745
  }
4681
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/parts-cdn.ts
4746
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/parts-cdn.ts
4682
4747
  import { decompress as decompress2 } from "fzstd";
4683
4748
 
4684
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/embedded.ts
4749
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/embedded.ts
4685
4750
  function splitFiles(text, fallback) {
4686
4751
  const files = new Map;
4687
4752
  let cur = null, saw = false, skip = false;
@@ -4756,7 +4821,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
4756
4821
  return out;
4757
4822
  }
4758
4823
 
4759
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/parts-cdn.ts
4824
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/parts-cdn.ts
4760
4825
  var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
4761
4826
  var indexCache = new Map;
4762
4827
  var shardCache = new Map;
@@ -5010,10 +5075,10 @@ async function prepareModel(source, o = {}) {
5010
5075
  return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
5011
5076
  }
5012
5077
 
5013
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/load-worker.gen.ts
5014
- var load_worker_gen_default = 'var Ft=ArrayBuffer,ee=Uint8Array,we=Uint16Array,Rt=Int16Array;var Me=Int32Array,Ie=function(e,t,n){if(ee.prototype.slice)return ee.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 ee(n-t);return r.set(e.subarray(t,n)),r},he=function(e,t,n,r){if(ee.prototype.fill)return ee.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},Bt=function(e,t,n,r){if(ee.prototype.copyWithin)return ee.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 Dt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],te=function(e,t,n){var r=Error(t||Dt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,te);if(!n)throw r;return r},Qe=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Ut=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Ot=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,c=r>>6;if(r&8)te(0);var u=6-s,f=i==3?4:i,a=Qe(e,u,f);u+=f;var l=c?1<<c:s,m=Qe(e,u,l)+(c==1&&256),g=m;if(!s){var d=1<<10+(e[5]>>3);g=d+(d>>3)*(e[5]&7)}if(g>2145386496)te(1);var b=new ee((t==1?m||g:t?0:g)+12);return b[0]=1,b[4]=4,b[8]=8,{b:u+l,y:0,l:0,d:a,w:t&&t!=1?t:b.subarray(12),e:g,o:new Me(b.buffer,0,3),u:m,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return Ut(e,4)+8;te(0)},le=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ge=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)te(3);var o=1<<s,i=o,c=-1,u=-1,f=-1,a=o,l=new Ft(512+(o<<2)),m=new Rt(l,0,256),g=new we(l,0,256),d=new we(l,512,o),b=512+(o<<1),C=new ee(l,b,o),A=new ee(l,b+o);while(c<255&&i>0){var p=le(i+1),h=r>>3,M=(1<<p+1)-1,D=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(r&7)&M,v=(1<<p)-1,L=M-i-1,R=D&v;if(R<L)r+=p,D=R;else if(r+=p+1,D>v)D-=L;if(m[++c]=--D,D==-1)i+=D,C[--a]=c;else i-=D;if(!D)do{var T=r>>3;u=(e[T]|e[T+1]<<8)>>(r&7)&3,r+=2,c+=u}while(u==3)}if(c>255||i)te(0);var x=0,w=(o>>1)+(o>>3)+3,E=o-1;for(var z=0;z<=c;++z){var k=m[z];if(k<1){g[z]=-k;continue}for(f=0;f<k;++f){C[x]=z;do x=x+w&E;while(x>=a)}}if(x)te(0);for(f=0;f<o;++f){var P=g[C[f]]++,Y=A[f]=s-le(P);d[f]=(P<<Y)-o}return[r+7>>3,{b:s,s:C,n:A,t:d}]},Nt=function(e,t){var n=0,r=-1,s=new ee(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),u=new we(s.buffer,268);if(o<128){var f=ge(e,t+1,6),a=f[0],l=f[1];t+=o;var m=a<<3,g=e[t];if(!g)te(0);var d=0,b=0,C=l.b,A=C,p=(++t<<3)-8+le(g);for(;;){if(p-=C,p<m)break;var h=p>>3;if(d+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<C)-1,i[++r]=l.s[d],p-=A,p<m)break;h=p>>3,b+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<A)-1,i[++r]=l.s[b],C=l.n[d],d=l.t[d],A=l.n[b],b=l.t[b]}if(++r>255)te(0)}else{r=o-127;for(;n<r;n+=2){var M=e[++t];i[n]=M>>4,i[n+1]=M&15}++t}var D=0;for(n=0;n<r;++n){var v=i[n];if(v>11)te(0);D+=v&&1<<v-1}var L=le(D)+1,R=1<<L,T=R-D;if(T&T-1)te(0);i[r++]=le(T)+1;for(n=0;n<r;++n){var v=i[n];++c[i[n]=v&&L+1-v]}var x=new ee(R<<1),w=x.subarray(0,R),E=x.subarray(R);u[L]=0;for(n=L;n>0;--n){var z=u[n];he(E,n,z,u[n-1]=z+c[n]*(1<<L-n))}if(u[0]!=R)te(0);for(n=0;n<r;++n){var k=i[n];if(k){var P=u[k];he(w,n,P,u[k]=P+(1<<L-k))}}return[t,{n:E,b:L,s:w}]},zt=ge(new ee([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],$t=ge(new ee([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],jt=ge(new ee([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],qe=function(e,t){var n=e.length,r=new Me(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Fe=new ee(new Me([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Vt=qe(Fe,0),Re=new ee(new Me([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),_t=qe(Re,3),me=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)te(0);var u=0,f=n.b,a=(r<<3)-8+le(o)-f,l=-1;for(;a>c&&l<s;){var m=a>>3,g=(e[m]|e[m+1]<<8|e[m+2]<<16)>>(a&7);u=(u<<f|g)&i,t[++l]=n.s[u],a-=f=n.n[u]}if(a!=c||l+1!=s)te(0)},Ht=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;me(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),me(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),me(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),me(e.subarray(r),t.subarray(c),n)},Gt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return he(n,e[s],t.y,t.y+=c),n;return he(new ee(c),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=c,n;return Ie(e,s,u)}if(i==2){var f=e[s],a=f&3,l=f>>2&3,m=f>>4,g=0,d=0;if(a<2)if(l&1)m|=e[++s]<<4|(l&2&&e[++s]<<12);else m=f>>3;else if(d=l,l<2)m|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(l==2)m|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else m|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var b=n?n.subarray(t.y,t.y+t.m):new ee(t.m),C=b.length-m;if(a==0)b.set(e.subarray(s,s+=m),C);else if(a==1)he(b,e[s++],C);else{var A=t.h;if(a==2){var p=Nt(e,s);g+=s-(s=p[0]),t.h=A=p[1]}else if(!A)te(0);(d?Ht:me)(e.subarray(s,s+=g),b.subarray(C),A)}var h=e[s++];if(h){if(h==255)h=(e[s++]|e[s++]<<8)+32512;else if(h>127)h=h-128<<8|e[s++];var M=e[s++];if(M&3)te(0);var D=[$t,jt,zt];for(var v=2;v>-1;--v){var L=M>>(v<<1)+2&3;if(L==1){var R=new ee([0,0,e[s++]]);D[v]={s:R.subarray(2,3),n:R.subarray(0,1),t:new we(R.buffer,0,1),b:0}}else if(L==2)r=ge(e,s,9-(v&1)),s=r[0],D[v]=r[1];else if(L==3){if(!t.t)te(0);D[v]=t.t[v]}}var T=t.t=D,x=T[0],w=T[1],E=T[2],z=e[u-1];if(!z)te(0);var k=(u<<3)-8+le(z)-E.b,P=k>>3,Y=0,I=(e[P]|e[P+1]<<8)>>(k&7)&(1<<E.b)-1;P=(k-=w.b)>>3;var j=(e[P]|e[P+1]<<8)>>(k&7)&(1<<w.b)-1;P=(k-=x.b)>>3;var H=(e[P]|e[P+1]<<8)>>(k&7)&(1<<x.b)-1;for(++h;--h;){var Z=E.s[I],O=E.n[I],G=x.s[H],K=x.n[H],J=w.s[j],Q=w.n[j];P=(k-=J)>>3;var S=1<<J,y=S+((e[P]|e[P+1]<<8|e[P+2]<<16|e[P+3]<<24)>>>(k&7)&S-1);P=(k-=Re[G])>>3;var B=_t[G]+((e[P]|e[P+1]<<8|e[P+2]<<16)>>(k&7)&(1<<Re[G])-1);P=(k-=Fe[Z])>>3;var _=Vt[Z]+((e[P]|e[P+1]<<8|e[P+2]<<16)>>(k&7)&(1<<Fe[Z])-1);if(P=(k-=O)>>3,I=E.t[I]+((e[P]|e[P+1]<<8)>>(k&7)&(1<<O)-1),P=(k-=K)>>3,H=x.t[H]+((e[P]|e[P+1]<<8)>>(k&7)&(1<<K)-1),P=(k-=Q)>>3,j=w.t[j]+((e[P]|e[P+1]<<8)>>(k&7)&(1<<Q)-1),y>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=y-=3;else{var W=y-(_!=0);if(W){if(y=W==3?t.o[0]-1:t.o[W],W>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=y}else y=t.o[0]}for(var v=0;v<_;++v)b[Y+v]=b[C+v];Y+=_,C+=_;var X=Y-y;if(X<0){var N=-X,q=t.e+X;if(N>B)N=B;for(var v=0;v<N;++v)b[Y+v]=t.w[q+v];Y+=N,B-=N,X=0}for(var v=0;v<B;++v)b[Y+v]=b[X+v];Y+=B}if(Y!=C)while(C<b.length)b[Y++]=b[C++];else Y=b.length;if(n)t.y+=Y;else b=Ie(b,0,Y)}else if(n){if(t.y+=m,C)for(var v=0;v<m;++v)b[v]=b[C+v]}else if(C)b=Ie(b,C);return t.b=u,b}te(2)},Wt=function(e,t){if(e.length==1)return e[0];var n=new ee(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 Ae(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Ot(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 c=Gt(e,i,t);if(!c)te(5);if(t)i.e=i.y;else n.push(c),o+=c.length,Bt(i.w,0,c.length),i.w.set(c,i.w.length-c.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Wt(n,o)}async function Kt(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(Ae(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 et(e){return new TextDecoder().decode(await Kt(e))}var tt=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function ve(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 ne=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),De=/^[A-Za-z][A-Za-z0-9_]*$/,Be=new Map;function Ue(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Be.has(r))Be.set(r,t);return r}function Oe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&De.test(e))return Ue(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var nt=/^~?\\s*moved\\s+to\\s+(.+)$/i,Xt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),Zt=new Set(["FILE","NOFILE","!DATA"]),ut=1000000000000000,ft=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Yt=new Set(["model","submodel","configuration"]),Jt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function rt(e){let t=Jt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return ft.has(n)||Yt.has(n)?n:void 0}function Qt(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 qt(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((l)=>Number.isFinite(l)&&Math.abs(l)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let l=0;l<s;l++)c=c.replace(/^\\S+\\s*/,"");let u=Qt(c);if(!u.length)return null;let f={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)f.a=i[9];if(s===11)f.b=i[10];let a=u.findIndex((l,m)=>m>0&&l.toUpperCase()==="GLOSSMAP");if(a>0&&u[a+1])f.glossmap=u[a+1];if(t)f.next=!0;return f}var en=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,"");if(t.length%4===1)t=t.slice(0,-1);let 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 tn(e){let t=e.length,n=1,r=(a)=>a===32||a===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let a=n;while(n<t&&!r(e.charCodeAt(n)))n++;return a<n?e.slice(a,n):null},o=s();if(o===null)return null;let i=Array(12);for(let a=0;a<12;a++){let l=s();if(l===null)return null;let m=+l;if(!Number.isFinite(m))return null;i[a]=m}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let c=e.slice(n),u=/[ \\t]{2,}|\\t/.test(c)?c.split(/\\s+/).join(" "):c,f=Oe(o);if(!Number.isFinite(f))return null;return{t:1,color:f,m:i,file:ne(u)}}var nn=[0,12,6,9,12,12];function st(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=Oe(e[1]),r=nn[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=ne(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function pt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,u=null,f=[],a=null,l=()=>{if(!u)return;let p=en(u.chunks.join("")),h=p[0]===137&&p[1]===80&&p[2]===78&&p[3]===71;(c??=new Map).set(ne(u.name),{name:u.name,bytes:p,...h?{mime:"image/png"}:{}}),u=null},m=!0,g=(p)=>{if(l(),o={name:ne(p),cmds:[]},s.set(o.name,o),!i)i=o.name;f=[],a=null,m=!0},d=!1,b=!1,C=()=>{if(b)return;b=!0,s.clear(),o=null,i=""},A=(p,h)=>{if(a){p.tex=a,a=null;return}let M=f[f.length-1];if(!M)return;if(M.fallback){if(!h)p.fallback=!0}else p.tex=M.map};for(let p of e.split(`\n`)){let h=p.trim();if(!h)continue;if(r&&h.charCodeAt(0)>=50&&h.charCodeAt(0)<=53&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){if(u||d)continue;if(!o)g(t);let L=h.slice(2).trimStart(),R=L.search(/\\s/),T={t:h.charCodeAt(0)-48,color:Oe(R<0?L:L.slice(0,R)),p:[],src:h};A(T,!1),o.cmds.push(T),m=!1;continue}if(h.charCodeAt(0)===48&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){let L=2;while(h.charCodeAt(L)===32||h.charCodeAt(L)===9)L++;let R=L;while(R<h.length&&h.charCodeAt(R)!==32&&h.charCodeAt(R)!==9)R++;let T=h.slice(L,R),x=/[^\\x21-\\x7e]/.test(T)?h.slice(L).trim().split(/\\s+/)[0]:T;if(!Xt.has(x)&&!(x.length>=4&&x.length<=6&&Zt.has(x.toUpperCase()))){if(d||u)continue;if(!o)g(t);let w=h.slice(L),E={t:0,text:w};if(T.charCodeAt(0)===33)E.meta=T;if(a=null,m&&!o.org){let k=rt(w);if(k)o.org=k}let z=w.match(nt);if(z&&!o.movedTo){let k=z[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(k))k+=".dat";o.movedTo=ne(k)}o.cmds.push(E);continue}}if(h.charCodeAt(0)===49&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)&&!u&&!d){let L=tn(h);if(L){if(!o)g(t);A(L,!1),o.cmds.push(L),m=!1;continue}}let M=h.split(/\\s+/);if(+M[0]===0){let L=h.slice(1).trim(),R=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(R==="FILE"){let w=L.slice(5).trimStart().split("\\r")[0].trim();if(w){C(),d=!1,g(w);continue}}if(R==="NOFILE"){l(),o=null,d=!0;continue}if(R==="!DATA"){C(),l(),o=null,d=!1,u={name:L.slice(5).trim(),chunks:[]};continue}if(d)continue;if(u){if(M[1]==="!:")u.chunks.push(M.slice(2).join(""));continue}if(!o)g(t);let T={t:0,text:L};if(M[1]==="STEP")T.step=!0,f=[],a=null;else if(M[1]==="BFC")T.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(T.meta="ROTSTEP",T.step=!0,f=[],a=null,(M[2]??"").toUpperCase()==="END")T.rotstep={x:0,y:0,z:0,mode:"END"};else{let w=(M[5]??"REL").toUpperCase(),E=(z)=>{let k=Number(z);return Number.isFinite(k)?k:0};T.rotstep={x:E(M[2]),y:E(M[3]),z:E(M[4]),mode:["REL","ABS","ADD"].includes(w)?w:"REL"}}else if(M[1]==="BUFEXCHG"){T.meta="BUFEXCHG";let w=(M[2]??"").toUpperCase();T.bufexchg={op:w==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))T.meta=M[1];if(m&&!o.org){let w=rt(L);if(w)o.org=w}if(M[1]==="!TEXMAP"){let w=(M[2]??"").toUpperCase();if(a=null,w==="START"||w==="NEXT"){let E=qt(L.replace(/^!TEXMAP\\s+\\S+/i,""),w==="NEXT");if(T.texmap={op:w,...E?{map:E}:{}},E)if((o.texmaps??=[]).push(E),w==="START")f.push({map:E,fallback:!1});else a=E}else if(w==="FALLBACK"){T.texmap={op:w};let E=f[f.length-1];if(E)E.fallback=!0}else if(w==="END")T.texmap={op:w},f.pop()}else if(M[1]==="!:"){a=null;let w=st(M.slice(2));if(w)A(w,!0),T.geom=w}else a=null;let x=L.match(nt);if(x&&!o.movedTo){let w=x[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(w))w+=".dat";o.movedTo=ne(w)}o.cmds.push(T);continue}if(u||d)continue;if(!o)g(t);let v=st(M);if(!v){if(/^[2-5][ \\t]/.test(h))m=!1;continue}A(v,!1),o.cmds.push(v),m=!1}return l(),c?{main:i,files:s,data:c}:{main:i,files:s}}var Pn=Math.PI/180;function mt(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 ht(e,t){let[n,r,s,o,i,c,u,f,a,l,m,g]=e,[d,b,C,A,p,h,M,D,v,L,R,T]=t;return[o*d+i*b+c*C+n,u*d+f*b+a*C+r,l*d+m*b+g*C+s,o*A+i*M+c*L,o*p+i*D+c*R,o*h+i*v+c*T,u*A+f*M+a*L,u*p+f*D+a*R,u*h+f*v+a*T,l*A+m*M+g*L,l*p+m*D+g*R,l*h+m*v+g*T]}var Ne=[0,0,0,1,0,0,0,1,0,0,0,1];var ot=new WeakMap,rn=/^(s|8|48)\\//;function ze(e,t){let n=e.files.get(ne(t));if(!n)return"part";let r=ot.get(n);if(r)return r;if(n.org)r=ft.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&&rn.test(s.file))?"part":"model";return ot.set(n,r),r}var it=new WeakMap;function gt(e){let t=it.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 it.set(e,t),t}var at=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Be.get(e)??String(e):String(e),sn=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${at(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${at(e.color)} ${e.p.join(" ")}`,$e=(e,t)=>`${ne(e)}#${t}`;function on(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||o.meta==="!COLOUR"){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:$e(e.name,t),cmds:n}}function dt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...on(e,t).cmds.map(sn)].join(`\n`)+`\n`}function je(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 bt(e){let[t,n,r,s,o,i,c,u,f,a,l,m]=e,g=u*m-f*l,d=-(c*m-f*a),b=c*l-u*a,C=s*g+o*d+i*b;if(!Number.isFinite(C)||Math.abs(C)<0.000000000001)return null;let A=1/C,p=[g*A,-(o*m-i*l)*A,(o*f-i*u)*A,d*A,(s*m-i*a)*A,-(s*f-i*c)*A,b*A,-(s*l-o*a)*A,(s*u-o*c)*A];return[-(p[0]*t+p[1]*n+p[2]*r),-(p[3]*t+p[4]*n+p[5]*r),-(p[6]*t+p[7]*n+p[8]*r),...p]}var an=(e)=>String(+e.toFixed(6)||0),lt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function yt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(an).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${lt(t.texture)}${t.glossmap?" GLOSSMAP "+lt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${ne(e)}\n0 !TEXMAP END\n`;return{name:`${ne(e)}#tex-${je(r)}`,source:r}}var ln=(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 cn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),u=Math.sin(n*r),f=Math.cos(n*r);return[c*f,-c*u,i,o*u+s*i*f,o*f-s*i*u,-s*c,s*u-o*i*f,s*f+o*i*u,o*c]}var ct=new WeakMap;function xt(e){let t=ct.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=cn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:ln(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),ct.set(e,n),n}class Ve extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var un=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=ut))return!1;return!0},wt=999999,vt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Ct=new WeakMap,Mt=new WeakMap;function fn(e,t){let n=Mt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Ct.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},Mt.set(t,n);let r=n.parts.get(e);if(!r){let s=ne(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${je(o)}`,source:o},n.parts.set(e,r)}return r}function pn(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,u=0,f=new Set,a=t.maxInstances??2000000,l=0,m=(d,b)=>{let C=d.name+"#"+b,A=c.get(C);if(!A){let p;A=Object.assign(()=>p??=dt(d,b),{file:d,step:b}),c.set(C,A)}return A},g=(d,b,C,A,p,h,M,D,v=null,L=[],R=[],T=void 0,x=null)=>{let w=d.files.get(b);if(!w||M>r||f.has(w))return;if(++l>a)throw new Ve("model",a);f.add(w);let E=x,z=0,k=M>0?++u:0,P=i&&k?[...L,k]:L,Y=i&&k?[...R,C]:R,I=i&&!v?new Map:null,j=-1,H=0,Z=(S,y,B,_,W,X,N)=>{if(j!==z)j=z,H=0;let q=I?.get(z+"|"+y);if(q)return q.n++,g(S,S===d?y:S.main,B,_,p+"/"+y,[...W,wt],M+1,X,[...W,wt],P,Y,N,E);let U=[...W,H++],F=n.length;g(S,S===d?y:S.main,B,_,p+"/"+y,U,M+1,X,v,P,Y,N,E),I?.set(z+"|"+y,{n:1,from:F,to:n.length})},O=xt(w),G=s?gt(w):[],K=0,J=(S,y,B,_,W,X,N,q,U)=>{if(v)_=v;if(++l>a)throw new Ve("model",a);let F={part:S,color:y,m:B,step:_[0],steps:_,localStep:W,path:p};if(q)F.colour=q;if(k){if(F.sub=k,i)F.subPath=P,F.subMats=Y}if(X)F.embedded=!0;if(N){let re=yt(S,N);F.texPart=re.name,F.texSource=re.source}else if(U){let re=fn(S,U);F.colPart=re.name,F.colSource=re.source}let V=O[W];if(V)F.view=V;return n.push(F),F},Q=(S)=>{while(K<G.length&&G[K]<=S){let y=G[K++];J($e(w.name,y),A,C,[...h,y],y,!1,null,T,x).source=m(w,y)}};for(let S of w.cmds){if(S.t===0&&S.step){z++;continue}let y=S;if(y.t>=2||y.t===0&&y.geom&&y.geom.t>=2){Q(z);continue}if(y.t===0){if(y.meta==="!COLOUR"){let V=hn(y.text);if(V&&V.code!==16&&V.code!==24)Ct.set(V,y.text),(E=new Map(E??[])).set(V.code,V);continue}if(o&&y.geom?.t===1)y=y.geom;else continue}if(y.t!==1)continue;if(o&&y.fallback)continue;let B=ht(C,y.m);if(!un(B))continue;let _=y.color===16?A:y.color,W=y.color===16?T:E?.get(y.color),X=[...h,z],N=o?y.tex??D:null,q=N?bt(y.m):null,U=N&&q?mt(N,q):null;if(d.files.has(y.file)){if(ze(d,y.file)==="model"){Z(d,y.file,B,_,X,U,W);continue}J(y.file,_,B,X,z,!0,U,W,E);continue}let F=t.resolveModel?.(y.file);if(F){Z(F,y.file,B,_,X,U,W);continue}J(y.file,_,B,X,z,!1,U,W,E)}if(Q(1/0),f.delete(w),I){for(let S of I.values())if(S.n>1)for(let y=S.from;y<S.to;y++)n[y].mult??=S.n}};if(ze(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ne],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,Ne,16,e.main,[],0,null),n}function Tt(e,t="main.ldr",n){return pn(pt(e,t,{geometryText:!0}),n)}var mn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function _e(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function At(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=_e(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function hn(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",c=255,u=0,f={type:"default"},a=1;while(a<n.length){let l=n[a].toUpperCase(),m=n[a+1];if(l==="CODE")s=m!==void 0&&De.test(m)?Ue(m):m!==void 0&&/^\\d+$/.test(m)?+m:NaN,a+=2;else if(l==="VALUE"){let g=_e(m);if(g)o=g;a+=2}else if(l==="EDGE")i=_e(m)??m,a+=2;else if(l==="ALPHA")c=+m,a+=2;else if(l==="LUMINANCE")u=+m,a+=2;else if(l==="CHROME")f={type:"chrome"},a+=1;else if(l==="PEARLESCENT")f={type:"pearlescent"},a+=1;else if(l==="RUBBER")f={type:"rubber"},a+=1;else if(l==="MATTE_METALLIC")f={type:"matte_metallic"},a+=1;else if(l==="METAL")f={type:"metal"},a+=1;else if(l==="MATERIAL"){let g=(n[a+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:d,next:b}=At(n,a+2);f={type:"glitter",material:d},a=b}else if(g==="SPECKLE"){let{grain:d,next:b}=At(n,a+2);f={type:"speckle",material:d},a=b}else if(g==="FABRIC"){let d=(n[a+2]||"").toUpperCase(),b=["VELVET","CANVAS","STRING","FUR"].includes(d)?d.toLowerCase():void 0;f={type:"fabric",kind:b},a+=b?3:2}else a=n.length}else if(mn.has(l))a+=1;else a+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(u)?u:0,finish:f}}function gn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function He(e){let t=gn(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function dn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(ne(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(ne(t),r)}let u=i.trim().replace(/\\s+/g," ");if(u)r.push(u)}return n}var bn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?ne(t.slice(14).join(" ")):null};function yn(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 Lt(e,t,n="main.ldr"){let r=dn(e,n),s=new Map;for(let o of t){let i=ne(o);if(!r.has(i)||s.has(i))continue;let c=new Set([i]),u=[i];while(u.length)for(let a of r.get(u.pop())){let l=bn(a);if(l&&r.has(l)&&!c.has(l))c.add(l),u.push(l)}let f=[i,...[...c].filter((a)=>a!==i).sort()].map((a)=>"0 FILE "+(a===i?"":a)+`\n`+r.get(a).join(`\n`)).join(`\n`);s.set(i,`emb/${yn(f)}.dat`)}return s}var St=(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,Et=new WeakMap;function Ge(e,t){let n=Et.get(e);if(!n)Et.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),c=[],u=[];s.studs.forEach((m,g)=>{c.push(m[0]),u.push(m[1]);for(let d=0;d<12;d++)i[g*12+d]=m[2+d]});let f=null,a=0,l=0;if(s.mask){a=s.mask[0],l=s.mask[1];let m=s.mask[2];f=new Uint8Array(m.length);for(let g=0;g<m.length;g++)f[g]=m.charCodeAt(g)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:c,color:u,mask:f,nx:a,nz:l}),r}var fe=1073741824;class We{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,c=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&c[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,c=this.b,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,c[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&c[s]===t&&u[s]===n){let f=this.vals[s];return this.vals[s]=r,f}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 pe=(e,t,n)=>e>-fe&&e<fe&&t>-fe&&t<fe&&n>-fe&&n<fe,de=2147483647;function xn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function wn(e,t,n){let s=new Map,o=(I)=>{let j=s.get(I);if(j===void 0)s.set(I,j=xn(t,I));return j},i=[],c=[],u=[],f=[],a=[],l=[],m=[],g=[],d=[],b=new We(e.length*2),C=[],A=[];for(let I=0;I<e.length;I++){let j=e[I],H=j.m,Z=t.parts[j.part];if(!Z||!Z.mask||!St(H)||o(j.color))continue;let O=Z.bbox,G=1/0,K=-1/0,J=1/0,Q=-1/0;for(let U=0;U<2;U++)for(let F=0;F<2;F++){let V=U?O[3]:O[0],re=F?O[5]:O[2],oe=H[0]+H[3]*V+H[5]*re,se=H[2]+H[9]*V+H[11]*re;if(oe<G)G=oe;if(oe>K)K=oe;if(se<J)J=se;if(se>Q)Q=se}let S=Math.round((H[1]+O[4])*2),y=Ge(t,j.part),B=Math.floor(G/40),_=Math.floor(K/40),W=Math.floor(J/40),X=Math.floor(Q/40);if(!((_-B+1)*(X-W+1)<=65536)||!pe(S,B,W)||!pe(S,_,X))continue;let N=-1;for(let U=b.get(S,B,W),F=0;U>=0&&F<8;U=C[U],F++){let V=A[U];if(i[V]!==G||c[V]!==K||u[V]!==J||f[V]!==Q||m[V]!==y)continue;let re=e[a[V]].m,oe=!0;for(let se=0;se<12;se++)if(re[se]!==H[se]){oe=!1;break}if(oe){N=V;break}}if(N>=0){let U=n?n[I]:0;if(n&&U<n[a[N]])l[N]=a[N],a[N]=I;else if(l[N]<0||n&&U<n[l[N]])l[N]=I;continue}let q=a.length;i.push(G),c.push(K),u.push(J),f.push(Q),a.push(I),l.push(-1),m.push(y),g.push(O[0]),d.push(O[2]);for(let U=B;U<=_;U++)for(let F=W;F<=X;F++){if(!pe(S,U,F))continue;let V=A.length;A.push(q),C.push(b.put(S,U,F,V))}}let p=[0,5,-5,5,-5],h=[0,5,5,-5,-5],M=NaN,D=NaN,v=NaN,L=-1,R=(I,j,H,Z)=>{let O=Math.round(j*2),G=Math.floor(I/40),K=Math.floor(H/40);if(!pe(O,G,K))return de;let J=de;if(O!==M||G!==D||K!==v)M=O,D=G,v=K,L=b.get(O,G,K);for(let Q=L;Q>=0;Q=C[Q]){let S=A[Q],y=a[S];if(y===Z&&(y=l[S])<0)continue;if(!(I-6>=i[S]-0.5&&I+6<=c[S]+0.5&&H-6>=u[S]-0.5&&H+6<=f[S]+0.5))continue;let B=e[a[S]].m,_=m[S],W=g[S],X=d[S],N=I-B[0],q=j-B[1],U=H-B[2],F=B[3]*N+B[6]*q+B[9]*U,V=B[5]*N+B[8]*q+B[11]*U,{nx:re,nz:oe,mask:se}=_,ce=!0;for(let ie=0;ie<5;ie++){let ae=Math.floor((F+p[ie]-W)/20),ue=Math.floor((V+h[ie]-X)/20);if(ae<0||ue<0||ae>=re||ue>=oe||se[ae*oe+ue]!==1){ce=!1;break}}if(ce){if(!n)return 0;let ie=n[y];if(ie<J)J=ie}}return J},T=0;for(let I of e){let j=Ge(t,I.part);if(j)T+=j.nStuds}let x=new Uint8Array(T),w=new Uint8Array(T),E=new We(T),z=0,k=n?new Int32Array(T).fill(de):void 0;for(let I=0,j=0;I<e.length;I++){let H=e[I],Z=Ge(t,H.part);if(!Z)continue;let O=H.m,G=Z.studM,K=O[0],J=O[1],Q=O[2],S=O[3],y=O[4],B=O[5],_=O[6],W=O[7],X=O[8],N=O[9],q=O[10],U=O[11];for(let F=0;F<Z.nStuds;F++,j++){let V=F*12,re=G[V+4],oe=G[V+7],se=G[V+10];if(!(Math.abs(_*re+W*oe+X*se-1)<0.001&&Math.abs(S*re+y*oe+B*se)<0.001&&Math.abs(N*re+q*oe+U*se)<0.001))continue;w[j]=1;let ce=G[V],ie=G[V+1],ae=G[V+2],ue=K+S*ce+y*ie+B*ae,Ke=J+_*ce+W*ie+X*ae,Xe=Q+N*ce+q*ie+U*ae,Ze=R(ue,Ke,Xe,I);if(Ze!==de){if(x[j]=1,z++,k)k[j]=Ze}let be=Math.round(ue),ye=Math.round(Ke),xe=Math.round(Xe);if(!pe(be,ye,xe))continue;if(!n){E.put(be,ye,xe,1);continue}let Ye=n[I],Je=E.get(be,ye,xe);if(Je<0||Ye<Je)E.put(be,ye,xe,Ye)}}let P=new Uint8Array(e.length),Y=n?new Int32Array(e.length).fill(de):void 0;for(let I=0;I<e.length;I++){let j=e[I],H=t.parts[j.part];if(!H||!H.under||!St(j.m)||o(j.color))continue;let Z=H.bbox,O=Math.round((Z[3]-Z[0])/20),G=Math.round((Z[5]-Z[2])/20);if(!O||!G||O*G>4096)continue;let K=j.m,J=!0,Q=0;for(let S=0;S<O&&J;S++)for(let y=0;y<G;y++){let B=Z[0]+10+20*S,_=Z[2]+10+20*y,W=K[0]+K[3]*B+K[5]*_,X=K[2]+K[9]*B+K[11]*_,N=Math.round(W),q=Math.round(K[1]+Z[4]),U=Math.round(X),F=pe(N,q,U)?E.get(N,q,U):-1;if(F<0){J=!1;break}if(F>Q)Q=F}if(J){if(P[I]=1,Y)Y[I]=Q}}return{nStuds:T,studHidden:x,studUp:w,underHidden:P,studsHidden:z,studHideStep:k,underHideStep:Y}}function Mn(e,t,n){let r=(l)=>l.colPart&&t.parts[l.colPart]?l.colPart:n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let m=l.colour;if(!m)return String(l.color);let g=o.get(m);if(g!==void 0)return g;let d=t.colorTable?.[l.color],b=d?.hex??t.colors?.[l.color],C=d?He({alpha:d.alpha??255,luminance:d.luminance??0,finish:d.finish??{type:"default"}}):"default:op",A=He(m);if(g=b&&b.toUpperCase()===m.hex.toUpperCase()&&C===A?String(l.color):m.hex.toUpperCase()+"/"+A,g!==String(l.color))s.set(g,m);return o.set(m,g),g},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),u=c.map((l)=>vt(l.steps)),f=[...new Set(u)].sort(),a=new Map(f.map((l,m)=>[l,m]));return{all:c,stepOf:u.map((l)=>a.get(l)),nSteps:f.length,localColours:s}}function Ce(e,t,n=!0){let r=Mn(e,t,n);return wn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var ke="https://ldr-demo.vercel.app/cdn/v1/",Le=new Map,Te=new Map;function Se(e=ke,t=fetch){let n=Le.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(()=>Le.delete(e)),Le.set(e,n);return n}var An=(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"),Ee=(e,t)=>An(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ee(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ee(r,t)])):e;function vn(e,t={}){let n=[],r=0,s={},o={};for(let m of e){let g=m.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let d=new DataView(g).getUint32(0,!0),b=new Uint8Array(g,4+d),C=r;n.push(b),r+=b.byteLength;let A=(4-r%4)%4;if(A)n.push(new Uint8Array(A)),r+=A;for(let[p,h]of Object.entries(m.header.parts??{}))if(!(p in s))s[p]=Ee(h,C);for(let[p,h]of Object.entries(m.header.studKinds??{}))if(!(p in o))o[p]=Ee(h,C)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+c.length)%4)%4,f=4+c.length+u,a=new Uint8Array(f+r);new DataView(a.buffer).setUint32(0,c.length+u,!0),a.set(c,4),a.fill(32,4+c.length,f);let l=f;for(let m of n)a.set(m,l),l+=m.byteLength;return ve(a.buffer)}async function Cn(e,t={}){e=[...e];try{return await kt(e,t)}catch(n){let r=t.cdn??ke,s=t.fetch??fetch;Le.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await kt(e,{...t,fetch:o})}catch{throw n}}}async function kt(e,t){let n=t.cdn??ke,r=t.fetch??fetch,s=t.gap??16384,o=await Se(n,r),i=[...new Set([...e].map(ne))],c=[],u=[];for(let p of i){if(Te.has(n+p))continue;let h=o.parts[p];if(h)u.push({name:p,off:h[0],len:h[1],file:h[2]??0});else c.push(p)}u.sort((p,h)=>p.file-h.file||p.off-h.off);let f=[];for(let p of u){let h=f[f.length-1];if(h&&h.file===p.file&&p.off-h.end<=s)h.end=Math.max(h.end,p.off+p.len),h.items.push(p);else f.push({file:p.file,start:p.off,end:p.off+p.len,items:[p]})}let a=0,l=0,m=0,g=new Map,d=async()=>{while(m<f.length){let p=f[m++],h=g.get(p.file);if(h)h=h.subarray(p.start,p.end);else{let M=await r(new URL(o.archives[p.file],n).href,{headers:{Range:`bytes=${p.start}-${p.end-1}`,"Accept-Encoding":"identity"}});if(!M.ok)throw Error(`ldr: parts CDN ${M.status}`);if(l++,h=new Uint8Array(await M.arrayBuffer()),a+=h.byteLength,M.status===200)g.set(p.file,h),h=h.subarray(p.start,p.end)}for(let M of p.items){let D=Ae(h.subarray(M.off-p.start,M.off-p.start+M.len)),v=D.buffer.slice(D.byteOffset,D.byteOffset+D.byteLength);Te.set(n+M.name,ve(v))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,f.length)},d));let b=i.filter((p)=>Te.has(n+p)).map((p)=>Te.get(n+p)),C={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:b.length?vn(b,C):ve(Tn(C)),missing:c,requests:l,bytes:a}}function Tn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...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 Ln(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 Pt(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let c of e){let u=c.embedded?t.get(c.part):ne(c.part),f=u?n.parts[u]:void 0;if(!f)continue;if(f[3]!=null)o=!0,r+=f[3];if(!i.has(u))i.add(u),s+=f[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 It(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Se(t.cdn??ke,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(x)=>{if(!x.ok)throw Error(`ldr: ${x.status} fetching ${e}`);return et(await x.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":tt(e)),u=Tt(o,c,{looseGeometry:!1,callouts:t.callouts}),f=performance.now();t.onParsed?.(u),await s;let a=Lt(o,new Set(u.filter((x)=>x.embedded).map((x)=>x.part)),c),l=(x,w)=>t.maxBodyTris!=null&&x>t.maxBodyTris||t.maxPackBytes!=null&&w>t.maxPackBytes,m=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(x)=>new Pe({...x,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),d="full";if(m){let x=Pt(u,a,await s);if(l(x.known?x.bodyTris:0,x.packBytes)){if(!t.lowCdn)throw g(x);let w=await Se(t.lowCdn,r).catch(()=>null);if(!w)throw g(x);let E=Pt(u,a,w);if(l(E.known?E.bodyTris:0,E.packBytes))throw g(E);d="low"}}let b=[...u.filter((x)=>!x.embedded).map((x)=>x.part),...a.values()],C=async()=>{let x=await Cn(b,d==="low"?{...t,cdn:t.lowCdn}:t);for(let[w,E]of a){let z=x.pack.header.parts[E];if(z)x.pack.header.parts[w]=z}return{...x,packBytes:x.pack.buffer?.byteLength??x.pack.bytes??0,bodyTris:Ln(u,x.pack)}},A=await C();if(m&&l(A.bodyTris,A.packBytes)&&d==="full"&&t.lowCdn&&await Se(t.lowCdn,r).then(()=>!0,()=>!1)){d="low";let x=A;A=await C(),A.requests+=x.requests,A.bytes+=x.bytes}if(m&&l(A.bodyTris,A.packBytes))throw g(A);let{pack:p,missing:h,requests:M,bytes:D}=A,v=new Map([...a].map(([x,w])=>[w,x])),L=h.map((x)=>v.get(x)??x),R=performance.now(),T=t.cull?Ce(u,p.header,t.textures!==!1):void 0;return{insts:u,pack:p,tier:d,missing:L,requests:M,bytes:D,cull:T,timings:{fetchModel:i-n,parse:f-i,parts:R-f,...T?{cull:performance.now()-R}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await It(n,{...r,cull:!1,onParsed:(a)=>self.postMessage({id:t,insts:a})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),c=Ce(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,f=[];for(let a of[c.studHidden,c.studUp,c.underHidden,c.studHideStep,c.underHideStep])if(a)f.push(a.buffer);self.postMessage({id:t,cull:c,ms:u},f)}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';
5078
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/load-worker.gen.ts
5079
+ var load_worker_gen_default = 'var zt=ArrayBuffer,Q=Uint8Array,Me=Uint16Array,$t=Int16Array;var Ae=Int32Array,De=function(e,t,n){if(Q.prototype.slice)return Q.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 Q(n-t);return r.set(e.subarray(t,n)),r},he=function(e,t,n,r){if(Q.prototype.fill)return Q.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},jt=function(e,t,n,r){if(Q.prototype.copyWithin)return Q.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 Vt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],q=function(e,t,n){var r=Error(t||Vt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,q);if(!n)throw r;return r},ot=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},_t=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Gt=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,c=r>>6;if(r&8)q(0);var u=6-s,f=i==3?4:i,a=ot(e,u,f);u+=f;var l=c?1<<c:s,m=ot(e,u,l)+(c==1&&256),g=m;if(!s){var b=1<<10+(e[5]>>3);g=b+(b>>3)*(e[5]&7)}if(g>2145386496)q(1);var y=new Q((t==1?m||g:t?0:g)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+l,y:0,l:0,d:a,w:t&&t!=1?t:y.subarray(12),e:g,o:new Ae(y.buffer,0,3),u:m,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return _t(e,4)+8;q(0)},ue=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ge=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)q(3);var o=1<<s,i=o,c=-1,u=-1,f=-1,a=o,l=new zt(512+(o<<2)),m=new $t(l,0,256),g=new Me(l,0,256),b=new Me(l,512,o),y=512+(o<<1),A=new Q(l,y,o),v=new Q(l,y+o);while(c<255&&i>0){var p=ue(i+1),h=r>>3,M=(1<<p+1)-1,z=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(r&7)&M,C=(1<<p)-1,L=M-i-1,I=z&C;if(I<L)r+=p,z=I;else if(r+=p+1,z>C)z-=L;if(m[++c]=--z,z==-1)i+=z,A[--a]=c;else i-=z;if(!z)do{var S=r>>3;u=(e[S]|e[S+1]<<8)>>(r&7)&3,r+=2,c+=u}while(u==3)}if(c>255||i)q(0);var w=0,x=(o>>1)+(o>>3)+3,P=o-1;for(var O=0;O<=c;++O){var E=m[O];if(E<1){g[O]=-E;continue}for(f=0;f<E;++f){A[w]=O;do w=w+x&P;while(w>=a)}}if(w)q(0);for(f=0;f<o;++f){var F=g[A[f]]++,X=v[f]=s-ue(F);b[f]=(F<<X)-o}return[r+7>>3,{b:s,s:A,n:v,t:b}]},Ht=function(e,t){var n=0,r=-1,s=new Q(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),u=new Me(s.buffer,268);if(o<128){var f=ge(e,t+1,6),a=f[0],l=f[1];t+=o;var m=a<<3,g=e[t];if(!g)q(0);var b=0,y=0,A=l.b,v=A,p=(++t<<3)-8+ue(g);for(;;){if(p-=A,p<m)break;var h=p>>3;if(b+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<A)-1,i[++r]=l.s[b],p-=v,p<m)break;h=p>>3,y+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<v)-1,i[++r]=l.s[y],A=l.n[b],b=l.t[b],v=l.n[y],y=l.t[y]}if(++r>255)q(0)}else{r=o-127;for(;n<r;n+=2){var M=e[++t];i[n]=M>>4,i[n+1]=M&15}++t}var z=0;for(n=0;n<r;++n){var C=i[n];if(C>11)q(0);z+=C&&1<<C-1}var L=ue(z)+1,I=1<<L,S=I-z;if(S&S-1)q(0);i[r++]=ue(S)+1;for(n=0;n<r;++n){var C=i[n];++c[i[n]=C&&L+1-C]}var w=new Q(I<<1),x=w.subarray(0,I),P=w.subarray(I);u[L]=0;for(n=L;n>0;--n){var O=u[n];he(P,n,O,u[n-1]=O+c[n]*(1<<L-n))}if(u[0]!=I)q(0);for(n=0;n<r;++n){var E=i[n];if(E){var F=u[E];he(x,n,F,u[E]=F+(1<<L-E))}}return[t,{n:P,b:L,s:x}]},Wt=ge(new Q([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Kt=ge(new Q([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],Xt=ge(new Q([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],it=function(e,t){var n=e.length,r=new Ae(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ue=new Q(new Ae([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Zt=it(Ue,0),Oe=new Q(new Ae([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Yt=it(Oe,3),me=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)q(0);var u=0,f=n.b,a=(r<<3)-8+ue(o)-f,l=-1;for(;a>c&&l<s;){var m=a>>3,g=(e[m]|e[m+1]<<8|e[m+2]<<16)>>(a&7);u=(u<<f|g)&i,t[++l]=n.s[u],a-=f=n.n[u]}if(a!=c||l+1!=s)q(0)},Jt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;me(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),me(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),me(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),me(e.subarray(r),t.subarray(c),n)},Qt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return he(n,e[s],t.y,t.y+=c),n;return he(new Q(c),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=c,n;return De(e,s,u)}if(i==2){var f=e[s],a=f&3,l=f>>2&3,m=f>>4,g=0,b=0;if(a<2)if(l&1)m|=e[++s]<<4|(l&2&&e[++s]<<12);else m=f>>3;else if(b=l,l<2)m|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(l==2)m|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else m|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new Q(t.m),A=y.length-m;if(a==0)y.set(e.subarray(s,s+=m),A);else if(a==1)he(y,e[s++],A);else{var v=t.h;if(a==2){var p=Ht(e,s);g+=s-(s=p[0]),t.h=v=p[1]}else if(!v)q(0);(b?Jt:me)(e.subarray(s,s+=g),y.subarray(A),v)}var h=e[s++];if(h){if(h==255)h=(e[s++]|e[s++]<<8)+32512;else if(h>127)h=h-128<<8|e[s++];var M=e[s++];if(M&3)q(0);var z=[Kt,Xt,Wt];for(var C=2;C>-1;--C){var L=M>>(C<<1)+2&3;if(L==1){var I=new Q([0,0,e[s++]]);z[C]={s:I.subarray(2,3),n:I.subarray(0,1),t:new Me(I.buffer,0,1),b:0}}else if(L==2)r=ge(e,s,9-(C&1)),s=r[0],z[C]=r[1];else if(L==3){if(!t.t)q(0);z[C]=t.t[C]}}var S=t.t=z,w=S[0],x=S[1],P=S[2],O=e[u-1];if(!O)q(0);var E=(u<<3)-8+ue(O)-P.b,F=E>>3,X=0,se=(e[F]|e[F+1]<<8)>>(E&7)&(1<<P.b)-1;F=(E-=x.b)>>3;var oe=(e[F]|e[F+1]<<8)>>(E&7)&(1<<x.b)-1;F=(E-=w.b)>>3;var ae=(e[F]|e[F+1]<<8)>>(E&7)&(1<<w.b)-1;for(++h;--h;){var le=P.s[se],R=P.n[se],U=w.s[ae],B=w.n[ae],G=x.s[oe],k=x.n[oe];F=(E-=G)>>3;var T=1<<G,d=T+((e[F]|e[F+1]<<8|e[F+2]<<16|e[F+3]<<24)>>>(E&7)&T-1);F=(E-=Oe[U])>>3;var j=Yt[U]+((e[F]|e[F+1]<<8|e[F+2]<<16)>>(E&7)&(1<<Oe[U])-1);F=(E-=Ue[le])>>3;var N=Zt[le]+((e[F]|e[F+1]<<8|e[F+2]<<16)>>(E&7)&(1<<Ue[le])-1);if(F=(E-=R)>>3,se=P.t[se]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<R)-1),F=(E-=B)>>3,ae=w.t[ae]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<B)-1),F=(E-=k)>>3,oe=x.t[oe]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<k)-1),d>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=d-=3;else{var D=d-(N!=0);if(D){if(d=D==3?t.o[0]-1:t.o[D],D>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=d}else d=t.o[0]}for(var C=0;C<N;++C)y[X+C]=y[A+C];X+=N,A+=N;var V=X-d;if(V<0){var _=-V,Y=t.e+V;if(_>j)_=j;for(var C=0;C<_;++C)y[X+C]=t.w[Y+C];X+=_,j-=_,V=0}for(var C=0;C<j;++C)y[X+C]=y[V+C];X+=j}if(X!=A)while(A<y.length)y[X++]=y[A++];else X=y.length;if(n)t.y+=X;else y=De(y,0,X)}else if(n){if(t.y+=m,A)for(var C=0;C<m;++C)y[C]=y[A+C]}else if(A)y=De(y,A);return t.b=u,y}q(2)},qt=function(e,t){if(e.length==1)return e[0];var n=new Q(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 ve(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Gt(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 c=Qt(e,i,t);if(!c)q(5);if(t)i.e=i.y;else n.push(c),o+=c.length,jt(i.w,0,c.length),i.w.set(c,i.w.length-c.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return qt(n,o)}async function en(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(ve(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 at(e){return new TextDecoder().decode(await en(e))}var lt=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function Ce(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 ee=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),ze=/^[A-Za-z][A-Za-z0-9_]*$/,Ne=new Map;function $e(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Ne.has(r))Ne.set(r,t);return r}function je(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&ze.test(e))return $e(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var ct=/^~?\\s*moved\\s+to\\s+(.+)$/i,tn=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),nn=new Set(["FILE","NOFILE","!DATA"]),bt=1000000000000000,yt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),rn=new Set(["model","submodel","configuration"]),sn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function ut(e){let t=sn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return yt.has(n)||rn.has(n)?n:void 0}function on(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 an(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((l)=>Number.isFinite(l)&&Math.abs(l)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let l=0;l<s;l++)c=c.replace(/^\\S+\\s*/,"");let u=on(c);if(!u.length)return null;let f={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)f.a=i[9];if(s===11)f.b=i[10];let a=u.findIndex((l,m)=>m>0&&l.toUpperCase()==="GLOSSMAP");if(a>0&&u[a+1])f.glossmap=u[a+1];if(t)f.next=!0;return f}var ln=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,"");if(t.length%4===1)t=t.slice(0,-1);let 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 cn(e){let t=e.length,n=1,r=(a)=>a===32||a===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let a=n;while(n<t&&!r(e.charCodeAt(n)))n++;return a<n?e.slice(a,n):null},o=s();if(o===null)return null;let i=Array(12);for(let a=0;a<12;a++){let l=s();if(l===null)return null;let m=+l;if(!Number.isFinite(m))return null;i[a]=m}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let c=e.slice(n),u=/[ \\t]{2,}|\\t/.test(c)?c.split(/\\s+/).join(" "):c,f=je(o);if(!Number.isFinite(f))return null;return{t:1,color:f,m:i,file:ee(u)}}var un=[0,12,6,9,12,12];function ft(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=je(e[1]),r=un[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=ee(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function xt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,u=null,f=[],a=null,l=()=>{if(!u)return;let p=ln(u.chunks.join("")),h=p[0]===137&&p[1]===80&&p[2]===78&&p[3]===71;(c??=new Map).set(ee(u.name),{name:u.name,bytes:p,...h?{mime:"image/png"}:{}}),u=null},m=!0,g=(p)=>{if(l(),o={name:ee(p),cmds:[]},s.set(o.name,o),!i)i=o.name;f=[],a=null,m=!0},b=!1,y=!1,A=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},v=(p,h)=>{if(a){p.tex=a,a=null;return}let M=f[f.length-1];if(!M)return;if(M.fallback){if(!h)p.fallback=!0}else p.tex=M.map};for(let p of e.split(`\n`)){let h=p.trim();if(!h)continue;if(r&&h.charCodeAt(0)>=50&&h.charCodeAt(0)<=53&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){if(u||b)continue;if(!o)g(t);let L=h.slice(2).trimStart(),I=L.search(/\\s/),S={t:h.charCodeAt(0)-48,color:je(I<0?L:L.slice(0,I)),p:[],src:h};v(S,!1),o.cmds.push(S),m=!1;continue}if(h.charCodeAt(0)===48&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){let L=2;while(h.charCodeAt(L)===32||h.charCodeAt(L)===9)L++;let I=L;while(I<h.length&&h.charCodeAt(I)!==32&&h.charCodeAt(I)!==9)I++;let S=h.slice(L,I),w=/[^\\x21-\\x7e]/.test(S)?h.slice(L).trim().split(/\\s+/)[0]:S;if(!tn.has(w)&&!(w.length>=4&&w.length<=6&&nn.has(w.toUpperCase()))){if(b||u)continue;if(!o)g(t);let x=h.slice(L),P={t:0,text:x};if(S.charCodeAt(0)===33)P.meta=S;if(a=null,m&&!o.org){let E=ut(x);if(E)o.org=E}let O=x.match(ct);if(O&&!o.movedTo){let E=O[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(E))E+=".dat";o.movedTo=ee(E)}o.cmds.push(P);continue}}if(h.charCodeAt(0)===49&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)&&!u&&!b){let L=cn(h);if(L){if(!o)g(t);v(L,!1),o.cmds.push(L),m=!1;continue}}let M=h.split(/\\s+/);if(+M[0]===0){let L=h.slice(1).trim(),I=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(I==="FILE"){let x=L.slice(5).trimStart().split("\\r")[0].trim();if(x){A(),b=!1,g(x);continue}}if(I==="NOFILE"){l(),o=null,b=!0;continue}if(I==="!DATA"){A(),l(),o=null,b=!1,u={name:L.slice(5).trim(),chunks:[]};continue}if(b)continue;if(u){if(M[1]==="!:")u.chunks.push(M.slice(2).join(""));continue}if(!o)g(t);let S={t:0,text:L};if(M[1]==="STEP")S.step=!0,f=[],a=null;else if(M[1]==="BFC")S.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(S.meta="ROTSTEP",S.step=!0,f=[],a=null,(M[2]??"").toUpperCase()==="END")S.rotstep={x:0,y:0,z:0,mode:"END"};else{let x=(M[5]??"REL").toUpperCase(),P=(O)=>{let E=Number(O);return Number.isFinite(E)?E:0};S.rotstep={x:P(M[2]),y:P(M[3]),z:P(M[4]),mode:["REL","ABS","ADD"].includes(x)?x:"REL"}}else if(M[1]==="BUFEXCHG"){S.meta="BUFEXCHG";let x=(M[2]??"").toUpperCase();S.bufexchg={op:x==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))S.meta=M[1];if(m&&!o.org){let x=ut(L);if(x)o.org=x}if(M[1]==="!TEXMAP"){let x=(M[2]??"").toUpperCase();if(a=null,x==="START"||x==="NEXT"){let P=an(L.replace(/^!TEXMAP\\s+\\S+/i,""),x==="NEXT");if(S.texmap={op:x,...P?{map:P}:{}},P)if((o.texmaps??=[]).push(P),x==="START")f.push({map:P,fallback:!1});else a=P}else if(x==="FALLBACK"){S.texmap={op:x};let P=f[f.length-1];if(P)P.fallback=!0}else if(x==="END")S.texmap={op:x},f.pop()}else if(M[1]==="!:"){a=null;let x=ft(M.slice(2));if(x)v(x,!0),S.geom=x}else a=null;let w=L.match(ct);if(w&&!o.movedTo){let x=w[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(x))x+=".dat";o.movedTo=ee(x)}o.cmds.push(S);continue}if(u||b)continue;if(!o)g(t);let C=ft(M);if(!C){if(/^[2-5][ \\t]/.test(h))m=!1;continue}v(C,!1),o.cmds.push(C),m=!1}return l(),c?{main:i,files:s,data:c}:{main:i,files:s}}var On=Math.PI/180;function wt(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 Mt(e,t){let[n,r,s,o,i,c,u,f,a,l,m,g]=e,[b,y,A,v,p,h,M,z,C,L,I,S]=t;return[o*b+i*y+c*A+n,u*b+f*y+a*A+r,l*b+m*y+g*A+s,o*v+i*M+c*L,o*p+i*z+c*I,o*h+i*C+c*S,u*v+f*M+a*L,u*p+f*z+a*I,u*h+f*C+a*S,l*v+m*M+g*L,l*p+m*z+g*I,l*h+m*C+g*S]}var Ve=[0,0,0,1,0,0,0,1,0,0,0,1];var pt=new WeakMap,fn=/^(s|8|48)\\//;function _e(e,t){let n=e.files.get(ee(t));if(!n)return"part";let r=pt.get(n);if(r)return r;if(n.org)r=yt.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&&fn.test(s.file))?"part":"model";return pt.set(n,r),r}var mt=new WeakMap;function At(e){let t=mt.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 mt.set(e,t),t}var ht=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Ne.get(e)??String(e):String(e),pn=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${ht(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${ht(e.color)} ${e.p.join(" ")}`,Ge=(e,t)=>`${ee(e)}#${t}`;function mn(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||o.meta==="!COLOUR"){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:Ge(e.name,t),cmds:n}}function vt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...mn(e,t).cmds.map(pn)].join(`\n`)+`\n`}function He(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 Ct(e){let[t,n,r,s,o,i,c,u,f,a,l,m]=e,g=u*m-f*l,b=-(c*m-f*a),y=c*l-u*a,A=s*g+o*b+i*y;if(!Number.isFinite(A)||Math.abs(A)<0.000000000001)return null;let v=1/A,p=[g*v,-(o*m-i*l)*v,(o*f-i*u)*v,b*v,(s*m-i*a)*v,-(s*f-i*c)*v,y*v,-(s*l-o*a)*v,(s*u-o*c)*v];return[-(p[0]*t+p[1]*n+p[2]*r),-(p[3]*t+p[4]*n+p[5]*r),-(p[6]*t+p[7]*n+p[8]*r),...p]}var hn=(e)=>String(+e.toFixed(6)||0),gt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Tt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(hn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${gt(t.texture)}${t.glossmap?" GLOSSMAP "+gt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${ee(e)}\n0 !TEXMAP END\n`;return{name:`${ee(e)}#tex-${He(r)}`,source:r}}var gn=(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 dn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),u=Math.sin(n*r),f=Math.cos(n*r);return[c*f,-c*u,i,o*u+s*i*f,o*f-s*i*u,-s*c,s*u-o*i*f,s*f+o*i*u,o*c]}var dt=new WeakMap;function Lt(e){let t=dt.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=dn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:gn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),dt.set(e,n),n}class We extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var bn=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=bt))return!1;return!0},St=999999,Pt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Ft=new WeakMap,Et=new WeakMap;function yn(e,t){let n=Et.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Ft.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},Et.set(t,n);let r=n.parts.get(e);if(!r){let s=ee(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${He(o)}`,source:o},n.parts.set(e,r)}return r}function xn(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,u=0,f=new Set,a=t.maxInstances??2000000,l=0,m=(b,y)=>{let A=b.name+"#"+y,v=c.get(A);if(!v){let p;v=Object.assign(()=>p??=vt(b,y),{file:b,step:y}),c.set(A,v)}return v},g=(b,y,A,v,p,h,M,z,C=null,L=[],I=[],S=void 0,w=null)=>{let x=b.files.get(y);if(!x||M>r||f.has(x))return;if(++l>a)throw new We("model",a);f.add(x);let P=w,O=0,E=M>0?++u:0,F=i&&E?[...L,E]:L,X=i&&E?[...I,A]:I,se=i&&!C?new Map:null,oe=-1,ae=0,le=(T,d,j,N,D,V,_)=>{if(oe!==O)oe=O,ae=0;let Y=se?.get(O+"|"+d);if(Y)return Y.n++,g(T,T===b?d:T.main,j,N,p+"/"+d,[...D,St],M+1,V,[...D,St],F,X,_,P);let J=[...D,ae++],H=n.length;g(T,T===b?d:T.main,j,N,p+"/"+d,J,M+1,V,C,F,X,_,P),se?.set(O+"|"+d,{n:1,from:H,to:n.length})},R=Lt(x),U=s?At(x):[],B=0,G=(T,d,j,N,D,V,_,Y,J)=>{if(C)N=C;if(++l>a)throw new We("model",a);let H={part:T,color:d,m:j,step:N[0],steps:N,localStep:D,path:p};if(Y)H.colour=Y;if(E){if(H.sub=E,i)H.subPath=F,H.subMats=X}if(V)H.embedded=!0;if(_){let ne=Tt(T,_);H.texPart=ne.name,H.texSource=ne.source}else if(J){let ne=yn(T,J);H.colPart=ne.name,H.colSource=ne.source}let W=R[D];if(W)H.view=W;return n.push(H),H},k=(T)=>{while(B<U.length&&U[B]<=T){let d=U[B++];G(Ge(x.name,d),v,A,[...h,d],d,!1,null,S,w).source=m(x,d)}};for(let T of x.cmds){if(T.t===0&&T.step){O++;continue}let d=T;if(d.t>=2||d.t===0&&d.geom&&d.geom.t>=2){k(O);continue}if(d.t===0){if(d.meta==="!COLOUR"){let W=Mn(d.text);if(W&&W.code!==16&&W.code!==24)Ft.set(W,d.text),(P=new Map(P??[])).set(W.code,W);continue}if(o&&d.geom?.t===1)d=d.geom;else continue}if(d.t!==1)continue;if(o&&d.fallback)continue;let j=Mt(A,d.m);if(!bn(j))continue;let N=d.color===16?v:d.color,D=d.color===16?S:P?.get(d.color),V=[...h,O],_=o?d.tex??z:null,Y=_?Ct(d.m):null,J=_&&Y?wt(_,Y):null;if(b.files.has(d.file)){if(_e(b,d.file)==="model"){le(b,d.file,j,N,V,J,D);continue}G(d.file,N,j,V,O,!0,J,D,P);continue}let H=t.resolveModel?.(d.file);if(H){le(H,d.file,j,N,V,J,D);continue}G(d.file,N,j,V,O,!1,J,D,P)}if(k(1/0),f.delete(x),se){for(let T of se.values())if(T.n>1)for(let d=T.from;d<T.to;d++)n[d].mult??=T.n}};if(_e(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ve],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,Ve,16,e.main,[],0,null),n}function Rt(e,t="main.ldr",n){return xn(xt(e,t,{geometryText:!0}),n)}var wn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Ke(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function kt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=Ke(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function Mn(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",c=255,u=0,f={type:"default"},a=1;while(a<n.length){let l=n[a].toUpperCase(),m=n[a+1];if(l==="CODE")s=m!==void 0&&ze.test(m)?$e(m):m!==void 0&&/^\\d+$/.test(m)?+m:NaN,a+=2;else if(l==="VALUE"){let g=Ke(m);if(g)o=g;a+=2}else if(l==="EDGE")i=Ke(m)??m,a+=2;else if(l==="ALPHA")c=+m,a+=2;else if(l==="LUMINANCE")u=+m,a+=2;else if(l==="CHROME")f={type:"chrome"},a+=1;else if(l==="PEARLESCENT")f={type:"pearlescent"},a+=1;else if(l==="RUBBER")f={type:"rubber"},a+=1;else if(l==="MATTE_METALLIC")f={type:"matte_metallic"},a+=1;else if(l==="METAL")f={type:"metal"},a+=1;else if(l==="MATERIAL"){let g=(n[a+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:b,next:y}=kt(n,a+2);f={type:"glitter",material:b},a=y}else if(g==="SPECKLE"){let{grain:b,next:y}=kt(n,a+2);f={type:"speckle",material:b},a=y}else if(g==="FABRIC"){let b=(n[a+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(b)?b.toLowerCase():void 0;f={type:"fabric",kind:y},a+=y?3:2}else a=n.length}else if(wn.has(l))a+=1;else a+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(u)?u:0,finish:f}}function An(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function Xe(e){let t=An(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function vn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(ee(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(ee(t),r)}let u=i.trim().replace(/\\s+/g," ");if(u)r.push(u)}return n}var Cn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?ee(t.slice(14).join(" ")):null};function Tn(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 It(e,t,n="main.ldr"){let r=vn(e,n),s=new Map;for(let o of t){let i=ee(o);if(!r.has(i)||s.has(i))continue;let c=new Set([i]),u=[i];while(u.length)for(let a of r.get(u.pop())){let l=Cn(a);if(l&&r.has(l)&&!c.has(l))c.add(l),u.push(l)}let f=[i,...[...c].filter((a)=>a!==i).sort()].map((a)=>"0 FILE "+(a===i?"":a)+`\n`+r.get(a).join(`\n`)).join(`\n`);s.set(i,`emb/${Tn(f)}.dat`)}return s}var Bt=(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,Dt=new WeakMap,Ze=null,Ye="",Je=null;function Qe(e,t){if(e===Ze&&t===Ye)return Je;let n=Dt.get(e);if(!n)Dt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return Ze=e,Ye=t,Je=r,r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],u=[];s.studs.forEach((m,g)=>{c.push(m[0]),u.push(m[1]);for(let b=0;b<12;b++)i[g*12+b]=m[2+b]});let f=null,a=0,l=0;if(s.mask){a=s.mask[0],l=s.mask[1];let m=s.mask[2];f=new Uint8Array(m.length);for(let g=0;g<m.length;g++)f[g]=m.charCodeAt(g)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:c,color:u,mask:f,nx:a,nz:l}),Ze=e,Ye=t,Je=r,r}var fe=1073741824;class be{t;tag;mask;size=0;shift;constructor(e=1024,t=-1){let n=1024;while(n<e*2)n*=2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.shift=t}slot(e,t,n){let r=this.shift;if(r<0){let o=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return o^=o>>>15,o=Math.imul(o,739982445),o^=o>>>12,o&this.mask}let s=Math.imul(e>>r+2,2654435761)^Math.imul(t,2246822507)^Math.imul(n>>r+2,3266489909);return s^=s>>>15,s=Math.imul(s,739982445),s^=s>>>12,(s<<4|(e>>r&3)<<2|n>>r&3)&this.mask}static tagOf(e,t,n){return Math.imul(e^Math.imul(t,374761393)^Math.imul(n,668265261),2654435761)>>>24|1}get(e,t,n){let r=be.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let u=s[c];if(u===0)return-1;if(u===r){let f=c<<2;if(o[f]===e&&o[f+1]===t&&o[f+2]===n)return o[f+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=be.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,u=this.slot(e,t,n);for(;;){let f=o[u],a=u<<2;if(f===0)return o[u]=s,i[a]=e,i[a+1]=t,i[a+2]=n,i[a+3]=r,this.size++,-1;if(f===s&&i[a]===e&&i[a+1]===t&&i[a+2]===n){let l=i[a+3];return i[a+3]=r,l}u=u+1&c}}grow(){let e=this.t,t=this.tag,n=t.length*2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.size=0;for(let r=0;r<t.length;r++)if(t[r]){let s=r<<2;this.put(e[s],e[s+1],e[s+2],e[s+3])}}}var pe=(e,t,n)=>e>-fe&&e<fe&&t>-fe&&t<fe&&n>-fe&&n<fe,de=2147483647;function Ln(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function Sn(e,t,n){let s=new Map,o=(R)=>{let U=s.get(R);if(U===void 0)s.set(R,U=Ln(t,R));return U},i=[],c=[],u=[],f=[],a=[],l=[],m=[],g=[],b=[],y=[],A=[],v=new be(e.length*2),p=[],h=[];for(let R=0;R<e.length;R++){let U=e[R],B=U.m,G=t.parts[U.part];if(!G||!G.mask||!Bt(B)||o(U.color))continue;let k=G.bbox,T=1/0,d=-1/0,j=1/0,N=-1/0;for(let K=0;K<2;K++)for(let Z=0;Z<2;Z++){let te=K?k[3]:k[0],ce=Z?k[5]:k[2],ie=B[0]+B[3]*te+B[5]*ce,re=B[2]+B[9]*te+B[11]*ce;if(ie<T)T=ie;if(ie>d)d=ie;if(re<j)j=re;if(re>N)N=re}let D=Math.round((B[1]+k[4])*2),V=Qe(t,U.part),_=Math.floor(T/40),Y=Math.floor(d/40),J=Math.floor(j/40),H=Math.floor(N/40);if(!((Y-_+1)*(H-J+1)<=65536)||!pe(D,_,J)||!pe(D,Y,H))continue;let W=-1;for(let K=v.get(D,_,J),Z=0;K>=0&&Z<8;K=p[K],Z++){let te=h[K];if(i[te]!==T||c[te]!==d||u[te]!==j||f[te]!==N||m[te]!==V)continue;let ce=e[a[te]].m,ie=!0;for(let re=0;re<12;re++)if(ce[re]!==B[re]){ie=!1;break}if(ie){W=te;break}}if(W>=0){let K=n?n[R]:0;if(n&&K<n[a[W]])l[W]=a[W],a[W]=R;else if(l[W]<0||n&&K<n[l[W]])l[W]=R;continue}let ne=a.length;i.push(T),c.push(d),u.push(j),f.push(N),a.push(R),l.push(-1),m.push(V),g.push(k[0]),b.push(k[2]),y.push(D),A.push(B[0],B[1],B[2],B[3],B[6],B[9],B[5],B[8],B[11]);for(let K=_;K<=Y;K++)for(let Z=J;Z<=H;Z++){if(!pe(D,K,Z))continue;let te=h.length;h.push(ne),p.push(v.put(D,K,Z,te))}}let M=[0,5,-5,5,-5],z=[0,5,5,-5,-5],C=(R,U,B,G)=>{if(!(U-6>=i[R]-0.5&&U+6<=c[R]+0.5&&G-6>=u[R]-0.5&&G+6<=f[R]+0.5))return!1;let k=R*9,T=m[R],d=g[R],j=b[R],N=U-A[k],D=B-A[k+1],V=G-A[k+2],_=A[k+3]*N+A[k+4]*D+A[k+5]*V,Y=A[k+6]*N+A[k+7]*D+A[k+8]*V,{nx:J,nz:H,mask:W}=T;for(let ne=0;ne<5;ne++){let K=Math.floor((_+M[ne]-d)/20),Z=Math.floor((Y+z[ne]-j)/20);if(K<0||Z<0||K>=J||Z>=H||W[K*H+Z]!==1)return!1}return!0},L=NaN,I=NaN,S=NaN,w=-1,x=-1,P=(R,U,B,G)=>{let k=Math.round(U*2),T=Math.floor(R/40),d=Math.floor(B/40);if(!pe(k,T,d))return de;let j=de;if(!n&&x>=0&&y[x]===k&&(a[x]!==G||l[x]>=0)&&C(x,R,U,B))return 0;if(k!==L||T!==I||d!==S)L=k,I=T,S=d,w=v.get(k,T,d);for(let N=w;N>=0;N=p[N]){let D=h[N],V=a[D];if(V===G&&(V=l[D])<0)continue;if(!C(D,R,U,B))continue;if(!n)return x=D,0;let _=n[V];if(_<j)j=_}return j},O=0;for(let R of e){let U=Qe(t,R.part);if(U)O+=U.nStuds}let E=new Uint8Array(O),F=new Uint8Array(O),X=new be(O,4),se=0,oe=n?new Int32Array(O).fill(de):void 0;for(let R=0,U=0;R<e.length;R++){let B=e[R],G=Qe(t,B.part);if(!G)continue;let k=B.m,T=G.studM,d=k[0],j=k[1],N=k[2],D=k[3],V=k[4],_=k[5],Y=k[6],J=k[7],H=k[8],W=k[9],ne=k[10],K=k[11];for(let Z=0;Z<G.nStuds;Z++,U++){let te=Z*12,ce=T[te+4],ie=T[te+7],re=T[te+10];if(!(Math.abs(Y*ce+J*ie+H*re-1)<0.001&&Math.abs(D*ce+V*ie+_*re)<0.001&&Math.abs(W*ce+ne*ie+K*re)<0.001))continue;F[U]=1;let Re=T[te],Ie=T[te+1],Be=T[te+2],qe=d+D*Re+V*Ie+_*Be,et=j+Y*Re+J*Ie+H*Be,tt=N+W*Re+ne*Ie+K*Be,nt=P(qe,et,tt,R);if(nt!==de){if(E[U]=1,se++,oe)oe[U]=nt}let ye=Math.round(qe),xe=Math.round(et),we=Math.round(tt);if(!pe(ye,xe,we))continue;if(!n){X.put(ye,xe,we,1);continue}let rt=n[R],st=X.get(ye,xe,we);if(st<0||rt<st)X.put(ye,xe,we,rt)}}let ae=new Uint8Array(e.length),le=n?new Int32Array(e.length).fill(de):void 0;for(let R=0;R<e.length;R++){let U=e[R],B=t.parts[U.part];if(!B||!B.under||!Bt(U.m)||o(U.color))continue;let G=B.bbox,k=Math.round((G[3]-G[0])/20),T=Math.round((G[5]-G[2])/20);if(!k||!T||k*T>4096)continue;let d=U.m,j=Math.round(d[1]+G[4]),N=!0,D=0;for(let V=0;V<k&&N;V++)for(let _=0;_<T;_++){let Y=G[0]+10+20*V,J=G[2]+10+20*_,H=d[0]+d[3]*Y+d[5]*J,W=d[2]+d[9]*Y+d[11]*J,ne=Math.round(H),K=Math.round(W),Z=pe(ne,j,K)?X.get(ne,j,K):-1;if(Z<0){N=!1;break}if(Z>D)D=Z}if(N){if(ae[R]=1,le)le[R]=D}}return{nStuds:O,studHidden:E,studUp:F,underHidden:ae,studsHidden:se,studHideStep:oe,underHideStep:le}}function En(e,t,n){let r=(l)=>l.colPart&&t.parts[l.colPart]?l.colPart:n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let m=l.colour;if(!m)return String(l.color);let g=o.get(m);if(g!==void 0)return g;let b=t.colorTable?.[l.color],y=b?.hex??t.colors?.[l.color],A=b?Xe({alpha:b.alpha??255,luminance:b.luminance??0,finish:b.finish??{type:"default"}}):"default:op",v=Xe(m);if(g=y&&y.toUpperCase()===m.hex.toUpperCase()&&A===v?String(l.color):m.hex.toUpperCase()+"/"+v,g!==String(l.color))s.set(g,m);return o.set(m,g),g},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),u=c.map((l)=>Pt(l.steps)),f=[...new Set(u)].sort(),a=new Map(f.map((l,m)=>[l,m]));return{all:c,stepOf:u.map((l)=>a.get(l)),nSteps:f.length,localColours:s}}function Te(e,t,n=!0){let r=En(e,t,n);return Sn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Pe="https://ldr-demo.vercel.app/cdn/v1/",Se=new Map,Le=new Map;function Ee(e=Pe,t=fetch){let n=Se.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(()=>Se.delete(e)),Se.set(e,n);return n}var kn=(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"),ke=(e,t)=>kn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ke(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ke(r,t)])):e;function Pn(e,t={}){let n=[],r=0,s={},o={};for(let m of e){let g=m.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let b=new DataView(g).getUint32(0,!0),y=new Uint8Array(g,4+b),A=r;n.push(y),r+=y.byteLength;let v=(4-r%4)%4;if(v)n.push(new Uint8Array(v)),r+=v;for(let[p,h]of Object.entries(m.header.parts??{}))if(!(p in s))s[p]=ke(h,A);for(let[p,h]of Object.entries(m.header.studKinds??{}))if(!(p in o))o[p]=ke(h,A)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+c.length)%4)%4,f=4+c.length+u,a=new Uint8Array(f+r);new DataView(a.buffer).setUint32(0,c.length+u,!0),a.set(c,4),a.fill(32,4+c.length,f);let l=f;for(let m of n)a.set(m,l),l+=m.byteLength;return Ce(a.buffer)}async function Fn(e,t={}){e=[...e];try{return await Ut(e,t)}catch(n){let r=t.cdn??Pe,s=t.fetch??fetch;Se.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await Ut(e,{...t,fetch:o})}catch{throw n}}}async function Ut(e,t){let n=t.cdn??Pe,r=t.fetch??fetch,s=t.gap??16384,o=await Ee(n,r),i=[...new Set([...e].map(ee))],c=[],u=[];for(let p of i){if(Le.has(n+p))continue;let h=o.parts[p];if(h)u.push({name:p,off:h[0],len:h[1],file:h[2]??0});else c.push(p)}u.sort((p,h)=>p.file-h.file||p.off-h.off);let f=[];for(let p of u){let h=f[f.length-1];if(h&&h.file===p.file&&p.off-h.end<=s)h.end=Math.max(h.end,p.off+p.len),h.items.push(p);else f.push({file:p.file,start:p.off,end:p.off+p.len,items:[p]})}let a=0,l=0,m=0,g=new Map,b=async()=>{while(m<f.length){let p=f[m++],h=g.get(p.file);if(h)h=h.subarray(p.start,p.end);else{let M=await r(new URL(o.archives[p.file],n).href,{headers:{Range:`bytes=${p.start}-${p.end-1}`,"Accept-Encoding":"identity"}});if(!M.ok)throw Error(`ldr: parts CDN ${M.status}`);if(l++,h=new Uint8Array(await M.arrayBuffer()),a+=h.byteLength,M.status===200)g.set(p.file,h),h=h.subarray(p.start,p.end)}for(let M of p.items){let z=ve(h.subarray(M.off-p.start,M.off-p.start+M.len)),C=z.buffer.slice(z.byteOffset,z.byteOffset+z.byteLength);Le.set(n+M.name,Ce(C))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,f.length)},b));let y=i.filter((p)=>Le.has(n+p)).map((p)=>Le.get(n+p)),A={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:y.length?Pn(y,A):Ce(Rn(A)),missing:c,requests:l,bytes:a}}function Rn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...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 In(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 Ot(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let c of e){let u=c.embedded?t.get(c.part):ee(c.part),f=u?n.parts[u]:void 0;if(!f)continue;if(f[3]!=null)o=!0,r+=f[3];if(!i.has(u))i.add(u),s+=f[1]}return{bodyTris:r,packBytes:s,known:o}}class Fe 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 Nt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Ee(t.cdn??Pe,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(w)=>{if(!w.ok)throw Error(`ldr: ${w.status} fetching ${e}`);return at(await w.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":lt(e)),u=Rt(o,c,{looseGeometry:!1,callouts:t.callouts}),f=performance.now();t.onParsed?.(u),await s;let a=It(o,new Set(u.filter((w)=>w.embedded).map((w)=>w.part)),c),l=(w,x)=>t.maxBodyTris!=null&&w>t.maxBodyTris||t.maxPackBytes!=null&&x>t.maxPackBytes,m=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(w)=>new Fe({...w,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),b="full";if(m){let w=Ot(u,a,await s);if(l(w.known?w.bodyTris:0,w.packBytes)){if(!t.lowCdn)throw g(w);let x=await Ee(t.lowCdn,r).catch(()=>null);if(!x)throw g(w);let P=Ot(u,a,x);if(l(P.known?P.bodyTris:0,P.packBytes))throw g(P);b="low"}}let y=[...u.filter((w)=>!w.embedded).map((w)=>w.part),...a.values()],A=async()=>{let w=await Fn(y,b==="low"?{...t,cdn:t.lowCdn}:t);for(let[x,P]of a){let O=w.pack.header.parts[P];if(O)w.pack.header.parts[x]=O}return{...w,packBytes:w.pack.buffer?.byteLength??w.pack.bytes??0,bodyTris:In(u,w.pack)}},v=await A();if(m&&l(v.bodyTris,v.packBytes)&&b==="full"&&t.lowCdn&&await Ee(t.lowCdn,r).then(()=>!0,()=>!1)){b="low";let w=v;v=await A(),v.requests+=w.requests,v.bytes+=w.bytes}if(m&&l(v.bodyTris,v.packBytes))throw g(v);let{pack:p,missing:h,requests:M,bytes:z}=v,C=new Map([...a].map(([w,x])=>[x,w])),L=h.map((w)=>C.get(w)??w),I=performance.now(),S=t.cull?Te(u,p.header,t.textures!==!1):void 0;return{insts:u,pack:p,tier:b,missing:L,requests:M,bytes:z,cull:S,timings:{fetchModel:i-n,parse:f-i,parts:I-f,...S?{cull:performance.now()-I}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Nt(n,{...r,cull:!1,onParsed:(a)=>self.postMessage({id:t,insts:a})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),c=Te(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,f=[];for(let a of[c.studHidden,c.studUp,c.underHidden,c.studHideStep,c.underHideStep])if(a)f.push(a.buffer);self.postMessage({id:t,cull:c,ms:u},f)}catch(s){if(s instanceof Fe||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';
5015
5080
 
5016
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/cdn.ts
5081
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/cdn.ts
5017
5082
  var worker;
5018
5083
  var seq = 0;
5019
5084
  var pending = new Map;
@@ -5127,7 +5192,7 @@ async function loadModel(source, o = {}) {
5127
5192
  timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
5128
5193
  });
5129
5194
  }
5130
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/node/library.ts
5195
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/node/library.ts
5131
5196
  import { existsSync, readFileSync, statSync } from "fs";
5132
5197
  import { join } from "path";
5133
5198
  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]];
@@ -5477,11 +5542,11 @@ class Library {
5477
5542
  return insts;
5478
5543
  }
5479
5544
  }
5480
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/node/build-pack.ts
5545
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/node/build-pack.ts
5481
5546
  import fs3 from "node:fs";
5482
5547
  import path3 from "node:path";
5483
5548
 
5484
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/node/resolver.ts
5549
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/node/resolver.ts
5485
5550
  import fs from "node:fs";
5486
5551
  import path from "node:path";
5487
5552
  var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
@@ -5810,11 +5875,11 @@ function collectDeps(lib, refs) {
5810
5875
  return out;
5811
5876
  }
5812
5877
 
5813
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/node/compile.ts
5878
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/node/compile.ts
5814
5879
  import fs2 from "node:fs";
5815
5880
  import path2 from "node:path";
5816
5881
 
5817
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/node/lod.ts
5882
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/node/lod.ts
5818
5883
  import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
5819
5884
  await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
5820
5885
  function reorderMesh(P, N, C, I) {
@@ -6120,7 +6185,7 @@ function levelLines(P, I, E, err, always, tol = 0.01) {
6120
6185
  return out;
6121
6186
  }
6122
6187
 
6123
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/node/compile.ts
6188
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/node/compile.ts
6124
6189
  class BfcState {
6125
6190
  accum;
6126
6191
  ccw = true;
@@ -7064,7 +7129,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
7064
7129
  return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
7065
7130
  }
7066
7131
 
7067
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/node/build-pack.ts
7132
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/node/build-pack.ts
7068
7133
  function packCompilerOpts(o) {
7069
7134
  return { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures, ...o.partWorkLimit ? { workLimit: o.partWorkLimit } : {} };
7070
7135
  }
@@ -7136,7 +7201,7 @@ function buildPack(o) {
7136
7201
  const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
7137
7202
  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 } : {} };
7138
7203
  }
7139
- // ../../../../../../../tmp/ldr-build-Fw2uhS/src/node/promote.ts
7204
+ // ../../../../../../../tmp/ldr-build-HYKc29/src/node/promote.ts
7140
7205
  var GEOM = /^\s*[2-5]\s/;
7141
7206
  var REF = /^\s*1\s/;
7142
7207
  var FILE = /^\s*0\s+FILE\s+(\S.*?)\s*$/i;