@liveroom-tech/react-immersive 6.0.2 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +24 -0
  2. package/dist/AnimationsTab-NUJTEMZ5.mjs +1 -0
  3. package/dist/AnnotationsTab-OHRVWRKI.mjs +1 -0
  4. package/dist/CinematicTab-IJAY2BS6.mjs +1 -0
  5. package/dist/ConfigureTab-UQRRATCY.mjs +6 -0
  6. package/dist/RulesTab-YVBZGJZX.mjs +1 -0
  7. package/dist/SequencesTab-IC5LWQ6N.css +1 -0
  8. package/dist/SequencesTab-RPJAG26Z.mjs +1 -0
  9. package/dist/binding-builder.css +1 -1
  10. package/dist/binding-builder.d.mts +3 -3
  11. package/dist/binding-builder.d.ts +3 -3
  12. package/dist/binding-builder.js +76 -23
  13. package/dist/binding-builder.mjs +1 -1
  14. package/dist/chunk-2DV2UCQH.mjs +1 -0
  15. package/dist/chunk-37YITTIK.mjs +1 -0
  16. package/dist/chunk-5FLX45O5.mjs +2 -0
  17. package/dist/chunk-6CTCV2Q5.mjs +1 -0
  18. package/dist/chunk-7JCFNZJM.mjs +1 -0
  19. package/dist/chunk-7OWHW66D.mjs +1 -0
  20. package/dist/chunk-AL6UIGWP.mjs +1 -0
  21. package/dist/chunk-BNKTI3CY.mjs +1 -0
  22. package/dist/chunk-CCBFMNAU.mjs +1 -0
  23. package/dist/chunk-E24EFHB5.mjs +1 -0
  24. package/dist/chunk-EV6THDXD.mjs +1 -0
  25. package/dist/chunk-F5QSXMME.mjs +1 -0
  26. package/dist/chunk-FGAJ2UT7.mjs +1 -0
  27. package/dist/chunk-FXV4CLAK.mjs +1 -0
  28. package/dist/chunk-GV4ZRXL6.mjs +1 -0
  29. package/dist/chunk-KHN55ZM7.mjs +3 -0
  30. package/dist/chunk-LX3GXQNU.mjs +1 -0
  31. package/dist/chunk-OPZJDP7T.mjs +1 -0
  32. package/dist/chunk-OREKYGO3.mjs +83 -0
  33. package/dist/chunk-PBVBZYOG.mjs +47 -0
  34. package/dist/chunk-T6AYLPCC.mjs +1 -0
  35. package/dist/hosted.css +1 -1
  36. package/dist/hosted.d.mts +22 -6
  37. package/dist/hosted.d.ts +22 -6
  38. package/dist/hosted.js +75 -22
  39. package/dist/hosted.mjs +1 -1
  40. package/dist/index.css +1 -1
  41. package/dist/index.d.mts +66 -6
  42. package/dist/index.d.ts +66 -6
  43. package/dist/index.js +69 -21
  44. package/dist/index.mjs +1 -1
  45. package/dist/{modelFileResolver-Co7j1tdQ.d.mts → modelFileResolver-BEW_95id.d.mts} +52 -7
  46. package/dist/{modelFileResolver-Co7j1tdQ.d.ts → modelFileResolver-BEW_95id.d.ts} +52 -7
  47. package/dist/{modelViewerProps-BibuMND7.d.ts → modelViewerProps-C7saa0i2.d.mts} +173 -3
  48. package/dist/{modelViewerProps-Ce4-wb57.d.mts → modelViewerProps-CbK_4uZj.d.ts} +173 -3
  49. package/dist/{publicProps-BaJHCDa_.d.mts → publicProps-NKTiohZO.d.mts} +1 -1
  50. package/dist/{publicProps-CP18d_mt.d.ts → publicProps-z7cJhUH8.d.ts} +1 -1
  51. package/dist/simple-model-viewer.css +1 -1
  52. package/dist/simple-model-viewer.d.mts +25 -3
  53. package/dist/simple-model-viewer.d.ts +25 -3
  54. package/dist/simple-model-viewer.js +49 -3
  55. package/dist/simple-model-viewer.mjs +1 -1
  56. package/dist/utils.d.mts +47 -4
  57. package/dist/utils.d.ts +47 -4
  58. package/dist/utils.js +2 -2
  59. package/dist/utils.mjs +1 -1
  60. package/package.json +5 -1
  61. package/dist/chunk-33SUWPXC.mjs +0 -3
  62. package/dist/chunk-4JMJALRO.mjs +0 -2
  63. package/dist/chunk-EIBW7ZJE.mjs +0 -81
  64. package/dist/chunk-KFTJMFYF.mjs +0 -1
  65. package/dist/chunk-OTSCPJWF.mjs +0 -1
  66. package/dist/chunk-P2JZ5Z7I.mjs +0 -1
  67. package/dist/chunk-V7WZUWJ5.mjs +0 -1
@@ -0,0 +1,83 @@
1
+ import{a as Lp,b as Yb,c as Kb,d as Qb,e as Ip,f as Uo,g as as,h as Go}from"./chunk-7OWHW66D.mjs";import{c as iv}from"./chunk-OPZJDP7T.mjs";import{c as Mc,h as hi,i as Ly}from"./chunk-FGAJ2UT7.mjs";import{A as iy,B as oy,C as hy,D as fy,E as gy,F as by,G as vy,H as yy,I as xy,J as wy,K as My,L as Sy,M as ms,N as vc,O as yc,P as xc,Q as wc,R as Cy,S as Py,T as Ry,a as Vo,b as Xb,c as Zl,d as hc,e as Fv,f as Uv,g as Gv,i as Xv,j as Gp,l as Hp,m as $v,n as Yv,o as fc,p as ds,q as pi,r as Kv,s as Qv,t as Jv,u as Zv,v as ey,w as ty,x as ry,y as ny,z as Wp}from"./chunk-PBVBZYOG.mjs";import{a as nv,b as ue}from"./chunk-T6AYLPCC.mjs";import{a as Ay}from"./chunk-37YITTIK.mjs";import{$ as vv,Aa as Ey,C as ss,D as ac,Ea as ky,F as Bp,Fa as Dy,G as uv,Ga as Oy,J as Be,P as sc,Q as dv,R as lc,S as pv,T as mv,U as hv,V as fv,W as gv,X as cc,Y as bv,Z as uc,_ as ls,a as ci,aa as Np,b as ui,ba as dc,c as Wb,ca as yv,d as qb,da as xv,e as cn,ea as wv,f as Wo,g as eo,h as ov,i as av,ja as Iv,k as tc,ka as mc,ma as Vp,n as rc,na as Bv,o as qo,oa as Nv,p as Rn,pa as jv,q as nc,qa as Fp,r as ic,ra as zv,s as sv,sa as Vv,t as oc,u as lv,v as cv,wa as qp,za as _y}from"./chunk-5FLX45O5.mjs";import{c as Ty}from"./chunk-CCBFMNAU.mjs";import{e as ec,f as $b}from"./chunk-LX3GXQNU.mjs";import{d as Tv,e as pc,f as to,g as _v,h as Ev,i as zp,j as Av,k as Rv,l as kv,o as Dv,q as Ov,r as Lv,s as cs}from"./chunk-7JCFNZJM.mjs";import{a as Fo}from"./chunk-GV4ZRXL6.mjs";import{A as uy,B as dy,C as ps,D as bc,E as py,F as my,a as lr,b as un,c as Ho,d as di,e as Jb,f as Zb,g as qr,h as ev,i as tv,j as Hv,k as us,l as Up,n as Wv,o as qv,p as ay,s as Gt,t as mi,u as gc,v as Xr,w as wt,x as sy,y as ly,z as cy}from"./chunk-EV6THDXD.mjs";import{b as rv}from"./chunk-6CTCV2Q5.mjs";import{a as Mv,b as Sv,c as Cv,d as kn,g as Pv,h as jp}from"./chunk-BNKTI3CY.mjs";import{a as Op}from"./chunk-JR557W27.mjs";import{useCallback as mr,useRef as Yo,useState as Vy}from"react";import{Vector3 as Fy}from"three";var Xp=new WeakSet;function Xo(e){Xp.add(e)}function Iy(e){let t=Xp.has(e);return t&&Xp.delete(e),t}var $p=new WeakSet;function By(e,t){t?$p.add(e):$p.delete(e)}function $o(e,t){return $p.has(e)?0:t}import{Box3 as Ny,Matrix4 as QT,PerspectiveCamera as jy,Vector3 as Yp}from"three";function zy(e,t){let r=Uo(e);if(!(e.camera instanceof jy)||!t)return r;let n=t instanceof Ny?t:new Ny().setFromObject(t);return n.isEmpty()||(r.framing={aspect:e.camera.aspect,min:n.min.toArray(),max:n.max.toArray()}),r}function Sc(e,t){let r=t.camera,n=e.framing;if(!(r instanceof jy)||!n||!(r.aspect>0)||Math.abs(r.aspect-n.aspect)<1e-6)return[...e.position];let i=new Yp(...e.position),o=new Yp(...e.target),a=i.clone().sub(o).normalize(),s=new QT().lookAt(i,o,r.up).invert(),l=Math.tan((e.fov??r.fov)*Math.PI/360)/(e.zoom??r.zoom);if(!(l>0)||!Number.isFinite(l))return[...e.position];let d=0;for(let u of[n.min[0],n.max[0]])for(let p of[n.min[1],n.max[1]])for(let c of[n.min[2],n.max[2]]){let h=new Yp(u,p,c).sub(i).applyMatrix4(s);d=Math.max(d,Math.abs(h.x)/(l*r.aspect)+h.z,Math.abs(h.y)/l+h.z)}return i.addScaledVector(a,d*1.02).toArray()}function Uy(e){return[e.x,e.y,e.z]}function $r(e,t){let r=new Fy,n=new Fy;return t.getPosition(r),t.getTarget(n),{position:Uy(r),target:Uy(n),fov:"fov"in e&&typeof e.fov=="number"?e.fov:null,zoom:"zoom"in e&&typeof e.zoom=="number"?e.zoom:1,azimuthAngle:t.azimuthAngle,polarAngle:t.polarAngle}}function JT(e,t){return e?e.position[0]===t.position[0]&&e.position[1]===t.position[1]&&e.position[2]===t.position[2]&&e.target[0]===t.target[0]&&e.target[1]===t.target[1]&&e.target[2]===t.target[2]&&e.fov===t.fov&&e.zoom===t.zoom&&e.azimuthAngle===t.azimuthAngle&&e.polarAngle===t.polarAngle:!1}async function hs(e,t,r=.6){let n=e.smoothTime;e.smoothTime=$o(e,r);try{return await t()}finally{e.smoothTime=n}}function AN(e={}){let t=Yo(e);t.current=e;let r=Yo(null),[n,i]=Vy(null),[o,a]=Vy(()=>({...e.presets})),s=Yo(o);s.current=o;let l=mr(w=>{i(C=>JT(C,w)?C:w)},[]),d=mr(w=>{l(w)},[l]),u=Yo(null),p=Yo(null),c=Yo(null),h=mr(w=>{r.current=w;let C=$r(w.raw.controls.camera,w.raw.controls);l(C),w.raw.scene!==p.current&&(p.current=w.raw.scene,u.current=null,c.current=null),w.homeCameraState&&!u.current&&(u.current=w.homeCameraState);let{initialPosition:P,initialTarget:E,initialTransition:T=!1}=t.current;if((P||E)&&w.raw.scene&&(P||w.homeCameraState)&&c.current!==w.raw.controls){c.current=w.raw.controls,w.homeCameraState||Xo(w.raw.controls);let O=P??C.position,j=E??C.target;w.raw.controls.setLookAt(O[0],O[1],O[2],j[0],j[1],j[2],T).then(()=>{if(r.current?.raw.controls!==w.raw.controls)return;let I=$r(w.raw.controls.camera,w.raw.controls);u.current={position:I.position,target:I.target},l(I)}).catch(()=>{})}},[l]),m=mr(async()=>{let w=r.current,C=w?.raw.controls;if(!C)return!1;try{let P=u.current;if(P){Go(C,P);let E=Sc(P,C);await hs(C,()=>C.setLookAt(E[0],E[1],E[2],P.target[0],P.target[1],P.target[2],!0))}else w?.raw.scene?await hs(C,()=>C.fitToBox(w.raw.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await hs(C,()=>C.reset(!0));return!0}catch{return!1}},[]),b=mr(async()=>{let w=r.current;if(!w?.raw.controls||!w.raw.scene)return!1;try{return await hs(w.raw.controls,()=>w.raw.controls.fitToBox(w.raw.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),y=mr(async w=>{let C=r.current;if(!C?.raw.controls)return!1;let P=Fo(C.objectBindings,w);if(!P)return!1;let E=C.raw.nodes[P];if(!E)return!1;try{return await hs(C.raw.controls,()=>C.raw.controls.fitToBox(E,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),S=mr(async(w,C=!0)=>{let P=r.current?.raw.controls;if(!P)return!1;try{return r.current?.homeCameraState||Xo(P),await P.setTarget(w[0],w[1],w[2],C),l($r(P.camera,P)),!0}catch{return!1}},[l]),f=mr(async(w,C=!0)=>{let P=r.current?.raw.controls;if(!P)return!1;try{r.current?.homeCameraState||Xo(P);let E=[P.setLookAt(w.position[0],w.position[1],w.position[2],w.target[0],w.target[1],w.target[2],C)];w.azimuthAngle!=null&&w.polarAngle!=null&&E.push(P.rotateTo(w.azimuthAngle,w.polarAngle,C)),await Promise.all(E);let T=P.camera,O=!1;return w.fov!=null&&"fov"in T&&typeof T.fov=="number"&&(T.fov=w.fov,O=!0),w.zoom!=null&&"zoom"in T&&typeof T.zoom=="number"&&(T.zoom=w.zoom,O=!0),O&&"updateProjectionMatrix"in T&&T.updateProjectionMatrix(),l($r(T,P)),!0}catch{return!1}},[l]),g=mr((w,C=!0)=>f(w,C),[f]),x=mr((w,C,P=!0)=>f({position:w,target:C},P),[f]),_=mr(async(w,C,P=!0)=>{let E=r.current?.raw.controls;if(!E)return!1;try{return r.current?.homeCameraState||Xo(E),await E.rotateTo(w*Math.PI/180,C*Math.PI/180,P),l($r(E.camera,E)),!0}catch{return!1}},[l]),v=mr(async(w,C=!0)=>{let P=r.current?.raw.controls;if(!P)return!1;try{return r.current?.homeCameraState||Xo(P),await P.dollyTo(w,C),l($r(P.camera,P)),!0}catch{return!1}},[l]),R=mr(w=>{let C=r.current?.raw.controls,P=w.trim();if(!C||!P)return null;let E=$r(C.camera,C);return s.current={...s.current,[P]:E},a(T=>({...T,[P]:E})),l(E),E},[l]),A=mr((w,C=!0)=>{let P=s.current[w];return P?f(P,C):Promise.resolve(!1)},[f]);return{cameraState:n,cameraPresets:o,resetView:m,focusObject:y,fitScene:b,setCameraTarget:S,setCameraState:g,lookAt:x,orbitTo:_,dollyTo:v,savePreset:R,goToPreset:A,handleCameraChange:d,handleViewerReady:h}}var Gy={showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!1,showAnnotationNavigation:!1,showMaterialVariants:!1},ZT=Object.freeze({minimal:Object.freeze({...Gy}),showcase:Object.freeze({...Gy,autoRotate:!0}),configurator:Object.freeze({showObjectBindingDataPanel:!0,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!0,showMaterialVariants:!0}),inspector:Object.freeze({showObjectBindingDataPanel:!0,showSceneObjectsPanel:!0,showDownloadButton:!0,showResetButton:!0,showViewGizmo:!0,showMeasureTools:!0,showUvCheckerButton:!0,showExplodeControls:!0,showSectionTools:!0,showIsolateControls:!0,enableKeyboardNavigation:!0})}),e_=["preset","ui","tools","controls","perf","tiles","xr","decoders"];function Hy(e){let t={};for(let r of Object.keys(e))e[r]!==void 0&&(t[r]=e[r]);return t}function t_({ui:e,tools:t,controls:r,perf:n,tiles:i,xr:o,decoders:a}){let s=e?.download,l=e?.mouseController,d=t?.measure,u=r?.autoRotate;return{showObjectBindingDataPanel:e?.objectPanel,showSceneObjectsPanel:e?.sceneObjects,showDownloadButton:s===void 0?void 0:s!==!1,downloadFilename:typeof s=="string"?s:void 0,showResetButton:e?.reset,showFullscreenButton:e?.fullscreen,showLoadingOverlay:e?.loadingOverlay,showViewGizmo:e?.viewGizmo,showMouseController:l===void 0?void 0:l!==!1,mouseControllerPosition:typeof l=="object"?l.position:void 0,mouseControllerOpacity:typeof l=="object"?l.opacity:void 0,showAnnotationNavigation:e?.annotationNavigation,showAnnotationOnHover:e?.annotationOnHover,showAnnotationFilters:e?.annotationFilters,highlightOnHover:e?.highlightOnHover,showMaterialVariants:e?.materialVariants,showObjectNavigator:e?.objectNavigator,showMeasureTools:d===void 0?void 0:d!==!1,measurementUnit:typeof d=="object"?d.unit:void 0,showUvCheckerButton:t?.uvChecker,showExplodeControls:t?.explode,showSectionTools:t?.section,showSequenceControls:t?.sequences,showIsolateControls:t?.isolate,texturePositioning:t?.texturePositioning,enableCameraControls:r?.enabled,enableKeyboardNavigation:r?.keyboard,reducedMotion:r?.reducedMotion,disableZoom:r?.zoom===void 0?void 0:!r.zoom,zoomOnSelected:r?.zoomOnSelect,autoRotate:u===void 0?void 0:u!==!1,autoRotateSpeed:typeof u=="number"?u:void 0,refitOnResize:r?.refitOnResize,cameraLimits:r?.limits,moveSensitivity:r?.moveSensitivity,zoomSensitivity:r?.zoomSensitivity,renderMode:n?.renderMode,maxDpr:n?.maxDpr,performanceProfile:n?.profile,preserveDrawingBuffer:n?.preserveDrawingBuffer,webgpu:n?.webgpu,tilesetUrl:i?.url,tilesErrorTarget:i?.errorTarget,tilesCacheSize:i?.cacheSize,enableXR:o?.enabled,usdzUrl:o?.usdzUrl,arScaleMode:o?.scaleMode,mobileHandoffUrl:o?.mobileHandoffUrl,arHandoff:o?.arHandoff,dracoDecoderPath:a?.draco,ktx2TranscoderPath:a?.ktx2,meshopt:a?.meshopt}}function Wy(e){let t={...e};for(let r of e_)delete t[r];return{...e.preset?ZT[e.preset]:void 0,...Hy(t),...Hy(t_(e))}}import{useCallback as Ko,useEffect as Cc,useMemo as Kp,useRef as Qo,useState as Jo}from"react";var qy=e=>e instanceof Error?e.message:String(e);function r_(e){if(!e||!Number.isSafeInteger(e.amountMinor)||e.amountMinor<0||!/^[A-Z]{3}$/.test(e.currency)||e.expiresAt!==void 0&&(!Number.isFinite(Date.parse(e.expiresAt))||Date.parse(e.expiresAt)<=Date.now()))throw new Error("The pricing service returned an invalid price.");return{amountMinor:e.amountMinor,currency:e.currency,...e.expiresAt?{expiresAt:e.expiresAt}:{},...e.label?{label:String(e.label)}:{}}}function n_(e,t){let r=new Set;if(!e||typeof e.available!="boolean"||e.message!==void 0&&typeof e.message!="string")throw new Error("The availability service returned invalid data.");if(e.options!==void 0){if(!Array.isArray(e.options))throw new Error("The availability service returned invalid data.");for(let n of e.options){let i=JSON.stringify([n?.groupId,n?.optionId]);if(!n||typeof n.available!="boolean"||n.reason!==void 0&&typeof n.reason!="string"||r.has(i)||!t.groups.some(o=>o.id===n.groupId&&o.options.some(a=>a.id===n.optionId)))throw new Error("The availability service returned invalid data.");r.add(i)}}return{available:e.available,...e.message!==void 0?{message:e.message}:{},...e.options?{options:e.options.map(({groupId:n,optionId:i,available:o,reason:a})=>({groupId:n,optionId:i,available:o,...a!==void 0?{reason:a}:{}}))}:{}}}function Xy(e){let t=JSON.stringify(e.product),r=Kp(()=>Tv(e.product),[t]),n=JSON.stringify([r.id,r.revision]),[i,o]=Jo(()=>({productIdentity:n,selections:e.initialSelections??pc(r)})),a=e.selections??(i.productIdentity===n?i.selections:pc(r)),[s,l]=Jo(e.initialQuantity??1),d=JSON.stringify(a),u=Kp(()=>to(r,a,s),[r,d,s]),p=e.adapter,c=p?.key??"",h=`${t}
2
+ ${u.key}
3
+ ${c}`;if(p&&(typeof p.key!="string"||!p.key.trim()))throw new Error("A commerce adapter needs a stable key identifying its backend/pricing context.");let[m,b]=Jo(0),[y,S]=Jo(null),[f,g]=Jo(null),[x,_]=Jo({identity:h,pending:null,result:null,error:null}),v=Qo(!1),R=Qo(!0),A=Qo(0),w=Qo(null),C=Qo(null),P=Qo({options:e,product:r,base:u,identity:h,commerce:y,adapter:p,optionStates:[]}),E=e.selections!==void 0&&!e.onSelectionsChange,T=y?.identity===h&&y.adapterKey===c?y:null,O=T?.configuration??u,j=Kp(()=>Dv(r,u.selections,T?.availability??void 0,s),[r,u,T?.availability,s]);P.current={options:e,product:r,base:u,identity:h,commerce:y,adapter:p,optionStates:j},Cc(()=>{_({identity:h,pending:null,result:null,error:null}),g(null)},[h]);let I=Ko(()=>{v.current=!1,_(Z=>({...Z,error:null,result:null})),b(Z=>Z+1)},[]);Cc(()=>{let Z=new AbortController,ne=++A.current;return v.current=!1,u.valid?(S({identity:h,adapterKey:c,status:"loading",configuration:u,price:null,availability:null,error:null}),(async()=>{try{let X=structuredClone(u),G={signal:Z.signal};if(p?.resolveSku){let xe=await p.resolveSku(structuredClone(X),G);if(xe!==null&&(typeof xe!="string"||!xe.trim()))throw new Error("The SKU service returned an invalid SKU.");X.sku=xe}if(Z.signal.aborted)return;let[H,ae]=await Promise.all([p?.getPrice?Promise.resolve().then(()=>p.getPrice(structuredClone(X),G)).then(r_):Promise.resolve(null),p?.getAvailability?Promise.resolve().then(()=>p.getAvailability(structuredClone(X),G)).then(xe=>n_(xe,r)):Promise.resolve(null)]);if(Z.signal.aborted||ne!==A.current||P.current.identity!==h||P.current.adapter?.key!==p?.key)return;v.current=!0,S({identity:h,adapterKey:c,status:"ready",configuration:X,price:H??null,availability:ae??null,error:null})}catch(X){if(Z.signal.aborted||ne!==A.current||P.current.identity!==h||P.current.adapter?.key!==p?.key)return;S({identity:h,adapterKey:c,status:"error",configuration:u,price:null,availability:null,error:qy(X)})}})(),()=>Z.abort()):(S(null),()=>Z.abort())},[h,c,m]),Cc(()=>{let Z=T?.price?.expiresAt;if(!Z)return;let ne=Date.parse(Z)-Date.now(),X,G=()=>{let H=Date.parse(Z)-Date.now();if(H>0){X=setTimeout(G,Math.min(H,2147483647));return}v.current=!1,S(ae=>ae?.identity===h?{...ae,status:"error",error:"The price expired. Refresh it before continuing."}:ae)};return X=setTimeout(G,Math.min(Math.max(ne,0),2147483647)),()=>clearTimeout(X)},[T?.price?.expiresAt,h]),Cc(()=>(R.current=!0,()=>{R.current=!1,v.current=!1,A.current++,w.current?.controller.abort()}),[]);let N=Ko(Z=>{let ne=P.current;if(ne.options.selections!==void 0&&!ne.options.onSelectionsChange)throw new Error("Selections are controlled; supply onSelectionsChange to edit them.");if(w.current)throw new Error("Wait for the current cart or quote request to finish.");let X=to(ne.product,Z,ne.base.quantity);if(X.issues.some(G=>G.code==="unknown-group"||G.code==="unknown-option"))throw new Error("Selections reference unknown product options.");if(X.key===ne.base.key){g(null);return}v.current=!1,g(null),b(G=>G+1),ne.options.onSelectionsChange&&ne.options.onSelectionsChange(structuredClone(X.selections)),ne.options.selections===void 0&&o({productIdentity:JSON.stringify([ne.product.id,ne.product.revision]),selections:X.selections})},[]),D=Ko((Z,ne)=>{let X=P.current,G=X.product.groups.find(xe=>xe.id===Z),H=X.optionStates.find(xe=>xe.groupId===Z&&xe.optionId===ne);if(!G||ne!==null&&!H)throw new Error("Unknown product option.");let ae=ne===null?to(X.product,{...X.base.selections,[Z]:null},X.base.quantity).issues.filter(xe=>xe.groupIds.includes(Z)&&xe.code!=="sku"):[];return ae.length||H&&!H.available?(g(H?.reasons.join(" ")||ae.map(xe=>xe.message).join(" ")),!1):(N({...X.base.selections,[Z]:ne}),!0)},[N]),k=Ko((Z,ne)=>{let X=P.current,G=_v(X.product,X.base.selections,Z,ne,X.base.quantity);return G?(N(G),!0):(g("This choice isn't available with any combination."),!1)},[N]),U=Ko(Z=>{if(w.current)throw new Error("Wait for the current cart or quote request to finish.");to(P.current.product,P.current.base.selections,Z),Z!==P.current.base.quantity&&(v.current=!1,l(Z))},[]),te=Ko(Z=>{if(w.current)return w.current.kind===Z&&w.current.identity===P.current.identity?w.current.promise:Promise.reject(new Error("Another commerce request is already running."));let ne=P.current,X=ne.commerce,G=Z==="cart"?ne.adapter?.addToCart:ne.adapter?.requestQuote,H=pe=>(_({identity:ne.identity,pending:null,result:null,error:pe}),Promise.reject(new Error(pe)));if(!G)return H("No commerce adapter is configured for this action.");if(!ne.base.valid)return H("Resolve the option conflicts before continuing.");if(!v.current||!X||X.identity!==ne.identity||X.adapterKey!==(ne.adapter?.key??"")||X.status!=="ready")return H("Wait for current pricing and availability, or retry the service request.");if(X.availability?.available===!1||X.availability?.options?.some(pe=>!pe.available&&ne.base.selections[pe.groupId]===pe.optionId))return H(X.availability?.message??"This configuration is currently unavailable.");if(Z==="cart"&&ne.adapter?.resolveSku&&!X.configuration.sku)return H("No SKU is available for this configuration.");if(X.price?.expiresAt&&Date.parse(X.price.expiresAt)<=Date.now())return I(),H("The price expired. Refresh it before continuing.");let ae=structuredClone(X.configuration),xe=X.price?structuredClone(X.price):null,Ie=new AbortController,q=ne.identity;(C.current?.identity!==q||C.current.kind!==Z)&&(C.current={identity:q,kind:Z,key:crypto.randomUUID()});let be=C.current.key;_({identity:q,pending:Z,result:null,error:null});let Pe=Promise.resolve().then(()=>(Ie.signal.throwIfAborted(),G(ae,{signal:Ie.signal,idempotencyKey:be,price:xe}))).then(pe=>{if(!pe||typeof pe!="object"||pe.id!==void 0&&typeof pe.id!="string"||pe.message!==void 0&&typeof pe.message!="string")throw new Error("The commerce service returned an invalid result.");let ft={...pe.id?{id:pe.id}:{},...pe.message?{message:pe.message}:{}};return P.current.identity===q&&!Ie.signal.aborted&&_({identity:q,pending:null,result:ft,error:null}),C.current=null,ft}).catch(pe=>{throw P.current.identity===q&&!Ie.signal.aborted&&_({identity:q,pending:null,result:null,error:qy(pe)}),pe}).finally(()=>{w.current?.promise===Pe&&(w.current=null),R.current&&_(pe=>({...pe,pending:null}))});return w.current={identity:q,kind:Z,promise:Pe,controller:Ie},Pe},[I]),re=u.valid&&T?.status==="ready"&&v.current&&!w.current&&T.availability?.available!==!1&&!T.availability?.options?.some(Z=>!Z.available&&u.selections[Z.groupId]===Z.optionId)&&(!T.price?.expiresAt||Date.parse(T.price.expiresAt)>Date.now());return{product:r,configuration:O,optionStates:j,selectOption:D,selectOptionWithFix:k,setSelections:N,reset:()=>N(pc(r)),setQuantity:U,exportConfiguration:()=>Ov(O),importConfiguration:Z=>{let ne=Lv(Z,r);N(ne.selections),U(ne.quantity)},viewerProps:{...e.objectBindings!==void 0?{objectBindings:e.objectBindings}:{},sceneConfig:{...e.sceneConfig??ac,product:{definition:r,selections:u.selections}}},status:T?.status??(u.valid?"loading":"idle"),price:T?.price??(p?.getPrice||!u.valid?null:Ev(r,O)),checkoutUrl:T?.availability?.available===!1?null:Av(r,O),availability:T?.availability??null,error:f??(x.identity===h?x.error:null)??T?.error??null,readOnly:E,pendingAction:w.current?w.current.kind:null,result:x.identity===h?x.result:null,canAddToCart:!!(re&&p?.addToCart&&(!p.resolveSku||O.sku)),canRequestQuote:!!(re&&p?.requestQuote),hasCommerce:!!p,hasCart:!!p?.addToCart,hasQuote:!!p?.requestQuote,addToCart:()=>te("cart"),requestQuote:()=>te("quote"),refresh:I}}import{useId as i_}from"react";import{Fragment as s_,jsx as it,jsxs as Lt}from"react/jsx-runtime";function o_(e,t){return t.map(r=>e.groups.find(n=>n.id===r.groupId)?.options.find(n=>n.id===r.optionId)?.label).filter(Boolean).join(", ")}function a_({c:e,group:t,option:r,state:n,name:i,display:o,busy:a}){let s=ue(),l=`${i}-${r.id}-reason`,d=!n.available&&n.fix?.length?n.fix:null,u=!n.available&&!d,p=d?s("productAlsoChanges",{changes:o_(e.product,d)}):n.available?"":n.reasons.join(" "),c=r.priceDeltaMinor&&e.product.pricing?zp(r.priceDeltaMinor,e.product.pricing.currency,!0):"",h=["ri-productChoice",n.selected&&"ri-productChoice--selected",!n.available&&"ri-productChoice--unavailable"].filter(Boolean).join(" "),m=it("input",{type:"radio",name:i,checked:n.selected,disabled:u||a||e.readOnly,"aria-describedby":p?l:void 0,onChange:()=>{d?e.selectOptionWithFix(t.id,r.id):e.selectOption(t.id,r.id)}});return o==="swatches"?Lt("label",{className:`${h} ri-productSwatch`,title:[r.label,c,p].filter(Boolean).join(" \xB7 "),children:[m,it("span",{className:"ri-productSwatchChip",style:{background:r.swatch??"var(--ri-ui-field)"},"aria-hidden":"true"}),Lt("span",{className:"ri-productVisuallyHidden",children:[r.label,c?` ${c}`:""]}),p?it("span",{id:l,className:"ri-productVisuallyHidden",children:p}):null]}):o==="chips"?Lt("label",{className:`${h} ri-productChip`,title:p||void 0,children:[m,Lt("span",{children:[r.label,c?it("em",{children:c}):null]}),p?it("span",{id:l,className:"ri-productVisuallyHidden",children:p}):null]}):Lt("label",{className:h,children:[m,r.swatch?it("span",{className:"ri-productSwatchChip",style:{background:r.swatch},"aria-hidden":"true"}):null,Lt("span",{className:"ri-productChoiceText",children:[Lt("span",{className:"ri-productChoiceTitle",children:[it("span",{children:r.label}),c?it("em",{children:c}):null]}),r.description?it("small",{children:r.description}):null,p?it("small",{id:l,children:p}):null]})]})}function Qp({configurator:e,className:t="",showCommerce:r=!0,actions:n}){let i=ue(),o=!!e.pendingAction,a=i_(),s=e.price?zp(e.price.amountMinor,e.price.currency):"",l=r&&(e.hasCommerce||!!e.product.pricing||!!e.product.checkout);return Lt("section",{className:`ri-productOptions ${t}`,"aria-label":i("productOptionsFor",{product:e.product.label}),children:[Lt("div",{className:"ri-productHeader",children:[it("strong",{children:e.product.label}),it("button",{type:"button",disabled:o||e.readOnly,onClick:e.reset,children:i("productReset")})]}),e.product.groups.map((d,u)=>{let p=`${a}-${u}`,c=d.display??"list",h=d.options.find(b=>b.id===e.configuration.selections[d.id]),m=d.required?[]:to(e.product,{...e.configuration.selections,[d.id]:null},e.configuration.quantity).issues.filter(b=>b.groupIds.includes(d.id)).map(b=>b.message);return Lt("fieldset",{disabled:o||e.readOnly,children:[Lt("legend",{children:[d.label,d.required?null:Lt("small",{children:[" (",i("productOptional"),")"]}),c==="swatches"&&h?it("span",{className:"ri-productLegendValue",children:h.label}):null]}),Lt("div",{className:`ri-productChoices ri-productChoices--${c}`,children:[d.required?null:Lt("label",{className:`ri-productChoice${c==="swatches"||c==="chips"?" ri-productChip":""}${e.configuration.selections[d.id]===null?" ri-productChoice--selected":""}${m.length?" ri-productChoice--unavailable":""}`,title:m.join(" ")||void 0,children:[it("input",{type:"radio",name:p,checked:e.configuration.selections[d.id]===null,disabled:!!m.length,onChange:()=>e.selectOption(d.id,null)}),it("span",{children:i("productNone")})]}),d.options.map(b=>{let y=e.optionStates.find(S=>S.groupId===d.id&&S.optionId===b.id);return it(a_,{c:e,group:d,option:b,state:y,name:p,display:c,busy:o},b.id)})]})]},d.id)}),e.configuration.issues.length?it("ul",{className:"ri-productIssues","aria-label":i("productIssues"),children:e.configuration.issues.map((d,u)=>it("li",{children:d.message},u))}):null,l?Lt("div",{className:"ri-productCommerce",children:[Lt("label",{className:"ri-productQuantity",children:[i("productQuantity"),it("input",{type:"number",min:1,max:9999,step:1,value:e.configuration.quantity,disabled:o,onChange:d=>{let u=d.target.valueAsNumber;Number.isSafeInteger(u)&&u>=1&&u<=9999&&e.setQuantity(u)}})]}),e.status==="loading"&&e.hasCommerce?it("p",{role:"status",children:i("productCheckingPrice")}):Lt(s_,{children:[s?Lt("p",{className:"ri-productPrice",children:[s,it("small",{children:e.price?.label??i("productTotal")})]}):null,e.configuration.sku?Lt("p",{className:"ri-productSku",children:["SKU: ",e.configuration.sku]}):null,e.availability?.available===!1?it("p",{className:"ri-productIssues",children:e.availability.message??i("productUnavailable")}):null]}),Lt("div",{className:"ri-productActions",children:[e.checkoutUrl?it("a",{className:"ri-productPrimary",href:e.checkoutUrl,target:"_blank",rel:"noopener noreferrer",children:e.product.checkout?.label??i("productBuy")}):null,e.hasCart?it("button",{type:"button",className:e.checkoutUrl?void 0:"ri-productPrimary",disabled:!e.canAddToCart,onClick:()=>{e.addToCart().catch(()=>{})},children:e.pendingAction==="cart"?i("productAddingToCart"):i("productAddToCart")}):null,e.hasQuote?it("button",{type:"button",disabled:!e.canRequestQuote,onClick:()=>{e.requestQuote().catch(()=>{})},children:e.pendingAction==="quote"?i("productRequestingQuote"):i("productRequestQuote")}):null,e.hasCommerce?it("button",{type:"button",disabled:o||!e.configuration.valid,onClick:e.refresh,children:i("productRefresh")}):null,n]})]}):n?it("div",{className:"ri-productActions",children:n}):null,e.error?it("p",{className:"ri-productError",role:"alert",children:e.error}):null,e.result?it("p",{className:"ri-productSuccess",role:"status",children:e.result.message??(e.result.id?i("productSaved",{id:e.result.id}):i("productRequestDone"))}):null]})}import{useCallback as fi,useEffect as l_,useRef as $y,useState as Jp}from"react";var Zp={currentClip:null,isPlaying:!1,speed:1,time:0,duration:0,active:[]};function WN(){let e=$y(null),t=$y(null),[r,n]=Jp([]),[i,o]=Jp([]),[a,s]=Jp(Zp);l_(()=>()=>{t.current?.()},[]);let l=fi(y=>{t.current?.(),e.current=y,n(y.clips),o(y.clipDetails??y.clips.map(S=>({sourceName:S,duration:0}))),s(y.getState?.()??Zp),t.current=y.subscribe?.(s)??null},[]),d=fi(()=>{t.current?.(),t.current=null,e.current=null,n([]),o([]),s(Zp)},[]),u=fi(y=>{let S=e.current;S&&(y(S),!S.subscribe&&S.getState&&s(S.getState()))},[]),p=fi((y,S)=>u(f=>f.play(y,S)),[u]),c=fi(y=>u(S=>S.pause(y)),[u]),h=fi(y=>u(S=>S.stop(y)),[u]),m=fi((y,S)=>u(f=>f.setSpeed(y,S)),[u]),b=fi((y,S)=>u(f=>f.seek?.(y,S)),[u]);return{clips:r,clipDetails:i,...a,play:p,pause:c,stop:h,setSpeed:m,seek:b,handleAnimationsReady:l,clearAnimations:d}}function dn(e,t){let r=URL.createObjectURL(e),n=document.createElement("a");n.href=r,n.download=t,n.style.display="none";try{document.body.appendChild(n),n.click()}finally{n.remove(),window.setTimeout(()=>{URL.revokeObjectURL(r)},1e3)}}import{Fragment as Pc,jsx as fe,jsxs as ce}from"react/jsx-runtime";var Dn=e=>e.toLocaleString(),Zo=e=>e==null?"Unknown":e>=1024*1024?`${(e/1024/1024).toFixed(1)} MiB`:`${(e/1024).toFixed(1)} KiB`,em=e=>e===null?"Unavailable":Dn(e);function c_({report:e,runtimeStats:t,onRefresh:r,onSelectObject:n}){return ce("div",{className:"ri-assetDiagnostics",children:[ce("div",{className:"ri-diagnosticsActions",children:[r&&fe("button",{type:"button",disabled:!e||e.status==="failed",onClick:r,children:"Rescan asset"}),fe("button",{type:"button",disabled:!e,onClick:()=>{dn(new Blob([JSON.stringify({asset:e,runtime:t??null},null,2)],{type:"application/json"}),"asset-diagnostics.json")},children:"Download report"})]}),e?ce(Pc,{children:[ce("div",{className:`ri-diagnosticsSummary ri-diagnosticsSummary--${e.issues.some(i=>i.severity==="error")?"error":e.issues.some(i=>i.severity==="warning")?"warning":"info"}`,children:[fe("strong",{children:e.status==="failed"?"Asset could not be inspected":e.issues.some(i=>i.severity==="error")?"Issues need attention":e.issues.some(i=>i.severity==="warning")?"Review recommended":"No blocking issues found"}),ce("span",{children:[e.issues.filter(i=>i.severity==="error").length," errors \xB7 ",e.issues.filter(i=>i.severity==="warning").length," warnings \xB7 ",e.issues.filter(i=>i.severity==="info").length," notes"]})]}),ce("p",{className:"ri-diagnosticsSource",children:[e.source.name??"Loaded asset"," ",fe("span",{children:e.source.format?.toUpperCase()})]}),ce("details",{className:"ri-diagnosticsDetail",children:[fe("summary",{children:"Asset statistics"}),ce("dl",{className:"ri-diagnosticsMetrics",children:[ce("div",{children:[fe("dt",{children:"Source"}),fe("dd",{children:e.source.name??"Loaded asset"})]}),ce("div",{children:[fe("dt",{children:"Format"}),fe("dd",{children:e.source.format?.toUpperCase()??"Unknown"})]}),ce("div",{children:[fe("dt",{children:"Source file size"}),fe("dd",{children:Zo(e.source.sourceBytes)})]}),ce("div",{children:[fe("dt",{children:"Initial asset load"}),fe("dd",{children:e.source.loadDurationMs==null?"Unknown":`${(e.source.loadDurationMs/1e3).toFixed(2)} s`})]}),ce("div",{children:[fe("dt",{children:"Units"}),fe("dd",{children:e.units==="unknown"?"Unknown \u2014 verify scale":e.units})]}),e.bounds&&ce("div",{children:[fe("dt",{children:"Bounds (scene units)"}),fe("dd",{children:e.bounds.size.map(i=>Number(i.toPrecision(4))).join(" \xD7 ")})]}),e.statistics&&ce(Pc,{children:[ce("div",{children:[fe("dt",{children:"Meshes / instances"}),ce("dd",{children:[Dn(e.statistics.meshes)," / ",Dn(e.statistics.instances)]})]}),ce("div",{children:[fe("dt",{children:"Unique triangles"}),fe("dd",{children:Dn(e.statistics.triangles)})]}),ce("div",{children:[fe("dt",{children:"Unique vertices"}),fe("dd",{children:Dn(e.statistics.vertices)})]}),ce("div",{children:[fe("dt",{children:"Materials / textures"}),ce("dd",{children:[Dn(e.statistics.materials)," / ",Dn(e.statistics.textures)]})]}),ce("div",{children:[fe("dt",{children:"Geometry buffers"}),fe("dd",{children:Zo(e.statistics.geometryBytes)})]}),ce("div",{children:[fe("dt",{children:"Texture memory estimate"}),ce("dd",{children:[Zo(e.statistics.estimatedTextureBytes),e.statistics.unknownTextureSizes?` + ${e.statistics.unknownTextureSizes} unknown`:""]})]})]})]}),ce("p",{className:"ri-diagnosticsNote",children:[e.scope==="resident-tiles"?"Counts cover loaded tiles only. ":"Counts include loaded hidden meshes. ","Buffer sizes and texture memory are estimates, not a GPU memory budget. Units do not verify physical scale."]})]}),fe("div",{className:"ri-diagnosticsIssues",children:e.issues.map((i,o)=>ce("details",{className:`ri-diagnosticsIssue ri-diagnosticsIssue--${i.severity}`,children:[ce("summary",{children:[fe("span",{className:"ri-diagnosticsSeverity",children:i.severity}),i.title,i.count!==void 0&&fe("span",{className:"ri-diagnosticsCount",children:Dn(i.count)})]}),ce("div",{children:[fe("p",{children:i.detail}),fe("p",{className:"ri-diagnosticsFix",children:i.suggestion}),!!i.objects?.length&&fe("ul",{"aria-label":`Affected objects: ${i.title}`,children:i.objects.map((a,s)=>fe("li",{children:n&&!["failed-resources","large-textures"].includes(i.code)?fe("button",{type:"button",onClick:()=>n(a),children:a}):a},`${a}-${s}`))}),i.count&&i.count>(i.objects?.length??0)&&i.objects&&ce("small",{children:["Showing the first ",i.objects.length," of ",Dn(i.count),"."]})]})]},`${i.code}-${o}`))}),!!e.textures.length&&ce("details",{className:"ri-diagnosticsDetail",children:[ce("summary",{children:["Texture dimensions (",e.textures.length,")"]}),fe("ul",{children:e.textures.map((i,o)=>ce("li",{children:[fe("strong",{children:i.name}),ce("span",{children:[i.width??"?"," \xD7 ",i.height??"?",i.compressed?" \xB7 compressed":""," \xB7 ",Zo(i.estimatedBytes)]})]},o))})]}),!!e.extensions.length&&ce("details",{className:"ri-diagnosticsDetail",children:[ce("summary",{children:["glTF extensions (",e.extensions.length,")"]}),fe("ul",{children:e.extensions.map(i=>ce("li",{children:[fe("strong",{children:i.name}),ce("span",{children:[i.recognized?"Recognized":"Not recognized",i.required?" \xB7 required":" \xB7 optional"]})]},i.name))}),fe("p",{className:"ri-diagnosticsNote",children:"Recognized by the bundled loader; compressed formats still require configured decoders and device support."})]})]}):fe("p",{className:"ri-diagnosticsNote",role:"status",children:"Waiting for the active asset to load\u2026"}),ce("details",{className:"ri-diagnosticsDetail ri-diagnosticsRuntimeDetail",children:[fe("summary",{children:"Runtime statistics \xB7 live"}),ce("section",{className:"ri-diagnosticsRuntime","aria-label":"Runtime statistics",children:[ce("h4",{children:["Runtime statistics ",fe("span",{children:"Live \xB7 this canvas"})]}),t?ce(Pc,{children:[ce("dl",{className:"ri-diagnosticsMetrics",children:[ce("div",{children:[fe("dt",{children:"Renderer / render loop"}),ce("dd",{children:[t.renderer.toUpperCase()," / ",t.renderMode]})]}),ce("div",{children:[fe("dt",{children:"Draw calls (last pass)"}),fe("dd",{children:em(t.drawCalls)})]}),ce("div",{children:[fe("dt",{children:"Triangles (last pass)"}),fe("dd",{children:em(t.triangles)})]}),ce("div",{children:[fe("dt",{children:"Frame interval / FPS"}),fe("dd",{children:t.frameIntervalMs===null?"Idle / no active frame sample":`${t.frameIntervalMs.toFixed(1)} ms / ${t.fps?.toFixed(0)}`})]}),ce("div",{children:[fe("dt",{children:"Quality profile"}),ce("dd",{children:[t.quality.profile," \xB7 ",t.quality.reducedGpuLoad?"reduced GPU load":"full quality"]})]}),ce("div",{children:[fe("dt",{children:"Pixel ratio"}),fe("dd",{children:t.quality.dpr.toFixed(2)})]}),ce("div",{children:[fe("dt",{children:"Shadows / post FX"}),ce("dd",{children:[t.quality.shadows?"On":"Off"," / ",t.quality.postProcessing?"Allowed":"Skipped"]})]}),t.streaming&&ce(Pc,{children:[ce("div",{children:[fe("dt",{children:"Tile cache / base budget"}),ce("dd",{children:[Zo(t.streaming.cachedBytes)," / ",Zo(t.streaming.budgetBytes)]})]}),ce("div",{children:[fe("dt",{children:"Cached / loading / parsing tiles"}),ce("dd",{children:[em(t.streaming.cachedTiles)," / ",t.streaming.downloading," / ",t.streaming.parsing]})]}),ce("div",{children:[fe("dt",{children:"Detail / error target"}),ce("dd",{children:["\xD7",t.streaming.detailFactor.toFixed(1)," / ",t.streaming.errorTarget.toFixed(1)]})]})]})]}),t.streaming&&(t.streaming.cacheFull||t.streaming.detailFactor>1)&&ce("p",{className:"ri-diagnosticsPressure",children:[t.streaming.cacheFull?"Tile cache is full. ":"",t.streaming.detailFactor>1?"Detail was reduced by the existing memory-pressure safeguard. ":"","Try smaller textures or a larger cache budget when the device can support it."]}),fe("p",{className:"ri-diagnosticsNote",children:"Frame intervals describe active frame callbacks, not CPU/GPU execution time. Long demand-loop idle gaps are excluded. Draw counts may reflect a post-processing pass. Sampling does not keep rendering awake."})]}):fe("p",{className:"ri-diagnosticsNote",children:"Collecting a sample\u2026"})]})]})]})}import{AlertTriangle as u_}from"lucide-react";import{jsx as Tc,jsxs as Yy}from"react/jsx-runtime";function _c({title:e,message:t,tone:r="default"}){return Yy("div",{className:`ri-license-overlay${r==="error"?" ri-license-overlay--error":""}`,children:[Yy("div",{className:"ri-license-overlay__header",children:[r==="error"?Tc(u_,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):Tc("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),Tc("span",{className:"ri-license-overlay__title",children:e})]}),Tc("p",{className:"ri-license-overlay__message",children:t})]})}function tm(e,t){if(e)return e;let r=t?.background;return r?.enabled&&r.type==="color"?r.color:"#1c1c1d"}var d_={glb:"GLB",gltf:"glTF",obj:"OBJ",fbx:"FBX",usdz:"USDZ",stl:"STL",ply:"PLY"},p_=/\.(glb|gltf|obj|fbx|usdz|stl|ply|zip)$/i;function m_(e,t){let r=e?.response?.status;if(typeof r=="number")return r;let n=/responded with (\d{3})/.exec(t);return n?Number(n[1]):null}function Ky(e,t,r,n){let i=e instanceof Error?e.message:e==null?"":String(e),o=(c,h)=>rv(n,c,h),a=o("loadErrorTitle"),s=i||null;if(oy(e))return{title:a,detail:o("loadErrorPointCloud"),technical:s};let l=m_(e,i);if(l===404||l===410)return{title:a,detail:o("loadErrorNotFound",{status:l}),technical:s};if(l===401||l===403)return{title:a,detail:o("loadErrorDenied",{status:l}),technical:s};if(l!==null)return{title:a,detail:o("loadErrorStatus",{status:l}),technical:s};if(/failed to fetch|networkerror|load failed|network error/i.test(i))return{title:a,detail:o("loadErrorNetwork"),technical:s};if(/<!doctype|<html/i.test(i))return{title:a,detail:o("loadErrorHtml"),technical:s};let d=t.split(/[?#]/,1)[0],u=d_[r??Xv(t)],p=p_.test(d);return{title:a,detail:p||r?o(r?"loadErrorInvalidExplicitFormat":"loadErrorInvalidFile",{format:u}):o("loadErrorMissingFormat",{format:u}),technical:s}}import{useEffect as v_,useState as y_}from"react";var h_="ri:license-grant:v1",f_={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},Qy=new Map;function Zy(e){let t=atob(e);return Uint8Array.from(t,r=>r.charCodeAt(0)).buffer}function Jy(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Zy(t.padEnd(Math.ceil(t.length/4)*4,"="))}function g_(e){if(!e||typeof e!="object")return!1;let t=e;return t.version===1&&typeof t.licenseKeyHash=="string"&&typeof t.domain=="string"&&(t.environment==="development"||t.environment==="production")&&typeof t.tier=="string"&&t.tier.length>0&&typeof t.issuedAt=="number"&&Number.isInteger(t.issuedAt)&&typeof t.expiresAt=="number"&&Number.isInteger(t.expiresAt)}async function Ec(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e.trim())),r=String.fromCharCode(...new Uint8Array(t));return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function rm(e,t){return`${h_}:${t}:${e}`}function b_(e,t){let r=Qy.get(e);if(r)return r;let n=crypto.subtle.importKey("spki",Zy(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return Qy.set(e,n),n}async function nm(e,t,r){if(!globalThis.crypto?.subtle)return null;try{let[n,i,o,a,...s]=e.split("."),l=f_[i];if(n!=="ri1"||!l||!o||!a||s.length>0)return null;let d=JSON.parse(new TextDecoder().decode(Jy(o)));if(!g_(d)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await b_(i,l),Jy(a),new TextEncoder().encode(`${n}.${i}.${o}`)))return null;let p=Math.floor(Date.now()/1e3),c=d.expiresAt-d.issuedAt;return d.licenseKeyHash!==t||d.domain!==r||d.expiresAt<=p||d.issuedAt>p+300||c<=0||c>43200?null:{environment:d.environment,tier:d.tier,expiresAt:d.expiresAt}}catch{return null}}async function ex(e,t,r){try{return await nm(e,await Ec(t),r)}catch{return null}}async function tx(e,t,r){try{let n=await Ec(t);return await nm(e,n,r)?(localStorage.setItem(rm(n,r),e),!0):!1}catch{return!1}}async function rx(e,t){try{let r=await Ec(e),n=rm(r,t),i=localStorage.getItem(n);if(!i)return null;let o=await nm(i,r,t);return o||localStorage.removeItem(n),o}catch{return null}}async function im(e,t){try{let r=await Ec(e);localStorage.removeItem(rm(r,t))}catch{}}var x_=["localhost","127.0.0.1","0.0.0.0"],w_=e=>x_.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),ox="https://react-immersive.liveroom.dev/api/validate-license",ax=()=>typeof window<"u",M_=300*1e3,S_=5e3,C_=400,am=new Map,om=new Map,gi=class extends Error{},sx=async(e,t,r)=>{let n=await rx(e,t);return n?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:n.environment,tier:n.tier,isLocalDomain:r}):null},nx=async(e,t,r)=>{let n=await sx(e,t,r);return n||(console.warn("[react-immersive] License server unreachable and no valid offline grant is available \u2014 license validation failed."),{status:"invalid",reason:"Could not reach license server",isLocalDomain:r})},P_=e=>e instanceof gi||e instanceof TypeError,T_=()=>new Promise(e=>setTimeout(e,C_)),__=e=>e==="development"||e==="production",E_=e=>{if(!e||typeof e!="object")return!1;let t=e;return!(typeof t.valid!="boolean"||t.reason!==void 0&&typeof t.reason!="string"||t.environment!==void 0&&!__(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},A_=e=>{if(!e||typeof e!="object")return null;let t=e,r=t.reason??t.error;return typeof r=="string"&&r.trim()?r:null},lx=(e,t,r)=>`${r}::${e}::${t}`,cx=e=>{let t=am.get(e);return t?Date.now()-t.timestamp>M_?(am.delete(e),null):t.result:null},R_=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),k_=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function D_(e,t,r,n){let i=lx(e,t,n),o=cx(i);if(o)return o;let a=om.get(i);if(a)return a;let s=(async()=>{for(let l=0;l<2;l+=1)try{return await O_(e,t,r,i,n)}catch(d){if(!P_(d))throw d;if(l===0){let u=await sx(e,t,r);if(u)return u;await T_();continue}return nx(e,t,r)}return nx(e,t,r)})().finally(()=>{om.delete(i)});return om.set(i,s),s}async function O_(e,t,r,n,i){let o=new AbortController,a=setTimeout(()=>o.abort(),S_),s;try{s=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(u){throw o.signal.aborted?new gi("License validation timed out"):u}finally{clearTimeout(a)}let l;try{l=await s.json()}catch{throw new gi(`License server returned a non-JSON response${s.status?` (${s.status})`:""}`)}if(!s.ok){if(s.status===429||s.status>=500)throw new gi(`License server error (${s.status})`);let u=A_(l)??`License validation failed${s.status?` (${s.status})`:""}`;return await im(e,t),k_(u,r)}if(!E_(l))throw new gi("License server returned an unexpected payload");let d=R_(l,r);if(d.status==="valid"&&i!==ox){let u=l.offlineGrant?await ex(l.offlineGrant,e,t):null;if(!u)throw new gi("License validation endpoint did not return a verifiable signed grant");d={...d,environment:u.environment,tier:u.tier}}return d.status==="valid"?(am.set(n,{result:d,timestamp:Date.now()}),l.offlineGrant&&(await tx(l.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await im(e,t),d}var ix=(e,t)=>{let r=e.trim();return!ax()||!r?null:cx(lx(r,window.location.hostname.toLowerCase(),t))},ux=(e,t=ox)=>{let[r,n]=y_(()=>ix(e,t)??{status:"checking",isLocalDomain:!1});return v_(()=>{if(!ax())return;let i=!1,o=p=>{i||n(p)},a=e.trim(),s=window.location.hostname.toLowerCase(),l=w_(s),d=ix(e,t);return d?(o(d),()=>{i=!0}):(o({status:"checking",isLocalDomain:l}),a?((async()=>{try{o(await D_(a,s,l,t))}catch(p){let c=p instanceof TypeError?"Could not reach license server":p instanceof Error?p.message:"License validation failed";o({status:"invalid",reason:c,isLocalDomain:l})}})(),()=>{i=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:l}),()=>{i=!0}))},[e,t]),r};import{Box3 as V_,Mesh as F_,Raycaster as U_,Triangle as G_,Vector3 as pn}from"three";import{useCallback as Ac,useEffect as L_,useRef as Rc}from"react";import{Matrix4 as I_,Triangle as dx,Vector3 as fs}from"three";var B_=500,N_=10,j_=5;function kc(e,t,r){let n=Rc({resolve:e,onContextMenu:t,anchorOf:r});n.current={resolve:e,onContextMenu:t,anchorOf:r};let i=Rc(null),o=Rc(!1),a=Rc(null),s=Ac(()=>{let p=i.current;p?.timer&&clearTimeout(p.timer),i.current=null,a.current?.(),a.current=null},[]),l=Ac(()=>{let p=i.current;p&&(s(),p.kind==="touch"&&(o.current=!0,setTimeout(()=>o.current=!1,800)),n.current.onContextMenu?.(p.target,p.pointer))},[s]),d=Ac(p=>{let c=p.nativeEvent,h=c.pointerType!=="touch"&&c.button===2,m=c.pointerType==="touch"&&c.button===0;if(!n.current.onContextMenu||!h&&!m)return;let b=n.current.resolve(p.object);if(b===null)return;s();let y={target:b,kind:h?"right":"touch",pointerId:c.pointerId,pointer:ea(p,n.current.anchorOf?.(p.object)),timer:m?setTimeout(l,B_):null};i.current=y;let S=h?j_:N_,f=v=>Math.hypot(v.clientX-y.pointer.clientX,v.clientY-y.pointer.clientY)>S,g=v=>{v.pointerId===y.pointerId&&f(v)&&s()},x=v=>{v.pointerId===y.pointerId&&(y.kind==="right"&&!f(v)?l():s())},_=v=>{v.pointerId!==y.pointerId&&s()};window.addEventListener("pointermove",g),window.addEventListener("pointerup",x),window.addEventListener("pointercancel",s),window.addEventListener("pointerdown",_),a.current=()=>{window.removeEventListener("pointermove",g),window.removeEventListener("pointerup",x),window.removeEventListener("pointercancel",s),window.removeEventListener("pointerdown",_)}},[s,l]);L_(()=>s,[s]);let u=Ac(()=>o.current?(o.current=!1,!0):!1,[]);return{onPointerDown:d,consumeClick:u}}function z_(e,t){let r=e.face,n=t.geometry.getAttribute("position");if(!r||!n)return null;let i=e.barycoord??null;if(!i){let[p,c,h]=[r.a,r.b,r.c].map(m=>t.getVertexPosition(m,new fs));if(i=dx.getBarycoord(t.worldToLocal(e.point.clone()),p,c,h,new fs),!i)return null}let[o,a,s]=[r.a,r.b,r.c].map(p=>new fs().fromBufferAttribute(n,p)),l=new fs().addScaledVector(o,i.x).addScaledVector(a,i.y).addScaledVector(s,i.z),d=new dx(o,a,s).getNormal(new fs);return r.normal.clone().transformDirection(t.matrixWorld).dot(e.ray.direction)>0&&d.negate(),{position:[l.x,l.y,l.z],normal:[d.x,d.y,d.z]}}function ro(e,t){if(t.updateWorldMatrix(!0,!1),e.object===t&&t.isSkinnedMesh===!0){let i=z_(e,t);if(i)return i}let r=t.worldToLocal(e.point.clone()),n=e.face?e.face.normal.clone().transformDirection(e.object.matrixWorld):e.ray.direction.clone().negate();return n.dot(e.ray.direction)>0&&n.negate(),n.transformDirection(new I_().copy(t.matrixWorld).invert()),{position:[r.x,r.y,r.z],normal:[n.x,n.y,n.z]}}function ea(e,t){let r=e.nativeEvent;return{clientX:r.clientX,clientY:r.clientY,pointerType:"pointerType"in r?r.pointerType:"mouse",...t?{surface:ro(e,t)}:{}}}function px(e,t){if(!(e instanceof F_)||!t)return null;let r=e.geometry.getAttribute("position");if(!r?.count)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let n=new V_,i=new pn;if(lr(e)){let v=e;v.computeBoundingBox(),v.computeBoundingSphere();for(let R=0;R<r.count;R++)n.expandByPoint(e.getVertexPosition(R,i))}else e.geometry.boundingBox||e.geometry.computeBoundingBox(),n.copy(e.geometry.boundingBox);if(n.applyMatrix4(e.matrixWorld),n.isEmpty())return null;let o=n.getCenter(new pn),a=t.getWorldPosition(new pn),s=t.getWorldDirection(new pn),l=t.isOrthographicCamera,d=new U_,u=v=>{if(l){let A=a.distanceTo(o)+n.getSize(i).length()+1;d.set(v.clone().addScaledVector(s,-A),s)}else d.set(a,v.clone().sub(a).normalize());let R=d.intersectObject(e,!1)[0];return R?ro({...R,ray:d.ray},e):null},p=u(o);if(p)return p;let c=e.geometry.index,h=c?.count??r.count,m=new pn,b=new pn,y=new pn,S=new pn,f=new pn,g=new pn,x=null,_=1/0;for(let v=0;v+2<h;v+=3){if(e.getVertexPosition(c?c.getX(v):v,m).applyMatrix4(e.matrixWorld),e.getVertexPosition(c?c.getX(v+1):v+1,b).applyMatrix4(e.matrixWorld),e.getVertexPosition(c?c.getX(v+2):v+2,y).applyMatrix4(e.matrixWorld),S.copy(m).add(b).add(y).multiplyScalar(1/3),G_.getNormal(m,b,y,f),l?g.copy(s).negate():g.copy(a).sub(S),f.dot(g)<=0)continue;let R=S.distanceToSquared(o);R<_&&(_=R,x=S.clone())}return x?u(x):null}import{Mesh as H_,Raycaster as W_,Triangle as q_,Vector2 as mx,Vector3 as On}from"three";function hx(e,t,r,n){if(!(e instanceof H_)||!t)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let i=new On().fromArray(r.position);if(lr(e)){let d=e;d.computeBoundingBox(),d.computeBoundingSphere();let u=d.geometry.getAttribute("position");if(!u)return null;let p=d.geometry.index,c=p?.count??u.count,h=new q_,m=new On,b=new On,y=1/0,S=null;for(let f=0;f+2<c;f+=3){let g=[0,1,2].map(_=>p?p.getX(f+_):f+_);h.a.fromBufferAttribute(u,g[0]),h.b.fromBufferAttribute(u,g[1]),h.c.fromBufferAttribute(u,g[2]),h.closestPointToPoint(i,m);let x=m.distanceToSquared(i);if(!(x>=y||!h.getBarycoord(m,b))&&(y=x,S=new On().addScaledVector(d.getVertexPosition(g[0],new On),b.x).addScaledVector(d.getVertexPosition(g[1],new On),b.y).addScaledVector(d.getVertexPosition(g[2],new On),b.z),y<1e-12))break}if(!S)return null;i.copy(S)}if(i.applyMatrix4(e.matrixWorld).project(t),!Number.isFinite(i.x)||i.z<-1||i.z>1)return null;let o=new mx(n==="left"?-.0035:n==="right"?.0035:0,n==="down"?-.0035:n==="up"?.0035:0),a=new W_,s=r.size*.01,l=new On().fromArray(r.position);for(let d=1;d>=1/1024;d/=2){a.setFromCamera(new mx(i.x,i.y).addScaledVector(o,d),t);let u=a.intersectObject(e,!1)[0];if(u){let p=ro({...u,ray:a.ray},e);if(new On().fromArray(p.position).distanceTo(l)<=s)return p}}return null}import{Box3 as gs,PerspectiveCamera as fx,Sphere as X_,Vector3 as ta}from"three";function gx(e,t,r,n,i,o=!1){return!!(e?.usesSlots&&t.usesSlots&&e.url!==t.url&&r.includes(e.url)&&r.includes(t.url)&&n[e.url]&&n[t.url]&&(o||i[e.url]&&i[t.url]))}function bx(e,t,r){let n=t?.camera;if(!(n instanceof fx))return null;let o=(e instanceof gs?e:new gs().setFromObject(e)).getSize(new ta).length();return!Number.isFinite(o)||o<=0?null:(n.near=o/100,n.far=o*100,n.updateProjectionMatrix(),t&&r===void 0&&(t.maxDistance=o*10),o)}function vx(e,t){let r=e.camera;if(!(r instanceof fx)||!(t>0))return;let n=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(n-r.near)<=r.near*.01||(r.near=n,r.updateProjectionMatrix())}var Dc={paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5},bs={kind:"model"};function yx(e,t){let r=new gs().setFromObject(t);return r.isEmpty()?!1:(r.expandByScalar(r.getSize(new ta).length()*.05),r.containsPoint(e.getTarget(new ta)))}function xx(e,t){return e.getTarget(new ta).distanceTo(t)<=Math.max(e.distance,1)*.001}async function sm(e,t,r=.6){let n=e.smoothTime;e.smoothTime=$o(e,r);try{return await t()}finally{e.smoothTime=n}}async function wx(e,t,{flyIn:r,onStart:n,invalidate:i}){if(r){let o=(t instanceof gs?t:new gs().setFromObject(t)).getBoundingSphere(new X_),a=o.center.clone(),l=e.getPosition(new ta).clone().sub(e.getTarget(new ta));l.lengthSq()<1e-6&&l.set(0,0,1),l.normalize();let d=Math.max(o.radius*10,20),u=a.clone().add(l.multiplyScalar(d));await e.setLookAt(u.x,u.y,u.z,a.x,a.y,a.z,!1)}n(),await sm(e,()=>e.fitToBox(t,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(o=>{let a=performance.now(),s=()=>{e.active===!1||performance.now()-a>8e3?(e.dispatchEvent({type:"update"}),i(),o()):(i(),setTimeout(s,100))};setTimeout(s,100)})}import{useEffect as $_,useMemo as Mx,useRef as Y_}from"react";import{useFrame as K_,useThree as Q_}from"@react-three/fiber";import{Box3 as J_,Box3Helper as Z_,Group as eE}from"three";import{jsx as tE}from"react/jsx-runtime";function Sx({source:e,highlights:t}){let r=Q_(a=>a.invalidate),n=Mx(()=>new eE,[]),i=Mx(()=>t.map(a=>{let s=new Z_(new J_,a.color);s.raycast=()=>{};let l=s.material;return l.depthTest=!1,l.transparent=!0,l.opacity=.85,s.renderOrder=1e3,Vo(s),{helper:s,id:a.objectId}}),[t]);$_(()=>{for(let{helper:a}of i)n.add(a);return r(),()=>{for(let{helper:a}of i)n.remove(a),a.geometry.dispose(),a.material.dispose();r()}},[n,i,r]);let o=Y_(null);return K_(()=>{let a=e.current;if(!a){n.visible=!1;return}n.visible=!0,(o.current?.root!==a||o.current.helpers!==i)&&(o.current={root:a,helpers:i,nodes:ci(a).nodesById});let s=o.current.nodes;for(let{helper:l,id:d}of i){let u=s[d];l.visible=!!u,u&&l.box.setFromObject(u)}}),tE("primitive",{object:n})}function Cx(e){let t=[],r="",n=null,i=null,o=0,a="stopped",s=!1,l=[],d=0,u=!1,p=!1,c={sequenceId:null,time:0,duration:0,status:a,previewing:s,ready:!1,issues:[]},h=new Set,m=()=>t.find(x=>x.id===i),b=()=>{c={sequenceId:i,time:o,duration:m()?.duration??0,status:a,previewing:s,ready:!!n,issues:l},h.forEach(x=>x())},y=()=>{n?.restore(),o=0,a="stopped",s=!1,b(),n?.invalidate()},S=x=>t.some(_=>_.id===x)?(i===x||(n?.restore(),i=x,o=0,a="stopped",s=!1,l=n?.inspect(m())??[],b(),n?.invalidate()),!0):!1,f=x=>{if(x&&!S(x))return!1;let _=m();return!n||!_?.tracks.some(v=>!v.muted&&v.keyframes.length)?!1:(e?.(),p=!0,o>=_.duration&&(o=0),a="playing",s=!0,l=n.inspect(_),b(),n.invalidate(),!0)},g=()=>{if(!n||!u||p)return;let x=t.find(_=>_.autoPlay);x&&f(x.id)};return{getState:()=>c,subscribe:x=>(h.add(x),()=>{h.delete(x)}),select:S,play:f,stop:y,pause:()=>{a==="playing"&&(a="paused",b())},seek:x=>{let _=m();return!n||!_||!Number.isFinite(x)?!1:(e?.(),o=Math.max(0,Math.min(_.duration,x)),s=!0,a!=="playing"&&(a="paused"),l=n.inspect(_),b(),n.invalidate(),!0)},capture:x=>n?.capture(x)??null,configure:(x,_)=>{u=_;try{let v=ec(x??[]),R=JSON.stringify(v);if(r===R){g();return}n?.restore(),t=v,r=R,m()||(i=t[0]?.id??null,o=0,s=!1),o=Math.min(o,m()?.duration??0),a=s?"paused":"stopped",l=m()?n?.inspect(m())??[]:[],b(),n?.invalidate(),g()}catch(v){y(),t=[],r="",i=null,l=[v instanceof Error?v.message:"Invalid sequence configuration."],b()}},connect:x=>{n?.restore(),n=x,x||(a="stopped",s=!1,o=0),l=m()?n?.inspect(m())??[]:[],b(),g()},advance:x=>{let _=m();if(!_||!n||a!=="playing"||!Number.isFinite(x)||x<0)return;let v=Math.min(x,.1);o+=v,d+=v,o>=_.duration&&(_.loop?o%=_.duration:(o=_.duration,a="finished")),(d>=1/30||a==="finished")&&(d=0,b())},frame:()=>{let x=m();return s&&x?{sequence:x,time:o,playing:a==="playing"}:null},destroy:()=>{n?.restore(),n=null,a="stopped",s=!1,o=0,b()}}}import{useLayoutEffect as Ic,useMemo as nE,useRef as iE}from"react";import{useFrame as oE,useThree as aE}from"@react-three/fiber";import{Color as Tx}from"three";import{Matrix4 as Px,Quaternion as rE,Vector3 as Oc}from"three";function ra(e){return new Px().set(1,e[0],e[1],0,0,1,e[2],0,0,0,1,0,0,0,0,1)}function mn(e,t){e.matrixAutoUpdate=!t,e.updateMatrix(),t&&(e.matrix.makeRotationFromQuaternion(e.quaternion).multiply(ra(t)).scale(e.scale).setPosition(e.position),e.matrixWorldNeedsUpdate=!0)}function Lc(e,t,r){let n=new Oc().setFromMatrixColumn(e,0),i=new Oc().setFromMatrixColumn(e,1),o=new Oc().setFromMatrixColumn(e,2),a=(m,b)=>{let y=m*(b<0?-1:1);return Math.abs(y-b)<1e-10?b:y},s=a(n.length(),t.x);if(Math.abs(s)<1e-12)return{rotation:r.clone(),scale:t.clone(),shear:void 0};n.divideScalar(s);let l=n.dot(i);i.addScaledVector(n,-l);let d=a(i.length(),t.y);if(Math.abs(d)<1e-12)return{rotation:r.clone(),scale:t.clone(),shear:void 0};i.divideScalar(d);let u=n.dot(o);o.addScaledVector(n,-u);let p=i.dot(o);o.addScaledVector(i,-p);let c=a(o.length(),t.z);if(Math.abs(c)<1e-12)return{rotation:r.clone(),scale:t.clone(),shear:void 0};o.divideScalar(c);let h=[l/d,u/c,p/c].map(m=>Math.abs(m)<1e-10?0:m);return{rotation:new rE().setFromRotationMatrix(new Px().makeBasis(n,i,o)).normalize(),scale:new Oc(s,d,c),shear:h.some(Boolean)?h:void 0}}var lm=e=>e==="baseColor"?"color":e;function _x(e){let t=new Set;return e.traverse(r=>{let n=r;if(n.isMesh)for(let i of Array.isArray(n.material)?n.material:[n.material])i&&t.add(i)}),[...t]}function Ex({root:e,controls:t,animations:r,invalidate:n}){let i=new Map,o=new Map,a=new Map,s=new Set,l=new Map,d=null,u="",p=f=>e()?cn(e(),f):null,c=f=>{if(f.kind==="camera"){let R=t();if(!R)return null;let A=$r(R.camera,R);return{position:A.position,target:A.target,fov:A.fov,zoom:A.zoom}}if(f.kind==="clip"){let R=r();return R?.clips.includes(f.clip)?R.getState?.().active.find(A=>A.clip===f.clip)?.time??0:null}let g=p(f.objectId);if(!g)return null;let x=f.property;if(x==="position"||x==="rotation"||x==="scale")return[g[x].x,g[x].y,g[x].z];if(x==="visible")return g.visible;let _=_x(g).find(R=>R[lm(x)]!==void 0),v=_?_[lm(x)]:void 0;return v?.isColor?`#${v.getHexString()}`:typeof v=="number"?v:null},h=f=>{let g=t();g&&(g.stop(),g.setLookAt(...f.position,...f.target,!1),f.fov!==null&&"fov"in g.camera&&(g.camera.fov=f.fov,g.camera.updateProjectionMatrix()),g.zoomTo(f.zoom,!1),g.update(0))},m=f=>{if(i.has(f))return;f.updateWorldMatrix(!0,!0);let g=f.matrixAutoUpdate?void 0:Lc(f.matrix,f.scale,f.quaternion).shear;i.set(f,{position:f.position.toArray(),rotation:[f.rotation.x,f.rotation.y,f.rotation.z],scale:f.scale.toArray(),matrix:f.matrix.clone(),auto:f.matrixAutoUpdate,shear:g});for(let x of un(f))Ho(x)||(di(x,x.matrixWorld),s.add(x))},b=(f,g)=>{let x=r();x?.stop(f),g&&x&&(x.play(f,{alongside:!0,reverse:g.reverse}),x.setSpeed(g.speed,f),x.seek?.(g.time,f),g.status!=="playing"&&x.pause(f))};return{capture:c,restore:()=>{for(let[f,g]of l)b(f,g);l.clear();for(let[f,g]of i)f.position.fromArray(g.position),f.rotation.set(...g.rotation),f.scale.fromArray(g.scale),f.matrix.copy(g.matrix),f.matrixAutoUpdate=g.auto,f.matrixWorldNeedsUpdate=!0;i.clear(),o.forEach((f,g)=>g.visible=f),o.clear(),a.forEach((f,g)=>{f.forEach((x,_)=>{x instanceof Tx?g[_].copy(x):g[_]=x}),g.needsUpdate=!0}),a.clear(),s.forEach(qr),s.clear(),d&&h(d),d=null,u="",e()?.updateWorldMatrix(!0,!0),n()},inspect:f=>f.tracks.filter(g=>!g.muted&&g.keyframes.length&&c(g.target)===null).map(g=>`Unavailable target: ${g.name}.`),invalidate:n,apply:({sequence:f,time:g,playing:x})=>{let _=f.tracks.map(A=>({track:A,value:$b(A,g)})).filter(A=>A.value!==null);for(let[A,w]of l)_.some(({track:C})=>C.target.kind==="clip"&&C.target.clip===A)||(b(A,w),l.delete(A));for(let{track:A}of _)if(A.target.kind==="object"&&["position","rotation","scale"].includes(A.target.property)){let w=p(A.target.objectId);w&&m(w)}let v=new Map([...a.keys()].map(A=>[A,A.transparent]));o.forEach((A,w)=>w.visible=A),i.forEach((A,w)=>{w.position.fromArray(A.position),w.rotation.set(...A.rotation),w.scale.fromArray(A.scale),mn(w,A.shear)}),a.forEach((A,w)=>A.forEach((C,P)=>{C instanceof Tx?w[P].copy(C):w[P]=C}));let R=r();for(let{track:A,value:w}of _){if(A.target.kind!=="clip"||!R?.seek||!R.clips.includes(A.target.clip))continue;let C=A.target.clip;l.has(C)||(l.set(C,R.getState?.().active.find(P=>P.clip===C)),R.play(C,{alongside:!0}),R.pause(C)),R.seek(w,C)}for(let{track:A,value:w}of _){let C=A.target;if(C.kind==="clip")continue;if(C.kind==="camera"){d||(d=c(C));let T=JSON.stringify(w);(x||T!==u)&&(h(w),u=T);continue}let P=p(C.objectId);if(!P)continue;let E=C.property;if(E==="visible")o.has(P)||o.set(P,P.visible),P.visible=w;else if(E==="position"||E==="rotation"||E==="scale")E==="rotation"?P.rotation.set(...w):P[E].fromArray(w),mn(P,i.get(P)?.shear);else for(let T of _x(P)){let O=lm(E),j=T[O];if(j===void 0)continue;let I=a.get(T);if(I||(I=new Map,a.set(T,I)),v.has(T)||v.set(T,T.transparent),I.has(O)||I.set(O,j?.isColor?j.clone():j),j?.isColor?j.set(w):T[O]=w,E==="opacity"){I.has("transparent")||I.set("transparent",T.transparent);let N=w<1||I.get("transparent")===!0;T.transparent=N}}}d&&!_.some(({track:A})=>A.target.kind==="camera")&&(h(d),u=""),v.forEach((A,w)=>{A!==w.transparent&&(w.needsUpdate=!0)}),e()?.updateWorldMatrix(!0,!0)}}}function Ax({controller:e,source:t,controls:r,animations:n,ready:i,sequences:o,autoPlay:a,authoredRevision:s}){let l=aE(p=>p.invalidate),d=iE({source:t,controls:r,animations:n});d.current={source:t,controls:r,animations:n};let u=nE(()=>Ex({root:()=>d.current.source.current,controls:()=>d.current.controls.current,animations:()=>d.current.animations.current,invalidate:l}),[e,l]);return Ic(()=>(l(),()=>u.restore()),[u,s,o,l]),Ic(()=>{e.configure(o,a)},[e,o,a]),Ic(()=>(e.connect(i?u:null),()=>e.connect(null)),[e,u,i]),Ic(()=>{let p=r.current,c=()=>e.pause();return p?.addEventListener("controlstart",c),()=>p?.removeEventListener("controlstart",c)},[e,r,i]),oE((p,c)=>{if(!i)return;e.advance(c);let h=e.frame();h&&u.apply(h),h?.playing&&l()}),null}import{useEffect as Rx,useRef as kx,useState as Dx}from"react";function Ox(e,t){if(!e?.configuration)return e;let r=e.configuration,n=r.models?.find(o=>Be(o)===t||o.url===t);if(!n)return e;let i=r.activeModelId??r.modelUrl;return{...e,objectBindings:n.objectBindings,configuration:{...r,models:r.models?.map(o=>Be(o)===i?{...o,sceneConfig:r.sceneConfig,objectBindings:e.objectBindings??o.objectBindings}:o),activeModelId:Be(n),modelUrl:n.url,sceneConfig:n.sceneConfig??r.sceneConfig}}}function Lx(e){let[t,r]=Dx(null),[n,i]=Dx(null),o=mc(e.arHandoff),a=!!e.arHandoff&&o?.autoRestore!==!1,s=o?.storage,l=`${e.modelUrl}
4
+ ${e.activeModelId??""}`,d=kx(l);d.current=l;let u=kx(l);if(Rx(()=>{l!==u.current&&(u.current=l,r(null))},[l]),Rx(()=>{if(!a||typeof window>"u"){r(null),i(null);return}let c,h=()=>{c?.abort(),c=new AbortController;let m=c.signal,b=d.current;i(null),jv(window.location.href,s,m).then(y=>{!m.aborted&&d.current===b&&r(y)}).catch(y=>{!m.aborted&&d.current===b&&(r(null),i(y instanceof Error?y.message:"Could not restore the AR configuration."))})};return h(),window.addEventListener("hashchange",h),()=>{c?.abort(),window.removeEventListener("hashchange",h)}},[a,s]),!t?.configuration)return{props:e,error:n};let p=t.configuration;return{error:n,props:{...e,...p,objectBindings:t.objectBindings??e.objectBindings,onObjectBindingsChange:c=>{r(h=>h?.configuration?{...h,objectBindings:c,configuration:{...h.configuration,models:h.configuration.models?.map(m=>Be(m)===(h.configuration?.activeModelId??h.configuration?.modelUrl)?{...m,objectBindings:c}:m)}}:h),e.onObjectBindingsChange?.(c)},onSceneConfigChange:c=>{r(h=>h?.configuration?{...h,configuration:{...h.configuration,sceneConfig:c}}:h),e.onSceneConfigChange?.(c)},onIsolationChange:c=>{r(h=>h?.configuration?{...h,configuration:{...h.configuration,isolation:c}}:h),e.onIsolationChange?.(c)},onActiveModelChange:c=>{r(h=>Ox(h,c)),e.onActiveModelChange?.(c)},onModelChange:c=>{r(h=>Ox(h,c)),e.onModelChange?.(c)}}}}import{useCallback as cm,useEffect as Bc,useRef as vs,useState as um}from"react";function Ix({enabled:e,options:t,state:r,getSources:n,baseUrl:i,revision:o=""}){let a,s=!1;try{a=e?Bv(r,t?.assetVersion,t?.maxTextureSize)+(i??"")+o:"disabled"}catch{s=!0,a="invalid-configuration"+(t?.assetVersion??"")+o}let[l,d]=um(!1),[u,p]=um(!1),[c,h]=um(null),m=vs(null),b=vs(!1),y=vs(null),S=vs(null),f=vs({key:a,state:r,options:t,getSources:n,baseUrl:i,enabled:e,invalidConfiguration:s});f.current={key:a,state:r,options:t,getSources:n,baseUrl:i,enabled:e,invalidConfiguration:s};let g=cm(()=>{y.current&&URL.revokeObjectURL(y.current),y.current=null},[]);Bc(()=>{m.current?.abort(),b.current=!1,p(!1),g(),h(w=>e&&w?{key:w.key,invalidated:!0,warnings:[]}:null),e||d(!1)},[a,e,g]),Bc(()=>()=>{m.current?.abort(),g()},[g]);let x=e&&!c?.invalidated&&c?.key===a,_=x&&!!(c.usdzUrl||c.phoneUrl),v=u?"preparing":e?c&&!x?"stale":x?_?"ready":"error":"idle":"idle";Bc(()=>{f.current.options?.onStatusChange?.(v)},[v]);let R=cm(()=>{m.current?.abort(),b.current&&(h(null),g()),b.current=!1,p(!1),d(!1)},[g]),A=cm(async()=>{let w=f.current;if(!w.enabled)return;m.current?.abort(),g(),h(null),p(!0),b.current=!0;let C=new AbortController;m.current=C;let P=()=>!C.signal.aborted&&f.current.key===w.key&&f.current.enabled,E=k=>{P()&&h(U=>({...U?.key===w.key&&!U.invalidated?U:{key:w.key,warnings:[]},...k}))},T;try{if(w.invalidConfiguration)throw new Error("Invalid configuration");T=structuredClone(w.state)}catch{let k=new Error("Configuration contains data that cannot be copied for AR. Use JSON-compatible binding metadata.");b.current=!1,p(!1),E({exportError:k.message}),w.options?.onError?.(k);return}let O,j={configurationKey:w.key,state:T,signal:C.signal,exportUSDZ:()=>O??(O=Promise.resolve().then(()=>Vv(w.getSources(),{scaleMode:w.state.configuration?.arScaleMode,maxTextureSize:w.options?.maxTextureSize,signal:C.signal})))},I=[],N=async()=>{try{let k=w.options?.createUSDZ?await w.options.createUSDZ(j):(await j.exportUSDZ()).blob,U=O?await O.then(re=>re.warnings,()=>[]):[];if(!P())return;let te;if(typeof k=="string")te=Vp(k,window.location.href);else if(k instanceof Blob&&k.size>0)te=URL.createObjectURL(k),y.current=te;else throw new Error("The USDZ adapter returned an empty asset.");E({usdzUrl:te,warnings:U})}catch(k){let U=k instanceof Error?k.message:String(k);I.push(U),E({exportError:U})}},D=async()=>{try{let k=w.options?.createMobileUrl?await w.options.createMobileUrl(j):await Iv(j.state,window.location.href).then(te=>Nv(te,w.baseUrl||window.location.href,w.options?.storage,C.signal));if(!P())return;let U=Vp(k,window.location.href);if(U.length>2200)throw new Error("The phone link is too long for a reliable QR code.");E({phoneUrl:U})}catch(k){let U=k instanceof Error?k.message:String(k);!w.options?.createMobileUrl&&U.includes("durable URL")&&(U="QR sharing isn\u2019t available for local uploads. Download the USDZ and send it to your phone."),!w.options?.createMobileUrl&&(U.includes("reachable from your phone")||U.includes("asset URL points to this computer"))&&(U="QR sharing needs a viewer page and model files your phone can reach. Use an online viewer, or download the USDZ."),I.push(U),E({linkError:U})}};await Promise.all([N(),D()]),P()&&(b.current=!1,p(!1),I.length&&w.options?.onError?.(new Error(I.join(`
5
+ `))))},[g]);return Bc(()=>{if(!e||!l){S.current=null;return}_||u||S.current===a||(S.current=a,A())},[e,l,a,_,u,A]),{open:e&&l,show:()=>d(!0),close:R,prepare:A,status:v,busy:u,prepared:x?c:null}}import{useEffect as sE,useId as lE,useRef as cE}from"react";import{QRCodeSVG as uE}from"qrcode.react";import{Download as dE,LoaderCircle as pE,RefreshCw as mE,Smartphone as hE,X as fE}from"lucide-react";import{Fragment as gE,jsx as zt,jsxs as bi}from"react/jsx-runtime";function Bx({handoff:e,filename:t,onQuickLook:r}){let n=ue(),i=lE(),o=cE(null),a=e.close;sE(()=>{let l=document.activeElement;o.current?.focus();let d=u=>{if(u.key==="Escape"&&(u.preventDefault(),a()),u.key!=="Tab")return;let p=Array.from(o.current.querySelectorAll("button:not(:disabled), a[href], summary")),c=p[0],h=p[p.length-1];u.shiftKey&&(document.activeElement===c||document.activeElement===o.current)?(u.preventDefault(),h?.focus()):!u.shiftKey&&(document.activeElement===h||document.activeElement===o.current)&&(u.preventDefault(),c?.focus())};return document.addEventListener("keydown",d),()=>{document.removeEventListener("keydown",d),l?.focus()}},[a]);let s=e.prepared;return zt("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:l=>{l.target===l.currentTarget&&a()},children:bi("section",{ref:o,tabIndex:-1,className:"ri-mobileHandoffDialog ri-configuredARDialog",role:"dialog","aria-modal":"true","aria-labelledby":i,"aria-busy":e.busy&&!s?.phoneUrl&&!s?.usdzUrl,children:[zt("button",{type:"button",className:"ri-mobileHandoffClose",onClick:a,"aria-label":n("closePhoneHandoff"),children:zt(fE,{size:18})}),zt(hE,{size:22,"aria-hidden":"true"}),zt("h2",{id:i,children:n("arConfiguredTitle")}),zt("p",{children:n("arConfiguredDescription")}),zt("div",{role:"status","aria-live":"polite",className:"ri-configuredARProgress",children:(e.busy||e.status==="idle"||e.status==="stale")&&bi("p",{children:[zt(pE,{size:16,"aria-hidden":"true"}),n("arPreparing")]})}),s?.phoneUrl&&bi(gE,{children:[zt("p",{children:n("arScanConfigured")}),zt("div",{className:"ri-mobileHandoffQr",children:zt(uE,{value:s.phoneUrl,size:208,level:"M",marginSize:4,title:n("qrCodeToOpenThisModelOnAPhone")})}),zt("a",{href:s.phoneUrl,target:"_blank",rel:"noopener noreferrer",children:n("arOpenConfiguredLink")})]}),s?.usdzUrl&&bi("div",{className:"ri-configuredARActions",children:[hc()&&bi("a",{rel:"ar",className:"ri-configuredARLaunch",href:s.usdzUrl,onClick:r,children:[zt("img",{alt:"",width:"1",height:"1",src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}),n("viewInAR")]}),bi("a",{href:s.usdzUrl,download:`${t}-configured.usdz`,children:[zt(dE,{size:14}),n("arDownloadUSDZ")]})]}),s?.exportError&&zt("p",{role:"alert",children:s.exportError}),s?.linkError&&zt("p",{role:"status",children:s.linkError}),!e.busy&&(e.status==="ready"||e.status==="error")&&bi("button",{type:"button",className:"ri-configuredARRefresh",onClick:()=>{e.prepare()},children:[zt(mE,{size:14,"aria-hidden":"true"}),e.status==="error"?n("arRetry"):n("arRefresh")]}),!!s?.warnings.length&&bi("details",{className:"ri-configuredARDetails",children:[zt("summary",{children:n("arExportDetails")}),s.warnings.map(l=>zt("p",{className:"ri-configuredARNote",children:l},l))]})]})})}import{useRef as ge,useState as Ee,useEffect as Ge,useCallback as ye,useMemo as Mt,Suspense as P1}from"react";import{createPortal as U2}from"react-dom";import{Box3 as G2,Color as H2,Raycaster as W2,Vector2 as q2,Vector3 as Rf}from"three";import{Component as bE}from"react";var hn=class extends bE{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,n){this.props.onLoadError?.(r)}render(){return this.state.hasError?null:this.props.children}};import{useCallback as Nx,useEffect as jx,useState as vE}from"react";function zx({enabled:e,activeUrl:t,models:r,errorsRef:n,activeFailed:i,activeError:o,onActiveError:a,onExtraError:s}){let[l,d]=vE(0),u=Nx((c,h)=>{n.current.set(c,h),d(m=>m+1),c!==t&&s?.(c,h)},[t,n,s]),p=Nx(c=>{n.current.delete(c)&&d(h=>h+1)},[n]);return jx(()=>{let c=new Set(e?r?.map(Be):[]);for(let h of n.current.keys())c.has(h)||n.current.delete(h)},[e,r,n]),jx(()=>{if(!e||!n.current.has(t))return;let c=n.current.get(t);i&&Object.is(o,c)||a(c)},[e,t,r,n,l,i,o,a]),{reportError:u,clearError:p}}import{useCallback as yE,useEffect as Vx,useRef as Nc}from"react";function Fx(e,t){let r=Nc({}),n=Nc({}),i=Nc({}),o=Nc(0),a=yE(s=>{var l;return(l=i.current)[s]??(l[s]={current:{}})},[]);return Vx(()=>{let s=new Set(e?t?.map(Be):[]);for(let l of Object.keys(r.current))s.has(l)||delete r.current[l];for(let l of Object.keys(n.current))s.has(l)||delete n.current[l];for(let l of Object.keys(i.current))s.has(l)||(i.current[l].current={},delete i.current[l])},[e,t]),Vx(()=>{let s=++o.current;return()=>{queueMicrotask(()=>{o.current===s&&(r.current={},n.current={},Object.values(i.current).forEach(l=>{l.current={}}),i.current={})})}},[]),{scenesByUrlRef:r,cameraHomesByUrlRef:n,materialRefsByUrlRef:i,getMaterialRefsForUrl:a}}import{useCallback as Ux,useEffect as ME,useState as Gx}from"react";import{useEffect as xE,useRef as wE}from"react";function Ln(e,t){let r=wE(t);xE(()=>{let n=r.current;r.current=t,t.some((i,o)=>!Object.is(i,n[o]))&&e()},t)}var SE={};function Hx({modelUrl:e,activeModelId:t,tilesetUrl:r,models:n,objectBindings:i="auto",onChange:o,initialBindings:a,initialModelEdits:s}){let l=t??e,d=!!(n?.length&&!r),u=i==="auto"&&!d,p=!u&&o!==void 0,c=i==="auto"?SE:i,[h,m]=Gx(()=>a??c),[b,y]=Gx(()=>{let _=new Map(s),v=d?n?.find(R=>Be(R)===l):void 0;return v&&a&&s===void 0&&_.set(l,{source:v.objectBindings,bindings:a}),_});Ln(()=>{p||m(c)},[p,c]),ME(()=>{let _=new Map(d?n?.map(v=>[Be(v),v.objectBindings]):[]);y(v=>{let R=[...v].filter(([A,w])=>!p&&_.get(A)===w.source);return R.length===v.size?v:new Map(R)})},[d,n,p]);let S=Ux(_=>{let v=p?void 0:b.get(Be(_));return v?.source===_.objectBindings?v.bindings:_.objectBindings},[p,b]),f=d?n?.find(_=>Be(_)===l):void 0,g=f?S(f):p?c:h,x=Ux(_=>{p||(f?y(v=>new Map(v).set(Be(f),{source:f.objectBindings,bindings:_})):m(_)),o?.(_)},[p,f,o]);return{autoBindings:u,controlled:p,currentBindings:g,applyBindings:x,bindingsForModel:S,modelEdits:b}}import{PerspectiveCamera as dm,Vector2 as CE}from"three";function jc(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:r,scene:n,camera:i,invalidate:o}=e,a=pi(r);if(!a&&!r.getContextAttributes().preserveDrawingBuffer)return Promise.reject(new Error("Screenshot capture is disabled. Set preserveDrawingBuffer on ModelViewer to enable it."));let{transparent:s=!1,type:l="image/png",quality:d}=t,u=r.getSize(new CE),p=r.getPixelRatio(),c=i instanceof dm?i.aspect:null,h=n.background,m=t.width??u.x,b=t.height??u.y,y=m!==u.x||b!==u.y,S=Zl(n);s&&(n.background=null),y&&(r.setPixelRatio(1),r.setSize(m,b,!1),i instanceof dm&&(i.aspect=m/b,i.updateProjectionMatrix()));let f=()=>{S(),s&&(n.background=h),y&&(r.setPixelRatio(p),r.setSize(u.x,u.y,!1),i instanceof dm&&c!==null&&(i.aspect=c,i.updateProjectionMatrix())),o()};if(a)try{return r.render(n,i),Promise.resolve(r.domElement.toDataURL(l,d))}catch(g){return Promise.reject(g)}finally{f()}return o(),new Promise((g,x)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let _,v;try{_=r.domElement.toDataURL(l,d)}catch(R){v=R}f(),v?x(v):g(_)})})})}import{useEffect as PE,useRef as TE}from"react";import{GizmoHelper as _E,GizmoViewport as EE}from"@react-three/drei";import{useThree as AE}from"@react-three/fiber";import{jsx as pm}from"react/jsx-runtime";function Wx({onUpdate:e}){let t=AE(n=>n.scene),r=TE(null);return PE(()=>{if(r.current)return Xb(t,r.current)},[t]),pm(_E,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:e,children:pm("group",{ref:r,children:pm(EE,{axisColors:["#e5484d","#46a758","#3e8bff"],labelColor:"white"})})})}import{useCallback as Vc,useEffect as BE,useRef as Kx,useState as Qx}from"react";import{Vector3 as Jx}from"three";import{useEffect as zc,useMemo as In,useRef as Bn}from"react";import{useFrame as RE,useThree as kE}from"@react-three/fiber";import{Box3 as DE,CatmullRomCurve3 as qx,Sphere as OE,Spherical as LE,Vector3 as vi}from"three";function mm(e){if(e.duration!==void 0)return e.duration;let t=e.waypoints??[];if(t.length<2)return 24;let r=e.loop===!1?t.slice(0,-1):t;return Math.max(r.reduce((n,i)=>n+(i.segmentDuration??3.5),0),4)}var IE=1.2;function na({controlsRef:e,sceneRef:t,config:r,playing:n,resetOnPlay:i=!1,onFinished:o,onUserInteract:a,onStop:s,playOnce:l=!1,startAtPath:d=!1,onStarted:u,onProgress:p}){let c=kE(D=>D.invalidate),h=In(()=>r.waypoints??[],[r.waypoints]),m=h.length>=2,b=r.loop??!0,y=mm(r),S=In(()=>h.map(D=>[...D.position,...D.target,D.azimuthAngle??"",D.polarAngle??"",D.segmentDuration??""].join(",")).join(";"),[h]),f=In(()=>{let D=[];if(h.length<2)return D;let k=0;for(let U=0;U<h.length-1;U++)k+=h[U].segmentDuration??3.5,D.push(k);return b&&h.length>1&&(k+=h[h.length-1].segmentDuration??3.5,D.push(k)),D},[h,b]),g=In(()=>D=>{if(h.length<2||f.length===0)return D/y;let k=f[f.length-1],U=b?D%y:Math.min(D,y),te=y>0?U/y*k:0;for(let re=0;re<f.length;re++)if(te<=f[re]){let Z=re===0?0:f[re-1],ne=f[re]-Z,X=ne>0?(te-Z)/ne:0,G=b?h.length:h.length-1,H=re/G,ae=1/G;return H+X*ae}return 1},[h.length,f,y,b]),x=In(()=>m?{position:new qx(h.map(D=>new vi(...D.position)),b,"catmullrom",.5),target:new qx(h.map(D=>new vi(...D.target)),b,"catmullrom",.5)}:null,[S,m,b]),_=In(()=>{if(!m||!h.every(k=>Number.isFinite(k.azimuthAngle)&&Number.isFinite(k.polarAngle)))return null;let D=h.map(k=>({azimuth:k.azimuthAngle,polar:k.polarAngle,distance:new vi(...k.position).distanceTo(new vi(...k.target))}));for(let k=1;k<D.length;k+=1){let U=D[k-1].azimuth,te=D[k].azimuth;D[k].azimuth=te+Math.round((U-te)/(Math.PI*2))*Math.PI*2}return D},[S,m]),v=Bn(0),R=Bn(0),A=Bn(new vi),w=Bn(new vi),C=Bn(!1),P=Bn(!0),E=Bn(0),T=Bn(!1),O=Bn(null),j=In(()=>new vi,[]),I=In(()=>new vi,[]),N=In(()=>new LE,[]);return zc(()=>{v.current=0,E.current=0,R.current=0,T.current=!1},[S,b,y]),zc(()=>{i&&(E.current=0,v.current=0,T.current=!1)},[i]),zc(()=>{if(!n){C.current=!1,v.current>0&&!i?E.current=v.current:i&&(E.current=0),(v.current>0||T.current)&&s?.();return}v.current>=y&&!b&&(v.current=0,E.current=0,T.current=!1);let D=e.current;if(D&&(D.getPosition(A.current),D.getTarget(w.current)),i||T.current||E.current===0?(v.current=0,E.current=0,T.current=!1):E.current>0&&E.current<y?v.current=E.current:(v.current=0,E.current=0),R.current=0,!m){let k=t.current;if(k){let U=new DE().setFromObject(k).getBoundingSphere(new OE);O.current={center:U.center.clone(),radius:U.radius>0?U.radius:1}}}C.current=!0,P.current=!0,c()},[n,m,e,t,c,y,b,S,i,s]),zc(()=>{if(!n||!a)return;let D=e.current;if(!D)return;let k=()=>{T.current||a()};return D.addEventListener("controlstart",k),()=>D.removeEventListener("controlstart",k)},[n,e,a]),RE((D,k)=>{if(!n||!C.current)return;let U=e.current;if(!U)return;let te=P.current;P.current=!1,(!te||!d)&&(v.current+=k,R.current+=k);let re=(!b||l)&&v.current>=y,Z=re&&b?0:g(v.current);if(Z=b?Z%1:Math.min(Z,1),x)if(x.target.getPoint(Z,I),_){let X=b?_.length:_.length-1,G=Math.min(Z,1)*X,H=Math.min(Math.floor(G),X-1),ae=(H+1)%_.length,xe=Z>=1?1:G-H,Ie=xe*xe*(3-2*xe),q=_[H],be=_[ae],Pe=be.azimuth+Math.round((q.azimuth-be.azimuth)/(Math.PI*2))*Math.PI*2,pe=q.azimuth+(Pe-q.azimuth)*Ie,ft=q.polar+(be.polar-q.polar)*Ie,J=q.distance+(be.distance-q.distance)*Ie;N.set(Math.max(J,1e-6),Math.min(Math.max(ft,1e-6),Math.PI-1e-6),pe),j.setFromSpherical(N).add(I)}else x.position.getPoint(Z,j);else{let X=O.current;if(!X)return;let G=Z*Math.PI*2,H=X.radius*2.2;j.set(X.center.x+Math.cos(G)*H,X.center.y+X.radius*.6,X.center.z+Math.sin(G)*H),I.copy(X.center)}let ne=d?1:Math.min(R.current/IE,1);if(ne<1){let X=ne*ne*(3-2*ne);j.lerpVectors(A.current,j,X),I.lerpVectors(w.current,I,X)}if(U.setLookAt(j.x,j.y,j.z,I.x,I.y,I.z,!1),te&&u?.(),p?.(Math.min(v.current/y,1)),re){C.current=!1,T.current=!0,v.current=0,E.current=0,o?.();return}c()}),null}function Xx(){return typeof document<"u"&&typeof HTMLCanvasElement<"u"&&typeof HTMLCanvasElement.prototype.captureStream=="function"}function $x(e,t={}){let{fps:r=15,gifWidth:n=480,signal:i}=t;if(!Number.isFinite(r)||r<1||r>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isInteger(n)||n<16||n>4096)throw new Error("GIF width must be a whole number of pixels from 16 to 4096.");if(i?.aborted)throw new DOMException("Video export cancelled.","AbortError");if(typeof e.captureStream!="function"||typeof document>"u")throw new Error("Video recording as GIF is not supported in this browser.");let o=1e3/r,a,s,l,d=null,u,p=0,c=0,h=0,m=null,b=0,y=0,S=0,f=!1,g=!1,x,_,v,R,A,w,C=new Promise((k,U)=>{A=k,w=U}),P=()=>{clearTimeout(x),clearInterval(_),v!==void 0&&cancelAnimationFrame(v),R!==void 0&&cancelAnimationFrame(R),i?.removeEventListener("abort",T),e.removeEventListener("webglcontextlost",O),l&&(l.pause(),l.srcObject=null),s?.getTracks().forEach(k=>k.stop())},E=(k=new DOMException("Video export cancelled.","AbortError"))=>{f||(f=!0,P(),w(k))},T=()=>E(),O=()=>E(new Error("Video export stopped because the WebGL context was lost.")),j=()=>E(new Error("Video export timed out. Keep the viewer tab visible while recording."));i?.addEventListener("abort",T,{once:!0}),e.addEventListener("webglcontextlost",O),x=setTimeout(j,3e4);let I=(async()=>{if(a=await import("gifenc"),!f&&(s=e.captureStream(r),l=document.createElement("video"),l.muted=!0,l.playsInline=!0,l.srcObject=s,await l.play(),!f)){if(d=document.createElement("canvas").getContext("2d",{willReadFrequently:!0}),!d)throw new Error("Video recording as GIF is not supported in this browser.");u=a.GIFEncoder()}})().catch(k=>E(k)),N=k=>{if(!m||!u)return;let U=Math.max(2,Math.round((k-b)/10)-S);S+=U,u.writeFrame(m.index,p,c,{palette:m.palette,delay:U*10}),m=null},D=()=>{if(f||!a||!l||!d||!u||l.readyState<2||!l.videoWidth)return;let k=performance.now();if(!(h>0&&k-y<o/2)){p||(p=Math.min(n,l.videoWidth),c=Math.max(1,Math.round(p*l.videoHeight/l.videoWidth)),d.canvas.width=p,d.canvas.height=c);try{d.drawImage(l,0,0,p,c);let{data:U}=d.getImageData(0,0,p,c),te=a.quantize(U,256),re=a.applyPalette(U,te);h===0&&(b=k),N(k),m={index:re,palette:te},y=k,h+=1}catch(U){E(U)}}};return{result:C,cancel:E,start(k){f||v!==void 0||(v=requestAnimationFrame(()=>{I.then(()=>{f||(D(),_=setInterval(D,o),clearTimeout(x),x=setTimeout(j,(k+30)*1e3))})}))},finish(){f||g||(g=!0,R=requestAnimationFrame(()=>{I.then(()=>{if(f||(D(),f))return;if(!u||h===0){E(new Error("The browser produced an empty video."));return}N(y+o),u.finish();let k=new Blob([u.bytes()],{type:"image/gif"});f=!0,P(),A(k)})}))}}}var hm={webm:["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"],mp4:["video/mp4;codecs=avc1.42E01E","video/mp4"]};function Nn(e="auto"){return e==="gif"?Xx()?"image/gif":null:typeof MediaRecorder>"u"?null:(e==="auto"?[...hm.webm,...hm.mp4]:hm[e]).find(r=>MediaRecorder.isTypeSupported(r))??null}function Yx(e,t={}){if(t.format==="gif")return $x(e,t);let{fps:r=30,videoBitsPerSecond:n=8e6,signal:i}=t;if(!Number.isFinite(r)||r<1||r>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isFinite(n)||n<=0)throw new Error("Video bitrate must be a positive number.");if(i?.aborted)throw new DOMException("Video export cancelled.","AbortError");let o=Nn(t.format);if(!o||typeof e.captureStream!="function"){let v=t.format&&t.format!=="auto"?` as ${t.format.toUpperCase()}`:"";throw new Error(`Video recording${v} is not supported in this browser.`)}let a,s,l=!1,d=!1,u,p,c,h=[],m,b,y=new Promise((v,R)=>{m=v,b=R}),S=()=>{clearTimeout(u),p!==void 0&&cancelAnimationFrame(p),c!==void 0&&cancelAnimationFrame(c),i?.removeEventListener("abort",g),e.removeEventListener("webglcontextlost",x),s&&(s.ondataavailable=null,s.onstop=null,s.onerror=null),a?.getTracks().forEach(v=>v.stop())},f=(v=new DOMException("Video export cancelled.","AbortError"))=>{if(!l){if(l=!0,S(),s&&s.state!=="inactive")try{s.stop()}catch{}b(v)}},g=()=>f(),x=()=>f(new Error("Video export stopped because the WebGL context was lost.")),_=()=>f(new Error("Video export timed out. Keep the viewer tab visible while recording."));return i?.addEventListener("abort",g,{once:!0}),e.addEventListener("webglcontextlost",x),u=setTimeout(_,3e4),{result:y,cancel:f,start(v){l||p!==void 0||(p=requestAnimationFrame(()=>{if(!l)try{a=e.captureStream(r);let R=new MediaRecorder(a,{mimeType:o,videoBitsPerSecond:n});s=R,R.ondataavailable=({data:A})=>{A.size>0&&h.push(A)},R.onerror=()=>f(new Error("The browser could not encode the video.")),R.onstop=()=>{if(l)return;l=!0,S();let A=new Blob(h,{type:R.mimeType||o});A.size===0?b(new Error("The browser produced an empty video.")):m(A)},R.start(1e3),clearTimeout(u),u=setTimeout(_,(v+30)*1e3)}catch(R){f(R)}}))},finish(){l||d||(d=!0,c=requestAnimationFrame(()=>{if(!l)try{if(!s)throw new Error("Video recording did not start.");s.stop()}catch(v){f(v)}}))}}}function Zx(e){let t=Kx(e);t.current=e;let r=Kx(null),[n,i]=Qx(null),[o,a]=Qx(0),s=Vc(()=>r.current?.cancel(),[]),l=Vc(()=>r.current!==null,[]);BE(()=>s,[e.modelUrl,s]);let d=Vc(async(p={})=>{let{rendererCaptureRef:c,controlsRef:h,cinematicConfig:m,ready:b,onCaptureStart:y}=t.current,S=c.current,f=h.current;if(!b||!S||!f)throw new Error("Viewer not ready for video export.");if(S.gl.xr.isPresenting)throw new Error("Exit the XR session before recording a video.");if(r.current)throw new Error("A video export is already in progress.");let g=p.mode??(m?"cinematic":"turntable");if(g==="cinematic"&&!m)throw new Error("Enable a cinematic camera path before recording it.");let x=g==="cinematic"?m:{loop:!0},_=p.duration??(g==="turntable"&&p.format==="gif"?8:mm(x));if(!Number.isFinite(_)||_<=0||_>300)throw new Error("Video duration must be greater than 0 and at most 300 seconds.");let v=Yx(S.gl.domElement,p);r.current=v;let R=f.getPosition(new Jx),A=f.getTarget(new Jx),w=f.enabled,C=Zl(S.scene);f.stop(),f.enabled=!1,a(0),y(),i({config:{...x,duration:_,autoPlay:!1},onStarted:()=>v.start(_),onFinished:v.finish});try{return await v.result}finally{C(),f.enabled=w,f.setLookAt(R.x,R.y,R.z,A.x,A.y,A.z,!1),S.invalidate(),r.current=null,i(null)}},[]),u=Vc(p=>{let c=Math.floor(p*100);a(h=>h===c?h:c)},[]);return{captureVideo:d,cancelVideo:s,isRecording:l,recording:n,progress:o,onProgress:u}}import{useCallback as NE,useEffect as jE,useRef as zE,useState as ys}from"react";function ew(e){let[t,r]=ys(null),[n,i]=ys(!1),[o,a]=ys(!1),[s,l]=ys(!1),[d,u]=ys(null),p=zE(!1);jE(()=>{if(!t||!e){i(!1),a(!1),u(null);return}let h=t.ownerDocument;i(h.fullscreenEnabled===!0&&typeof t.requestFullscreen=="function"&&typeof h.exitFullscreen=="function");let m=()=>{a(h.fullscreenElement===t),u(null)};return m(),h.addEventListener("fullscreenchange",m),()=>h.removeEventListener("fullscreenchange",m)},[t,e]);let c=NE(async()=>{if(!t||!e||!n||p.current)return;let h=t.ownerDocument,m=h.fullscreenElement===t;p.current=!0,l(!0),u(null);try{m?await h.exitFullscreen():await t.requestFullscreen(),a(h.fullscreenElement===t)}catch{u(m?"Could not exit fullscreen. Press Escape to exit.":"Could not enter fullscreen. Check your browser or iframe fullscreen permissions and try again.")}finally{p.current=!1,l(!1)}},[t,e,n]);return{rootRef:r,supported:n,active:o,pending:s,error:d,toggle:c}}import{useCallback as Fc,useEffect as rw,useRef as xs,useState as fm}from"react";function tw(e,{onLost:t,onRestored:r,initiallyLost:n=!1}){let i=n,o=s=>{s.preventDefault(),!i&&(i=!0,t())},a=()=>{i&&(i=!1,r())};return e.addEventListener("webglcontextlost",o),e.addEventListener("webglcontextrestored",a),n&&t(),()=>{e.removeEventListener("webglcontextlost",o),e.removeEventListener("webglcontextrestored",a)}}function nw(e){let t=xs(e);t.current=e;let[r,n]=fm(null),[i,o]=fm(0),[a,s]=fm("ready"),l=xs(null),d=xs(!1),u=xs(null),p=xs(null),c=Fc(y=>{p.current?.dispose(),p.current=null,u.current=y,n(y)},[]),h=Fc(()=>{d.current||(d.current=!0,t.current?.(),l.current?.(),l.current=null,u.current&&(p.current=u.current),u.current=null,n(null),s("rebuilding"),o(y=>y+1))},[]),m=Fc(()=>{l.current?.(),l.current=null;let y=u.current;u.current=null,n(null),y&&ty(y)},[]),b=Fc(()=>{d.current=!1,s("lost")},[]);return rw(()=>()=>{p.current?.dispose(),p.current=null},[]),rw(()=>{if(!r)return;if(d.current=!1,s("ready"),pi(r)){let S=r,f=S.onDeviceLost;return S.onDeviceLost=g=>{console.warn("[react-immersive] The WebGPU device was lost.",g),b()},()=>{S.onDeviceLost=f}}let y=tw(r.domElement,{initiallyLost:r.getContext().isContextLost(),onLost:b,onRestored:h});return l.current=y,()=>{y(),l.current===y&&(l.current=null)}},[r,b,h]),{generation:i,status:a,reload:h,fail:b,release:m,onRendererCreated:c}}function Uc(e,t){return t||e}async function iw(e,t){await e.setLookAt(...t.position,...t.target,!1);let r=e.camera;t.fov!=null&&Number.isFinite(t.fov)&&t.fov>0&&t.fov<180&&"fov"in r&&(r.fov=t.fov,r.updateProjectionMatrix()),t.zoom!=null&&Number.isFinite(t.zoom)&&t.zoom>0&&await e.zoomTo(t.zoom,!1)}import{Component as VE}from"react";var ia=class extends VE{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,n){this.props.onError?.(r)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{useEffect as FE,useMemo as UE,useRef as GE}from"react";function ow({modelUrl:e,tilesetUrl:t=null,getOptions:r,now:n=()=>performance.now(),timestamp:i=()=>new Date().toISOString(),sessionId:o=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`viewer-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,log:a=l=>console.info("[react-immersive engagement]",l),warn:s=l=>console.warn("[react-immersive] onEngagement callback failed:",l)}){let l=n(),d=()=>{let P=r();return!!(P.onEngagement||P.debugEngagement)},u=P=>Math.max(0,Math.round(n()-P)),p=P=>{let{onEngagement:E,debugEngagement:T}=r();if(!E&&!T)return;let O={...P,sessionId:o,timestamp:i(),elapsedMs:u(l),modelUrl:e,tilesetUrl:t};T&&a(O);try{Promise.resolve(E?.(O)).catch(s)}catch(j){s(j)}},c=null,h=null,m="[]",b=null,y=null,S=P=>{c=P},f=P=>{!d()||c===P.objectKey||(c=P.objectKey,p({type:"part-viewed",...P}))},g=(P,E,T=null)=>{let O=JSON.stringify([T,E,P]);!d()||P===E||O===h||(h=O,p({type:"variant-chosen",variant:P,previousVariant:E,group:T}))},x=P=>{let E=JSON.stringify(P);E!==m&&(m=E,h=null)},_=()=>{!d()||b!==null||(b=n(),p({type:"ar-started"}))},v=(P="session-ended")=>{if(b===null)return;let E=u(b);b=null,p({type:"ar-ended",durationMs:E,reason:P})},R=(P="stopped")=>{if(!y)return;let{startedAt:E,annotationCount:T}=y;y=null,p({type:"tour-stopped",annotationCount:T,durationMs:u(E),reason:P})};return{setSelectedPart:S,viewPart:f,setActiveVariants:x,chooseVariant:g,startAR:_,endAR:v,startTour:P=>{!d()||P<=0||(R("restarted"),y={startedAt:n(),annotationCount:P},p({type:"tour-started",annotationCount:P}))},stopTour:R,completeTour:()=>{if(!y)return;let{startedAt:P,annotationCount:E}=y;y=null,p({type:"tour-completed",annotationCount:E,durationMs:u(P)})},interrupt:()=>{v("interrupted"),R("interrupted")},requestARLaunch:P=>p({type:"ar-launch-requested",channel:P})}}function aw(e){let t=GE(e);t.current=e;let r=!!(e.onEngagement||e.debugEngagement),n=UE(()=>ow({modelUrl:e.modelUrl,tilesetUrl:e.tilesetUrl,getOptions:()=>t.current}),[e.modelUrl,e.tilesetUrl,r]);return FE(()=>()=>n.interrupt(),[n]),n}import{Color as HE}from"three";function sw(e,t,r){let n=t[r]?.modelObjectId;return e.lighting.lights.filter(i=>{let o=i.attachment?.objectId;return o?Fo(t,o)===r||o===n:!1})}function gm(e,t){return e.lighting.lights.some(r=>t[r.id])?{...e,lighting:{...e.lighting,lights:e.lighting.lights.map(r=>t[r.id]?{...r,...t[r.id]}:r)}}:e}function lw(e){let t=null;if(e?.traverse(i=>{if(t)return;let o=i.material;for(let a of Array.isArray(o)?o:o?[o]:[])if(a.emissive instanceof HE){t=a;return}}),!t)return{color:"#000000",intensity:0,on:!1};let r=`#${t.emissive.getHexString()}`,n=t.emissiveIntensity??1;return{color:r,intensity:n,on:r!=="#000000"&&n>0}}import{HexColorPicker as WE}from"react-colorful";import{Fragment as cw,jsx as yi,jsxs as ws}from"react/jsx-runtime";function uw({kind:e,color:t,brightness:r,onColorChange:n,onBrightnessChange:i,onClose:o}){return yi("div",{className:"ri-popover ri-popover--inline",style:{padding:12},onPointerDown:a=>a.stopPropagation(),children:e==="change-light-color"?ws(cw,{children:[yi("p",{className:"ri-popoverLabel",children:"Light color"}),yi(WE,{color:t,onChange:n}),ws("div",{className:"ri-inlineRow",children:[yi("span",{className:"ri-colorCode",children:t}),yi("button",{className:"ri-secondaryButton",onClick:o,children:"Done"})]})]}):ws(cw,{children:[yi("p",{className:"ri-popoverLabel",children:"Brightness"}),yi("input",{type:"range",min:0,max:200,step:1,value:r,"aria-label":"Brightness",style:{width:"100%"},onChange:a=>i(Number(a.target.value))}),ws("div",{className:"ri-inlineRow",children:[ws("span",{className:"ri-colorCode",children:[r,"%"]}),yi("button",{className:"ri-secondaryButton",onClick:o,children:"Done"})]})]})})}import{useCallback as bm,useRef as qE}from"react";var Gc=e=>e==="#000000"?"#ffffff":e;function dw({nodeRefsMap:e,currentObjectBindingsRef:t,applyObjectBindings:r}){let n=qE({}),i=bm(a=>{let s=lw(e.current[a]),l=t.current[a]?.style?.material,d=l?.emissive??s.color,u=l?.emissiveIntensity??s.intensity;return{color:d,intensity:u,on:d!=="#000000"&&u>0}},[]),o=bm((a,s)=>{let l=t.current,d=l[a];d&&r({...l,[a]:{...d,style:{...d.style,material:{...d.style?.material,...s}}}})},[r]);return{glowMemoryRef:n,readObjectGlow:i,applyGlow:o}}function pw({setCurrentAction:e,bindingKeyIndex:t,currentObjectBindings:r,applyObjectBindings:n,resolveObjectKey:i,closeColorPicker:o,setColorPicker:a,setMaterialPopupsByObject:s,setItemMaterials:l,getPopoverPosition:d,decalRequestRef:u,setDecalError:p,setDecalDragging:c,setDecalControl:h,resolvedSceneConfigRef:m,applyLightPatches:b,readObjectGlow:y,applyGlow:S,glowMemoryRef:f,setLightControl:g,onAction:x}){return bm(_=>{let{objectId:v,action:R,binding:A}=_;switch(e(_),R.id){case"toggle-visibility":{let w=v;A?.modelObjectId&&(w=t.byModelObjectId.get(A.modelObjectId)??w);let C=r[w],P=C?.visible===!1;C&&n({...r,[w]:{...C,visible:P}});break}case"change-color":o(),s(w=>{if(!(v in w))return w;let C={...w};return delete C[v],C}),l(w=>{let C=i(v,A)??v,P=w[v]?.hex,E=r[C]?.style?.material?.baseColor;return{...w,[v]:{...w[v],hex:P??E??"#ffffff"}}}),a(d(v,225,250,A,_));break;case"change-material":o(),s(w=>{if(v in w){let C={...w};return delete C[v],C}return{...w,[v]:d(v,300,320,A,_)}});break;case"add-text":case"add-image":{o();let w=R.id;u.current++,p(null),c(null),h(C=>C?.objectId===v&&C.kind===w?null:{objectId:v,kind:w,activeId:null});break}case"toggle-light":case"change-light-color":case"set-brightness":{let w=i(v,A);if(!w)break;let C=sw(m.current,r,w);if(R.id==="toggle-light"){if(C.length>0){let O=!C.some(j=>j.visible);b(Object.fromEntries(C.map(j=>[j.id,{visible:O}])));break}let T=y(w);T.on?(f.current[w]=T.intensity,S(w,{emissiveIntensity:0})):S(w,{emissive:Gc(T.color),emissiveIntensity:f.current[w]??1});break}let P=R.id,E=C.length>0?null:y(w);g(T=>T?.objectId===v&&T.kind===P?null:{objectId:v,kind:P,target:E?{type:"glow",objectKey:w,baseIntensity:E.on?E.intensity:f.current[w]??1}:{type:"lights",lightIds:C.map(O=>O.id),baseIntensity:Object.fromEntries(C.map(O=>[O.id,O.intensity]))},percent:E&&!E.on?0:100});break}default:break}x?.(_)},[n,S,b,y,r,d,x,o,i,t])}import{jsx as XE}from"react/jsx-runtime";function mw({control:e,lights:t,readObjectGlow:r,applyGlow:n,glowMemoryRef:i,applyLightPatches:o,onControlChange:a}){let s=e.target,l=s.type==="lights"?t.find(d=>d.id===s.lightIds[0])?.color??"#ffffff":Gc(r(s.objectKey).color);return XE(uw,{kind:e.kind,color:l,brightness:e.percent,onColorChange:d=>{if(s.type==="lights"){o(Object.fromEntries(s.lightIds.map(p=>[p,{color:d}])));return}let u=r(s.objectKey);n(s.objectKey,{emissive:d,emissiveIntensity:u.intensity>0?u.intensity:i.current[s.objectKey]??1})},onBrightnessChange:d=>{if(a({...e,percent:d}),s.type==="lights"){o(Object.fromEntries(s.lightIds.map(u=>[u,{intensity:(s.baseIntensity[u]??0)*(d/100)}])));return}n(s.objectKey,{emissive:Gc(r(s.objectKey).color),emissiveIntensity:s.baseIntensity*(d/100)})},onClose:()=>a(null)})}import{useRef as ZE,useState as bw}from"react";import{ArrowDown as $E,ArrowLeft as YE,ArrowRight as KE,ArrowUp as QE}from"lucide-react";import{useEffect as JE,useRef as vm}from"react";function hw(e){let t=!1,r,n=()=>{t||(e(),t||(r=setTimeout(n,70)))};return e(),r=setTimeout(n,300),()=>{t=!0,clearTimeout(r)}}import{jsx as Ms,jsxs as fw}from"react/jsx-runtime";function gw({onNudge:e}){let t=ue(),r=vm(e);r.current=e;let n=vm(null),i=vm(null),o=()=>{n.current?.(),n.current=null,i.current=null};return JE(()=>{let a=l=>{l.pointerId===i.current&&o()},s=l=>{l.key==="Escape"&&o()};return window.addEventListener("pointerup",a,!0),window.addEventListener("pointercancel",a,!0),window.addEventListener("blur",o),window.addEventListener("keydown",s),()=>{o(),window.removeEventListener("pointerup",a,!0),window.removeEventListener("pointercancel",a,!0),window.removeEventListener("blur",o),window.removeEventListener("keydown",s)}},[]),fw("div",{className:"ri-decalPosition",children:[fw("div",{children:[Ms("div",{className:"ri-decalPosition__label",children:t("position")}),Ms("div",{className:"ri-decalPosition__hint",children:t("decalNudgeHint")})]}),Ms("div",{className:"ri-decalPosition__pad",role:"group","aria-label":t("decalNudgeControls"),children:[["up",QE],["left",YE],["right",KE],["down",$E]].map(([a,s])=>Ms("button",{type:"button",className:`ri-decalPosition__button ri-decalPosition__button--${a}`,"aria-label":t("moveDecal",{direction:t(a)}),title:t("moveDecalOnSurface",{direction:t(a)}),onPointerDown:l=>{l.button===0&&(l.preventDefault(),l.currentTarget.focus({preventScroll:!0}),o(),i.current=l.pointerId,n.current=hw(()=>r.current(a)))},onClick:l=>{l.detail===0&&r.current(a)},children:Ms(s,{size:16})},a))})]})}import{Fragment as vw,jsx as Et,jsxs as fn}from"react/jsx-runtime";var eA=e=>Math.round(e*180/Math.PI);function yw({kind:e,decals:t,activeId:r,error:n,moving:i,defaultSize:o,onSelect:a,onAddText:s,onAddImage:l,onChange:d,onMove:u,onNudge:p,onRemove:c,onClose:h}){let m=ue(),[b,y]=bw(""),[S,f]=bw("#ffffff"),g=ZE(null),x=t.find(v=>v.id===r)??null;return fn("div",{className:"ri-popover ri-popover--inline ri-decalControl",onPointerDown:v=>v.stopPropagation(),children:[e==="add-text"?fn(vw,{children:[Et("p",{className:"ri-popoverLabel",children:m("text")}),fn("div",{className:"ri-decalControl__row",children:[Et("input",{className:"ri-decalControl__input",value:b,placeholder:m("yourText"),"aria-label":m("textToAdd"),onChange:v=>y(v.target.value)}),Et("input",{type:"color",className:"ri-decalControl__color",value:S,"aria-label":m("textColour"),onChange:v=>f(v.target.value)})]}),Et("button",{type:"button",className:"ri-uploadButton",disabled:!b.trim(),onClick:()=>{s(b.trim(),S)&&y("")},children:m("addText")})]}):fn(vw,{children:[Et("p",{className:"ri-popoverLabel",children:m("image")}),Et("button",{type:"button",className:"ri-uploadButton",onClick:()=>g.current?.click(),children:m("chooseImage")}),Et("input",{ref:g,type:"file",accept:"image/png,image/jpeg,image/webp,image/svg+xml",className:"ri-hiddenInput","aria-label":m("imageToAdd"),onChange:v=>{let R=v.target.files?.[0];v.target.value="",R&&l(R)}})]}),n?Et("div",{className:"ri-decalControl__hint",role:"alert",children:n}):null,t.length>0?Et("div",{className:"ri-decalControl__list",role:"group","aria-label":m("added"),children:t.map((v,R)=>Et("button",{type:"button",className:`ri-decalControl__chip ${v.id===r?"ri-decalControl__chip--active":""}`,"aria-pressed":v.id===r,onClick:()=>a(v.id),children:v.image?m("decalImage",{index:R+1}):v.text||m("decalText",{index:R+1})},v.id))}):null,x?fn("div",{className:"ri-decalControl__editor",children:[Et(gw,{onNudge:v=>p(x.id,v)}),x.image?null:fn("div",{className:"ri-decalControl__row",children:[Et("input",{className:"ri-decalControl__input",value:x.text??"","aria-label":m("text"),onChange:v=>d(x.id,{text:v.target.value})}),Et("input",{type:"color",className:"ri-decalControl__color",value:x.color??"#ffffff","aria-label":m("colour"),onChange:v=>d(x.id,{color:v.target.value})})]}),fn("label",{className:"ri-decalControl__slider",children:[Et("span",{children:m("size")}),Et("input",{type:"range",min:o/10,max:o*4,step:o/50,value:x.size,"aria-label":m("size"),onChange:v=>d(x.id,{size:Number(v.target.value)})})]}),fn("label",{className:"ri-decalControl__slider",children:[Et("span",{children:m("turn")}),Et("input",{type:"range",min:-180,max:180,step:1,value:eA(x.rotation??0),"aria-label":m("rotation"),onChange:v=>d(x.id,{rotation:Number(v.target.value)*Math.PI/180})})]}),fn("div",{className:"ri-inlineRow",children:[Et("button",{type:"button",className:"ri-secondaryButton","aria-pressed":i,title:m("dragTheDecalAcrossTheObjectsSurface"),onClick:()=>u(x.id),children:m("move")}),Et("button",{type:"button",className:"ri-removeButton",onClick:()=>c(x.id),children:m("remove")})]})]}):null,fn("div",{className:"ri-inlineRow",children:[Et("span",{className:"ri-colorCode",children:t.length===0?m("noneAddedYet"):m("decalAdded",{count:t.length})}),Et("button",{type:"button",className:"ri-secondaryButton",onClick:h,children:m("done")})]})]})}import{useEffect as yA,useRef as xA}from"react";import{useThree as wA}from"@react-three/fiber";import{Mesh as MA,Raycaster as SA,Vector2 as Sm,Vector3 as Aw}from"three";import{BufferGeometry as tA,CanvasTexture as rA,Float32BufferAttribute as Hc,Matrix4 as nA,Object3D as iA,SRGBColorSpace as oA,Uint16BufferAttribute as aA,Vector3 as jn}from"three";var sA=.5,Ss=4;function lA(e,t=0){let r=new jn(...e);r.lengthSq()<1e-12&&r.set(0,0,1),r.normalize();let n=new iA;return Math.abs(r.y)>.999&&n.up.set(0,0,-Math.sign(r.y)),n.lookAt(r),n.rotateZ(t),n.rotation.clone()}function cA(e,t,r){let n=null;if(e.bones&&t.bones){n=new Map;for(let[i,o]of e.bones)n.set(i,o*(1-r));for(let[i,o]of t.bones)n.set(i,(n.get(i)??0)+o*r)}return{position:e.position.clone().lerp(t.position,r),normal:e.normal.clone().lerp(t.normal,r),bones:n}}function xw(e,t,r,n){let i=a=>n?a.position[t]<=r:a.position[t]>=r,o=[];for(let a=0;a<e.length;a++){let s=e[a],l=e[(a+1)%e.length],d=i(s);if(d&&o.push(s),d!==i(l)){let u=l.position[t]-s.position[t];o.push(cA(s,l,(r-s.position[t])/u))}}return o}function Wc(e,t,r){let n=e.geometry,i=n.getAttribute("position");if(!i)return null;let o=n.getAttribute("normal"),a=n.getAttribute("skinIndex"),s=n.getAttribute("skinWeight"),l=!!(a&&s),d=n.getIndex(),u=Math.max(t.size,1e-6),p=u/(r>0&&Number.isFinite(r)?r:1),c=Math.max(u,p)*sA,h={x:u/2,y:p/2,z:c/2},m=new nA().makeRotationFromEuler(lA(t.normal,t.rotation)).setPosition(...t.position),b=m.clone().invert(),y=(j,I)=>{let N=null;if(l){N=new Map;for(let D=0;D<Ss;D++){let k=s.getComponent(j,D);if(k<=0)continue;let U=a.getComponent(j,D);N.set(U,(N.get(U)??0)+k)}}return{position:I.clone(),normal:o?new jn().fromBufferAttribute(o,j):new jn,bones:N}},S=[],f=[],g=[],x=[],_=[],v=new jn,R=new jn,A=new jn,w=j=>{if(g.push(.5+j.position.x/u,.5-j.position.y/p),v.copy(j.position).applyMatrix4(m),S.push(v.x,v.y,v.z),f.push(j.normal.x,j.normal.y,j.normal.z),!j.bones)return;let I=[...j.bones].sort((D,k)=>k[1]-D[1]).slice(0,Ss),N=I.reduce((D,[,k])=>D+k,0)||1;for(let D=0;D<Ss;D++)x.push(I[D]?.[0]??0),_.push((I[D]?.[1]??0)/N)},C=["x","y","z"],P=[new jn,new jn,new jn],E=[0,0,0],T=(d?d.count:i.count)/3;for(let j=0;j<T;j++){for(let D=0;D<3;D++){let k=j*3+D;E[D]=d?d.getX(k):k,P[D].fromBufferAttribute(i,E[D]).applyMatrix4(b)}if(C.some(D=>P[0][D]>h[D]&&P[1][D]>h[D]&&P[2][D]>h[D]||P[0][D]<-h[D]&&P[1][D]<-h[D]&&P[2][D]<-h[D]))continue;let I=P.map((D,k)=>y(E[k],D));if(!o){R.copy(I[1].position).sub(I[0].position),A.copy(I[2].position).sub(I[0].position);let D=R.cross(A).transformDirection(m);for(let k of I)k.normal.copy(D)}let N=I;for(let D of C)if(N=xw(N,D,h[D],!0),N=xw(N,D,-h[D],!1),N.length<3)break;for(let D=1;D+1<N.length;D++)w(N[0]),w(N[D]),w(N[D+1])}if(S.length===0)return null;let O=new tA;return O.setAttribute("position",new Hc(S,3)),O.setAttribute("normal",new Hc(f,3)),O.setAttribute("uv",new Hc(g,2)),l&&(O.setAttribute("skinIndex",new aA(x,Ss)),O.setAttribute("skinWeight",new Hc(_,Ss))),O}function Mw(e){return JSON.stringify([e.image??null,e.image?null:[e.text??"",e.color,e.fontFamily,e.fontWeight],e.position,e.normal,e.size,e.rotation??0])}var ww=256,ym=24;function Sw(e){let t=`${e.fontWeight??"bold"} ${ww-ym*2}px ${e.fontFamily||"sans-serif"}`,r=document.createElement("canvas"),n=r.getContext("2d");n.font=t;let i=e.text||" ";r.width=Math.min(Math.max(Math.ceil(n.measureText(i).width)+ym*2,8),4096),r.height=ww,n.font=t,n.textAlign="center",n.textBaseline="middle",n.fillStyle=e.color??"#ffffff",n.fillText(i,r.width/2,r.height/2,r.width-ym);let o=new rA(r);return o.flipY=!1,o.colorSpace=oA,{texture:o,aspect:r.width/r.height}}import{useEffect as Cw,useRef as uA}from"react";import{BufferGeometry as dA,Float32BufferAttribute as pA,Mesh as mA,MeshStandardMaterial as hA,SkinnedMesh as fA,SRGBColorSpace as Tw}from"three";var no="riDecal",Mm="riDecalId";function xm(){return new dA().setAttribute("position",new pA([],3))}function Pw(e){let t=e.image;return t?.width&&t.height?t.width/t.height:1}function wm(e){e.disposed=!0,e.node.remove(e.mesh),e.mesh.geometry.dispose(),e.mesh.material.dispose(),e.imagePath&&Rn(e.imagePath,Tw),e.ownTexture?.dispose()}function gA(e,t,r,n){let i=new hA({transparent:!0,polygonOffset:!0,polygonOffsetFactor:-4,depthWrite:!1,metalness:0,roughness:.7}),o=lr(e)&&e.skeleton?e:null,a=o?new fA(xm(),i):new mA(xm(),i);if(o){let d=a;d.bind(o.skeleton,o.bindMatrix),d.frustumCulled=!1,d.onBeforeRender=()=>{let u=Jb(o);u&&d.bindMatrixInverse.copy(u)}}a.userData[no]=!0,a.userData[Mm]=t.id,a.raycast=()=>{},a.castShadow=!1,a.receiveShadow=!0,a.renderOrder=1;let s={node:e,mesh:a,signature:r,disposed:!1},l=d=>{let u=Wc(e,t,d);a.geometry.dispose(),a.geometry=u??xm(),a.visible=u!==null};if(t.image){s.imagePath=t.image;let d=qo(t.image,Tw,()=>{s.disposed||(l(Pw(d)),i.needsUpdate=!0,n())});i.map=d,l(Pw(d))}else{let{texture:d,aspect:u}=Sw(t);s.ownTexture=d,i.map=d,l(u)}return e.add(a),s}function _w({objectBindings:e,nodeMap:t,invalidate:r}){let n=uA(new Map);Cw(()=>{let i=n.current,o=new Set;for(let[a,s]of Object.entries(e)){if(!s.decals?.length)continue;let l=t[s.modelObjectId??a];if(Gt(l))for(let d of s.decals){if(!d.image&&!d.text)continue;let u=`${a}
6
+ ${d.id}`,p=Mw(d),c=i.get(u);c&&(c.node!==l||c.signature!==p)&&(wm(c),c=void 0),c||(c=gA(l,d,p,r),i.set(u,c)),c.mesh.material.opacity=(d.opacity??1)*(s.style?.material?.opacity??1),o.add(u)}}for(let[a,s]of i)o.has(a)||(wm(s),i.delete(a));r()},[e,t,r]),Cw(()=>{let i=n.current;return()=>{for(let o of i.values())wm(o);i.clear()}},[])}import{Mesh as bA,SkinnedMesh as vA}from"three";function Ew(e,t){let r=[];if(lr(e)){let n=e;n.computeBoundingSphere(),n.computeBoundingBox(),vA.prototype.raycast.call(n,t,r)}else bA.prototype.raycast.call(e,t,r);return r.sort((n,i)=>n.distance-i.distance)[0]}function Rw({target:e,nodes:t,controls:r}){let{camera:n,gl:i,invalidate:o}=wA(),a=xA(e);return a.current=e,yA(()=>{let s=i.domElement,l=new SA,d=new Sm,u=s.style.cursor,p=s.style.touchAction;s.style.cursor="grab",s.style.touchAction="none";let c=0,h=null,m=null,b=(R,A=new Sm)=>{let w=s.getBoundingClientRect();d.set((R.clientX-w.left-A.x)/w.width*2-1,-((R.clientY-w.top-A.y)/w.height)*2+1),l.setFromCamera(d,n)},y=R=>{if(!m)return;b(R,m.offset),m.node.updateWorldMatrix(!0,!1);let A=l.intersectObject(m.node,!1)[0];if(!A)return;let w=ro({...A,ray:l.ray},m.node),C=Wc(m.node,{...m.decal,...w},m.aspect);C&&(m.mesh.geometry!==m.geometry&&m.mesh.geometry.dispose(),m.mesh.geometry=C,m.surface=w,o())},S=R=>{if(!m)return;cancelAnimationFrame(c),c=0,h=null;let A=m;m=null,A.mesh.geometry!==A.geometry&&(R&&A.surface?A.geometry.dispose():(A.mesh.geometry.dispose(),A.mesh.geometry=A.geometry)),A.controller&&(A.controller.enabled=A.controlsEnabled),s.hasPointerCapture(A.pointerId)&&s.releasePointerCapture(A.pointerId),s.style.cursor="grab",o();let w=()=>{window.removeEventListener("click",C,!0),window.removeEventListener("pointerdown",w,!0),clearTimeout(P)},C=E=>{E.target===s&&(E.preventDefault(),E.stopImmediatePropagation()),w()},P=setTimeout(w,300);window.addEventListener("click",C,!0),window.addEventListener("pointerdown",w,!0),R&&A.surface&&a.current.onCommit(A.surface)},f=R=>{if(R.button!==0||m)return;let A=a.current,w=t.current[A.objectId];if(!(w instanceof MA)||!w.visible)return;let C=w.children.find(D=>D.userData[no]&&D.userData[Mm]===A.decal.id);if(!C?.visible)return;w.updateWorldMatrix(!0,!0),b(R);let P=Ew(C,l),E=l.intersectObject(w,!1)[0];if(!P||!E||P.distance>E.distance+1e-4)return;let T=new Aw;if(lr(C)){let D=new Aw,k=C.geometry.getAttribute("position").count;if(!k)return;for(let U=0;U<k;U++)T.add(C.getVertexPosition(U,D));T.divideScalar(k).applyMatrix4(C.matrixWorld)}else T.fromArray(A.decal.position).applyMatrix4(w.matrixWorld);T.project(n);let O=s.getBoundingClientRect(),j=new Sm(R.clientX-(O.left+(T.x+1)/2*O.width),R.clientY-(O.top+(1-T.y)/2*O.height)),I=C.material.map?.image,N=r.current;m={pointerId:R.pointerId,node:w,mesh:C,geometry:C.geometry,decal:A.decal,surface:null,offset:j,aspect:I?.width&&I.height?I.width/I.height:1,controller:N,controlsEnabled:N?.enabled??!1},N&&(N.enabled=!1),R.preventDefault(),R.stopImmediatePropagation(),s.setPointerCapture(R.pointerId),s.style.cursor="grabbing"},g=R=>{!m||R.pointerId!==m.pointerId||(R.preventDefault(),R.stopImmediatePropagation(),h=R,c||(c=requestAnimationFrame(()=>{c=0,h&&y(h)})))},x=R=>{!m||R.pointerId!==m.pointerId||(R.preventDefault(),R.stopImmediatePropagation(),h&&y(h),S(!0))},_=()=>S(!1),v=R=>{R.key==="Escape"&&(S(!1),a.current.onCancel())};return s.addEventListener("pointerdown",f,!0),window.addEventListener("pointermove",g,{capture:!0,passive:!1}),window.addEventListener("pointerup",x,!0),window.addEventListener("pointercancel",_),window.addEventListener("blur",_),window.addEventListener("keydown",v),s.addEventListener("lostpointercapture",_),()=>{S(!1),s.style.cursor=u,s.style.touchAction=p,s.removeEventListener("pointerdown",f,!0),window.removeEventListener("pointermove",g,!0),window.removeEventListener("pointerup",x,!0),window.removeEventListener("pointercancel",_),window.removeEventListener("blur",_),window.removeEventListener("keydown",v),s.removeEventListener("lostpointercapture",_)}},[n,i,o,t,r,e.objectId,e.decal]),null}import{useCallback as oa,useEffect as WA,useState as Ps}from"react";import{AnimationClip as CA,Group as xi,Mesh as PA,PropertyBinding as Tm}from"three";import{GLTFExporter as TA,SkeletonUtils as _A}from"three-stdlib";var Cm=new WeakMap;function Pm(e){e.traverse(t=>{if(Cm.has(t))return;let r=t.morphTargetInfluences;Cm.set(t,{position:t.position.clone(),quaternion:t.quaternion.clone(),scale:t.scale.clone(),morphTargetInfluences:r?[...r]:void 0})})}function kw(e){return Cm.get(e)}var EA="reactImmersiveSkinFreeze",AA=new Set(["position","quaternion","scale","morphTargetInfluences"]);function qc({sources:e,downloadFilename:t,filenameSuffix:r="",onComplete:n}){let i=new xi,o=[];try{for(let s of e){let l=RA(s,e.length>1);i.add(l.root),o.push(...l.animations)}}catch(s){console.error("GLB export failed:",s),n();return}new TA().parse(i,s=>{let l=s instanceof ArrayBuffer?new Blob([s],{type:"model/gltf-binary"}):new Blob([JSON.stringify(s)],{type:"model/gltf+json"}),d=s instanceof ArrayBuffer?".glb":".gltf";dn(l,`${t}${r}${d}`),n()},s=>{console.error("GLTFExporter error:",s),n()},{binary:!0,onlyVisible:!0,animations:o})}function RA({scene:e,objectBindings:t,matRefs:r,label:n},i){let o=new xi;o.name=n??e.name??"";let a=new Map;for(let[f,g]of Object.entries(t))a.set(g.modelObjectId??f,f);let s=f=>{let g=f.name||f.uuid;return a.get(g)??g},l=f=>{let g=t[s(f)];return g?g.visible===!1:f.visible===!1};for(let f=e;f;f=f.parent)if(l(f))return{root:o,animations:[]};e.updateWorldMatrix(!0,!0);let d=_A.clone(e),u=new Map,p=[],c=[];e.traverse(f=>p.push(f)),d.traverse(f=>c.push(f)),p.forEach((f,g)=>u.set(f,c[g]));let h=[];for(let f=e.parent;f;f=f.parent)h.unshift(f);let m=o;for(let f of h){let g=_m(f);m.add(g),m=g}m.add(d);let b=[],y=new Set;for(let f of p){let g=u.get(f);if(f.userData?.isWireframeOverlay){b.push(g);continue}delete g.userData[EA];let x=g;if(x.isMesh){let _=r[s(f)];_&&(x.material=_)}(l(f)||f.parent&&y.has(f.parent))&&y.add(f),g.visible=!0}b.forEach(f=>f.removeFromParent());for(let f of y){let g=u.get(f);if(Xc(g,o)){if(!OA(g)){g.removeFromParent();continue}if(g.isMesh){let x=_m(g);x.name=g.name,x.userData=g.userData;for(let _ of[...g.children])x.add(_);g.parent.add(x),g.removeFromParent(),u.set(f,x)}}}let S=LA(e,o,u,i&&n?`${n}: `:"");return S.length===0?DA(p,u,o):kA(p,u,o,S),{root:o,animations:S}}function _m(e){let t=new xi;return t.position.copy(e.position),t.quaternion.copy(e.quaternion),t.scale.copy(e.scale),t.matrix.copy(e.matrix),t.matrixAutoUpdate=e.matrixAutoUpdate,t}function kA(e,t,r,n){let i=n.map(o=>[...o.tracks]);for(let o of e){let a=Zb(o),s=t.get(o);if(!a||!lr(s)||!Xc(s,r))continue;let l=s,d=new Set;for(let b of l.skeleton.bones)for(let y=b;y&&(d.add(y),y!==r);y=y.parent);let u=new Map,p=b=>{let y=b.isBone?b.clone(!1):_m(b);u.set(b.uuid,y);for(let S of b.children)d.has(S)&&y.add(p(S));return y},c=p(r),h=new xi,m=h;for(let b of[...a].reverse()){let y=new xi;b.decompose(y.position,y.quaternion,y.scale);let S=new xi;S.scale.set(1/y.scale.x,1/y.scale.y,1/y.scale.z);let f=new xi;f.quaternion.copy(y.quaternion).invert();let g=new xi;g.position.copy(y.position).negate(),m.add(S),S.add(f),f.add(g),m=g}m.add(c),l.add(h),l.skeleton.bones=l.skeleton.bones.map(b=>u.get(b.uuid)),n.forEach((b,y)=>{for(let S of i[y]){let f=Tm.parseTrackName(S.name);if(f.propertyName==="morphTargetInfluences")continue;let g=u.get(f.nodeName);if(!g)continue;let x=S.clone();x.name=Dw(g.uuid,f),b.tracks.push(x)}})}}function DA(e,t,r){r.updateWorldMatrix(!0,!0);for(let n of e){let i=t.get(n);if(!lr(n)||!lr(i)||!i.parent||!Xc(i,r))continue;let o=i,a=new PA(ev(n),o.material);a.name=o.name,a.userData=o.userData,a.matrix.copy(i.parent.matrixWorld).invert().multiply(tv(n)),a.matrixAutoUpdate=!1,a.matrix.decompose(a.position,a.quaternion,a.scale);let s=i.parent;s.children.splice(s.children.indexOf(i),1,a),a.parent=s,i.parent=null,a.updateMatrixWorld(!0);for(let l of[...i.children])a.attach(l)}}function OA(e){let t=!1;return e.traverse(r=>{r.isBone&&(t=!0)}),t}function Xc(e,t){for(let r=e;r;r=r.parent)if(r===t)return!0;return!1}function LA(e,t,r,n){let i=[];for(let o of e.animations??[]){let a=[];for(let s of o.tracks){let l=Tm.parseTrackName(s.name);if(!AA.has(l.propertyName))continue;let d=Tm.findNode(e,l.nodeName);if(l.objectName){if(l.objectName!=="bones"||!d||!lr(d))continue;d=d.skeleton.getBoneByName(l.objectIndex)??null,l.objectName="",l.objectIndex=""}let u=d?r.get(d):void 0;if(!u||!Xc(u,t)||l.propertyName==="morphTargetInfluences"&&!u.morphTargetInfluences)continue;IA(d,u,l.propertyName);let p=s.clone();p.name=Dw(u.uuid,l),a.push(p)}a.length!==0&&i.push(new CA(`${n}${o.name}`,o.duration,a,o.blendMode))}return i}function IA(e,t,r){let n=kw(e);n&&(r==="position"?t.position.copy(n.position):r==="quaternion"?t.quaternion.copy(n.quaternion):r==="scale"?t.scale.copy(n.scale):r==="morphTargetInfluences"&&n.morphTargetInfluences&&t.morphTargetInfluences?.length===n.morphTargetInfluences.length&&(t.morphTargetInfluences=[...n.morphTargetInfluences]))}function Dw(e,t){let r=t.objectName?`.${t.objectName}${t.objectIndex!==void 0?`[${t.objectIndex}]`:""}`:"",n=t.propertyIndex!==void 0?`[${t.propertyIndex}]`:"";return`${e}${r}.${t.propertyName}${n}`}import{strToU8 as NA}from"fflate";import{zip as BA}from"fflate";function Ow(e,t=6){return new Promise((r,n)=>{BA(e,{level:t},(i,o)=>{i?n(i):r(o)})})}var Cs=2048,Lw=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function Iw(e){return e.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split('"').join("&quot;").split("'").join("&apos;")}function Rm(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Nw(e){return Rm(e,"model")}function Em(e,t){return e.index?Math.round(e.index.getX(t)):t}function jA(e,t,r){let n=Em(e,r),i=Em(e,r+1),o=Em(e,r+2);if(n>=t.count||i>=t.count||o>=t.count)return null;let a=[{index:n,u:t.getX(n),v:t.getY(n)},{index:i,u:t.getX(i),v:t.getY(i)},{index:o,u:t.getX(o),v:t.getY(o)}];return a.every(s=>Number.isFinite(s.u)&&Number.isFinite(s.v))?a:null}function Bw(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function Am(e,t,r,n){let i,o;n?(i=t.index,o=r.index):(i=Bw(t),o=Bw(r));let a=i<o?`${i}|${o}`:`${o}|${i}`,s=e.get(a);s?s.count+=1:e.set(a,{count:1,start:t,end:r})}function zA(e,t,r){Am(e,t[0],t[1],r),Am(e,t[1],t[2],r),Am(e,t[2],t[0],r)}function VA(e,t){return Array.isArray(e)?e[t]??null:e}function FA(e){let t=new Map,r=0,n=0,i=0;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||!a.material)return;let s=a.geometry,l=s.getAttribute("uv");if(!l||l.itemSize<2||l.count<3)return;r+=1;let d=a.name||`Mesh ${r}`,u=s.index?.count??l.count,p=s.groups.length>0?s.groups:[{start:0,count:u,materialIndex:0}];for(let c of p){let h=c.materialIndex??0,m=VA(a.material,h);if(!m)continue;let b=t.get(m.uuid);b||(n+=1,b={name:m.name||`Material ${n}`,layers:new Map},t.set(m.uuid,b));let y=b.layers.get(a.uuid);y||(y={name:d,color:Lw[i%Lw.length],edges:new Map},i+=1,b.layers.set(a.uuid,y));let S=Math.max(0,c.start),f=Math.min(u,S+c.count);for(let g=S;g+2<f;g+=3){let x=jA(s,l,g);x&&zA(y.edges,x,!!s.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(a=>a.edges.size>0))}function $c(e){return(e*Cs).toFixed(2)}function UA(e){return`M${$c(e.start.u)} ${$c(1-e.start.v)}L${$c(e.end.u)} ${$c(1-e.end.v)}`}function GA(e){let t=Iw(e.name),r=[...e.layers.values()].filter(n=>n.edges.size>0).map((n,i)=>{let o=Iw(n.name),a=`${Rm(n.name,"mesh")}-${i+1}`,s=[...n.edges.values()],l=s.filter(p=>p.count===1),u=(l.length>0?l:s).map(UA).join("");return[` <g id="${a}" data-mesh="${o}" fill="none" stroke="${n.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${o}</title>`,` <path d="${u}"/>`," </g>"].join(`
7
+ `)}).join(`
8
+ `);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${Cs}" height="${Cs}" viewBox="0 0 ${Cs} ${Cs}">`,` <title>${t} UV layout</title>`," <desc>UV0 island-outline template exported by React Immersive. The SVG canvas maps to the complete 0\u20131 texture area.</desc>",' <rect width="2048" height="2048" fill="none" stroke="#94a3b8" stroke-width="2"/>',r,"</svg>"].join(`
9
+ `)}function HA(e){let t=[],r=new Set;return e.forEach((n,i)=>{let o=FA(n.scene);if(o.length===0)return;let a=Nw(n.label||`model-${i+1}`);o.forEach((s,l)=>{let d=Rm(s.name,`material-${l+1}`),u=o.length===1?`${a}-uv-layout.svg`:`${a}-uv-${d}-${l+1}.svg`;if(r.has(u)){let p=u.replace(/\.svg$/,""),c=2;for(;r.has(`${p}-${c}.svg`);)c+=1;u=`${p}-${c}.svg`}r.add(u),t.push({filename:u,materialName:s.name,meshCount:[...s.layers.values()].filter(p=>p.edges.size>0).length,svg:GA(s)})})}),t}async function km(e,t="model"){let r=HA(e);if(r.length===0)return r;if(r.length===1)return dn(new Blob([r[0].svg],{type:"image/svg+xml;charset=utf-8"}),r[0].filename),r;let n=Object.fromEntries(r.map(o=>[o.filename,NA(o.svg)])),i=await Ow(n);return dn(new Blob([i],{type:"application/zip"}),`${Nw(t)}-uv-layouts.zip`),r}async function jw(e,t="model"){return km([{scene:e,label:t}],t)}function zw({sceneRef:e,materialRefs:t,rendererCaptureRef:r,objectBindings:n,downloadFilename:i,getAllLoadedModels:o,getAllLoadedModelUvSources:a,captureVideo:s,openConfiguredAR:l}){let[d,u]=Ps(!1),[p,c]=Ps(!1),[h,m]=Ps(null),[b,y]=Ps(null),[S,f]=Ps("auto");WA(()=>{if(!p)return;let w=()=>c(!1);return window.addEventListener("pointerdown",w),()=>window.removeEventListener("pointerdown",w)},[p]);let g=oa(()=>{m(null),y(null),c(w=>!w)},[]),x=oa(()=>{let w=o?.()??null;if(w&&w.length>0){c(!1),u(!0),qc({sources:w,downloadFilename:i,onComplete:()=>u(!1)});return}let C=e.current;C&&(c(!1),u(!0),qc({sources:[{scene:C,objectBindings:n,matRefs:t.current??{}}],downloadFilename:i,onComplete:()=>u(!1)}))},[i,t,n,e,o]),_=oa(async()=>{let w=o?.()??null;if(!w||w.length===0)return;c(!1),u(!0);let C=new Set;try{for(let P=0;P<w.length;P++){let E=w[P],T=(E.label||`model-${P+1}`).replace(/[\\/:*?"<>|]+/g,"-"),O=T,j=2;for(;C.has(O);)O=`${T}-${j++}`;C.add(O),await new Promise(I=>{qc({sources:[E],downloadFilename:i,filenameSuffix:`-${O}`,onComplete:I})}),await new Promise(I=>setTimeout(I,300))}}finally{u(!1)}},[i,o]),v=oa(()=>{c(!1),jc(r.current).then(w=>{let C=document.createElement("a");C.href=w,C.download=`${i}.png`,document.body.appendChild(C),C.click(),document.body.removeChild(C)}).catch(w=>{console.error("Screenshot failed:",w)})},[i,r]),R=oa(async()=>{let w=a?.()??null;try{let C;if(w&&w.length>0)C=await km(w,i);else{let P=e.current;if(!P)return;C=await jw(P,i)}if(C.length===0){m("This model does not contain UV coordinates.");return}m(null),c(!1)}catch(C){console.error("UV layout export failed:",C),m("Could not create the UV layout archive.")}},[i,e,a]),A=oa(async w=>{c(!1),y(null);try{let C=await s({mode:w,format:S}),P=C.type==="image/gif"?"gif":C.type.startsWith("video/mp4")?"mp4":"webm",E=URL.createObjectURL(C),T=document.createElement("a");T.href=E,T.download=`${i}-${w}.${P}`,document.body.appendChild(T);try{T.click()}finally{T.remove(),setTimeout(()=>URL.revokeObjectURL(E),1e3)}}catch(C){if(C instanceof DOMException&&C.name==="AbortError")return;y(C instanceof Error?C.message:"Could not export the video."),c(!0)}},[s,i,S]);return{openConfiguredAR:l?()=>{c(!1),l()}:void 0,isDownloading:d,downloadMenuOpen:p,uvExportError:h,toggleDownloadMenu:g,handleDownloadMesh:x,handleDownloadSeparateMeshes:_,handleDownloadScreenshot:v,handleDownloadUvLayout:R,handleDownloadVideo:A,videoFormat:S,setVideoFormat:f,videoExportError:b}}import{useCallback as cr,useEffect as _s,useRef as Jc,useReducer as YA,useState as io}from"react";import{Box3 as Yw,Raycaster as KA,Vector2 as Im,Vector3 as Bm}from"three";var Yc={tool:"distance",points:[],areaClosed:!1,error:null};function Vw(e,t){if(t.type==="tool")return{...Yc,tool:t.tool};if(t.type==="clear")return{...Yc,tool:e.tool};if(t.type==="fail")return{...e,error:t.error};if(t.type==="clearError")return{...e,error:null};if(t.type==="wrapResult")return{...e,points:t.points,areaClosed:!1,error:null};if(t.type==="undo")return{...e,points:e.points.slice(0,-1),areaClosed:!1,error:null};if(t.type==="finishArea"){if(e.tool!=="area")return e;let o=lc(e.points.map(a=>a.position));return"error"in o?{...e,error:o.error}:{...e,areaClosed:!0,error:null}}if(t.type!=="place")return e;let n=e.areaClosed||e.tool==="angle"&&e.points.length===3||e.tool==="pointToPlane"&&e.points.length===2?[]:e.points;if(e.tool==="pointToPlane"&&n.length===0&&!t.point.normal)return{...e,error:"Pick a triangle face to define the reference plane."};if(n.length>=256)return{...e,error:"Finish or clear this measurement before adding more points."};let i=[...n,t.point];return e.tool==="angle"&&i.length===3&&sc(i.map(o=>o.position))===null?{...e,error:"Pick a point away from the angle's vertex."}:{...e,points:i,areaClosed:!1,error:null}}import{Matrix3 as Gw,Matrix4 as qA,Mesh as Hw,Vector3 as Kc}from"three";var Fw=new WeakMap,Dm=new WeakMap,XA=0;function Om(e){return Dm.has(e)||Dm.set(e,++XA),`${Dm.get(e)}:${e.version??e.data?.version??0}:${e.count}`}var Ww=new ArrayBuffer(8),$A=new Float64Array(Ww),Uw=new Uint32Array(Ww);function Rr(e,t){return $A[0]=t,Math.imul(Math.imul(e^Uw[0],16777619)^Uw[1],16777619)}function qw(e){let t=e.getAttribute("position");if(!t)return"no-position";let r=e.getIndex(),n=[e.getAttribute("skinIndex"),e.getAttribute("skinWeight")].filter(Boolean),i=`${Om(t)}:${r?Om(r):"none"}:${e.morphTargetsRelative}:${[...e.morphAttributes.position??[],...n].map(Om).join(";")}`,o=Fw.get(e);if(o?.position===t&&o.index===r&&o.version===i)return o.signature;let a=e.morphTargetsRelative?Rr(2166136261,1):2166136261;for(let l=0;l<t.count;l++)a=Rr(a,t.getX(l)),a=Rr(a,t.getY(l)),a=Rr(a,t.getZ(l));if(r)for(let l=0;l<r.count;l++)a=Rr(a,r.getX(l));for(let l of e.morphAttributes.position??[])for(let d=0;d<l.count;d++)a=Rr(a,l.getX(d)),a=Rr(a,l.getY(d)),a=Rr(a,l.getZ(d));for(let l of n)for(let d=0;d<l.count;d++)for(let u=0;u<l.itemSize;u++)a=Rr(a,l.getComponent(d,u));let s=`${t.count}:${r?.count??0}:${a>>>0}`;return Fw.set(e,{position:t,index:r,version:i,signature:s}),s}function Xw(e){let t=2166136261,r=e.skeleton;if(r){for(let n of[e.bindMatrix,...r.boneInverses])for(let i of n.elements)t=Rr(t,i);for(let n of r.bones){n.matrixAutoUpdate&&n.updateMatrix();for(let i of n.matrix.elements)t=Rr(t,i)}}for(let n of e.morphTargetInfluences??[])t=Rr(t,n);return`${r?"skin":"mesh"}:${t>>>0}`}function $w(e,t){e.updateWorldMatrix(!0,!1);let r=e.matrixWorld.clone();if(t!==void 0){if(!e.isInstancedMesh||t>=e.count)return null;let n=new qA;e.getMatrixAt(t,n),r.multiply(n)}return Math.abs(r.determinant())>1e-15?r:null}function Lm(e,t){if(!(t.object instanceof Hw))return e;let r=ui(t.object),n=$w(t.object,t.instanceId);if(!r||!n)return e;let i=n.clone().invert(),o=a=>new Kc(...a).applyMatrix4(i).toArray();return{...e,anchor:{nodeId:r,localPosition:o(e.position),geometrySignature:qw(t.object.geometry),poseSignature:Xw(t.object),...t.instanceId!==void 0?{instanceId:t.instanceId}:{},...e.normal?{localNormal:new Kc(...e.normal).applyNormalMatrix(new Gw().getNormalMatrix(i)).toArray()}:{},...e.faceVertices?{localFaceVertices:e.faceVertices.map(o)}:{}}}}function Qc(e,t,r,n,i){let o=d=>({measurement:e,points:[],status:d});if(e.modelId!==r||ls(e.tilesetUrl??"")!==ls(n??""))return o("model-changed");if(!t)return o("missing-object");let a=i??Ts(t),s=[],l=new Map;for(let d of e.points){if(!d.anchor){s.push(d);continue}let u=d.anchor,p=a(u.nodeId);if(!(p instanceof Hw))return o("missing-object");for(let b=p;b;b=b.parent)if(!b.visible)return o("hidden-object");if(qw(p.geometry)!==u.geometrySignature)return o("geometry-changed");let c=l.get(p);if(c===void 0&&(c=Xw(p),l.set(p,c)),c!==u.poseSignature)return o("pose-changed");let h=$w(p,u.instanceId);if(!h)return o("geometry-changed");let m=b=>new Kc(...b).applyMatrix4(h).toArray();s.push({...d,position:m(u.localPosition),...u.localNormal?{normal:new Kc(...u.localNormal).applyNormalMatrix(new Gw().getNormalMatrix(h)).toArray()}:{},...u.localFaceVertices?{faceVertices:u.localFaceVertices.map(m)}:{}})}return{measurement:e,points:s,status:e.approximate?"approximate":"ready"}}function Ts(e){let t=new Map;return e.traverse(r=>{let n=ui(r);n&&t.set(n,t.has(n)?null:r)}),r=>t.get(r)??null}function QA(e){let t=new Yw().setFromObject(e),r=new Bm;return t.getSize(r),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[r.x,r.y,r.z]}}function JA(e){let t=new Yw().setFromObject(e);if(t.isEmpty())return null;let r=t.getCenter(new Bm),n=t.getSize(new Bm).length()/2;return!Number.isFinite(n)||n<=0?null:{center:[r.x,r.y,r.z],radius:n}}function Kw({canvasAreaRef:e,controlsRef:t,sceneRef:r,modelUrl:n,tilesetUrl:i,measurementModelId:o,savedMeasurements:a,measurementSettings:s,measurementUnit:l,onMeasurementsChange:d,onMeasurementSettingsChange:u,onCollectionChange:p,modelRotation:c,bindingTransformSignature:h,modelLoaded:m,enabled:b}){let[y,S]=io(!1),[f,g]=YA(Vw,Yc),[x,_]=io("none"),[v,R]=io(null),[A,w]=io(!1),[C,P]=io(null),[E,T]=io(null),O=Jc(!1),j=Jc(0),I=Jc(null),N=Jc(null);O.current=y&&b;let D=cr(ie=>{ie.updateMatrixWorld(!0),P(QA(ie)),T(JA(ie))},[]),k=cr(()=>{g({type:"clear"}),R(null)},[]),U=cr(ie=>{g({type:"tool",tool:ie}),R(null)},[]),te=cr(()=>g({type:"undo"}),[]),re=cr(()=>g({type:"finishArea"}),[]),Z=cr(()=>S(ie=>!ie),[]),ne=cr(()=>w(ie=>!ie),[]),X=cr(ie=>{!O.current||ie.button!==0||(I.current={x:ie.clientX,y:ie.clientY})},[]),G=cr((ie,Ue)=>{let oe=e.current,K=t.current?.camera,Ae=r.current;if(!oe||!K||!Ae)return null;let we=oe.getBoundingClientRect();if(!we.width||!we.height)return null;Ae.updateMatrixWorld(!0),K.updateMatrixWorld(!0);let qe=new Im(ie-we.left,Ue-we.top),Ye=new KA;return Ye.setFromCamera(new Im(qe.x/we.width*2-1,1-qe.y/we.height*2),K),Ye.intersectObject(Ae,!0).find(fv)??null},[e,t,r]),H=cr((ie,Ue)=>{let oe=e.current,K=t.current?.camera,Ae=G(ie,Ue);if(!Ae||!oe||!K)return null;let we=oe.getBoundingClientRect(),qe=new Im(ie-we.left,Ue-we.top);return Lm(gv(Ae,K,qe,we,x),Ae)},[e,t,G,x]),ae=cr(()=>{N.current!==null&&cancelAnimationFrame(N.current),N.current=null,R(null)},[]),xe=cr(ie=>{if(!O.current||x==="none"||ie.buttons!==0||ie.target.closest("button, input, select, label, textarea, .ri-measureTools")){ae();return}N.current!==null&&cancelAnimationFrame(N.current);let{clientX:Ue,clientY:oe}=ie;N.current=requestAnimationFrame(()=>{N.current=null;let K=H(Ue,oe);R(K?.snapped?K:null)})},[ae,H,x]),Ie=cr(ie=>{if(!O.current)return;let Ue=I.current;if(I.current=null,Ue&&Math.hypot(ie.clientX-Ue.x,ie.clientY-Ue.y)>6||ie.target.closest("button, input, select, label, textarea, .ri-measureTools"))return;if(f.tool==="wrap"||f.tool==="wrapHorizontal"){let Ae=G(ie.clientX,ie.clientY);if(!Ae)return;let we=f.tool==="wrapHorizontal"?hv(Ae):mv(Ae);if("error"in we){g({type:"fail",error:we.error});return}let qe=we.points.map((Ye,ot)=>({id:j.current+ot+1,...Lm({position:Ye},Ae)}));j.current+=qe.length,g({type:"wrapResult",points:qe});return}let K=H(ie.clientX,ie.clientY);K&&(j.current+=1,g({type:"place",point:{...K,id:j.current}}))},[f.tool,H,G]);_s(()=>{k(),P(null),T(null)},[n,k]),_s(()=>{k()},[c[0],c[1],c[2],h,k]),_s(()=>(ae(),ae),[ae,y,x]),_s(()=>{b||(S(!1),ae())},[b,ae]),_s(()=>{let ie=r.current;!m||!ie||D(ie)},[h,m,D,r]);let[q,be]=io([]),Pe=f.points.length>0&&Np(f.tool,f.points)!==null&&(f.tool!=="area"||f.areaClosed),pe=f.tool==="distance"&&f.points.length===2,ft=cr(ie=>{if(!Pe)return;if(f.points.length>8192){g({type:"fail",error:"A saved measurement can contain up to 8,192 points. Choose a simpler surface and measure again."});return}if(f.points.some(oe=>!oe.anchor)){g({type:"fail",error:"This surface has no stable measurement anchor. Give the mesh a unique name and measure again."});return}if(a.length>=256){g({type:"fail",error:"A model can keep up to 256 named measurements."});return}let Ue={id:crypto.randomUUID(),name:ie.trim()||`Measurement ${a.length+1}`,modelId:o,...i?{tilesetUrl:i,approximate:!0}:{},tool:f.tool,points:structuredClone(f.points),createdAt:new Date().toISOString()};d([...a,Ue]),k()},[Pe,a,o,i,f,d,k]),J=cr((ie,Ue)=>{try{if(!pe)throw new Error("Pick two distance points before calibrating.");let oe=Np("distance",f.points).value;u(vv(oe,ie,Ue,s)),g({type:"clearError"})}catch(oe){g({type:"fail",error:oe instanceof Error?oe.message:String(oe)})}},[pe,f.points,s,u]),$e={settings:s,items:a};return{saveMeasurement:ft,canSaveMeasurement:Pe,canCalibrate:pe,calibrate:J,savedResults:q,setSavedResults:be,exportMeasurementJson:()=>dn(new Blob([xv($e)],{type:"application/json"}),"measurements.json"),exportMeasurementCsv:()=>{let ie=r.current?Ts(r.current):void 0,Ue=a.map(oe=>{let K=Qc(oe,r.current,o,i,ie);return dc(oe,s,l,K.points,K.status)});dn(new Blob([wv($e,Ue,l)],{type:"text/csv;charset=utf-8"}),"measurements.csv")},importMeasurements:ie=>{try{p(yv(ie)),k()}catch(Ue){g({type:"fail",error:Ue instanceof Error?Ue.message:String(Ue)})}},measureMode:y,measureModeRef:O,measurePoints:f.points,measurementTool:f.tool,areaClosed:f.areaClosed,measurementError:f.error,selectMeasurementTool:U,undoMeasurementPoint:te,finishMeasureArea:re,snapMode:x,setSnapMode:_,snapPreview:v,handleMeasurePointerMove:xe,clearSnapPreview:ae,showDimensions:A,measureBox:C,modelBounds:E,refreshBounds:D,clearMeasurements:k,toggleMeasureMode:Z,toggleDimensions:ne,handleMeasurePointerDown:X,handleMeasureClick:Ie}}import{createPortal as ZA}from"react-dom";import{createXRStore as eR}from"@react-three/xr";import{MapPin as tR}from"lucide-react";import{useCallback as oo,useEffect as ao,useMemo as Jw,useRef as rR,useState as wi}from"react";function Qw(e,t){let r=null,n=o=>{let a=o.mode==="immersive-ar"?o.session??null:null;a!==r&&(r&&t.endAR(),r=a,r&&t.startAR())},i=e.subscribe(n);return n(e.getState()),()=>{i(),r&&t.endAR("interrupted"),r=null}}import{Fragment as nR,jsx as aa,jsxs as Nm}from"react/jsx-runtime";var Zw={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function e0({enableXR:e,configuredHandoff:t=!1,usdzUrl:r,mobileHandoffUrl:n,engagement:i}){let o=ue(),a=rR(null),s=Jw(()=>{if(!e||typeof navigator>"u")return null;let U=navigator.xr;if(!U||typeof U.isSessionSupported!="function"||typeof U.addEventListener!="function")return null;try{return eR({emulate:!1})}catch{return null}},[e]),[l,d]=wi(!1),[u,p]=wi(!1),[c,h]=wi(!0),[m,b]=wi(null),[y,S]=wi(!1),[f,g]=wi(!1),[x,_]=wi(Zw),[v,R]=wi(!1),A=Jw(()=>e&&(t||!!r?.trim())&&hc(),[e,r,t]);ao(()=>{h(Fv())},[]);let w=oo(()=>{if(typeof window>"u")return null;try{let U=new URL(n?.trim()||window.location.href,window.location.href);return U.protocol==="http:"||U.protocol==="https:"?U.toString():null}catch{return null}},[n]);ao(()=>{if(!e||c){b(null),S(!1);return}b(w())},[e,c,w]),ao(()=>{if(s)return s.subscribe(U=>g(U.session!=null&&U.mode==="immersive-ar"))},[s]),ao(()=>{if(s)return Qw(s,i)},[s,i]),ao(()=>{R(!1),_(Zw)},[f]),ao(()=>{if(!e||typeof navigator>"u")return;let U=navigator.xr;if(!U?.isSessionSupported)return;let te=!1;return U.isSessionSupported("immersive-ar").then(re=>!te&&d(re)).catch(()=>{}),U.isSessionSupported("immersive-vr").then(re=>!te&&p(re)).catch(()=>{}),()=>{te=!0}},[e]);let C=oo(()=>{let U=w();U&&(i.requestARLaunch("mobile-handoff"),b(U),S(!0))},[w,i]),P=oo(()=>S(!1),[]),E=oo(()=>{let U=r?.trim();if(!U)return;i.requestARLaunch("quick-look");let te=document.createElement("a");te.setAttribute("rel","ar"),te.href=U,te.style.display="none";let re=document.createElement("img");re.alt="",re.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",te.appendChild(re),document.body.appendChild(te),te.click(),te.remove()},[r,i]),T=oo(U=>{_(U),U.isPlacementMode||R(!1)},[]),O=oo(U=>{R(!1),U?a.current?.finishPlacementMode():a.current?.cancelPlacementMode()},[]),j=oo(U=>{U.preventDefault(),R(!0),a.current?.startPlacementMode()},[]);ao(()=>{if(!v)return;let U=()=>O(!0),te=()=>O(!1);return window.addEventListener("pointerup",U),window.addEventListener("pointercancel",te),()=>{window.removeEventListener("pointerup",U),window.removeEventListener("pointercancel",te)}},[O,v]);let I=x.isModelPlaced?x.isPlacementMode?x.canPlace?o("arReleaseToPlace"):o("arFindSurface"):null:x.canPlace?null:o("arFindSurface"),N=x.isModelPlaced&&!x.isPlacementMode?o("arGestureHint"):null,D=s?.getState().domOverlayRoot??null,k=f&&D?ZA(Nm(nR,{children:[N&&aa("div",{className:"ri-arHintOverlay",children:aa("div",{className:"ri-arHint",children:N})}),aa("div",{className:"ri-arOverlay",children:Nm("div",{className:"ri-arControls",children:[I&&aa("div",{className:"ri-arStatus",children:I}),x.isModelPlaced&&Nm("button",{type:"button",className:`ri-arActionButton ${v?"ri-arActionButton--active":""}`,onPointerDown:U=>j(U.nativeEvent),"aria-pressed":v,children:[aa(tR,{size:14}),o("arRelocate")]}),!x.isModelPlaced&&x.canPlace&&aa("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>a.current?.placeCurrent(),children:o("tapToPlace")})]})})]}),D):null;return{xrStore:s,inARSession:f,presenterRef:a,arSupported:l,vrSupported:u,quickLookSupported:A,resolvedMobileHandoffUrl:m,isMobileHandoffOpen:y,arOverlay:k,openMobileHandoff:C,closeMobileHandoff:P,openQuickLook:E,handleARStateChange:T}}import{useEffect as iR,useRef as r0}from"react";import{useFrame as oR,useThree as aR}from"@react-three/fiber";var Zc=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null,eu=class{constructor(){this.lastFrame=null;this.intervals=[]}frame(t,r){let n=this.lastFrame===null?0:t-this.lastFrame;n>0&&(r==="always"||n<=250)&&this.intervals.length<1e3&&this.intervals.push(n),this.lastFrame=t}sample(t,r,n){let o=r.renderMode!=="never"&&this.lastFrame!==null&&n-this.lastFrame<=250?this.intervals:[],a=o.length?o.reduce((l,d)=>l+d,0)/o.length:null;this.intervals=[];let s=t.info;return{sampledAt:new Date().toISOString(),...structuredClone(r),drawCalls:Zc(r.renderer==="webgpu"?s?.render?.drawCalls:s?.render?.calls),triangles:Zc(s?.render?.triangles),geometries:Zc(s?.memory?.geometries),textures:Zc(s?.memory?.textures),frameIntervalMs:a,fps:a?1e3/a:null,frameSamples:o.length}}};function t0(e=1e3){return Number.isFinite(e)?Math.min(1e4,Math.max(250,e)):1e3}function n0(e){let t=aR(o=>o.get),r=r0(e);r.current=e;let n=r0(new eu);oR(o=>n.current.frame(performance.now(),o.frameloop));let i=t0(e.intervalMs);return iR(()=>{let o=setInterval(()=>{let{gl:a,viewport:s,frameloop:l}=t(),d=r.current,u=n.current.sample(a,{renderer:pi(a)?"webgpu":"webgl",renderMode:l,quality:{profile:d.profile,reducedGpuLoad:d.reducedGpuLoad,dpr:a.getPixelRatio?.()??s.dpr,shadows:a.shadowMap?.enabled??d.shadows,postProcessing:d.postProcessing},streaming:d.streamingRef?.current??null},performance.now());d.onStats(u)},i);return()=>clearInterval(o)},[t,i]),null}import{Canvas as fk,useThree as S0}from"@react-three/fiber";import{Environment as gk}from"@react-three/drei";import{XR as bk}from"@react-three/xr";import{ACESFilmicToneMapping as vk,LinearToneMapping as yk,NoToneMapping as P0,ReinhardToneMapping as xk}from"three";import{Suspense as wk,useEffect as Mk,useMemo as au,useState as Sk}from"react";import{useThree as Rs}from"@react-three/fiber";import{Autofocus as NR,Bloom as jR,BrightnessContrast as zR,ChromaticAberration as VR,ColorAverage as FR,DepthOfField as UR,DotScreen as GR,EffectComposer as HR,Glitch as WR,GodRays as qR,Grid as XR,HueSaturation as $R,Noise as YR,Outline as KR,Pixelation as QR,Ramp as JR,Scanline as ZR,SelectiveBloom as ek,Sepia as tk,SMAA as rk,SSAO as nk,ToneMapping as ik,Vignette as ok}from"@react-three/postprocessing";import{BlendFunction as la,KernelSize as ak}from"postprocessing";import{Color as ks,Vector2 as Es}from"three";import{memo as sk,useCallback as lk,useEffect as Wm,useLayoutEffect as ck,useMemo as lo,useRef as qm,useState as w0}from"react";import{forwardRef as sR,useImperativeHandle as lR,useMemo as cR}from"react";import{BlendFunction as uR,Effect as dR}from"postprocessing";import{Uniform as pR}from"three";import{jsx as hR}from"react/jsx-runtime";var mR=`
10
+ uniform float exposure;
11
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
12
+ outputColor = vec4(inputColor.rgb * exposure, inputColor.a);
13
+ }
14
+ `,jm=class extends dR{constructor(t=1){super("ExposureEffect",mR,{blendFunction:uR.NORMAL,uniforms:new Map([["exposure",new pR(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},i0=sR(function({exposure:t},r){let n=cR(()=>new jm(t),[]);return n.exposure=t,lR(r,()=>n,[n]),hR("primitive",{object:n,dispose:null})});import{useFrame as fR,useThree as tu}from"@react-three/fiber";import*as l0 from"@react-three/postprocessing";import{BlendFunction as gR}from"postprocessing";import{Color as bR,MathUtils as vR,Mesh as yR,Vector2 as o0,Vector3 as a0}from"three";import{useEffect as s0,useMemo as ru,useRef as zm}from"react";import{jsx as wR}from"react/jsx-runtime";var xR=l0.LensFlareEffect;function c0({config:e}){let t=tu(c=>c.camera),r=tu(c=>c.raycaster),n=tu(c=>c.scene),i=tu(c=>c.viewport),o=zm(null),a=zm(new a0),s=zm(new o0),l=ru(()=>new a0(...e.lensPosition),[e.lensPosition]),d=ru(()=>new bR(e.colorGain??"#141414"),[e.colorGain]),u=ru(()=>new o0(0,0),[]),p=ru(()=>new xR({blendFunction:gR.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:l,screenRes:u,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:d,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[d,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,l,u]);return s0(()=>(o.current=p,()=>{p.dispose(),o.current=null}),[p]),s0(()=>{let c=p.uniforms.get("screenRes");c&&(c.value.x=i.width,c.value.y=i.height)},[p,i]),fR((c,h)=>{let m=o.current;if(!m)return;let b=m.uniforms.get("lensPosition"),y=m.uniforms.get("opacity");if(!b||!y)return;let S=1;if(a.current.copy(l).project(t),a.current.z>1)return;b.value.x=a.current.x,b.value.y=a.current.y,s.current.x=a.current.x,s.current.y=a.current.y,r.setFromCamera(s.current,t);let f=r.intersectObjects(n.children,!0),{object:g}=f[0]||{};g&&(g.userData?.lensflare==="no-occlusion"?S=0:g instanceof yR&&(g.material.uniforms?._transmission?.value>.2||g.material._transmission&&g.material._transmission>.2?S=.2:g.material.transparent&&(S=g.material.opacity))),y.value=vR.damp(y.value,S,12,h)}),wR("primitive",{object:p,dispose:null})}import{useThree as h0}from"@react-three/fiber";import{EffectPass as DR}from"postprocessing";import{useEffect as OR,useMemo as LR}from"react";import{BlendFunction as MR,Effect as SR,RenderPass as CR}from"postprocessing";import{Color as u0,Mesh as m0,NearestFilter as nu,NoBlending as PR,ShaderMaterial as d0,Uniform as so,Vector2 as TR,Vector3 as _R,WebGLRenderTarget as p0}from"three";var ER=`
15
+ #include <common>
16
+ #include <morphtarget_pars_vertex>
17
+ #include <skinning_pars_vertex>
18
+ #include <clipping_planes_pars_vertex>
19
+ #include <logdepthbuf_pars_vertex>
20
+ void main() {
21
+ #include <skinbase_vertex>
22
+ #include <begin_vertex>
23
+ #include <morphtarget_vertex>
24
+ #include <skinning_vertex>
25
+ #include <project_vertex>
26
+ #include <logdepthbuf_vertex>
27
+ #include <clipping_planes_vertex>
28
+ }`,AR=`
29
+ #include <common>
30
+ #include <clipping_planes_pars_fragment>
31
+ #include <logdepthbuf_pars_fragment>
32
+ uniform vec3 objectId;
33
+ uniform bool onlySelected;
34
+ void main() {
35
+ #include <clipping_planes_fragment>
36
+ #include <logdepthbuf_fragment>
37
+ if (onlySelected && length(objectId) < 0.001) discard;
38
+ gl_FragColor = vec4(objectId, step(0.001, length(objectId)));
39
+ }`,RR=`
40
+ uniform sampler2D selectionMask;
41
+ uniform sampler2D visibleMask;
42
+ uniform vec2 texelSize;
43
+ uniform vec3 outlineColor;
44
+ uniform float edgeStrength;
45
+ float different(vec4 a, vec4 b) {
46
+ return max(a.a, b.a) * step(0.001, length(a.rgb - b.rgb) + abs(a.a - b.a));
47
+ }
48
+ float visible(vec4 id, vec4 surface) {
49
+ return surface.a * (1.0 - step(0.001, length(id.rgb - surface.rgb)));
50
+ }
51
+ float edgeAt(vec2 uv, vec2 offset, vec4 center, float centerVisible) {
52
+ vec4 neighbor = texture2D(selectionMask, uv + offset);
53
+ return different(center, neighbor) * max(centerVisible, visible(neighbor, texture2D(visibleMask, uv + offset)));
54
+ }
55
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
56
+ vec4 c = texture2D(selectionMask, uv);
57
+ float shown = visible(c, texture2D(visibleMask, uv));
58
+ float edge = max(max(edgeAt(uv, vec2(texelSize.x, 0.0), c, shown), edgeAt(uv, vec2(-texelSize.x, 0.0), c, shown)),
59
+ max(edgeAt(uv, vec2(0.0, texelSize.y), c, shown), edgeAt(uv, vec2(0.0, -texelSize.y), c, shown)));
60
+ outputColor = vec4(outlineColor * edge * edgeStrength, max(inputColor.a, edge));
61
+ }`,iu=class extends SR{constructor(r,n,i,o,a={}){super("SelectionOutlineEffect",RR,{blendFunction:MR.SCREEN,uniforms:new Map([["selectionMask",new so(null)],["visibleMask",new so(null)],["texelSize",new so(new TR)],["outlineColor",new so(new u0(a.visibleEdgeColor??2278750))],["edgeStrength",new so(a.edgeStrength??3)]])});this.scene=r;this.camera=n;this.getObjects=i;this.layer=o;this.maskTarget=new p0(1,1,{minFilter:nu,magFilter:nu});this.visibleTarget=new p0(1,1,{minFilter:nu,magFilter:nu});this.visibleTarget.texture.name="SelectionOutline.VisibleIDs",this.uniforms.get("visibleMask").value=this.visibleTarget.texture,this.maskTarget.texture.name="SelectionOutline.IDs",this.uniforms.get("selectionMask").value=this.maskTarget.texture,this.maskMaterial=new d0({name:"SelectionOutline.IDs",vertexShader:ER,fragmentShader:AR,uniforms:{objectId:new so(new _R),onlySelected:new so(!1)},blending:PR,toneMapped:!1,clipping:!0}),this.maskPass=new CR(r,n,this.maskMaterial),this.maskPass.skipShadowMapUpdate=!0,this.maskPass.ignoreBackground=!0,this.maskPass.clearPass.overrideClearColor=new u0(0),this.maskPass.clearPass.overrideClearAlpha=0}update(r){let n=kR(this.scene,this.getObjects()),i=[],o=this.camera.layers.mask;try{this.scene.traverseVisible(a=>{if(!(a instanceof m0))return;let s=n.get(a)??0,l=a.onBeforeRender;a.onBeforeRender=function(...d){l.apply(this,d);let u=d[4];u instanceof d0&&u.uniforms.objectId&&(u.uniforms.objectId.value.set((s&255)/255,(s>>>8&255)/255,(s>>>16&255)/255),u.uniformsNeedUpdate=!0)},i.push(()=>{a.onBeforeRender=l})}),this.maskMaterial.uniforms.onlySelected.value=!1,this.maskPass.render(r,this.visibleTarget,null);for(let a of n.keys()){let s=a.layers.mask;a.layers.enable(this.layer),i.push(()=>{a.layers.mask=s})}this.camera.layers.set(this.layer),this.maskMaterial.uniforms.onlySelected.value=!0,this.maskPass.render(r,this.maskTarget,null)}finally{this.camera.layers.mask=o;for(let a of i)a()}}setSize(r,n){this.maskTarget.setSize(r,n),this.visibleTarget.setSize(r,n),this.uniforms.get("texelSize").value.set(1/r,1/n)}dispose(){this.maskPass.dispose(),this.maskMaterial.dispose(),this.maskTarget.dispose(),this.visibleTarget.dispose()}};function kR(e,t){let r=new Map(t.map((o,a)=>[o,a+1])),n=new Map,i=(o,a)=>{if(!o.visible)return;let s=r.get(o)??a;s&&o instanceof m0&&n.set(o,s);for(let l of o.children)i(l,s)};return i(e,0),n}import{jsx as IR}from"react/jsx-runtime";function f0({objects:e,layer:t,options:r}){let n=h0(a=>a.scene),i=h0(a=>a.camera),o=LR(()=>new DR(i,new iu(n,i,()=>e.current,t,r)),[n,i,e,t,r]);return OR(()=>()=>o.dispose(),[o]),IR("primitive",{object:o,dispose:null})}function g0(e){let t=[e];for(;t.length>0;){let r=t.pop();if(r.visible){if(r.isMesh)return!0;t.push(...r.children)}}return!1}function b0(e,t){let r=e.update,n=t,i=NaN,o=NaN;return e.update=function(...a){(i!==n.near||o!==n.far)&&(this.mainCamera=t,i=n.near,o=n.far),r.apply(this,a)},()=>{e.update=r}}import{RampType as Vm}from"@react-three/postprocessing";import{GlitchMode as Fm,KernelSize as sa,ToneMappingMode as Um}from"postprocessing";import{Color as BR}from"three";function v0(e){return e==="linear"?Um.LINEAR:e==="reinhard"?Um.REINHARD:Um.ACES_FILMIC}function ou(e){switch(e){case"verySmall":return sa.VERY_SMALL;case"small":return sa.SMALL;case"medium":return sa.MEDIUM;case"large":return sa.LARGE;case"veryLarge":return sa.VERY_LARGE;case"huge":return sa.HUGE}}function y0(e){switch(e){case"constantMild":return Fm.CONSTANT_MILD;case"constantWild":return Fm.CONSTANT_WILD;default:return Fm.SPORADIC}}function Gm(e){let t=new BR(e);return[t.r,t.g,t.b,1]}function x0(e){return e==="radial"?Vm.Radial:e==="mirroredLinear"?Vm.MirroredLinear:Vm.Linear}import{Fragment as hk,jsx as lt,jsxs as Hm}from"react/jsx-runtime";var co={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new ks(Wo.color).getHex(),hiddenEdgeColor:new ks(Wo.color).multiplyScalar(.35).getHex(),kernelSize:ak.VERY_SMALL,blur:!1,xRay:!1},uk={edgeStrength:3};function dk(e){let t=[];return e.traverse(r=>{r.isMesh&&t.push(r)}),t}var As=[],pk=sk(function({sceneConfig:t,selectedObjectRef:r,selectedObjectOutlineColor:n,highlightOnHover:i=!1,disabled:o=!1,onOutlineEffect:a,hasMultiSelection:s,multiOutlineObjects:l}){let d=Rs(P=>P.scene),u=Rs(P=>P.gl),p=qm(null),c=t?.postProcessing,h=r??null,m=c?.outline.enabled===!0,b=m||i,y=lo(()=>new ks(n??"#22c55e").getHex(),[n]),S=lo(()=>({...uk,blendFunction:la.SCREEN,visibleEdgeColor:y}),[y]),f=2;for(;f===c?.outline.selectionLayer||f===c?.selectiveBloom.selectionLayer;)f+=1;let[g,x]=w0(()=>u.xr?.isPresenting??!1);Wm(()=>{let P=u.xr;if(!P)return;let E=()=>x(!0),T=()=>x(!1);return P.addEventListener("sessionstart",E),P.addEventListener("sessionend",T),x(P.isPresenting),()=>{P.removeEventListener("sessionstart",E),P.removeEventListener("sessionend",T)}},[u]);let _=d.children.filter(P=>P.isLight),v=lo(()=>new Es(c?.chromaticAberration.offsetX??.002,c?.chromaticAberration.offsetY??.002),[c?.chromaticAberration.offsetX,c?.chromaticAberration.offsetY]),R=lo(()=>new ks(c?.outline.visibleEdgeColor??"#ffffff").getHex(),[c?.outline.visibleEdgeColor]),A=lo(()=>new ks(c?.outline.hiddenEdgeColor??"#22090a").getHex(),[c?.outline.hiddenEdgeColor]),w=lo(()=>Gm(c?.ramp.startColor??"#000000"),[c?.ramp.startColor]),C=lo(()=>Gm(c?.ramp.endColor??"#ffffff"),[c?.ramp.endColor]);return!c||g||o?null:Hm(hk,{children:[c.godRays.enabled===!0&&Hm("mesh",{ref:p,position:c.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[lt("sphereGeometry",{args:[.1,8,8]}),lt("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),Hm(HR,{multisampling:0,enableNormalPass:c.ssao.enabled===!0,autoClear:!1,children:[c.smaa.enabled===!0&&lt(rk,{}),c.ssao.enabled===!0&&lt(nk,{samples:c.ssao.samples,rings:c.ssao.rings,intensity:c.ssao.intensity,radius:c.ssao.radius,bias:c.ssao.bias,luminanceInfluence:c.ssao.luminanceInfluence,fade:c.ssao.fade,minRadiusScale:c.ssao.minRadiusScale,worldDistanceThreshold:c.ssao.worldDistanceThreshold,worldDistanceFalloff:c.ssao.worldDistanceFalloff,worldProximityThreshold:c.ssao.worldProximityThreshold,worldProximityFalloff:c.ssao.worldProximityFalloff}),c.autofocus.enabled===!0&&lt(NR,{focusDistance:c.autofocus.focusDistance,focusRange:c.autofocus.focusRange,focalLength:c.autofocus.focalLength,bokehScale:c.autofocus.bokehScale,target:c.autofocus.target,mouse:c.autofocus.mouse,debug:c.autofocus.debug||void 0,manual:c.autofocus.manual,smoothTime:c.autofocus.smoothTime}),c.autofocus.enabled!==!0&&c.depthOfField.enabled===!0&&lt(UR,{focusDistance:c.depthOfField.focusDistance,focusRange:c.depthOfField.focusRange,focalLength:c.depthOfField.focalLength,bokehScale:c.depthOfField.bokehScale}),c.bloom.enabled===!0&&lt(jR,{intensity:c.bloom.intensity,luminanceThreshold:c.bloom.luminanceThreshold,luminanceSmoothing:c.bloom.luminanceSmoothing,mipmapBlur:c.bloom.mipmapBlur,radius:c.bloom.radius,levels:c.bloom.levels}),c.selectiveBloom.enabled===!0&&lt(ek,{selection:h??void 0,lights:_,selectionLayer:c.selectiveBloom.selectionLayer,intensity:c.selectiveBloom.intensity,luminanceThreshold:c.selectiveBloom.luminanceThreshold,luminanceSmoothing:c.selectiveBloom.luminanceSmoothing,kernelSize:ou(c.selectiveBloom.kernelSize),mipmapBlur:c.selectiveBloom.mipmapBlur,inverted:c.selectiveBloom.inverted,ignoreBackground:c.selectiveBloom.ignoreBackground}),b&&lt(KR,{ref:a,selection:As,selectionLayer:c.outline.selectionLayer,blendFunction:la.SCREEN,edgeStrength:m?c.outline.edgeStrength:co.edgeStrength,pulseSpeed:m?c.outline.pulseSpeed:co.pulseSpeed,visibleEdgeColor:m?R:co.visibleEdgeColor,hiddenEdgeColor:m?A:co.hiddenEdgeColor,kernelSize:m?ou(c.outline.kernelSize):co.kernelSize,blur:m?c.outline.blur:co.blur,xRay:m?c.outline.xRay:co.xRay}),s&&lt(f0,{objects:l,layer:f,options:S}),c.chromaticAberration.enabled===!0&&lt(VR,{offset:v,radialModulation:c.chromaticAberration.radialModulation,modulationOffset:c.chromaticAberration.modulationOffset}),c.colorAverage.enabled===!0&&lt(FR,{}),c.dotScreen.enabled===!0&&lt(GR,{angle:c.dotScreen.angle,scale:c.dotScreen.scale}),c.glitch.enabled===!0&&lt(WR,{mode:y0(c.glitch.mode),delay:new Es(c.glitch.delay[0],c.glitch.delay[1]),duration:new Es(c.glitch.duration[0],c.glitch.duration[1]),strength:new Es(c.glitch.strength[0],c.glitch.strength[1]),chromaticAberrationOffset:new Es(c.glitch.chromaticAberrationOffset[0],c.glitch.chromaticAberrationOffset[1]),columns:c.glitch.columns,ratio:c.glitch.ratio,active:!0}),c.grid.enabled===!0&&lt(XR,{scale:c.grid.scale,lineWidth:c.grid.lineWidth}),c.lensflare.enabled===!0&&lt(c0,{config:c.lensflare}),c.godRays.enabled===!0&&lt(qR,{sun:p,samples:c.godRays.samples,density:c.godRays.density,decay:c.godRays.decay,weight:c.godRays.weight,exposure:c.godRays.exposure,clampMax:c.godRays.clampMax,blur:c.godRays.blur,kernelSize:ou(c.godRays.kernelSize)}),c.noise.enabled===!0&&lt(YR,{premultiply:c.noise.premultiply,opacity:c.noise.opacity,blendFunction:la.ADD}),c.brightnessContrast.enabled===!0&&lt(zR,{brightness:c.brightnessContrast.brightness,contrast:c.brightnessContrast.contrast}),c.hueSaturation.enabled===!0&&lt($R,{hue:c.hueSaturation.hue,saturation:c.hueSaturation.saturation}),c.toneMapping.enabled===!0&&lt(i0,{exposure:c.toneMapping.exposure}),c.vignette.enabled===!0&&lt(ok,{eskil:c.vignette.eskil,offset:c.vignette.offset,darkness:c.vignette.darkness,blendFunction:la.NORMAL}),c.toneMapping.enabled===!0&&lt(ik,{mode:v0(c.toneMapping.mode),resolution:c.toneMapping.resolution,whitePoint:c.toneMapping.whitePoint,middleGrey:c.toneMapping.middleGrey,minLuminance:c.toneMapping.minLuminance,averageLuminance:c.toneMapping.averageLuminance,adaptationRate:c.toneMapping.adaptationRate}),c.sepia.enabled===!0&&lt(tk,{intensity:c.sepia.intensity,blendFunction:la.NORMAL}),c.scanline.enabled===!0&&lt(ZR,{density:c.scanline.density,blendFunction:la.OVERLAY}),c.pixelation.enabled===!0&&lt(QR,{granularity:c.pixelation.granularity}),c.ramp.enabled===!0&&lt(JR,{rampType:x0(c.ramp.rampType),rampStart:c.ramp.rampStart,rampEnd:c.ramp.rampEnd,startColor:w,endColor:C,opacity:c.ramp.rampMask?1:c.ramp.opacity??.5,rampBias:c.ramp.rampBias,rampGain:c.ramp.rampGain,rampMask:c.ramp.rampMask,rampInvert:c.ramp.rampInvert})]})]})});function mk(e,t){return e.length===t.length&&e.every((r,n)=>r===t[n])}function M0({hoveredObjectRef:e,selectedObjectRefs:t,...r}){let n=Rs(p=>p.scene),i=Rs(p=>p.camera),o=Rs(p=>p.invalidate),[a,s]=w0(null),l=qm(As);l.current=t??As;let d=lk(p=>s(p),[]);ck(()=>{if(a)return b0(a,i)},[a,i]);let u=qm({effect:null,objects:As});return Wm(()=>{if(!a)return;let c=r.sceneConfig?.postProcessing?.outline.enabled===!0?dk(n):e&&g0(e)?[e]:As;u.current.effect===a&&mk(u.current.objects,c)||(u.current={effect:a,objects:c},a.selection.set(c),o())}),Wm(()=>{o()},[t,o]),lt(pk,{...r,onOutlineEffect:d,hasMultiSelection:l.current.length>0,multiOutlineObjects:l})}import{Fragment as _k,jsx as er,jsxs as C0}from"react/jsx-runtime";var Ck=1.5;function Xm({runtimeStats:e,children:t,camera:r,backgroundColor:n,shadows:i=!0,sceneConfig:o,selectedObjectRef:a,selectedObjectRefs:s,selectedObjectOutlineColor:l,hoveredObjectRef:d,highlightOnHover:u,renderMode:p="demand",maxDpr:c=2,xrStore:h,rendererCaptureRef:m,preserveDrawingBuffer:b=!1,reduceGpuLoad:y,suspended:S=!1,paused:f=!1,onRendererCreated:g,backend:x="webgl"}){let _=x==="webgpu",v=y??Uv(),R=v?Math.min(c,Ck):c,A=i&&!v,w=au(()=>{if(n)return{background:n};if(!o?.background.enabled)return{background:"transparent"};if(o.background.type==="color")return{background:o.background.color};if(o.background.type==="image"&&o.background.imageUrl.trim()){let D=o.background.imageUrl.trim(),k=tc(D)??D;return{backgroundImage:`url(${JSON.stringify(k)})`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}}return{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}},[n,o]),C=au(()=>{if(n)return n;let D=o?.background;if(D?.enabled){if(D.type==="color")return D.color;if(D.type==="image"&&D.imageUrl.trim()||D.type==="environment")return null}return"#1c1c1d"},[n,o]),P=au(()=>{let D=o?.postProcessing;return D?!!(D.glitch.enabled||D.noise.enabled||D.lensflare.enabled&&D.lensflare.animated):!1},[o?.postProcessing]),[E,T]=Sk(!1),O=o?.environment,j=o?.groundShadows,I=au(()=>{if(!O)return null;if(O.source==="custom"){let D=O.customEnvironmentUrl.trim();return cv(D)?{files:D}:null}return{preset:O.preset}},[O]),N=C0(_k,{children:[er(Zv,{captureRef:m}),e&&er(n0,{...e,reducedGpuLoad:v,shadows:A,postProcessing:!v&&!_}),er(ey,{}),er(wy,{cameraConfig:r}),er(by,{active:P}),er(yy,{color:C}),I?er(ia,{onError:D=>console.warn("Failed to load environment map:",D),children:er(wk,{fallback:null,children:er(gk,{...I,environmentIntensity:O?.intensity??.25,backgroundIntensity:O?.intensity??.25,background:o?.background.enabled===!0&&o.background.type==="environment"})})}):null,er(xy,{rotation:O?.rotation??0}),h&&er(gy,{onPresentingChange:T}),j?.enabled&&j.mode==="shadowCatcher"&&!E&&!_&&er(vy,{position:[0,j.height,0],scale:j.size,opacity:j.intensity,blur:j.borderFade,far:15,resolution:1024,color:"#000000"}),t,er(M0,{sceneConfig:o,selectedObjectRef:a,selectedObjectRefs:s,selectedObjectOutlineColor:l,hoveredObjectRef:d,highlightOnHover:u,disabled:v||_}),_?er(Tk,{toneMapping:o?.postProcessing.toneMapping}):null]});return er(fk,{frameloop:S||f&&!E?"never":p,onCreated:({gl:D})=>g?.(D),dpr:[1,R],shadows:A?"percentage":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:w,camera:r??{fov:50},gl:_?Qv:{preserveDrawingBuffer:b,toneMapping:P0,toneMappingExposure:1},flat:_||void 0,children:h&&!_?C0(bk,{store:h,children:[er(fy,{renderMode:p,suspended:S}),N]}):N})}var Pk={linear:yk,reinhard:xk,aces:vk};function Tk({toneMapping:e}){let t=S0(a=>a.gl),r=S0(a=>a.invalidate),n=e?.enabled===!0,i=e?.mode??"aces",o=e?.exposure??1;return Mk(()=>{t.toneMapping=n?Pk[i]:P0,t.toneMappingExposure=n?o:1,r()},[t,r,n,i,o]),null}import{CameraControls as Ek,PointerLockControls as Ak}from"@react-three/drei";import{Box3 as Rk,Vector3 as _0}from"three";import{useEffect as ca,useRef as kk}from"react";var su=e=>e*Math.PI/180;function T0(e){return{minDistance:e?.minDistance??0,maxDistance:e?.maxDistance??1/0,minPolarAngle:su(e?.minPolarAngle??0),maxPolarAngle:su(e?.maxPolarAngle??180),minAzimuthAngle:su(e?.minAzimuthAngle??-1/0),maxAzimuthAngle:su(e?.maxAzimuthAngle??1/0),boundaryEnclosesCamera:e?.boundaryEnclosesCamera??!1,boundaryFriction:e?.boundaryFriction??0,panBoundary:e?.panBoundary}}import{jsx as E0}from"react/jsx-runtime";function $m({controlsRef:e,onCameraChange:t,cameraLimits:r,controllerType:n="orbit",onPointerLockExit:i,reducedMotion:o=!1}){let a=n==="orbit",s=kk(null);return ca(()=>{if(!a)return s.current?.lock(),()=>{s.current?.unlock()}},[a]),ca(()=>{a&&document.pointerLockElement&&document.exitPointerLock()},[a]),ca(()=>{if(a)return;let l=()=>{document.pointerLockElement||i?.()};return document.addEventListener("pointerlockchange",l),()=>{document.removeEventListener("pointerlockchange",l)}},[a,i]),ca(()=>{if(!a||!e||typeof e!="object"||!("current"in e))return;let l=e.current;l&&By(l,o)},[a,e,o]),ca(()=>{if(!a||!t||!e||typeof e!="object"||!("current"in e))return;let l=e.current;if(!l)return;let d=()=>{t(l.camera,l)};return l.addEventListener("update",d),()=>{l.removeEventListener("update",d)}},[a,e,t]),ca(()=>{if(!a||!e||typeof e!="object"||!("current"in e))return;let l=e.current;if(!l)return;let d=T0(r);l.minDistance=d.minDistance,l.maxDistance=d.maxDistance,l.minPolarAngle=d.minPolarAngle,l.maxPolarAngle=d.maxPolarAngle,l.minAzimuthAngle=d.minAzimuthAngle,l.maxAzimuthAngle=d.maxAzimuthAngle,l.boundaryEnclosesCamera=d.boundaryEnclosesCamera,l.boundaryFriction=d.boundaryFriction,l.setBoundary(d.panBoundary?new Rk(new _0(...d.panBoundary[0]),new _0(...d.panBoundary[1])):void 0)},[a,e,r?.minDistance,r?.maxDistance,r?.minPolarAngle,r?.maxPolarAngle,r?.minAzimuthAngle,r?.maxAzimuthAngle,r?.boundaryEnclosesCamera,r?.boundaryFriction,r?.panBoundary]),a?E0(Ek,{ref:e,makeDefault:!0,smoothTime:o?0:.3,dollyToCursor:!0}):E0(Ak,{ref:s,makeDefault:!0,selector:"[data-ri-pointer-lock-trigger]"})}import{useRef as Ym,useMemo as lu,useEffect as Dk}from"react";import{useFrame as Ok,useThree as A0}from"@react-three/fiber";import{Vector3 as Lk}from"three";import{Fragment as Vk,jsx as uo,jsxs as Fk}from"react/jsx-runtime";function k0(e,t){if(!t)return e;let r=t*Math.PI/180,n=Math.cos(r),i=Math.sin(r);return[e[0]*n+e[2]*i,e[1],-e[0]*i+e[2]*n]}function Ik(e,t){let[r,n,i]=e.center,o=e.radius,a=Math.hypot(t[0],t[1],t[2]),s=a>1e-6?[t[0]/a,t[1]/a,t[2]/a]:[0,1,0],l=o*2;return{position:[r+s[0]*l,n+s[1]*l,i+s[2]*l],target:e.center,extent:o,near:Math.max(o/100,.001),far:l+o*2}}function Bk(e,t){let r=t[0]-e.center[0],n=t[1]-e.center[1],i=t[2]-e.center[2],o=Math.hypot(r,n,i);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function Nk(e,t,r){return t&&r&&!e.attachedToCamera?r.center:[0,0,0]}var jk={ambient:{intensity:.25,color:"#ffffff"},lights:[{id:"light-hemi",type:"hemisphere",color:"#ffffff",intensity:.3,position:[0,1,0],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0},{id:"light-key",type:"directional",color:"#ffffff",intensity:2.5,position:[6,12,6],attachedToCamera:!1,castShadow:!0,shadowBias:-5e-4,visible:!0},{id:"light-fill",type:"directional",color:"#ffffff",intensity:0,position:[-6,8,-6],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}]},zk={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function R0({light:e,shadows:t,shadowsEnabled:r,environmentRotation:n,modelBounds:i,objectBindings:o,nodeRefs:a}){let s=Ym(null),l=Ym(null),d=Ym(null),u=A0(S=>S.camera),p=A0(S=>S.scene),c=lu(()=>new Lk,[]),h=lu(()=>e.attachedToCamera||e.attachment?e.position:k0(e.position,n),[e.position,e.attachedToCamera,e.attachment,n]);Ok(()=>{let S=s.current??l.current??d.current;if(!S)return;if(e.attachedToCamera){S.position.copy(u.position);return}let f=e.attachment;if(!f)return;let g=o?Fo(o,f.objectId):null,_=(g?o?.[g]:void 0)?.modelObjectId??f.objectId,v=(g?a?.current[g]:void 0)??cn(p,_);v&&(c.fromArray(f.offset),v.localToWorld(c),S.position.copy(c))});let m=r&&t.enabled&&e.castShadow,b=lu(()=>e.type==="directional"&&m&&i&&!e.attachedToCamera?Ik(i,h):null,[e.type,e.attachedToCamera,m,i,h]),y=lu(()=>e.type==="spot"&&m&&i&&!e.attachedToCamera?Bk(i,h):null,[e.type,e.attachedToCamera,m,i,h]);return Dk(()=>{let S=s.current??d.current;if(!S)return;let[f,g,x]=Nk(e,m,i);S.target.position.set(f,g,x),S.target.updateMatrixWorld()},[e,m,i]),!e.visible||e.type==="none"?null:e.type==="directional"?uo("directionalLight",{ref:s,color:e.color,intensity:e.intensity,position:b?.position??h,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":b?.near??.5,"shadow-camera-far":b?.far??40,"shadow-camera-left":-(b?.extent??8),"shadow-camera-right":b?.extent??8,"shadow-camera-top":b?.extent??8,"shadow-camera-bottom":-(b?.extent??8)}):e.type==="point"?uo("pointLight",{ref:l,color:e.color,intensity:e.intensity,position:h,distance:e.distance,decay:e.decay,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?uo("spotLight",{ref:d,color:e.color,intensity:e.intensity,position:h,angle:e.angle??Math.PI/6,penumbra:e.penumbra??.2,distance:e.distance,decay:e.decay,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":y?.near??.5,"shadow-camera-far":y?.far??40}):e.type==="hemisphere"?uo("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function Km({lightingConfig:e,shadowConfig:t,shadowsEnabled:r=!0,environmentRotation:n=0,environmentConfig:i,modelBounds:o,objectBindings:a,nodeRefs:s}){let l=e??jk,d=t??zk,u=i?.shadowLight,p=k0([5,10,5],n);return Fk(Vk,{children:[uo("ambientLight",{intensity:l.ambient.intensity,color:l.ambient.color}),l.lights.map(c=>uo(R0,{light:c,shadows:d,shadowsEnabled:r,environmentRotation:n,modelBounds:o,objectBindings:a,nodeRefs:s},c.id)),u?.enabled&&uo(R0,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:u.intensity,position:p,attachedToCamera:!1,castShadow:!0,shadowBias:u.bias,visible:!0},shadows:d,shadowsEnabled:r,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:s})]})}import{useState as Jm,useEffect as rt,useRef as Vt,useMemo as Tt,useCallback as Qk,Suspense as Jk}from"react";import{useFrame as mu,useThree as Zk}from"@react-three/fiber";import{useCallback as Uk,useEffect as D0,useRef as Qm,useState as O0}from"react";function L0(e,t,r){let[n,i]=O0({}),o=Qm(new Map),[a,s]=O0(0),l=Qm(t);l.current=t;let d=Qm(r);d.current=r;let u=Uk((p,c)=>{l.current?.some(h=>h.url===p)&&i(h=>h[p]===c?h:{...h,[p]:c})},[]);return D0(()=>{let p=new Set(t?.map(h=>h.url)),c=!1;for(let[h,m]of o.current)p.has(h)&&n[h]===m&&m.parent===e||(m.removeFromParent(),o.current.delete(h),c=!0);for(let[h,m]of Object.entries(n))!p.has(h)||o.current.get(h)===m||(e.add(m),o.current.set(h,m),c=!0,d.current?.(h,m));i(h=>{let m=Object.entries(h).filter(([b])=>p.has(b));return m.length===Object.keys(h).length?h:Object.fromEntries(m)}),c&&s(h=>h+1)},[e,t,n]),D0(()=>()=>{o.current.forEach(p=>p.removeFromParent()),o.current.clear()},[]),{rootsByUrl:n,revision:a,onSourceReady:u}}import{Box3 as I0,Euler as Gk,Matrix4 as B0,Quaternion as Hk,Vector3 as zn}from"three";function Ds(e){e.updateWorldMatrix(!0,!0);let t=new B0().copy(e.matrixWorld).invert(),r=new I0,n=new I0,i=!1;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||(a.geometry.boundingBox||a.geometry.computeBoundingBox(),!a.geometry.boundingBox))return;let s=new B0().multiplyMatrices(t,o.matrixWorld);n.copy(a.geometry.boundingBox).applyMatrix4(s),r.union(n),i=!0}),i?r:null}function po(e){let t=Ds(e);return t?t.getCenter(new zn):new zn}function N0(e,t="XYZ"){return new Hk().setFromEuler(new Gk(e[0],e[1],e[2],t))}function Wk(e,t,r,n,i="XYZ",o){let a=new zn(...n).multiply(new zn(...r));o&&a.applyMatrix4(ra(o)),a.applyQuaternion(N0(t,i));let s=a.add(new zn(...e));return[s.x,s.y,s.z]}function cu(e,t,r,n="XYZ",i){return{point:[...e],offset:Wk([0,0,0],t,r,e,n,i)}}function Os(e,t,r,n,i="XYZ",o){if(!n)return e;let a=new zn(...n.point).multiply(new zn(...r));return o&&a.applyMatrix4(ra(o)),a.applyQuaternion(N0(t,i)),new zn(...e).add(new zn(...n.offset)).sub(a).toArray()}function jU(e,t){let r=t.findIndex(n=>Math.abs(n)>1e-12);return r<0?1:Math.abs(e[r]/t[r])}import{Color as eD,MeshStandardMaterial as tD,MeshBasicMaterial as Zm,MeshNormalMaterial as rD,MeshMatcapMaterial as nD,DoubleSide as iD,NormalBlending as oD,Box3 as hu,Vector3 as mo,Matrix4 as aD,MathUtils as fu}from"three";import{SkeletonUtils as H0}from"three-stdlib";function j0(e){let t=new Map;return e.map((r,n)=>{let o=r.name.trim()||`Animation ${n+1}`,a=t.get(o)??0;return t.set(o,a+1),{clip:r,sourceName:a===0?o:`${o} (${a+1})`,duration:r.duration}})}import{AnimationMixer as qk,LoopOnce as Xk,LoopPingPong as z0,LoopRepeat as $k}from"three";function V0(e){let t=e._loopCount;return e.loop===z0&&(t&1)===1}function Yk(e){return V0(e)?e.getClip().duration-e.time:e.time}function F0({root:e,clips:t,getClipConfig:r,onChange:n}){let i=new qk(e),o=new Map;for(let{clip:C,sourceName:P}of t)o.set(P,i.clipAction(C));let a=new Map,s=new Set,l=new Map,d=1,u=C=>typeof C=="string",p=C=>u(C)?a.has(C)?[C]:[]:[...a.keys()],c=(C,P)=>{let E=my(r(P));E==="once"?C.setLoop(Xk,1):E==="ping-pong"?C.setLoop(z0,1/0):C.setLoop($k,1/0),C.clampWhenFinished=E==="once"},h=C=>{C.action.setEffectiveTimeScale(C.reverse?-C.speed:C.speed)},m=C=>{let P=a.get(C);P&&(P.action.stop(),a.delete(C))},b=(C,P={})=>{let E=o.get(C);if(!E||r(C)?.hidden)return;let T=Number.isFinite(P.fade)&&P.fade>0?P.fade:0,O=P.reverse??!1;if(!P.alongside)for(let[D,k]of[...a])D!==C&&(T>0?(a.delete(D),k.action.fadeOut(T),s.add(k.action)):m(D));s.delete(E)&&E.stop();let j=E.getClip().duration,I=a.get(C),N=()=>{E.reset(),O&&(E.time=j),E.play()};if(!I)N(),T>0&&E.fadeIn(T);else{let D=O?E.time<=0:E.time>=j;I.finished&&D&&N(),E.paused=!1,E.enabled=!0,a.delete(C)}c(E,C),I={action:E,speed:r(C)?.speed??l.get(C)??d,reverse:O,finished:!1},I.speed=bc(I.speed),h(I),a.set(C,I),n()},y=C=>{for(let P of p(C))a.get(P).action.paused=!0;n()},S=C=>{for(let P of p(C))m(P);if(!u(C)){for(let P of s)P.stop();s.clear()}n()},f=(C,P)=>{let E=bc(C);u(P)?l.set(P,E):d=E;for(let T of p(P)){let O=a.get(T);l.set(T,E),O.speed=E,h(O)}n()},g=(C,P)=>{for(let E of p(P)){let T=a.get(E),O=T.action.getClip().duration,j=Math.min(Math.max(C,0),O);T.action.time=V0(T.action)?O-j:j,T.finished&&(T.finished=!1,T.action.paused=!0)}i.update(0),n()},x=()=>{for(let[C,P]of[...a]){let E=r(C);if(E?.hidden){m(C);continue}c(P.action,C),E?.speed!==void 0&&(P.speed=bc(E.speed),h(P))}n()},_=C=>{for(let P of a.values())P.action===C.action&&(P.finished=!0);n()};return i.addEventListener("finished",_),{play:b,pause:y,stop:S,setSpeed:f,seek:g,getState:()=>{let C=[...a].map(([E,T])=>({clip:E,status:T.finished?"finished":T.action.paused?"paused":"playing",time:Yk(T.action),duration:T.action.getClip().duration,speed:T.speed,reverse:T.reverse})),P=C[C.length-1];return{currentClip:P?.clip??null,isPlaying:C.some(E=>E.status==="playing"),speed:P?.speed??d,time:P?.time??0,duration:P?.duration??0,active:C}},applyClipConfigs:x,isRunning:()=>{if(s.size>0)return!0;for(let{action:C}of a.values())if(!C.paused&&C.enabled)return!0;return!1},update:C=>{i.update(C);for(let P of s)(!P.enabled||P.getEffectiveWeight()<=0)&&(P.stop(),s.delete(P))},dispose:()=>{i.removeEventListener("finished",_),i.stopAllAction(),i.uncacheRoot(e),a.clear(),s.clear()}}}import{Color as uu,FrontSide as Kk,NormalBlending as U0}from"three";function G0(e,t,r,n){let i=Xr(t),o=rc(r,i),a=sy(n,t),s=ly(n,t),l=cy(n,t);return a||s||l?nc(e.userData,t,o,r,a??[0,0],s??1,l??0):(ic(e.userData,t),o)}function Ht(e,t,r,n){if(!r){ic(e.userData,t);return}let i=gc[t];e[i]=G0(e,t,r,n)}function du(e,t,r){e.map=e.userData.baseMap??null,e.color.copy(e.userData.baseColor),e.vertexColors=e.userData.baseVertexColors??e.vertexColors,e.metalness=e.userData.baseMetalness??e.metalness,e.metalnessMap=e.userData.baseMetalnessMap??null,e.roughness=e.userData.baseRoughness??e.roughness,e.roughnessMap=e.userData.baseRoughnessMap??null,e.emissive.copy(e.userData.baseEmissive??new uu(0,0,0)),e.emissiveIntensity=e.userData.baseEmissiveIntensity??e.emissiveIntensity,e.emissiveMap=e.userData.baseEmissiveMap??null,e.opacity=e.userData.baseOpacity??1,e.transparent=e.userData.baseTransparent??!1,e.alphaMap=e.userData.baseAlphaMap??null,e.alphaTest=e.userData.baseAlphaTest??0,e.alphaHash=e.userData.baseAlphaHash??!1,e.dithering=e.userData.baseDithering??!1,e.blending=e.userData.baseBlending??U0,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??Kk,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(ps(e.userData.baseNormalScale)),e.bumpMap=e.userData.baseBumpMap??null,e.bumpScale=e.userData.baseBumpScale??e.bumpScale,e.aoMap=e.userData.baseAoMap??null,e.aoMapIntensity=e.userData.baseAoMapIntensity??e.aoMapIntensity,e.displacementMap=e.userData.baseDisplacementMap??null,e.displacementScale=e.userData.baseDisplacementScale??e.displacementScale,e.displacementBias=e.userData.baseDisplacementBias??e.displacementBias,e.clearcoat=e.userData.baseClearcoat??e.clearcoat,e.clearcoatMap=e.userData.baseClearcoatMap??null,e.clearcoatRoughness=e.userData.baseClearcoatRoughness??e.clearcoatRoughness,e.clearcoatRoughnessMap=e.userData.baseClearcoatRoughnessMap??null,e.clearcoatNormalMap=e.userData.baseClearcoatNormalMap??null,e.clearcoatNormalScale.copy(ps(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new uu(0,0,0)),e.sheenColorMap=e.userData.baseSheenColorMap??null,e.sheenRoughness=e.userData.baseSheenRoughness??e.sheenRoughness,e.sheenRoughnessMap=e.userData.baseSheenRoughnessMap??null,e.anisotropy=e.userData.baseAnisotropy??e.anisotropy,e.anisotropyRotation=e.userData.baseAnisotropyRotation??e.anisotropyRotation,e.anisotropyMap=e.userData.baseAnisotropyMap??null,e.transmission=e.userData.baseTransmission??e.transmission,e.transmissionMap=e.userData.baseTransmissionMap??null,e.thickness=e.userData.baseThickness??e.thickness,e.thicknessMap=e.userData.baseThicknessMap??null,e.attenuationColor.copy(e.userData.baseAttenuationColor??new uu("#ffffff")),e.attenuationDistance=e.userData.baseAttenuationDistance??e.attenuationDistance,e.reflectivity=e.userData.baseReflectivity??e.reflectivity,e.specularIntensity=e.userData.baseSpecularIntensity??e.specularIntensity,e.specularIntensityMap=e.userData.baseSpecularIntensityMap??null,e.specularColor.copy(e.userData.baseSpecularColor??new uu("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let n=wt(t,"texture"),i=wt(t,"metalnessMap"),o=wt(t,"roughnessMap"),a=wt(t,"emissiveMap"),s=wt(t,"alphaMap"),l=wt(t,"normalMap"),d=wt(t,"bumpMap"),u=wt(t,"aoMap"),p=wt(t,"displacementMap"),c=wt(t,"clearcoatMap"),h=wt(t,"clearcoatRoughnessMap"),m=wt(t,"clearcoatNormalMap"),b=wt(t,"anisotropyMap"),y=wt(t,"transmissionMap"),S=wt(t,"thicknessMap"),f=wt(t,"sheenColorMap"),g=wt(t,"sheenRoughnessMap"),x=wt(t,"specularIntensityMap"),_=wt(t,"specularColorMap");if(n?(e.map=G0(e,"texture",n,t),e.color.set(r??"#ffffff"),e.vertexColors=!1):(ic(e.userData,"texture"),r&&(e.map=null,e.color.set(r),e.vertexColors=!1)),Ht(e,"metalnessMap",i,t),t?.metalness!==void 0&&(e.metalness=t.metalness),Ht(e,"roughnessMap",o,t),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):a&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),Ht(e,"emissiveMap",a,t),t?.opacity!==void 0&&(e.opacity=t.opacity),Ht(e,"alphaMap",s,t),t?.alphaTest!==void 0&&(e.alphaTest=t.alphaTest),t?.alphaHash!==void 0&&(e.alphaHash=t.alphaHash),t?.dithering!==void 0&&(e.dithering=t.dithering),t?.blendingMode&&(e.blending=dy(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=uy(t.side)),Ht(e,"normalMap",l,t),l||t?.normalScale!==void 0){let v=t?.normalScale??Math.abs(ps(e.userData.baseNormalScale).x);e.normalScale.set(v,t?.flipNormalY?-v:v)}if(Ht(e,"bumpMap",d,t),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),Ht(e,"aoMap",u,t),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),Ht(e,"displacementMap",p,t),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),Ht(e,"clearcoatMap",c,t),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),Ht(e,"clearcoatRoughnessMap",h,t),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),Ht(e,"clearcoatNormalMap",m,t),m||t?.clearcoatNormalScale!==void 0){let v=t?.clearcoatNormalScale??Math.abs(ps(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(v,t?.flipClearcoatNormalY?-v:v)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),Ht(e,"sheenColorMap",f,t),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),Ht(e,"sheenRoughnessMap",g,t),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),Ht(e,"anisotropyMap",b,t),t?.transmission!==void 0&&(e.transmission=t.transmission),Ht(e,"transmissionMap",y,t),t?.thickness!==void 0&&(e.thickness=t.thickness),Ht(e,"thicknessMap",S,t),t?.attenuationColor&&e.attenuationColor.set(t.attenuationColor),t?.attenuationDistance!==void 0&&(e.attenuationDistance=t.attenuationDistance),t?.reflectivity!==void 0&&(e.reflectivity=t.reflectivity),t?.specularIntensity!==void 0&&(e.specularIntensity=t.specularIntensity),Ht(e,"specularIntensityMap",x,t),t?.specularColor&&e.specularColor.set(t.specularColor),Ht(e,"specularColorMap",_,t),e.transparent=e.opacity<1||e.transmission>0||e.blending!==U0||!!((s||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function Ls(e){return e.material}function gn(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function hr(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function pu(e,t){return Array.isArray(e)?e[t]:e}import{jsx as bu,jsxs as cD}from"react/jsx-runtime";function gu(e,t,r){let n=r.get(e);n&&(t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],n.rotation.order):e.rotation.copy(n.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(n.scale),e.position.fromArray(Os(t?.position??n.position.toArray(),[e.rotation.x,e.rotation.y,e.rotation.z],e.scale.toArray(),t?.pivot,n.rotation.order,t?.shear)),mn(e,t?.shear))}function It(e,t=!1){if(!e||typeof e!="object")return"-";let r=e;return[r.channel??0,t?r.format??"":"",r.isVideoTexture?r.colorSpace??"":""].join(":")}function ua(e){let t=e,r=Number(t.clearcoat)>0,n=Number(t.sheen)>0,i=Number(t.anisotropy)>0,o=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===oD&&t.alphaToCoverage!==!0;return[It(t.map),It(t.aoMap),It(t.lightMap),It(t.bumpMap),It(t.normalMap,!0),t.normalMap?t.normalMapType:"",It(t.displacementMap),It(t.emissiveMap),It(t.metalnessMap),It(t.roughnessMap),i,It(i?t.anisotropyMap:null),r,It(r?t.clearcoatMap:null),It(r?t.clearcoatNormalMap:null,!0),It(r?t.clearcoatRoughnessMap:null),n,It(n?t.sheenColorMap:null),It(n?t.sheenRoughnessMap:null),It(t.specularColorMap),It(t.specularIntensityMap),o,It(o?t.transmissionMap:null),It(o?t.thicknessMap:null),It(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,!!t.vertexColors,t.side,a].join("|")}var sD={};function Is({url:e,objectBindings:t,selectedItem:r,itemMaterials:n,interactive:i=!0,onItemClick:o,onItemHover:a,onItemDoubleClick:s,onItemContextMenu:l,onModelLoaded:d,onAnimationsReady:u,nodeRefsOut:p,onNodeRefsChange:c,materialRefsOut:h,panelHoveredItem:m,sceneConfig:b,zoomOnSelected:y=!0,highlightOnHover:S=!0,decoderConfig:f,modelFormat:g,onLoadProgress:x,explodeFactor:_=0,suspendBindingTransforms:v=!1,originalNodePoses:R,mergeModels:A,onMergeModelLoaded:w,onMergeModelError:C,pulses:P=sD}){let E=ms(e,f,g,x),T=Zk(B=>B.invalidate),[O,j]=Jm(null),I=Vt(null),{setCanvasCursor:N,restoreCanvasCursor:D}=Cy();rt(()=>{(!i||!S)&&(j(null),a?.(null),D())},[i,S,a,D]);let k=Tt(()=>{let B=H0.clone(E.scene),z=us(E.scene);return z&&Hv(B,z),Pm(B),B},[E.scene]),{rootsByUrl:U,revision:te,onSourceReady:re}=L0(k,A,w),Z=Vt(new Map),[ne,X]=Jm(0),G=Qk((B,z,V)=>{re(B,z),Z.current.get(B)!==V&&(Z.current.set(B,V),X(W=>W+1))},[re]);rt(()=>{let B=new Set(A?.map(V=>V.url)),z=!1;for(let V of Z.current.keys())B.has(V)||(Z.current.delete(V),z=!0);z&&X(V=>V+1)},[A]);let H=Tt(()=>ci(k),[k,te]),ae=H.nodesById,{originalMaterials:xe,ownMeshes:Ie}=Tt(()=>{let B=new WeakMap,z=new WeakSet;return k.traverse(V=>{Gt(V)&&(B.set(V,V.material),z.add(V))}),{originalMaterials:B,ownMeshes:z}},[k]);Tt(()=>{k.traverse(B=>{Gt(B)&&!xe.has(B)&&xe.set(B,B.material)})},[k,te,xe]);let q=E.materialVariants,Pe=(b?kn(b.model):[]).join(`
62
+ `),[pe,ft]=Jm(null);rt(()=>{let B=Pe?Pe.split(`
63
+ `):[],z=[];for(let W of B){let le=q?q.names.indexOf(W):-1;if(le>=0){z.push(le);continue}console.warn(`[react-immersive] The model has no material variant "${W}".`+(q?` Its variants are: ${q.names.join(", ")}.`:" It has no material variants."))}if(!q||z.length===0){ft(null);return}let V=!1,$=[];return k.traverse(W=>{if(!Gt(W)||!Ie.has(W))return;let le=Sv(Mv(W),z);le!==null&&$.push(q.resolveMaterial(le,W).then(he=>[W,he]))}),Promise.all($).then(W=>{V||ft({scene:k,key:Pe,materials:new Map(W)})}).catch(W=>{V||console.warn(`[react-immersive] Material variants "${B.join('", "')}" failed to load.`,W)}),()=>{V=!0}},[k,Ie,q,Pe]);let J=pe?.scene===k?pe.materials:void 0,$e=B=>J?.get(B)??xe.get(B)??Ls(B);rt(()=>{H.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(H.duplicateNames))},[H]);let se=Tt(()=>new WeakMap,[k]),De=Tt(()=>{let B=new WeakMap;if(k.traverse(z=>{let V=se.get(z);V||(V={position:z.position.clone(),rotation:z.rotation.clone(),scale:z.scale.clone()},se.set(z,V)),B.set(z,{position:V.position.clone(),rotation:V.rotation.clone(),scale:V.scale.clone()})}),R)for(let[z,V]of Object.entries(R)){let $=ae[z],W=$&&B.get($);W&&(W.position.fromArray(V.position),V.rotation&&W.rotation.set(V.rotation[0],V.rotation[1],V.rotation[2],W.rotation.order),V.scale&&W.scale.fromArray(V.scale))}return B},[k,ae,R,se]);rt(()=>{let B=!1,z=null,V=null,$=window,W=Object.entries(ae).filter(([,pt])=>Gt(pt)),le=new hu,he=[],gt=0;k.traverse(pt=>{!Gt(pt)||pt.userData[no]||(pt.castShadow=!1,pt.receiveShadow=!0)});let Je=()=>{if(B)return;let pt=new Set,Yt=le.getSize(new mo),_e=new mo;for(let{name:kt,box:Ft}of he)Ft.getSize(_e),_e.x>Yt.x*.7&&_e.z>Yt.z*.7&&_e.y>Yt.y*.4&&pt.add(kt);k.traverse(kt=>{if(!Gt(kt)||kt.userData[no])return;let Ft=ui(kt);kt.castShadow=!Ft||!pt.has(Ft),kt.receiveShadow=!0}),T()},st=()=>{B||($.requestIdleCallback?z=$.requestIdleCallback(Ze,{timeout:100}):V=window.setTimeout(()=>Ze(),0))},Ze=pt=>{if(z=null,V=null,B)return;let Yt=performance.now(),_e=0;for(;gt<W.length&&!(_e>0&&!(pt?pt.didTimeout?_e<16:pt.timeRemaining()>1:performance.now()-Yt<8));){let[kt,Ft]=W[gt];gt+=1,_e+=1;let Tr=new hu().setFromObject(Ft);Tr.isEmpty()||(he.push({name:kt,box:Tr}),le.union(Tr))}gt<W.length?st():Je()};return st(),()=>{B=!0,z!==null&&$.cancelIdleCallback?.(z),V!==null&&window.clearTimeout(V)}},[T,ae,k]),rt(()=>{wc(k,{precise:!0})},[k,te]),rt(()=>{let B=new AbortController;return fc(k,B.signal),()=>{B.abort(),ds(k)}},[k,te]);let He=Tt(()=>{let B={};for(let[z,V]of Object.entries(t))B[V.modelObjectId??z]=z;return B},[t]),ie=Tt(()=>Object.entries(t).map(([B,z])=>`${B}${z.modelObjectId??B}`).sort().join(""),[t]),Ue=Tt(()=>Object.entries(t).map(([B,z])=>JSON.stringify([B,z.modelObjectId??B,z.transform??null])).sort().join(""),[t]),oe=Vt(new Map);rt(()=>{let B=new Map,z=new Map;for(let[W,le]of Object.entries(t)){if(!le.transform)continue;let he=ae[le.modelObjectId??W];he&&(B.set(he,le.transform),z.set(he,un(he)))}let V=new Set([...oe.current.keys(),...B.keys()]);for(let W of V){gu(W,void 0,De);for(let le of un(W))qr(le)}k.updateMatrixWorld(!0);let $=new Map;for(let W of z.values())for(let le of W)if(!$.has(le)){let he=[];for(let gt=le;gt;gt=gt.parent)he.unshift(gt.matrix.clone());$.set(le,{world:le.matrixWorld.clone(),transforms:he})}for(let[W,le]of B)gu(W,le,De);oe.current=B,k.updateMatrixWorld(!0);for(let[W,le]of $)di(W,le.world,le.transforms);T()},[k,ae,De,Ue,T]),rt(()=>()=>{for(let B of un(k))qr(B)},[k]);let K=Tt(()=>{let B={};for(let[z,V]of Object.entries(t)){let $=V.modelObjectId??z,W=ae[$];if(!Gt(W))continue;let le=$e(W);le&&(B[z]=gn(le,he=>{let gt=vc(he),Je=yc(gt??new tD);return xc(Je),Je}))}return B},[ae,ie,xe,J]);rt(()=>(h&&(h.current=K),()=>{h?.current===K&&(h.current={})}),[K,h]),rt(()=>()=>{for(let B of Object.values(K))hr(B,z=>{sv(z.userData),z.dispose()})},[K]);let Ae=b?.model.shading??"lit",we=b?.model.renderer??"pbr",qe=b?.wireframe.enabled??!1,Ye=b?.wireframe.color??"#93c5fd",ot=b?.wireframe.opacity??1,ee=Tt(()=>{let B={};if(Ae!=="unlit")return B;for(let[z,V]of Object.entries(K))B[z]=gn(V,$=>{let W=new Zm;return W.color.copy($.color),W.map=$.map,W.alphaMap=$.alphaMap,W.alphaTest=$.alphaTest,W.transparent=$.transparent,W.opacity=$.opacity,W.side=$.side,W});return B},[K,Ae]),Me=Tt(()=>{let B={};if(Ae!=="normals")return B;for(let[z,V]of Object.entries(K))B[z]=gn(V,()=>new rD);return B},[K,Ae]),Se=Tt(()=>{let B={};if(Ae!=="lit"||we!=="matcap")return B;let z=oc();for(let[V,$]of Object.entries(K))B[V]=gn($,W=>{let le=new nD;return le.matcap=z,le.color.copy(W.color),le.alphaMap=W.alphaMap,le.alphaTest=W.alphaTest,le.side=W.side,le});return B},[K,Ae,we]);rt(()=>()=>{for(let B of Object.values(ee))hr(B,z=>z.dispose());for(let B of Object.values(Me))hr(B,z=>z.dispose());for(let B of Object.values(Se))hr(B,z=>z.dispose())},[ee,Me,Se]);let je=B=>Ae==="normals"?Me[B]:Ae==="unlit"?ee[B]:we==="matcap"?Se[B]:K[B],at=Vt(d);at.current=d,rt(()=>{at.current?.(k)},[k]);let Le=Tt(()=>{let B={};for(let[z,V]of Object.entries(t)){let $=V.modelObjectId??z,W=ae[$];W&&(B[z]=W)}return B},[ae,ie]);rt(()=>(p.current=Le,c?.(),()=>{p.current===Le&&(p.current={})}),[Le,p,c]);let Te=Vt({});rt(()=>()=>{for(let B of Object.values(Te.current))for(let[z,V]of Object.entries(B))V&&Rn(V,Xr(z));Te.current={}},[]);let me=Vt(new Map);rt(()=>()=>{me.current.clear()},[]);let We=Tt(()=>{let B=new Map;for(let[z,V]of Object.entries(t)){let $=m===V||m?.id===V.id||m?.modelObjectId===V.modelObjectId,W=S&&(O===z||$),le=W||r===z;(W||le)&&B.set(z,{emissive:W,matcap:le})}return B},[t,S,O,r,m]),_t=Vt(We);_t.current=We,rt(()=>{let B=new Set;for(let[z,V]of Object.entries(t)){B.add(z);let $=V.modelObjectId??z,W=ae[$];if(!Gt(W))continue;if(V.removed){W.parent&&(me.current.set(W,W.parent),W.parent.remove(W),k.dispatchEvent({type:"childremoved",child:W}));continue}let le=me.current.get(W);le&&(W.parent||(le.add(W),k.dispatchEvent({type:"childadded",child:W})),me.current.delete(W)),W.visible=V.visible!==!1;let he=K[z];if(!he)continue;if(we!=="uv-checker"){let _e=je(z);_e&&(W.material=_e)}if(V.visible===!1)continue;let gt=ee[z],Je=Se[z],st=n[z]??n[V.modelObjectId??z],Ze=V.style?.material,pt=Te.current[z]??{};for(let _e of mi){let kt=wt(Ze,_e),Ft=pt[_e];if(Ft===kt)continue;let Tr=Xr(_e);Ft&&Rn(Ft,Tr),kt?(qo(kt,Tr,T),pt[_e]=kt):delete pt[_e]}Object.keys(pt).length>0?Te.current[z]=pt:delete Te.current[z];let Yt=st?.hex??Ze?.baseColor;hr(he,(_e,kt)=>{let Ft=ua(_e);du(_e,Ze,Yt);let Tr=_e.userData.reactImmersiveConfiguredEmissive;Tr?.isColor?Tr.copy(_e.emissive):_e.userData.reactImmersiveConfiguredEmissive=_e.emissive.clone();let Oa=_t.current.get(z);Oa?.emissive&&_e.emissive.add(eo),Ft!==ua(_e)&&(_e.needsUpdate=!0);let or=pu(gt,kt);if(or){let La=ua(or);or.color.copy(_e.color),or.map=_e.map,or.vertexColors=_e.vertexColors,or.alphaMap=_e.alphaMap,or.alphaTest=_e.alphaTest,or.transparent=_e.transparent,or.opacity=_e.opacity,or.side=_e.side,La!==ua(or)&&(or.needsUpdate=!0)}let Kt=pu(Je,kt);if(Kt){let La=ua(Kt);Oa?.matcap?Kt.color.set(Wo.color):Kt.color.copy(_e.color),Kt.map=_e.map,Kt.vertexColors=_e.vertexColors,Kt.alphaMap=_e.alphaMap,Kt.alphaTest=_e.alphaTest,Kt.transparent=_e.transparent,Kt.opacity=_e.opacity,Kt.side=_e.side,La!==ua(Kt)&&(Kt.needsUpdate=!0)}})}for(let z of Object.keys(Te.current))if(!B.has(z)){for(let[V,$]of Object.entries(Te.current[z]))$&&Rn($,Xr(V));delete Te.current[z]}T()},[t,ae,K,ee,Me,Se,n,Ae,we,T]);let nr=Vt(new Map);rt(()=>{let B=nr.current,z=new Set([...B.keys(),...We.keys()]),V=!1;for(let $ of z){let W=B.get($),le=We.get($),he=!!W?.emissive!=!!le?.emissive,gt=!!W?.matcap!=!!le?.matcap;if(!he&&!gt)continue;V=!0;let Je=K[$],st=Se[$];Je&&hr(Je,(Ze,pt)=>{let Yt=Ze.userData.reactImmersiveConfiguredEmissive;he&&Yt?.isColor&&(Ze.emissive.copy(Yt),le?.emissive&&Ze.emissive.add(eo));let _e=pu(st,pt);gt&&_e&&(le?.matcap?_e.color.set(Wo.color):_e.color.copy(Ze.color))})}nr.current=We,V&&T()},[We,K,Se,T]),_w({objectBindings:t,nodeMap:ae,invalidate:T});let ir=Tt(()=>Object.entries(P).map(([B,z])=>({key:B,color:new eD(z.color),speed:z.speed})),[P]),Zr=Vt(new Set);rt(()=>{let B=new Set(ir.map(({key:z})=>z));for(let z of Zr.current){if(B.has(z)||!K[z])continue;let V=_t.current.get(z)?.emissive;hr(K[z],$=>{let W=$.userData.reactImmersiveConfiguredEmissive;W?.isColor&&($.emissive.copy(W),V&&$.emissive.add(eo))})}Zr.current=B,T()},[ir,K,T]),mu(({clock:B})=>{if(ir.length===0)return;let z=B.getElapsedTime();for(let{key:V,color:$,speed:W}of ir){let le=K[V];if(!le)continue;let he=(1-Math.cos(2*Math.PI*W*z))/2,gt=_t.current.get(V)?.emissive;hr(le,Je=>{let st=Je.userData.reactImmersiveConfiguredEmissive;st?.isColor&&(Je.emissive.copy(st).lerp($,he),gt&&Je.emissive.add(eo))})}T()}),rt(()=>{if(we==="uv-checker")return;let B=new Set(Object.values(Le)),z=!1;k.traverse(V=>{if(!Gt(V)||B.has(V)||!xe.has(V))return;let $=J?.get(V)??xe.get(V);V.material!==$&&(V.material=$,z=!0)}),z&&T()},[k,Le,xe,J,we,T]),rt(()=>{if(we!=="uv-checker")return;let B=lv(),z=[];return k.traverse(V=>{if(!Gt(V)||V.userData[no])return;let $=V.material,W=Array.isArray($)?$:[$],le=!!V.geometry.getAttribute("uv"),he=W.map((Je,st)=>{let Ze=new Zm({color:le?"#ffffff":"#ff00ff",map:le?B:null,side:Je.side});return Ze.name=`${V.name||"mesh"}-uv-checker-${st}`,Ze.toneMapped=!1,Ze}),gt=Array.isArray($)?he:he[0];V.material=gt,z.push({node:V,original:$,diagnostic:gt})}),T(),()=>{for(let{node:V,original:$,diagnostic:W}of z){V.material=$;let le=Array.isArray(W)?W:[W];for(let he of le)he.dispose()}T()}},[k,we,T,te]),rt(()=>{if(!qe)return;let B=[];for(let[z,V]of Object.entries(t)){let $=V.modelObjectId??z,W=ae[$];if(!Gt(W))continue;let le=new Zm({color:Ye,wireframe:!0,transparent:!0,opacity:ot,depthTest:!1,depthWrite:!1,side:iD,toneMapped:!1}),he=W.clone(!1);he.name="",he.position.set(0,0,0),he.quaternion.identity(),he.scale.set(1,1,1),he.matrix.identity(),he.matrixAutoUpdate=!0,he.material=le,he.castShadow=!1,he.receiveShadow=!1,he.frustumCulled=!1,he.renderOrder=1,he.userData={isWireframeOverlay:!0},he.raycast=()=>{},W.morphTargetInfluences&&(he.morphTargetInfluences=W.morphTargetInfluences),W.add(he),B.push({node:W,overlay:he})}return T(),()=>{for(let{node:z,overlay:V}of B)z.remove(V),V.material.dispose()}},[qe,Ye,ot,ae,t,T]);let Pr=Tt(()=>{let B=Array.from(Z.current.values()).flat();return j0([...E.animations,...B])},[E.animations,ne]);rt(()=>{k.animations=Pr.map(({clip:B})=>B)},[k,Pr]);let en=Vt(u);en.current=u;let $t=Vt(b);$t.current=b;let Nr=Vt(null),tn=Vt(null),St=Vt(new Set),Rt=Vt(0),Cn=B=>{St.current.forEach(z=>z(B))};rt(()=>{let B=F0({root:k,clips:Pr,getClipConfig:V=>py($t.current,V),onChange:()=>{Cn(B.getState()),wc(k),T()}});Nr.current=B,tn.current={clips:Pr.map(({sourceName:V})=>V),clipDetails:Pr.map(({sourceName:V,duration:$})=>({sourceName:V,duration:$})),play:B.play,pause:B.pause,stop:B.stop,setSpeed:B.setSpeed,seek:B.seek,getState:B.getState,subscribe:V=>(St.current.add(V),V(B.getState()),()=>{St.current.delete(V)})},Cn(B.getState());let z=$t.current?.animations.autoplayClip;return z&&B.play(z),()=>{B.dispose(),Nr.current=null,tn.current=null,Cn(B.getState())}},[k,Pr]);let yl=!!u;rt(()=>{yl&&tn.current&&en.current?.(tn.current)},[k,Pr,yl,i]),rt(()=>{b?.animations&&Nr.current?.applyClipConfigs()},[b?.animations]),mu((B,z)=>{let V=Nr.current;if(V?.isRunning()){if(V.update(z),!v)for(let[$,W]of oe.current)gu($,W,De);Rt.current+=z,wc(k,{updateFallbacks:Rt.current>=.066}),T(),Rt.current>=.066&&(Rt.current=0,Cn(V.getState()))}});let Pn=Tt(()=>(b?.model.rotation??[0,0,0]).map(B=>B*Math.PI/180),[b?.model.rotation]);mu((B,z)=>{if(!I.current)return;let V=I.current.rotation;V.x=fu.lerp(V.x,Pn[0],1-Math.exp(-5*z)),V.y=fu.lerp(V.y,Pn[1],1-Math.exp(-5*z)),V.z=fu.lerp(V.z,Pn[2],1-Math.exp(-5*z)),Math.abs(V.x-Pn[0])<1e-4&&Math.abs(V.y-Pn[1])<1e-4&&Math.abs(V.z-Pn[2])<1e-4||T()});let Ii=Vt([]),Bi=Vt(0),Jn=Vt(0),To=Tt(()=>new mo,[]);rt(()=>{let B=new Map;for(let[Je,st]of Object.entries(t)){let Ze=ae[st.modelObjectId??Je];Ze&&B.set(Ze,st)}for(let Je of Ii.current)gu(Je.node,B.get(Je.node)?.transform,De);Jn.current=0,k.updateWorldMatrix(!0,!0);let z=new hu().setFromObject(k),V=z.getCenter(new mo),$=z.getSize(new mo).length()*.5;Bi.current=Number.isFinite($)?$:0;let W=[...B.keys()],le=new Set(W),he=[],gt=new mo;for(let Je of W){if(!Je.parent)continue;let st=Je.parent,Ze=!1;for(;st;){if(le.has(st)){Ze=!0;break}st=st.parent}if(Ze)continue;let pt=new hu().setFromObject(Je);if(pt.isEmpty())continue;pt.getCenter(gt);let Yt=gt.clone().sub(V);Yt.lengthSq()<1e-8||(Yt.normalize(),he.push({node:Je,restLocalPos:Je.position.clone(),restWorldPos:Je.getWorldPosition(new mo),worldDir:Yt,parentInverse:new aD().copy(Je.parent.matrixWorld).invert()}))}Ii.current=he,T()},[k,ae,ie,Ue,De,T]),rt(()=>{T()},[_,T]),mu((B,z)=>{let V=Ii.current;if(V.length===0)return;let $=Math.min(Math.max(_,0),1),W=Jn.current;if(Math.abs(W-$)<1e-4){if(W===$)return;Jn.current=$}else Jn.current=fu.lerp(W,$,1-Math.exp(-6*z)),T();let le=Jn.current*Bi.current;for(let he of V)To.copy(he.worldDir).multiplyScalar(le).add(he.restWorldPos).applyMatrix4(he.parentInverse),he.node.position.copy(To),he.node.matrixAutoUpdate||(he.node.matrix.setPosition(he.node.position),he.node.matrixWorldNeedsUpdate=!0)});let jr=B=>{let z=B;for(;z;){let V=ui(z),$=V?He[V]:void 0;if($&&t[$])return[$,t[$]];z=z.parent}return null},Zn=B=>{let z=jr(B);if(!z)return null;let[V,$]=z;return ae[$.modelObjectId??V]??null},Da=kc(B=>{let z=jr(B);return z&&z[1].selectable!==!1?z[1]:null},i?l:void 0,Zn),Ni=B=>{if(Da.consumeClick())return;let z=jr(B.object);if(!z)return;let[,V]=z;V.selectable!==!1&&(B.stopPropagation(),o(V,ea(B,Zn(B.object))))},xl=B=>{let z=jr(B.object);if(!z)return;let[,V]=z;if(V.selectable===!1)return;s?.(V,ea(B,Zn(B.object)))&&B.stopPropagation()},Md=B=>{if(!S)return;let z=jr(B.object);if(!z)return;let[V,$]=z;$.hoverable!==!1&&(B.stopPropagation(),N("pointer"),j(V),a?.($))},ji=B=>{S&&(B.stopPropagation(),D(),j(null),a?.(null))},_o=Tt(()=>!$v(k),[k,te]);return rt(()=>{let B=Pe&&(pe?.scene!==k||pe.key!==Pe),z=A?.some(V=>!U[V.url]||U[V.url].parent!==k);return Fp(k,B?"Wait for the selected material variants to finish loading before preparing AR.":z?"Wait for all merged models to finish loading before preparing AR.":we!=="pbr"?"Switch the model renderer to PBR before preparing a USDZ snapshot, or provide arHandoff.createUSDZ.":void 0),()=>Fp(k)},[k,pe,Pe,A,U,te,we]),cD("group",{ref:I,children:[bu("primitive",{object:k,...i&&_o?{onClick:Ni,onDoubleClick:xl,...l?{onPointerDown:Da.onPointerDown}:{},...S?{onPointerOver:Md,onPointerOut:ji}:{}}:{}}),A?.map(B=>bu(hn,{onLoadError:z=>C?.(B.url,z),children:bu(Jk,{fallback:null,children:bu(lD,{url:B.url,namePrefix:B.namePrefix,decoderConfig:f,onReady:G})})},B.url))]})}function lD({url:e,namePrefix:t,decoderConfig:r,onReady:n}){let i=ms(e,r),o=Tt(()=>{let l=H0.clone(i.scene);return Wb(l,t),Pm(l),l},[i.scene,t]),a=Tt(()=>i.animations.map(l=>qb(l,t)),[i.animations,t]),s=Vt(n);return s.current=n,rt(()=>{s.current(e,o,a)},[e,o,a]),null}import{Suspense as uD,useEffect as dD,useRef as pD}from"react";import{jsx as vu}from"react/jsx-runtime";function mD({url:e,decoderConfig:t,onModelLoaded:r}){let{scene:n}=ms(e,t),i=pD(r);return i.current=r,dD(()=>{i.current?.(n)},[n]),vu("primitive",{object:n})}function W0({url:e,decoderConfig:t,onLoadError:r,onModelLoaded:n}){return vu(hn,{onLoadError:i=>r?.(e,i),children:vu(uD,{fallback:null,children:vu(mD,{url:e,decoderConfig:t,onModelLoaded:n})})})}import{Suspense as hD,useCallback as q0,useMemo as fD,useRef as X0}from"react";import{jsx as yu}from"react/jsx-runtime";var gD={};function $0({entry:e,isActive:t,decoderConfig:r,itemMaterials:n,sceneConfig:i,zoomOnSelected:o,highlightOnHover:a,explodeFactor:s,suspendBindingTransforms:l,onLoadProgress:d,onAnimationsReady:u,onModelAnimationsReady:p,onLoadError:c,onModelLoaded:h,selectedItem:m,panelHoveredItem:b,onItemClick:y,onItemDoubleClick:S,onItemContextMenu:f,onItemHover:g,nodeRefsOut:x,onNodeRefsChange:_,materialRefsOut:v,onMergeModelLoaded:R,onMergeModelError:A,pulses:w}){let C=X0({}),P=X0({}),E=q0(()=>{},[]),T=fD(()=>t?null:cs(e.objectBindings,e.sceneConfig?.product,kn((e.sceneConfig??i)?.model??{})),[t,e.objectBindings,e.sceneConfig,i]),O=e.sceneConfig?.product&&T?{...e.sceneConfig,model:{...e.sceneConfig.model,activeVariants:T.activeVariants}}:e.sceneConfig??i,j=q0(N=>{t&&u?.(N),p?.(Be(e),N)},[t,u,p,e.url,e.id]),I=!!u||!!p;return yu(hn,{onLoadError:N=>c?.(Be(e),N),children:yu(hD,{fallback:null,children:yu("group",{position:e.transform?.position,rotation:e.transform?.rotation,scale:e.transform?.scale,visible:e.visible!==!1,children:yu(Is,{url:e.url,interactive:t&&e.visible!==!1,objectBindings:t?e.objectBindings:T?.objectBindings??e.objectBindings,selectedItem:t?m:null,itemMaterials:t?n:gD,onItemClick:t?y:E,onItemDoubleClick:t?S:void 0,onItemContextMenu:t?f:void 0,onItemHover:t?g:void 0,onModelLoaded:h?N=>h(Be(e),N):void 0,onAnimationsReady:I?j:void 0,nodeRefsOut:t?x:C,onNodeRefsChange:t?_:void 0,materialRefsOut:v??P,panelHoveredItem:t?b:void 0,sceneConfig:t?i:O,zoomOnSelected:t&&o,highlightOnHover:t&&!!a,decoderConfig:r,onLoadProgress:t?d:void 0,explodeFactor:s,suspendBindingTransforms:t?l:!1,originalNodePoses:e.originalNodePoses,mergeModels:e.mergeModels,onMergeModelLoaded:R,onMergeModelError:A,pulses:t?w:void 0})})})},e.url)}import{useCallback as Ei,useEffect as Ai,useMemo as _L,useRef as tr,useState as Uh}from"react";import{useFrame as EL,useThree as AL}from"@react-three/fiber";import{Box3 as iM,BoxGeometry as LD,Group as rM,Matrix4 as oM,Mesh as ID,MeshBasicMaterial as BD,Vector3 as Vn}from"three";import{Euler as bD,Matrix4 as ho,MeshBasicMaterial as vD,MeshMatcapMaterial as yD,MeshNormalMaterial as xD,MeshStandardMaterial as wD,Quaternion as MD,Vector3 as Ns}from"three";function J0(e){let t={};for(let[r,n]of Object.entries(e))t[n.modelObjectId??r]=r;return t}function rh(e){let t=e,r=null;for(;t;){let n=t.userData?.ri_name;if(typeof n=="string"&&n)return n;!r&&t.name&&(r=t.name),t=t.parent}return r}function Z0(e,t){return e||(t?t.modelObjectId??t.id:null)}function wu(e,t){let r=rh(e);if(!r)return null;let n=t.keyByModelObject[r]??r,i=t.objectBindings[n];return i?{key:n,binding:i}:null}var da=new Ns,eh=new Ns,SD=new ho,Y0=new ho,Bs=new ho,CD=new ho,xu=new ho,PD=new ho,TD=new ho,K0=new Ns,Q0=new Ns,Mi=new Ns,th=new MD,_D=new bD;function ED(e,t,r,n,i){let o=!!(r?.position||r?.rotation||r?.scale||r?.shear),a=!!(i&&i.factor>0&&i.radius>0);if(!o&&!a){e.matrixAutoUpdate=!0,e.position.copy(t.position),e.rotation.copy(t.rotation),e.scale.copy(t.scale),e.updateMatrix(),e.updateWorldMatrix(!0,!1);return}Y0.compose(t.position,th.setFromEuler(t.rotation),t.scale);let s=r?.rotation;Bs.compose(K0.fromArray(Os(r?.position??[0,0,0],s??[0,0,0],r?.scale??[1,1,1],r?.pivot,"XYZ",r?.shear)),th.setFromEuler(_D.set(s?.[0]??0,s?.[1]??0,s?.[2]??0)),Q0.fromArray(r?.scale??[1,1,1])),r?.shear&&Bs.makeRotationFromQuaternion(th).multiply(ra(r.shear)).scale(Q0).setPosition(K0),Bs.premultiply(n).multiply(CD.copy(n).invert()),e.parent?.updateWorldMatrix(!0,!1);let l=e.parent?.matrixWorld??SD;if(xu.multiplyMatrices(l,Y0).premultiply(Bs),a&&i){let d=e;for(;d.parent&&!d.userData.ri_name;)d=d.parent;let u=d.userData.ri_center;Array.isArray(u)&&u.length===3?Mi.fromArray(u).applyMatrix4(n).applyMatrix4(Bs):Mi.setFromMatrixPosition(xu),Mi.sub(i.centre),Mi.lengthSq()>1e-8&&(Mi.normalize().multiplyScalar(i.factor*i.radius),xu.premultiply(TD.makeTranslation(Mi.x,Mi.y,Mi.z)))}e.matrixAutoUpdate=!1,e.matrix.multiplyMatrices(PD.copy(l).invert(),xu),e.matrixWorldNeedsUpdate=!0,e.updateWorldMatrix(!1,!1)}function Mu(e,t){if(!Gt(e)&&!e.userData.riLogicalObject)return;let r=wu(e,t);if(!r)return;let n=eM(e);if(n.rest??(n.rest={position:e.position.clone(),rotation:e.rotation.clone(),scale:e.scale.clone()}),t.suspendTransforms)return;if(t.placementFrame&&!e.userData.riLogicalObject){ED(e,n.rest,r.binding.transform,t.placementFrame,t.explode);return}let i=n.rest,o=r.binding.transform;o?.position?e.position.fromArray(o.position):e.position.copy(i.position),o?.rotation?e.rotation.set(o.rotation[0],o.rotation[1],o.rotation[2],i.rotation.order):e.rotation.copy(i.rotation),o?.scale?e.scale.fromArray(o.scale):e.scale.copy(i.scale),e.position.fromArray(Os(e.position.toArray(),[e.rotation.x,e.rotation.y,e.rotation.z],e.scale.toArray(),o?.pivot,i.rotation.order,o?.shear)),mn(e,o?.shear);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),eh.setFromMatrixPosition(e.matrixWorld);let s=e;for(;s.parent&&!s.userData.ri_name;)s=s.parent;let l=s.userData.ri_center;Array.isArray(l)&&l.length===3?da.fromArray(l).applyMatrix4(e.matrixWorld).sub(a.centre):da.copy(eh).sub(a.centre),da.lengthSq()>1e-8&&(da.normalize().multiplyScalar(a.factor*a.radius).add(eh),e.parent&&e.parent.worldToLocal(da),e.position.copy(da))}mn(e,o?.shear),e.updateWorldMatrix(!0,!1)}function pa(e,t){e.traverse(r=>Mu(r,t))}function eM(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function AD(e,t,r,n){return JSON.stringify([e?.style?.material??null,t??null,r.shadingMode,r.rendererMode,n])}function RD(e){if(e.textures){for(let t of mi){let r=e.textures[t];r&&Rn(r,Xr(t))}e.textures=void 0}}function kD(e,t,r){let n=e.textures??{};for(let i of mi){let o=wt(t,i),a=n[i];if(a===o)continue;let s=Xr(i);a&&Rn(a,s),o?(qo(o,s,r),n[i]=o):delete n[i]}e.textures=Object.keys(n).length>0?n:void 0}function DD(e,t){if(t.shadingMode==="normals")return gn(e,()=>new xD);if(t.shadingMode==="unlit")return gn(e,r=>{let n=new vD;return n.color.copy(r.color),n.map=r.map,n.vertexColors=r.vertexColors,n.alphaMap=r.alphaMap,n.alphaTest=r.alphaTest,n.transparent=r.transparent,n.opacity=r.opacity,n.side=r.side,n});if(t.rendererMode==="matcap"){let r=oc();return gn(e,n=>{let i=new yD;return i.matcap=r,i.color.copy(n.color),i.vertexColors=n.vertexColors,i.alphaMap=n.alphaMap,i.alphaTest=n.alphaTest,i.side=n.side,i})}return e}function OD(e,t){if(!Gt(e))return;let n=eM(e);n.original??(n.original=Ls(e));let i=wu(e,t);if(!i){n.original&&(e.material=n.original),e.visible=!0;return}let{key:o,binding:a}=i;e.visible=a.visible!==!1,Mu(e,t);let s=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,l=t.highlightOnHover!==!1&&o===t.hoveredKey,d=AD(a,s,t,l);if(n.signature===d&&n.display){e.material=n.display;return}let u=a.style?.material;if(kD(n,u,t.invalidate),!n.physical){let p=n.original??Ls(e);if(!p)return;n.physical=gn(p,c=>{let h=vc(c),m=yc(h??new wD);return xc(m),m})}hr(n.physical,p=>{du(p,u,s??u?.baseColor),l&&(p.emissive.add(eo),p.color.lerp(ov,av)),p.needsUpdate=!0}),n.display&&n.display!==n.physical&&hr(n.display,p=>p.dispose()),n.display=DD(n.physical,t),n.signature=d,e.material=n.display}function tM(e,t){e.traverse(r=>OD(r,t))}function nh(e){e.traverse(t=>{if(!Gt(t))return;let r=t.userData.riVisuals;r&&(r.rest&&(t.matrixAutoUpdate=!0,t.position.copy(r.rest.position),t.rotation.copy(r.rest.rotation),t.scale.copy(r.rest.scale),t.updateMatrix()),r.original&&(t.material=r.original),r.display&&r.display!==r.physical&&hr(r.display,n=>n.dispose()),r.physical&&hr(r.physical,n=>n.dispose()),RD(r),delete t.userData.riVisuals)})}var aM=new oM().makeRotationX(Math.PI/2),nM=aM.clone().invert();function ND(e){let t=new Vn(e[0],e[1],e[2]),r=new Vn(Math.abs(e[3])+Math.abs(e[6])+Math.abs(e[9]),Math.abs(e[4])+Math.abs(e[7])+Math.abs(e[10]),Math.abs(e[5])+Math.abs(e[8])+Math.abs(e[11]));return new iM(t.clone().sub(r),t.clone().add(r))}function jD(e){let t=e.getCenter(new Vn),r=e.getSize(new Vn).multiplyScalar(.5);return[t.x,t.y,t.z,r.x,0,0,0,r.y,0,0,0,r.z]}var Su=class{constructor(){this.group=new rM;this.objects=new Map;this.geometry=new LD(1,1,1);this.material=new BD;this.originalBounds=new WeakMap;this.signature="";this.lastContext=null;this.lastEffective=null;this.lastDragging=!1;this.version=0;this.tileVersions=new WeakMap;this.transforms=new Map}setCatalog(t){this.group.clear(),this.objects.clear();for(let r of t){let n=new iM(new Vn(...r.minimum),new Vn(...r.maximum)).applyMatrix4(nM),i=new rM;i.name=r.name,i.userData.ri_name=r.name,i.userData.riLogicalObject=!0,i.userData.ri_center=n.getCenter(new Vn).toArray();let o=new ID(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(n.getCenter(new Vn)),o.scale.copy(n.getSize(new Vn)),i.add(o),this.group.add(i),this.objects.set(r.name,i)}this.signature="",this.lastContext=null}nodesByBinding(t){let r={};for(let[n,i]of this.objects){let o=t.keyByModelObject[n]??n;t.objectBindings[o]&&(r[o]=i)}return r}sync(t,r,n=!1){if(!n&&!this.lastDragging&&t===this.lastContext&&this.lastEffective)return this.lastEffective;this.lastContext=t,this.lastDragging=n;let i={...t,suspendTransforms:!1},o=r?t.objectBindings[r]:void 0,a=o?this.objects.get(o.modelObjectId??r):void 0;n&&a&&o&&(i={...i,objectBindings:{...t.objectBindings,[r]:{...o,transform:{position:a.position.toArray(),rotation:[a.rotation.x,a.rotation.y,a.rotation.z],scale:a.scale.toArray()}}}});for(let l of this.objects.values())n&&l===a||Mu(l,i);this.group.updateWorldMatrix(!0,!0);let s=[...this.objects].map(([l,d])=>`${l}:${d.matrix.elements.join(",")}`).join(";");if(s!==this.signature){this.signature=s,this.version++,this.transforms.clear();for(let[l,d]of this.objects)d.matrix.equals(new oM)||this.transforms.set(l,aM.clone().multiply(d.matrix).multiply(nM))}return this.lastEffective=i,i}updateBounds(t){if(!t)return;let r=n=>{if(this.tileVersions.get(n)!==this.version){if(n.boundingVolume.box&&this.tileVersions.get(n)!==this.version){let i=this.originalBounds.get(n);i||(i={box:[...n.boundingVolume.box],error:n.geometricError},this.originalBounds.set(n,i));let o=ND(i.box),a=o.clone(),s=1;for(let d of n.extras?.featureIds??[]){let u=this.transforms.get(d);u&&(a.union(o.clone().applyMatrix4(u)),s=Math.max(s,u.getMaxScaleOnAxis()))}let l=jD(a);n.boundingVolume.box=l,n.geometricError=i.error*s,n.engineData?.boundingVolume?.setObbData(l,n.engineData.transform),this.tileVersions.set(n,this.version)}n.children?.forEach(r)}};r(t)}dispose(){this.group.clear(),this.objects.clear(),this.geometry.dispose(),this.material.dispose()}};var ih=Object.freeze({factor:1,loosened:!1,tooFine:0,raisedAt:-1/0,changedAt:-1/0}),js=16,oh=1.25,zD=1.5,VD=1.25,FD=500,UD=3e3,sM=5e3,lM=2e3,GD=.9;function cM(e){return e.full&&(e.wanting||e.usage>1)}function uM(e){return e.loosened?UD:FD}function dM(e){let t=e.factor/VD;return t<=1+1e-6?1:t}function pM(e,t){return e.factor>1&&!e.loosened&&!t.full&&!t.wanting&&t.usage<GD&&dM(e)>e.tooFine}function mM(e,t){let{now:r}=t,n=t.moved&&e.tooFine>0?{...e,tooFine:0}:e;if(cM(t)){if(r-n.changedAt<uM(n))return n;let i=Math.max(n.tooFine,n.factor);return n.factor>=js?n.loosened&&n.tooFine===i?n:{...n,loosened:!0,tooFine:i,changedAt:r}:{factor:Math.min(js,n.factor*zD),loosened:!0,tooFine:i,raisedAt:r,changedAt:r}}return n.loosened&&!t.wanting?{...n,loosened:!1,changedAt:r}:pM(n,t)&&r-n.raisedAt>=sM&&r-n.changedAt>=lM?{...n,factor:dM(n),changedAt:r}:n}function hM(e,t){let{now:r}=t;return cM(t)?e.factor>=js&&e.loosened?null:Math.max(0,uM(e)-(r-e.changedAt)):e.loosened&&!t.wanting?0:pM(e,t)?Math.max(0,sM-(r-e.raisedAt),lM-(r-e.changedAt)):null}function vM(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function ah(e){if(!e)return null;let t=e.length,r=e.indexOf("?"),n=e.indexOf("#");r!==-1&&(t=Math.min(t,r)),n!==-1&&(t=Math.min(t,n));let i=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),a=e.indexOf("://");return a!==-1&&a+2===o||i===-1||i<o?null:e.substring(i+1,t)||null}var Pu,zs=(Pu=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:r}=this,n,i=()=>{r.delete(n),e()};return n=t?t.requestAnimationFrame(i):requestAnimationFrame(i),r.set(n,e),n}static cancelAnimationFrame(e){let{pending:t,session:r}=this;t.delete(e),r?r.cancelAnimationFrame(e):cancelAnimationFrame(e)}static flushPending(){this.pending.forEach((e,t)=>{e(),this.cancelAnimationFrame(t)})}},Op(Pu,"pending",new Map),Op(Pu,"session",null),Pu),fM=2**30,Us=class{get unloadPriorityCallback(){return this._unloadPriorityCallback}set unloadPriorityCallback(e){e.length===1?(console.warn('LRUCache: "unloadPriorityCallback" function has been changed to take two arguments.'),this._unloadPriorityCallback=(t,r)=>{let n=e(t),i=e(r);return n<i?-1:+(n>i)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*fM,this.maxBytesSize=.4*fM,this.unloadPercent=.05,this.autoMarkUnused=!0,this.cachedBytes=0,this.itemSet=new Map,this.itemList=[],this.usedSet=new Set,this.callbacks=new Map,this.unloadingHandle=-1,this.bytesMap=new Map,this.loadedSet=new Set,this._unloadPriorityCallback=null;let e=this.itemSet;this.defaultPriorityCallback=t=>e.get(t)}isFull(){return this.itemSet.size>=this.maxSize||this.cachedBytes>=this.maxBytesSize}getMemoryUsage(e){return this.bytesMap.get(e)||0}setMemoryUsage(e,t){let{bytesMap:r,itemSet:n}=this;n.has(e)&&(this.cachedBytes-=r.get(e)||0,r.set(e,t),this.cachedBytes+=t)}add(e,t){let r=this.itemSet;if(r.has(e)||this.isFull())return!1;let n=this.usedSet,i=this.itemList,o=this.callbacks;return i.push(e),n.add(e),r.set(e,Date.now()),o.set(e,t),!0}has(e){return this.itemSet.has(e)}remove(e){let t=this.usedSet,r=this.itemSet,n=this.itemList,i=this.bytesMap,o=this.callbacks,a=this.loadedSet;if(r.has(e)){this.cachedBytes-=i.get(e)||0,i.delete(e),o.get(e)(e);let s=n.indexOf(e);return n.splice(s,1),t.delete(e),r.delete(e),o.delete(e),a.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:r,loadedSet:n}=this;r.has(e)&&(t===!0?n.add(e):n.delete(e))}markUsed(e){let t=this.itemSet,r=this.usedSet;t.has(e)&&!r.has(e)&&(t.set(e,Date.now()),r.add(e))}markUnused(e){this.usedSet.delete(e)}markAllUnused(){this.usedSet.clear()}isUsed(e){return this.usedSet.has(e)}unloadUnusedContent(){let{unloadPercent:e,minSize:t,maxSize:r,itemList:n,itemSet:i,usedSet:o,loadedSet:a,callbacks:s,bytesMap:l,minBytesSize:d,maxBytesSize:u}=this,p=n.length-o.size,c=n.length-a.size,h=Math.max(Math.min(n.length-t,p),0),m=this.cachedBytes-d,b=this.unloadPriorityCallback||this.defaultPriorityCallback,y=!1,S=h>0&&p>0||c&&n.length>r;if(p&&this.cachedBytes>d||c&&this.cachedBytes>u||S){n.sort((A,w)=>{let C=o.has(A);if(C===o.has(w)){let P=a.has(A);return P===a.has(w)?-b(A,w):P?1:-1}else return C?1:-1});let f=Math.max(t*e,h*e),g=Math.ceil(Math.min(f,p,h)),x=Math.max(e*m,e*d),_=Math.min(x,m),v=0,R=0;for(;this.cachedBytes-R>u||n.length-v>r;){let A=n[v],w=l.get(A)||0;if(o.has(A)&&a.has(A)||this.cachedBytes-R-w<u&&n.length-v<=r)break;R+=w,v++}for(;R<_||v<g;){let A=n[v],w=l.get(A)||0;if(o.has(A)||this.cachedBytes-R-w<d&&v>=g)break;R+=w,v++}n.splice(0,v).forEach(A=>{this.cachedBytes-=l.get(A)||0,s.get(A)(A),l.delete(A),i.delete(A),s.delete(A),a.delete(A),o.delete(A)}),y=v<h||R<m&&v<p,y&&(y=v>0)}y&&(this.unloadingHandle=zs.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){zs.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},HD=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},bn=class{get running(){return this.items.length!==0||this.currJobs!==0}constructor(){this.maxJobs=6,this.items=[],this.callbacks=new Map,this.currJobs=0,this.scheduled=!1,this.autoUpdate=!0,this.priorityCallback=null,this._schedulingCallback=e=>{zs.requestAnimationFrame(e)},this._runjobs=()=>{this.scheduled=!1,this.tryRunJobs()}}sort(){let e=this.priorityCallback,t=this.items;e!==null&&t.sort(e)}has(e){return this.callbacks.has(e)}add(e,t){let r={callback:t,reject:null,resolve:null,promise:null};return r.promise=new Promise((n,i)=>{let o=this.items,a=this.callbacks;r.resolve=n,r.reject=i,o.unshift(e),a.set(e,r),this.autoUpdate&&this.scheduleJobRun()}),r.promise}remove(e){let t=this.items,r=this.callbacks,n=t.indexOf(e);if(n!==-1){let i=r.get(e);i.promise.catch(o=>{if(o.name!=="AbortError")throw o}),i.reject(new HD),t.splice(n,1),r.delete(e)}}removeByFilter(e){let{items:t}=this;for(let r=0;r<t.length;r++){let n=t[r];e(n)&&(this.remove(n),r--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,r=this.maxJobs,n=0,i=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;r>this.currJobs&&e.length>0&&n<r;){this.currJobs++,n++;let o=e.pop(),{callback:a,resolve:s,reject:l}=t.get(o);t.delete(o);let d;try{d=a(o)}catch(u){l(u),i();continue}d instanceof Promise?d.then(s).catch(l).finally(i):(s(d),i())}}flush(e){let{items:t,callbacks:r}=this,n=t.indexOf(e);if(!r.has(e))return;let{callback:i,resolve:o,reject:a}=r.get(e);r.delete(e),t.splice(n,1);let s;try{s=i(e)}catch(l){a(l);return}return s instanceof Promise?s.then(o).catch(a):o(s),s}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},Au=class{get running(){for(let e of this.originQueues.values())if(e.running)return!0;return!1}get maxJobsPerOrigin(){return this._maxJobsPerOrigin}set maxJobsPerOrigin(e){this._maxJobsPerOrigin=e,this.originQueues.forEach(t=>t.maxJobs=e)}get maxJobs(){return this.maxJobsPerOrigin}set maxJobs(e){console.warn('DownloadPriorityQueue: "maxJobs" is no longer valid and limits jobs per server origin. Use "maxJobsPerOrigin", instead.'),this.maxJobsPerOrigin=e}get priorityCallback(){return this._priorityCallback}set priorityCallback(e){this._priorityCallback=e,this.originQueues.forEach(t=>t.priorityCallback=e)}constructor(){this.originQueues=new Map,this._itemQueues=new WeakMap,this._maxJobsPerOrigin=6,this._priorityCallback=null}add(e,t,r,n=null){this.originQueues.forEach((l,d)=>{l.running||this.originQueues.delete(d)});let i=e===null?null:vM(e),o=this.originQueues.get(i);o||(o=new bn,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(i,o));let a=this._itemQueues.get(t);if(a&&a!==o&&a.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let s=o.add(t,r);return n!==null&&(n.aborted?this.remove(t):n.addEventListener("abort",()=>this.remove(t),{once:!0})),s}remove(e){let t=this._itemQueues.get(e);t&&(t.remove(e),this._itemQueues.delete(e))}has(e){let t=this._itemQueues.get(e);return!!(t&&t.has(e))}};var bo=6378137,WD=1/298.257223563,lh=6356752314245179e-9,Cu={inView:!1,error:1/0,distanceFromCamera:1/0};function Ru(e){return e===4||e===-1}function Fn(e,t){return ku(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function ku(e){return!!e.traversal}function Gs(e){let{children:t}=e,r=t.length===0||ku(t[t.length-1]),n=!e.internal.hasUnrenderableContent||Ru(e.internal.loadingState);return r&&n}function fo(e){return e.traversal.unconditionallyRefine}function Vs(e,t){if(ku(e)&&(t.ensureChildrenArePreprocessed(e),e.traversal.lastFrameVisited!==t.frameCount&&(e.traversal.wasInFrustum=e.traversal.inFrustum,e.traversal.wasSetActive=e.traversal.active,e.traversal.wasSetVisible=e.traversal.visible,e.traversal.usedLastFrame=e.traversal.used,e.traversal.lastFrameVisited=t.frameCount,e.traversal.used=!1,e.traversal.inFrustum=!1,e.traversal.isLeaf=!1,e.traversal.visible=!1,e.traversal.active=!1,e.traversal.error=1/0,e.traversal.distanceFromCamera=1/0,e.traversal.allChildrenReady=!1,e.traversal.allChildrenLoaded=!1,e.traversal.kicked=!1,e.traversal.allUsedChildrenProcessed=!1,t.calculateTileViewErrorWithPlugin(e,Cu),e.traversal.inFrustum=Cu.inView,e.traversal.error=Cu.error,e.traversal.distanceFromCamera=Cu.distanceFromCamera,e.traversal.unconditionallyRefine=e.internal.hasUnrenderableContent,!e.traversal.unconditionallyRefine))){let r=e.parent;for(;r&&r.traversal.unconditionallyRefine;)r=r.parent;r&&r.geometricError<=e.geometricError&&(e.traversal.unconditionallyRefine=!0)}}function sh(e,t,r=!1){if(Vs(e,t),r?t.markTileUsed(e):Tu(e),fo(e)&&Gs(e)){let n=e.children;for(let i=0,o=n.length;i<o;i++)sh(n[i],t,r)}}function yM(e,t){if(Vs(e,t),e.traversal.usedLastFrame&&(Tu(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||fo(e))&&Gs(e))){let r=e.children;for(let n=0,i=r.length;n<i;n++)yM(r[n],t)}}function Tu(e){e.traversal.used=!0}function qD(e,t){return!(e.traversal.error<=t.errorTarget&&!fo(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!Gs(e))}function xM(e,t){let{frameCount:r}=t,{children:n}=e;for(let i=0,o=n.length;i<o;i++){let a=n[i];Fn(a,r)&&(a.traversal.active&&(a.traversal.kicked=!0,a.traversal.active=!1),xM(a,t))}}function gM(e){return!fo(e)&&(!e.internal.hasContent||Ru(e.internal.loadingState))}function wM(e,t){if(Vs(e,t),!e.traversal.inFrustum)return;let r=e.parent;if(r&&r.refine==="ADD"&&e.geometricError>0&&e.traversal.error*(r.geometricError/e.geometricError)<=t.errorTarget)return;if(!qD(e,t)){Tu(e);return}let n=!1,i=!1,o=e.children;for(let a=0,s=o.length;a<s;a++){let l=o[a];wM(l,t),n||(n=Fn(l,t.frameCount)),i||(i=l.traversal.inFrustum)}if(e.refine==="REPLACE"&&!i&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let a=0,s=o.length;a<s;a++)sh(o[a],t,!0);return}if(Tu(e),e.refine==="REPLACE"&&n&&(t.loadSiblings||t.loadAncestors))for(let a=0,s=o.length;a<s;a++)sh(o[a],t)}function MM(e,t){let r=t.frameCount;if(!Fn(e,r))return;let n=e.children,i=!1;for(let a=0,s=n.length;a<s;a++){let l=n[a];i||(i=Fn(l,r))}if(!i)e.traversal.isLeaf=!0;else{for(let s=0,l=n.length;s<l;s++)MM(n[s],t);let a=!0;for(let s=0,l=n.length;s<l;s++){let d=n[s];if(Fn(d,r)){let u=!fo(d),p=!d.internal.hasContent||Ru(d.internal.loadingState);u&&p||d.traversal.allChildrenLoaded||(a=!1)}}e.traversal.allChildrenLoaded=a}let o=!0;for(let a=0,s=n.length;a<s;a++){let l=n[a];Fn(l,t.frameCount)&&!l.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&Gs(e)}function SM(e,t){if(!Fn(e,t.frameCount))return;let r=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!fo(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!fo(e)&&(e.traversal.active=!0,Gs(e)&&e.internal.hasContent&&!Ru(e.internal.loadingState)))for(let i=0,o=r.length;i<o;i++)yM(r[i],t);return}let n=r.length>0;for(let i=0,o=r.length;i<o;i++){let a=r[i];SM(a,t),Fn(a,t.frameCount)&&!(a.traversal.active&&gM(a))&&!a.traversal.allChildrenReady&&(n=!1)}e.traversal.allChildrenReady=n,e.refine==="REPLACE"&&!n&&e.traversal.wasSetActive&&gM(e)&&(e.traversal.active=!0,xM(e,t))}function CM(e,t){Vs(e,t);let r=Fn(e,t.frameCount);if(r&&(e.internal.hasUnrenderableContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.hasRenderableContent&&e.refine==="ADD"&&(e.traversal.active=!0),(e.traversal.active||e.traversal.kicked)&&e.internal.hasContent&&(t.markTileUsed(e),e.traversal.allUsedChildrenProcessed&&t.queueTileForDownload(e),e.internal.loadingState!==4&&(e.traversal.active=!1)),t.loadAncestors&&e.internal.hasContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.virtualChildCount>0&&e.internal.hasContent&&t.markTileUsed(e),e.traversal.visible=e.internal.hasRenderableContent&&e.traversal.active&&e.traversal.inFrustum&&e.internal.loadingState===4,t.stats.used++,e.traversal.inFrustum&&t.stats.inFrustum++),r||ku(e)&&e.traversal.usedLastFrame){let n=!1,i=!1;r?(n=e.traversal.active,i=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):Vs(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(n&&t.stats.active++,i&&t.stats.visible++,e.traversal.wasSetActive!==n&&t.invokeOnePlugin(a=>a.setTileActive&&a.setTileActive(e,n)),e.traversal.wasSetVisible!==i&&t.invokeOnePlugin(a=>a.setTileVisible&&a.setTileVisible(e,i))):e.internal.hasRenderableContent||(i=e.traversal.isLeaf,e.traversal.wasSetVisible!==i&&t.invokeOnePlugin(a=>a.setEmptyTileVisible&&a.setEmptyTileVisible(e,i))),e.traversal.visible=i,e.traversal.active=n;let o=e.children;for(let a=0,s=o.length;a<s;a++){let l=o[a];CM(l,t)}}}function XD(e,t){wM(e,t),MM(e,t),SM(e,t),CM(e,t)}function $D(e){let t=null;return()=>{t===null&&(t=zs.requestAnimationFrame(()=>{t=null,e()}))}}function YD(e,t=null,r=null){let n=[];for(n.push(e),n.push(null),n.push(0);n.length>0;){let i=n.pop(),o=n.pop(),a=n.pop();if(t&&t(a,o,i)){r&&r(a,o,i);return}let s=a.children;if(s)for(let l=s.length-1;l>=0;l--)n.push(s[l]),n.push(a),n.push(i+1);r&&r(a,o,i)}}var bM=Symbol("PLUGIN_REGISTERED"),Si={inView:!0,error:0,distance:1/0},KD=(e,t)=>{let r=e.priority||0,n=t.priority||0;return r===n?!e.traversal||!t.traversal?0:e.traversal.used===t.traversal.used?e.traversal.error===t.traversal.error?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.traversal.error>t.traversal.error?1:-1:e.traversal.used?1:-1:r>n?1:-1},QD=(e,t)=>e.traversal.used===t.traversal.used?e.traversal.inFrustum===t.traversal.inFrustum?e.internal.hasUnrenderableContent===t.internal.hasUnrenderableContent?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.internal.hasUnrenderableContent?1:-1:e.traversal.inFrustum?1:-1:e.traversal.used?1:-1,JD=(e,t)=>e.traversal.lastFrameVisited===t.traversal.lastFrameVisited?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?e.internal.loadingState===t.internal.loadingState?e.internal.hasUnrenderableContent===t.internal.hasUnrenderableContent?e.traversal.error===t.traversal.error?0:e.traversal.error>t.traversal.error?-1:1:e.internal.hasUnrenderableContent?-1:1:e.internal.loadingState>t.internal.loadingState?-1:1:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?1:-1:e.traversal.lastFrameVisited>t.traversal.lastFrameVisited?-1:1,ma=(e,t)=>{let r=e.priority??1/0,n=t.priority??1/0;if(r!==n)return r>n?1:-1;if(!e.internal||!t.internal)return 0;let i=e.internal.renderer,o=t.internal.renderer,a=!i.loadAncestors,s=!o.loadAncestors;return a&&s?QD(e,t):KD(e,t)},ch=new Us;ch.unloadPriorityCallback=JD;var Fs=new Au;Fs.maxJobsPerOrigin=25,Fs.priorityCallback=ma;var _u=new bn;_u.maxJobs=5,_u.priorityCallback=ma;var Eu=new bn;Eu.maxJobs=25,Eu.priorityCallback=(e,t)=>{let r=e.parent,n=t.parent;return r===n?0:r?n?ma(r,n):-1:1};var uh=class{get root(){let e=this.rootTileset;return e?e.root:null}get loadProgress(){let{stats:e,isLoading:t}=this,r=e.queued+e.downloading+e.parsing,n=e.inCacheSinceLoad+ +!!t;return n===0?1:1-r/n}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof bn){console.warn('TilesRenderer: "downloadQueue" is no longer valid as a PriorityQueue. Use a DownloadPriorityQueue, instead.');return}this._downloadQueue=e}constructor(e=null){this.rootLoadingState=0,this.rootTileset=null,this.rootURL=e,this.fetchOptions={},this.plugins=[],this.queuedTiles=[],this.cachedSinceLoadComplete=new Set,this.isLoading=!1,this.processedTiles=new WeakSet,this.visibleTiles=new Set,this.activeTiles=new Set,this.usedSet=new Set,this.loadingTiles=new Set,this.lruCache=ch,this.downloadQueue=Fs,this.parseQueue=_u,this.processNodeQueue=Eu,this.stats={inCacheSinceLoad:0,inCache:0,queued:0,downloading:0,parsing:0,loaded:0,failed:0,inFrustum:0,used:0,active:0,visible:0,tilesProcessed:0},this.frameCount=0,this._dispatchNeedsUpdateEvent=$D(()=>{this.dispatchEvent({type:"needs-update"})}),this.errorTarget=16,this.errorFalloff=0,this.errorFalloffDensity=2e-4,this.displayActiveTiles=!1,this.maxDepth=1/0,this.loadSiblings=!0,this.loadAncestors=!0,this.maxTilesProcessed=250}registerPlugin(e){if(e[bM]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,r=e.priority||0,n=t.length;for(let i=0;i<t.length;i++)if((t[i].priority||0)>r){n=i;break}t.splice(n,0,e),e[bM]=!0,e.init&&e.init(this)}unregisterPlugin(e){let t=this.plugins;if(typeof e=="string"&&(e=this.getPluginByName(e)),t.includes(e)){let r=t.indexOf(e);return t.splice(r,1),e.dispose&&e.dispose(),!0}return!1}getPluginByName(e){return this.plugins.find(t=>t.name===e)||null}invokeOnePlugin(e){let t=[...this.plugins,this];for(let r=0;r<t.length;r++){let n=e(t[r]);if(n)return n}return null}invokeAllPlugins(e){let t=[...this.plugins,this],r=[];for(let n=0;n<t.length;n++){let i=e(t[n]);i&&r.push(i)}return r.length===0?null:Promise.all(r)}traverse(e,t,r=!0){this.root&&YD(this.root,(n,...i)=>(r&&this.ensureChildrenArePreprocessed(n,!0),e?e(n,...i):!1),t)}getAttributions(e=[]){return this.invokeAllPlugins(t=>t!==this&&t.getAttributions&&t.getAttributions(e)),e}update(){let{lruCache:e,usedSet:t,stats:r,root:n,downloadQueue:i,parseQueue:o,processNodeQueue:a}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(d=>d.loadRootTileset&&d.loadRootTileset()).then(d=>{let u=this.rootURL;u!==null&&this.invokeAllPlugins(p=>u=p.preprocessURL?p.preprocessURL(u,null):u),this.rootLoadingState=4,this.rootTileset=d,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:d,url:u}),this.dispatchEvent({type:"load-root-tileset",tileset:d,url:u})}).catch(d=>{this.rootLoadingState=-1,console.error(d),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:d,url:this.rootURL})})),!n)return;let s=null;if(this.invokeAllPlugins(d=>{if(d.doTilesNeedUpdate){let u=d.doTilesNeedUpdate();s=s===null?u:!!(s||u)}}),s===!1){this.dispatchEvent({type:"update-before"}),this.dispatchEvent({type:"update-after"});return}this.dispatchEvent({type:"update-before"}),r.inFrustum=0,r.used=0,r.active=0,r.visible=0,r.tilesProcessed=0,this.frameCount++,t.forEach(d=>e.markUnused(d)),t.clear(),this.prepareForTraversal(),XD(n,this),this.removeUnusedPendingTiles();let l=this.queuedTiles;l.sort(e.unloadPriorityCallback);for(let d=0,u=l.length;d<u&&!e.isFull();d++)this.requestTileContents(l[d]);l.length=0,e.scheduleUnload(),(i.running||o.running||a.running)===!1&&this.isLoading===!0&&(this.cachedSinceLoadComplete.clear(),r.inCacheSinceLoad=0,this.dispatchEvent({type:"tiles-load-end"}),this.isLoading=!1),this.dispatchEvent({type:"update-after"})}resetFailedTiles(){this.rootLoadingState===-1&&(this.rootLoadingState=0);let e=this.stats;e.failed!==0&&(this.traverse(t=>{t.internal.loadingState===-1&&(t.internal.loadingState=0)},null,!1),e.failed=0)}calculateTileViewErrorWithPlugin(e,t){this.calculateTileViewError(e,t);let{errorFalloff:r,errorFalloffDensity:n}=this;if(r>0&&Number.isFinite(t.distanceFromCamera)){let s=t.distanceFromCamera*n;t.error-=r*(1-Math.exp(-s*s))}let i=null,o=0,a=1/0;this.invokeAllPlugins(s=>{s!==this&&s.calculateTileViewError&&(Si.inView=!0,Si.error=0,Si.distance=1/0,s.calculateTileViewError(e,Si)&&(i===null&&(i=!0),i&&(i=Si.inView),Si.inView&&(a=Math.min(a,Si.distance),o=Math.max(o,Si.error))))}),t.inView&&i!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,a)):i?(t.inView=!0,t.error=o,t.distanceFromCamera=a):t.inView=!1}dispose(){[...this.plugins].forEach(r=>{this.unregisterPlugin(r)});let e=this.lruCache,t=[];this.traverse(r=>(t.push(r),!1),null,!1);for(let r=0,n=t.length;r<n;r++)e.remove(t[r]);this.stats={queued:0,parsing:0,downloading:0,failed:0,inFrustum:0,traversed:0,used:0,active:0,visible:0},this.frameCount=0,this.loadingTiles.clear()}calculateBytesUsed(e,t){return 0}dispatchEvent(e){}addEventListener(e,t){}removeEventListener(e,t){}parseTile(e,t,r){return null}prepareForTraversal(){}disposeTile(e){e.traversal.visible&&(e.internal.hasRenderableContent?this.invokeOnePlugin(r=>r.setTileVisible&&r.setTileVisible(e,!1)):this.invokeOnePlugin(r=>r.setEmptyTileVisible&&r.setEmptyTileVisible(e,!1)),e.traversal.visible=!1),e.traversal.active&&e.internal.hasRenderableContent&&this.invokeOnePlugin(r=>r.setTileActive&&r.setTileActive(e,!1)),e.traversal.active=!1;let{scene:t}=e.engineData;t&&this.dispatchEvent({type:"dispose-model",scene:t,tile:e})}preprocessNode(e,t,r=null){if(this.processedTiles.add(e),this.stats.tilesProcessed++,e.content&&(!("uri"in e.content)&&"url"in e.content&&(e.content.uri=e.content.url,delete e.content.url),e.content.boundingVolume&&!("box"in e.content.boundingVolume||"sphere"in e.content.boundingVolume||"region"in e.content.boundingVolume)&&delete e.content.boundingVolume),e.parent=r,e.children=e.children||[],e.internal={hasContent:!1,hasRenderableContent:!1,hasUnrenderableContent:!1,loadingState:0,basePath:t,depth:-1,depthFromRenderedParent:-1,isVirtual:!1,virtualChildCount:0,renderer:this,...e.internal},e.content?.uri){let n=ah(e.content.uri),i=!!(n&&/json$/.test(n));e.internal.hasContent=!0,e.internal.hasUnrenderableContent=i,e.internal.hasRenderableContent=!i}else e.internal.hasContent=!1,e.internal.hasUnrenderableContent=!1,e.internal.hasRenderableContent=!1;r?(e.internal.depth=r.internal.depth+1,e.internal.depthFromRenderedParent=r.internal.depthFromRenderedParent+ +!!e.internal.hasRenderableContent):(e.internal.depth=0,e.internal.depthFromRenderedParent=+!!e.internal.hasRenderableContent),e.traversal={distanceFromCamera:1/0,error:1/0,inFrustum:!1,wasInFrustum:!1,isLeaf:!1,used:!1,usedLastFrame:!1,visible:!1,wasSetVisible:!1,active:!1,wasSetActive:!1,allChildrenReady:!1,allChildrenLoaded:!1,kicked:!1,allUsedChildrenProcessed:!1,lastFrameVisited:-1},r===null?e.refine=e.refine||"REPLACE":e.refine=e.refine||r.refine,e.engineData={scene:null,metadata:null,boundingVolume:null},Object.defineProperty(e,"cached",{get(){return console.warn('TilesRenderer: "tile.cached" field has been renamed to "tile.engineData".'),this.engineData},enumerable:!1,configurable:!0}),this.invokeAllPlugins(n=>{n!==this&&n.preprocessNode&&n.preprocessNode(e,t,r)})}setTileActive(e,t){t?this.activeTiles.add(e):this.activeTiles.delete(e)}setTileVisible(e,t){t?this.visibleTiles.add(e):this.visibleTiles.delete(e),this.dispatchEvent({type:"tile-visibility-change",scene:e.engineData.scene,tile:e,visible:t})}calculateTileViewError(e,t){}removeUnusedPendingTiles(){let{lruCache:e,loadingTiles:t}=this,r=[];for(let n of t)!e.isUsed(n)&&n.internal.loadingState===1&&r.push(n);for(let n=0;n<r.length;n++)e.remove(r[n])}queueTileForDownload(e){e.internal.loadingState!==0||this.lruCache.isFull()||this.queuedTiles.push(e)}markTileUsed(e){this.usedSet.add(e),this.lruCache.markUsed(e)}fetchData(e,t){return fetch(e,t)}ensureChildrenArePreprocessed(e,t=this.stats.tilesProcessed<this.maxTilesProcessed){let r=e.children;if(r.length===0||r[r.length-1].traversal)return;let n=i=>{for(let o=0,a=i.length;o<a;o++){let s=i[o];s&&!s.traversal&&this.preprocessNode(s,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),n(r)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,i=>{n(i.children),this._dispatchNeedsUpdateEvent()})}getBytesUsed(e){let t=0;return this.invokeAllPlugins(r=>{r.calculateBytesUsed&&(t+=r.calculateBytesUsed(e,e.engineData.scene)||0)}),t}recalculateBytesUsed(e=null){let{lruCache:t,processedTiles:r}=this;e===null?t.itemSet.forEach(n=>{r.has(n)&&t.setMemoryUsage(n,this.getBytesUsed(n))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,r=null){let[n,i]=e.asset.version.split(".").map(a=>parseInt(a));console.assert(n<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),n===1&&i>0&&console.warn("TilesRenderer: tiles versions at 1.1 or higher have limited support. Some new extensions and features may not be supported.");let o=t.replace(/\/[^/]*$/,"");o=new URL(o,window.location.href).toString(),this.preprocessNode(e.root,o,r)}loadRootTileset(){let e=this.rootURL;return this.invokeAllPlugins(t=>e=t.preprocessURL?t.preprocessURL(e,null):e),this.invokeOnePlugin(t=>t.fetchData&&t.fetchData(e,this.fetchOptions)).then(t=>{if(!(t instanceof Response))return t;if(t.ok)return t.json();throw Error(`TilesRenderer: Failed to load tileset "${e}" with status ${t.status} : ${t.statusText}`)}).then(t=>(this.preprocessTileset(t,e),t))}requestTileContents(e){if(e.internal.loadingState!==0)return;let t=!1,r=null,n=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(c=>n=c.preprocessURL?c.preprocessURL(n,e):n);let i=this.stats,o=this.lruCache,a=this.downloadQueue,s=this.parseQueue,l=this.loadingTiles,d=ah(n),u=new AbortController,p=u.signal;if(o.add(e,c=>{u.abort(),t?c.children.length=0:this.invokeAllPlugins(h=>{h.disposeTile&&h.disposeTile(c)}),i.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),i.inCacheSinceLoad--),c.internal.loadingState===1?i.queued--:c.internal.loadingState===2?i.downloading--:c.internal.loadingState===3?i.parsing--:c.internal.loadingState===4&&i.loaded--,c.internal.loadingState=0,s.remove(c),a.remove(c),l.delete(c)}))return this.isLoading||(this.isLoading=!0,this.dispatchEvent({type:"tiles-load-start"})),o.setMemoryUsage(e,this.getBytesUsed(e)),this.cachedSinceLoadComplete.add(e),i.inCacheSinceLoad++,i.inCache++,i.queued++,e.internal.loadingState=1,l.add(e),a.add(n,e,c=>{if(p.aborted)return Promise.resolve();e.internal.loadingState=2,i.downloading++,i.queued--;let h=this.invokeOnePlugin(m=>m.fetchData&&m.fetchData(n,{...this.fetchOptions,signal:p}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:n,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),h}).then(c=>{if(!p.aborted){if(!(c instanceof Response))return c;if(c.ok)return d==="json"?c.json():c.arrayBuffer();throw Error(`Failed to load model with error code ${c.status}`)}}).then(c=>{if(!p.aborted)return i.downloading--,i.parsing++,e.internal.loadingState=3,s.add(e,h=>p.aborted?Promise.resolve():d==="json"&&c.root?(this.preprocessTileset(c,n,e),e.children.push(c.root),r=c,t=!0,Promise.resolve()):this.invokeOnePlugin(m=>m.parseTile&&m.parseTile(c,h,d,n,p)))}).then(()=>{if(p.aborted)return;i.parsing--,i.loaded++,e.internal.loadingState=4,l.delete(e),o.setLoaded(e,!0);let c=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&c>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,c),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:r,url:n}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:n})}).catch(c=>{p.aborted||(c.name==="AbortError"?o.remove(e):(s.remove(e),a.remove(e),e.internal.loadingState===1?i.queued--:e.internal.loadingState===2?i.downloading--:e.internal.loadingState===3?i.parsing--:e.internal.loadingState===4&&i.loaded--,i.failed++,console.error(`TilesRenderer : Failed to load tile at url "${e.content.uri}".`),console.error(c),e.internal.loadingState=-1,l.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:c,url:n})))})}};function go(e){if(e===null||e.byteLength<4)return"";let t;if(t=e instanceof DataView?e:new DataView(e),String.fromCharCode(t.getUint8(0))==="{")return null;let r="";for(let n=0;n<4;n++)r+=String.fromCharCode(t.getUint8(n));return r}var ZD=new TextDecoder;function PM(e){return ZD.decode(e)}function Du(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var ha=class{constructor(){this.fetchOptions={},this.workingPath=""}loadAsync(e){return fetch(e,this.fetchOptions).then(t=>{if(!t.ok)throw Error(`Failed to load file "${e}" with status ${t.status} : ${t.statusText}`);return t.arrayBuffer()}).then(t=>(this.workingPath===""&&(this.workingPath=Du(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function dh(e,t,r,n,i,o){let a;switch(n){case"SCALAR":a=1;break;case"VEC2":a=2;break;case"VEC3":a=3;break;case"VEC4":a=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let s,l=r*a;switch(i){case"BYTE":s=new Int8Array(e,t,l);break;case"UNSIGNED_BYTE":s=new Uint8Array(e,t,l);break;case"SHORT":s=new Int16Array(e,t,l);break;case"UNSIGNED_SHORT":s=new Uint16Array(e,t,l);break;case"INT":s=new Int32Array(e,t,l);break;case"UNSIGNED_INT":s=new Uint32Array(e,t,l);break;case"FLOAT":s=new Float32Array(e,t,l);break;case"DOUBLE":s=new Float64Array(e,t,l);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return s}var Hs=class{constructor(e,t,r,n){this.buffer=e,this.binOffset=t+r,this.binLength=n;let i=null;if(r!==0){let o=new Uint8Array(e,t,r);i=JSON.parse(PM(o))}else i={};this.header=i}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,r=null,n=null){let i=this.header;if(!(e in i))return null;let o=i[e];if(!(o instanceof Object)||Array.isArray(o))return o;{let{buffer:a,binOffset:s,binLength:l}=this,d=o.byteOffset||0,u=o.type||n,p=o.componentType||r;if("type"in o&&n&&o.type!==n)throw Error("FeatureTable: Specified type does not match expected type.");let c=s+d,h=dh(a,c,t,u,p,e);if(c+h.byteLength>s+l)throw Error("FeatureTable: Feature data read outside binary body length.");return h}}getBuffer(e,t){let{buffer:r,binOffset:n}=this;return r.slice(n+e,n+e+t)}},eO=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let n of this.classes){let i=n.instances;for(let o in i)n.instances[o]=this._parseProperty(i[o],n.length,o)}if(this.instancesLength=t.instancesLength,this.classIds=this._parseProperty(t.classIds,this.instancesLength,"classIds"),t.parentCounts?this.parentCounts=this._parseProperty(t.parentCounts,this.instancesLength,"parentCounts"):this.parentCounts=Array(this.instancesLength).fill(1),t.parentIds){let n=this.parentCounts.reduce((i,o)=>i+o,0);this.parentIds=this._parseProperty(t.parentIds,n,"parentIds")}else this.parentIds=null;this.instancesIds=[];let r={};for(let n of this.classIds)r[n]=r[n]??0,this.instancesIds.push(r[n]),r[n]++}_parseProperty(e,t,r){if(Array.isArray(e))return e;{let{buffer:n,binOffset:i}=this.batchTable,o=e.byteOffset,a=e.componentType||"UNSIGNED_SHORT";return dh(n,i+o,t,"SCALAR",a,r)}}getDataFromId(e,t={}){let r=this.parentCounts[e];if(this.parentIds&&r>0){let s=0;for(let l=0;l<e;l++)s+=this.parentCounts[l];for(let l=0;l<r;l++){let d=this.parentIds[s+l];d!==e&&this.getDataFromId(d,t)}}let n=this.classIds[e],i=this.classes[n].instances,o=this.classes[n].name,a=this.instancesIds[e];for(let s in i)t[o]=t[o]||{},t[o][s]=i[s][a];return t}},Ou=class extends Hs{constructor(e,t,r,n,i){super(e,r,n,i),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new eO(this))}getDataFromId(e,t={}){if(e<0||e>=this.count)throw Error(`BatchTable: id value "${e}" out of bounds for "${this.count}" features number.`);for(let r of this.getKeys())t[r]=super.getData(r,this.count)[e];for(let r in this.extensions){let n=this.extensions[r];n.getDataFromId instanceof Function&&(t[r]=t[r]||{},n.getDataFromId(e,t[r]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},ph=class extends ha{parse(e){let t=new DataView(e),r=go(t);console.assert(r==="b3dm");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),l=t.getUint32(24,!0),d=new Hs(e.slice(28,28+o+a),0,o,a),u=28+o+a,p=new Ou(e.slice(u,u+s+l),d.getData("BATCH_LENGTH"),0,s,l),c=u+s+l;return{version:n,featureTable:d,batchTable:p,glbBytes:new Uint8Array(e,c,i-c)}}},mh=class extends ha{parse(e){let t=new DataView(e),r=go(t);console.assert(r==="i3dm");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),l=t.getUint32(24,!0),d=t.getUint32(28,!0),u=new Hs(e.slice(32,32+o+a),0,o,a),p=32+o+a,c=new Ou(e.slice(p,p+s+l),u.getData("INSTANCES_LENGTH"),0,s,l),h=p+s+l,m=new Uint8Array(e,h,i-h),b=null,y=null,S=null;if(d)b=m,y=Promise.resolve();else{let f=this.resolveExternalURL(PM(m));S=Du(f),y=fetch(f,this.fetchOptions).then(g=>{if(!g.ok)throw Error(`I3DMLoaderBase : Failed to load file "${f}" with status ${g.status} : ${g.statusText}`);return g.arrayBuffer()}).then(g=>{b=new Uint8Array(g)})}return y.then(()=>({version:n,featureTable:u,batchTable:c,glbBytes:b,gltfWorkingPath:S}))}},hh=class extends ha{parse(e){let t=new DataView(e),r=go(t);console.assert(r==="pnts");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),l=t.getUint32(24,!0),d=new Hs(e.slice(28,28+o+a),0,o,a),u=28+o+a,p=new Ou(e.slice(u,u+s+l),d.getData("BATCH_LENGTH")||d.getData("POINTS_LENGTH"),0,s,l);return Promise.resolve({version:n,featureTable:d,batchTable:p})}},fh=class extends ha{parse(e){let t=new DataView(e),r=go(t);console.assert(r==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let n=t.getUint32(4,!0);console.assert(n===1,'CMPTLoader: The version listed in the header is "1".');let i=t.getUint32(8,!0);console.assert(i===e.byteLength,"CMPTLoader: The contents buffer length listed in the header matches the file.");let o=t.getUint32(12,!0),a=[],s=16;for(let l=0;l<o;l++){let d=new DataView(e,s,12),u=go(d),p=d.getUint32(4,!0),c=d.getUint32(8,!0),h=new Uint8Array(e,s,c);a.push({type:u,buffer:h,version:p}),s+=c}return{version:n,tiles:a}}};import{Box3 as FM,BufferAttribute as vo,BufferGeometry as tO,Clock as M5,Color as rO,DefaultLoadingManager as Gu,Euler as nO,EventDispatcher as Lu,Frustum as iO,Group as Ph,InstancedMesh as oO,LoadingManager as aO,MathUtils as UM,Matrix3 as sO,Matrix4 as Wt,Mesh as S5,OrthographicCamera as C5,PerspectiveCamera as P5,Plane as lO,PlaneGeometry as T5,Points as cO,PointsMaterial as uO,Quaternion as GM,Ray as Th,Raycaster as _5,ShaderMaterial as E5,Sphere as HM,Spherical as dO,TextureUtils as pO,Vector2 as _h,Vector3 as Ve}from"three";import{GLTFLoader as Eh}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as mO}from"three/addons/utils/BufferGeometryUtils.js";var Ah=class extends ph{constructor(e=Gu){super(),this.manager=e,this.adjustmentTransform=new Wt}parse(e){let t=super.parse(e),r=t.glbBytes.slice().buffer;return new Promise((n,i)=>{let o=this.manager,a=this.fetchOptions,s=o.getHandler("path.gltf")||new Eh(o);a.credentials==="include"&&a.mode==="cors"&&s.setCrossOrigin("use-credentials"),"credentials"in a&&s.setWithCredentials(a.credentials==="include"),a.headers&&s.setRequestHeader(a.headers);let l=this.workingPath;!/[\\/]$/.test(l)&&l.length&&(l+="/");let d=this.adjustmentTransform;s.parse(r,l,u=>{let{batchTable:p,featureTable:c}=t,{scene:h}=u,m=c.getData("RTC_CENTER",1,"FLOAT","VEC3");m&&(h.position.x+=m[0],h.position.y+=m[1],h.position.z+=m[2]),u.scene.updateMatrix(),u.scene.matrix.multiply(d),u.scene.matrix.decompose(u.scene.position,u.scene.quaternion,u.scene.scale),u.batchTable=p,u.featureTable=c,h.batchTable=p,h.featureTable=c,n(u)},i)})}};function hO(e){let t=e>>11,r=e>>5&63,n=e&31;return[Math.round(t/31*255),Math.round(r/63*255),Math.round(n/31*255)]}var Ws=new _h;function fO(e,t,r=new Ve){Ws.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),r.set(Ws.x,Ws.y,1-Math.abs(Ws.x)-Math.abs(Ws.y));let n=UM.clamp(-r.z,0,1);return r.x>=0?r.setX(r.x-n):r.setX(r.x+n),r.y>=0?r.setY(r.y-n):r.setY(r.y+n),r.normalize(),r}var TM={RGB:"color",POSITION:"position"},Rh=class extends hh{constructor(e=Gu){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:r,batchTable:n}=t,i=new uO,o=r.header.extensions,a=new Ve,s;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:u,byteLength:p,properties:c}=o["3DTILES_draco_point_compression"],h=this.manager.getHandler("draco.drc");if(h==null)throw Error("PNTSLoader: dracoLoader not available.");let m={};for(let S in c)if(S in TM&&S in c){let f=TM[S];m[f]=c[S]}let b={attributeIDs:m,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},y=r.getBuffer(u,p);s=await h.decodeGeometry(y,b),s.attributes.color&&(i.vertexColors=!0)}else{let u=r.getData("POINTS_LENGTH"),p=r.getData("POSITION",u,"FLOAT","VEC3"),c=r.getData("NORMAL",u,"FLOAT","VEC3"),h=r.getData("NORMAL",u,"UNSIGNED_BYTE","VEC2"),m=r.getData("RGB",u,"UNSIGNED_BYTE","VEC3"),b=r.getData("RGBA",u,"UNSIGNED_BYTE","VEC4"),y=r.getData("RGB565",u,"UNSIGNED_SHORT","SCALAR"),S=r.getData("CONSTANT_RGBA",u,"UNSIGNED_BYTE","VEC4"),f=r.getData("POSITION_QUANTIZED",u,"UNSIGNED_SHORT","VEC3"),g=r.getData("QUANTIZED_VOLUME_SCALE",u,"FLOAT","VEC3"),x=r.getData("QUANTIZED_VOLUME_OFFSET",u,"FLOAT","VEC3");if(s=new tO,f){let _=new Float32Array(u*3);for(let v=0;v<u;v++)for(let R=0;R<3;R++){let A=3*v+R;_[A]=f[A]/65535*g[R]}a.x=x[0],a.y=x[1],a.z=x[2],s.setAttribute("position",new vo(_,3,!1))}else s.setAttribute("position",new vo(p,3,!1));if(c!==null)s.setAttribute("normal",new vo(c,3,!1));else if(h!==null){let _=new Float32Array(u*3),v=new Ve;for(let R=0;R<u;R++){let A=h[R*2],w=h[R*2+1],C=fO(A,w,v);_[R*3]=C.x,_[R*3+1]=C.y,_[R*3+2]=C.z}s.setAttribute("normal",new vo(_,3,!1))}if(b!==null)s.setAttribute("color",new vo(b,4,!0)),i.vertexColors=!0,i.transparent=!0,i.depthWrite=!1;else if(m!==null)s.setAttribute("color",new vo(m,3,!0)),i.vertexColors=!0;else if(y!==null){let _=new Uint8Array(u*3);for(let v=0;v<u;v++){let R=hO(y[v]);for(let A=0;A<3;A++){let w=3*v+A;_[w]=R[A]}}s.setAttribute("color",new vo(_,3,!0)),i.vertexColors=!0}else if(S!==null){i.color=new rO(S[0],S[1],S[2]);let _=S[3]/255;_<1&&(i.opacity=_,i.transparent=!0,i.depthWrite=!1)}}let l=new cO(s,i);l.position.copy(a),t.scene=l,t.scene.featureTable=r,t.scene.batchTable=n;let d=r.getData("RTC_CENTER",1,"FLOAT","VEC3");return d&&(t.scene.position.x+=d[0],t.scene.position.y+=d[1],t.scene.position.z+=d[2]),t})}};function gO(e){let{x:t,y:r,z:n}=e;e.x=n,e.y=t,e.z=r}function bO(e){return-e+Math.PI/2}var _M=new dO,Ci=new Ve,ur=new Ve,gh=new Ve,kr=new Wt,vn=new Wt,bh=new HM,fr=new nO,EM=new Ve,AM=new Ve,RM=new Ve,qs=new Ve,Iu=new Th,vO=1e-12,yO=.1;var kh=class{constructor(e=1,t=1,r=1){this.name="",this.radius=new Ve(e,t,r)}intersectRay(e,t){return kr.makeScale(...this.radius).invert(),bh.center.set(0,0,0),bh.radius=1,Iu.copy(e).applyMatrix4(kr),Iu.intersectSphere(bh,t)?(kr.makeScale(...this.radius),t.applyMatrix4(kr),t):null}getEastNorthUpFrame(e,t,r,n){return r.isMatrix4&&(n=r,r=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,EM,AM,RM),this.getCartographicToPosition(e,t,r,qs),n.makeBasis(EM,AM,RM).setPosition(qs)}getOrientedEastNorthUpFrame(e,t,r,n,i,o,a){return this.getObjectFrame(e,t,r,n,i,o,a,0)}getObjectFrame(e,t,r,n,i,o,a,s=2){return this.getEastNorthUpFrame(e,t,r,kr),fr.set(i,o,-n,"ZXY"),a.makeRotationFromEuler(fr).premultiply(kr),s===1?(fr.set(Math.PI/2,0,0,"XYZ"),vn.makeRotationFromEuler(fr),a.multiply(vn)):s===2&&(fr.set(-Math.PI/2,0,Math.PI,"XYZ"),vn.makeRotationFromEuler(fr),a.multiply(vn)),a}getCartographicFromObjectFrame(e,t,r=2){return r===1?(fr.set(-Math.PI/2,0,0,"XYZ"),vn.makeRotationFromEuler(fr).premultiply(e)):r===2?(fr.set(-Math.PI/2,0,Math.PI,"XYZ"),vn.makeRotationFromEuler(fr).premultiply(e)):vn.copy(e),qs.setFromMatrixPosition(vn),this.getPositionToCartographic(qs,t),this.getEastNorthUpFrame(t.lat,t.lon,0,kr).invert(),vn.premultiply(kr),fr.setFromRotationMatrix(vn,"ZXY"),t.azimuth=-fr.z,t.elevation=fr.x,t.roll=fr.y,t}getEastNorthUpAxes(e,t,r,n,i,o=qs){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,i),r.set(-o.y,o.x,0).normalize(),n.crossVectors(i,r).normalize()}getCartographicToPosition(e,t,r,n){this.getCartographicToNormal(e,t,Ci);let i=this.radius;ur.copy(Ci),ur.x*=i.x**2,ur.y*=i.y**2,ur.z*=i.z**2;let o=Math.sqrt(Ci.dot(ur));return ur.divideScalar(o),n.copy(ur).addScaledVector(Ci,r)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,ur),this.getPositionToNormal(ur,Ci);let r=gh.subVectors(e,ur);return t.lon=Math.atan2(Ci.y,Ci.x),t.lat=Math.asin(Ci.z),t.height=Math.sign(r.dot(e))*r.length(),t}getCartographicToNormal(e,t,r){return _M.set(1,bO(e),t),r.setFromSpherical(_M).normalize(),gO(r),r}getPositionToNormal(e,t){let r=this.radius;return t.copy(e),t.x/=r.x**2,t.y/=r.y**2,t.z/=r.z**2,t.normalize(),t}getPositionToSurfacePoint(e,t){let r=this.radius,n=1/r.x**2,i=1/r.y**2,o=1/r.z**2,a=e.x*e.x*n,s=e.y*e.y*i,l=e.z*e.z*o,d=a+s+l,u=Math.sqrt(1/d),p=ur.copy(e).multiplyScalar(u);if(d<yO)return isFinite(u)?t.copy(p):null;let c=gh.set(p.x*n*2,p.y*i*2,p.z*o*2),h=(1-u)*e.length()/(.5*c.length()),m=0,b,y,S,f,g,x,_,v,R,A,w;do{h-=m,S=1/(1+h*n),f=1/(1+h*i),g=1/(1+h*o),x=S*S,_=f*f,v=g*g,R=x*S,A=_*f,w=v*g,b=a*x+s*_+l*v-1,y=a*R*n+s*A*i+l*w*o;let C=-2*y;m=b/C}while(Math.abs(b)>vO);return t.set(e.x*S,e.y*f,e.z*g)}calculateHorizonDistance(e,t){let r=this.calculateEffectiveRadius(e);return Math.sqrt(2*r*t+t**2)}calculateEffectiveRadius(e){let t=this.radius.x,r=1-this.radius.z**2/t**2,n=e*UM.DEG2RAD,i=Math.sin(n)**2;return t/Math.sqrt(1-r*i)}getPositionElevation(e){this.getPositionToSurfacePoint(e,ur);let t=gh.subVectors(e,ur);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(kr.makeScale(...this.radius).invert(),Iu.copy(e).applyMatrix4(kr),ur.set(0,0,0),Iu.closestPointToPoint(ur,t).normalize(),kr.makeScale(...this.radius),t.applyMatrix4(kr))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},Qs=new kh(bo,bo,lh);Qs.name="WGS84 Earth";var Bu=new Ve,fa=new Ve,ga=new Ve,vh=new Ve,Nu=new GM,ju=new Ve,ba=new Wt,kM=new Wt,DM=new Ve,OM=new Wt,yh=new GM,xh={};function LM(e,t,r,n){if(e=e/r*2-1,t=t/r*2-1,n.x=e,n.y=t,n.z=1-Math.abs(e)-Math.abs(t),n.z<0){let i=n.x;n.x=(1-Math.abs(n.y))*(i>=0?1:-1),n.y=(1-Math.abs(i))*(n.y>=0?1:-1)}return n.normalize(),n}var Dh=class extends mh{constructor(e=Gu){super(),this.manager=e,this.adjustmentTransform=new Wt,this.ellipsoid=Qs.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:r,batchTable:n}=t,i=t.glbBytes.slice().buffer;return new Promise((o,a)=>{let s=this.fetchOptions,l=this.manager,d=l.getHandler("path.gltf")||new Eh(l);s.credentials==="include"&&s.mode==="cors"&&d.setCrossOrigin("use-credentials"),"credentials"in s&&d.setWithCredentials(s.credentials==="include"),s.headers&&d.setRequestHeader(s.headers);let u=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(u)||(u+="/");let p=this.adjustmentTransform;d.parse(i,u,c=>{let h=r.getData("INSTANCES_LENGTH"),m=r.getData("POSITION",h,"FLOAT","VEC3"),b=r.getData("POSITION_QUANTIZED",h,"UNSIGNED_SHORT","VEC3"),y=r.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),S=r.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),f=r.getData("NORMAL_UP",h,"FLOAT","VEC3"),g=r.getData("NORMAL_RIGHT",h,"FLOAT","VEC3"),x=r.getData("NORMAL_UP_OCT32P",h,"UNSIGNED_SHORT","VEC2"),_=r.getData("NORMAL_RIGHT_OCT32P",h,"UNSIGNED_SHORT","VEC2"),v=r.getData("SCALE_NON_UNIFORM",h,"FLOAT","VEC3"),R=r.getData("SCALE",h,"FLOAT","SCALAR"),A=r.getData("RTC_CENTER",1,"FLOAT","VEC3"),w=r.getData("EAST_NORTH_UP");if(!m&&b){m=new Float32Array(h*3);for(let T=0;T<h;T++)m[T*3+0]=y[0]+b[T*3+0]/65535*S[0],m[T*3+1]=y[1]+b[T*3+1]/65535*S[1],m[T*3+2]=y[2]+b[T*3+2]/65535*S[2]}let C=new Ve;for(let T=0;T<h;T++)C.x+=m[T*3+0]/h,C.y+=m[T*3+1]/h,C.z+=m[T*3+2]/h;let P=[],E=[];c.scene.updateMatrixWorld(),c.scene.traverse(T=>{if(T.isMesh){E.push(T);let{geometry:O,material:j}=T,I=new oO(O,j,h);I.position.copy(C),A&&(I.position.x+=A[0],I.position.y+=A[1],I.position.z+=A[2]),P.push(I)}});for(let T=0;T<h;T++){vh.set(m[T*3+0]-C.x,m[T*3+1]-C.y,m[T*3+2]-C.z),Nu.identity(),f&&g?(fa.set(f[T*3+0],f[T*3+1],f[T*3+2]),ga.set(g[T*3+0],g[T*3+1],g[T*3+2]),Bu.crossVectors(ga,fa).normalize(),ba.makeBasis(ga,fa,Bu),Nu.setFromRotationMatrix(ba)):x&&_&&(LM(x[T*2+0],x[T*2+1],65535,fa),LM(_[T*2+0],_[T*2+1],65535,ga),Bu.crossVectors(ga,fa).normalize(),ba.makeBasis(ga,fa,Bu),Nu.setFromRotationMatrix(ba)),ju.set(1,1,1),v&&ju.set(v[T*3+0],v[T*3+1],v[T*3+2]),R&&ju.multiplyScalar(R[T]);for(let O=0,j=P.length;O<j;O++){let I=P[O];yh.copy(Nu),w&&(I.updateMatrixWorld(),DM.copy(vh).applyMatrix4(I.matrixWorld),this.ellipsoid.getPositionToCartographic(DM,xh),this.ellipsoid.getEastNorthUpFrame(xh.lat,xh.lon,OM),yh.setFromRotationMatrix(OM)),ba.compose(vh,yh,ju).multiply(p);let N=E[O];kM.multiplyMatrices(ba,N.matrixWorld),I.setMatrixAt(T,kM)}}c.scene.clear(),c.scene.add(...P),c.batchTable=n,c.featureTable=r,c.scene.batchTable=n,c.scene.featureTable=r,o(c)},a)})})}},WM=class extends fh{constructor(e=Gu){super(),this.manager=e,this.adjustmentTransform=new Wt,this.ellipsoid=Qs.clone()}parse(e){let t=super.parse(e),{manager:r,ellipsoid:n,adjustmentTransform:i}=this,o=[];for(let a in t.tiles){let{type:s,buffer:l}=t.tiles[a];switch(s){case"b3dm":{let d=l.slice(),u=new Ah(r);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.adjustmentTransform.copy(i);let p=u.parse(d.buffer);o.push(p);break}case"pnts":{let d=l.slice(),u=new Rh(r);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions;let p=u.parse(d.buffer);o.push(p);break}case"i3dm":{let d=l.slice(),u=new Dh(r);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.ellipsoid.copy(n),u.adjustmentTransform.copy(i);let p=u.parse(d.buffer);o.push(p);break}}}return Promise.all(o).then(a=>{let s=new Ph;return a.forEach(l=>{s.add(l.scene)}),{tiles:a,scene:s}})}},Xs=new Wt,xO=class extends Ph{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new Wt}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?Xs.copy(this.matrix):Xs.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=Xs.elements,r=this.matrixWorld.elements,n=!1;for(let i=0;i<16;i++){let o=t[i],a=r[i];if(Math.abs(o-a)>2**-52){n=!0;break}}if(n){this.matrixWorld.copy(Xs),this.matrixWorldInverse.copy(Xs).invert();let i=this.children;for(let l=0,d=i.length;l<d;l++)i[l].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:a,visibleTiles:s}=o;a.forEach(l=>{s.has(l)||l.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},wO=new Th;function MO(e,t,r,n){let{scene:i}=e.engineData;r.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,i,t,n))||t.intersectObject(i,!0,n)}function SO(e){return"traversal"in e}function qM(e,t,r,n,i=null){if(!SO(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:s}=t.engineData;if(i===null&&(i=wO,i.copy(r.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!s.intersectsRay(i))return;a.has(t)&&MO(t,r,e,n);let l=t.children;for(let d=0,u=l.length;d<u;d++)qM(e,l[d],r,n,i)}var zu=new Ve,Vu=new Ve,gr=new Ve,Fu=new Th,Sh=class{constructor(e=new FM,t=new Wt){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new Wt,this.points=Array(8).fill().map(()=>new Ve),this.planes=[,,,,,,].fill().map(()=>new lO)}copy(e){return this.box.copy(e.box),this.transform.copy(e.transform),this.update(),this}clone(){return new this.constructor().copy(this)}clampPoint(e,t){return t.copy(e).applyMatrix4(this.inverseTransform).clamp(this.box.min,this.box.max).applyMatrix4(this.transform)}distanceToPoint(e){return this.clampPoint(e,gr).distanceTo(e)}containsPoint(e){return gr.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(gr)}intersectsRay(e){return Fu.copy(e).applyMatrix4(this.inverseTransform),Fu.intersectsBox(this.box)}intersectRay(e,t){return Fu.copy(e).applyMatrix4(this.inverseTransform),Fu.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:r,box:n}=this;t.copy(r).invert();let{min:i,max:o}=n,a=0;for(let s=-1;s<=1;s+=2)for(let l=-1;l<=1;l+=2)for(let d=-1;d<=1;d+=2)e[a].set(s<0?i.x:o.x,l<0?i.y:o.y,d<0?i.z:o.z).applyMatrix4(r),a++;this.updatePlanes()}updatePlanes(){zu.copy(this.box.min).applyMatrix4(this.transform),Vu.copy(this.box.max).applyMatrix4(this.transform),gr.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(gr,zu),this.planes[1].setFromNormalAndCoplanarPoint(gr,Vu).negate(),gr.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(gr,zu),this.planes[3].setFromNormalAndCoplanarPoint(gr,Vu).negate(),gr.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(gr,zu),this.planes[5].setFromNormalAndCoplanarPoint(gr,Vu).negate()}intersectsSphere(e){return this.clampPoint(e.center,gr),gr.distanceToSquared(e.center)<=e.radius*e.radius}intersectsFrustum(e){return this._intersectsPlaneShape(e.planes,e.points)}intersectsOBB(e){return this._intersectsPlaneShape(e.planes,e.points)}_intersectsPlaneShape(e,t){let r=this.points,n=this.planes;for(let i=0;i<6;i++){let o=e[i],a=-1/0;for(let s=0;s<8;s++){let l=r[s],d=o.distanceToPoint(l);a=a<d?d:a}if(a<0)return!1}for(let i=0;i<6;i++){let o=n[i],a=-1/0;for(let s=0;s<8;s++){let l=t[s],d=o.distanceToPoint(l);a=a<d?d:a}if(a<0)return!1}return!0}},Ks=Math.PI,wh=Ks/2,$s=new Ve,yo=new Ve,Yr=new Ve,ke=new Ve,dr=new Wt,CO=new FM,IM=new Wt;function Pi(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function BM(e){return e.x!==e.y}var XM=class extends kh{constructor(e=1,t=1,r=1,n=-wh,i=wh,o=0,a=2*Ks,s=0,l=0){super(e,t,r),this.latStart=n,this.latEnd=i,this.lonStart=o,this.lonEnd=a,this.heightStart=s,this.heightEnd=l}getBoundingBox(e,t){BM(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:r,latEnd:n,lonStart:i,lonEnd:o,heightStart:a,heightEnd:s}=this,l=(r+n)*.5,d=(i+o)*.5,u=r>0,p=n<0,c;c=u?r:p?n:0;let{min:h,max:m}=e;h.setScalar(1/0),m.setScalar(-1/0),o-i<=Ks?(this.getCartographicToNormal(l,d,Yr),yo.set(0,0,1),$s.crossVectors(yo,Yr).normalize(),yo.crossVectors(Yr,$s).normalize(),t.makeBasis($s,yo,Yr),dr.copy(t).invert(),this.getCartographicToPosition(c,i,s,ke).applyMatrix4(dr),m.x=Math.abs(ke.x),h.x=-m.x,this.getCartographicToPosition(n,i,s,ke).applyMatrix4(dr),m.y=ke.y,this.getCartographicToPosition(n,d,s,ke).applyMatrix4(dr),m.y=Math.max(ke.y,m.y),this.getCartographicToPosition(r,i,s,ke).applyMatrix4(dr),h.y=ke.y,this.getCartographicToPosition(r,d,s,ke).applyMatrix4(dr),h.y=Math.min(ke.y,h.y),this.getCartographicToPosition(l,d,s,ke).applyMatrix4(dr),m.z=ke.z,this.getCartographicToPosition(r,i,a,ke).applyMatrix4(dr),h.z=ke.z,this.getCartographicToPosition(n,i,a,ke).applyMatrix4(dr),h.z=Math.min(ke.z,h.z)):(this.getCartographicToPosition(c,d,s,Yr),Yr.z=0,Yr.length()<1e-10?Yr.set(1,0,0):Yr.normalize(),yo.set(0,0,1),$s.crossVectors(Yr,yo).normalize(),t.makeBasis($s,yo,Yr),dr.copy(t).invert(),this.getCartographicToPosition(c,d+wh,s,ke).applyMatrix4(dr),m.x=Math.abs(ke.x),h.x=-m.x,this.getCartographicToPosition(n,0,p?a:s,ke).applyMatrix4(dr),m.y=ke.y,this.getCartographicToPosition(r,0,u?a:s,ke).applyMatrix4(dr),h.y=ke.y,this.getCartographicToPosition(c,d,s,ke).applyMatrix4(dr),m.z=ke.z,this.getCartographicToPosition(c,o,s,ke).applyMatrix4(dr),h.z=ke.z),e.getCenter(ke),e.min.sub(ke).multiplyScalar(1.0000000000001),e.max.sub(ke).multiplyScalar(1.0000000000001),ke.applyMatrix4(t),t.setPosition(ke)}getBoundingSphere(e){BM(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(CO,IM),e.center.setFromMatrixPosition(IM),e.radius=0;let{latStart:t,latEnd:r,lonStart:n,lonEnd:i,heightStart:o,heightEnd:a}=this,s=(t+r)*.5,l=(n+i)*.5,d=t>0,u=r<0,p;p=d?t:u?r:0,this.getCartographicToPosition(p,n,a,ke),Pi(ke,e),this.getCartographicToPosition(r,n,a,ke),Pi(ke,e),this.getCartographicToPosition(r,l,a,ke),Pi(ke,e),this.getCartographicToPosition(t,n,a,ke),Pi(ke,e),this.getCartographicToPosition(t,l,a,ke),Pi(ke,e),this.getCartographicToPosition(s,l,a,ke),Pi(ke,e),this.getCartographicToPosition(t,n,o,ke),Pi(ke,e),i-n>Ks&&(this.getCartographicToPosition(p,l+Ks,a,ke),Pi(ke,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Un=new Ve,Gn=new Ve,Hn=new Ve,NM=new Ve,jM=new Ve,PO=class{constructor(){this.sphere=null,this.obb=null,this.region=null,this.regionObb=null}intersectsRay(e){let t=this.sphere,r=this.obb||this.regionObb;return!(t&&!e.intersectsSphere(t)||r&&!r.intersectsRay(e))}intersectRay(e,t=null){let r=this.sphere,n=this.obb||this.regionObb,i=-1/0,o=-1/0;r&&e.intersectSphere(r,NM)&&(i=r.containsPoint(e.origin)?0:e.origin.distanceToSquared(NM)),n&&n.intersectRay(e,jM)&&(o=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(jM));let a=Math.max(i,o);return a===-1/0?null:(e.at(Math.sqrt(a),t),t)}distanceToPoint(e){let t=this.sphere,r=this.obb||this.regionObb,n=-1/0,i=-1/0;return t&&(n=Math.max(t.distanceToPoint(e),0)),r&&(i=r.distanceToPoint(e)),n>i?n:i}intersectsFrustum(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!e.intersectsSphere(r)||t&&!t.intersectsFrustum(e)?!1:!!(r||t)}intersectsSphere(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!r.intersectsSphere(e)||t&&!t.intersectsSphere(e)?!1:!!(r||t)}intersectsOBB(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!e.intersectsSphere(r)||t&&!t.intersectsOBB(e)?!1:!!(r||t)}getOBB(e,t){let r=this.obb||this.regionObb;r?(e.copy(r.box),t.copy(r.transform)):(this.getAABB(e),t.identity())}getAABB(e){if(this.sphere)this.sphere.getBoundingBox(e);else{let t=this.obb||this.regionObb;e.copy(t.box).applyMatrix4(t.transform)}}getSphere(e){if(this.sphere)e.copy(this.sphere);else if(this.region)this.region.getBoundingSphere(e);else{let t=this.obb||this.regionObb;t.box.getBoundingSphere(e),e.applyMatrix4(t.transform)}}setObbData(e,t){let r=new Sh;Un.set(e[3],e[4],e[5]),Gn.set(e[6],e[7],e[8]),Hn.set(e[9],e[10],e[11]);let n=Un.length(),i=Gn.length(),o=Hn.length();Un.normalize(),Gn.normalize(),Hn.normalize(),n===0&&Un.crossVectors(Gn,Hn),i===0&&Gn.crossVectors(Un,Hn),o===0&&Hn.crossVectors(Un,Gn),r.transform.set(Un.x,Gn.x,Hn.x,e[0],Un.y,Gn.y,Hn.y,e[1],Un.z,Gn.z,Hn.z,e[2],0,0,0,1).premultiply(t),r.box.min.set(-n,-i,-o),r.box.max.set(n,i,o),r.update(),this.obb=r}setSphereData(e,t,r,n,i){let o=new HM;o.center.set(e,t,r),o.radius=n,o.applyMatrix4(i),this.sphere=o}setRegionData(e,t,r,n,i,o,a){let s=new XM(...e.radius,r,i,t,n,o,a),l=new Sh;s.getBoundingBox(l.box,l.transform),l.update(),this.region=s,this.regionObb=l}},TO=new sO;function _O(e,t,r,n){let i=TO.set(e.normal.x,e.normal.y,e.normal.z,t.normal.x,t.normal.y,t.normal.z,r.normal.x,r.normal.y,r.normal.z);return n.set(-e.constant,-t.constant,-r.constant),n.applyMatrix3(i.invert()),n}var EO=class extends iO{constructor(){super(),this.points=Array(8).fill().map(()=>new Ve)}setFromProjectionMatrix(...e){return super.setFromProjectionMatrix(...e),this.calculateFrustumPoints(),this}calculateFrustumPoints(){let{planes:e,points:t}=this;[[e[0],e[3],e[4]],[e[1],e[3],e[4]],[e[0],e[2],e[4]],[e[1],e[2],e[4]],[e[0],e[3],e[5]],[e[1],e[3],e[5]],[e[0],e[2],e[5]],[e[1],e[2],e[5]]].forEach((r,n)=>{_O(r[0],r[1],r[2],t[n])})}};var Ch=0;function zM(e,t,r,n){try{return pO.getByteLength(e,t,r,n)}catch{return Ch}}function AO(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??Ch;let{format:t,type:r,image:n,mipmaps:i}=e;if(e.isCompressedTexture&&Array.isArray(i)&&i.length>0){let a=0;for(let s of i)s?.data?.byteLength?a+=s.data.byteLength:a+=zM(s.width,s.height,t,r);return a}if(!n)return Ch;let o=zM(n.width,n.height,t,r);return o*=e.generateMipmaps?4/3:1,o}function RO(e){let t=new Set,r=0;return e.traverse(n=>{if(n.geometry&&!t.has(n.geometry)&&(r+=mO(n.geometry),t.add(n.geometry)),n.material){let i=n.material;for(let o in i){let a=i[o];a&&a.isTexture&&!t.has(a)&&(r+=AO(a),t.add(a))}}}),r}var $M=Symbol("INITIAL_FRUSTUM_CULLED"),Uu=new Wt,Ys=new Ve,Mh=new _h,kO=new Ve(1,0,0),DO=new Ve(0,1,0),OO=()=>null;function VM(e,t){e.traverse(r=>{r.frustumCulled=r[$M]&&t})}var Oh=class extends uh{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{VM(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new xO(this),this.ellipsoid=Qs.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new Wt,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new aO,this._listeners={}}addEventListener(e,t){Lu.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return Lu.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){Lu.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){Lu.prototype.dispatchEvent.call(this,e)}getBoundingBox(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getAABB(e),!0):!1}getOrientedBoundingBox(e,t){if(!this.root)return!1;let r=this.root.engineData.boundingVolume;return r?(r.getOBB(e,t),!0):!1}getBoundingSphere(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getSphere(e),!0):!1}forEachLoadedModel(e){this.traverse(t=>{let r=t.engineData&&t.engineData.scene;r&&e(r,t)},null,!1)}raycast(e,t){if(this.root)if(this.accelerateRaycast)qM(this,this.root,e,t);else{let r=e.firstHitOnly?[]:t;for(let n of this.activeTiles){let{scene:i}=n.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(n,i,e,r))||e.intersectObject(i,!0,r)}e.firstHitOnly&&r.length>0&&(r.sort((n,i)=>n.distance-i.distance),t.push(r[0]))}}hasCamera(e){return this.cameraMap.has(e)}setCamera(e){let t=this.cameras,r=this.cameraMap;return r.has(e)?!1:(r.set(e,new _h),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,r){let n=this.cameraMap;if(!n.has(e))return!1;let i=t.isVector2?t.x:t,o=t.isVector2?t.y:r,a=n.get(e);return(a.width!==i||a.height!==o)&&(a.set(i,o),this.dispatchEvent({type:"camera-resolution-change"})),!0}getResolution(e,t){let r=this.cameraMap.get(e);return r?t.copy(r):null}setResolutionFromRenderer(e,t){return t.getSize(Mh),this.setResolution(e,Mh.x,Mh.y)}deleteCamera(e){let t=this.cameras,r=this.cameraMap;if(r.has(e)){let n=t.indexOf(e);return t.splice(n,1),r.delete(e),this.dispatchEvent({type:"delete-camera",camera:e}),!0}return!1}loadRootTileset(...e){return super.loadRootTileset(...e).then(t=>{let{asset:r,extensions:n={}}=t;switch((r&&r.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(DO,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(kO,Math.PI/2);break}if("3DTILES_ellipsoid"in n){let i=n["3DTILES_ellipsoid"],{ellipsoid:o}=this;o.name=i.body,i.radii?o.radius.set(...i.radii):o.radius.set(1,1,1)}return t})}prepareForTraversal(){let e=this.group,t=this.cameras,r=this.cameraMap,n=this.cameraInfo;for(;n.length>t.length;)n.pop();for(;n.length<t.length;)n.push({frustum:new EO,isOrthographic:!1,sseDenominator:-1,position:new Ve,invScale:-1,pixelSize:0});Ys.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(Ys.x-Ys.y,Ys.x-Ys.z))>1e-6&&console.warn("ThreeTilesRenderer : Non uniform scale used for tile which may cause issues when calculating screen space error.");for(let i=0,o=n.length;i<o;i++){let a=t[i],s=n[i],l=s.frustum,d=s.position,u=r.get(a);(u.width===0||u.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let p=a.projectionMatrix.elements;if(s.isOrthographic=p[15]===1,s.isOrthographic){let c=2/p[0],h=2/p[5];s.pixelSize=Math.max(h/u.height,c/u.width)}else s.sseDenominator=2/p[5]/u.height;Uu.copy(e.matrixWorld),Uu.premultiply(a.matrixWorldInverse),Uu.premultiply(a.projectionMatrix),l.setFromProjectionMatrix(Uu,a.coordinateSystem,a.reversedDepth),d.set(0,0,0),d.applyMatrix4(a.matrixWorld),d.applyMatrix4(e.matrixWorldInverse)}}update(){if(super.update(),this.cameras.length===0&&this.root){let e=!1;this.invokeAllPlugins(t=>e||(e=!!(t!==this&&t.calculateTileViewError))),e===!1&&console.warn("TilesRenderer: no cameras defined. Cannot update 3d tiles.")}}preprocessNode(e,t,r=null){super.preprocessNode(e,t,r);let n=new Wt;if(e.transform){let a=e.transform;for(let s=0;s<16;s++)n.elements[s]=a[s]}r&&n.premultiply(r.engineData.transform);let i=new Wt().copy(n).invert(),o=new PO;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,n),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,n),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=n,e.engineData.transformInverse=i,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=OO}async parseTile(e,t,r,n,i){let o=t.engineData,a=Du(n),s=this.fetchOptions,l=this.manager,d=null,u=o.transform,p=this._upRotationMatrix,c=(go(e)||r).toLowerCase();switch(c){case"b3dm":{let g=new Ah(l);g.workingPath=a,g.fetchOptions=s,g.adjustmentTransform.copy(p),d=g.parse(e);break}case"pnts":{let g=new Rh(l);g.workingPath=a,g.fetchOptions=s,d=g.parse(e);break}case"i3dm":{let g=new Dh(l);g.workingPath=a,g.fetchOptions=s,g.adjustmentTransform.copy(p),g.ellipsoid.copy(this.ellipsoid),d=g.parse(e);break}case"cmpt":{let g=new WM(l);g.workingPath=a,g.fetchOptions=s,g.adjustmentTransform.copy(p),g.ellipsoid.copy(this.ellipsoid),d=g.parse(e).then(x=>x.scene);break}case"gltf":case"glb":{let g=l.getHandler("path.gltf")||l.getHandler("path.glb")||new Eh(l);g.setWithCredentials(s.credentials==="include"),g.setRequestHeader(s.headers||{}),s.credentials==="include"&&s.mode==="cors"&&g.setCrossOrigin("use-credentials");let x=g.resourcePath||g.path||a;!/[\\/]$/.test(x)&&x.length&&(x+="/"),d=g.parseAsync(e,x).then(_=>{_.scene=_.scene||new Ph;let{scene:v}=_;return v.updateMatrix(),v.matrix.multiply(p).decompose(v.position,v.quaternion,v.scale),_});break}default:d=this.invokeOnePlugin(g=>g.parseToMesh&&g.parseToMesh(e,t,r,n,i));break}let h=await d;if(h===null)throw Error(`TilesRenderer: Content type "${c}" not supported.`);let m,b;h.isObject3D?(m=h,b=null):(m=h.scene,b=h),m.updateMatrix(),m.matrix.premultiply(u),m.matrix.decompose(m.position,m.quaternion,m.scale),await this.invokeAllPlugins(g=>g.processTileModel&&g.processTileModel(m,t)),m.traverse(g=>{g[$M]=g.frustumCulled,g.userData.tile=t}),VM(m,!this.autoDisableRendererCulling);let y=[],S=[],f=[];if(m.traverse(g=>{if(g.geometry&&S.push(g.geometry),g.material){let x=g.material;y.push(g.material);for(let _ in x){let v=x[_];v&&v.isTexture&&f.push(v)}}}),i.aborted){for(let g=0,x=f.length;g<x;g++){let _=f[g];_.image instanceof ImageBitmap&&_.image.close(),_.dispose()}return}o.materials=y,o.geometry=S,o.textures=f,o.scene=m,o.metadata=b}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let r=t.materials,n=t.geometry,i=t.textures,o=t.scene.parent;t.scene.traverse(a=>{a.userData.meshFeatures&&a.userData.meshFeatures.dispose(),a.userData.structuralMetadata&&a.userData.structuralMetadata.dispose()});for(let a=0,s=n.length;a<s;a++)n[a].dispose();for(let a=0,s=r.length;a<s;a++)r[a].dispose();for(let a=0,s=i.length;a<s;a++){let l=i[a];l.image instanceof ImageBitmap&&l.image.close(),l.dispose()}o&&o.remove(t.scene),t.scene=null,t.materials=null,t.textures=null,t.geometry=null,t.metadata=null}}setTileActive(e,t){super.setTileActive(e,t);let r=e.engineData.scene;r&&(t?(r.parent=this.group,r.updateMatrixWorld(!0)):r.parent=null)}setTileVisible(e,t){let r=e.engineData.scene,{activeTiles:n,group:i}=this;r&&(t?i.add(r):(i.remove(r),n.has(e)&&(r.parent=i))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let r=this._bytesUsed;return!r.has(e)&&t&&r.set(e,RO(t)),r.get(e)??null}calculateTileViewError(e,t){let r=e.engineData,n=this.cameras,i=this.cameraInfo,o=r.boundingVolume,a=!1,s=0,l=1/0,d=0,u=1/0;for(let p=0,c=n.length;p<c;p++){let h=i[p],m,b;if(h.isOrthographic){let S=h.pixelSize;m=e.geometricError/S,b=1/0}else{let S=h.sseDenominator;b=o.distanceToPoint(h.position),m=b===0?1/0:e.geometricError/(b*S)}let y=i[p].frustum;o.intersectsFrustum(y)&&(a=!0,s=Math.max(s,m),l=Math.min(l,b)),d=Math.max(d,m),u=Math.min(u,b)}a?(t.inView=!0,t.error=s,t.distanceFromCamera=l):(t.inView=!1,t.error=d,t.distanceFromCamera=u)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as p4,Box2 as LO,Box3 as m4,Box3Helper as h4,BoxGeometry as f4,BufferAttribute as Bh,BufferGeometry as g4,CanvasTexture as b4,Color as v4,CustomBlending as IO,DataTexture as BO,DefaultLoadingManager as y4,DoubleSide as x4,EventDispatcher as w4,FileLoader as NO,FloatType as M4,Frustum as S4,GreaterDepth as C4,Group as P4,LineBasicMaterial as T4,LineSegments as _4,LinearFilter as jO,LinearMipMapLinearFilter as E4,MathUtils as Nh,Matrix2 as zO,Matrix3 as VO,Matrix4 as FO,Mesh as A4,MeshBasicMaterial as UO,MeshLambertMaterial as R4,MeshStandardMaterial as k4,OneFactor as GO,PlaneGeometry as D4,Points as O4,PointsMaterial as L4,Quaternion as I4,REVISION as B4,RGFormat as N4,Ray as j4,Raycaster as z4,RedFormat as V4,SRGBColorSpace as F4,ShaderMaterial as HO,Source as U4,Sphere as G4,SphereGeometry as H4,Texture as W4,TextureUtils as q4,Triangle as X4,UnsignedByteType as $4,Vector2 as Kr,Vector3 as uS,Vector4 as WO,WebGLArrayRenderTarget as Y4,WebGLRenderTarget as YM,WebGLRenderer as qO,ZeroFactor as XO}from"three";import{GLTFLoader as $O}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as dS}from"three/addons/postprocessing/Pass.js";var J4=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var KM=new bn;KM.maxJobs=10,KM.priorityCallback=(e,t)=>{let r=e.tile,n=t.tile,i=r.internal.renderer,o=n.internal.renderer,a=i.visibleTiles.has(r);return a===o.visibleTiles.has(n)?ma(r,n):a?1:-1};var QM=new uS;function Js(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let r=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,n=new Bh(new t(e.count*e.itemSize),e.itemSize,!0),i=e.itemSize,o=e.count;for(let a=0;a<o;a++)for(let s=0;s<i;s++){let l=Nh.clamp(e.getComponent(a,s),r,1);n.setComponent(a,s,l)}return n}function YO(e,t=Int16Array){let r=e.geometry,n=r.attributes,i=n.position;if(i.isInterleavedBufferAttribute||i.array instanceof t)return i;let o=new Bh(new t(i.count*i.itemSize),i.itemSize,!1),a=i.itemSize,s=i.count;r.computeBoundingBox();let l=r.boundingBox,{min:d,max:u}=l,p=2**(8*t.BYTES_PER_ELEMENT-1)-1,c=-p;for(let h=0;h<s;h++)for(let m=0;m<a;m++){let b=m===0?"x":m===1?"y":"z",y=d[b],S=u[b],f=Nh.mapLinear(i.getComponent(h,m),y,S,c,p);o.setComponent(h,m,f)}l.getCenter(QM).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(QM),e.scale.x*=.5*(u.x-d.x)/p,e.scale.y*=.5*(u.y-d.y)/p,e.scale.z*=.5*(u.z-d.z)/p,n.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var jh=class{constructor(e){this._options={generateNormals:!1,disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!1,uvType:Int8Array,normalType:Int8Array,positionType:Int16Array,...e},this.name="TILES_COMPRESSION_PLUGIN",this.priority=-100}processTileModel(e,t){let{generateNormals:r,disableMipmaps:n,compressIndex:i,compressUvs:o,compressNormals:a,compressPosition:s,uvType:l,normalType:d,positionType:u}=this._options;e.traverse(p=>{if(p.material&&n){let c=p.material;for(let h in c){let m=c[h];m&&m.isTexture&&m.generateMipmaps&&(m.generateMipmaps=!1,m.minFilter=jO)}}if(p.geometry){let c=p.geometry,h=c.attributes;if(o){let{uv:m,uv1:b,uv2:y,uv3:S}=h;m&&(h.uv=Js(m,l)),b&&(h.uv1=Js(b,l)),y&&(h.uv2=Js(y,l)),S&&(h.uv3=Js(S,l))}if(r&&!h.normals&&c.computeVertexNormals(),a&&h.normals&&(h.normals=Js(h.normals,d)),s&&YO(p,u),i&&c.index){let m=h.position.count,b=c.index,y=m>65535?Uint32Array:m>255?Uint16Array:Uint8Array;if(!(b.array instanceof y)){let S=new y(c.index.count);S.set(b.array);let f=new Bh(S,1);c.setIndex(f)}}}})}};function qt(e,t,r){return e&&t in e?e[t]:r}function pS(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function KO(e){return/^FLOAT/.test(e)}function rl(e){return/^VEC/.test(e)}function nl(e){return/^MAT/.test(e)}function mS(e,t,r,n=null){return nl(r)||rl(r)?n.fromArray(e,t):e[t]}function Lh(e){let{type:t,componentType:r}=e;switch(t){case"SCALAR":return r==="INT64"?0n:0;case"VEC2":return new Kr;case"VEC3":return new uS;case"VEC4":return new WO;case"MAT2":return new zO;case"MAT3":return new VO;case"MAT4":return new FO;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function JM(e,t){if(t==null)return!1;switch(e){case"SCALAR":return typeof t=="number"||typeof t=="bigint";case"VEC2":return t.isVector2;case"VEC3":return t.isVector3;case"VEC4":return t.isVector4;case"MAT2":return t.isMatrix2;case"MAT3":return t.isMatrix3;case"MAT4":return t.isMatrix4;case"BOOLEAN":return typeof t=="boolean";case"STRING":return typeof t=="string";case"ENUM":return typeof t=="number"||typeof t=="bigint"}throw Error("ClassProperty: invalid type.")}function tl(e,t=null){switch(e){case"INT8":return Int8Array;case"INT16":return Int16Array;case"INT32":return Int32Array;case"INT64":return BigInt64Array;case"UINT8":return Uint8Array;case"UINT16":return Uint16Array;case"UINT32":return Uint32Array;case"UINT64":return BigUint64Array;case"FLOAT32":return Float32Array;case"FLOAT64":return Float64Array}switch(t){case"BOOLEAN":return Uint8Array;case"STRING":return Uint8Array}throw Error("ClassProperty: invalid type.")}function QO(e,t=null){if(e.array){t=t&&Array.isArray(t)?t:[],t.length=e.count;for(let r=0,n=t.length;r<n;r++)t[r]=Hu(e,t[r])}else t=Hu(e,t);return t}function Hu(e,t=null){let r=e.default,n=e.type;if(t||(t=Lh(e)),r===null){switch(n){case"SCALAR":return 0;case"VEC2":return t.set(0,0);case"VEC3":return t.set(0,0,0);case"VEC4":return t.set(0,0,0,0);case"MAT2":return t.identity();case"MAT3":return t.identity();case"MAT4":return t.identity();case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return""}throw Error("ClassProperty: invalid type.")}else if(nl(n))t.fromArray(r);else if(rl(n))t.fromArray(r);else return r}function JO(e,t){if(e.noData===null)return t;let r=e.noData,n=e.type;if(Array.isArray(t))for(let a=0,s=t.length;a<s;a++)t[a]=i(t[a]);else t=i(t);return t;function i(a){return o(a)&&(a=Hu(e,a)),a}function o(a){if(nl(n)){let s=a.elements;for(let l=0,d=r.length;l<d;l++)if(r[l]!==s[l])return!1;return!0}else if(rl(n)){for(let s=0,l=r.length;s<l;s++)if(r[s]!==a.getComponent(s))return!1;return!0}else return r===a}}function ZO(e,t){switch(e){case"INT8":return Math.max(t/127,-1);case"INT16":return Math.max(t,32767,-1);case"INT32":return Math.max(t/2147483647,-1);case"INT64":return Math.max(Number(t)/9223372036854776e3,-1);case"UINT8":return t/255;case"UINT16":return t/65535;case"UINT32":return t/4294967295;case"UINT64":return Number(t)/18446744073709552e3}}function eL(e,t){let{type:r,componentType:n,scale:i,offset:o,normalized:a}=e;if(Array.isArray(t))for(let p=0,c=t.length;p<c;p++)t[p]=s(t[p]);else t=s(t);return t;function s(p){return p=nl(r)?d(p):rl(r)?l(p):u(p),p}function l(p){return p.x=u(p.x),p.y=u(p.y),"z"in p&&(p.z=u(p.z)),"w"in p&&(p.w=u(p.w)),p}function d(p){let c=p.elements;for(let h=0,m=c.length;h<m;h++)c[h]=u(c[h]);return p}function u(p){return a&&(p=ZO(n,p)),(a||KO(n))&&(p=p*i+o),p}}function zh(e,t,r=null){if(e.array){Array.isArray(t)||(t=Array(e.count||0)),t.length=r===null?e.count:r;for(let n=0,i=t.length;n<i;n++)JM(e.type,t[n])||(t[n]=Lh(e))}else JM(e.type,t)||(t=Lh(e));return t}function Wu(e,t){for(let r in t)r in e||delete t[r];for(let r in e){let n=e[r];t[r]=zh(n,t[r])}}function tL(e){switch(e){case"ENUM":return 1;case"SCALAR":return 1;case"VEC2":return 2;case"VEC3":return 3;case"VEC4":return 4;case"MAT2":return 4;case"MAT3":return 9;case"MAT4":return 16;case"BOOLEAN":return-1;case"STRING":return-1;default:return-1}}var Xu=class{constructor(e,t,r=null){this.name=t.name||null,this.description=t.description||null,this.type=t.type,this.componentType=t.componentType||null,this.enumType=t.enumType||null,this.array=t.array||!1,this.count=t.count||0,this.normalized=t.normalized||!1,this.offset=t.offset||0,this.scale=qt(t,"scale",1),this.max=qt(t,"max",1/0),this.min=qt(t,"min",-1/0),this.required=t.required||!1,this.noData=qt(t,"noData",null),this.default=qt(t,"default",null),this.semantic=qt(t,"semantic",null),this.enumSet=null,this.accessorProperty=r,r&&(this.offset=qt(r,"offset",this.offset),this.scale=qt(r,"scale",this.scale),this.max=qt(r,"max",this.max),this.min=qt(r,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=qt(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return zh(this,e,t)}resolveDefaultElement(e){return Hu(this,e)}resolveDefault(e){return QO(this,e)}resolveNoData(e){return JO(this,e)}resolveEnumsToStrings(e){let t=this.enumSet;if(this.type==="ENUM")if(Array.isArray(e))for(let n=0,i=e.length;n<i;n++)e[n]=r(e[n]);else e=r(e);return e;function r(n){let i=t.values.find(o=>o.value===n);return i===null?"":i.name}}adjustValueScaleOffset(e){return pS(this.type)?eL(this,e):e}},Vh=class{constructor(e,t={},r={},n=null){this.definition=e,this.class=t[e.class],this.className=e.class,this.enums=r,this.data=n,this.name="name"in e?e.name:null,this.properties=null}getPropertyNames(){return Object.keys(this.class.properties)}includesData(e){return!!this.definition.properties[e]}dispose(){}_initProperties(e=Xu){let t={};for(let r in this.class.properties)t[r]=new e(this.enums,this.class.properties[r],this.definition.properties[r]);this.properties=t}},rL=class extends Xu{constructor(e,t,r=null){super(e,t,r),this.attribute=r?.attribute??null}},nL=class extends Vh{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(rL)}getData(e,t,r={}){let n=this.properties;Wu(n,r);for(let i in n)r[i]=this.getPropertyValue(i,e,t,r[i]);return r}getPropertyValue(e,t,r,n=null){if(t>=this.count)throw Error("PropertyAttributeAccessor: Requested index is outside the range of the buffer.");let i=this.properties[e],o=i.type;if(!i)throw Error("PropertyAttributeAccessor: Requested class property does not exist.");if(!this.definition.properties[e])return i.resolveDefault(n);n=i.shapeToProperty(n);let a=r.getAttribute(i.attribute.toLowerCase());if(nl(o)){let s=n.elements;for(let l=s.length;0<l;)s[0]=a.getComponent(t,0)}else if(rl(o))n.fromBufferAttribute(a,t);else if(o==="SCALAR"||o==="ENUM")n=a.getX(t);else throw Error("StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.");return n=i.adjustValueScaleOffset(n),n=i.resolveEnumsToStrings(n),n=i.resolveNoData(n),n}},iL=class extends Xu{constructor(e,t,r=null){super(e,t,r),this.values=r?.values??null,this.valueLength=tL(this.type),this.arrayOffsets=qt(r,"arrayOffsets",null),this.stringOffsets=qt(r,"stringOffsets",null),this.arrayOffsetType=qt(r,"arrayOffsetType","UINT32"),this.stringOffsetType=qt(r,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let r=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:n,arrayOffsetType:i}=this,o=new(tl(i))(e[n]);r=o[t+1]-o[t]}return r}getIndexOffsetFromId(e,t){let r=t;if(this.arrayOffsets){let{arrayOffsets:n,arrayOffsetType:i}=this;r=new(tl(i))(e[n])[r]}else this.array&&(r*=this.count);return r}},oL=class extends Vh{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties(iL)}getData(e,t={}){let r=this.properties;Wu(r,t);for(let n in r)t[n]=this.getPropertyValue(n,e,t[n]);return t}_readValueAtIndex(e,t,r,n=null){let i=this.properties[e],{componentType:o,type:a}=i,s=this.data,l=s[i.values],d=new(tl(o,a))(l),u=i.getIndexOffsetFromId(s,t);if(pS(a)||a==="ENUM")return mS(d,(u+r)*i.valueLength,a,n);if(a==="STRING"){let p=u+r,c=0;if(i.stringOffsets!==null){let{stringOffsets:m,stringOffsetType:b}=i,y=new(tl(b))(s[m]);c=y[p+1]-y[p],p=y[p]}let h=new Uint8Array(d.buffer,p,c);n=new TextDecoder().decode(h)}else if(a==="BOOLEAN"){let p=u+r,c=Math.floor(p/8),h=p%8;n=(d[c]>>h&1)==1}return n}getPropertyValue(e,t,r=null){if(t>=this.count)throw Error("PropertyTableAccessor: Requested index is outside the range of the table.");let n=this.properties[e];if(!n)throw Error("PropertyTableAccessor: Requested property does not exist.");if(!this.definition.properties[e])return n.resolveDefault(r);let i=n.array,o=this.data,a=n.getArrayLengthFromId(o,t);if(r=n.shapeToProperty(r,a),i)for(let s=0,l=r.length;s<l;s++)r[s]=this._readValueAtIndex(e,t,s,r[s]);else r=this._readValueAtIndex(e,t,0,r);return r=n.adjustValueScaleOffset(r),r=n.resolveEnumsToStrings(r),r=n.resolveNoData(r),r}},Zs=new LO,ZM=class{constructor(){this._renderer=new qO,this._target=new YM(1,1),this._texTarget=new YM,this._quad=new dS(new HO({blending:IO,blendDst:XO,blendSrc:GO,uniforms:{map:{value:null},pixel:{value:new Kr}},vertexShader:`
64
+ void main() {
65
+
66
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
67
+
68
+ }
69
+ `,fragmentShader:`
70
+ uniform sampler2D map;
71
+ uniform ivec2 pixel;
72
+
73
+ void main() {
74
+
75
+ gl_FragColor = texelFetch( map, pixel, 0 );
76
+
77
+ }
78
+ `}))}increaseSizeTo(e){this._target.setSize(Math.max(this._target.width,e),1)}readDataAsync(e){let{_renderer:t,_target:r}=this;return t.readRenderTargetPixelsAsync(r,0,0,e.length/4,1,e)}readData(e){let{_renderer:t,_target:r}=this;t.readRenderTargetPixels(r,0,0,e.length/4,1,e)}renderPixelToTarget(e,t,r){let{_renderer:n,_target:i}=this;Zs.min.copy(t),Zs.max.copy(t),Zs.max.x+=1,Zs.max.y+=1,n.initRenderTarget(i),n.copyTextureToTexture(e,i.texture,Zs,r,0)}},_i=new class{constructor(){let e=null;Object.getOwnPropertyNames(ZM.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...r)=>(e||(e=new ZM),e[t](...r)))})}},eS=new Kr,tS=new Kr,rS=new Kr;function aL(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function hS(e,t,r=[,,,]){let n=3*t,i=3*t+1,o=3*t+2;return e.index&&(n=e.index.getX(n),i=e.index.getX(i),o=e.index.getX(o)),r[0]=n,r[1]=i,r[2]=o,r}function fS(e,t,r,n,i){let[o,a,s]=n,l=aL(e,t);eS.fromBufferAttribute(l,o),tS.fromBufferAttribute(l,a),rS.fromBufferAttribute(l,s),i.set(0,0,0).addScaledVector(eS,r.x).addScaledVector(tS,r.y).addScaledVector(rS,r.z)}function gS(e,t,r,n){let i=e.x-Math.floor(e.x),o=e.y-Math.floor(e.y),a=Math.floor(i*t%t),s=Math.floor(o*r%r);return n.set(a,s),n}var nS=new Kr,iS=new Kr,oS=new Kr,sL=class extends Xu{constructor(e,t,r=null){super(e,t,r),this.channels=qt(r,"channels",[0]),this.index=qt(r,"index",null),this.texCoord=qt(r,"texCoord",null),this.valueLength=parseInt(this.type.replace(/[^0-9]/g,""))||1}readDataFromBuffer(e,t,r=null){let n=this.type;if(n==="BOOLEAN"||n==="STRING")throw Error("PropertyTextureAccessor: BOOLEAN and STRING types not supported.");return mS(e,t*this.valueLength,n,r)}},lL=class extends Vh{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties(sL)}getData(e,t,r,n={}){let i=this.properties;Wu(i,n);let o=Object.keys(i),a=o.map(s=>n[s]);return this.getPropertyValuesAtTexel(o,e,t,r,a),o.forEach((s,l)=>n[s]=a[l]),n}async getDataAsync(e,t,r,n={}){let i=this.properties;Wu(i,n);let o=Object.keys(i),a=o.map(s=>n[s]);return await this.getPropertyValuesAtTexelAsync(o,e,t,r,a),o.forEach((s,l)=>n[s]=a[l]),n}getPropertyValuesAtTexelAsync(...e){this._asyncRead=!0;let t=this.getPropertyValuesAtTexel(...e);return this._asyncRead=!1,t}getPropertyValuesAtTexel(e,t,r,n,i=[]){for(;i.length<e.length;)i.push(null);i.length=e.length,_i.increaseSizeTo(i.length);let o=this.data,a=this.definition.properties,s=this.properties,l=hS(n,t);for(let p=0,c=e.length;p<c;p++){let h=e[p];if(!a[h])continue;let m=s[h],b=o[m.index];fS(n,m.texCoord,r,l,nS),gS(nS,b.image.width,b.image.height,iS),oS.set(p,0),_i.renderPixelToTarget(b,iS,oS)}let d=new Uint8Array(e.length*4);if(this._asyncRead)return _i.readDataAsync(d).then(()=>(u.call(this),i));return _i.readData(d),u.call(this),i;function u(){for(let p=0,c=e.length;p<c;p++){let h=e[p],m=s[h],b=m.type;if(i[p]=zh(m,i[p]),!m)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[h]){i[p]=m.resolveDefault(i);continue}let y=m.valueLength*(m.count||1),S=m.channels.map(x=>d[4*p+x]),f=m.componentType,g=new(tl(f,b))(y);if(new Uint8Array(g.buffer).set(S),m.array){let x=i[p];for(let _=0,v=x.length;_<v;_++)x[_]=m.readDataFromBuffer(g,_,x[_])}else i[p]=m.readDataFromBuffer(g,0,i[p]);i[p]=m.adjustValueScaleOffset(i[p]),i[p]=m.resolveEnumsToStrings(i[p]),i[p]=m.resolveNoData(i[p])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Ih=class{constructor(e,t,r,n=null,i=null){let{schema:o,propertyTables:a=[],propertyTextures:s=[],propertyAttributes:l=[]}=e,{enums:d,classes:u}=o,p=a.map(m=>new oL(m,u,d,r)),c=[],h=[];n&&(n.propertyTextures&&(c=n.propertyTextures.map(m=>new lL(s[m],u,d,t))),n.propertyAttributes&&(h=n.propertyAttributes.map(m=>new nL(l[m],u,d)))),this.schema=o,this.tableAccessors=p,this.textureAccessors=c,this.attributeAccessors=h,this.object=i,this.textures=t,this.nodeMetadata=n}getPropertyTableData(e,t,r=null){if(!Array.isArray(e))r||(r={}),r=this.tableAccessors[e].getData(t,r);else{r||(r=[]);let n=Math.min(e.length,t.length);r.length=n;for(let i=0;i<n;i++){let o=this.tableAccessors[e[i]];r[i]=o.getData(t[i],r[i])}}if(Array.isArray(e)!==Array.isArray(r)||Array.isArray(e)!==Array.isArray(t))throw Error("StructuralMetadata: Scalar and array inputs cannot be mixed.");return r}getPropertyTableInfo(e=null){if(e===null&&(e=this.tableAccessors.map((t,r)=>r)),Array.isArray(e))return e.map(t=>{let r=this.tableAccessors[t];return{name:r.name,className:r.definition.class}});{let t=this.tableAccessors[e];return{name:t.name,className:t.definition.class}}}getPropertyTextureData(e,t,r=[]){let n=this.textureAccessors;r.length=n.length;for(let i=0;i<n.length;i++)r[i]=n[i].getData(e,t,this.object.geometry,r[i]);return r}async getPropertyTextureDataAsync(e,t,r=[]){let n=this.textureAccessors;r.length=n.length;let i=[];for(let o=0;o<n.length;o++){let a=n[o].getDataAsync(e,t,this.object.geometry,r[o]).then(s=>{r[o]=s});i.push(a)}return await Promise.all(i),r}getPropertyTextureInfo(){return this.textureAccessors}getPropertyAttributeData(e,t=[]){let r=this.attributeAccessors;t.length=r.length;for(let n=0;n<r.length;n++)t[n]=r[n].getData(e,this.object.geometry,t[n]);return t}getPropertyAttributeInfo(){return this.attributeAccessors.map(e=>({name:e.name,className:e.definition.class}))}dispose(){this.textureAccessors.forEach(e=>e.dispose()),this.tableAccessors.forEach(e=>e.dispose()),this.attributeAccessors.forEach(e=>e.dispose())}},el="EXT_structural_metadata";function cL(e,t=[]){let r=e.json.textures?.length||0,n=Array(r).fill(null);return t.forEach(({properties:i})=>{for(let o in i){let{index:a}=i[o];n[a]===null&&(n[a]=e.loadTexture(a))}}),Promise.all(n)}function uL(e,t=[]){let r=e.json.bufferViews?.length||0,n=Array(r).fill(null);return t.forEach(({properties:i})=>{for(let o in i){let{values:a,arrayOffsets:s,stringOffsets:l}=i[o];n[a]===null&&(n[a]=e.getDependency("bufferView",a)),n[s]===null&&(n[s]=e.getDependency("bufferView",s)),n[l]===null&&(n[l]=e.getDependency("bufferView",l))}}),Promise.all(n)}var bS=class{constructor(e){this.parser=e,this.name=el}async afterRoot({scene:e,parser:t}){let r=t.json.extensionsUsed;if(!r||!r.includes(el))return;let n=null,i=t.json.extensions[el];if(i.schemaUri){let{manager:l,path:d,requestHeader:u,crossOrigin:p}=t.options,c=new URL(i.schemaUri,d).toString(),h=new NO(l);h.setCrossOrigin(p),h.setResponseType("json"),h.setRequestHeader(u),n=h.loadAsync(c).then(m=>{i={...i,schema:m}})}let[o,a]=await Promise.all([cL(t,i.propertyTextures),uL(t,i.propertyTables),n]),s=new Ih(i,o,a);e.userData.structuralMetadata=s,e.traverse(l=>{if(t.associations.has(l)){let{meshes:d,primitives:u}=t.associations.get(l),p=t.json.meshes[d]?.primitives[u];if(p&&p.extensions&&p.extensions[el]){let c=p.extensions[el];l.userData.structuralMetadata=new Ih(i,o,a,c,l)}else l.userData.structuralMetadata=s}})}},aS=new Kr,sS=new Kr,lS=new Kr;function dL(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var vS=class{constructor(e,t,r){this.geometry=e,this.textures=t,this.data=r,this._asyncRead=!1,this.featureIds=r.featureIds.map(n=>{let{texture:i,...o}=n,a={label:null,propertyTable:null,nullFeatureId:null,...o};return i&&(a.texture={texCoord:0,channels:[0],...i}),a})}getTextures(){return this.textures}getFeatureInfo(){return this.featureIds}getFeaturesAsync(...e){this._asyncRead=!0;let t=this.getFeatures(...e);return this._asyncRead=!1,t}getFeatures(e,t){let{geometry:r,textures:n,featureIds:i}=this,o=Array(i.length).fill(null),a=i.length;_i.increaseSizeTo(a);let s=hS(r,e),l=s[dL(t)];for(let p=0,c=i.length;p<c;p++){let h=i[p],m="nullFeatureId"in h?h.nullFeatureId:null;if("texture"in h){let b=n[h.texture.index];fS(r,h.texture.texCoord,t,s,aS),gS(aS,b.image.width,b.image.height,sS),lS.set(p,0),_i.renderPixelToTarget(n[h.texture.index],sS,lS)}else if("attribute"in h){let b=r.getAttribute(`_feature_id_${h.attribute}`).getX(l);b!==m&&(o[p]=b)}else{let b=l;b!==m&&(o[p]=b)}}let d=new Uint8Array(a*4);if(this._asyncRead)return _i.readDataAsync(d).then(()=>(u(),o));return _i.readData(d),u(),o;function u(){let p=new Uint32Array(1);for(let c=0,h=i.length;c<h;c++){let m=i[c],b="nullFeatureId"in m?m.nullFeatureId:null;if("texture"in m){let{channels:y}=m.texture,S=y.map(g=>d[4*c+g]);new Uint8Array(p.buffer).set(S);let f=p[0];f!==b&&(o[c]=f)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},qu="EXT_mesh_features";function cS(e,t,r){e.traverse(n=>{if(t.associations.has(n)){let{meshes:i,primitives:o}=t.associations.get(n),a=t.json.meshes[i]?.primitives[o];a&&a.extensions&&a.extensions[qu]&&r(n,a.extensions[qu])}})}var yS=class{constructor(e){this.parser=e,this.name=qu}async afterRoot({scene:e,parser:t}){let r=t.json.extensionsUsed;if(!r||!r.includes(qu))return;let n=t.json.textures?.length||0,i=Array(n).fill(null);cS(e,t,(a,{featureIds:s})=>{s.forEach(l=>{if(l.texture&&i[l.texture.index]===null){let d=l.texture.index;i[d]=t.loadTexture(d)}})});let o=await Promise.all(i);cS(e,t,(a,s)=>{a.userData.meshFeatures=new vS(a.geometry,o,s)})}},xS=class{constructor(){this.name="CESIUM_RTC"}afterRoot(e){if(e.parser.json.extensions&&e.parser.json.extensions.CESIUM_RTC){let{center:t}=e.parser.json.extensions.CESIUM_RTC;t&&(e.scene.position.x+=t[0],e.scene.position.y+=t[1],e.scene.position.z+=t[2])}}},Fh=class{constructor(e){e={metadata:!0,rtc:!0,plugins:[],dracoLoader:null,ktxLoader:null,meshoptDecoder:null,autoDispose:!0,...e},this.tiles=null,this.metadata=e.metadata,this.rtc=e.rtc,this.plugins=e.plugins,this.dracoLoader=e.dracoLoader,this.ktxLoader=e.ktxLoader,this.meshoptDecoder=e.meshoptDecoder,this._gltfRegex=/\.(gltf|glb)$/g,this._dracoRegex=/\.drc$/g,this._loader=null}init(e){let t=new $O(e.manager);this.dracoLoader&&(t.setDRACOLoader(this.dracoLoader),e.manager.addHandler(this._dracoRegex,this.dracoLoader)),this.ktxLoader&&t.setKTX2Loader(this.ktxLoader),this.meshoptDecoder&&t.setMeshoptDecoder(this.meshoptDecoder),this.rtc&&t.register(()=>new xS),this.metadata&&(t.register(()=>new bS),t.register(()=>new yS)),this.plugins.forEach(r=>t.register(r)),e.manager.addHandler(this._gltfRegex,t),this.tiles=e,this._loader=t}dispose(){this.tiles.manager.removeHandler(this._gltfRegex),this.tiles.manager.removeHandler(this._dracoRegex),this.autoDispose&&(this.ktxLoader.dispose(),this.dracoLoader.dispose())}};var{clamp:Z4}=Nh;var eH=new dS(new UO),pL=new BO(new Uint8Array([255,255,255,255]),1,1);pL.needsUpdate=!0;var mL=0,hL=1,fL=2,gL=3,bL=4,vL=5,yL=6,xL=7,wL=8,ML=9,SL=10,CL=11,tH=Object.freeze({NONE:mL,SCREEN_ERROR:hL,GEOMETRIC_ERROR:fL,DISTANCE:gL,DEPTH:bL,RELATIVE_DEPTH:vL,IS_LEAF:yL,RANDOM_COLOR:xL,RANDOM_NODE_COLOR:wL,CUSTOM_COLOR:ML,LOAD_ORDER:SL,INDEXED_COLOR:CL});var rH=Math.PI/4,nH=3/5;var Ti={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var iH=new class{constructor(){this._cache={}}getColor(...e){let t=e.pop(),r=e.join("_"),{_cache:n}=this;return r in n||(t.setHSL(Math.random(),1,.5),n[r]=t.getHex()),t.set(n[r])}};var oH={[Ti.NONE]:16777215,[Ti.NOT_READY]:7829367,[Ti.NO_FIT]:2250239,[Ti.DEPTH]:4473924,[Ti.OCCUPANCY]:65535,[Ti.SPACING]:16776960,[Ti.ANGLE]:16711680,[Ti.FACING]:16711935};var aH=Math.PI/180;var sH=bo*Math.PI*2;var lH=bo*Math.PI*2;import{DRACOLoader as RL}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as kL}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as DL}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as OL,DoubleSide as LL,MathUtils as IL,Matrix4 as CS,Sphere as BL,Vector3 as NL}from"three";import{BufferAttribute as wS,MathUtils as PL}from"three";function MS(e){return!!e&&!e.isInterleavedBufferAttribute}function SS(e,t,r,n){for(let i=0;i<e.count;i+=1)for(let o=0;o<e.itemSize;o+=1)t.setComponent(i,o,PL.clamp(e.getComponent(i,o),r,n));return t}function TL(e){for(let t=0;t<e.count;t+=1)for(let r=0;r<e.itemSize;r+=1){let n=e.getComponent(t,r);if(!Number.isFinite(n)||n<0||n>1)return!1}return!0}var $u=class{constructor(){this.name="RI_VERTEX_COMPRESSION_PLUGIN";this.priority=-99}processTileModel(t){t.traverse(r=>{let n=r.geometry;if(!n)return;let i=n.attributes.normal;MS(i)&&!(i.array instanceof Int16Array)&&(n.attributes.normal=SS(i,new wS(new Int16Array(i.count*i.itemSize),i.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=n.attributes[o];!MS(a)||a.array instanceof Uint16Array||!TL(a)||(n.attributes[o]=SS(a,new wS(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as TS,jsxs as GL}from"react/jsx-runtime";var jL=0,PS=4,zL=6,VL=12,FL=4;function UL(e){try{let t=typeof window>"u"?new URL(e):new URL(e,window.location.href);return new URL("objects.json",t).toString()}catch{return null}}function Gh({diagnosticsRef:e,loadingRef:t,url:r,rotation:n=[0,0,0],errorTarget:i=64,cacheSize:o=800,memoryBudgetMB:a=800,decoderConfig:s,objectBindings:l,itemMaterials:d,sceneConfig:u,selectedItem:p,panelHoveredItem:c,highlightOnHover:h=!0,onItemClick:m,onItemHover:b,onItemDoubleClick:y,onItemContextMenu:S,onObjectCatalog:f,onTilesetBounds:g,onModelLoaded:x,onLoadError:_,nodeRefsOut:v,onNodeRefsChange:R,materialRefsOut:A,explodeFactor:w=0,suspendBindingTransforms:C=!1}){let{camera:P,gl:E,invalidate:T}=AL(),O=tr(null),[j,I]=Uh(null),N=tr({onItemClick:m,onItemHover:b,onItemDoubleClick:y,onObjectCatalog:f,onTilesetBounds:g,onModelLoaded:x,onLoadError:_,onNodeRefsChange:R});N.current={onItemClick:m,onItemHover:b,onItemDoubleClick:y,onObjectCatalog:f,onTilesetBounds:g,onModelLoaded:x,onLoadError:_,onNodeRefsChange:R};let D=tr(!0),[k,U]=Uh(null),te=tr(null);te.current=k;let re=tr([]),Z=tr(!1);Ai(()=>{let ee=new Su;return U(ee),()=>ee.dispose()},[r]);let ne=tr(null),X=tr(0),G=tr(!1),H=a*1024*1024,ae=tr(!1),xe=tr(ih),Ie=tr(null),q=tr(null),be=tr(null);Ai(()=>()=>{be.current!==null&&clearTimeout(be.current)},[]);let Pe=s?.dracoDecoderPath??My,pe=s?.ktx2TranscoderPath??Sy,ft=s?.meshopt??!0,[J,$e]=Uh(null);Ai(()=>{G.current=!1,ae.current=!1;let ee=new Oh(r);ee.loadAncestors=!0;let Me=new Au;Me.priorityCallback=ee.downloadQueue.priorityCallback,Me.maxJobsPerOrigin=VL;let Se=new bn;Se.priorityCallback=ee.parseQueue.priorityCallback,Se.maxJobs=zL;let je=new bn;je.priorityCallback=ee.processNodeQueue.priorityCallback,je.maxJobs=ee.processNodeQueue.maxJobs;let at=new Us;at.unloadPriorityCallback=ee.lruCache.unloadPriorityCallback,ee.downloadQueue=Me,ee.parseQueue=Se,ee.processNodeQueue=je,ee.lruCache=at;let Le=Pe?new RL().setDecoderPath(Pe).setWorkerLimit(FL):null,Te=pe?new kL().setTranscoderPath(pe).detectSupport(E):null;return ee.registerPlugin(new Fh({dracoLoader:Le,ktxLoader:Te,meshoptDecoder:ft?DL:null,autoDispose:!1})),ee.registerPlugin(new jh({disableMipmaps:!1,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),ee.registerPlugin(new $u),$e(ee),window.__riTiles=ee,()=>{ee.forEachLoadedModel(me=>ds(me)),ee.dispose(),Le?.dispose(),Te?.dispose(),$e(me=>me===ee?null:me)}},[Pe,E,pe,ft,r]),Ai(()=>{J&&(xe.current=ih,Ie.current=null,J.errorTarget=i,J.lruCache.maxSize=o,J.lruCache.minSize=Math.max(1,Math.floor(o*.75)),J.lruCache.maxBytesSize=H,J.lruCache.minBytesSize=H*.75,T())},[o,i,T,H,J]);let se=_L(()=>{let ee=l??{};return{objectBindings:ee,keyByModelObject:J0(ee),itemMaterials:d,shadingMode:u?.model.shading??"lit",rendererMode:u?.model.renderer??"pbr",selectedKey:p??null,hoveredKey:Z0(j,c),highlightOnHover:h,suspendTransforms:C,placementFrame:J?.group.matrixWorld,invalidate:T}},[j,h,T,d,l,c,u,p,C,J]),De=Ei(()=>{if(!J)return;let ee=oe.current,Me=Z.current?te.current?.nodesByBinding(ee)??{}:{},Se={};J.group.traverse(Te=>{if(!Te.isMesh)return;let me=rh(Te);if(!me)return;let We=ee.keyByModelObject[me]??me;if(!ee.objectBindings[We])return;Me[We]||(Me[We]=Te);let _t=Te.material;_t&&(Se[We]=_t)});let je=v?.current??{},at=Object.keys(je),Le=at.length!==Object.keys(Me).length||at.some(Te=>je[Te]!==Me[Te]);v&&(v.current=Me),A&&(A.current=Se),(Le||!v)&&N.current.onNodeRefsChange?.()},[A,v,J]),He=Ei(ee=>wu(ee,se),[se]),ie=Ei(ee=>tM(ee,se),[se]),Ue=tr(ie);Ue.current=ie;let oe=tr(se);oe.current=se;let K=Ei(()=>{let ee=ne.current,Me=X.current;return!ee||Me<=0?oe.current:{...oe.current,explode:{factor:Me,centre:ee.centre,radius:ee.radius}}},[]);Ai(()=>{J&&(ie(J.group),D.current=!0,J.forEachLoadedModel(ee=>{ie(ee),pa(ee,K())}),T())},[ie,T,K,J]),Ai(()=>{let ee=UL(r);if(!ee)return;let Me=!1;return fetch(ee).then(Se=>Se.ok?Se.json():null).then(Se=>{Me||!Se?.objects||(re.current=Se.objects,Z.current=Se.bindingFrame==="gltf-identity-v2",Z.current&&te.current?.setCatalog(Se.objects),D.current=!0,N.current.onObjectCatalog?.(Se.objects),T())}).catch(()=>{}),()=>{Me=!0}},[r,T,k]),Ai(()=>{if(!J)return;let ee=!1,Me=()=>T(),Se=me=>{me.scene&&(me.scene.traverse(We=>{let _t=We.material;for(let nr of Array.isArray(_t)?_t:_t?[_t]:[])nr.transparent&&nr.side===LL&&(nr.forceSinglePass=!0)}),Ue.current(me.scene),pa(me.scene,K()),fc(me.scene)),D.current=!0,ee||(ee=!0,N.current.onModelLoaded?.(J.group)),T()},je=me=>{N.current.onLoadError?.(me.error)},at=me=>{me.scene&&(nh(me.scene),ds(me.scene)),D.current=!0};J.setCamera(P),J.setResolutionFromRenderer(P,E),J.addEventListener("needs-update",Me),J.addEventListener("load-model",Se),J.addEventListener("load-error",je),J.addEventListener("dispose-model",at);let Le=()=>{D.current=!0,T()};J.addEventListener("tile-visibility-change",Le);let Te=()=>{let me=J.root;me&&!me.content?.uri&&me.refine==="REPLACE"&&(me.refine="ADD",T())};return J.addEventListener("load-root-tileset",Te),T(),()=>{J.removeEventListener("needs-update",Me),J.removeEventListener("load-model",Se),J.removeEventListener("load-error",je),J.removeEventListener("dispose-model",at),J.removeEventListener("tile-visibility-change",Le),J.removeEventListener("load-root-tileset",Te),nh(J.group),J.deleteCamera(P),v&&(v.current={}),A&&(A.current={})}},[P,E,T,A,v,K,J]);let Ae=kc(ee=>He(ee)?.binding??null,S),we=Ei(ee=>{if(Ae.consumeClick())return;let Me=He(ee.object);Me&&(ee.stopPropagation(),N.current.onItemClick?.(Me.binding))},[He,Ae,m]),qe=Ei(ee=>{let Me=He(ee.object);if(!Me)return;N.current.onItemDoubleClick?.(Me.binding,ea(ee))&&ee.stopPropagation()},[He]),Ye=Ei(ee=>{let Me=He(ee.object),Se=Me?.key??null;Se!==O.current&&(O.current=Se,I(Se),N.current.onItemHover?.(Me?.binding??null))},[He]),ot=Ei(()=>{O.current!==null&&(O.current=null,I(null),N.current.onItemHover?.(null))},[]);return Ai(()=>{T()},[T,J]),EL((ee,Me)=>{if(!J)return;if(J.setResolutionFromRenderer(P,E),Z.current&&k){let St=k.sync(K(),p,C);k.updateBounds(J.root),C&&J.forEachLoadedModel(Rt=>pa(Rt,St))}if(J.update(),!G.current){let St=new OL;if(J.getBoundingBox(St)){G.current=!0,J.group.updateMatrixWorld(),St.applyMatrix4(J.group.matrixWorld);let Rt=St.getBoundingSphere(new BL);ne.current={centre:Rt.center.clone(),radius:St.getSize(new NL).length()*.5},N.current.onTilesetBounds?.(St),T()}}D.current&&(D.current=!1,De());let Se=Math.min(Math.max(w,0),1),je=X.current;Math.abs(je-Se)>1e-4?(X.current=IL.lerp(je,Se,1-Math.exp(-6*Me)),pa(J.group,K()),T()):je!==Se&&(X.current=Se,pa(J.group,K()),T());let at=J,Le=J.lruCache,Te=Le.isFull(),me=xe.current,We=me.loosened&&Ie.current?Ie.current:{bytes:Le.maxBytesSize,items:Le.maxSize},_t=0;for(let St of Le.usedSet??[])_t+=Le.bytesMap?.get(St)??0;let nr=!1,ir=J;for(let St of ir.usedSet??[]){let Rt=St.internal?.loadingState??PS;if(St.traversal?.used&&St.internal?.hasContent&&Rt>=jL&&Rt<PS){nr=!0;break}}let Zr=q.current??(q.current={world:new CS,projection:new CS}),Pr=!Zr.world.equals(P.matrixWorld)||!Zr.projection.equals(P.projectionMatrix);Pr&&(Zr.world.copy(P.matrixWorld),Zr.projection.copy(P.projectionMatrix));let en={full:Te,wanting:nr,moved:Pr,usage:Math.max(_t/Math.max(1,We.bytes),(Le.usedSet?.size??0)/Math.max(1,We.items)),now:performance.now()},$t=mM(me,en);$t!==me&&($t.loosened&&(!me.loosened||$t.raisedAt!==me.raisedAt)?(me.loosened||(Ie.current=We),Le.maxBytesSize=Math.max(We.bytes,Le.cachedBytes??0)*oh,Le.maxSize=Math.ceil(Math.max(We.items,Le.itemSet?.size??0)*oh)):!$t.loosened&&me.loosened&&Ie.current&&(Le.maxBytesSize=Ie.current.bytes,Le.maxSize=Ie.current.items,Ie.current=null),xe.current=$t,J.errorTarget=i*$t.factor,T()),!ae.current&&Te&&en.wanting&&$t.factor>=js&&(ae.current=!0,console.warn("[react-immersive] The tile memory budget is full even at the coarsest level of detail, so the model may render incompletely. This usually means the model's textures are too large for streaming \u2014 re-process it with a smaller MAX_TEXTURE_SIZE, or raise memoryBudgetMB.")),e&&(e.current={cachedBytes:Le.cachedBytes??null,budgetBytes:We.bytes,cachedTiles:Le.itemSet?.size??null,downloading:at.stats?.downloading??0,parsing:at.stats?.parsing??0,cacheFull:Te,detailFactor:$t.factor,errorTarget:J.errorTarget});let Nr=hM($t,en);Nr===0?T():Nr!==null&&be.current===null&&(be.current=setTimeout(()=>{be.current=null,T()},Nr));let tn=(at.stats?.downloading??0)>0||(at.stats?.parsing??0)>0||at.loadProgress!==void 0&&at.loadProgress<1&&!Te;t&&(t.current=tn),tn&&T()}),J?GL("group",{rotation:n,children:[k?TS("primitive",{object:k.group}):null,TS("primitive",{object:J.group,onClick:we,onDoubleClick:qe,onPointerDown:S?Ae.onPointerDown:void 0,onPointerMove:Ye,onPointerOut:ot})]}):null}import{Matrix4 as Hh}from"three";var HL=new Hh().makeRotationX(Math.PI/2);function _S(e){e.updateMatrixWorld(!0);let t=new Hh().copy(e.matrixWorld).invert().premultiply(HL),r=new Hh,n=[];for(let[i,o]of Object.entries(ci(e).nodesById)){let a=o;if(!a.isMesh||!a.geometry||!o.name)continue;let s=a.geometry;s.boundingBox||s.computeBoundingBox();let l=s.boundingBox.clone().applyMatrix4(r.multiplyMatrices(t,o.matrixWorld)),d=s.index?s.index.count:s.getAttribute("position")?.count??0;n.push({name:i,triangles:Math.floor(d/3),minimum:l.min.toArray(),maximum:l.max.toArray()})}return n.sort((i,o)=>i.name.localeCompare(o.name))}import{useMemo as Ri,useRef as Qr,useState as xo,useEffect as Wn,useCallback as va}from"react";import{Html as ES}from"@react-three/drei";import{useFrame as AS,useThree as qh}from"@react-three/fiber";import{MathUtils as Wh,Vector3 as ya}from"three";import{jsx as br,jsxs as Xh}from"react/jsx-runtime";var WL=.02;function RS(e,t,r=!1,n){let i=Qr(null),[o,a]=xo(!0),s=Qr(!0),l=Ri(()=>new ya,[]),d=qh(y=>y.scene),u=Qr(null),p=Qr(null),c=Ri(()=>new ya(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),h=Ri(()=>new ya,[]),m=Ri(()=>new ya,[]),b=Ri(()=>new ya,[]);return Wn(()=>{u.current=null},[e.anchorNodeName]),AS(({camera:y})=>{let S=i.current,f=S?.parent;if(!S||!f)return;let g=n?n.current:d;p.current!==g&&(p.current=g,u.current=null);let x=u.current;if(e.anchorNodeName&&(!x||!x.parent)&&(x=g?cn(g,e.anchorNodeName):null,u.current=x),x?(x.updateWorldMatrix(!0,!1),h.copy(c).applyMatrix4(x.matrixWorld)):(h.copy(c),f.localToWorld(h)),t){let v=t.current.get(e.id);v||(v=new ya,t.current.set(e.id,v)),v.copy(h)}y.getWorldPosition(l);let _=!r||Qb(e,l.distanceTo(h));_!==s.current&&(s.current=_,a(_)),b.copy(l).sub(h),b.lengthSq()>0?(b.normalize(),m.copy(h).addScaledVector(b,WL)):m.copy(h),f.worldToLocal(m),S.position.copy(m)}),{anchorRef:i,inRange:o}}function qL({anchorSceneRef:e,annotation:t,occluders:r,worldPositionsRef:n,onClick:i,onHover:o,showAnnotationOnHover:a}){let s=ue(),[l,d]=xo(!1),{anchorRef:u,inRange:p}=RS(t,n,!0,e),c=l||!p,[h,m]=xo(!1),[b,y]=xo(1),S=Qr(null),f=Qr(null),g=Qr(null);Wn(()=>{p||(S.current&&clearTimeout(S.current),h&&(m(!1),o?.(null)))},[p,h,o]),Wn(()=>()=>{S.current&&(clearTimeout(S.current),S.current=null),g.current&&(clearTimeout(g.current),g.current=null)},[]);let x=w=>{w.stopPropagation(),w.preventDefault(),S.current&&(clearTimeout(S.current),S.current=null),S.current=window.setTimeout(()=>{i?.(t),S.current=null},10)},_=w=>{w.stopPropagation(),m(!0),y(100),g.current&&(clearTimeout(g.current),g.current=null),o?.(t)},v=w=>{w.stopPropagation(),m(!1),y(1),g.current&&clearTimeout(g.current),g.current=window.setTimeout(()=>{o?.(null),a&&o?.(null),g.current=null},50)},R=w=>{w.stopPropagation();let C=w.currentTarget;C.dataset.pointerX=String(w.clientX),C.dataset.pointerY=String(w.clientY)},A=w=>{w.stopPropagation();let C=w.currentTarget,P=parseFloat(C.dataset.pointerX||"0"),E=parseFloat(C.dataset.pointerY||"0"),T=w.clientX-P,O=w.clientY-E;Math.sqrt(T*T+O*O)<10&&x(w)};return br("group",{ref:u,children:br(ES,{center:!0,occlude:r,onOcclude:d,pointerEvents:c?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:c?"none":"auto",zIndex:b},className:"annotation-html-wrapper",transparent:!0,children:br("div",{ref:f,className:`ri-annotationMarker ${h?"ri-annotationMarker--hovered":""}`,title:t.title,style:{display:c?"none":"flex"},onPointerDown:R,onPointerUp:A,onPointerEnter:_,onPointerLeave:v,onDoubleClick:w=>{w.stopPropagation(),i?.(t)},role:"button",tabIndex:0,"aria-label":s("annotationMarker",{id:t.id,title:t.title}),onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),w.stopPropagation(),i?.(t))},children:br("span",{className:"ri-annotationMarker-id",children:t.id})})})})}function XL({anchorSceneRef:e,annotation:t,occluders:r,popupRef:n,onClose:i,hideCloseButton:o=!1}){let a=ue(),[s,l]=xo(!1),{anchorRef:d}=RS(t,void 0,!1,e),u=Xh("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:s?"none":"block"},onPointerDown:p=>p.stopPropagation(),onClick:p=>p.stopPropagation(),children:[Xh("div",{className:"ri-viewAnnotationHeader",children:[br("h4",{className:"ri-viewAnnotationTitle",children:t.title}),!o&&br("button",{onClick:p=>{p.stopPropagation(),i?.()},className:"ri-viewAnnotationClose","aria-label":a("closeAnnotation"),children:"\xD7"})]}),t.category&&br("span",{className:"ri-annotationCategory",children:t.category}),t.description&&br("p",{className:"ri-viewAnnotationDescription",children:t.description}),t.images?.map((p,c)=>{let h=Lp(p.src);return h?br("img",{className:"ri-annotationImage",src:h,alt:p.alt??"",loading:"lazy"},`${h}-${c}`):null}),t.links?.map((p,c)=>{let h=Lp(p.href);return h?br("a",{className:"ri-annotationLink",href:h,target:"_blank",rel:"noopener noreferrer",children:p.label||a("learnMore")},`${h}-${c}`):null})]});return br("group",{ref:d,children:br(ES,{occlude:r,onOcclude:l,pointerEvents:s?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:s?"none":"auto",zIndex:1e3},transparent:!0,children:u})})}function Yu({anchorSceneRef:e,annotations:t,sceneConfig:r,activeAnnotation:n,popupRef:i,canvasRootRef:o,worldPositionsRef:a,modelLoaded:s,onAnnotationClick:l,onAnnotationHover:d,onCloseAnnotation:u,hideCloseButton:p=!1,showAnnotationOnHover:c=!1}){let h=qh(N=>N.invalidate),m=qh(N=>N.scene),[b,y]=xo(null),[S,f]=xo(!1),g=Qr(null);Wn(()=>{g.current!==null&&n===null&&(y(null),f(!1)),g.current=n?.id??null},[n]);let x=Qr(null),_=Qr(null),v=Qr(null),R=Ri(()=>{let N=[];return m.traverse(D=>{let k=D;k.isMesh&&!k.isSkinnedMesh&&N.push({current:D})}),N},[m,t,s]),A=va(()=>{h();let N=()=>{h(),_.current=window.requestAnimationFrame(()=>{h(),_.current=null})};_.current=window.requestAnimationFrame(N)},[h]);Wn(()=>{A()},[t,A]),Wn(()=>{A()},[n,A]),Wn(()=>()=>{_.current!==null&&window.cancelAnimationFrame(_.current),v.current&&clearTimeout(v.current)},[]);let w=n||b,C=Ri(()=>w?t.find(N=>N.id===w.id)??null:null,[w,t]),P=va(N=>{if(S&&b?.id===N.id){f(!1),y(null),u?.();return}f(!0),y(N),l?.(N)},[S,b,l,u]),E=va(N=>{d?.(N),c&&!S&&(v.current&&(clearTimeout(v.current),v.current=null),N?y(N):v.current=window.setTimeout(()=>{y(null),u?.(),v.current=null},100))},[S,d,c,u]),T=va(()=>{f(!1),y(null),u?.()},[u]),O=va(N=>{let D=N.target;if(D.closest?.(".ri-annotationMarker")||D.closest?.(".ri-viewAnnotationPopup")||D.closest?.(".annotation-html-wrapper"))return;let k=o.current;k&&k.contains(D)&&(f(!1),y(null),u?.())},[o,u]),j=va(N=>{N.key==="Escape"&&S&&(f(!1),y(null),u?.())},[S,u]);Wn(()=>{let N=o.current;return N&&(N.addEventListener("click",O),N.addEventListener("pointerdown",O)),document.addEventListener("keydown",j),()=>{N&&(N.removeEventListener("click",O),N.removeEventListener("pointerdown",O)),document.removeEventListener("keydown",j)}},[o,O,j]);let I=Ri(()=>(r?.model.rotation??[0,0,0]).map(N=>N*Math.PI/180),[r?.model.rotation]);return Wn(()=>{h()},[h,I]),AS((N,D)=>{if(!x.current)return;x.current.rotation.x=Wh.lerp(x.current.rotation.x,I[0],1-Math.exp(-5*D)),x.current.rotation.y=Wh.lerp(x.current.rotation.y,I[1],1-Math.exp(-5*D)),x.current.rotation.z=Wh.lerp(x.current.rotation.z,I[2],1-Math.exp(-5*D));let{rotation:k}=x.current;Math.abs(k.x-I[0])+Math.abs(k.y-I[1])+Math.abs(k.z-I[2])>1e-4&&h()}),Xh("group",{ref:x,children:[t.map(N=>{let D=`${N.worldPosition.join(",")}-${N.title}-${N.id}`;return br(qL,{anchorSceneRef:e,annotation:N,occluders:R,worldPositionsRef:a,onClick:P,onHover:E,showAnnotationOnHover:c},D)}),C?br(XL,{anchorSceneRef:e,annotation:C,occluders:R,popupRef:i,onClose:T,hideCloseButton:p},`popup-${C.id}`):null]})}import{useEffect as LS,useMemo as ol}from"react";import{Html as Yh}from"@react-three/drei";import{useEffect as $L,useMemo as YL}from"react";import{Line as KL}from"@react-three/drei";import{useThree as QL}from"@react-three/fiber";import{BufferGeometry as JL,Line as ZL,LineBasicMaterial as eI,LineDashedMaterial as tI,Vector3 as kS}from"three";import{jsx as $h}from"react/jsx-runtime";function ki(e){return QL(r=>pi(r.gl))?$h(rI,{...e}):$h(KL,{points:e.points,color:e.color,lineWidth:e.lineWidth,dashed:e.dashed})}function rI({points:e,color:t,dashed:r=!1}){let n=YL(()=>{let i=new JL().setFromPoints(e.map(s=>s instanceof kS?s:new kS(...s))),o=r?new tI({color:t,dashSize:.02,gapSize:.02}):new eI({color:t}),a=new ZL(i,o);return r&&a.computeLineDistances(),a},[e,t,r]);return $L(()=>()=>{n.geometry.dispose(),n.material.dispose()},[n]),$h("primitive",{object:n})}import{BoxGeometry as nI,BufferGeometry as iI,DoubleSide as oI,EdgesGeometry as aI,Float32BufferAttribute as sI,Vector3 as qn}from"three";import{Fragment as il,jsx as vt,jsxs as Mr}from"react/jsx-runtime";var Di="#22d3ee",lI="#facc15";function wo(e,t){let r=e<10?e.toFixed(3):e.toFixed(2);return t?`${r} ${t}`:r}function DS(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function cI(e){let t=e.reduce((r,n)=>[r[0]+n[0],r[1]+n[1],r[2]+n[2]],[0,0,0]);return[t[0]/e.length,t[1]/e.length,t[2]/e.length]}function Xn({position:e,children:t}){return vt(Yh,{center:!0,position:e,zIndexRange:[20,0],style:{pointerEvents:"none"},children:vt("div",{className:"ri-measureLabel",children:t})})}function OS({positions:e,triangles:t}){let r=ol(()=>{let n=new qn(...e[0]),i=new iI;return i.setAttribute("position",new sI(e.flatMap(o=>new qn(...o).sub(n).toArray()),3)),i.setIndex(t.flat()),i},[e,t]);return LS(()=>()=>r.dispose(),[r]),vt("mesh",{position:e[0],geometry:r,raycast:()=>{},renderOrder:100,children:vt("meshBasicMaterial",{color:Di,side:oI,transparent:!0,opacity:.18,depthWrite:!1})})}var uI=[[0,1,2]];function dI({positions:e}){let t=sc(e);if(t===null)return null;let r=new qn(...e[1]),n=new qn(...e[0]).sub(r),i=new qn(...e[2]).sub(r),o=Math.min(n.length(),i.length())*.22;n.normalize(),i.normalize();let a=n.clone().cross(i);a.lengthSq()<1e-12&&a.copy(n).cross(Math.abs(n.y)<.9?new qn(0,1,0):new qn(1,0,0)),a.normalize();let s=t*Math.PI/180,l=Array.from({length:33},(u,p)=>n.clone().applyAxisAngle(a,s*p/32).multiplyScalar(o).add(r).toArray()),d=n.clone().applyAxisAngle(a,s/2).multiplyScalar(o*1.4).add(r).toArray();return Mr(il,{children:[vt(ki,{points:l,color:Di,lineWidth:2}),Mr(Xn,{position:d,children:[t.toFixed(2),"\xB0"]})]})}function pI({box:e,unit:t,scale:r}){let n=ol(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),i=ol(()=>{let[l,d,u]=e.size,p=new nI(l||1e-4,d||1e-4,u||1e-4),c=new aI(p);return p.dispose(),c},[e.size]);LS(()=>()=>{i.dispose()},[i]);let[o,a,s]=e.size;return Mr("group",{position:n,children:[vt("lineSegments",{geometry:i,children:vt("lineBasicMaterial",{color:lI})}),Mr(Xn,{position:[0,-a/2,s/2],children:["W ",wo(o*r,t)]}),Mr(Xn,{position:[-o/2,0,s/2],children:["H ",wo(a*r,t)]}),Mr(Xn,{position:[o/2,-a/2,0],children:["D ",wo(s*r,t)]})]})}function xa({points:e,unit:t,scale:r=1,box:n,showDimensions:i,tool:o="distance",areaClosed:a=!1,snapPreview:s}){let l=ol(()=>e.map(p=>p.position),[e]),d=ol(()=>o==="area"&&a?lc(l):null,[o,a,l]),u=o==="pointToPlane"&&e.length===2?dv(e[0],e[1].position):null;return Mr("group",{children:[o!=="wrap"&&o!=="wrapHorizontal"&&e.map(p=>vt(Yh,{center:!0,position:p.position,zIndexRange:[15,0],style:{pointerEvents:"none"},children:vt("div",{className:`ri-measureDot${p.snapped?" ri-measureDot--snapped":""}`})},p.id)),o==="distance"&&e.slice(1).map((p,c)=>{let h=e[c].position,m=p.position,b=new qn(...h).distanceTo(new qn(...m));return Mr("group",{children:[vt(ki,{points:[h,m],color:Di,lineWidth:2}),vt(Xn,{position:DS(h,m),children:wo(b*r,t)})]},`${e[c].id}-${p.id}`)}),(o==="angle"||o==="area")&&l.length>=2&&vt(ki,{points:a?[...l,l[0]]:l,color:Di,lineWidth:2}),o==="angle"&&vt(dI,{positions:l}),d&&!("error"in d)&&Mr(il,{children:[vt(OS,{positions:l,triangles:d.triangles}),vt(Xn,{position:d.center,children:wo(d.area*r**2,t?`${t}\xB2`:"")})]}),o==="pointToPlane"&&e[0]?.faceVertices&&Mr(il,{children:[vt(OS,{positions:e[0].faceVertices,triangles:uI}),vt(ki,{points:[...e[0].faceVertices,e[0].faceVertices[0]],color:Di,lineWidth:1}),e.length===1&&vt(Xn,{position:e[0].position,children:"Reference plane"})]}),u&&Mr(il,{children:[vt(ki,{points:[e[1].position,u.projection],color:Di,lineWidth:2}),vt(ki,{points:[e[0].position,u.projection],color:Di,lineWidth:1,dashed:!0}),vt(Xn,{position:DS(e[1].position,u.projection),children:wo(u.distance*r,t)})]}),(o==="wrap"||o==="wrapHorizontal")&&l.length>=3&&Mr(il,{children:[vt(ki,{points:[...l,l[0]],color:Di,lineWidth:2}),vt(Xn,{position:cI(l),children:wo(pv(l,!0)*r,t)})]}),s&&Mr(Yh,{center:!0,position:s.position,zIndexRange:[20,0],style:{pointerEvents:"none"},children:[vt("div",{className:"ri-measureSnapTarget"}),vt("div",{className:"ri-measureSnapLabel",children:s.snapped==="vertex"?"Vertex":"Edge"})]}),i&&n?vt(pI,{box:n,unit:t,scale:r}):null]})}import{Eraser as IS,PencilRuler as BS,RulerDimensionLine as mI,Undo2 as NS,X as hI}from"lucide-react";import{useEffect as fI,useLayoutEffect as gI,useRef as jS,useState as Ku}from"react";import{createPortal as bI}from"react-dom";import{Fragment as al,jsx as de,jsxs as ct}from"react/jsx-runtime";function Kh(e){let t=ue(),{isInsideEditor:r,measurementPanelTarget:n,tier:i}=hi(),o=r&&!Mc(i,"calibratedMeasurements"),a=jS(null),[s,l]=Ku(!1),[d,u]=Ku(""),[p,c]=Ku("1"),[h,m]=Ku("m"),b=jS(null),y={ready:"measurementReady",approximate:"measurementApproximate","model-changed":"measurementModelChanged","missing-object":"measurementObjectMissing","geometry-changed":"measurementGeometryChanged","pose-changed":"measurementPoseChanged","hidden-object":"measurementObjectHidden",invalid:"measurementInvalid"};gI(()=>{if(!a.current)return;let E=()=>e.onHeight(a.current?.getBoundingClientRect().height??34),T=new ResizeObserver(E);return T.observe(a.current),E(),()=>T.disconnect()},[e.onHeight]);let S=r&&e.active&&!n,{onToggle:f}=e;fI(()=>{S&&f()},[S,f]);let{tool:g,pointCount:x,areaClosed:_}=e,v=g==="angle"?[t("angleFirstArmHint"),t("angleVertexHint"),t("angleSecondArmHint"),t("angleNewHint")][x]:g==="area"?t(_?"areaNewHint":"areaCornersHint"):g==="pointToPlane"?[t("pointToPlaneFaceHint"),t("pointToPlanePointHint"),t("pointToPlaneNewHint")][x]:t(g==="wrap"?"wrapHint":g==="wrapHorizontal"?"wrapHorizontalHint":"distanceHint"),R=r?"ri-measureField":"ri-measureSelect",A=ct("select",{className:R,"aria-label":t("measurementTool"),value:g,disabled:e.disabled,onChange:E=>e.onTool(E.target.value),children:[de("option",{value:"distance",children:t("distance")}),de("option",{value:"angle",children:t("angle")}),de("option",{value:"area",children:t("area")}),de("option",{value:"pointToPlane",children:t("pointToPlane")}),de("option",{value:"wrap",children:t("wrap")}),de("option",{value:"wrapHorizontal",children:t("wrapHorizontal")})]}),w=ct("select",{className:R,"aria-label":t("measurementSnapping"),value:e.snap,disabled:e.disabled,onChange:E=>e.onSnap(E.target.value),children:[de("option",{value:"none",children:t("noSnapping")}),de("option",{value:"auto",children:t("snapAuto")}),de("option",{value:"vertex",children:t("snapVertex")}),de("option",{value:"edge",children:t("snapEdge")})]}),C=e.active&&g==="area"&&!_&&de("button",{type:"button",className:r?"ri-measureAction":"ri-measureFinish",onClick:e.onFinishArea,disabled:e.disabled||x<3,children:t("finishArea")}),P=ct("div",{className:`ri-measureLibrary${r?" ri-measureLibrary--sidebar":""}`,onClick:E=>E.stopPropagation(),onPointerDown:E=>E.stopPropagation(),onPointerMove:E=>E.stopPropagation(),onKeyDown:E=>E.stopPropagation(),children:[r&&de("div",{className:"ri-measureActions",children:ct("button",{type:"button",className:`ri-measureAction ri-measureStart${e.active?" ri-measureStart--active":""}`,disabled:e.disabled,onClick:e.onToggle,"aria-pressed":e.active,children:[de(BS,{size:13}),e.active?t("stopMeasuring"):t("startMeasuring")]})}),r&&e.active&&ct(al,{children:[ct("div",{className:"ri-measureRow",children:[de("span",{children:"Tool"}),A]}),ct("div",{className:"ri-measureRow",children:[de("span",{children:"Snapping"}),w]}),!e.error&&de("p",{className:"ri-measureGuide",role:"status",children:v}),(x>0||C)&&ct("div",{className:"ri-measureActions",children:[x>0&&ct(al,{children:[ct("button",{type:"button",className:"ri-measureAction",onClick:e.onUndo,disabled:e.disabled,children:[de(NS,{size:13}),"Undo point"]}),ct("button",{type:"button",className:"ri-measureAction",onClick:e.onClear,disabled:e.disabled,children:[de(IS,{size:13}),"Clear"]})]}),C]})]}),r&&ct("label",{className:"ri-measureRow",children:[de("span",{children:"Bounding box"}),de("input",{type:"checkbox","aria-label":t("toggleBoundingDimensions"),checked:e.showDimensions,disabled:e.disabled,onChange:e.onDimensions})]}),ct("label",{className:"ri-measureRow",children:[de("span",{children:t("measurementSourceUnit")}),de("select",{"aria-label":t("measurementSourceUnit"),className:"ri-measureField",disabled:e.disabled||e.settingsReadOnly,value:e.settings.sourceUnit??"m",onChange:E=>e.onSettings({...e.settings,sourceUnit:E.target.value,metersPerUnit:void 0}),children:cc.map(E=>de("option",{value:E,children:E},E))})]}),ct("label",{className:"ri-measureRow",children:[de("span",{children:t("measurementDisplayUnit")}),ct("select",{"aria-label":t("measurementDisplayUnit"),className:"ri-measureField",disabled:e.disabled||e.settingsReadOnly,value:e.displayUnit,onChange:E=>e.onSettings({...e.settings,displayUnit:E.target.value}),children:[!bv(e.displayUnit)&&de("option",{value:e.displayUnit,children:e.displayUnit}),cc.map(E=>de("option",{value:E,children:E},E))]})]}),e.active&&ct(al,{children:[ct("div",{className:"ri-measureRow",children:[de("span",{children:t("measurementName")}),ct("span",{className:"ri-measureCombo",children:[de("input",{"aria-label":t("measurementName"),className:"ri-measureField",value:d,onChange:E=>u(E.target.value),placeholder:t("measurementNamePlaceholder")}),de("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.readOnly||!e.canSave||o,title:o?"Saving measurements requires the Starter plan or higher.":void 0,onClick:()=>{e.onSave(d),u(""),l(!0)},children:t("saveMeasurement")})]})]}),ct("div",{className:"ri-measureRow",title:t("measurementCalibrationHint"),children:[de("span",{children:t("knownMeasurementDistance")}),ct("span",{className:"ri-measureCombo",children:[de("input",{"aria-label":t("knownMeasurementDistance"),type:"number",min:"0",step:"any",className:"ri-measureField",value:p,onChange:E=>c(E.target.value)}),de("select",{"aria-label":t("calibrationUnit"),className:"ri-measureField ri-measureField--unit",value:h,onChange:E=>m(E.target.value),children:cc.map(E=>de("option",{children:E},E))}),de("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.settingsReadOnly||!e.canCalibrate||o,title:o?"Calibration requires the Starter plan or higher.":void 0,onClick:()=>e.onCalibrate(Number(p),h),children:t("calibrateMeasurement")})]})]})]}),e.settings.metersPerUnit!==void 0&&ct("div",{className:"ri-measureRow",children:[de("span",{children:t("measurementCalibratedScale",{scale:e.settings.metersPerUnit.toPrecision(6)})}),de("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.settingsReadOnly,onClick:()=>e.onSettings({...e.settings,metersPerUnit:void 0}),children:t("resetMeasurementCalibration")})]}),e.items.length>0&&de("div",{className:"ri-savedMeasurementList",children:e.items.map(E=>{let T=e.results.find(O=>O.id===E.id);return ct("div",{className:"ri-savedMeasurementRow",children:[de("input",{type:"checkbox","aria-label":t("showSavedMeasurement",{name:E.name}),checked:E.visible!==!1,disabled:e.disabled||e.readOnly,onChange:O=>e.onItems(e.items.map(j=>j.id===E.id?{...j,visible:O.target.checked}:j))}),de("input",{"aria-label":t("renameSavedMeasurement",{name:E.name}),className:"ri-savedMeasurementName",defaultValue:E.name,disabled:e.disabled||e.readOnly,onBlur:O=>{let j=O.target.value.trim()||E.name;j!==E.name?e.onItems(e.items.map(I=>I.id===E.id?{...I,name:j}:I)):O.target.value=j}},`${E.id}:${E.name}`),de("span",{className:"ri-savedMeasurementValue",title:t(T?y[T.status]:"measurementWaiting"),children:T?.value!=null?`${T.value.toFixed(3)} ${T.unit}`:"\u2014"}),de("button",{type:"button",className:"ri-savedMeasurementDelete","aria-label":t("deleteSavedMeasurement",{name:E.name}),disabled:e.disabled||e.readOnly,onClick:()=>e.onItems(e.items.filter(O=>O.id!==E.id)),children:de(hI,{size:13})})]},E.id)})}),!e.items.length&&de("p",{className:"ri-measureEmpty",children:t("noSavedMeasurements")}),ct("details",{className:"ri-measureTransfer",children:[de("summary",{children:t("measurementFiles")}),ct("div",{className:"ri-measureActions",children:[de("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||!e.items.length,onClick:e.onExportJson,children:t("exportMeasurementJson")}),de("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||!e.items.length,onClick:e.onExportCsv,children:t("exportMeasurementCsv")}),de("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.readOnly||e.settingsReadOnly,onClick:()=>b.current?.click(),children:t("importMeasurementJson")}),de("input",{ref:b,type:"file",accept:".json,application/json",hidden:!0,onChange:E=>{let T=E.target.files?.[0];if(E.target.value="",!!T){if(T.size>5*1024*1024){e.onImport("{}");return}T.text().then(e.onImport).catch(()=>e.onImport("{}"))}}})]})]}),r&&e.error&&de("p",{className:"ri-measureLibraryError",role:"status",children:t.message(e.error)})]});return r?n?bI(P,n):null:ct("div",{ref:a,className:"ri-measureTools",style:{top:e.top},children:[ct("div",{className:"ri-measureToolbarRow",children:[de("button",{type:"button",className:`ri-measureButton ${e.active?"ri-measureButton--active":""}`,disabled:e.disabled,onClick:e.onToggle,title:e.active?t("stopMeasuring"):t("startMeasuring"),"aria-pressed":e.active,children:de(BS,{size:16})}),de("button",{type:"button",className:`ri-measureButton ${e.showDimensions?"ri-measureButton--active":""}`,disabled:e.disabled,onClick:e.onDimensions,title:t("toggleBoundingDimensions"),"aria-pressed":e.showDimensions,children:de(mI,{size:16})}),de("button",{type:"button",className:"ri-measureSelect","aria-expanded":s,onClick:()=>l(!s),children:t("savedMeasurements",{count:e.items.length})}),e.active&&ct(al,{children:[A,w]}),x>0&&ct(al,{children:[de("button",{type:"button",className:"ri-measureButton",onClick:e.onUndo,disabled:e.disabled,title:t("undoMeasurementPoint"),children:de(NS,{size:16})}),de("button",{type:"button",className:"ri-measureButton",onClick:e.onClear,disabled:e.disabled,title:t("clearMeasurements"),children:de(IS,{size:16})})]}),C]}),(e.active||s)&&P,(e.active||e.error)&&de("div",{className:`ri-measureHint${e.error?" ri-measureHint--error":""}`,role:"status",children:e.error?t.message(e.error):v})]})}import{useCallback as vI,useEffect as zS,useRef as Qu,useState as yI}from"react";import{useFrame as xI}from"@react-three/fiber";import{Fragment as MI,jsx as VS}from"react/jsx-runtime";var wI=100;function Ju({items:e,sceneRef:t,modelId:r,tilesetUrl:n,settings:i,legacyUnit:o,revision:a,onResults:s}){let[l,d]=yI([]),u=Qu(""),p=vI(()=>{let S=e.length&&t.current?Ts(t.current):void 0,f=e.map(_=>Qc(_,t.current,r,n,S)),g=f.map(({measurement:_,points:v,status:R})=>dc(_,i,o,v,R)),x=JSON.stringify([f.map(({measurement:_,points:v,status:R})=>[_.id,_.tool,_.visible,R,v.map(A=>[A.position,A.normal,A.faceVertices])]),g]);u.current!==x&&(u.current=x,d(f),s(g))},[e,t,r,n,i,o,s]);zS(()=>{p()},[p,a]);let c=Qu(0),h=Qu(null),m=Qu(p);m.current=p,zS(()=>()=>{h.current&&clearTimeout(h.current)},[]),xI(()=>{if(!e.length)return;let S=c.current+wI-performance.now();S<=0?(c.current=performance.now(),p()):h.current??(h.current=setTimeout(()=>{h.current=null,c.current=performance.now(),m.current()},S))});let{factor:b,displayUnit:y}=uc(i,o);return VS(MI,{children:l.filter(({measurement:S,status:f})=>S.visible!==!1&&(f==="ready"||f==="approximate")).map(({measurement:S,points:f})=>VS(xa,{points:f,unit:y,scale:b,box:null,showDimensions:!1,tool:S.tool,areaClosed:S.tool==="area"},S.id))})}import{forwardRef as SI,useCallback as sl,useEffect as FS,useImperativeHandle as CI,useMemo as US,useRef as rr}from"react";import{useXR as GS,useXRHitTest as PI,useXRInputSourceEvent as TI}from"@react-three/xr";import{useFrame as _I}from"@react-three/fiber";import{Matrix4 as EI,Vector3 as HS}from"three";import{Fragment as LI,jsx as ll,jsxs as $S}from"react/jsx-runtime";var AI=1,WS=1,RI=.1,kI=10;function DI(e,t){let[r,n,i]=e.size,o=(e.min[0]+e.max[0])/2,a=(e.min[2]+e.max[2])/2,s=Math.max(r,n,i)||1;return{scale:t==="real-world"?1:AI/s,offset:[-o,-e.min[1],-a]}}function qS(e){let t=e[0].clientX-e[1].clientX,r=e[0].clientY-e[1].clientY;return Math.hypot(t,r)}function XS(e){let t=e[0].clientX-e[1].clientX,r=e[0].clientY-e[1].clientY;return Math.atan2(r,t)}var OI=SI(function({box:t,scaleMode:r,children:n,onARStateChange:i},o){let a=rr(null),s=rr(null),l=rr(null),d=GS(I=>I.session!=null),u=GS(I=>I.mode==="immersive-ar"),p=US(()=>t?DI(t,r):null,[t,r]),c=rr(new HS(0,0,-WS)),h=rr(1),m=rr(0),b=rr(!0),y=rr(!1),S=US(()=>new EI,[]),f=rr(new HS),g=rr(!1),x=rr(null),_=rr(!1),v=rr(0),R=rr(0),A=rr(1),w=rr(0),C=sl(()=>{if(!i||!u)return;let I={canPlace:g.current,isPlacementMode:b.current,isModelPlaced:y.current},N=x.current;N&&N.canPlace===I.canPlace&&N.isPlacementMode===I.isPlacementMode&&N.isModelPlaced===I.isModelPlaced||(x.current=I,i(I))},[u,i]),P=sl(()=>!u||!g.current?!1:(c.current.copy(f.current),y.current=!0,b.current=!1,C(),!0),[C,u]),E=sl(()=>{u&&(b.current=!0,C())},[C,u]),T=sl(()=>{let I=P();return!I&&u&&(b.current=!1,C()),I},[C,u,P]),O=sl(()=>{u&&(b.current=!1,C())},[C,u]);CI(o,()=>({placeCurrent:P,startPlacementMode:E,finishPlacementMode:T,cancelPlacementMode:O}),[O,T,P,E]),FS(()=>{if(!d){c.current.set(0,0,-WS),h.current=1,m.current=0,g.current=!1,_.current=!1,b.current=!0,y.current=!1,x.current=null;return}u&&(g.current=!1,_.current=!1,b.current=!0,y.current=!1,x.current=null,C())},[C,d,u]),PI((I,N)=>{if(!u||I.length===0){g.current&&(g.current=!1,C());return}N(S,I[0])&&(f.current.setFromMatrixPosition(S),g.current||(g.current=!0,C()))},"viewer"),TI("all","select",()=>{!u||_.current||!b.current||P()},[u,P]),FS(()=>{if(!u)return;let I=k=>{k.touches.length===2&&(_.current=!0,v.current=qS(k.touches),R.current=XS(k.touches),A.current=h.current,w.current=m.current)},N=k=>{if(!_.current||k.touches.length!==2)return;k.preventDefault();let U=qS(k.touches);if(v.current>0){let re=U/v.current;h.current=Math.min(kI,Math.max(RI,A.current*re))}let te=XS(k.touches);m.current=w.current-(te-R.current)},D=k=>{k.touches.length===0&&requestAnimationFrame(()=>{_.current=!1})};return window.addEventListener("touchstart",I),window.addEventListener("touchmove",N,{passive:!1}),window.addEventListener("touchend",D),window.addEventListener("touchcancel",D),()=>{window.removeEventListener("touchstart",I),window.removeEventListener("touchmove",N),window.removeEventListener("touchend",D),window.removeEventListener("touchcancel",D)}},[u]),_I(()=>{let I=a.current,N=s.current;if(!I||!N)return;!d||!p?(I.visible=!0,I.position.set(0,0,0),I.rotation.set(0,0,0),N.scale.setScalar(1)):(I.visible=!u||y.current,I.position.copy(c.current),I.rotation.set(0,m.current,0),N.scale.setScalar(p.scale*h.current));let D=l.current;if(D){let k=u&&b.current&&g.current;D.visible=k,k&&D.position.copy(f.current)}});let j=d&&p?p.offset:[0,0,0];return $S(LI,{children:[$S("mesh",{ref:l,visible:!1,rotation:[-Math.PI/2,0,0],children:[ll("ringGeometry",{args:[.05,.07,32]}),ll("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),ll("group",{ref:a,children:ll("group",{ref:s,children:ll("group",{position:j,children:n})})})]})}),YS=OI;import{useRef as Mo,useState as II,useCallback as yn,useEffect as BI}from"react";import{jsx as Sr,jsxs as Qh}from"react/jsx-runtime";var NI={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},jI={up:"4 16 12 8 20 16",down:"4 8 12 16 20 8",left:"16 4 8 12 16 20",right:"8 4 16 12 8 20"},Zu=({direction:e})=>{let t=NI[e],r=jI[e];return Qh("svg",{"aria-hidden":"true",className:"mc__arrow-icon",focusable:"false",viewBox:"0 0 24 24",width:t.width,height:t.height,fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{display:"block",width:`${t.width}px`,height:`${t.height}px`,pointerEvents:"none",padding:0,margin:0,overflow:"visible"},children:[Sr("polyline",{points:r,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),Sr("polyline",{points:r,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},$n=16,zI={"bottom-left":{bottom:$n,left:$n,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:$n,right:$n,top:"auto",left:"auto",transform:"none"},"top-left":{top:$n,left:$n,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:$n,right:$n,bottom:"auto",left:"auto",transform:"none"},center:{top:"50%",left:"50%",bottom:"auto",right:"auto",transform:"translate(-50%, -50%)"},"center-bottom":{bottom:-10,left:"50%",top:"auto",right:"auto",transform:"translateX(-50%)"},"center-top":{top:$n,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},VI=({controlsRef:e,enabled:t=!0,opacity:r=.9,moveSensitivity:n=.001,rotateSensitivity:i=.01,position:o="center-bottom"})=>{let a=ue(),s=Mo(null),[l,d]=II({x:0,y:0}),u=Mo(!1),p=Mo({x:0,y:0}),c=Mo(void 0),h=Mo(void 0),m=Mo(null),b=Mo(0),y=()=>e.current,S=(O,j,I)=>{let N=Math.hypot(O,j);if(N>I){let D=I/N;return{x:O*D,y:j*D}}return{x:O,y:j}},f=O=>{let I=Math.abs(O);return I<.12?0:Math.sign(O)*((I-.12)/(1-.12))},g=yn(()=>{let O=()=>{let{x:j,y:I}=p.current,N=f(j),D=f(I);if(t&&(N!==0||D!==0)){let k=y();k&&k.rotate(-N*i,-D*i,!0)}c.current=requestAnimationFrame(O)};c.current=requestAnimationFrame(O)},[t,i]),x=yn(()=>{c.current&&cancelAnimationFrame(c.current)},[]),_=yn((O,j)=>{if(!s.current||!u.current)return;let I=s.current.getBoundingClientRect(),N=I.left+I.width/2,D=I.top+I.height/2,k=I.width/2-18,U=O-N,te=j-D,re=S(U,te,k);d(re),p.current={x:re.x/k,y:re.y/k}},[]),v=yn(O=>{if(!t)return;O.preventDefault(),O.stopPropagation(),u.current=!0,g();let j="touches"in O?O.touches[0]:O;_(j.clientX,j.clientY)},[t,g,_]),R=yn(O=>{if(!u.current)return;O.preventDefault();let j="touches"in O?O.touches[0]:O;_(j.clientX,j.clientY)},[_]),A=yn(()=>{u.current=!1,d({x:0,y:0}),p.current={x:0,y:0},x()},[x]),w=n*10,C=yn(O=>{t&&y()?.forward(O*w,!0)},[t,w]),P=yn(O=>{t&&y()?.truck(O*w,0,!0)},[t,w]),E=yn((O,j,I)=>{if(!t)return;h.current&&cancelAnimationFrame(h.current),m.current={control:O,amount:j,action:I},b.current=0,I(j);let N=D=>{if(!m.current)return;if(b.current===0){b.current=D,h.current=requestAnimationFrame(N);return}if(D-b.current>200){let{amount:U,action:te}=m.current;te(U),b.current=D}h.current=requestAnimationFrame(N)};h.current=requestAnimationFrame(N)},[t]),T=yn(O=>{m.current?.control===O&&(h.current&&(cancelAnimationFrame(h.current),h.current=void 0),m.current=null,b.current=0)},[]);return BI(()=>(window.addEventListener("mousemove",R),window.addEventListener("mouseup",A),window.addEventListener("touchmove",R,{passive:!1}),window.addEventListener("touchend",A),window.addEventListener("touchcancel",A),()=>{window.removeEventListener("mousemove",R),window.removeEventListener("mouseup",A),window.removeEventListener("touchmove",R),window.removeEventListener("touchend",A),window.removeEventListener("touchcancel",A),x(),h.current&&cancelAnimationFrame(h.current)}),[R,A,x]),t?Sr("div",{className:"mc__wrapper",style:{opacity:r,...zI[o]},children:Qh("div",{className:"mc__dpad",children:[Sr("button",{"aria-label":a("moveForward"),className:"mc__arrow mc__arrow--up",onMouseDown:()=>E("up",1,C),onMouseUp:()=>T("up"),onMouseLeave:()=>T("up"),onTouchStart:O=>{O.preventDefault(),E("up",1,C)},onTouchEnd:()=>T("up"),onTouchCancel:()=>T("up"),children:Sr(Zu,{direction:"up"})}),Qh("div",{className:"mc__middle-row",children:[Sr("button",{"aria-label":a("moveLeft"),className:"mc__arrow mc__arrow--left",onMouseDown:()=>E("left",-1,P),onMouseUp:()=>T("left"),onMouseLeave:()=>T("left"),onTouchStart:O=>{O.preventDefault(),E("left",-1,P)},onTouchEnd:()=>T("left"),onTouchCancel:()=>T("left"),children:Sr(Zu,{direction:"left"})}),Sr("div",{ref:s,className:"mc__joystick",onMouseDown:v,onTouchStart:v,children:Sr("div",{className:"mc__knob",style:{transform:`translate(${l.x}px, ${l.y}px)`}})}),Sr("button",{"aria-label":a("moveRight"),className:"mc__arrow mc__arrow--right",onMouseDown:()=>E("right",1,P),onMouseUp:()=>T("right"),onMouseLeave:()=>T("right"),onTouchStart:O=>{O.preventDefault(),E("right",1,P)},onTouchEnd:()=>T("right"),onTouchCancel:()=>T("right"),children:Sr(Zu,{direction:"right"})})]}),Sr("button",{"aria-label":a("moveBackward"),className:"mc__arrow mc__arrow--down",onMouseDown:()=>E("down",-1,C),onMouseUp:()=>T("down"),onMouseLeave:()=>T("down"),onTouchStart:O=>{O.preventDefault(),E("down",-1,C)},onTouchEnd:()=>T("down"),onTouchCancel:()=>T("down"),children:Sr(Zu,{direction:"down"})})]})}):null},KS=VI;import{useEffect as ed,useMemo as FI,useRef as QS,useState as JS}from"react";import{Check as UI,Link as GI,SlidersHorizontal as HI,X as WI}from"lucide-react";import{jsx as wa,jsxs as Jh}from"react/jsx-runtime";function ZS({product:e,options:t,onSelectionsChange:r,top:n=12}){let i=ue(),o={"--ri-product-dock-top":`${n}px`},{adapter:a,urlParam:s,onConfigurationChange:l,defaultClosed:d}=t,u=FI(()=>{let v=s&&typeof window<"u"?new URLSearchParams(window.location.search).get(s):null;return v?kv(v,e.definition):e.selections},[]),p=Xy({product:e.definition,initialSelections:u,adapter:a}),{selections:c}=p.configuration,h=JSON.stringify(c),[m,b]=JS(()=>!d&&(typeof window>"u"||window.innerWidth>640)),[y,S]=JS(!1),f=QS(r);f.current=r,ed(()=>{f.current(c)},[h]);let g=QS(l);g.current=l,ed(()=>{g.current?.(p.configuration,p.checkoutUrl)},[p.configuration.key,p.checkoutUrl]);let x=()=>{let v=new URL(window.location.href);return v.searchParams.set(s,Rv(c)),v.href};ed(()=>{s&&window.history.replaceState(window.history.state,"",x())},[s,h]),ed(()=>{if(!y)return;let v=setTimeout(()=>S(!1),2e3);return()=>clearTimeout(v)},[y]);let _=!!s&&typeof window<"u"&&window.self===window.top;return m?Jh("div",{className:"ri-productDock",style:o,children:[wa("button",{type:"button",className:"ri-productDockClose",onClick:()=>b(!1),title:i("productHideOptions"),"aria-label":i("productHideOptions"),children:wa(WI,{size:14,"aria-hidden":"true"})}),wa(Qp,{configurator:p,actions:_?Jh("button",{type:"button",onClick:()=>{navigator.clipboard.writeText(x()).then(()=>S(!0)).catch(()=>{})},children:[y?wa(UI,{size:13,"aria-hidden":"true"}):wa(GI,{size:13,"aria-hidden":"true"}),i(y?"productLinkCopied":"productCopyLink")]}):void 0})]}):Jh("button",{type:"button",className:"ri-productDockToggle",style:o,onClick:()=>b(!0),title:i("productShowOptions"),children:[wa(HI,{size:14,"aria-hidden":"true"}),i("productOptions")]})}import{useMemo as XI}from"react";import{useEffect as qI}from"react";import{useThree as eC}from"@react-three/fiber";var tC=new WeakMap;function td(e){let t=eC(n=>n.get),r=eC(n=>n.setEvents);qI(()=>{if(!e)return;let n=tC.get(t);if(!n){let o=new Set;n=o,tC.set(t,o);let a=t().events.filter;r({filter:(s,l)=>{let d=a?a(s,l):s;return o.size===0?d:d.filter(u=>{for(let p of o)if(!p(u))return!1;return!0})}})}n.add(e);let i=n;return()=>{i.delete(e)}},[e,t,r])}function Zh({setAside:e,nodeRefs:t}){let r=XI(()=>{if(e.size===0)return null;let n={refs:null,bound:new Map};return i=>{let o=t.current??{};if(n.refs!==o){let s=new Map;for(let[l,d]of Object.entries(o))s.set(d,e.has(l));n={refs:o,bound:s}}let{bound:a}=n;for(let s=i.object;s;s=s.parent){let l=a.get(s);if(l!==void 0)return!l}return!0}},[e,t]);return td(r),null}import{useEffect as cl,useMemo as Ma,useRef as QI,useState as sC}from"react";import{Edges as JI}from"@react-three/drei";import{useFrame as ZI,useThree as ef}from"@react-three/fiber";import{DoubleSide as eB,Quaternion as tB,Vector3 as So}from"three";import{Vector3 as rd,Plane as $I}from"three";var rC={x:0,y:1,z:2},YI=e=>Math.min(Math.max(e,0),1);function KI(e,t){let r=1/0,n=-1/0;for(let i=0;i<8;i++){let o=new rd(...e.min);for(let s=0;s<3;s++)i&1<<s&&o.setComponent(s,e.max[s]);let a=o.dot(t);r=Math.min(r,a),n=Math.max(n,a)}return[r,n]}function nC(e,t){if(!e.enabled||t.min.some((n,i)=>!Number.isFinite(n)||!Number.isFinite(t.max[i])||n>t.max[i]))return{cuts:[],intersection:!1};let r=(n,i,o,a,s)=>{let l=s?new rd(...s).normalize():new rd().setComponent(rC[i],1),[d,u]=KI(t,l),p=d+(u-d)*YI(o),c=a?1:-1;return{id:n,direction:l,min:d,max:u,coordinate:p,plane:new $I(l.clone().multiplyScalar(c),-p*c)}};if(e.mode==="box"){let n=e.box??{min:[0,0,0],max:[1,1,1]};return{intersection:!!e.invertBox,cuts:["x","y","z"].flatMap((i,o)=>[r(`${i}-min`,i,n.min[o],!e.invertBox),r(`${i}-max`,i,n.max[o],!!e.invertBox)])}}return e.mode==="planes"?{intersection:!1,cuts:(e.planes??[]).filter(n=>n.enabled).map(n=>r(n.id,n.axis,n.position,n.flip,n.normal))}:{intersection:!1,cuts:[r("plane",e.axis,e.position,e.flip,e.normal)]}}function iC(e,t,r){return e.length?t?e.some(n=>n.distanceToPoint(r)>=-1e-4):e.every(n=>n.distanceToPoint(r)>=-1e-4):!0}function nd(e,t,r){if(e.mode==="planes")return{planes:e.planes?.map(n=>n.id===t?{...n,position:r}:n)};if(e.mode==="box"){let n=e.box??{min:[0,0,0],max:[1,1,1]},i=[...n.min],o=[...n.max],a=rC[t[0]];return t.endsWith("min")?i[a]=Math.max(0,Math.min(r,o[a]-.001)):o[a]=Math.min(1,Math.max(r,i[a]+.001)),{box:{min:i,max:o}}}return{position:r}}function oC(e,t,r,n){let i=r.clone().addScaledVector(n,-r.dot(n));if(i.lengthSq()<1e-8)return null;i.normalize();let o=e.direction.dot(i);if(Math.abs(o)<1e-8)return null;let a=t.clone().sub(e.origin).dot(i)/o;return Number.isFinite(a)?e.at(a,new rd).dot(n):null}import{DoubleSide as id}from"three";function aC(){let e=new Map;function t(r){let n=e.get(r);n&&(r.clippingPlanes===n.owned&&(r.clippingPlanes=n.planes,r.clipShadows=n.shadows,r.clipIntersection=n.intersection,r.side===id&&(r.side=n.side),r.needsUpdate=!0),e.delete(r))}return{apply(r,n,i){let o=e.get(r);o&&r.clippingPlanes!==o.owned&&(e.delete(r),o=void 0),o||(o={planes:r.clippingPlanes,side:r.side,shadows:r.clipShadows,intersection:r.clipIntersection,owned:n},e.set(r,o)),r.side!==id&&(o.side=r.side),!(r.clippingPlanes===n&&r.clipIntersection===i&&r.side===id&&r.clipShadows)&&(o.owned=n,r.clippingPlanes=n,r.clipIntersection=i,r.clipShadows=!0,r.side=id,r.needsUpdate=!0)},retain(r){for(let n of e.keys())r.has(n)||t(n)},restore(){for(let r of e.keys())t(r)}}}import{jsx as od,jsxs as nB}from"react/jsx-runtime";function tf({section:e,box:t,modelRef:r,showHandle:n,onChange:i,onDraggingChange:o}){let a=ef(f=>f.gl),s=ef(f=>f.raycaster),l=ef(f=>f.invalidate),d=Ma(()=>uv(e),[e]),{cuts:u,intersection:p}=Ma(()=>t?nC(d,t):{cuts:[],intersection:!1},[d,t]),c=Ma(()=>u.map(f=>f.plane),[u]),h=c.length>0,m=Ma(()=>aC(),[]);cl(()=>{if(!h)return;let f=a.localClippingEnabled;return a.localClippingEnabled=!0,l(),()=>{m.restore(),a.localClippingEnabled=f,l()}},[h,a,m,l]),cl(()=>{l()},[c,p,l]);let b=Ma(()=>new Set,[]);ZI(()=>{h&&(b.clear(),r.current?.traverse(f=>{let g=f.material;if(g){if(!Array.isArray(g)){b.add(g),m.apply(g,c,p);return}for(let x of g)b.add(x),m.apply(x,c,p)}}),m.retain(b))});let y=Ma(()=>h?f=>{if(f.object.userData.riSectionHandle)return!0;let g=f.object;for(;g&&g!==r.current;)g=g.parent;return!g||iC(c,p,f.point)}:null,[h,c,p,r]);td(y),cl(()=>{if(!h)return;let f=s,g=f.firstHitOnly;return f.firstHitOnly=!1,()=>{f.firstHitOnly=g}},[h,s]),cl(()=>()=>o(!1),[o]);let S=u.find(f=>f.id===d.activePlaneId)??(d.mode==="planes"&&d.activePlaneId?null:u[0]);return!h||!n||!t||!S?null:od(rB,{cut:S,box:t,onMove:f=>i(nd(d,S.id,f)),onDraggingChange:o},S.id)}function rB({cut:e,box:t,onMove:r,onDraggingChange:n}){let[i,o]=sC(!1),[a,s]=sC(!1),l=QI(null),d=new So(...t.min).add(new So(...t.max)).multiplyScalar(.5);d.addScaledVector(e.direction,e.coordinate-d.dot(e.direction));let u=new tB().setFromUnitVectors(new So(0,0,1),e.direction),p=new So(1,0,0).applyQuaternion(u),c=new So(0,1,0).applyQuaternion(u),h=new So(...t.max).sub(new So(...t.min)),m=y=>Math.max(.01,Math.abs(y.x)*h.x+Math.abs(y.y)*h.y+Math.abs(y.z)*h.z)*1.08;cl(()=>()=>n(!1),[n]);let b=y=>{l.current&&(y.target?.releasePointerCapture?.(y.pointerId),l.current=null,s(!1),n(!1))};return nB("mesh",{ref:y=>{y&&(Vo(y),y.userData.riSectionHandle=!0)},position:d,quaternion:u,renderOrder:2,onPointerOver:y=>{y.stopPropagation(),o(!0)},onPointerOut:()=>o(!1),onPointerDown:y=>{y.stopPropagation(),y.target?.setPointerCapture?.(y.pointerId),l.current={point:y.point.clone(),view:y.ray.direction.clone(),at:y.point.dot(e.direction),cut:e.coordinate},s(!0),n(!0)},onPointerMove:y=>{let S=l.current;if(!S)return;y.stopPropagation();let f=oC(y.ray,S.point,S.view,e.direction);f!==null&&e.max>e.min&&r(Math.max(0,Math.min(1,(S.cut+f-S.at-e.min)/(e.max-e.min))))},onPointerUp:b,onPointerCancel:b,onClick:y=>y.stopPropagation(),children:[od("planeGeometry",{args:[m(p),m(c)]}),od("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:a?.22:i?.16:.08,side:eB,depthWrite:!1,toneMapped:!1}),od(JI,{color:"#22d3ee",renderOrder:3})]})}import{HexColorPicker as iB}from"react-colorful";import{jsx as ad,jsxs as lC}from"react/jsx-runtime";var rf=({colorPicker:e,onClose:t,itemMaterials:r,setItemMaterials:n,inline:i=!1})=>{let o=ue();return lC("div",{className:`ri-popover${i?" ri-popover--inline":""}`,style:i?{padding:12}:{left:e.x,top:e.y,width:"min(225px, calc(100vw - 24px))",padding:12},onPointerDown:a=>a.stopPropagation(),children:[ad("p",{className:"ri-popoverLabel",children:o("color")}),ad(iB,{color:r[e.objectId]?.hex??"#ffffff",onChange:a=>n(s=>({...s,[e.objectId]:{...s[e.objectId],hex:a}}))}),lC("div",{className:"ri-inlineRow",children:[ad("span",{className:"ri-colorCode",children:r[e.objectId]?.hex??"#ffffff"}),ad("button",{className:"ri-secondaryButton",onClick:t,children:o("done")})]})]})};import{jsx as At,jsxs as Yn}from"react/jsx-runtime";var nf=({materialPopup:e,textureUrl:t,triggerFileUpload:r,clearTexture:n,canPlaceImage:i=!0,inline:o=!1,offset:a,rotationDegrees:s,onOffsetChange:l,onRotationChange:d,isPositioning:u=!1,onEndPositioning:p})=>{let c=ue();return Yn("div",{className:`ri-popover${o?" ri-popover--inline":""}`,style:o?{overflow:"hidden"}:{left:e.x,top:e.y,width:"min(300px, calc(100vw - 24px))",overflow:"hidden"},onPointerDown:h=>h.stopPropagation(),children:[At("div",{className:"ri-popoverHeader",children:At("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:c("material")})}),Yn("div",{className:"ri-materialBody",children:[t?At("div",{className:"ri-previewFrame",children:At("img",{src:t,alt:c("texturePreview"),className:"ri-previewImage"})}):Yn("div",{className:"ri-emptyState",children:[At("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:At("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909M3 21h18M3 3h18"})}),At("span",{style:{fontSize:12},children:c("noTextureApplied")})]}),i?At("button",{onClick:()=>r(e.objectId),className:"ri-uploadButton",children:c(t?"replaceImage":"uploadImage")}):At("p",{className:"ri-formatHint",children:c("noTextureCoordinates")}),t&&At("button",{onClick:()=>n(e.objectId),className:"ri-removeButton",children:c("removeTexture")}),i?At("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"}):null,t&&(l||d)&&Yn("div",{className:"ri-texturePosition",children:[At("p",{className:"ri-texturePositionLabel",children:c("texturePosition")}),Yn("div",{className:"ri-texturePositionGrid",children:[Yn("label",{className:"ri-texturePositionField",children:[At("span",{children:c("offsetX")}),At("input",{type:"number",step:.01,value:a?.[0]??0,onChange:h=>l?.(e.objectId,0,Number(h.target.value))})]}),Yn("label",{className:"ri-texturePositionField",children:[At("span",{children:c("offsetY")}),At("input",{type:"number",step:.01,value:a?.[1]??0,onChange:h=>l?.(e.objectId,1,Number(h.target.value))})]})]}),Yn("label",{className:"ri-texturePositionField ri-texturePositionField--full",children:[At("span",{children:c("rotation")}),Yn("div",{className:"ri-texturePositionSliderRow",children:[At("input",{type:"range",min:0,max:360,step:1,value:s??0,onChange:h=>d?.(e.objectId,Number(h.target.value))}),At("input",{type:"number",min:0,max:360,step:1,value:Math.round(s??0),onChange:h=>d?.(e.objectId,Number(h.target.value))})]})]}),u?At("button",{type:"button",className:"ri-uploadButton",onClick:p,title:c("confirmTexturePosition"),children:c("donePositioning")}):At("p",{className:"ri-texturePositionHint",children:c("textureOffsetHint")})]})]})]})};import{Fragment as oB,useEffect as of,useRef as aB,useState as af}from"react";import{Fragment as sf,jsx as Xt,jsxs as Sa}from"react/jsx-runtime";function cC({entries:e}){return Xt(sf,{children:e.map(([t,r])=>{let n=r!==null&&typeof r=="object",i=n?Object.entries(r):[];return n&&i.length>0?Sa("div",{className:"ri-left-panel__data-group",children:[Xt("span",{className:"ri-left-panel__data-key",children:t}),Xt("div",{className:"ri-left-panel__data-children",children:Xt(cC,{entries:i})})]},t):Sa("div",{className:"ri-left-panel__data-row",children:[Xt("span",{className:"ri-left-panel__data-key",children:t}),Xt("span",{className:`ri-left-panel__data-value ri-left-panel__data-value--${typeof r}`,children:n?Array.isArray(r)?"[]":"{}":String(r)})]},t)})})}function sB({content:e}){let t=e!=null,[r,n]=af(t),[i,o]=af(t),a=aB(e);return t&&(a.current=e),of(()=>{if(t){n(!0);return}if(r){o(!1);let s=setTimeout(()=>n(!1),300);return()=>clearTimeout(s)}},[t,r]),of(()=>{if(r&&t){let s=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(s)}},[r,t]),r?Xt("div",{className:`ri-left-panel__action-extra${i?" ri-left-panel__action-extra--open":""}`,children:Xt("div",{className:"ri-left-panel__action-extra-inner",children:e??a.current})}):null}function lf({isOpen:e,selectedObject:t,currentAction:r,onClose:n,onAction:i,renderActionExtra:o,translateDefaultActions:a=!1}){let s=ue(),[l,d]=af(t);of(()=>{t&&d(t)},[t]);let u=t??l,p=u?Object.entries(u).filter(([c])=>c!=="actions"&&c!=="decals"):[];return Xt("div",{className:`ri-left-panel ${e?"ri-left-panel--open":"ri-left-panel--closed"}`,children:u&&Sa(sf,{children:[Sa("div",{className:"ri-left-panel__header",children:[Xt("p",{className:"ri-left-panel__title",children:u.label}),Xt("button",{onClick:n,className:"ri-left-panel__close-btn","aria-label":s("closePanel"),children:"\u2715"})]}),p.length>0&&Xt("div",{className:"ri-left-panel__data",children:Xt(cC,{entries:p})}),Xt("hr",{className:"ri-left-panel__divider"}),u.actions&&u.actions.length>0&&Sa(sf,{children:[Xt("div",{className:"ri-left-panel__actions-label",children:s("actions")}),Xt("div",{className:"ri-left-panel__actions-list",children:u.actions.map((c,h)=>{let m=r?.action.id===c.id&&(r.binding===u||r.binding?.id===u.id||r.binding?.modelObjectId===u.modelObjectId||r.objectId===u.id||r.objectId===u.modelObjectId),b=o?.(c.id);return Sa(oB,{children:[Xt("button",{onClick:y=>i({objectId:u.modelObjectId||u.id||"",action:c,binding:u,screenX:y.clientX,screenY:y.clientY}),className:["ri-left-panel__action-btn",`ri-left-panel__action-btn--${c.id}`,m?"ri-left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":c.id,"data-label":c.label,children:a?s.message(c.label):c.label}),Xt(sB,{content:b})]},h)})})]})]})})}import{useMemo as cB,useState as dC}from"react";import{Boxes as uB,Focus as dB}from"lucide-react";import{useState as lB}from"react";import{jsx as Kn,jsxs as ul}from"react/jsx-runtime";function uC({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:r,title:n,searchValue:i,onSearchChange:o,searchPlaceholder:a,children:s,isOpen:l,onToggle:d,openButtonIcon:u,closeButtonIcon:p,closeButtonAriaLabel:c}){let h=ue(),[m,b]=lB(!1),y=l!==void 0?l:m,S=f=>{l===void 0&&b(f),d?.(f)};return ul("div",{className:`ri-sidepanel-wrap ${y?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!y&&ul("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>S(!0),"aria-label":t,title:h("openPanel"),children:[u,e?Kn("span",{children:e}):null]}),ul("div",{className:`ri-sidepanel ${y?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!y,children:[ul("div",{className:"ri-sidepanel__header",children:[ul("div",{className:"ri-sidepanel__header-top",children:[Kn("span",{className:"ri-sidepanel__eyebrow",children:r}),Kn("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>S(!1),"aria-label":c,title:h("close"),children:p??Kn("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:Kn("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),Kn("p",{className:"ri-sidepanel__title",children:n})]}),Kn("div",{className:"ri-sidepanel__search-wrap",children:Kn("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:i,onChange:f=>o(f.target.value)})}),Kn("div",{className:"ri-sidepanel__list",children:s})]})]})}import{jsx as Qn,jsxs as pB}from"react/jsx-runtime";function cf({objectBindings:e,onAction:t,onFocus:r,onHover:n,isOpen:i,onToggle:o,isolatedKeys:a=null,onIsolate:s}){let l=ue(),[d,u]=dC(null),[p,c]=dC(""),h=cB(()=>Object.entries(e).filter(([m,b])=>{let y=p.toLowerCase();return m.toLowerCase().includes(y)||(b.label??"").toLowerCase().includes(y)}),[e,p]);return Qn(uC,{openButtonLabel:"",openButtonAriaLabel:l("openSceneObjectsPanel"),openButtonIcon:Qn(uB,{width:16,height:16,"aria-hidden":"true"}),eyebrow:l("sceneObjects"),title:l("visibleEntries",{count:h.length}),searchValue:p,onSearchChange:c,searchPlaceholder:l("searchNodesLabels"),isOpen:i,onToggle:o,closeButtonAriaLabel:l("closeSceneObjectsPanel"),children:h.map(([m,b])=>{let y=b.visible!==!1,S=d===m,f=a?.has(m)??!1;return pB("div",{onClick:()=>r(b),onMouseEnter:()=>{u(m),n?.(b)},onMouseLeave:()=>{u(null),n?.(null)},className:`ri-sidepanel__row${S?" ri-sidepanel__row--hovered":""}${a!==null&&!f?" ri-sidepanel__row--setAside":""}`,children:[Qn("button",{type:"button",className:`ri-sidepanel__label ri-sidepanel__labelButton${S?" ri-sidepanel__label--hovered":""}`,onFocus:()=>{u(m),n?.(b)},onBlur:()=>{u(null),n?.(null)},children:b.label??m}),s?Qn("button",{type:"button",onClick:x=>{x.stopPropagation(),s(b)},className:`ri-sidepanel__isolate-btn${f?" ri-sidepanel__isolate-btn--active":""}`,title:l(f?"showAll":"isolate"),"aria-label":l(f?"showAllObject":"isolateObject",{name:b.label??m}),"aria-pressed":f,children:Qn(dB,{width:14,height:14,"aria-hidden":"true"})}):null,Qn("button",{type:"button",onClick:x=>{x.stopPropagation(),t?.({objectId:m,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:b})},className:"ri-sidepanel__vis-btn",title:l(y?"hide":"show"),"aria-label":l(y?"hideObject":"showObject",{name:b.label??m}),children:Qn("span",{className:`ri-sidepanel__checkbox${y?" ri-sidepanel__checkbox--checked":""}`,children:y&&Qn("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:Qn("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},m)})})}import{useEffect as fC,useId as mB,useRef as gC,useState as bC}from"react";function pC(e,t){let r=[];for(let[n,i]of Object.entries(e))(t.bindings[n]??i).visible!==!1&&(t.setAside.has(n)||r.push({key:n,binding:i,label:i.label||n}));return r}function mC(e,t,r){if(r===0)return null;switch(e){case"ArrowDown":case"ArrowRight":return Math.min(t+1,r-1);case"ArrowUp":case"ArrowLeft":return Math.max(t-1,0);case"Home":return 0;case"End":return r-1;default:return null}}function hC(e,t,r){let n=r.toLocaleLowerCase();if(!n)return null;let i=[...n].every(s=>s===n[0]),o=n.length>1&&!i?t:t+1,a=i?[n,n[0]]:[n];for(let s of a)for(let l=0;l<e.length;l++){let d=((o+l)%e.length+e.length)%e.length;if(e[d].label.toLocaleLowerCase().startsWith(s))return d}return null}import{jsx as sd,jsxs as vC}from"react/jsx-runtime";var hB=600;function yC({objects:e,selectedKey:t,onHighlight:r,onSelect:n,onClearSelection:i}){let o=ue(),a=mB(),[s,l]=bC(!1),[d,u]=bC(null),p=gC({query:"",at:0}),c=d?e.findIndex(x=>x.key===d):-1,h=c>=0?e[c]:null;fC(()=>{t&&e.some(x=>x.key===t)&&u(t)},[t,e]);let m=s?h?.binding??null:null,b=gC(r);b.current=r,fC(()=>{if(s)return b.current(m),()=>b.current(null)},[s,m]);let y=x=>{x!==null&&e[x]&&u(e[x].key)},S=x=>{let _=h?c:-1,v=mC(x.key,Math.max(_,0),e.length);if(v!==null){x.preventDefault(),y(_<0&&x.key!=="End"?0:v);return}if(x.key==="Enter"||x.key===" "){if(!h)return;x.preventDefault(),n(h.binding);return}if(x.key==="Escape"){if(!t)return;x.preventDefault(),x.stopPropagation(),i();return}if(x.key.length===1&&x.key!==" "&&!x.ctrlKey&&!x.metaKey&&!x.altKey){let R=Date.now(),A=p.current;A.query=R-A.at>hB?x.key:A.query+x.key,A.at=R,x.preventDefault(),y(hC(e,_,A.query))}};if(e.length===0)return null;let f=`${a}-option`,g=`${a}-hint`;return vC("div",{className:`ri-objectNavigator${s?" ri-objectNavigator--focused":""}`,children:[sd("div",{role:"listbox",tabIndex:0,className:"ri-objectNavigator__list","aria-label":o("objectNavigator"),"aria-describedby":g,"aria-activedescendant":h?f:void 0,onFocus:()=>{l(!0),h||u(e[0].key)},onBlur:()=>l(!1),onKeyDown:S,children:h?vC("div",{id:f,role:"option","aria-selected":h.key===t,"aria-setsize":e.length,"aria-posinset":c+1,className:`ri-objectNavigator__option${h.key===t?" ri-objectNavigator__option--selected":""}`,children:[sd("span",{className:"ri-objectNavigator__name",children:h.label}),sd("span",{className:"ri-objectNavigator__position","aria-hidden":"true",children:o("objectNavigatorPosition",{position:c+1,count:e.length})})]}):null}),sd("div",{id:g,className:"ri-objectNavigator__hint",children:o("objectNavigatorHint")})]})}import{RotateCcw as X2}from"lucide-react";import{useRef as Bt,useEffect as dl,useMemo as Dr,useCallback as ld,useSyncExternalStore as vB}from"react";import{useThree as yB,useFrame as xB}from"@react-three/fiber";import{Sphere as wB,PivotControls as MB}from"@react-three/drei";import{Vector3 as Jr,Vector2 as SB,AdditiveBlending as uf,TextureLoader as CB,Matrix4 as PB,Quaternion as Ca,Euler as cd}from"three";var xC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15mFxllfjx76nqTmclewJJSEIWsgBh3xcNi0mqExHUjMO46wwz/lSYcQHFJTqKqCgoKu4CMipBBQzpEAJE9kWQnSydzr7va3d6qTq/P97ukD1Vdd9b997q83mefgKm6r1Huuq+577LecEYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYY00qnk446BhOcRB2AMcaY+NP76EEVnwX+BTgeqAAWocyggltkAiuijdAUyhIAY4wxh6UPch4p7gUGHOIluxD+n0zizlLGZYKxBMAYY8wh6SzejXIP0PFIL0X4mCUByWEJgDHGmIPSGj4M/AY33J+PXWQZK1NYHmJYxpNU1AEYY4yJH63hWuAO8u/8AbqQ5rPhRGR8sxGAGNMahgP/hXIpwgBgO/APhF/LJB6NODxjTJnSmfwvwleKfPsbkuEkrwGZUFgCEFNawxeBbwJVh3jJX2jkk3IFW0sYljGmjKkizOKHwLUBmtkmGXr4ismEx6YAYkhruAn4Lofu/AHeSxXP6GyOK1FYxpgypi9SySz+QLDOH6DeRzwmfJYAxIw+xKXAdXm+fAxZntOZnB1mTMaY8qZz6ch6/gJ8IHBjwqvBIzKlYAlA3GT5WoHv6IfwuM7y8MU1xrQ7Opsu1DMDmOKnQf7qpR0TOlsDECP6ID1JsYnifi854DrJcLPnsIwxZUrn0J1mZgLne2pyG2kGygR2eWrPhMhGAOKkguMoPilLAd/Xmfxc5xa0bccY0w7pg/Skmdn46/wB7rDOPzksAYiTFpoCtyFczW5m6Fy6eojIGFOG9AH6k+Lv4HX9kCLc7rE9EzJLAOKkC4uA3YHbUSaym7/rA/QPHpQxppzoDAZTyZPAOM9Nz5FJLPDcpgmRrQGIGa1hOvB+T80tJstEmUKtp/ZMQukcutPCxcAolBTCcoRHZSJroo7NlI7OYijKo8Aw740Ll8sk/ua9XRMaSwBiRh/iQnI84bHJzcC7JcPTHts0CaE1VAFfA64Buuz31y3A7+nAF+RSNpU8OFNSOpvRZHkEGBhC88vZyTCZSjaEtk1IbAogZmQiTyI847HJXsDDWuNpi49JDJ1BZ2A28GUO7PzB1Xj/GE08qw9xTEmDMyWlNZxKlicIp/MH+Jl1/sljCUA8+d7K1xm4T2fyn57bNXGW5hbgHXm8ciRZ7lG1EcFypLM4F3gM6BvSJRrI8puQ2jYhsgQgjiZyPzDPc6tphNu1hpvsRl/+dAYjgU/k/QbhQmYxObyITBR0JhehzIZQa/PfLVPYGGL7JiSWAMSQCArcElLz1zGL3+mLVIbUvomDCt4LpAt6j/Kv4QRjoqA1TEJ4COgW5mXI8eMQ2zchsgQgvu6C0FZof4T1zNQHQr0xmCjluKDg9wjv9B+IiYLOZCLwV6BTyJeaI5N5I+RrmJBYAhBTkqER5bYQL3EZlTyqs+kX4jVMVIRTinjXMTqDwd5jMSWlM5mIcB/QMfSLCT8K/RomNJYAxFkTtwPbQ7zCmWR5WmsYHuI1TInpI/Sm2NXeKc7xG40ppZJ2/rCQ53moBNcxIbEEIMbkCrZC6KU1RwDP64OcF/J1TKk0cXLR703Z0dJJVeLOH+BWmUauRNcyIbAEIO6auQVoCPkqvUkxWx/i0pCvY0ojSIlXGwFIoAg6/y2kuatE1zIhsQQg5uRy1gG/LsGlupJjptbwvhJcy4RJA4wAKKe3Vg80CRFB5w/wSzv1L/ksAUiG74GHkwKPrAPwJ51VwP5xEz8SaASgilSABMKUVESdfwtpflrC65mQWAKQAJJhJcrvS3S5NMqvtIbPl+h6xiOdSwUwNlAjOVsHkAQRdf4Af5YJrCjxNU0ILAFICuE7uMNbSnM1+L7WcFOJrmd8aWQUwTsESwBiLsLOH7Ctf+XCEoCEkAx1KPeW+LLX6Ux+qtPsc5IYWS/D97YQMMYi7vyflQzPRXBdEwK7sSeJ8C0o8bYb4VOcxe+tdHBCBJv/bzNcH6C/h3aMZzqLCRF2/mBP/2XFEoAEkQxvIcyI4NJXsZ6/6vTQy4qaoMTTAr5KzvLSjvFGZzEB5X6i6/xX0Y+/RnRtEwJLAJJG+CagEVx5Ml2ZpTUcFcG1Tb6CbAHcVyLXAegSOupCxuj88jrnQmt4F8oDRNf5A9wmZ9Ac4fWNZ5YAJIxM5J/AnIgu/w6Ex7QmtHPFTQA6gz7AMX4aS1YCoCvopIu4lSzbSfEWFWzVOqbr4uRPZWgN7wDug0jrM+wkxa8ivL4JgSUASaR8O8Jrn47yhNYwKLIYQqRLOFoXcorWJnCkIxVw+9/ehNNVEW/thW03PwGugT1rVVIo7yfHY7oiuVNXWsM5wAygc7SB8CuZyOZIYzDeWQKQQFLNEyhPRhcAo4GndAYjI4vBM13IGF3E38myhhQvI6zXRXxPlXTUseUtxRiPrfXkIYZ4bC80uoiLET5+iL8eSxMfKWlAnuhDnAzMhMinM5rJcWvEMZgQWAKQXDdGfP0hpHlcazw+dUZE5zOAFI8B79jrf64CvsBivhdRWIVTRntu8TTP7YVD+Pph/145tUSReKOzGEWO2UCvqGNB+T+ZwvKowzD+WQKQUFLNQ8CLEYdxDPD31ieV5Krg/wFHH/TvlP/WxQlZES+eE4Bc/DtOrWUCykVHeFmizjbQGYxEmQuxWL+gpLk56iBMOCwBSDKJfBQAoC85HtOZnBF1IAGccpi/E3Lcmoj5cPU6BQDEPwEgxTfyeNXK0OPwRGcwmDRz8LWYM7gZMpE3ow7ChMMSgCSbyP3AP6IOA+iF8Ig+yHlRB1KkI22rPJfFXFGSSIqkM+gMHOu1UYl3Uqe1TMlzt8Ky0IPxQGsYRJq5EKu1F8mZAjMFswQgwURQ4H+jjqNVd1I8rDVcHHUgRag74iuU72ttjIeS04zC//e5vz4UmyfRfagiSF5P/6DxTwB0Nv2Ah4FhUceyh/KkZHg66jBMeCwBSDjJMAN4Puo4WnUBZuhMLos6kIIoC/J41TBS/GfosRTL//B/m3guBFzEu8l3iiLF0lBjCUhn0Icsj0Jov8PipPlu1CGYcFkCUA6UaVGHsJfOCDN0JpdHHUjehHl5vU75qi6hR8jRFMf3AsA22ZiuAxBuyPOVSof4Hl2rc+hOmlnAiVHHsp95PMesqIMw4bIEoAxINQ9FWhfgQFUI03UWV0YdSF5a8hoBAOhNji+GGkvxwkkAYrgQUOuYDJyZ58vXy7E0hBlPsXQ2XWhiBsRwrYVwo0wr8cFjpuQsASgX+a2GLqUOKNN1Fh+MOpAjkdGsBrbm9WLlWq2NZRXEcIaPJYZTADm+WsCrj7y+IwI6g85kmYlwYdSxHMRy+nJP1EGY8FkCUCZkEo8Cf486jv2kUe7QWXw06kCOSPIeBeiE8LVQYymQTicNjAip+aGtZwzEgtaRQQqoyyAsDjGcouiLVJLmXvYtPBUfwg/s0J/2wRKAciIFPRmVShrltzqT/xd1IIeVK2iv88e1NkYVEI/iOMI8Ja4iRoWelC8X9PpcvEYAdBop1nMXkIk6lkPYTEd+G3UQpjQsASgjMomnUB6JOo6DEITbdCbXRB3IYRSSAKSR2Gy/BBgVaut62EJJJaO1TADOL+hNcRsBOIsfAh+IOoxDEn4s49kZdRimNCwBKDepeA1P70UQbtEaro06kEMotNrZlbooJoWPcqEfynRCyO3nR/hKEe+KzQiAzuJGiHUSXE8LP406CFM6lgCUGZnEsxDb7TsC3KI1XBd1IAfI8UYR77rJexzFGR5y+yeF3P4R6WIuAy4o+I0V8RgB0Bo+h/KlqOM4gl/JFDZGHYQpHUsAypFbJX2k8rZRuiluSYCMYhVa8HnnF2od1aEEVJiwE4CxOi3ie4UW9fRfzxDWeo+lQFrDh4HvRx3HETSSjX2MxjNLAMqQTOYlYEbUcRzBd3QWn406iH0IbxX8HuU7qqRDiKYQYe0AaNOZc6IrUauLuDiPE/8OZnFruezIaA3vAX4DMT9MSvmNTGFV1GGY0rIEoFy5J6Y4F/IQlFtjlgQUc+rZSdRFV+ugdQtg+IfHaKTTAMU8/UPE8/+t52L8CaiIMo48NJOyp//2yBKAMiXVvA7cF3UcR+CSgBo+E3UgrYpZBwDwjcgOCurOYKBD6NfRaErVah1nAuOLenOEOwD0Ic4CHoAYHyD1tt/JpHifl2DCYQlAefsakI06iCMQ4EcxqRNQ7LnnQxD+3Wsk+WoJffi/TTQjAIXu+9/3vZEkAPogJ5JjFtA1iusXqJl0bBazmhKzBKCMSYa3gLuijiMPrk5A1CMBWV4P8O4v62o6e4slf2EvAGxT8hEAXcJo4N0Bmij5FIA+yDBSzAZ6lfraRbpbJrAk6iBMNCwBKHdZvgrxPAxlP24koIZPRxbAKDYC64t8+zHU8ymf8eRFSpYAjNS5IVYbPJgs1xPkHiUs8hfMkels+pFiFjCglNcNIIva0397ZglAmZMprEK4Peo48iTAj6NMAih+HQDAdTqfbt4iyU+ppgAqqA/txMED6CKOBf41QBNNLC/dk60+SE+yPAIcX6prBqb8UapZGHUYJjqWALQHWb4FbIk6jDy5JCC6NQFBpgH6UFHySm+lSgAgVdJpgC8QbHFjnYynxVcwh6Nz6YjwADEomFSAHMp3ow7CRMsSgHZAJrMF+EHUcRSg7eyAKJKAVwK+//O6ojTzv6oIcFwpruUuWJoEQOfRG+HjAZvJ93THQHQ6aRq4O6bH+h7OdJkcaLTLlAFLANqLNLdC9FXRCuCSgFn8R0mvmuLlgC10p5H/9hLLkczhGKBLSa7llOYJt5Jr0YD/v5T5nqI5vK7cAry3JNfyR1FujDoIEz1LANoJmcCumJ1glw9B+bnWlHCL3WbeAnYHbOVaXUQ/H+EcVksJn/4BlDGhX8KtoQg+8iPhjwDoLL4OsalhUYi/ttYJMe2cJQDtSV9+BaVdGe2BALfrTK4qycXOoBmKKAm8r664OeywDS3BNd4mDNEZIW91rOA/gZ6B29FwEwCt4d9RpoV5jZAoOb4TdRAmHiwBaEfkDJoRvhp1HEVII9ylM5lakqtp4HUAAJ/WBQz00M7hhF8CeF8pKsM7eri1mqKf46JbwlvdrjOZDPwsrPZDNqP1rBBjLAFodyZyD5LIG0Aa4fetN99wSeB1AAAdqQj9+NdSJwCQC3ErYIp/w88e+g0yhk0e2jmAzuRsJBH1/Q9O+FbUIZj4SOaH2BRNBNVZ3AA8FHUsReiAMF1rmCwZHgvtKsIrXs6QUz6ptdwkI1npobWDGQICVcdAp8FQ2evtnw69oLL32/+eqgCpgHRrmYJUB0jvtc6uZTtoa9XoltYdo9nd0Lx5358Ox7xf9YatwDpgpYh4OT9eFaHO2xbKUIb/tYaxQA2lXXjpjzJTMvwj6jBMfMT7iEoTGq3hEeCSqOMoUj2QkQyPh9G4vklXqtiGnxGy22REsBMPVbUbMAY4AffUPxQYTMOyC6g6ppJU+GcBHUY9sBRYDixr/XMxbh3FfBFpyqcRrSODMtNLRMJvZDif9NJWK53BQNI8TRSjLn4owtkyyRIA8zZLANopncWZKM+T3M/AdlJcJhN5IYzGdRELwct8926yjJBRRz5rXVUrcDX3x+E6+xOBsbhOJ4m/pxagFnfIUtvPqyJywPy8LuJR4GJP1/2ijPB3vK3OoTtNPI5wsq82I3CfZLgy6iBMvCTxpmI80Rr+TPL2MO9tGzkuCWNRk9YxHeX9fhrjVhl5YG0AVT0GOAM4HTgfOA8iOVCo1LbjKi4+BTzN2ndvZ9eMv3trXblcRvI3L03NpSP1PJzAQj97U1KcKhN5NepATLxYAtCO6SxGobxBsteCbADe2XryoTday5cRvu2pud20MJxRWgFc2vpzAXCsp/YTTpWmecLuJ6F+DjTMhdzmAM0xQkYGPwlQp5OmK/eQ7CQZ4B7J8IGogzDxYwlAO6cz+SkSwSl2fq0nzTtkgr/qb7qISbgFX8VLdYGqc6HzpdD1A+uoGNIP+87lIQeNL0PDI1D/COx+ErQx3zfXM5xuIuSCRqE13A78Z9B2IpYlx0kymXlRB2Lix25G7ZzW0Bc3T9s96lgCWkmai3ydba619EWKOBq4YiB0eQ90uRI6XuRW3ptgcrug4SHY+Veonwm5bYd79YsygjODXlJruA7K4Khc5W6p5kNRh2HiyRIAg87ierQsqoMtR7lIqlnmozFdxFLyWfVdMcR1+l3fDx3PxcprhCkLu5+DnffCzj9Bdt3+L7hDRvCxIFfQWbwf5U8k/xeZRThBJpXmYCSTPEn/gBsfdvAj3PatpBuMMFtne6rDL4fZMpXuBz3+Gwa9BEOWQp9boeP52FcqbGn337nPrTBkJQyYA90+BLJn7eSbQVrXWVyAchfl8Yu80zp/czjl8CE3AclUGhBuiDoOT0aRZY4+6KWe/H4JQBo6XQr9p7vOp/cPoeq0wJcxRZIK9/vodxcMXeP+7HVLpaoWNbKpNQxH+SvQ0XOkUWgm520RqylTNgVggNZKbLN4HoLPn8bEs6S5TCawq9gGdBHjgcfocAJ0+zh0+6B78jdxtxC4E7hDRFbn8wadQR/SPIOf2g9x8HPJ8F9RB2HizRIAs4fO5CIknOp6kVAeQZgsGfJeQr7nraopsksm0/jW/XTOiH1VEqkZuB/4kYg8fagX6XQ60ZVHgXNLFlm4GkkzUiawIupATLzZFIDZQ6p5AuGBqOPwRrgU+KPOzb/Ogap2U9X/AN4gfdwDdK62zj+5KoH3A0+p6ouq+mFVrdz7BTqNFF24m/Lp/EH5hXX+Jh+WAJh95fgi7smpXFxBA79WPXwvrqpDVPVHwCrgF7ja+6Z8nI6bFliiql9SVbft9Sx+iJRVidzd5Phe1EGYZLAEwOxDqlmI6wDLyUeo4daD/cVeHf8C4LNAt5JGFrmWqAMotYHAjcAK3ThnNpW9fJ1AGBc/kSlHPnfCGLCxTXMQ+hC9yFEL9Io6Fs9ukAw3AqjqUOC/gauBqiiDCqYF2NX60wA0tf407vfPOd7u7Fta/31/6dYfcNWh00CH1p+qvf6swi2U79L6kz6gpcTI7oSVv4W6G6HxgJoCSbMTGCYZNkQdiEkGSwDMQZVNJbT99Z5wI2c9NAi4isScgZDDnZ+zrfXPnbhTeHdB4esbQ7B3MtAFV1SyO24wJSG3mJYdsOwnsOQH0Lwp6miKo3xDqpkWdRgmORLy7TSlptPpQFfeAoZHHYsXlb1g2Bdh6LWQivMDfwuwufVnW+vPDg7+xB53Kd5OBrrjBpR6EusRg+atsPgmWPojyO2OOppCbASGS4btUQdiksMSAHNIOpOrEP4v6jgCkUoY8ikYMQ0qe0QdzUHsxnX2m3D38M0ks7PPlwA9gD64ZKAvsTwBuWE51H4VVv0e0KijOTLhf2QSt0QdhkkWSwDMIaki1PAcwllRx1KUflNgzC3QOU6DGC3AemBt60/RdYrKyFHA0a0/fYjVCMG2F2De52HLk1FHcjjLgFHF1Lsw7ZslAOaw9EHOI8VTJOmz0m0cnHA79Dwv6kha7QDW4Dr8DZT3E35QaaAfLhk4BremIGoKq/8I8z8HjWujDuZAwsdkEndEHYZJnuTc1E1ktIa7gX+LOo4jSneCYdfBsC9BqkPEwewCVgMrcUP7pjhHAYNwhzJ2jTaU5q2waBosuw00NkncAjpxooxvf/s5TXCWAJgj0hkMJM0C4vE4dnC9x8MJP4cux0cYxE5gBa7T3xphHOWqNy4ZOBboFF0YW56BN6+GHW9EF8PbrpAM90cdhEkmSwBMXrSGrwLfjDqOA1QdDaO+BwM/FFEAOdyT/mIg8fvIE0Jw0wTDgAFEUs9MW2D5z2DBDa6WQBSUF8hwjkgSVimaOLIEwORF59KRBuYBQ6OOZY8BV8HYn0a0un8HsBRYQjz24rdXHXEjAsNw0wUlVr8IXv0wbH229NeGSyTDY1Fc2JQHSwBM3nQmUxHuiToOKrrD2NsieOpX3FEBC3Hb9ky89AOOxy0eLCHNwpKbofZrkGsq1VVnSYZMqS5mypMlAKYgWsPfgXdEFkDvS2Hc76DjoBJetAVYjuv4d5TwuqY4XYERuFGBEm4p3PEavPoh92e4lBRnyET+GfaFTHmzBMAURGdyCsKLlHqzdqojjJwGx30BpFRzvg3AIqCO8jogsb3oiEsEhuPOMSiB3G6onQZLvh/eTgHlj1LNVeE0btoTSwBMwbSGXwD/UbILdh0Lp97r/iyJRtzTfi2QLdE1TXgqcInAKEqWCGyY5UYD/J8r0EyKsTKRRb4bNu2PJQCmYFpDX1wPGf7qu/7vgXF3uHn/0DXhOv1a7Im/HLUlAqOByvAvt3sFvDwVtj7ns9XbJcOnfDZo2i9LAExRdCb/g/CD0C4gFXD8t1xhn9A1AwtwHb/VUyl/VbjRgBGEPpOVa4QF17nDhYJrIMtImcIqH40ZYwmAKYq+SCXreR13J/Wr40A45R7oeb73pveluMV9r+EO5Um4bD00bnAV61p2tP7sfPufybnXaA5Q989t0q01nqQC0h1B0lDRDSq6QsVRb/9Z2QOq+ro1GYnXCTgJV2UwZKvvhjf+E7KBzn74tmT4iq+QjLEEwBRNZ3IZwsNeG+31TjjlT1DV32uzB9oAvELiKvZlG6BhBTQsg4bV0LTBdfpN66GlhAcLVXSDqn7up0Nf6DgAOg+BToNiftzywfQCTsFVGgzRjlfhn++F+rpi3r0BGBGn4351ESeifBDhdJR1CL+VEVaXIEksATCBaA01wCQvjQ36GJz4C3eEb2h24Z74V4Z4DU9adsGuhbBzIdQvd0fUNq4n1sfTSsolb52GuISg6/HQZYQ7pyHWBFfj6kTc7oGQNG+Gf14Jmx8v9J2fkgy3hxFSobSWsQhfB97HgWUYvyoj+FYEYZkiWAJgAtHZjCbLawRaVSUw8usw4uve4jqQ4rb0vUFs5/kb18OOebBzvuv0G1YS684+X5KCToOh62iXEBx1AlT2jDqqQ6gETsCtDwjp9phrhNc/6aYF8rOAfpwkZ0S7MlXncxwVXA98gsMtnlDOlZF4XflowmEJgAlMa/g+8Pmi3pyqgpN+68r6hmYb8CKwOcRrFCHX7Dr77a/B9tdh1+KoIyqdqv7Q4zTocQZ0G+PWHsRKH+AMoFtI7Sss+ibUfoMjJnnC5TKJv4UUyBHpQoaRYhpwFfmtmrxNRvDZcKMyPlgCYALTB+hGJfOAgQW9sbI3nH4f9LwwnMDIAvNbf2JyfGvLLtj6Amx5Hra/6Z4G27t0JzhqHPQ6xyUEsVlDkMatcR1DaAcOrbkHXvuoKyB0cE9IJprKmzqfAaT5CsInKWSET/mLjOR94UVmfLEEIAF0Hr2p5BPACJQ1pPmDDGNB1HHtTWfxAZQ/5v2GLiPhjIeg87CQItoEvIA7ojdiuUbY+k/Y9ARse9WdJGcOLlXpkoGe50Cvs2Oy26AHcDahHTa0aS788wpo2bb/3yjC+TKJkp401Hq/uQ74NMWcuyx8XYbH8ORQcwBLAGJOF3I2KR5i36I7OeBvKN+TkaW9ORyO1vAocPERX9h1LJw1B6oGhBEFbk//m0T71K+w/Q3Y8AhseRHUCgsVLFUFvc6FvpdAV/+7TQuTBsbiRgRCuG1u/yf8Y6Lb1dGmxCV/9VW60JVPo1xP8UW+NpJljIxio8/YTDgsAYgxXUEnGqnj8MebPYnwXYZRE/W54FrDWNzeukMPF3Y/3T35d+gTQgT1wPMQ5b2neStsfNx1/I3roouj3HQcAH3GQ9/xrh5BZPoDZ1LMg/ER7ZoPL1wKu1eBK0s5VjIUtWewELqEjrTwKYTrgb4BmtoNVNtWwOSwBCDGtI5/RflDni9/A+EmlnOPjI9umbvWcDPwuYP+Zc8L4YwHQ7qBLwNeJrISvjsXwtoHYes/3PGwJhxSCb3Pg/6T3TbDSFThkoAQjh1uWOqSgPq6myXDF/xf4G06lwqO5SqEaSjHBWwui/IBGcmfvQRnSsISgBjTWr6EcGOBb6sDvksjd8oJlOxw8jaHXBDYezyc/jdId/V8xRzwT2CJ53bzoW5uf12NW8VvSqvrKDjmPW43QSS3spHAOLwvEGxal2PnmxdK70ue8duwo4qwiPcjfAv3fyJwk8DHZAR3emjLlJAlADGmdVyJ8pci374O4RY6cZsMoP7IL/dHZ+03ctH/clfa1/vq7nrgWUq+vU9bYMNcWPs3G+aPg06D4ZjLofcFlP6W1hc4hxCKB60DLhMRr5ml1nIOwveBCzw2+3kZEeK5ICY0lgDEmNZShfAirjxZsTai/JQKbpXjSlf3VmfxGMp4+lwGp88IofPfgOv8S7mNTmHzc7DyD9F3/Cnc4XZtu7KFfb/Nbesfs7jnsxbKoqbQYXUaCEe/B3pf6IoPle7CwLmEUEp4A/AOEZkXtCFdwmiy3ARcHjysffyvjOBrnts0JWIJQMzpYsaRZS5Cr4BNbQVuo5kfyRi8H1K+P61hLD0veJUzH6rYc9CMN/Nwq/xL1aO1dvyr/gS715Tmkmnc0fUdcFPOHXBLKytaf4rp31pwCUFz60/jXj/ltEmh07Ew4H2urkDJD2brhgAAIABJREFUbnEp4FTA+7bWVcCFIlLUHJcuoA9pvgp8CvfJ8enHMoJrPLdpSsgSgATQWk5DeATwUT91J/ALKviBDCW03kxVzybX+ASpqg7+Ws3hKvot89fkkWx/E1bcAfUhXjOFG0Hu3PpnJ1yHX0o53BruBtxxCfW4ZCHJugyHwR8t8RbCkcDJeL611gEXicjqfN+gq+lMA59B+TJhFDBQfscIPhH1ziMTjCUACaELOYUUj+BvnLEJuIMWviGjyfvGkg9VHQfMhcCjFntpAp7BjYqWQONaWPlH2BxSmYVOQBdcpdlOxPOb2IRLF3fgkoJE3urFjQQc+6GQtp4ezEBc4aB8qubmbSEuCTjs3JMqKer4IHAToWxTAIS7GcZHROJSXtMUK463HXMIISQB4AaA7/SVCKjqSOAJ4OjAke2xC3gKSnESarYBVv/Frez3WbFPcB1+d1yn77VvKIEcLhnYjksIknbrT3WEAVfA0ZNDPm2yTS/gfDwvDnwVGC8iWw72l1pHNcr3cBWLwqH8hZV8IMqtxsYfSwASRhdxOjAHP9MBe6sHbge+JyNYX0wDqjoQeA4Y5C+szbjOvwSL/ba9DEt/BU0eCwm1dfpHkbxO/1ByuERgKy43S5Kqo2Ho1e5EwtB1wS229zoC/yRud8CeL0TrAr+bgWqfFzqA8DA53i0jS7ry1oTIEoAEah0JmIM7sswvYRfKb0jzHTmOtXnHpNoVd3M6xV8wG3Cdf8gPGy073cr+DY/4aS+NK6Tai9LP5ZdaE7AFl6clZlRA3E6BwR+FCt91KfbXAbgQr7NhMB34ACulJ418nXAW+O3vKXYxUU5OXMpnDsMSgITShYwhxaOEN8/nEoEUN8owjjDvqGngL3jdYrQGt80v5JVoGx+HFXdBy47gbXXCTc50I7TD42Irh6vAvInkJAIdesGQf4cep4d8oQrcdEA/f03Wz36QNRPPIYyHgAM9RwvvktF4+JKYOLEEIMG0lrGtuwPCSQKcHcBtVHKzDOHgc4+qPwY+4++SK3An+YXYk2R3wdJfw+ang7fVBXcbDvthMgmagNUka2qg90Uw9JMhnzyYxiUB/T21p7D+Y7Aj5OJ7yqt05GI5ttTVtkwpWAKQcFrH8SiP4nXe/aB2oPwMuFFGvr0aT1WvBW7xd5llwD8Idcn59tdhyc+gKWA5hC64QnC+yxyUg43AepKzc6CqHwz7TMhbBlO4qoEDj/TC/GgzrJkEDY/6ae9Ab5LlnXayX/myBKAM6BKGkuMxDwd65GMjws2k+BFD9TLgPrwtb1sMvOSnqYPRZre1b+1MAvVMHXCjud09xVWudgHLSc6UgKRh4FQ4+vIQKwl6TgJyW2DludC8wE97b5tHivFHmv4zyWYJQJnQOgajPAYML8kFO4xZw6BXeiAdPJ2LGvKTf9MmWPRD2FVbfBsVuCf+ntg3J1+7gaUkq6hQtxNg+LVQGVaGlwLOw9vMXfNCWHkm5Lxtk11IC+N91wcx8WO3sTKiizgWeBQ/J3wdWqoLDHweOvjaSrUKt+AvpM5/x1tQdws0byu+jZ64ygbtbXGfD424wxqTlAR06A0j/ge6hPVVSuO2CHpaGLjrflh7JR6+Q7W08E7r/NsHSwDKjC6mPzkeBcLb6NzvTuj2YU+NrcNt9QtjnFhh3SxY8XvQInufDsAAbJ4/qHrcSEBS1gSAKxg05OPQ95KQLpAGLsLbQv6N/w3bbg3SwqLWOf9VfgIycWcJQBlqTQIeIdgpggfX/TPQ58eeGluP6/xDeDTMNcGSnxZfyldwW7f7YU/9vmyFRHYt/Sa4mgESRiWnSuCduMIRAWkLrL4Ydj9ZzLuXkeadchxLgwdiksISgDKly+hJMzNx55T60fFsGPAEiI/qNtuBxwjlGLqWHVD7fdg5v7j321N/eFYCAWZiInPUOBjxOUh7WvKyj47AJbjToALKroUVp0G2oHO+rPNvp+zZpkzJELawi8sAP+Xt0n2g/589df67cUUDQ+j8G9fCvK8U3/n3wi2jtM4/HMeQzJLI21+DeV/1WyZ6D4/fh/TR0P//KOA/8nJaGG+df/tkCUAZk5PZhTIZuD9wY31+BhU+Sg204G529R7a2s+Ot+CtL8PuIk45TgNDcB2UfSvCk8ZrQbySaljukoBQjobeDjyNl7UwncZDj8/n88plpHmHjGZJ8IuaJLJbXZmTkTSygvcDdxXdSLePQdf3e4hGgedxk8Gebf0nLPy2q+tfqM64p36r5FcaPXFT30nUtAnmfx12et93jzv7wlMdjF7/C1VnHu4V9uRvbA1Ae6FKmjpuB/69oDdWHgeDXoGUjxPNXgYWeWhnP5ufhcU/Lm6lf29cdVb7JpTWRkh0iZlUFYz4PHQ/OYTGTwTGBG+maR6sPB20Yf+/WYZyiYykLvhFTJLZCEA7IUKW4VwN/CD/d6Wg7+88df7LCKXz3/RkcZ1/CleM7Wis84+Ch0Xvkco1Qu13YcsLITT+Ju4wrIA6jIHeN+7/vy6lhfHW+RuwBKBdEUFlBJ9HuD6vN/T4InR6h4crbyWUEr/rZ8PinxTe+VcCQ0l+J5RkFbjTE5NMW1yBqc3P+G4YdxhWEdNZ++t+DXSe2PZvC8hygc35mzb27NNOaS2fQriNQyWBHcbBoBdAqgJeqQm3EcHz8XAb58KSn1NwZZnOwGCSuRK93KzFHR+cdJKCYddAL387bp3uuO2BAT+sLSth+Sm1NG+yCn9mHxVB3qw1TAI+DJyGq5K+GVfdZSOwEWUdKdaTYyPCRmAtKdaynfUyNVGFQcuOjORnuohdwK854HOQgr4/99D5ty3689z5b3qyuM7/KNywv417xUPQj1dcaA4W3+bWBfQ4zWPD24AXgbODNVMxCIYsfloqulvnb/ZR1AiA1nAUcDcwpcjrZoH1CKtR1gBrUFaTav1TWEuaVVSyXsbTUuQ1TB60jsko97B3FZLun4Y+t3lo/Q1gnod29rLlBTfsWuiwf2/cfL+Jj524pSHlItUBjv+SO0zIq1OBEUEbyQEXiojv+QqTYAUnADqdDnTlUdxJFmHL4UYUXGIAaxFWIawClpFiGR1YKuPZXYJYypYu5GxSPAj0IX0MDH4LUkEnyDcCf8dr8fdtL7sKf1pgTng0LgEw8bILym4TWroTjPoqdAncYe8lBVyKh/On3wBOE5EQKnCZJCo8AajhOuCmEGIJYi2wDGEZOZZB60+aJVSxTMb7WE1T3rSWExBmc/SfB9LlvQFbawYexmuxn/olMO/rkCsg1xNcSV9b7BdP24EVUQcRgopuMOZb0NHTcb+Am7+6FA+LV64Xke8Gj8eUg4ISAH2RStazArdzOkk20ZYUKEtb/3kpaRZRRZ2NIDja8NRH6Hj+HcFbeg6vd/amzTDvBleEJV/W+cdf0msBHE5Vfxj7bajwsYW2zUjglKCNNAAnisji4PGUD51NF5o5DmEoMAShP4qQYhEpZskE1kcdYxgKSwBmcS5KOc4hbUFYDLyF8ibCYrIspgsL2svogap2wW1AHhKspaXAP4IH1CbbAPO/Vlj5VQGOBbr5C8OEYAVuFKBcdRsDo77ijhX25gJcvepAZolIxkMwiaIPM4Asw4DhKMNQhiEMB4Zx+IfaZuBndOL6cntYLCwBqOHDwJ0hxRJX7SI5UNVpwNeDtbILN/Tvad2mZmHhjbD99fzfY51/MuSABXgpfR9rvS+AYZ/B347rjsC78LCFolpEaoLHEx86nQ50ZxjKcHKtHb3r3Nv+uWPASzxFlgkyJYyDTKJRWAIwkw8hAWrKlxcFVqIsQJgHzCPHfLK8JZcna2BTVQcACwl8Bt4TeB3TXfYbV+wnXwIMwk2XmnjbjJdid4kw6Co45j0eGxwCnBW0kfnASSKSuF1Weh896MAoYCzCaGA0rnbycQTc2p6HX0qGq0O+RskUmgCcjfBcWMGUkS0I88gxD2E+wltkmc+LLJVp8XvmUdXfAh8L1soS3J5lTzY96fZWF2IQHhZKm9DlgFq8DRTFn7jtgd0Dz9/v5XzcIpdA/ktEfu4hmFBoDYNIMZoco4GxwChcR+9zdWWhcihjpJqFEcbgTWEJwHTSdGUJbpDVFG43LvOeD8xrTRLms4sFMpWmKAJS1ZNxdXoDLC/eDcwGX/8X6pfBvK+4euv5GoA7Zc7EX7lUACxERVcY+x23ONCLzsAEAj7wrgdGikikKzF0Nv1QxqGchHIS7jSk0cR1Ik/5hlQzLeowfCh8G+AsPoHy6zCCaceacUPwr6O8hvAGwusyKfxd0qr6MHBZsFaeBVb6CAdadsFb10NjAVMJfUnuGfPtzQ5gedRBRKTzELc9MOWrBKKXXQE3isgNHoI5Ip1LRxoZu1dHP671J2m7yh6UTNFF8GKluEqAM/k1wid8B2MOsB3hDXK8TorXyPEGTbwmV7DVR+OqmgFmBmtlFXjbGKJQ+z3YWsDBQT1w5X1N/O3Cdf6xmwQrob6XwdDCTuQ+NAEuBnoFaWQ3MFpEvNZk1FkMBcahnIhwcmuHP5Lw5+hL4QnJ4OOUtMgV98v4B//B2SxA+SbBV1aaQzsK5TyE81Dc970KtIYVuKperwGvk+IN+vCWnEHeFb5UVYBvBgsvC7wSrIm9rZ9dWOffFQ/ToKYktgGrad+dP8CGOXDUiZ4ODlLc7N2lBNhl0BG4AfiPoiKYRoozGUGK08hxGsJpwGnoXhNyHouBxkSiFnkfTqC9KTqbY8nxbZQPBm3LBNYCLER4iRwvkeIlUrwsEw5+Eo+qXg7cH+ySb+FKB3jQsNIN/efyXEdQhdvcYwf7xFsLbs5/W9SBxEhFNzjxZqj0tWjlDNwC+KI1A6NE5LDHBOt00hzFaHKcjjug4LTWP+M5Vx8W5dNSzU+jDsMHL522zuJMcvwA4UIf7Rmv1gAvobyE8BJpnpcJrFfVF4Azi2+2AXgIL0u5tRneugHql+b3+hSu8y+X0+TKUQtuq98m7Kn/YI4aB6NuwM8tuAqYBAQqOPRzEfmvtn/RuVRQz4mkOH2vJ/tx7H1oWPu0iUqGy2XlkdJ6fWrXGqYAt+CKLpi4OvrKzZz6l0ATh+6YX0+ruVb8HtbOyO+1AgzGDf+beMnhTvjbhlvsV35Dv34N/gj0r/bU2Chc/1wk1RZemnwtG2uGoZyFe7pv7539/nLAv0iGP0cdiC9eB1AlwwzgBOAL4GehmgnBsOsCdv6b8Nb571oE6wpYh9gP6/zjIodb2LcBVwF6Pm+X97XO/8hW/hEa13pqrBaXdRVJpIK+mZ+g/A+u3rB1/vuqR/loOXX+EMIMqmRolAw304ERCD8ECtjMbULXdxJ0D1pF7FUvoaAtsOR20DzHiLsCffxc2hShBdfHrMPVfZqP6/jX4xIB6/QLk2uCJb/Az3+4HFBAyeyDOfaT0HGQh1jKjPIIyqlSze+jDsW30JZQyaVskkl8jjQjgV/iloybqA0PuuV3Nd6quKy5DxryPDWwAtvuV2otuOH8tcBiXO3+5bhT/OqxDt+HHW/Cxr97amwVbuFFkVJVcNznPMVSFlYiTJVqLiuXyn/7K9nKfZ3FOJTvAO3uFKrY6H46nBe0XO8cvMzu7F4Nb34BcnnuXBxK4JMKzBE04Z7w61t/2k2p3oilO8NJt3jaFXAMbgS/SC07YO6x0FIWa9yK1YTyc1r4ilweZF4l/kq2iUom8ZpkqG7d0/5kqa5r9jL0fwI2sBI/SzsUlvw8/86/D9b5hyGH6/DX4KaQa3FP+9uxzr+UsvWw3NcZa2twQzRFqugGgwIeC5JsD5JjjFRzTbl3/hDBLmqZxLNSzUWkuIzAk1Ymb1XHwNHvC9CA4vb9e7DpGdg5P7/XdsTK/PrUgpvBWYqbw1+OGzWO5CQKs8fmp2HHPE+NBazNMfQakABHgyTTWyjvkgxTZDKLow6mVCIroyITeYQXOAX4CG5i2YRp8Kcg1SFAAyvwUs0l1wQr/5DfawVX6c9KTAWTA7bgFu4twD3l26K9+Fl+R/4LYg9rPW5rRpE6DYW+vrYnxt5W4Hp2cqpUMyfqYEotFrdWnU0XslyL2z5oB7r6lqqCdy4LeBLZbNzYcECr74VV9+b32j4k75iQOGnAdfzbsGI8SdAC9LoERvk4br4fBClXv+kxeOESD3HEliLcTRNfkMvLp7RvoWJRSFUmsEsyfJsUw4Dv4g6oML4c868BO/81eOn8mzbDmr/l99oOuFP+TOF24Ib4F+MSAOv8k6ERWDkXmn2czrse98svUu+LodtJHuKIIeEZcpwpk/hwe+78ISYJQBuZyGbJcD3CGOBObCmSH4ODPlEs8BIGq+6BXJ5lIY4hZp/OmFPck/4i3Lz+QU+AMLHWDGRzMP8nnhoMuHPt2KLOB4qzNQhX8zwXymQKOHWsfMXyFiuTWCoZPkqa47EaAsF0OR56nB2ggS0Emk9ss3sNbHoiv9cehVX7y1cOt+h7IW6ThpXdSqZm3l6Tse5VaPDxYLoCt5+zSAOuctOHydcA3EgnjpdJ/FKm2ZhYm1gmAG1kAkskw9XAOITp2GBm4QZ9gmBLPTzVv1g1HTSPPE6wVf/52obburcOGytLur0Tt5zCgp95aFRxH5AiVfaCfu/2EEdkFLgXYaxkuEHGszPqgOIm1glAG8nwlkziX0gxDrgXW7+cH6mAgR8M0EA97rEyoIYVsPmZ/F7bGzvl70h2AXW4X411/MmnHPh73DAP6j1891iCG14o0qCPeoghEo8Bp0uGqTKJpVEHE1eJSADayETelAxTUU7GEoEj6zMBqgYEaGAxXgZdVk0nr19VGlv4dzgNuPv5UmyZbDnZe/i/jQLzfBw530ygg7sC30NKbgHCVMlwiWR4Oepg4i5RCUAbqeZ1yTCVFKfiEgFzMIEqeimwLHgMDStgywv5vbYPCf1EhizH2wfwBJjSNTF1qHUbm+ugwcdpgXXFv1XSAUcRS2YjyrV04kSZZH1CvhJ9u5WJvCoZpuKKXz8WdTyxUtkL+k0O0MAavPQ2ax8k76f/gIcUl6UduJX9G7HxrnKU49DTOArU/sbDRbYRaEvgwI94iCE09bit48Olmh/JeJsUK0SiE4A2kuFpyXAJlgi8rf/lAVfweqiG2bwNNj+V32vt6X9fLbjD3ZYTaArXxNyRSjBveM2dFRBYgO9z17HQ9QQPMXiVA35HluMlw/WS8VGopP0pq1vunkRAeVe7P3Co/5UB3tyAqxcb0Lqa/A78saf/fW3FLd72ce6SibcjbdvMKtTd6eFCywm0YvTo93qIwZs5pDhNMnxcprAq6mCSrKwSgDZSzRyp5iKEC4EHo46n5Cq6QZ9LAzSwhMDjzblG2PBIfq/tQZl+EguUw+Vdq7ANr+1BM/n9nlc95eGMgBZcXYAiHR3kgcIT5QWESyXDu2Qir0YdTjko69uuTOIpyTAF3bNYsH3MovadDKmOARoIcKNos+lJd7Z4Puzp3z0JLsGd1Gfah3yLNjU3w8oZHi4YYDdAt5Oh83APMRRlHsJUMpwjk3g0qiDKUVknAG2kmldatw+eBvyFcn++CpStb8VL3f98n/674er+t2fbcVO0trWv/chR2NqOZTUeLroBN71XpEDTikVZivBRdnKSTOJekXbyAFdC7SIBaNOaCLwP9pQYLr8Vo+lO0HdSgAY8PP3XL4NdeS46as9P/4rbbLGCck9Jzf4KLdlcvwV2LQ14UYUgU+alWwewEbieToyRSdwpU60UfFjaVQLQRjLUSYarSXM8yo8pp2ev3pdCukuABjxUH9vwcH6vq6D91vzP4Tr+zVEHYiJxpNX/B7P4Tx4uHCDB73EWVB3jIYZD2knblr4M35XxZXRfjql2mQC0kQkskWquIcuo1kQgwPhYTPS5LMCbt0DQctm5JtiUZ9nf7sEulVgtuPn+PJdImDLTRHEjPhtfI/gypk0Uf5sT6H1JwOsfVBPwS9IMty19pdWuE4A2MoXlUs01pBiO8EOSfJhqoATAw/D/5mchm+d/vqOCXy5xdmPz/e1dsSc2NrfA2qBr4JRAo3yB7i8HaAZ+SZZhkuFqmcB6n42bI7MEYC8ykTUyic+RZSjKN0jamuyOg6DL6AANrA4eQ76H/lQCnYNfLlF24+r4W2Gf9itLsJVHKx7yEESA73mfdxHsdFHAjX/cS5YTJMPVtpc/OpYAHIRMYaNUMw0YCHyEQGdqllCfdwV48y4Cj0m37ILtr+f32vb29N+A6/xtOVP7VuzTf5ttK1yNjUA2UnQWUnW0qwxYHNfxK2Mkw1SZkpD7ahmzBOAwJEOjZLiLFxgNvBt4MeqYDivQ8JyHyn9bngPN88bSnhb/7cadq2Sdf/uWo7jFf/u0obAiaG2zHAQZbS/8PuM6/jQnSIapUs3C4i9ufLIEIA8yjZxkmCEZzoxvdUGB3hcHeP+a4CFsfja/1wntZ/h/N27Bn3X+phE/pcjWPuGjkeLfmn8CoLh75RmSYapMYH7xFzVhsASgQHtVFzwHuI+47ODuOhY69CvyzTlckZAAWnbAjjfze20n2scnr+0o9nh8QkyUlODD/212rAUNupAkQMLf80J3TPChKXA/KU6VDFMkw8vFX8yEqT3chkMh1TwvGa6EPbUEot1C2PPcAG/eQOCaSNteAc3zMTdImYKkyOKG/W3BnwF/T//gpgHWBR0FqKfoip8V3Q59OqDyCMpZkuEKq9cff5YABCQZ6qSaa0jv2TkQ4ODtALqfHeDNHnbfbCsgye8U/HKxlsM9+ft64jPJ5/uzsPZxD40E+N73OGf//6WGFGdLNZdJdczXSpk9LAHwRCawXqqZRiXHAdfhpaReAQ78QhZgY8CLa/6r/wGqAl4u7tbgHrCMAbcOxPc00NY8S20fVoDvfY+zoW2OP8XZkqFaJvKCh6BMCVkC4JlcxjbJ8D12MhS3cyDPlXEBVHSDrmOKfHOOwIMWuxZB87b8XpuivA//2YQ7T8mYNkFX/h9Mc1P+520cUoAEoM+l21FOlgxTrONPLksAQiJTybbuHDgP5R3A/YS1HKz7WUdalHMYWwi8RH3rK/m/tpyf/uuBdVEHYWKliXB2gCiwcnbARhooeqiq4+BuZLS0o5zGO0sASkCqeUIyXEGOkbjDLvJ8XM5TjyDz/0GH/4Edb+T/2nJNAFpwlZTtwFLTRgm35POmAr53h1T091+AMz0EYCJkCUAJyWQWS4brgcEo1+KWigV31KkB3hyw2rE2uymAfFUGu1xsraQcD5c2QTQTbv2HBh+VygM9AJziIQATIUsAIiAZtks1P6IfIxCmAs8FavBQW3LyEvAmsmsx5ArY61bsTEWcbSTJx0eZsIR94FM2BzvrAjYS6Psf5MZjYsASgAjJGTTLJO6VDOe2Vhi8l0KfGVIdoMvIIiNoJPBdameBVT3LLQHYjZddlKbMNFKa6o/rngrYwHYCLE2yBCDhLAGIidYKg1PJMgb4CfmezNNlNEhFkVf1sFx9Z4HVPYsNNY5yuKF/m/c3+yvVcc9b3grYQA7YWeybx6iq9SEJZr+8mJEp1EqGz9DMQISrgcPX1w00/O9hLWKhIwDl9IlbjxX7MQcKY9//oez0cIZH8feBzsBQDwGYiJTT7bisyOXskEn8UjKceNjpgW4RJgBNm/Pf/19udgObow7CxE7YK//317zbw/HAgb7DNg2QYJYAJMCe6QEYhdtG+HbXE+UIQMOyYO9PKgVWY0P/5kC7Ke3nQoFNLwVsJNBU4IkBL24iZAlAgkiGOslwPZ0YCHwEeJ3OI4psTSn6MJA29UXsYiyHTnMzUR/9ZOLI54l/hdgStB5AoAeBYQEvbiJUTkuy2g0Zz27gLlV+j47eiZuLK1A9gZcpNxSRACT9aNxmbNW/ObhSP/232Rm0nEjbvaCoLTpDAl7cRMhGABJNuyMVRXT+4OW0mvoipgCSPgKwjuQnMca/HNEtCK33kZEWfT+wBCDBLAFItgBfvoCVazQHu1cX/r4kV8urx3cRZ1MudhFdctuc347hwyv6fjBYVcVDACYClgAkW3QJQPNm0CJ68wKKBsbO2qgDMLHURLSJbXMWckGPHCz6ftAR6Bfw4iYilgAk2+Di3xowAWjcUNz7kjoCsA1b+GcOpMTjcxG4JHCgKUGbBkgoSwCSLcIEoMh5xyQmAIot/DMH10A81oRsqw3YQKD7gSUACWUJQLL1L/6tAR9bmtpRArAFN8xrzN5aiE8lyJ1LAzYQaAQgwH3IRMm2ASZbr+LfGrBcWXuZAsgR8MRUU5YULxtpvGko8vu4R4BMZutN39Ra/g1hCTnqSDOPHM/LSILOS5iQWQKQbEUmAFkC1wBo3lLc+1pwnWpSxp62kOyFiyYcuynNaX/5agm6EyBAAiAdeyKcA5xDCpccCWgditKIKzW4BliKMg94mSzPyGiK2EZkfLIEINl6F/c2D+PZzQGqCDbh1g7HXQ4I+mBlyk8Lpa33n4/moMMRzRSdmacOcRtSBPdNP7r151SEKwCoAK1FERpwtTXXAHWkeJ0sT9PEs3KCTbyFzRKAZCtyBMDDxGWQJ45GkpEAbCJeT3kmekrg9bOhyPpYjFBkZp4u8jYkCK6KaWdgEHAmOT6AAFWgi2hG2YGwGmEhyssoTzKCp0USN5kYS5YAJFRr8Y2exb3bQ2IdJAHYDXQPHkKocrgEwJi9lfKo30K0+JinKjIBSAVYinR4lQi9gF4oJwJXIkAd6CIaUDYByxFeR3mKNHNkGOvCCqYcWQKQIFrLUSgXIZzH0r6nMnRDkb+/gE8LuaZgR5DGYd/0kdjTv9lfM/Eb+m+T8/FhLfLBoNgRgGA6IQzCjRych3A1OdBFtODWHCxHeIBO3CwDYrVcM1YsAYghreN4clwGnAucgDAIpQdCBXuKbgb51QUcPQu64KiBPQuFYsme/s3+csRz6L+NqqvMKUHuC0WOIkinANf0rgLoA/R+Yh0YAAAgAElEQVRBOY0GvqQLeaccz/NRBxZHlgBESJdyHDkuRjmfHOOAIQg9UdIHdI4H/HuHAFcOOIYZ5Om/7fK7gVjdN/ayEXv6N/vaSbwPslKgaTtUBXkaL/K+IFUBrhkypSMpZqvSSySWkzeRsgSgBHQRxwKXI1xEjpMQBgDdaNmrWy/0aTjSBMDDfONO4pkAZLGnf7OvBpKREGaDzq0VmwAEuReVRHdqmQTMjDqQuLEEwCNV0szjYiqZgHAWMBI3HOX+O/sc9o4yASjmEKD9bQX6Bm/Guw3Ec5GXiUac5/33FzgxL/aDH/sEANKcgSUAB7AEoEhaS18quIIs4xHGkWMwi+hasu9CoAQg4OOMjwSgCbcWMU6jh024HcnGgPuaxHnef38aNAEo8r4Q/xEAaOG1qEOII0sA8qBv0osq/g24GGUcMBChas/3JZIFbQkfAQB3wl6cDhJdR7zneU3ptO33T9LnIfCRwMVOAVTiCgjFduhsJ8fzQNRBxJElAIehtVSR4nGUs2jr4uOycl0qA7w54F0t5ykB2IKbIIlDWeCdQIDihqbM7CIZ8/57C/y9DNCBSwfQGM6VKM1UkbEFgAcXh1tvfKV4FeVs4tPt7yXCz7N4+ti07diNWg5XiNQYcIv+2uX5D0Fuc7HKlnYDdeT4JRX0k8E8GXVAcWUjAIegC7gEZVTUcRySBhnuC9iBB9prvJ+NuHqGUaZY67Hjfo3TSHIW/e1P0gEbKPa+oB7WHxR3WYR6YCXwCvAIWe6TUXZ+Z74sATiUCjKxnv+LMgFIefzYNOOmAiIpJoYb+rdtfwbcZzHJNeOiSgDUxzkER5TFLdGtQ3mJCuZQwcNybCLqisaWJQCHojFf/xsoAQh4o/A5AgDuCfwoSv9pbAFWlfiaJp5acMlgkqWDnrBV5H0h0L3ooBoR1gK1ZHmONA/IcF70fRFjCcChCXcDX2k90jKGymQKAFxuvwoY4rfZw8oBKwhcFdmUgSzJ7/wBKroGbKDYEYCi70UNuL03ixBeQnmcNHPluMROwiSOJQCHIMNZqHX8Ebgq6lgOKtIpgBD2/e7ErQfo47/pg1pNsod7jR854l/mN1+VUSUAh50CUIR6lLXAQuAlKpjLEp6Q8ZZ+R80SgMOQ4fyb1rIQ+GzrsZTxEWjeLeAUQLpLsPcfynpcYaBu4TS/x1pcDQLTvrV1/uWwQUyAdNDa2gGmAJQmhC3ASoQFKC+T40lG8qJIvLYImLdZAnAEMpJvAN9QpYJFnA+8kxRnoBwPHAN0JYo17LltFF+BKOATfEUXtxVQPd85FTcsfyzhJQFrsUV/5u3Ov1y6Ji9bc4u8L1QOfUVGcqqHAEyJWQKQJxFagMdbf/ah6zmanVxIlnMRTgKG4QazuxFWcqDNkNsJqWJ6yqBD+ALprtASQuWctiRgANDDc7ursCd/U36dP0Aq6A4AKP6+IJZSJ5QlAB5IP9YC97b+7KFKikWcjHAhcDopRpFjMG7nexVBk4Pc5iITAA8F+Cu6hZMAwNud9S7cGEvQh5sm3E5h2zBkcsAOymPYf29pH+tyir4v2AkaCWUJQIhay0++3PpzAF3P0WzjLIQzEE4AhqH0B7r///buPEyuomr8+Pd0z54ZErIBSSA7JOyyLwIGgslMgryigiLugguKvqAGccM94E8FUV5xQcE9CopkJkFAVGQPOyGBbIQQCAkJk3XW7vP7o7qTSZjp6e5bt293z/k8Tz8zkL5VlUnPrXNrOYU7LDdzgJDYBBX5LJ33cLOoCHuiHpclcBvuvIAh5BcubcEFE+V2wze5K9fOH6Ay6Px/jADdgQUAJcoCgAilRg7+nnrtRpU4z3MocY4DDgcmAqOB4SiDEWpJbszz2bgS15sGWPpcuVf+1+aiG7difwNu3GQw/ccvirvRv4Y99RunnDt/gKqgOwACjQraFECJsgCgSKVWzj6ZevVKk6feApyTR+m4XjTAToKqEflfm48u3C6B9bim16W+VuAeXrpxc7ptuO195XqjN7lLJ/kph61+fakKukkp0Kjg6wErNxGxAKCUSdX6/C+uIVAAUF3gAKCnTix3v8nOQOj8Aer2DVhAoCyCNgVQouw0wNIWIJFtwL38UQYAxmSjEzfsXy6df6agt/6AgIUHuh+8FLByExELAErb6vwvrQtWc9XIYNcbE6Z2KPLTPHKTIHPa6sFTA1YQKAAIcB8yUbIAoLS9mP+lQUcALAAwRWo75bf4czt9361FoHa/gBXkfT9IZ+4wJcgCgNIWIPIOGADEa6FycLAyjPEpvdK/3NaHtOGe/vvK9VPpIa9H/veDDSJip2qUKAsAStta8s5n5iGff23QeUdjPOnGdf7ldrxMAnaejddXAFDjI2VmnlOCmrSn/xJmAUAJE5Eu3C75PHgIAOoKeX6vMX3ooHwO9dnTdtwge4y+79Z1owJWUkHeuwDW33a4NnOtNhf0MG/jiQUApe+F/C6rxCUbDMBGAEyUFNdB7qB8Vvr3lB76h8wH9e09JWBFAZJ67VhZiXAJwkpt4XZdyHTVCA5HM3mxAKD0Lc3/0oBz+DYCYKKSoDzn+9O62X0hY6aMLcOODVhZgPvAtiXp72LAbJLcyQKWaDOf0Tt8DDOaMFkAUPoW539pwLnDmjEgPk4hMyYHHbgzHsrpNL+eFDel0VNfAUA8BnWjA1YYJADo9fZzEMI1JFirzVyrdzA+/wpMmCwAKH0BAoCAIwCxSpsGMIWTPsa33Nec95bKus8FgD524uRbhvYcAei9YOESEizXFm6z6YHiYwFA6YsuAABoCDr/aEwWunBP/V1RNyRknbwxQ3emBYANPqbh8rwPtL8E3ZuzeWcMeFtqemCpNvMZnRd0AZLxwQKAEicir+DOvctDA4E/AvUHBbvemEzSw+EDIZ9/kt6zF1ZmuGb4UQErrSHvkwC35vXscSDCNdTzgrYwVxcSNIORCcACgPLwbH6XxQg8ClBvIwAmJAPlqT9tC70HOZkCgJGnBqx07/wv7X3+P1sjgTkkWaULuFkXckiQwkx+LAAoD8/kf+nwYDVXDYWqgGUY01OCXU/95bi3vzeZ/q59LQCsqYOKgGd6BPn9DxYApFWjvI8kT2szd2oLZ9k6gcKxAKA8PJz/pcOC194Q9CASY1LaGVhP/eC2+/W1nTFO33fpvXzM/wcIAFof8lD/ToIwHfg7C3hCF3CRrRMInwUA5WD9X5blf7GHp/fBRwYvwwxs6eH+cjvEpz9dZP47Zxr+H3FSwMpj5D0F0L0ZtgdIQZLZ4Sg3UM8L2syVeruPm5TpjQUAJUzvYKS2MJdHz72Tro15llJL4KOBBx8JNmpn8tFzuL9c9/X3pZs37vffU18BgAD7nRawAXuTOcVgBq0PgYY+PzMS4WvEeVGb+akuwFYce2YBQAnS2zlAW7ieBC8Cc0DraH0kQIkBA+yKBhg0IVgZZmBR3H73gTbcn5Y+uTDTzgah7wBg0FCI5Zm/f6cgw/8PBqw7J7UIH0N5Vlu4XecTdOjDpFgAUEJ2PvHHeQ74BD3372wOMh9n0wCmQBQ3z7+ZN+53HyiS9L3iv6dMw//DjvDQkJIJANJcuuEY92kL/7UFg8FZAFACtIUR2sJcErwAzKG3o7sC/ULuG+DalMFB9yObsqa4Dn8zbs673Pf09yWd1yCb0fOqDH82pilgQ2K4nXj5UGgNsO7Yj5NxCwaf1AVcoIsyhkumDxYAFDG9neHawlzY2fH3vSq29UHQfCdRB+GSAgVQP8ltCTSmp55P/OV6al8utrPrhL/+9NWlVdfCoKA7AIaT+YShDLY/R/5rjrw7DOU3rGeZHUCUOwsAipDexTBt5krirMB1/P2v0utqhS2PBag16CiAwN4nBizDlA3FPemnV/YP9I4f3JN/tqcXVtH3utphPnLmBPh9f+0uD/V7N3a3A4gsw2BWLAAoIrqQodrMlXSyAuFr5HpQ92t3Bqjdw+/LUAsABrwErsPfjHvyHyiJfPqzndyOLu4rO68AY98evD1Bft8D3WdC5w4gSmcYvJ3JUTeomFkAUAT0Nhq0hTkkd3b8+eXnDfSLOYK8hwTT6idD1YhgZZjS1I3r5LbgOn574t9lO7kteIzR969idR00BO3Tasn12WIn7YZN/w5Yf0G4DINxlmoLt2szx0TdoGJkAUCE9B7qtZkvU8lqYC4wJFCBrfdDor+NxX2J4YKAIASGnhCwDFMy0gv7tuC2tOXyhDtQbCP33Q6Zhv9H+lhsG+Dpv/WhbE8ALBZu54DwsLbQrAuwYcoeLACIgC6iUhdwEW08j/BNAp3I0UOyEzbdG6CAMcHbUHdwbgudTOlJ4Bb0pRf2DbQEPtlIr/bPJyjqa3u/AGPflXeTdgnwe76xKOf/syFAE8r96S2EUTeoGFgAUEB6JTFdwLtYzxKUG/Ay8b6HQNMAo8k7M1jasKOBGvdEaE+F5aPn0/6W1Pc2zN87Jfc5/7RK+r4r1w2F2qC3jGry3/5Hsc//Z+tk4O+6gPsGei4BCwAKRBcyneN4FGUeMDG0ijYsCHBxJbBP8Dbse7z7mp4XbsUWhJUixWXp24Y97WcrneEv38C3r8V/APvPzLPQnsaQd9rurk3FsP/fH+Uk4O+08Lgu4F0DMRCwACBk2sJp2sL9JLkTCD9d3valsO3ZAAXsH7wNEy/Y/R6T3hK2GdeZdGFPj8VKcZ1XutO3f6/spTv/fKe/YvS9978iDvv7GLUO8Pu9/u+gZZi3WTgCZR4LeEpbeL/OCzoMWjosAAiJzudQbWEe8C8o8MKTdbcEuHgUgacBKgfD4D7mGXs+UW7HOpdi0LPTb8X+XfLRjZsaCTJCUkPfD+fDDwMJ2i/VECj9b6D7Skk4FLiJQTyjzbxP7wm6Lar4WQDgmS5gnLZwAzGeBHys2Mndq7cGuLgCL6mBJ5yX+c/3fNLcgbuJWqdTGAnctMxWdu/0Te66cD/HoFNcmfb+T3pfwMIh0PB/YluxJgDyT5iCcDNtqeyC9/S5LLPkWQDgiTazrzbzU5TngYuI8me75QnYsSJAAeODt2H48VBbn9170wvMtrJrZKATWzPgUwL3M06vyUhn6LPdGsGkg6iggWump/+GfaHOw9Qc4/K/dP18SLZ7aENJGYdwDW08py18qhwDAQsAAtI7GKQtfBVhGcLHyHyGV+EEGgXYl2yyD/frgMbcr0mPDGzHBQOtuFGCdmyEIBfduJ9Zzw5/B+5naz9DP7bhfqY+ZOpaJvt4+h9CoN3G5T/8n8kBwHW0sVpbmFNOgYAFAHnauaUvwWLg60CWj7sFsi5IACAEelpIG/sOqAgYD6VXorexa7g63ZlZUOAkcB37DtzPphX3s2rDOvwwJHHBqa8trtVk2Po3GIYd66GSCflfmmiDDQs9tKHkjQTmpkYELiyHEwgtAMjDHlv6gh7LFY7WhzxMAwTdFROD0acGLKMX6eHsnkFBesV6W+rPyjEwSHf06Sf7dGe/hV3pZhOU39+7mHTiPmu+tkMKmc74hAnneKgkjnuIzdP62wJkGC1LBwA/Yz3LdAEXlfJiQQsAcqDzmaotzCvYlr5AFNbeFOD6OrzkBJj0QYgX4GOWxI0UtOOehNOBQc8Ocgeuk+xiV0dZLJ2l4v4O3ezq5NN/j83A6+z6e6Sf7K2zLxzF/Xtsw+/PPNPTf3UtjPKx939/As1MBrqPlLWxKDewg+d1AReV4vbBAZf4IB+6kP1QvoHyIQLvkSugmjHwlhcCbB9aC9wfvB1LroU19wUvJwzp34BY6vv0154v9vi+t/9O6xlUCLs6dnp8Tf8/3eN7U5wS+FnlvyfBHfvVVwAw5d1wgI8RgNOBYfld2r4W/jUW1DJAZWEJMJdt/E7OLY2UWTYCkIHeTl3qlL6lKB+llDp/gPaXYNM9AQoYhZelDQd+DOJF+qNLd8IJdj19d+CewNtwT307cE/e23q8trIrLW7P19Y93rOtRxntqVd6FKIbe4ovdukh/zB2pNSS+en/AB/H/g4l784fYO3N1vlnbypwE/U8pi38TylkFrQAoBc6j7g281HiLMed0pfn2ZlF4KVfB7hYgEnB2xCvgTEhrAUwJizprH5hTX3HyJz2d9K5+BmgPSjY5Wtv9tCGAedw4K8s4MliTzFsAcAedCHHUc99CD8njMN6Cu3VW6GrNUABE3DnkwY0+UKoLNm1MmYg6cCtHQkzMVIdfffvtfUwuslDJYNwB3zl6fX7XWpxk6/DUimGH9AW3hp1Y3pjAUCK3s5obeF3JHkQOD7q9niTaIN1fwpQQJxAW4jSYhUw1seCJmNCkmDXQsswVZA5pj7wA/h5+j8wWDlrf+2hDQbXn9yROn3w5Kgb09OADwB0EZXazGeIswQ4n3JcGPnCdQSbaJ6Ml+UPE97n5jaNKTbpw6oKkRkxU46thpGwz2keKqkiUC6Prtfh5d97aIfZyZ0+eK+28Edd6GNuNbgBHQDoQqaznicRrgEaom5PaLYtho3/DFBADYH2Ee8kMPUjHsoxxpNO3HB/W4Hqq4E+d43HgMM+66miSRkqysKaGyAR9lDIgCTAeSR5Vlu4QZt9HLySvwEZAOjtTNZm5qf280+Nuj0F8cK1AQs4GC8fl5Gnwl6lv7TClLhudi3yK9SZEzEyJ/3Z5wio9/FgWIkbtcuTdsPq6z20w2RQCVyEsFxbmKst0Sw0H1ABgN5GgzZzNXGeQZgVdXsKav182P5cgALq8JIeGODQS8txosWUgiSu099C4U8/zLTwryIOU309/R9EoIW7626B9jWe2mL6MQiYA6zQFuZoS8a9Id4NiABAFdEFvItKFiN8Hi/L2kuNeojqD8bLWoD6sbDfccHLMSZb6Ux+PnP456KKzHediW+HikGeKgo4ihB4tNDkYThuy/kz2sy5hdo6WPbPYTqfo4lxHXBi1G2JXEUDTFsDFYMDFPIEsCx4W5Ld8J8PQ+eAO2LUFFo6AVNUx0vHcBn/+jzudxic+H+eKjucQHv/Nz8K9x/jqS0mgEXAHGkiyOKtfpXtCIDOZ29t5ifEeAjr/J3urbDmZwELmYKXUYBYBRx2yQAIQU1k0gv8dhBd5w+Zh/5jAofN8VRRNTAxWBErr/LSEhPYMcDd2syd2sKbwqqkLAMAXcDbiLEU4ZOUWvresK28OuDJXjW4/cUeDDsGhgfMVGbMnjrYdTpklB0/uD4509D/2DOgfpynyg4h0Mr/bc/Cq7d4aovxQpgOLNIWfq0tjPFdfNkFANrChSh/w53dbPbU+dpa1t22PFghU8m8mTkHh18BlSV/rLaJmuKG+VtxiXyKIX19nMy/JnUNLkOmF3sROGHX8m+CRh0xmV7EgA8Az2kL39A78LFYBCizAVhdyBEkeYRAZ1+WlY0ojwOLiPEw3TwsZ7FWVfcFVhCoF18NPOynlRvuhyeusUNxTO7SHX87xfX5EVyf3Nf4Y0zghG9BfYDters5lUDHd2vXMu5q+BxdHUchHIwbTjjYU+OMX68gXMlWfhn01MHyCgBa+AvwjqjbEZFXgMdRHiPGYyR5TGaxuq83q+o1wGeCVXkP8FqwItKe+hase8pPWab8JdnV8Rejevoe+hdg4lkuM6YXo4GTghZygYj8ruf/0L8yhBoOJcnRxDga5WjcIqCyGzkuUc8ifF4aacm3gLIJAHQeVdTzOt7GpovaK8CjKI8iPEqSxTKblbkUoKr74UYBAuTmfR24Gy+PXpqEez8C7ZZ9zGTQhZvjj2IrX7ZqyHwXGrIfHOdrq10MmEHAY7uXA1NFpN9EyHong+niSOBNwGG4bQcHMzDuu8XqduJcLDPIOXlD+QQALUzEfZDLSRewFHgaeArlMap5TKaz0UfhqnotcEmwUh6GvgcacrN9FTxwOSSLaSzXRC6J+01opzjm9jOpIPPh4RUV8OafQNXeniqcguuHA3mfiPw234t1HnFqmUCMw4HDEA4FjsAtSrDRgsJoBWZLE/flclH5BADzmUCMFVG3I4C1CE+jPAU8hfA0W1kq54b3rKOqQ3Gb+ofmX0onsBD3WObBC3+EZbcW13yuiUY3u572S+HzEMN1/n11eQIceQmMeLOnCgcBbyXQyn+X2ONoEfG++k9vp44KDgEORzmUXSMGI3zXZQDYjHJEpqnfPZVPAFA6UwDbURYT4yngaRI8TQVPykw2RdEYVf08cHWwUjwuCAR49Euw0UOyIVN6krgOP8rEPfkQ3HFimfricafDgR/3WGnAhX/OdBG520Njsqa3sQ/VHEaCw4kxFWUqbihjWCHbUab+KE28J9s3l00AAKAt3Aq8Pep2pGwClqAsRVia+rqEh1klVxbPrU1Vq4BnCZxB5D7gZQ8twmUJvO9j0LbVT3mm+HX2eJWiTIv+APYeDcf+AH+33PG4XDGB3CYi/+OhMV5oCyOAgxGmpIKCdGDg4yjSgaKLLobJ2WR18yy3AOAEXE9UqHmnJMpqYjyH60SfI+k6emliQ4HaEJiqngf8MVgpO4A78Hagets6eOB/oTvDpG8Hbmi4mjL7JA8AipvX70x9LYUh/r7U4Rb+9aW6Gk7+qadc/6Qqm0HAI026gSNE5FkvTQqR3kM92zmIeGq0QJmCMBV36IFt+d6TcIo08t/s3lpmtIVvA1d4LvZlYCVu1fxK4DmU59jOc3JuwU4SD42qCnAvcHKwkpbhphQ9ySY/wDZcJ1KFCwTsdlC80p1+B677KeVOP62WzPto4jE4/jtQHzBJz25OhOBJ4X4kIgG3AUdLF1HJRibSzUEIk3ABweTU1/0ZuAsQm6SJBdm8sfwCAEVo4WsIXyL71THtuI59JZr6KqkOv5aVMq1odxt7o6onAf8l0GdCgf8A6/00CmDl72H53zJXuZ1dQ8cxXBBQTcC1UcaLBK6zTz/tl5NqyJiTTYAjPgkj3+Kx0jF4ONqkFZgsIp6SeBSf1LG6E1Em7wwOlEmp7w+gnIODGEfLTB7L5q1lFwCk6XymInwc4c24Ve6duCf51SgvEGMVwkq6WMlsXhYpi+eRQFT1RuBDwUppA/6B17v94v8Ha/tZZLiFN84+pIOBKlwwULaf9iKiuH+HztTXYt+2l6/+On+Ag86Bse/2WGkdcCbBTzNPflIk7uv4wZKjLVSTZAJxJpPcGRRMBMamXpkmdIpdKyMZKcfQlc2b7ZZodkptC1xC4HMU1gL3e2hRD4vmwKZVff95EthK3x2O4IKB9Kt84//C62b3Tr/cVdF/3p0xx8PBl3msVIDTCLyDruNheOmkm1iT+KhMGxD/WjnTZvYlHQwIB6S+H8euACFTpodoCT+QRrL+4FkAYHajqh8Afh28pEVAhg47V9oN918M21/P8B5cEJDNbS2Gu5FXYqMDuUiya1g//RpIY2fZdP7DJ8BR38Xvhyqdnj8A7Ya1x0LHE6DMZxDnySh2eGneAKLz2RthLDEOAMaRTAUHLlgYjXuAiuIU2hdJcqTMJsNNcnd22zNvoKp3AWcEK6UbuAuy242SncQOuP/TmbcHKm5hYFYDYD3EU6+KHi/jOvsE7ufZRWntzfetGjcKn+muOXgfOO4aEJ/3/6HANAIPW7VeBRsv3/XfwkN0Mkum+sksahydR5y9GAnsR4JRwL5I6qsLEPbBLeYYib9lyy8T460yk8W5XGQBgHkDVZ0MPEXgubDNuLMCPE4Ed22G+y+BjgybL/INAnqKpV7pYCCe+u9y/I1RXMeeZNe8fSL13wPp6T6TbOb8G4bB8T+CmM+tKFXA9Cwq70f3alhzCCTfcNbGsygzZDIvBavA5EoV4e+MpKpHQJBkDMJIYATCPijDcfM+w+n9sWQrym8Qrsxn63k53s5MQKrE2fyzRQy+8Mjgpb0IPBS8mJ46NsIDn4XODOmH99wd4IOkXhXsCg5iPV7FLt3JJ9h9KF+xjj6T/g73ARg0GE78EcQCnK31BgK8GffgGNArs2BHn4fGrUY4UyZi6TeLmN7FMBKMIMlwhBq6eZ0Yz0hT/nnYLQAwu1Elzkp+DRUXMPp+qD7WQ6mP4/2cprZX4MHPQ1c/PfwOCndkbAw3UiDsHhhIj/+X/j6odIedfkpPv5J7/L90R28dfH76S/IDUNvgOn9viX7SDsMlwgto642w/iP9vWsdMWbIBOxM7gHEAgCzky6ikiH8ETgHgKqpMOZRkKBPNUlcfgDPyRHb18NDn4OOfnr4dii6pU7S46vgOuhMowjpzjz9vQmX4Ebd+9txV7cXnPBDqGjw3IBRBM7LBdC1Cl46EpJbsnn3RoRGmcgjwSs2paAUBi5NAehiqhjCPNKdP0DnEtj4RQ+lx4AT8L69tmYkHP9DqOonQKnBrdwupnB3zyf09Px7X68ENlRfKOmDffrr/BuGwknXhdD5NwDHeSgnCRs+lG3nDzAM5Z+6gukeKjclwAIAgy6jmmr+CrzxYJDNP4IdWWWV7EcNbj7T8/L6mmFw8nVQ189NuAp3X7VPvMmkAhhM/x/TIfvC8dd5nvMH90E9GS+Lw1+fC23/zvWqepT5uryXe4EpO8X0TGQioIupopo/A2/r800Vo2D/pyE21EONr+DOa/L8KJvYAQ9dCtv6OVU5iVscGGSHgClP2az0Bxg2Ho76juetfuCi01MInIcLoONxWHsCaN6rYLtQLpDJzAveGFOs7HloANPFVFHDX8jU+QN0vwwbLvZU637AEZ7K6iFeByf+BPYel/l9MdxIQCkn+zT+1dF/5y/AqCPh6LkhdP7gjvf10PlrG6y/IEjnD1CJ8HtdxkeDN8gUKwsABihdRCXV/AnlrKwu2PZH2HKDp9onp16eSRyOvRrGnNT/e+voP6ObKX8xXGLX/gJCASbNhkOvIJyB08NwWWY92PAp6PRyym8c4We6PPvUsqa02BTAAKRKnBX8DjgvpwulGkbf62lroAIP4M4NCMHqP8Hzt/Q/05DEJQ2yrOgDTxXuqb+/u6/E06cAACAASURBVGBc4JALYd+w1sZNAI72U9SWX8CGC/2U1ZNwpUzk6/4LNlGyAGCASXX+vwXyO6as4gC3NTA+3ENrkrj1AOs8lNWLDffB0z+G7iwyEbbhtgvaKvvyJ7gRoOos3ltVA0d/BRpCGLECXAK4E/ByK+58El460U0BhON7MokvhFW4KTwLAAYQVeIs52aE8wMVVHsGjLoDP+ddJIB78Z4jIK19PSy6AnZksRWqGzcaMJDz3Ze7CtxTfzYf3SH7usV+FWHNFY0CTsTLTGzydXjpGOhaGbysTITrmcCn7Pj08mBrAAaIVOd/U+DOH6Dtbnj9Wx5aBe5OfDLuwJMQ1IyEk2+AkQf3/94KYAi2QLAcpRP77EX/nb8A+58Ix10bYuc/Evfk7+MWrLD+w+F3/q6qT7KC/1O1vqMc2AjAAJAa9v8N8B5/pcZgv/lQ1+ipvC7gX0Crp/J6sfpP8PytoFk8vCRw2wVtbUDpqwJqye6pvzIOB38c9jktxAYNA07FX06M5LdZHn8SYS5uQUEh/JyJfFzExstKmQUAZU6VGCu5CeUC74XHGmD0f6HqcE8FtuNSBm/2VF4vtr0Aj38D2rZl9/5OXBphu82Vnhhurr+/jH5pew2HN30dqkeE2KhhuL3+3k4M/AtwnogkUzk9Pgh8HS8nCPVD+T2TeL+Iz+M+TSFZAFDGVBFW8H/Ax0KrpGI0jH4QKsZ4KrAT+C+EekR5Ehb/AF5+OLtFf0ncIsG8z9wyBSW4BX79neCXFgPGTYdJFxLuLXEEnrNhLgJOE5HdTrrQxdRTzWeBy3CTWmH6DRP5kAUBpckCgDKmy7ka+HzoFVUfBaP/m0RqPc0LduN2B6z3U1xfNtwHz1wPXVmmBUzgAgGfRwwbv6pwHX+2n8TaQXDE5bDXQSE2ClwCrBPxs3AWgBeAE0Tk1b7eoEtpoJJPolxOuIHAPFq5QI6x/JqlxgKAMqXL+Sbw5QJU9TrCVUzYshQabsHbHS6BCwL6vL95qqYdnvkerH86+y2AXbhpAXvmKR4VuI4/24drERhzAkz5NIjn8yneYH/c4T7e1s1tAU4WkWeyeXNBAgHhdpK8SybbOFkpsQCgDOkKPovyw5Cr6QZuRPmyTHZ7+FT1UuD7/qpIAg8SWrKgnl57GJ75MXT2c7RwT524ZQu2UDA6lbhdG7lMqQ8aDEfMgfpJITWqpwnAUXi81XYBTSJyV64X6hqG0sGlwCW4hNi+3UYH58ohNkZWKiwAKDO6nE8B14VcTQtxLpPxLH1D/arXAJ/xW91iwEtq08w0AUuug7UPZLdTIK0bNyJggUDhVOBW9ufS8cdjMH4WTLiAwtz6DgYO8VlgEvigiPwmSCG6hqG0cwnCZ3FnH/q0AOXtNhJQGiwAKCO6nPcDvyK8/A6LEebIRJr7bIOqAD8FLvJb9UrgMQqSqm/HS/D092HL2tyq68KNCNhMaHiqU69cRu0FGH4gHPo5qAx7TRy4X79jgQN8F3ypiHgb2dMlDKOCT4cQCLSgnGNBQPGzAKBM6ArOQfkTHpcY97AG+BYT+WU2q31VNQb8Fq95B8ClDH6Agj1qb7gflvwc2rfndl0SFwh0YtsHfUiv6q8ht9BWgLq94dDPwOAsEkF5UQWchFvx79UXRWSu70IB9DmGE+NzCJ/E39TAX2nlPFsYWNwsACgDuowZCLeRXXbzXLgFfjGulfHkMDkOqloJ3AJZnjaYQ5Pc4sDQ8p3vQWHV72FVM3TnGHgoLgjowKYH8lGJ+0RXkvudqqYWJp8P+83w364+NeC2+XnOHrjqh6+x6dJRYXemuoy9iPEJlM/jEhYEdSutvNuCgOJlAUCJ0xVMR7kdvwlsO4DrqOQ7MpbX8y1EVauA24CZ3loGuOY9SOjbBHvSJKz8DbywEBJ5LP9P4JptowKZxdg1zJ/PRFZVFYxtgnHvBilkttr9gOPxmODHWf1jePbToFwms/iB38J7l8oj8HHgUtxfLH/C9TKRi700zHhnAUAJ05UcR5K78ffIoQh/IcHlciBeEour6iDgDlzCf48UeAbeuA4xXMlOWP4rWPOv/AIBcKMBHbi1AhYMuI2jlbjR83wnsCorYeyZMP79Be74AaYAh+L9drrmF/DMRaQWomwlwVQ5qxBbYhxdRQ3dfBjh88C4fItBOF4m8ojHphlPLAAoUbqMQxD+jZ+hOoC7Ub4gk3nMU3k7qeogurf8g4q9TvJdtluesIiCj7Enu9zUwJo7oTPArqdu3KhANwNrmqCCXR1+kFUrVTVwwFth/HtAvCXZybZy3FN/CFl3X/wpPHuxG3na5ffSxHv9V5aZLqKSIbwXuBzIPWOScoVM5rveG2YCswCgBOly9sfly/WxzPhplG/KZP7soaw+6T/q5nP472axz/+EUPpm3OLArSGUnYWXmmHVX6EtiyOHM0myezBQTqMDMdxTfkXqa5CHdAHqhsD4c2CU59mlrA3FZfbLNt9wDlZeBc9d3vufJTldZnOP/0r7p0qM5cxC+Apum0O2viCT+F5Y7TL5swCgxOgyRiDcSz6R+O6WoHyNSfwl7LO9tYXTgH8hFXDYjTD6fSHUkgCeBpaFUHaWNi6CVX+C11/MLY9AX5LsCga6KJ3Mg4Lr4NOdfQV+NqbGBIZOgskfgIYDPRSYDwEmAYcTym7bTJ2/s5iRvCnKhXWpM0ZmAl8A3pLFJcfIJB4Nt1UmHxYAlJDUaV8P4FKL5UdYhXIlE/ldIQ7wUEVYwMPAMa7+OBx6A4z5SEg1rgMegdw2LfjVtd1ND7xyH3Ts6P/92VJcEJBMfU0Q7UhBuqOP9/hagcd09yk1dTDqVBh/PsR9rnXNVR0upW8YpwUqLLkMXshim79wqTSGnukzK/o8xxPjC8D/0FtEpPxKJvPhgjfMZMUCgBKiy/giwnfyvPwVlG/Tyc8LmapTF3AByh6ZywQOvhbGfjqkWjtwQcArIZWfg9an4IVbYdNz0B1ivJXs8Ur0+F7ZlcxIyS5YEHZ17vT4Pv0S/D3V96WyAoZOhYnvhvrJIVaUrTHA0WR/tnAONOEW+710Y7ZXbKWCKfJWXvbfmPzoCg5E+Rzwbtx+yFaEa5jAt+ykwOJlAUAJ0RU8iHJ8bhexCbiOBN+XKYWdJNd7qKGNpcDYXt8w7jMw5QchrtpegZsWKIZtyArr74OX7oDXl+e/g6CcVVTAkPFwwCwYHsJ60bxUA0cSQlY/J7Ednjgf1v89t+uU38oswphLC0TvoYJJ7CX7synqtpj+WQBQQnQ5TwGHZfn2bcA1xPm+jKc1xGb1SVuYA2TOXrbPOXDEbyAewmIqwE0FPA68FFL5+VB49T/wyj3QuhK62guS4bjoCFA9yD3pjzoThr4p6hbtYQxuts13fq2Ujlfg0bNgc57T48I0aeRfXttkBhQLAEqILuenwMf6edsO4Cco30uf0hcFXchQkizDLZfObMjxcNRtUL1PiC16GXeWQKEyCOag7RVYuwA2PA47NkCinJb/9yBAvBIa9oXhR8OoGVDtaxerT4Nww/0hfh63Pg2Pzoa2F4OU8jS1HCXTBtQGUuORBQAlRFcyliSPA3v38sdtCD9FuEom8Gqh27YnbeFHQPaT/LXj4Zj5UB9mzvZO3JTAKor6kXv7Knj1v7DxGdj+SumOEAhQWQ2D9oEhh8Co02FQ77NBxSEGTMad4BdiToHX/gGPvwu6A24bBRAulkauD16QGYgsACgx+jxHEuNGID1euhm4iQrmyrhiWPUGOp8JxFhCriumKofAm/4Cw84Ip2E7tQJPQHQDJLlJtMOmx2HjE7D1BWh/DTq2Q7JIRgoEt0Wvsg7qRkDDeNj7UBh2bMSr9nOxD26uf69wq1n9E1jyGbfwz4/XqWKyTGejrwLNwGEBQAlSRVjJJJLU8xJPF9sQoLbwF+AdeV0scZj0FZj4lQKkdH0ZFwjkeNpfsWjfAJuXwNaV0LYO2jdCx2boboNElwsQfI0cxOMQr4KqWqjcC2qHQd1oaJgEQ6ZCpe9j5QulATiCoCnv+5Vsdzn91/wijNKvkyYuCaNgU94sADBe6QJORLmPoJ+tkbPh8JuhsrfZDp8SwPO4MwWKKo7yI9EG7etcsNDd4Tqi7jZIdrsV6JqEijqIpRa6xWsgXgtVDVA93L1K5ik+F1W4of6JhH4bbFvthvw3h5YOvxvlKJnF02FVYMqTBQDGK13AP1GmeSmsbhIcdQs0HO6luMw6cVkEn6csAwGTUoHL5DcF7yf39Wb9fHjq/dCV96Ga2bpbmpgediWmvFgAYLzRBTShNHstNFYDB18H+3/Ua7F968AFAcsondy7pn/pjv8gQknmsydNwIpvwfJv7HmgT3iEs6WRHBMKmIHMAgDjRSrl76PsWpzo15gPw9RroKIhlOLfqA03LbAKCwRKWSVumL9AHT+4If+n3g+b/lOY+nZZARwiTXQUumJTmiwAMF5oM+cj/C7USmrHweE3wdBTQ61mdx24IGA5RZlDwPShBpiA29ZXoI4fYN2f4ZmPFWLIvy9zpImro6rclBYLAExguohK1vMsbow1XBJzZwgcdDXECnhjJwmswY0KeNi/bUIyBDgQ2J9wDyvYQ1crPPspeDncGDgLW4lxkMwsji3BprhZAGAC0wV8EuUnBa204TA44rcFWiDYk+JOHFyJO2yoFDP0lJsYMBr3xD+y8NVvvAue+hC0F0266RulibCO2zRlxAIAE4jOo5Z6luHuwIUVr4XJ34Jxl4BUFLx6d87AC7gpgm0R1D/QNQDjgPGElq8/k+4t8PwVsPp6iiwQTCKcII2Etu/QlAcLAEwg2sIVwLcjbUTDEXDoDe5MgUgosB4XDLyMbSMMUyXukJ5xwPDomrF+Piz+JLSvia4NmT1AIyeLFFdkYoqLBQAmbzqfvYmxgt7PJigsicGYj8KU70FFyOlcM0oAr+JOH1yLBQM+xHFD++OAURR0bn9P7WtdKt91t0TXhmwJ50sjf4i6GaZ4WQBg8qbNXI3w+ajbsZvq/eCgq2B0MRyV3o0bEXgJFxRYMJC9KmBf3NP+voR6OE82tBtevB6e/zJ0b422LdlbQ4IpchY7om6IKU4WAJi86D8YRTfLgLqo29KrEbPcaED91KhbkqK4Q4hexi0ejGybWJES3Ar+fXBP+yOI9Em/p413wZLLYOtTUbckd8rXZRZXRt0MU5wsADB50RZuAC6Kuh0ZSYVLIDT5G1Ad4tnueWnD7SZ4LfUaiIsI98LN44/AdfwRLOTLZPtz8PxX3N7+0tVGnINkBkW7WMFExwIAkzNt5kCExbj8qsUvXg8TPgfjv+B2DhSldmAjLhjYiBshKJLjfr2I45aKDE+9hlHQBD256NoIy7/pju7Vspi2sW2BplcWAJicaQvzgHdF3Y6c1Y6FA78N+72nAEcNB6XADmAzLhjY0uNV7Gpwnf1g3FP+3rgte8V+u9E2Vl2TYPmV9XSXws85a0liHCszeSzqhpjiUuy/kabI6HyOJsYjlPJnp24CTJjjpgciyR8QRBewHRccbN/j1Q6hp4EX3JN7LTBoj1cdUE/kC/Zytx34JTCXZhlGjH8DQyNuk2//lCbOiLoRpriU7k3cREJbaAaaom6HF7XjYeLlsP9HkxAr9iGBHHTgjjfu7PF9Ehc8aOqVHtpOsmuxXQXulhBLfR/HdfZVuPn59PdlYxtwI/BdEVmX/p+6kONIchdu2KJ8KI0yi4VRN8MUDwsATNZ0AceiPEQ5fW6Ehczc8FkYPge4gIIcEm8ithm4DrhGRDb29gZt4XSgGTefUS6WUMvhMs32oxqnjJ56TOiSfIdy6vzhGSp4t8iI50Tkw8ABwNdxK/FM+VkJXA6MF5Gv9NX5A0gT/0Q4j/JK3jCVNj4UdSNM8Sinm7kJkS7gzSj3Rt0Oj14mzgm9bY9S1WrgPOAyoNCnDRn/7gOuBW4VkUQuF+oCLkC5ifJ5WFpPF5PkbEomm5EJT7l8qE3YlG9G3QSPthKjqa+90SLSISI3i8gRwHTg75TXk2D5S26DLb+ANYfDC/JREflzrp0/gDTyW5RLwmhiREZSyeeiboQpDjYCYPqlC5lOkjujbocnXcBsaeIfuVykqvsC55Hc9FliQ8eF0jITXMejsOVnsO0PkEw95Crvk8n8NkixuoCvoWWTUc+SAxnARgBMNhJ8NeomeKIIF+Xa+QOIyDoRuZaVw25izaHQehUkbKlAUehe6/49XpwMLx3jAoBkjxFu4digVUgjXwe+H7ScIlFLomyCGROAjQCYjLSFRqAl6nZ44SEvuq7gzyjvBEBqoG4W1L/DfY1FeQrhANP9Mmz/K2y/Bdr+TT9ZEx+QSZwUtEpVhAX8Avhw0LKKQIIYR8tMnoy6ISY6FgCYjLSZhxCOi7odgSl/oIn3Bj0fXZexBGHKG/5AqqHmFBh0FtSfB/FiO3ugDHS/CNv/Btv+DO33k0Oq5HZa2UuOoStoE/RKYhzHzcB7g5YVOeEeaeT0qJthomMBgOmTNnM2wt+ibocHd7ONJjmXziCF6DKqEbbR3xkIUgE1p7lRgbrpUHVYkGoHLu2Gjodgx52w43boCJDJNsmb5ECe8NKsecSp53e4nSKlrkmaWBB1I0w0LAAwvUoNdz4GHBl1WwJ6mg5OlbfTGrQgXcnhJPMYMo2PhNrToHY61DVCxf5Bm1LOVgJ3seW6LjZ+9WKSgf/ZHOEjMpEb/RQGOo8q6rkFmO2rzIg8wzaOlHPJeYeEKX2llgjdFMpC3kmpd/7KKuLM8NH5p8o7JK/rEuvdsPW21LGyVYdAzZthr4v/Q/VhI4ApDMxgvAt4AngQeAj4j4isAVAlzgbeCkz2UpNyhJdyUuRcOnUe76Cev1LaqbEPZRDvB34VdUNM4Q3Em47pR2qe8wmglMeuX0N4szTynK8CdRlfR7ztiHiJVibIMXSp6hDgBOD41OtQoNyGCRK4p/sncR3+g8BjItLW1wW6gg+j/NJT/ffKJE71VNZOOo9a6mkB3uK77AJayzYmy7n0+W9hypMFAOYNtJnzEX4XdTsC2IEwXRp5wGehupw/Aef6KYzLZDI/6POPVQcDB+OCgYOBQ4CpwGiK+/e2C1gNLAae7fF1iYi051KQLqKSISwFJnho1xYmMiToItDe6B0MopsFCKf4LrtglMtkVt+fR1OeivlGYiKg84gziGd6XeleGrqAs8NY2KTLeALxMpS8BeEAmcjmnNugWoUbHRiLO7tgXOr70cAIOl45hIqGSuL1Hpq5h65W6NoEXRuhcwO0r4G21aCxf3LQt76K6/hfySfjXl90ORcCP/NTGJNkMiu8lLVn0XcymC7uAo4Jo/wCeJ0kE2U2r0fdEFM4tgbA7K6e90LJdv6KcKE0htD5K8IKT/PRcEM+nT+AiHQCK1KvN9AWbgXeTqwKKoemXntDrNa9oaLB7VIQgYohqYsS0L3FfZ9sh0RqJDixtUenv8m9r9dKuUumfPu+fP4+/Wrl1wzhClygE0yMI+nj5xaUnMlm/StnUs0/gTeFUUfI9ka4FPhK1A0xhWMBgNlJ5xEHroi6HQF8URq5KZSSV7I/UOehpC7cUbRhWQK8nWQndKxzr7DFeCGsouUYunQZ30L4ReDClCOBW4K3qnfydlq1hRnAv3DTNqVF+F9t5icyiwJ8aEwxsFTAZpcGzgUOiroZeVGulyauCq38pLdRkd/LpFBzsHtb9Ji1BKtDLX8Sv8bH30vD39UiTWygi9OJ4t8huEHYCMCAYgGAAVJD3MoXo25Hnv7EI3w61BrES2CkKN/zUE7fYiwNtfzeaLgBgAgJxMNplFKYba1yNq8S50wIb2QkNMKFupBJUTfDFIYFAMZp4RxKc9vfv4APyJXZ54XNi58A4G8ymcUeyulbkqXgf6V7Bh08yiuh1zKBPwBPBSxljC5npI/m9EdmsIYYZwIvF6I+jypJ8I2oG2EKwwIA457+YyX59P80HbxdmugIvSb1EACE/fQPSBNboIDHvCqrQg++ABGSiIeOKeY3IVAmMpPlJHgLsLZQdXohvFsXclTUzTDhswDAwELOQjk66mbkRFlFzGOWv/4FXQNwt0z2m5egT8rTBanHCWVVfa8mcCvKw4HKSBY2u6WcxTISTKO0ggAhyXeiboQJnwUABpQvR92EHG0AZsrMAgw9A/okg3D77PMnfNdPa7Kq65kC1rW8YFUJSoyvByuEwz01J/sqdwUBpTQdMENb7KTAcmcBwACnLTQCx0bdjhxsIUmjzOL5gtVYx4EES5r1iEzkbl/NyUJ5jgAAMpEWhP/kXUC+5zkEJGexDC25IGCuqiWLK2cWAJhS2vffBrxNZvNoQWsVDgx4/VxPLcm2vsIFAFLYACBVZ5ARq6mqxL21JQcyi+dLLAg4loW8PepGmPBYADCA6QLOAN4cdTuylEC4QJr4d8FrViYGuHYpE/ibx9b0bytLcQmHwpcs3BRAmkzgXuCfeV5ew8oA/54BlVwQoHxX77GEceXKAoCBTEsm6YeiXCiN3BpJ7cL4ANfOFQl/lfxuVZ5LJ7CsAFUlkZCTAPUtyGf3UG+tyIPM4nninAElkXHvQHbwvqgbYcJhAcAApfM5CTgt6nZkRbhMZkV6Xnm+T4xr6OAPXluSvUJMA7xYkC2YvZBJ3A/8Pa+LI1oH0JPMYCnCWyiFkQDhazqPqqibYfyzAGCgkoCrqQvnq9LIDyNuQ77H0X5PDqHTa0uyV4gAoPDz/z3FmQN053Fl5AEAgDTyHMLpFH8QMJYGPhh1I4x/FgAMQNrCCQjTo25HFn4sTR5SwAagi6gExuRx6TqqPRxgky8twFZALfz8f08ynqUoN+dxaaRTAD31CAIKsqU1b8qXtIXqqJth/LIAYGAqhbn/m2jkkqgbwd6MgzxWjQtzZX/avLcnW4VIBhSLeAQAIMlXgR05XnWgLi6eIe1UEDCN4g4CDkD4SNSNMH5ZADDA6EKOABqjbkc//k4tHxUpaE773uW3A+BVavm597bkYhargK0h1xJ5ACAHsRbN+XjlSqoDbu30rCSCAOXLOo/aqJth/LEAYKBJcjnBktqES7iHWs6TaXnN7fqnecz/K1fLqJyfSr1KBU/hHjwURQ6A3lQwF9iY41VFsQ6gJ2nkOWA6xRsE7McgLoq6EcYfCwAGEL2D8cA7o25HBo/QydkyjfaoG7KT5BwAvEYnPwulLbkLenpeJkm6CrLVsF8ynlbgqhwvK7oAAECaeJY4J6OsirotvRIu19upi7oZxg8LAAaSbj4HRZvU43nizJazQx+2zlWuAcDVcgjbQmlJrpTHQyx7tZwV7SjHbuJcR26nIBbt0dcyg1XANIpgiqUX+xLnE1E3wvhhAcAAoXcwEinSrTzKKhKcLjNYH3VT3iC3KYCNdPPT0NqSqziPhVa2sDS0svMg42lH+FrWF2jg0x1DJbNYTZxpFCahU64u19toiLoRJjgLAAaKBJdAUQ7dvYQyXc4q0uNSc5kCEP6fTCmiEYxqniKslMDCklDKDWICN6E8mdV7hYmpLZ5FS2awhi5OgQKe7pid4VTyyagbYYKzAGAA0DsYBHw86nb0Yj1J3iqzWRl1Q3qjSxgGWT/pbKSLn4TZnlyl1lKE86SeLL4AIJVyOdstrpUMi+5MgGzJ2bxKnDOyDmwK5/Pawl5RN8IEYwHAQNDNx4BhUTdjD6+R5AyZXXwdyU4VjM36vcoPiurpf5dwpgFixTUFkCaTuR2yPDAqUdzTAGkyg/Uo01AejrotPQxDiyBPhwnEAoAyp4uoRPhM1O3Yw2aURplddEObuxMOyOp9yibgx+E2Jk9hLQTsLs4AAIAkn4UsDmASDgq/MX7IbF6nircCD0Tdlp2Ey3Q+e0fdDJM/CwDK3atcAFl2ZIWxnRhnySwWRd2QfknWIwDfl8lsCbUt+QpnIeAGOYvXQijXCzmQJ4Df9fvGZOkEAAByJpuJcyb5H4Xs25AifLgwObAAoIypIgiXRd2OHtoQZstM7o26IVnKJgB4jUTOmegKp5rHyeZpODfFO22zy5egn1TMMYYXpin+yAy2E+dtwN1RtwUA4bO6kKFRN8PkxwKActbC2yiehCedCO+URv4VdUOylsxq5GRukc79AyDT2IbvrWRa/AGATGIN8IOMb1JaC9Mav2QG24FZ5Hscsl+DUT4ddSNMfiwAKGcxvhB1E1K6EN4ljbRE3ZCcCIP7eccr1PF/BWlLMH7XARRZDoA+dXMVZNxe+odCNcU3aaKDbbwL+GvUbUG5xPIClCYLAMqUNnMqyklRtwNIIHxAGoviaSVX/c1zfzfqnP9Z8h0AFP0IAIBMYSsxzkHY3ssff08msaDgjfJIzqWTkZwH/DHipgylqii3GZt+WABQroQ5UTcBUJSPS2OJPmkJv83wZ6vQosn5n1nM80LA7tIIAABkAg+TZArw/4Bm4Oco02RS0YyOBSLH0EUj5wPXRtoQ5TI7KbD0FO+pcCZvOp9DifEU0f77KsInpJEbImxDYLqcq4HP7/4/2YTSJAfyUDStyo0uZChJXsPP52EbjexVFEc1m91oC3OAuZE1QLhYGrk+svpNzmwEoBzF+F+iDu6EOaXe+QOknhRPBq4D/ojwNZIcVCqdP4DMZBP+DpZ52jr/4iRNXJXalhfNv49yuc6jKpK6TV6K9WQ4kydtYQRwfsTNmCONfC/iNngjk7gfuD/qdgSiPIgwyUNJxZaS1vQgjfxIW2gFfknh7+/708D5wK8LXK/Jk40AlJ9PADUR1v9laeLqCOs3vXvQUzlPeSrHhESauBnlnUB7wStXvqTziBe8XpMXCwDKSGr4LcrVuF+SJr4dYf2mL+opAEjaCEApkFncRpImKHiOikkM4h0FrtPkyQKAclLPu4H9Iqr9S9LEdyKq2/RnX56CwFsWlViRn99gdpLZ3INwBrCxwFVfoWoLzEuBBQDl5VMR1WudhvXiewAABXBJREFUf5GTY+hCeTRgMSulqUjPPDC9kkYeAU4lc0Ikz5VyBHfQVLD6TN4sACgT2sypwLERVG2df+kIOg1g8/8lSJp4ljinAMsLVmmSrxSsLpM3CwDKRxSnclnnX0piAQMAsfn/UiUzWIVyCoUL4o7X+UwrUF0mTxYAlAFtZizC2YWtlCus8y8xEvAsebUAoJTJLNaR5C0Q8HOQrRhfKkg9Jm8WAJSDGJdAAbfeKFfILL5bsPqMFzKTV4AX8y4gaVMApU5m8zq1vBX4RwGqO0NbOKEA9Zg8WQBQ4vQ2GlA+UrgKrfMvaZL3NMBWZrHKa1tMJGQa2xjJbODmAlR3RQHqMHmyAKDUVfEh6PfYWj+s8y99ybxTGD9lKYDLR+oQoQ+ifD3kqmbrQg4JuQ6TJwsASpgqgvLJwlRmnX9ZiOU5/2vz/2VHBJVZXAl8BOgOqxqSXBZS2SYgCwBK2QJmAweFXIsiXGqdf5mo4XHySRHr+0hhUzSkiRtTqYODJorqywV6B/uHVLYJwAKA0vbZkMtX4DPSyA9DrscUiEyjHbgrx8uSKHeE0R5THGQWt6GcDmwIofhKuvl0COWagCwAKFHazGEQ6j7bbpQPSBPXhViHiYJwTY5X/FmaeCmUtpiiIbN4CDiRMBIGCR/TvzLEe7kmEAsASpXwaQgt33Yn8B6ZxW9CKt9ESBq5G/hZlm9/GQ19pMkUCWliBcopSOC00Xvai2ou8lymCcgCgBKUiqTPD6n4DpRzpYm/hFS+KQa1XAxcBxlX9j9DjNNkFusK1CpTBGQW66jhLcACz0X/r94T6VHlZg8WAJSiaj4IDAqh5O3EmC2zuC2Esk0RkWl0SxOXoBwH/ApYCbQBrwJ3Ah9hJEfJzALmjzdFI5Ur4Gz85grYl3bO81ieCciObCwxqggLWIL/1f+tCE3SWKA0ocaYoqeKsJBvo3zRS4HCPdLI6V7KMoFZAFBidAEzUBZ6LnYTwszU0aHGGLMbbeHDwA1ARcCi2tlGvZxLwkOzTEA2BVBqlIs9l7iOJKdZ52+M6Ys0cSNwDrA9YFE1VNLgoUnGAxsBKCF6OwcQZyX+Dv5ZTYzpNs9rjMmGLuQoktwOjMqziA5G0iDH0OWzXSY/NgJQSmJ8An+d//PEOcU6f2NMtmQmjxHnBMj7ZMhHrPMvHhYAlAhVBOG9nop7lgqmyQzWeCrPGDNApO4bpyB5rEUSrvffIpMvCwBKxUIOBC/5tB8hxinyVl72UJYxZgCSJrZQw1nAT7O/iIXM5I/htcrkygKAUpHIe86tp7vp4gyZySYPZRljBrBULolPAJ+j/9ME/4Vynh0pXVwsACgVwtZA1yu3ArPk7IDlGGNMD9LE94FTgH/38scvI1xKLWdKE1sK3DTTD9sFUCK0hWpgE1CX88XCL9jKx23vrTEmTNrCGJQjiVGFsoqHeVKuJBl1u0zvLAAoIdrCz4ALc7zsKhr5og29GWOM6cmmAEpJF18B1mf5bkX4gjRxuXX+xhhj9mQBQAmRs3kVZRb9BwEdKB+RRr5XiHYZY4wpPRYAlBiZxSLgaOCP0MucvnA/yptlFr8qdNuMMcaUDlsDUMK0mX0RTkMYRZJWlAdlNkuibpcxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMaZo/X/BUewfDO2dLgAAAABJRU5ErkJggg==";var wC="data:image/png;base64,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";var MC="data:image/png;base64,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";import{Fragment as IB,jsx as xt,jsxs as Or}from"react/jsx-runtime";var df=-100,pf=100,kC=.03,TB=.03,_B=.03,SC=.5,EB=xC,AB=wC,RB=MC,kB=Math.PI/4,CC=.4,Pa=64,PC=kC*3,mf="#4d7dff",TC="#ffcc00",_C=.02,DB=new Jr(0,1,0),ud=32,EC="#ff9d3d",dd=4;function hf(e){let t=new Float32Array((Pa+1)*3);for(let r=0;r<=Pa;r++){let n=r/Pa*Math.PI*2,i=Math.cos(n)*CC,o=Math.sin(n)*CC,a=0,s=0,l=0;e==="x"?(s=i,l=o):e==="y"?(a=i,l=o):(a=i,s=o),t[r*3]=a,t[r*3+1]=s,t[r*3+2]=l}return t}function OB(e){let t=Math.abs(e.y)<.99?new Jr(0,1,0):new Jr(1,0,0),r=new Jr().crossVectors(e,t).normalize(),n=new Jr().crossVectors(e,r).normalize();return[r,n]}function AC(e,t,r=1e-5){return Math.abs(e[0]-t[0])<r&&Math.abs(e[1]-t[1])<r&&Math.abs(e[2]-t[2])<r}var Ta=null,gf=new Set;function ff(e){Ta!==e&&(Ta=e,gf.forEach(t=>t()))}function LB(e){return gf.add(e),()=>gf.delete(e)}function RC(){return Ta}function DC({light:e,position:t,rotation:r=[0,0,0],color:n,intensity:i,visible:o,onPositionChange:a,onRotationChange:s,onDraggingChange:l}){let{activeTab:d,activeSubTab:u,setActiveTab:p,setActiveSubTab:c}=hi(),{camera:h,gl:m,raycaster:b,invalidate:y}=yB(),S=Bt(null),f=Bt(null),g=Bt(null),x=Bt(null),_=Bt(null),v=Bt(null),R=Bt(null),A=Bt(null),w=Bt(null),C=Bt(null),P=Bt(null),E=Dr(()=>new PB,[]),T=Dr(()=>new Ca,[]),O=Dr(()=>new Jr(1,1,1),[]),j=Bt([0,0,0]),I=Bt([0,0,0]),N=Bt(!1),D=Bt(null),k=Bt(null),U=Bt(null),te=Bt(l);dl(()=>{te.current=l},[l]);let re=Dr(()=>new Jr(t[0],t[1],t[2]),[t]),Z=Dr(()=>new cd(r[0],r[1],r[2]),[r]),ne=Dr(()=>new Float32Array(6),[]),X=Dr(()=>hf("x"),[]),G=Dr(()=>hf("y"),[]),H=Dr(()=>hf("z"),[]),ae=Dr(()=>new Float32Array((ud+1)*3),[]),xe=Dr(()=>new Float32Array(dd*2*3),[]),Ie=e?.type==="point",q=e?.type==="spot",be=Ie?AB:q?RB:EB,Pe=Ie?TB:q?_B:kC,pe=Dr(()=>new CB().load(be),[be]),ft=vB(LB,RC,RC),J=!!e&&ft===e.id,$e=Bt(new Jr),se=Bt(new cd);dl(()=>{N.current||($e.current.copy(re),se.current.copy(Z),y())},[re,Z,y]),dl(()=>{e&&Ta===e.id&&!o&&ff(null)},[e?.id,o]),dl(()=>()=>{e&&Ta===e.id&&ff(null),U.current!==null&&(cancelAnimationFrame(U.current),U.current=null)},[e?.id]);let De=ld(()=>{if(N.current||!J)return;let oe=$e.current,K=new Ca().setFromEuler(se.current);E.compose(oe,K,O)},[E,O,J]);xB(()=>{if(S.current&&S.current.position.copy($e.current),De(),g.current){g.current.lookAt(h.position);let oe=h,K;oe.isOrthographicCamera?K=Pe/oe.zoom:K=h.position.distanceTo($e.current)*Pe,g.current.scale.setScalar(K)}if(R.current){let oe=h,K;oe.isOrthographicCamera?K=PC/oe.zoom:K=h.position.distanceTo($e.current)*PC,R.current.scale.setScalar(K)}if(_.current){let oe=_.current.getAttribute("position"),K=oe.array;K[0]=0,K[1]=0,K[2]=0,K[3]=$e.current.x,K[4]=$e.current.y,K[5]=$e.current.z,oe.needsUpdate=!0,_.current.computeBoundingSphere()}if(v.current){let oe=$e.current,K=oe.length();v.current.visible=K>SC,K>1e-6&&(v.current.position.copy(oe).multiplyScalar(.5),v.current.scale.set(1,K,1),v.current.quaternion.setFromUnitVectors(DB,oe.clone().normalize()))}if(x.current&&(x.current.visible=$e.current.length()>SC),q&&A.current&&w.current&&C.current){let oe=$e.current,K=oe.length();if(K>1e-6){A.current.visible=!0;let Ae=oe.clone().negate().normalize(),we=K,qe=e?.angle??Math.PI/6,Ye=we*Math.tan(qe),ot=oe.clone().add(Ae.clone().multiplyScalar(we)),[ee,Me]=OB(Ae),Se=w.current.getAttribute("position"),je=Se.array;for(let Te=0;Te<=ud;Te++){let me=Te/ud*Math.PI*2,We=ot.x+(ee.x*Math.cos(me)+Me.x*Math.sin(me))*Ye,_t=ot.y+(ee.y*Math.cos(me)+Me.y*Math.sin(me))*Ye,nr=ot.z+(ee.z*Math.cos(me)+Me.z*Math.sin(me))*Ye;je[Te*3]=We,je[Te*3+1]=_t,je[Te*3+2]=nr}Se.needsUpdate=!0,w.current.computeBoundingSphere();let at=C.current.getAttribute("position"),Le=at.array;for(let Te=0;Te<dd;Te++){let me=Te/dd*Math.PI*2,We=ot.x+(ee.x*Math.cos(me)+Me.x*Math.sin(me))*Ye,_t=ot.y+(ee.y*Math.cos(me)+Me.y*Math.sin(me))*Ye,nr=ot.z+(ee.z*Math.cos(me)+Me.z*Math.sin(me))*Ye,ir=Te*6;Le[ir]=oe.x,Le[ir+1]=oe.y,Le[ir+2]=oe.z,Le[ir+3]=We,Le[ir+4]=_t,Le[ir+5]=nr}at.needsUpdate=!0,C.current.computeBoundingSphere()}else A.current.visible=!1}});let He=ld(()=>{U.current!==null&&(cancelAnimationFrame(U.current),U.current=null),j.current=t,I.current=[r[0],r[1],r[2]],N.current=!0,D.current=null,k.current=null,te.current?.(!0)},[t,r]),ie=ld((oe,K,Ae,we)=>{let qe=new Jr(j.current[0],j.current[1],j.current[2]),Ye=new Jr,ot=new Ca,ee=new Jr;we.decompose(Ye,ot,ee);let Me=qe.clone().applyMatrix4(we),Se=[Math.min(Math.max(Me.x,df),pf),Math.min(Math.max(Me.y,df),pf),Math.min(Math.max(Me.z,df),pf)],je=new Ca().setFromEuler(new cd(I.current[0],I.current[1],I.current[2],"XYZ")),at=new Ca().copy(ot).multiply(je),Le=new cd().setFromQuaternion(at,"XYZ"),Te=[Le.x,Le.y,Le.z];$e.current.set(Se[0],Se[1],Se[2]),se.current.set(Te[0],Te[1],Te[2]),D.current=Se,k.current=Te;let me=new Ca().setFromEuler(se.current);E.compose($e.current,me,O),y()},[E,O,y]),Ue=ld(()=>{N.current=!1;let oe=D.current,K=k.current;D.current=null,k.current=null;let Ae=oe&&!AC(oe,j.current),we=K&&!AC(K,I.current);Ae&&a&&a(oe),we&&s&&s(K),Ae||we?U.current=requestAnimationFrame(()=>{U.current=null,te.current?.(!1)}):te.current?.(!1)},[a,s]);return dl(()=>{let oe=we=>{let qe=m.domElement.getBoundingClientRect();return new SB((we.clientX-qe.left)/qe.width*2-1,-((we.clientY-qe.top)/qe.height)*2+1)},K=we=>!!we.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),Ae=we=>{if(K(we))return;let qe=oe(we);b.setFromCamera(qe,h);let Ye=[];if(f.current&&Ye.push(f.current),g.current&&Ye.push(g.current),Ye.length===0)return;if(b.intersectObjects(Ye,!1).length>0){let ee=e?.id??null;Ta!==ee&&(ff(ee),p?.("scene"),c?.("lighting")),we.preventDefault(),we.stopPropagation()}};return m.domElement.addEventListener("pointerdown",Ae),()=>{m.domElement.removeEventListener("pointerdown",Ae)}},[h,b,m,e,p,c]),d!=="scene"||u!=="lighting"||!e||!o||e.type==="none"||e.type==="hemisphere"?null:Or("group",{ref:oe=>{oe&&Vo(oe)},children:[Or("group",{ref:S,children:[xt("sprite",{ref:g,children:xt("spriteMaterial",{map:pe,transparent:!0,opacity:.9,blending:uf,depthWrite:!1,rotation:q?kB:0},be)}),xt(wB,{ref:f,args:[.25,16,16],children:xt("meshBasicMaterial",{transparent:!0,opacity:.01})}),Ie&&Or("group",{ref:R,children:[Or("lineLoop",{renderOrder:999,children:[xt("bufferGeometry",{children:xt("bufferAttribute",{attach:"attributes-position",args:[X,3],count:Pa+1})}),xt("lineBasicMaterial",{color:mf,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),Or("lineLoop",{renderOrder:999,children:[xt("bufferGeometry",{children:xt("bufferAttribute",{attach:"attributes-position",args:[G,3],count:Pa+1})}),xt("lineBasicMaterial",{color:mf,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),Or("lineLoop",{renderOrder:999,children:[xt("bufferGeometry",{children:xt("bufferAttribute",{attach:"attributes-position",args:[H,3],count:Pa+1})}),xt("lineBasicMaterial",{color:mf,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]})]}),!Ie&&!q&&Or(IB,{children:[Or("mesh",{ref:v,children:[xt("cylinderGeometry",{args:[_C,_C,1,8,1,!0]}),xt("meshBasicMaterial",{color:TC,transparent:!0,opacity:.05,blending:uf,depthWrite:!1,depthTest:!1})]}),Or("line",{ref:x,children:[xt("bufferGeometry",{ref:_,children:xt("bufferAttribute",{attach:"attributes-position",args:[ne,3],count:2})}),xt("lineBasicMaterial",{color:TC,transparent:!0,opacity:.7,blending:uf})]})]}),q&&Or("group",{ref:A,children:[Or("lineLoop",{renderOrder:999,children:[xt("bufferGeometry",{ref:w,children:xt("bufferAttribute",{attach:"attributes-position",args:[ae,3],count:ud+1})}),xt("lineBasicMaterial",{color:EC,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),Or("lineSegments",{renderOrder:999,children:[xt("bufferGeometry",{ref:C,children:xt("bufferAttribute",{attach:"attributes-position",args:[xe,3],count:dd*2})}),xt("lineBasicMaterial",{color:EC,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),J&&a&&xt(MB,{ref:P,matrix:E,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:He,onDrag:ie,onDragEnd:Ue})]})}import{useCallback as xn,useEffect as BB,useLayoutEffect as NB,useMemo as vr,useRef as Lr}from"react";import{Html as jB,PivotControls as zB}from"@react-three/drei";import{useFrame as VB,useThree as bf}from"@react-three/fiber";import{Euler as OC,Matrix4 as pl,Quaternion as ml,Vector3 as Cr}from"three";import{Maximize2 as FB}from"lucide-react";import{jsx as hl,jsxs as GB}from"react/jsx-runtime";var UB=.01,vf=.5;function yf({node:e,space:t,moveEnabled:r,gizmoTool:n,scaleEnabled:i,onTransformChange:o,onDraggingChange:a,transform:s}){let l=bf(q=>q.invalidate),d=bf(q=>q.camera),u=bf(q=>q.size),p=vr(()=>po(e),[e]),c=vr(()=>new Cr,[e]);s?.pivot?c.fromArray(s.pivot.point):c.copy(p);let h=vr(()=>{let q=Ds(e);if(!q)return[c.clone().add(new Cr(vf,vf,vf))];let be=[];for(let Pe of[q.min.x,q.max.x])for(let pe of[q.min.y,q.max.y])for(let ft of[q.min.z,q.max.z])be.push(new Cr(Pe,pe,ft));return be},[e,c]),m=vr(()=>new Cr,[]),b=vr(()=>new Cr,[]),y=Lr(null),S=vr(()=>new pl,[]),f=Lr(!1),g=Lr(new pl),x=Lr(new pl),_=Lr(null),v=Lr([]),R=Lr(null),A=Lr(a);A.current=a;let w=vr(()=>new Cr,[]),C=vr(()=>new ml,[]),P=vr(()=>new Cr,[]),E=vr(()=>new ml,[]),T=vr(()=>new Cr(1,1,1),[]),O=vr(()=>new ml,[]),j=vr(()=>new Cr,[]),I=vr(()=>new Cr,[]),N=Lr([0,0,0]),D=Lr(new Cr(1,1,1)),k=Lr({point:[0,0,0],offset:[0,0,0]}),U=xn(()=>{f.current||(e.updateWorldMatrix(!0,!1),w.copy(c).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(C),E.copy(C),t==="world"&&E.identity(),S.compose(w,E,T))},[w,S,E,T,e,c,t,C]),te=xn(()=>{e.updateWorldMatrix(!0,!1);let q=1/0;for(let be of h){m.copy(be).applyMatrix4(e.matrixWorld);let Pe=m.distanceToSquared(d.position);Pe<q&&(q=Pe,b.copy(m))}y.current?.position.copy(b)},[d,b,h,e,m]);NB(()=>(U(),te(),()=>{let q=R.current!==null;q&&(cancelAnimationFrame(R.current),R.current=null),(f.current||q)&&(f.current=!1,A.current(!1));for(let be of v.current)qr(be);v.current=[]}),[U]),VB(()=>{U(),te()});let re=xn(()=>{R.current!==null&&(cancelAnimationFrame(R.current),R.current=null),e.updateWorldMatrix(!0,!0),v.current=[];for(let q of un(e))Ho(q)||(di(q,q.matrixWorld),v.current.push(q));e.updateWorldMatrix(!0,!1),w.copy(c).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(C),e.getWorldScale(P),g.current.compose(w,C,P),x.current.copy(S),N.current=[e.rotation.x,e.rotation.y,e.rotation.z],D.current.copy(e.scale),k.current=s?.pivot??cu(c.toArray(),N.current,e.scale.toArray(),e.rotation.order),_.current=null,f.current=!0,a(!0)},[w,S,e,a,c,C,P,s?.pivot]),Z=xn((q,be)=>{let Pe=g.current.clone().premultiply(be),pe=x.current.clone().premultiply(be);Pe.decompose(j,C,I);let ft=j.clone();pe.decompose(w,E,T),t==="world"&&E.identity(),S.compose(w,E,T),q.decompose(j,O,I);let J=new OC().setFromQuaternion(O,e.rotation.order),[$e,se,De]=N.current,He=[$e+J.x,se+J.y,De+J.z],ie=new ml().setFromEuler(new OC(He[0],He[1],He[2],e.rotation.order));e.scale.copy(D.current);let oe=(e.parent?.matrixWorld||new pl).clone().invert(),K=ft.clone().applyMatrix4(oe),Ae=c.clone().multiply(e.scale).applyQuaternion(ie),we=K.clone().sub(Ae);e.position.copy(we),e.rotation.set(He[0],He[1],He[2],e.rotation.order),e.updateMatrixWorld(!0),l();let qe=k.current,Ye=K.clone().sub(new Cr(...qe.offset)),ot=[Ye.x,Ye.y,Ye.z];_.current={position:ot,rotation:He,pivot:qe}},[w,O,S,E,T,l,e,c,j,I,t,C]),ne=xn(()=>{f.current=!1;let q=_.current;if(_.current=null,q)o(q),R.current=requestAnimationFrame(()=>{R.current=null,a(!1)});else if(v.current.length>0){for(let be of v.current)qr(be);e.updateMatrixWorld(!0),l(),a(!1)}else a(!1);v.current=[]},[l,e,a,o]),X=Lr(null),G=xn(q=>{let be=q.clone().project(d);return{x:u.left+(be.x*.5+.5)*u.width,y:u.top+(-be.y*.5+.5)*u.height}},[d,u]),H=xn((q,be)=>{let Pe=Math.max(UB,Number.isFinite(q)?q:1);e.scale.copy(D.current).multiplyScalar(Pe);let ft=(e.parent?.matrixWorld||new pl).clone().invert(),J=be.clone().applyMatrix4(ft),$e=new ml().setFromEuler(e.rotation),se=c.clone().multiply(e.scale).applyQuaternion($e),De=J.clone().sub(se);e.position.set(De.x,De.y,De.z),e.updateMatrixWorld(!0),te(),l(),_.current={position:J.clone().sub(new Cr(...k.current.offset)).toArray(),scale:e.scale.toArray(),pivot:k.current}},[l,e,c,te]),ae=xn(q=>{if(!i)return;q.stopPropagation(),q.preventDefault(),q.currentTarget.setPointerCapture(q.pointerId),re();let be=w.clone(),Pe=G(be),pe=Math.max(1,Math.hypot(q.clientX-Pe.x,q.clientY-Pe.y));X.current={pointerId:q.pointerId,centerScreen:Pe,startDistance:pe,pivotWorld:be}},[re,w,G,i]),xe=xn(q=>{let be=X.current;if(!be||q.pointerId!==be.pointerId)return;q.stopPropagation();let Pe=Math.hypot(q.clientX-be.centerScreen.x,q.clientY-be.centerScreen.y);H(Pe/be.startDistance,be.pivotWorld)},[H]),Ie=xn(q=>{let be=X.current;!be||q.pointerId!==be.pointerId||(q.stopPropagation(),q.currentTarget.hasPointerCapture(q.pointerId)&&q.currentTarget.releasePointerCapture(q.pointerId),X.current=null,ne())},[ne]);return BB(()=>{i||X.current&&(X.current=null,ne())},[i,ne]),GB("group",{children:[hl(zB,{matrix:S,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#e5484d","#46a758","#3e8bff"],hoveredColor:"#35c0dc",opacity:.95,depthTest:!1,disableAxes:!r||n==="rotate",disableSliders:!r||n==="rotate",disableRotations:!r||n==="move",disableScaling:!0,onDragStart:re,onDrag:(q,be,Pe,pe)=>Z(be,pe),onDragEnd:ne}),i&&hl("group",{ref:y,children:hl(jB,{portal:void 0,zIndexRange:[10,0],style:{pointerEvents:"none",transition:"opacity 0.2s"},children:hl("div",{onPointerDown:ae,onPointerMove:xe,onPointerUp:Ie,onPointerCancel:Ie,title:"Drag to resize",style:{position:"absolute",transform:"translate(-50%, -50%)",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#113456",border:"2px solid #ffffff",boxShadow:"0 2px 6px rgba(0,0,0,0.5)",cursor:"nwse-resize",touchAction:"none",pointerEvents:"auto"},children:hl(FB,{size:13,color:"#ffffff"})})})})]})}import{useCallback as wn,useEffect as WB,useLayoutEffect as BC,useMemo as Co,useRef as Ir}from"react";import{Html as qB,PivotControls as XB}from"@react-three/drei";import{useFrame as $B,useThree as Mf}from"@react-three/fiber";import{Matrix4 as fl,Quaternion as YB,Vector3 as Po}from"three";import{Maximize2 as KB}from"lucide-react";import{Matrix4 as HB,Vector3 as LC}from"three";function xf(e){let t=new Set(e.map(({node:n})=>n)),r=new Set;return e.filter(({node:n})=>{if(r.has(n))return!1;r.add(n);for(let i=n.parent;i;i=i.parent)if(t.has(i))return!1;return!0})}function IC(e){return xf(e).map(({key:t,node:r,transform:n})=>{r.updateWorldMatrix(!0,!0);let i=n?.pivot?.point??po(r).toArray(),o=n?.pivot??cu(i,[r.rotation.x,r.rotation.y,r.rotation.z],r.scale.toArray(),r.rotation.order,n?.shear);return{key:t,node:r,pivot:o,startWorld:r.matrixWorld.clone(),startMatrix:r.matrix.clone(),startMatrixAutoUpdate:r.matrixAutoUpdate,startPosition:r.position.clone(),startQuaternion:r.quaternion.clone(),startScale:r.scale.clone(),pivotWorld:new LC(...o.point).applyMatrix4(r.matrixWorld)}})}function wf(e,t,r=1){return e.map(n=>{let{node:i,pivot:o}=n;i.parent?.updateWorldMatrix(!0,!1);let a=(i.parent?.matrixWorld.clone()??new HB).invert(),s=a.clone().multiply(t).multiply(n.startWorld),{rotation:l,scale:d,shear:u}=Lc(s,n.startScale.clone().multiplyScalar(r),n.startQuaternion),p=n.pivotWorld.clone().applyMatrix4(t).applyMatrix4(a);return i.position.setFromMatrixPosition(s),i.quaternion.copy(l),i.scale.copy(d),mn(i,u),i.updateMatrixWorld(!0),{key:n.key,transform:{position:p.clone().sub(new LC(...o.offset)).toArray(),rotation:[i.rotation.x,i.rotation.y,i.rotation.z],scale:d.toArray(),pivot:o,shear:u}}})}import{jsx as gl,jsxs as JB}from"react/jsx-runtime";var QB=.01;function Sf({entries:e,referenceNode:t,space:r,moveEnabled:n,gizmoTool:i,scaleEnabled:o,onTransformChange:a,onDraggingChange:s}){let l=Mf(G=>G.invalidate),d=Mf(G=>G.camera),u=Mf(G=>G.size),p=Ir(e);p.current=e;let c=Ir([]);(e.length!==c.current.length||e.some((G,H)=>G.key!==c.current[H].key||G.node!==c.current[H].node))&&(c.current=e);let h=c.current,m=Co(()=>xf(h).map(({node:G})=>G),[h]),b=t??e[e.length-1]?.node,y=Co(()=>new Po,[]),S=Co(()=>new YB,[]),f=Co(()=>new fl,[]),g=Co(()=>new Po(1,1,1),[]),x=Co(()=>new Po,[]),_=Ir(null),v=Co(()=>m.flatMap(G=>{let H=Ds(G);if(!H)return[{node:G,point:po(G).addScalar(.5)}];let ae=[];for(let xe of[H.min.x,H.max.x])for(let Ie of[H.min.y,H.max.y])for(let q of[H.min.z,H.max.z])ae.push({node:G,point:new Po(xe,Ie,q)});return ae}),[m]),R=Ir(!1),A=Ir(new fl),w=Ir([]),C=Ir(null),P=Ir([]),E=Ir(null),T=Ir(null),O=Ir(s);O.current=s;let j=Ir(a);j.current=a;let I=wn(()=>{if(!R.current){y.set(0,0,0);for(let G of m)G.updateWorldMatrix(!0,!1),y.add(po(G).applyMatrix4(G.matrixWorld));m.length&&y.divideScalar(m.length),S.identity(),r==="local"&&b&&(b.updateWorldMatrix(!0,!1),b.getWorldQuaternion(S)),f.compose(y,S,g)}},[y,f,S,m,b,r,g]),N=wn(()=>{let G=1/0,H=new Po;for(let{node:ae,point:xe}of v){ae.updateWorldMatrix(!0,!1),H.copy(xe).applyMatrix4(ae.matrixWorld);let Ie=H.distanceToSquared(d.position);Ie<G&&(G=Ie,x.copy(H))}_.current?.position.copy(x)},[d,v,x]),D=wn(()=>{let G=T.current;T.current=null,G?.target.hasPointerCapture(G.pointerId)&&G.target.releasePointerCapture(G.pointerId)},[]);BC(()=>{I(),N()},[I,N]),BC(()=>()=>{D();let G=E.current!==null;if(G&&(cancelAnimationFrame(E.current),E.current=null),R.current)for(let H of w.current)H.node.matrixAutoUpdate=H.startMatrixAutoUpdate,H.node.matrix.copy(H.startMatrix),H.node.position.copy(H.startPosition),H.node.quaternion.copy(H.startQuaternion),H.node.scale.copy(H.startScale),H.node.updateMatrixWorld(!0);(R.current||G)&&(R.current=!1,C.current=null,O.current(!1),l());for(let H of P.current)qr(H);P.current=[]},[h,l,D]),$B(()=>{I(),N()});let k=wn(()=>{E.current!==null&&(cancelAnimationFrame(E.current),E.current=null),I(),w.current=IC(p.current),P.current=[];for(let{node:G}of w.current)for(let H of un(G))Ho(H)||(di(H,H.matrixWorld),P.current.push(H));A.current.copy(f),C.current=null,R.current=!0,O.current(!0)},[f,I]),U=wn((G,H)=>{if(!R.current)return;A.current.clone().premultiply(H).decompose(y,S,new Po),r==="world"&&S.identity(),f.compose(y,S,g),C.current=wf(w.current,H),N(),l()},[y,f,S,l,r,N,g]),te=wn(()=>{if(!R.current)return;R.current=!1,D();let G=C.current;if(C.current=null,G?.length)E.current=requestAnimationFrame(()=>{E.current=null,O.current(!1)}),j.current(G);else{for(let H of P.current)qr(H);l(),O.current(!1)}P.current=[]},[l,D]);WB(()=>{(!o&&T.current||!n&&R.current&&!T.current)&&te()},[o,n,te]);let re=wn(G=>{let H=G.clone().project(d);return{x:u.left+(H.x*.5+.5)*u.width,y:u.top+(-H.y*.5+.5)*u.height}},[d,u]),Z=wn(G=>{if(!o)return;G.stopPropagation(),G.preventDefault(),G.currentTarget.setPointerCapture(G.pointerId),k();let H=re(y);T.current={pointerId:G.pointerId,target:G.currentTarget,centerScreen:H,startDistance:Math.max(1,Math.hypot(G.clientX-H.x,G.clientY-H.y))}},[k,y,re,o]),ne=wn(G=>{let H=T.current;if(!H||G.pointerId!==H.pointerId)return;G.stopPropagation();let ae=Math.hypot(G.clientX-H.centerScreen.x,G.clientY-H.centerScreen.y),xe=Math.max(QB,ae/H.startDistance),Ie=new Po().setFromMatrixPosition(A.current),q=new fl().makeTranslation(...Ie.toArray()).multiply(new fl().makeScale(xe,xe,xe)).multiply(new fl().makeTranslation(...Ie.clone().negate().toArray()));C.current=wf(w.current,q,xe),N(),l()},[l,N]),X=wn(G=>{G.pointerId===T.current?.pointerId&&(G.stopPropagation(),te())},[te]);return JB("group",{children:[gl(XB,{matrix:f,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#e5484d","#46a758","#3e8bff"],hoveredColor:"#35c0dc",opacity:.95,depthTest:!1,disableAxes:!n||i==="rotate",disableSliders:!n||i==="rotate",disableRotations:!n||i==="move",disableScaling:!0,onDragStart:k,onDrag:(G,H,ae,xe)=>U(H,xe),onDragEnd:te}),o&&gl("group",{ref:_,children:gl(qB,{children:gl("div",{onPointerDown:Z,onPointerMove:ne,onPointerUp:X,onPointerCancel:X,title:"Drag to resize",style:{position:"absolute",transform:"translate(-50%, -50%)",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#113456",border:"2px solid #ffffff",boxShadow:"0 1px 4px rgba(0,0,0,0.4)",cursor:"nwse-resize",touchAction:"none",pointerEvents:"auto"},children:gl(KB,{size:13,color:"#ffffff"})})})})]})}import{Vector3 as ZB}from"three";function e2(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let r=t.geometry,n=r.getAttribute("skinIndex"),i=r.getAttribute("skinWeight"),o=r.getAttribute("position");if(!n||!i||!o)return null;let a=t.worldToLocal(e.point.clone()),s=[e.face.a,e.face.b,e.face.c],l=new ZB,d=s[0],u=1/0;for(let h of s){l.fromBufferAttribute(o,h);let m=l.distanceToSquared(a);m<u&&(u=m,d=h)}let p=n.getComponent(d,0),c=i.getComponent(d,0);for(let h=1;h<4;h++){let m=i.getComponent(d,h);m>c&&(c=m,p=n.getComponent(d,h))}return t.skeleton.bones[p]??null}function NC(e){let t=e2(e)??e.object,r=ui(t);if(!r)return null;t.updateWorldMatrix(!0,!1);let n=t.worldToLocal(e.point.clone());return{anchorNodeName:r,anchorLocalPosition:[n.x,n.y,n.z]}}function jC(e,t,r){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let n=cn(t,e.anchorNodeName);return n?(n.updateWorldMatrix(!0,!1),r.set(...e.anchorLocalPosition).applyMatrix4(n.matrixWorld),!0):!1}import{useEffect as t2,useMemo as Cf,useRef as zC}from"react";import{useFrame as r2,useThree as n2}from"@react-three/fiber";import{Vector3 as Pf}from"three";function pd({annotation:e,enabled:t,controlsRef:r,offsetRef:n}){let i=n2(c=>c.scene),o=zC(null),a=zC(!1),s=Cf(()=>new Pf,[]),l=Cf(()=>new Pf,[]),d=Cf(()=>new Pf,[]),u=e?.anchorNodeName,p=e?.anchorLocalPosition;return t2(()=>{o.current=null,a.current=!1},[u,e?.id]),r2(()=>{let c=r.current,h=n.current;if(!t||!c||!h||!u||!p){a.current=!1;return}let m=o.current;if((!m||!m.parent)&&(m=cn(i,u),o.current=m),!m){a.current=!1;return}m.updateWorldMatrix(!0,!1),s.set(p[0],p[1],p[2]).applyMatrix4(m.matrixWorld),!(a.current&&s.distanceToSquared(l)<1e-8)&&(l.copy(s),a.current=!0,d.copy(s).add(h),c.setLookAt(d.x,d.y,d.z,s.x,s.y,s.z,!0))}),null}import{useCallback as Mn,useEffect as _a,useMemo as Ea,useRef as Tf,useState as Oi}from"react";import{Box3 as i2,Vector3 as md}from"three";function VC({sceneAnnotations:e,controlledAnnotationCategories:t,onAnnotationCategoriesChange:r,showAnnotationFilters:n,initialCategories:i,controlledActiveAnnotation:o,onActiveAnnotationChange:a,onAnnotationsChange:s,controlsRef:l,sceneRef:d,annotationWorldPositionsRef:u,tourCameraOffsetRef:p,initialCameraStateRef:c,engagement:h,engagementRef:m}){let[b,y]=Oi(!1),[S,f]=Oi(()=>e??[]);_a(()=>{if(S.length>0){let se=S.reduce((De,He)=>Math.max(De,He.id),0);R.current=se}else R.current=0},[S]);let[g,x]=Oi(null),[_,v]=Oi({title:"",description:""}),R=Tf(0),[A,w]=Oi(null),[C,P]=Oi(-1),[E,T]=Oi(!1),O=Tf(null),[j,I]=Oi(()=>i),N=t===void 0?j:t,D=Ea(()=>Kb(S,N),[S,N]),k=Ea(()=>[...new Set(S.map(Yb))].sort(),[S]),U=n&&k.some(Boolean),te=se=>{t===void 0&&I(se),r?.(se)},re=Ea(()=>[...D].sort((se,De)=>se.id-De.id),[D]),Z=Ea(()=>JSON.stringify([N?.map(se=>se.trim()).sort()??null,re]),[N,re]),ne=Ea(()=>C<0||C>=re.length?null:re[C],[C,re]),X=Mn(se=>{if(o!==void 0){a?.(se);return}w(se?{annotation:se}:null)},[o,a]),G=Tf(null),H=Mn(se=>{let De=l.current,He=d.current;if(!De)return;let ie=new md,Ue=u.current.get(se.id);Ue?ie.copy(Ue):He&&jC(se,He,ie)||ie.set(se.worldPosition[0],se.worldPosition[1],se.worldPosition[2]),p.current=null;let oe=De.smoothTime;De.smoothTime=$o(De,.6);let K=se.worldNormal;if(Ip(se.cameraView))as(De,se.cameraView);else{if(He){let Ae=new i2().setFromObject(He),we=new md;Ae.getCenter(we);let qe=new md;Ae.getSize(qe);let Ye=qe.length()*.2,ot;K?ot=new md(K[0],K[1],K[2]):ot=ie.clone().sub(we),ot.lengthSq()<1e-6&&ot.set(0,0,1),ot.normalize();let ee=Math.max(Ye*.6,.3),Me=ie.clone().add(ot.multiplyScalar(ee));De.setPosition(Me.x,Me.y,Me.z,!0),se.anchorNodeName&&se.anchorLocalPosition&&(p.current=Me.clone().sub(ie))}De.setTarget(ie.x,ie.y,ie.z,!0),G.current&&Go(De,G.current)}O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{De.smoothTime=oe,O.current=null},800),X(se)},[X]),ae=Mn(()=>{re.length!==0&&(l.current&&(G.current=Uo(l.current)),h.startTour(re.length),y(!0),P(0),H(re[0]))},[re,H,h]),xe=Mn(()=>{if(re.length===0||C<0)return;T(!0);let se=(C-1+re.length)%re.length;P(se),H(re[se]),setTimeout(()=>T(!1),500)},[C,re,H]),Ie=Mn(()=>{if(re.length===0||C<0)return;if(C===re.length-1){if(h.completeTour(),y(!1),P(-1),X(null),l.current&&c.current){let De=c.current;as(l.current,{...G.current,...De}),G.current=null}return}T(!0);let se=C+1;P(se),H(re[se]),setTimeout(()=>T(!1),500)},[C,re,H,X,h]),q=Mn(()=>{if(h.stopTour(),y(!1),P(-1),X(null),l.current&&c.current){let se=c.current;as(l.current,{...G.current,...se}),G.current=null}},[X,h]);_a(()=>{m.current.stopTour("annotations-changed"),G.current&&l.current&&(as(l.current,{...G.current,...c.current??{}}),G.current=null),p.current=null,P(-1),y(!1)},[Z]),_a(()=>()=>{O.current&&clearTimeout(O.current)},[]),_a(()=>{ne&&b&&G.current&&X(ne)},[ne,X,b]),_a(()=>{if(e===void 0)return;let se=e.map(De=>({...De,localPosition:De.localPosition??De.worldPosition}));f(se)},[e]);let be=Mn(()=>{if(o!==void 0){a?.(null);return}w(null)},[o,a]),Pe=o!==void 0?o:A?.annotation??null,pe=Ea(()=>Pe?D.find(De=>De.id===Pe.id)??null:null,[Pe,D]);_a(()=>{Pe&&!pe&&be()},[Pe,pe,be]);let ft=Mn(()=>{if(!g||!_.title.trim())return;R.current+=1;let De={id:R.current,worldPosition:g.worldPosition,localPosition:g.localPosition,worldNormal:g.worldNormal,anchorNodeName:g.anchor?.anchorNodeName,anchorLocalPosition:g.anchor?.anchorLocalPosition,title:_.title.trim(),description:_.description},He=[...S,De];f(He),s?.(He),x(null)},[g,_,S,s]),J=Mn(()=>x(null),[]),$e=Mn(se=>{Ip(se.cameraView)?H(se):X(se)},[X,H]);return{annotations:S,pendingAnnotation:g,setPendingAnnotation:x,annotationForm:_,setAnnotationForm:v,currentAnnotationIndex:C,isNavigating:E,localAnnotationCategories:j,selectedAnnotationCategories:N,visibleAnnotations:D,availableAnnotationCategories:k,annotationFiltersVisible:U,changeAnnotationCategories:te,sortedAnnotations:re,currentAnnotation:ne,setActiveAnnotation:X,focusAnnotation:H,startGuidedTour:ae,goToPreviousAnnotation:xe,goToNextAnnotation:Ie,stopGuidedTour:q,closeViewingAnnotation:be,activeAnnotation:Pe,activeViewingAnnotation:pe,isGuidedTourActive:b,handleAnnotationOk:ft,handleAnnotationCancel:J,handleAnnotationMarkerClick:$e}}import{useCallback as hd,useEffect as FC,useMemo as o2,useRef as a2}from"react";import{Vector3 as s2}from"three";var UC=()=>`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;function GC({currentObjectBindings:e,currentObjectBindingsRef:t,applyObjectBindings:r,nodeRefsMap:n,controlsRef:i,decalMove:o,decalDragging:a,setDecalDragging:s,setDecalError:l,setDecalControl:d,decalRequestRef:u,onTextureUpload:p,currentPanelObjectId:c,modelUrl:h}){let m=hd((v,R)=>{let A=t.current,w=A[v];if(!w)return;let C=R(w.decals??[]);r({...A,[v]:{...w,decals:C.length>0?C:void 0}})},[r,e]),b=o2(()=>{if(!a)return null;let{objectKey:v,decalId:R}=a,A=e[v],w=A?.decals?.find(C=>C.id===R);return w?{objectId:A.modelObjectId??v,decal:w,onCancel:()=>s(null),onCommit:C=>{m(v,P=>P.map(E=>E.id===R?{...E,...C}:E)),s(null)}}:null},[a,e,m]),y=o??b,S=hd((v,R)=>{u.current++;let A=t.current[v],w=n.current[A?.modelObjectId??v],C=px(w,i.current?.camera);if(!C)return l("Could not find a surface on this object for the decal."),!1;let P={...R,...C};return m(v,E=>[...E,P]),l(null),d(E=>E&&{...E,activeId:P.id}),s({objectKey:v,decalId:P.id}),!0},[m]),f=hd(v=>{let R=t.current[v],A=n.current[R?.modelObjectId??v]?.geometry;if(!A)return .2;A.boundingBox||A.computeBoundingBox();let w=A.boundingBox?.getSize(new s2),C=w?Math.max(w.x,w.y,w.z):0;return C>0&&Number.isFinite(C)?C/3:.2},[]),g=a2([]);FC(()=>()=>{for(let v of g.current)URL.revokeObjectURL(v)},[]);let x=hd(async(v,R,A)=>{let w=++u.current;s(null);let C;if(p){if(C=await p(A,v),w!==u.current)return}else C=URL.createObjectURL(A),g.current.push(C);S(R,{id:UC(),image:C,size:f(R)})},[f,p,S]);return FC(()=>{u.current++,l(null),s(null)},[c,h]),{editDecals:m,activeDecalMove:y,addCenteredDecal:S,decalSizeFor:f,startImageDecal:x,decalControlHandlers:(v,R)=>({onSelect:A=>{u.current++,l(null),s(null),d({...v,activeId:A})},onAddText:(A,w)=>S(R,{id:UC(),text:A,color:w,size:f(R)}),onAddImage:A=>{x(v.objectId,R,A)},onChange:(A,w)=>m(R,C=>C.map(P=>P.id===A?{...P,...w}:P)),onNudge:(A,w)=>{let C=t.current[R],P=C?.decals?.find(O=>O.id===A);if(!P)return;let E=n.current[C.modelObjectId??R],T=hx(E,i.current?.camera,P,w);if(!T){l("No visible surface in that direction. Try another arrow or rotate the view.");return}l(null),s(null),m(R,O=>O.map(j=>j.id===A?{...j,...T}:j))},onMove:A=>{u.current++,e[R]?.decals?.find(C=>C.id===A)&&(l(null),s(C=>C?.objectKey===R&&C.decalId===A?null:{objectKey:R,decalId:A}))},onRemove:A=>{s(null),m(R,w=>w.filter(C=>C.id!==A)),d({...v,activeId:null})},onClose:()=>{u.current++,l(null),s(null),d(null)}})}}import{useEffect as l2,useRef as HC}from"react";function WC({canvasAreaElement:e,controlsRef:t,enabled:r}){let n=HC(new Set),i=HC(null);l2(()=>{let o=e;if(!o||!r)return;let a=new Set(["w","a","s","d"," ","c"]),s=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),l=0,d=m=>m.code==="Space"?" ":m.key.toLowerCase(),u=()=>{n.current.clear(),l=0,i.current!==null&&(cancelAnimationFrame(i.current),i.current=null)},p=m=>{let b=t.current,y=n.current;if(!b||y.size===0){i.current=null,l=0;return}let S=l?Math.min((m-l)/1e3,.05):1/60;l=m;let f=Math.max(b.distance*.75,.01)*S;y.has("w")&&b.forward(f,!1),y.has("s")&&b.forward(-f,!1),y.has("a")&&b.truck(-f,0,!1),y.has("d")&&b.truck(f,0,!1),y.has(" ")&&b.truck(0,f,!1),y.has("c")&&b.truck(0,-f,!1),i.current=requestAnimationFrame(p)},c=m=>{if(m.target!==o){u();return}if(s.has(m.key)){let y=t.current;if(!y)return;m.preventDefault();let S=Math.PI/90,f=Math.max(y.distance*.05,.01);m.key==="ArrowUp"?m.shiftKey?y.forward(f,!0):y.rotate(0,-S,!0):m.key==="ArrowDown"?m.shiftKey?y.forward(-f,!0):y.rotate(0,S,!0):m.key==="ArrowLeft"?y.rotate(-S,0,!0):y.rotate(S,0,!0);return}let b=d(m);a.has(b)&&(m.preventDefault(),n.current.add(b),i.current===null&&(i.current=requestAnimationFrame(p)))},h=m=>{n.current.delete(d(m))};return o.addEventListener("keydown",c),o.addEventListener("keyup",h),o.addEventListener("blur",u),()=>{o.removeEventListener("keydown",c),o.removeEventListener("keyup",h),o.removeEventListener("blur",u),u()}},[e,t,r])}import{useCallback as Aa,useEffect as _f,useRef as Ra}from"react";var qC=1,c2=4,u2=.0015,d2=.1,p2=8;function XC({moveZoomTarget:e,setMoveZoomTarget:t,currentObjectBindingsRef:r,materialRefsOut:n,rendererCaptureRef:i,canvasAreaRef:o,canvasAreaElement:a,applyBindingStyle:s}){let l=Ra(null),d=Ra(!1),u=Ra([0,0]),p=Ra([0,0]),c=Ra(1),h=Ra(null),m=Aa((x,_)=>{let v=e;if(!v)return;let R=r.current[v.objectKey]?.style?.material?.[v.textureKey],A=R?.path;if(!A)return;let w=R?.rotation??0,C=Xr(v.textureKey),P=rc(A,C),E=n.current[v.objectKey],T=Array.isArray(E)?E:E?[E]:[],O=gc[v.textureKey];for(let j of T){let I=j;O in I&&(I[O]=nc(I.userData,v.textureKey,P,A,x,_,w))}i.current?.invalidate()},[e]),b=Aa(x=>{if(!e)return;x.currentTarget.setPointerCapture?.(x.pointerId),l.current={x:x.clientX,y:x.clientY},d.current=!1;let _=r.current[e.objectKey]?.style?.material?.[e.textureKey];if(u.current=_?.offset??[0,0],p.current=u.current,c.current=_?.scale??1,h.current===null){let v=()=>{i.current?.invalidate(),h.current=requestAnimationFrame(v)};h.current=requestAnimationFrame(v)}},[e]),y=Aa(x=>{if(!e||!l.current)return;let _=o.current,v=_?.clientWidth||1,R=_?.clientHeight||1,A=x.clientX-l.current.x,w=x.clientY-l.current.y;if(!d.current&&Math.hypot(A,w)<c2)return;d.current=!0;let C=-(A/v)*qC,P=w/R*qC,[E,T]=u.current,O=[E+C,T+P];p.current=O,m(O,c.current),s(e.objectKey,j=>({...j,material:{...j?.material,[e.textureKey]:{...j?.material?.[e.textureKey],path:r.current[e.objectKey]?.style?.material?.[e.textureKey]?.path,offset:O}}}))},[e,m,s]),S=Aa(x=>{if(!e)return;x.target?.releasePointerCapture?.(x.pointerId),h.current!==null&&(cancelAnimationFrame(h.current),h.current=null);let _=d.current,v=e;if(_){s(v.objectKey,R=>({...R,material:{...R?.material,[v.textureKey]:{...R?.material?.[v.textureKey],path:r.current[v.objectKey]?.style?.material?.[v.textureKey]?.path,offset:p.current}}})),l.current=null,d.current=!1;return}l.current=null,t(null)},[e,s]);_f(()=>{if(!e)return h.current!==null&&(cancelAnimationFrame(h.current),h.current=null),()=>{h.current!==null&&(cancelAnimationFrame(h.current),h.current=null)}},[e]),_f(()=>{let x=a;if(!(!x||!e))return x.addEventListener("pointermove",y),x.addEventListener("pointerup",S),x.addEventListener("pointercancel",S),()=>{x.removeEventListener("pointermove",y),x.removeEventListener("pointerup",S),x.removeEventListener("pointercancel",S)}},[a,e,y,S]);let f=Aa(x=>{if(!e)return;x.preventDefault();let _=e,v=Math.exp(-x.deltaY*u2),R=Math.min(p2,Math.max(d2,c.current*v));c.current=R,m(p.current,R),s(_.objectKey,A=>({...A,material:{...A?.material,[_.textureKey]:{...A?.material?.[_.textureKey],path:r.current[_.objectKey]?.style?.material?.[_.textureKey]?.path,scale:R}}}))},[e,m,s]);return _f(()=>{let x=a;if(!(!x||!e))return x.addEventListener("wheel",f,{passive:!1}),()=>x.removeEventListener("wheel",f)},[a,e,f]),{beginMoveZoom:Aa(x=>{d.current=!1,l.current=null,t(x)},[t]),handleMoveZoomPointerDown:b}}import{useFrame as m2,useThree as h2}from"@react-three/fiber";var f2=.2;function Ef({enabled:e,speed:t,controlsRef:r}){let n=h2(i=>i.invalidate);return m2((i,o)=>{!e||!r.current||(r.current.rotate(o*f2*t,0,!1),n())}),null}import{AlertTriangle as bl,RotateCcw as g2,X as $C}from"lucide-react";import{jsx as Nt,jsxs as Li}from"react/jsx-runtime";function YC({count:e,onDismiss:t}){let r=ue();return Li("div",{className:"ri-bindingsMismatchBanner",children:[Nt(bl,{size:14,className:"ri-bindingsMismatchBanner__icon"}),Nt("span",{children:r(e===1?"bindingMismatchOne":"bindingMismatchMany",{count:e})}),Nt("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:n=>{n.stopPropagation(),t()},"aria-label":r("dismiss"),children:Nt($C,{size:12})})]})}function KC({triangles:e,offset:t,onDismiss:r}){let n=ue();return Li("div",{className:`ri-largeModelBanner ${t?"ri-largeModelBanner--offset":""}`,children:[Nt(bl,{size:14,className:"ri-largeModelBanner__icon"}),Nt("span",{children:n("largeModelWarning",{millions:Math.round(e/1e6)})}),Nt("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:i=>{i.stopPropagation(),r()},"aria-label":n("dismiss"),children:Nt($C,{size:12})})]})}function QC({missing:e,total:t}){let r=ue();return Li("div",{className:"ri-uvCheckerBanner",role:"status",children:[Nt(bl,{size:14,className:"ri-uvCheckerBanner__icon"}),Li("span",{children:[e===t?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${e} of ${t} meshes have no UV0 coordinates.`," ",r("missingUVsAreShownInMagenta")]})]})}function JC({failure:e,source:t}){return Nt("div",{className:"ri-loadError",role:"alert",children:Li("div",{className:"ri-loadError__card",children:[Li("div",{className:"ri-loadError__header",children:[Nt(bl,{size:16,"aria-hidden":"true"}),Nt("span",{className:"ri-loadError__title",children:e.title})]}),Nt("p",{className:"ri-loadError__detail",children:e.detail}),Nt("p",{className:"ri-loadError__source",children:t}),e.technical&&Nt("p",{className:"ri-loadError__technical",children:e.technical})]})})}function ZC({rebuilding:e,onReload:t}){let r=ue();return Nt("div",{className:"ri-contextRecovery",role:"alert",children:Li("div",{className:"ri-contextRecovery__card",children:[Nt(bl,{size:24,"aria-hidden":"true"}),Nt("h2",{children:r(e?"contextRestoringTitle":"contextLostTitle")}),Nt("p",{children:r(e?"contextRestoringMessage":"contextLostMessage")}),Li("button",{type:"button",onClick:t,disabled:e,children:[Nt(g2,{size:16,"aria-hidden":"true"}),r("reloadViewer")]})]})})}import{useCallback as fd}from"react";function e1({applyBindingStyle:e,resolveObjectKey:t,onTextureUpload:r,fileInputRef:n,pendingObjectId:i,createdBlobUrls:o,texturePositioning:a,setMoveZoomTarget:s}){let l=fd((S,f)=>{let g=o.current[S];g&&URL.revokeObjectURL(g),f.startsWith("blob:")?o.current[S]=f:delete o.current[S],e(S,x=>({...x,material:{...x?.material,texture:{path:f}}}))},[e]),d=S=>{let f=S.target.files?.[0],g=i.current;if(!f||!g)return;let x=t(g);x&&(r?r(f,x).then(_=>l(x,_),_=>console.error("onTextureUpload failed:",_)):l(x,URL.createObjectURL(f)),S.target.value="")},u=S=>{i.current=S,n.current?.click()},p=S=>{let f=t(S);if(!f)return;e(f,x=>x?.material?.texture?{...x,material:{...x.material,texture:void 0}}:x);let g=o.current[f];g&&(URL.revokeObjectURL(g),delete o.current[f])},c=!!a,h=typeof a=="object"?a:void 0,m=fd((S,f,g)=>{if(h?.onOffsetChange){h.onOffsetChange(S,f,g);return}e(S,x=>{let _=x?.material?.texture;if(!_?.path)return x;let v=_.offset??[0,0],R=[v[0],v[1]];return R[f]=g,{...x,material:{...x?.material,texture:{..._,offset:R}}}})},[e,h]),b=fd((S,f)=>{if(h?.onRotationChange){h.onRotationChange(S,f);return}e(S,g=>{let x=g?.material?.texture;if(!x?.path)return g;let _=(f%360+360)%360;return{...g,material:{...g?.material,texture:{...x,rotation:_*Math.PI/180}}}})},[e,h]),y=fd(()=>{s(null),h?.onEndPositioning?.()},[h]);return{handleFileChange:d,triggerFileUpload:u,clearTexture:p,texturePositioningEnabled:c,texturePositioningOverrides:h,setMaterialTextureOffset:m,setMaterialTextureRotation:b,endMaterialTexturePositioning:y}}function t1({materialPopup:e,resolveObjectKey:t,currentObjectBindings:r,nodeRefsMap:n,moveZoomTarget:i,texturePositioningEnabled:o,texturePositioningOverrides:a,setMaterialTextureOffset:s,setMaterialTextureRotation:l,endMaterialTexturePositioning:d}){let u=e?t(e.objectId):null,p=u?r[u]?.style?.material?.texture?.path:void 0,c=p?tc(p)??p:void 0,h=ay(u?n.current[u]:null),m=o?a?.offset??(u?r[u]?.style?.material?.texture?.offset:void 0):void 0,b=o?a?.rotationDegrees??(u?((r[u]?.style?.material?.texture?.rotation??0)*180/Math.PI%360+360)%360:0):0,y=o?a?.isPositioning??!!(u&&i?.objectKey===u&&i?.textureKey==="texture"):!1;return{materialTextureUrl:c,materialTargetTakesImage:h,materialTextureOffset:m,materialTextureRotationDegrees:b,isMaterialTexturePositioning:y,materialTextureOnOffsetChange:o?s:void 0,materialTextureOnRotationChange:o?l:void 0,materialTextureOnEndPositioning:o?d:void 0}}import{useId as r1}from"react";import{Box as Af,Camera as b2,ChevronLeft as v2,ChevronRight as y2,Download as x2,FileImage as w2,Maximize as M2,Minimize as S2,Orbit as C2,Play as n1,Square as P2}from"lucide-react";import{Fragment as ka,jsx as Ce,jsxs as ut}from"react/jsx-runtime";function i1({categories:e,selected:t,disabled:r,onChange:n}){let i=ue();return ut("div",{className:"ri-annotationFilters",role:"group","aria-label":i("annotationCategories"),onPointerDown:o=>o.stopPropagation(),children:[Ce("span",{children:i("annotations")}),Ce("button",{type:"button","aria-pressed":t===null,disabled:r,onClick:()=>n(null),children:i("all")}),e.map(o=>Ce("button",{type:"button",disabled:r,"aria-pressed":t?.some(a=>a.trim()===o)??!1,onClick:()=>n(t===null?[o]:t.some(a=>a.trim()===o)?t.filter(a=>a.trim()!==o):[...t,o]),children:o||i("uncategorized")},o))]})}function o1({onCancel:e}){let t=ue();return ut("div",{className:"ri-isolationPill",role:"status",onPointerDown:r=>r.stopPropagation(),children:[Ce("span",{className:"ri-isolationPill__label",children:t("decalDragHint")}),Ce("button",{type:"button",className:"ri-isolationPill__button",onClick:e,children:t("cancel")})]})}function a1({label:e,onShowAll:t}){let r=ue();return ut("div",{className:"ri-isolationPill",onPointerDown:n=>n.stopPropagation(),children:[Ce("span",{className:"ri-isolationPill__label",children:e}),Ce("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:r("showAll")})]})}function s1({groups:e,activeVariants:t,onSelect:r}){let n=ue();return Ce(ka,{children:e.map((i,o)=>ut("div",{className:"ri-variantPicker",role:"group","aria-label":i.name??n("materialVariants"),onPointerDown:a=>a.stopPropagation(),children:[i.name?Ce("span",{className:"ri-variantPicker__group","aria-hidden":"true",children:i.name}):null,i.variants.map(a=>{let s=t.includes(a.name);return ut("button",{type:"button",className:`ri-variantPicker__option ${s?"ri-variantPicker__option--active":""}`,"aria-pressed":s,onClick:()=>r(a.name),children:[a.swatch?Ce("span",{className:"ri-variantPicker__swatch",style:{background:a.swatch},"aria-hidden":"true"}):null,a.label]},a.name)})]},i.name??`group-${o}`))})}function l1({count:e,active:t,index:r,navigating:n,onStart:i,onPrevious:o,onNext:a,onStop:s}){let l=ue();return t?ut(ka,{children:[ut("button",{className:"ri-tourButton",onClick:o,disabled:n||e===0||r<=0,title:l("previousAnnotation"),children:[Ce(v2,{size:16}),Ce("span",{children:l("previous")})]}),Ce("button",{className:"ri-tourButton ri-tourButton--stop",onClick:s,title:l("stopGuidedTour"),children:Ce(P2,{size:16})}),ut("button",{className:"ri-tourButton ri-tourButton--next",onClick:a,disabled:n||e===0,title:l("nextAnnotation"),children:[Ce("span",{children:l("next")}),Ce(y2,{size:16})]})]}):Ce("button",{className:"ri-navButtonSingle",onClick:i,disabled:e===0,title:l("startGuidedTour"),children:l("guidedTour")})}function c1({fullscreen:e,disabled:t}){let r=ue();return ut("div",{className:"mv-fullscreenWrapper",children:[e.error&&Ce("div",{className:"mv-fullscreenError",role:"alert",children:r.message(e.error)}),Ce("button",{type:"button",className:"mv-fullscreenButton",onClick:()=>{e.toggle()},disabled:e.pending||t,title:e.active?r("exitFullscreen"):r("enterFullscreen"),"aria-label":e.active?r("exitFullscreen"):r("enterFullscreen"),"aria-pressed":e.active,children:e.active?Ce(S2,{}):Ce(M2,{})})]})}function u1({open:e,current:t,disabled:r,onSelect:n,onToggle:i}){let o=ue();return ut("div",{className:"mv-controllersWrapper",onPointerDown:a=>a.stopPropagation(),children:[e&&ut("div",{className:"mv-controllersMenu",children:[Ce("button",{type:"button",className:`mv-controllersMenuItem ${t==="orbit"?"mv-controllersMenuItem--active":""}`,onClick:()=>n("orbit"),children:o("orbitControl")}),Ce("button",{type:"button",className:`mv-controllersMenuItem ${t==="pointerLock"?"mv-controllersMenuItem--active":""}`,onClick:()=>n("pointerLock"),children:o("pointLock")})]}),Ce("button",{className:"mv-controllersButton",onClick:i,title:o("cameraController"),"aria-label":o("cameraControllerSettings"),disabled:r,children:Ce(C2,{size:15})})]})}function d1({menu:e,recording:t,hasScene:r,canCaptureImage:n,canRecord:i,hasCinematic:o,hasMultipleModels:a=!1}){let s=ue(),l=r1(),d=r1(),{isDownloading:u,downloadMenuOpen:p,uvExportError:c,toggleDownloadMenu:h,handleDownloadMesh:m,handleDownloadSeparateMeshes:b,handleDownloadScreenshot:y,handleDownloadUvLayout:S,handleDownloadVideo:f,videoFormat:g,setVideoFormat:x,videoExportError:_}=e;return ut("div",{className:"mv-downloadWrapper",onPointerDown:v=>v.stopPropagation(),children:[p&&ut("div",{className:"mv-downloadMenu",children:[ut("button",{className:"mv-downloadMenuItem",onClick:m,disabled:u||t||!r,"aria-describedby":l,children:[Ce(Af,{size:14}),s(a?"downloadCombinedGLB":"downloadGLB")]}),Ce("p",{className:"mv-downloadMenuDescription",id:l,children:s("downloadGLBDescription")}),e.openConfiguredAR&&ut("button",{type:"button",className:"mv-downloadMenuItem",onClick:e.openConfiguredAR,disabled:t||!r,"aria-haspopup":"dialog",children:[Ce(Af,{size:14}),s("arConfiguredButton")]}),a&&ut(ka,{children:[ut("button",{className:"mv-downloadMenuItem",onClick:b,disabled:u||t||!r,"aria-describedby":d,children:[Ce(Af,{size:14}),s("downloadSeparateGLBs")]}),Ce("p",{className:"mv-downloadMenuDescription",id:d,children:s("downloadSeparateGLBsDescription")})]}),Ce("div",{className:"mv-downloadMenuDivider"}),n&&ut(ka,{children:[ut("button",{className:"mv-downloadMenuItem",onClick:y,disabled:t||!r,children:[Ce(b2,{size:14}),s("downloadPNG")]}),Ce("div",{className:"mv-downloadMenuDivider"})]}),ut("button",{className:"mv-downloadMenuItem",onClick:S,disabled:t||!r,children:[Ce(w2,{size:14}),s("downloadUVLayout")]}),Ce("div",{className:"mv-downloadMenuDivider"}),ut("label",{className:"mv-downloadMenuItem",children:[s("videoFormat"),ut("select",{"aria-label":s("videoFormat"),value:g,onChange:v=>x(v.target.value),children:[Ce("option",{value:"auto",children:s("auto")}),Ce("option",{value:"webm",disabled:!Nn("webm"),children:"WebM"}),Ce("option",{value:"mp4",disabled:!Nn("mp4"),children:"MP4"}),Ce("option",{value:"gif",disabled:!Nn("gif"),children:"GIF"})]})]}),ut("button",{className:"mv-downloadMenuItem",onClick:()=>{f("turntable")},disabled:t||!i||!Nn(g),children:[Ce(n1,{size:14}),s("recordTurntableVideo")]}),o&&ut("button",{className:"mv-downloadMenuItem",onClick:()=>{f("cinematic")},disabled:t||!i||!Nn(g),children:[Ce(n1,{size:14}),s("recordCinematicVideo")]}),!Nn()&&!Nn("gif")&&Ce("div",{className:"mv-downloadMenuNotice",role:"status",children:s("videoUnsupported")}),_&&Ce("div",{className:"mv-downloadMenuNotice",role:"alert",children:s.message(_)}),c&&Ce("div",{className:"mv-downloadMenuNotice",role:"status","aria-live":"polite",children:s.message(c)})]}),Ce("button",{className:"mv-downloadButton",onClick:h,disabled:u||t||!r,title:s("downloadOptions"),children:u?ut(ka,{children:[Ce("span",{className:"mv-downloadButton__spinner"}),s("exporting")]}):ut(ka,{children:[Ce(x2,{size:15}),s("download")]})})]})}function p1({x:e,y:t,form:r,setForm:n,onOk:i,onCancel:o}){let a=ue();return ut("div",{className:"ri-annotationPopup",style:{left:e,top:t},onPointerDown:s=>s.stopPropagation(),onClick:s=>s.stopPropagation(),children:[Ce("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:a("annotationTitlePlaceholder"),value:r.title,onChange:s=>n(l=>({...l,title:s.target.value})),onKeyDown:s=>{s.key==="Enter"&&i(),s.key==="Escape"&&o()}}),Ce("textarea",{className:"ri-annotationTextarea",placeholder:a("description"),value:r.description,onChange:s=>n(l=>({...l,description:s.target.value})),onKeyDown:s=>{s.key==="Escape"&&o()},rows:5}),ut("div",{className:"ri-annotationActions",children:[Ce("button",{onClick:i,className:`ri-annotationOkBtn ${r.title.trim()?"":"disabled"}`,disabled:!r.title.trim(),children:a("ok")}),Ce("button",{onClick:o,className:"ri-annotationCancelBtn",children:a("cancel")}),Ce("div",{className:"ri-annotationIcons"})]})]})}import{useEffect as T2,useState as m1}from"react";import{Fragment as gd,jsx as ht,jsxs as dt}from"react/jsx-runtime";function h1({section:e,onChange:t}){let{isInsideEditor:r,tier:n}=hi(),i=r&&!Mc(n,"sectionPlanes"),[o,a]=m1(""),s=e.mode??"plane",l=e.planes??[],d=l.find(m=>m.id===e.activePlaneId)??l[0],u=s==="planes"?d:e,p=m=>t(s==="planes"?{planes:l.map(b=>b.id===d?.id?{...b,...m}:b)}:m),c={x:0,y:1,z:2},h=()=>globalThis.crypto?.randomUUID?.()??`section-${Date.now()}-${Math.random().toString(36).slice(2)}`;return dt("div",{className:"ri-sectionControls",children:[i?ht(Ly,{requiredTier:"starter",feature:"Multiple planes and section boxes"}):null,dt("label",{children:["Cut type",dt("select",{value:s,disabled:i,onChange:m=>{let b=m.target.value;t({mode:b,...b==="planes"&&!l.length?{planes:[{id:"cut-1",name:"Plane 1",axis:e.axis,position:e.position,flip:e.flip,enabled:!0,...e.normal?{normal:e.normal}:{}}],activePlaneId:"cut-1"}:{}})},children:[ht("option",{value:"plane",children:"Single plane"}),ht("option",{value:"planes",children:"Multiple planes"}),ht("option",{value:"box",children:"Section box"})]})]}),s==="planes"&&dt(gd,{children:[dt("label",{children:["Active plane",ht("select",{value:d?.id??"",onChange:m=>t({activePlaneId:m.target.value}),children:l.map(m=>dt("option",{value:m.id,children:[m.name,m.enabled?"":" (off)"]},m.id))})]}),dt("div",{className:"ri-sectionControls__actions",children:[ht("button",{type:"button",disabled:l.length>=6,onClick:()=>{let m=h();t({planes:[...l,{id:m,name:`Plane ${l.length+1}`,axis:"x",position:.5,flip:!1,enabled:!0}],activePlaneId:m})},children:"Add plane"}),ht("button",{type:"button",disabled:!d,onClick:()=>t({planes:l.filter(m=>m.id!==d?.id),activePlaneId:l.find(m=>m.id!==d?.id)?.id}),children:"Remove plane"})]}),d&&dt(gd,{children:[dt("label",{children:["Name",ht("input",{value:d.name,maxLength:200,onChange:m=>p({name:m.target.value.trim()||"Plane"})})]}),dt("label",{className:"ri-sectionControls__check",children:[ht("input",{type:"checkbox",checked:d.enabled,onChange:m=>p({enabled:m.target.checked})}),"Enable this plane"]})]})]}),s==="box"?dt(gd,{children:[dt("label",{children:["Draggable face",ht("select",{value:e.activePlaneId?.match(/^[xyz]-(min|max)$/)?e.activePlaneId:"x-min",onChange:m=>t({activePlaneId:m.target.value}),children:["x","y","z"].flatMap(m=>["min","max"].map(b=>dt("option",{value:`${m}-${b}`,children:[m.toUpperCase()," ",b]},`${m}-${b}`)))})]}),ht("div",{className:"ri-sectionControls__bounds",children:["x","y","z"].flatMap(m=>["min","max"].map(b=>{let y=(e.box??{min:[0,0,0],max:[1,1,1]})[b][c[m]];return dt("label",{children:[m.toUpperCase()," ",b,dt("output",{children:[Math.round(y*100),"%"]}),ht("input",{"aria-label":`${m.toUpperCase()} ${b}`,type:"range",min:"0",max:"1",step:".001",value:y,onChange:S=>t(nd(e,`${m}-${b}`,Number(S.target.value)))})]},m+b)}))}),dt("label",{className:"ri-sectionControls__check",children:[ht("input",{type:"checkbox",checked:!!e.invertBox,onChange:m=>t({invertBox:m.target.checked})}),"Keep outside box"]})]}):u&&dt(gd,{children:[dt("label",{children:["Orientation",dt("select",{value:u.normal?"custom":u.axis,onChange:m=>m.target.value==="custom"?p({normal:[1,1,0]}):p({axis:m.target.value,normal:void 0}),children:[ht("option",{value:"x",children:"X"}),ht("option",{value:"y",children:"Y"}),ht("option",{value:"z",children:"Z"}),ht("option",{value:"custom",children:"Angled plane"})]})]}),u.normal&&ht("div",{className:"ri-sectionControls__vector",children:[0,1,2].map(m=>dt("label",{children:["Normal ","XYZ"[m],ht(_2,{label:`Normal ${"XYZ"[m]}`,value:u.normal[m],onChange:b=>{let y=[...u.normal];y[m]=b,Math.hypot(...y)>1e-8&&p({normal:y})}})]},m))}),dt("label",{children:["Position",dt("output",{children:[Math.round(u.position*100),"%"]}),ht("input",{type:"range",min:"0",max:"1",step:".001","aria-label":"Section position",value:u.position,onChange:m=>p({position:Number(m.target.value)})})]}),dt("label",{className:"ri-sectionControls__check",children:[ht("input",{type:"checkbox",checked:u.flip,onChange:m=>p({flip:m.target.checked})}),"Keep the other side"]})]}),dt("details",{children:[dt("summary",{children:["Saved section presets (",e.presets?.length??0,")"]}),dt("form",{onSubmit:m=>{m.preventDefault();let b=o.trim();!b||(e.presets?.length??0)>=32||(t({presets:[...e.presets??[],{id:h(),name:b,settings:Bp(e)}]}),a(""))},children:[dt("label",{children:["Preset name",ht("input",{value:o,maxLength:200,onChange:m=>a(m.target.value)})]}),ht("button",{disabled:!o.trim()||(e.presets?.length??0)>=32,children:"Save current section"})]}),e.presets?.map(m=>dt("div",{className:"ri-sectionControls__actions",children:[ht("button",{type:"button",onClick:()=>t({...Bp(m.settings),normal:m.settings.normal,planes:m.settings.planes,activePlaneId:m.settings.activePlaneId,box:m.settings.box,invertBox:m.settings.invertBox,mode:m.settings.mode}),children:m.name}),ht("button",{type:"button","aria-label":`Delete preset ${m.name}`,onClick:()=>t({presets:e.presets?.filter(b=>b.id!==m.id)}),children:"Delete"})]},m.id))]}),ht("p",{children:"Visual cuts of the active asset. Multiple planes keep their common region. Presets are saved with your scene."})]})}function _2({label:e,value:t,onChange:r}){let[n,i]=m1(String(t));return T2(()=>i(String(t)),[t]),ht("input",{type:"number",step:".1","aria-label":e,value:n,onChange:o=>{let a=o.target.value;i(a),a.trim()&&Number.isFinite(Number(a))&&r(Number(a))},onBlur:()=>i(String(t))})}import{useState as E2}from"react";import{QRCodeSVG as A2}from"qrcode.react";import{Box as R2,ChevronDown as k2,Expand as D2,Grid3X3 as O2,Pause as L2,Play as I2,QrCode as B2,RectangleGoggles as N2,Slice as j2,Smartphone as f1,Square as z2,X as V2}from"lucide-react";import{jsx as Fe,jsxs as Sn}from"react/jsx-runtime";function g1({top:e,configuredHandoff:t=!1,xrStore:r,arSupported:n,vrSupported:i,quickLookSupported:o,mobileHandoffUrl:a,mobileHandoffOpen:s,onQuickLook:l,onOpenMobileHandoff:d}){let u=ue();return Sn("div",{className:"ri-xrTools",style:{top:`${e}px`},children:[!n&&o&&Sn("button",{type:"button",className:"ri-xrButton",onClick:l,title:u("viewThisModelInARWithAppleQuickLook"),children:[Fe(R2,{size:16}),u("viewInAR")]}),(a||t&&!o)&&Sn("button",{type:"button",className:"ri-xrButton",onClick:d,title:u(t?"arConfiguredTitle":"openThisExperienceOnAPhoneForAR"),"aria-haspopup":"dialog","aria-expanded":s,children:[Fe(B2,{size:16}),Fe("span",{children:u(t?"arConfiguredButton":"openOnPhone")})]}),r&&n&&Sn("button",{type:"button",className:"ri-xrButton",onClick:()=>r.enterAR().catch(p=>{console.error("Failed to enter AR session:",p)}),title:u("viewThisModelInYourSpace"),children:[Fe(f1,{size:16}),Fe("span",{children:u("enterAR")})]}),r&&i&&Sn("button",{type:"button",className:"ri-xrButton",onClick:()=>r.enterVR().catch(p=>{console.error("Failed to enter VR session:",p)}),title:u("viewThisModelInVR"),children:[Fe(N2,{size:16}),Fe("span",{children:u("enterVR")})]})]})}function b1({url:e,onClose:t}){let r=ue();return Fe("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:n=>{n.target===n.currentTarget&&t()},children:Sn("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[Fe("button",{type:"button",className:"ri-mobileHandoffClose",onClick:t,"aria-label":r("closePhoneHandoff"),children:Fe(V2,{size:18})}),Fe(f1,{size:22,"aria-hidden":"true"}),Fe("h2",{id:"ri-mobileHandoffTitle",children:r("viewInAR")}),Fe("p",{children:r("arScanCode")}),Fe("div",{className:"ri-mobileHandoffQr",children:Fe(A2,{value:e,size:208,level:"M",marginSize:4,title:r("qrCodeToOpenThisModelOnAPhone")})})]})})}function v1({top:e,active:t,onToggle:r}){let n=ue();return Fe("div",{className:"ri-uvCheckerTools",style:{top:`${e}px`},children:Fe("button",{type:"button",className:`ri-measureButton ${t?"ri-measureButton--active":""}`,onClick:r,title:n(t?"disableUVChecker":"enableUVChecker"),"aria-label":n(t?"disableUVChecker":"enableUVChecker"),"aria-pressed":t,children:Fe(O2,{size:16})})})}function y1({top:e,open:t,factor:r,onToggleOpen:n,onFactorChange:i}){let o=ue();return Sn("div",{className:"ri-explodeTools",style:{top:`${e}px`},children:[Fe("button",{type:"button",className:`ri-measureButton ${t||r>0?"ri-measureButton--active":""}`,onClick:n,title:o("explodedView"),"aria-pressed":t,children:Fe(D2,{size:16})}),t&&Fe("div",{className:"ri-explodeSlider",onPointerDown:a=>a.stopPropagation(),children:Fe("input",{type:"range",min:0,max:100,value:Math.round(r*100),onChange:a=>i(Number(a.target.value)/100),"aria-label":o("explodeAmount")})})]})}function x1({top:e,section:t,onChange:r}){let n=ue(),[i,o]=E2(!1);return Sn("div",{className:"ri-sectionTools",style:{top:`${e}px`},children:[Fe("button",{type:"button",className:`ri-measureButton ${t.enabled?"ri-measureButton--active":""}`,onClick:()=>r({enabled:!t.enabled}),title:t.enabled?n("removeSectionCut"):n("sectionCut"),"aria-label":n("sectionCut"),"aria-pressed":t.enabled,children:Fe(j2,{size:16})}),t.enabled&&Fe("button",{type:"button",className:"ri-measureButton","aria-label":"Section settings",title:"Section settings","aria-expanded":i,onClick:()=>o(a=>!a),children:Fe(k2,{size:14})}),t.enabled&&i&&Fe("div",{className:"ri-sectionPanel",onPointerDown:a=>a.stopPropagation(),children:Fe(h1,{section:t,onChange:r})})]})}function w1({top:e,playing:t,disabled:r,onPlay:n,onPause:i,onStop:o}){let a=ue();return Sn("div",{className:"ri-cinematicTools",style:{top:`${e}px`},children:[Fe("button",{type:"button",className:`ri-measureButton ${t?"ri-measureButton--active":""}`,disabled:r,onClick:t?i:n,title:a(t?"pauseCinematic":"playCinematic"),"aria-pressed":t,children:t?Fe(L2,{size:16}):Fe(I2,{size:16})}),t&&Fe("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:o,title:a("stopCinematicAndResetCamera"),children:Fe(z2,{size:16})})]})}function M1({progress:e,onCancel:t}){let r=ue();return Fe("div",{className:"ri-recordingOverlay",onPointerDown:n=>n.stopPropagation(),children:Sn("div",{className:"ri-isolationPill",role:"status","aria-live":"polite",children:[Fe("span",{className:"ri-isolationPill__label",children:r("recordingVideo",{progress:e})}),Fe("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:r("cancel")})]})})}function S1(e){let t={total:0,missing:0};return e.traverse(r=>{let n=r;!n.isMesh||!n.geometry||(t.total+=1,n.geometry.getAttribute("uv")||(t.missing+=1))}),t}import{useEffect as F2}from"react";function C1({enabled:e,canvasAreaElement:t,fitAttemptedRef:r,fitInFlightRef:n,controlsRef:i,cameraFramingRef:o,nodeRefsMap:a,fitScene:s}){F2(()=>{if(!e)return;let l=t;if(!l)return;let d=null,u=new ResizeObserver(()=>{!r.current||n.current||(d&&clearTimeout(d),d=setTimeout(()=>{let p=i.current,c=o.current;if(c.kind==="view"&&p){if(xx(p,c.target))return}else if(c.kind==="object"&&p){let h=a.current[c.key];if(h&&yx(p,h)){p.fitToBox(h,!0,Dc).catch(()=>{});return}}s()},150))});return u.observe(l),()=>{u.disconnect(),d&&clearTimeout(d)}},[t,s,e])}import{Fragment as kf,jsx as Y,jsxs as Br}from"react/jsx-runtime";function bd(e){let r=e.split(/[?#]/)[0].split("/");return(r[r.length-1]||e).replace(/\.[^./]+$/,"")||e}var $2=Object.freeze({}),Y2=[],K2={};function Q2(e){let t=Lx(Wy(e)),r=t.props,n=Uc(r.activeModelId??Be(r.models?.find(y=>y.url===r.modelUrl)??{url:r.modelUrl}),r.tilesetUrl),i=ge(n);i.current=n;let o=ge(null),a=ge(null),s=ye(()=>{let y=a.current;y&&(o.current=y.snapshot())},[]),l=nw(s),d=aw(e),[u,p]=Ee(null);Ge(()=>()=>{u&&URL.revokeObjectURL(u)},[u]);let c=()=>{s();let y=i.current;a.current?.captureFrame().then(S=>{S&&(y===i.current?p(S):URL.revokeObjectURL(S))})};Ln(()=>{o.current=null,p(null)},[n]);let h=ge(null),m=ny({loading:r.loading,reveal:r.reveal,rootRef:h,onPark:c}),{release:b}=l;return Ge(()=>{m.live||b()},[m.live,b]),Y(nv,{labels:e.labels,children:Br("div",{className:"ri-viewerSlot",ref:h,children:[t.error&&Y("div",{className:"ri-configuredARError",role:"alert",children:t.error}),m.live?Y(Z2,{...r,contextRecovery:l,engagement:d,resumeRef:o,viewerHandleRef:a,offscreen:!m.visible,frame:u},l.generation):Y(iy,{className:"ri-viewer",background:tm(r.backgroundColor,r.sceneConfig),poster:u??r.poster,onReveal:m.awaitingReveal?m.reveal:void 0})]})})}var J2={};function Z2({labels:e,contextRecovery:t,engagement:r,modelUrl:n,tilesetUrl:i,tilesErrorTarget:o=8,tilesCacheSize:a=800,onObjectCatalog:s,modelFormat:l,licenseKey:d,licenseValidationUrl:u,hideLicenseCheckingOverlay:p=!1,objectBindings:c="auto",selectedObject:h,comparisonHighlights:m,multiSelectedKeys:b,selectedObjectRefs:y,selectedObjectOutlineColor:S,panelHoveredObject:f,onObjectBindingsChange:g,onObjectSelect:x,onObjectHover:_,onObjectDoubleClick:v,onDecalDoubleClick:R,onObjectContextMenu:A,decalMove:w,onObjectEditLeaseChange:C,onSelectionClear:P,onSceneLoaded:E,onModelLoaded:T,onAssetDiagnostics:O,onRuntimeStats:j,runtimeStatsIntervalMs:I,onLoadError:N,onProgress:D,onCameraControllerChange:k,cameraControllerType:U,onAction:te,onHiddenObjectsChange:re,onCameraChange:Z,onViewerReady:ne,onTextureUpload:X,onAnimationsReady:G,onSequencesReady:H,showSequenceControls:ae=!0,sequenceAutoPlay:xe=!0,onModelAnimationsReady:Ie,onAnnotationsChange:q,activeAnnotation:be,onActiveAnnotationChange:Pe,camera:pe,cameraLimits:ft,backgroundColor:J,shadows:$e=!0,showObjectBindingDataPanel:se=!0,customObjectBindingDataPanel:De,customSceneObjectsPanel:He,showSceneObjectsPanel:ie=!0,showDownloadButton:Ue=!0,downloadFilename:oe="model",showResetButton:K=!0,showFullscreenButton:Ae=!1,showLoadingOverlay:we=!0,showMouseController:qe=!1,mouseControllerPosition:Ye="center-bottom",mouseControllerOpacity:ot=1,moveSensitivity:ee=.08,zoomSensitivity:Me=1,sceneConfig:Se,onSceneConfigChange:je,disableZoom:at=!1,zoomOnSelected:Le=!0,highlightOnHover:Te=!0,enableCameraControls:me=!0,onAutoFit:We,refitOnResize:_t=!0,renderMode:nr="demand",maxDpr:ir=2,preserveDrawingBuffer:Zr=!1,webgpu:Pr=!1,performanceProfile:en="auto",dracoDecoderPath:$t,ktx2TranscoderPath:Nr,meshopt:tn=!0,showMeasureTools:St=!1,showUvCheckerButton:Rt=!1,showExplodeControls:Cn=!1,showMaterialVariants:yl=!0,showObjectNavigator:Pn=!0,showSectionTools:Ii=!1,isolation:Bi,onIsolationChange:Jn,showIsolateControls:To=!1,cinematic:jr,measurementUnit:Zn="m",measurements:Da,onMeasurementsChange:Ni,measurementSettings:xl,measurementModelId:Md,onMeasurementSettingsChange:ji,enableXR:_o=!1,usdzUrl:B,arScaleMode:z="normalized",mobileHandoffUrl:V,arHandoff:$,showAnnotationNavigation:W=!0,showAnnotationOnHover:le=!1,showAnnotationFilters:he=!0,annotationCategories:gt,onAnnotationCategoriesChange:Je,moveModeEnabled:st=!1,scaleModeEnabled:Ze=!1,gizmoTool:pt,showFloorGrid:Yt=!1,productOptions:_e,objectTransformSpace:kt="world",enableKeyboardNavigation:Ft=!1,reducedMotion:Tr="user",showViewGizmo:Oa=!1,overlay:or,unsafe_sceneChildren:Kt,autoRotate:La,autoRotateSpeed:k1,onTexturePositioningChange:Sd,endTexturePositioningRef:wl,texturePositioning:Lf,extraModelUrls:D1,onExtraModelError:If,onExtraModelLoaded:Ml,originalNodePoses:O1,models:nt,mergeModels:Cd,onMergeModelLoaded:Bf,onMergeModelError:Nf,poster:jf,resumeRef:zf,viewerHandleRef:Pd,offscreen:L1,frame:Vf,onModelChange:Ff,activeModelId:I1,onActiveModelChange:Td}){let Qt=ue(),Re=I1??Be(nt?.find(M=>M.url===n)??{url:n}),Uf=nt?.find(M=>Be(M)===Re)?.visible!==!1,zr=Uc(Re,i),[jt]=Ee(()=>zf.current?.model===zr?zf.current:null),ei=Ay(Tr);Ge(()=>()=>r.interrupt(),[r]);let Gf=ge(r);Gf.current=r;let{autoBindings:_d,controlled:Hf,currentBindings:Oe,applyBindings:Vr,bindingsForModel:zi,modelEdits:B1}=Hx({modelUrl:n,activeModelId:Re,tilesetUrl:i,models:nt,objectBindings:c,onChange:g,initialBindings:jt?.objectBindings,initialModelEdits:jt?.modelBindingEdits}),{isInsideEditor:_r,activeTab:N1,activeSubTab:j1,annotating:Sl,openMeasurementsPanel:z1,xrToolsTarget:Wf}=hi(),V1=_r&&N1==="scene"&&j1==="lighting",Cl=ux(d,u),[Ed,F1]=Ee(()=>jt?.lightEdits??{}),[Pl,qf]=Ee(jt?.variantEdit),[Tl,Xf]=Ee(jt?.sectionEdit),[_l,$f]=Ee(()=>jt?.measurementEdits??{}),Ad=JSON.stringify(Se?.measurements??null),Yf=ge(new Map);Ge(()=>{let M=Yf.current.get(zr);Yf.current.set(zr,Ad),M!==void 0&&M!==Ad&&$f(L=>{let F={...L};return delete F[zr],F})},[zr,Ad]);let Ne=Mt(()=>{let M=gm(Se??ac,Ed);return Pl!==void 0&&(M={...M,model:jp(M.model,Pl)}),Tl!==void 0&&(M={...M,section:{...ss,...M.section,...Tl}}),_l[zr]&&(M={...M,measurements:_l[zr]}),M},[Se,Ed,Pl,Tl,_l,zr]),Eo=ge(Ne);Eo.current=Ne;let Ia=ye(M=>{let L=Eo.current,F={settings:{},items:[],...L.measurements,...M};je?je({...L,measurements:F}):$f(Q=>({...Q,[zr]:F}))},[zr,je]),Kf=ye(M=>{Ni?Ni(M):Ia({items:M})},[Ni,Ia]),Qf=ye(M=>{ji?ji(M):Ia({settings:M})},[ji,Ia]),El=Da??Ne.measurements?.items??Y2,Ba=xl??Ne.measurements?.settings??K2,Rd=Md??ls(Re),Na=uc(Ba,Zn),kd=Mt(()=>kn(Ne.model),[Ne.model]);Ge(()=>{r.setActiveVariants(kd)},[kd,r]);let U1=Se?kn(Se.model).join(`
79
+ `):"";Ln(()=>{qf(void 0)},[U1,Re,n]);let G1=JSON.stringify(Se?.section??null);Ln(()=>{Xf(void 0)},[G1,Re,n]);let Jf=ye(M=>{if(je){let L=Eo.current;je({...L,section:{...ss,...L.section,...M}});return}Xf(L=>({...L,...M}))},[je]),[Zf,H1]=Ee(!1),eg=ge([]),W1=ye(M=>{let L=Eo.current,F=kn(L.model),Q=eg.current,ve=Q.find(Qe=>Qe.variants.some(tt=>tt.name===M)),et=F.find(Qe=>ve?ve.variants.some(tt=>tt.name===Qe):Qe===M)??null,Xe=F.includes(M)?F.filter(Qe=>Qe!==M):Cv(F,M,Q);if(r.chooseVariant(Xe.includes(M)?M:null,et,ve?.name??null),je){je({...L,model:jp(L.model,Xe)});return}qf(Xe)},[je,r]),tg=ye(M=>{if(je){je(gm(Eo.current,M));return}F1(L=>{let F={...L};for(let[Q,ve]of Object.entries(M))F[Q]={...L[Q],...ve};return F})},[je]),[Dd,rg]=Ee(null),[Od,ng]=Ee(null),[ig,og]=Ee(null),ag=ge(0),[Ld,sg]=Ee(null),[lg,cg]=Ee(jt?.uvCheckerOverride??null),ja=Ne.model.renderer==="uv-checker",Id=Rt?lg??ja:ja,pr=Mt(()=>{let M=Id?"uv-checker":ja?"pbr":Ne.model.renderer;return M===Ne.model.renderer?Ne:{...Ne,model:{...Ne.model,renderer:M}}},[ja,Ne,Id]);Ln(()=>{cg(null)},[Re,n,Ne.model.renderer,Rt,i]);let ug=Mt(()=>tm(J,Ne),[J,Ne]),Al=Mt(()=>({dracoDecoderPath:$t,ktx2TranscoderPath:Nr,meshopt:tn}),[$t,Nr,tn]),q1=Mt(()=>Gv(en),[en]),ze=ge(null),[dg,X1]=Ee(()=>jt&&jt.cameraControllerType!=="pointerLock"?jt.cameraControllerType:"orbit"),[$1,pg]=Ee(!1),Vi=U!==void 0?U:dg,Rl=ye(M=>{pg(!1),M!==Vi&&(X1(M),k?.(M))},[Vi,k]),[za,mg]=Ee(!1),hg=ge({dragging:!1,endedAt:-1/0}),fg=ye(M=>{hg.current={dragging:M,endedAt:M?-1/0:performance.now()},mg(M)},[]),[ar,Va]=Ee(null),Fa=!!(Lf||Sd||wl),gg=ge(Sd);gg.current=Sd,Ge(()=>{gg.current?.(ar)},[ar]),Ge(()=>{if(wl)return wl.current=()=>Va(null),()=>{wl.current=null}},[]),Ge(()=>{ze.current&&(ze.current.dollySpeed=Math.max(Me,0))},[Me]),Ge(()=>{ze.current&&(ze.current.enabled=me&&!za&&!Zf&&!ar)},[me,za,Zf,ar]);let Bd=ge(null),Nd=ge(new Map),bg=ge(null),Y1=ge(null),Er=ge(null),vg=ge({});Ge(()=>()=>{for(let M of Object.values(vg.current))URL.revokeObjectURL(M)},[]);let Ut=ge({}),Ao=ge(bs),[K1,Q1]=Ee(0),jd=ye(()=>{Q1(M=>M+1)},[]),ti=ge({}),Dt=!!(nt&&nt.length>=1&&!i),kl=ge(nt);kl.current=nt;let Dl=ge(new Map),{scenesByUrlRef:Fi,cameraHomesByUrlRef:Fr,materialRefsByUrlRef:yg,getMaterialRefsForUrl:J1}=Fx(Dt,nt),Ol=ge(null),xg=ge(null),Ll=ew(Ae),Ur=ge(null),[zd,Z1]=Ee(null),eP=ye(M=>{Ur.current=M,Z1(M)},[]);WC({canvasAreaElement:zd,controlsRef:ze,enabled:Ft&&me&&!st&&!Ze});let Il=ge(null),[Ui,Bl]=Ee({}),[wg,Vd]=Ee(null),[Nl,Fd]=Ee(null),[tP,rP]=Ee(null),[nP,iP]=Ee(null),[Gr,Mg]=Ee(null),[oP,aP]=Ee({}),Ke=ge(null),Ud=ge(null),Gd=ge(!1),Sg=ge(n);Sg.current=n;let jl=ge(null),Hd=ge(O);Hd.current=O;let Gi=ge(null),Wd=ge(0),Cg=ge(null),[sP,lP]=Ee(0),rn=ge(!1),Ua=ge(!1),Ga=ge(null),qd=ge(!!pe);qd.current=!!pe;let Hr=ge(null),zl=ge(jt?.camera?{camera:jt.camera,home:jt.home}:null),[Vl,Hi]=Ee(!!n),[ri,Wi]=Ee(!n||!!We||!!pe),[Pt,Pg]=Ee(!1),[Ha,Tg]=Ee([]),[Wa,Xd]=Ee(!1),[qi,$d]=Ee(null),[_g,Ro]=Ee(!1),[cP,uP]=Ee(0),Yd=ge(""),Eg=ge(new Set),Ag=ge(""),[Rg,kg]=Ee(!1),Kd=ge(new Set),[Dg,dP]=Ee(0),[Qd,pP]=Ee(null),[mP,Og]=Ee(!1),[Jd,Lg]=Ee({total:0,missing:0}),[hP,Ig]=Ee("loadingModel"),[fP,Zd]=Ee(null),gP=hy(fP),nn=ge({}),ko=ye(()=>{let M=ze.current;if(!M||Hr.current)return;Hr.current=zy(M,Gi.current??Ke.current);let L=Ga.current;L?.usesSlots&&(Fr.current[L.url]=Hr.current)},[Fr]),[Do,Bg]=Ee(()=>jt?.explodeFactor??0),[bP,Ng]=Ee(!1);Ln(()=>{Bg(0),Ng(!1)},[Re,n,i]);let on=Mt(()=>{let M=Ne.cinematic,L=M?.enabled?{waypoints:M.waypoints,duration:M.duration,loop:M.loop,autoPlay:M.autoPlay}:null;return jr===void 0?L&&(L.waypoints?.length??0)>=2?L:null:jr===!1?null:jr===!0?L??{}:{...L??{},...jr}},[jr,Ne]),[qa,Jt]=Ee(!1),[jg,ni]=Ee(!1),ep=ge(!1);Ge(()=>{Jt(!1),ni(!1),ep.current=!1},[Re,n,i]),Ge(()=>{if(!(!on?.autoPlay||ep.current)&&Pt&&ri&&!Vl){if(ep.current=!0,ei)return;Jt(!0),ni(!1)}},[on,Pt,ri,Vl,ei]);let vP=ye(()=>{Jt(!1),ni(!0)},[]),{captureVideo:tp,cancelVideo:rp,isRecording:zg,recording:bt,progress:yP,onProgress:Vg}=Zx({rendererCaptureRef:Er,controlsRef:ze,cinematicConfig:on,ready:t.status==="ready"&&Pt&&ri&&!Vl,modelUrl:`${Re}|${i??""}`,onCaptureStart:vP});Ge(()=>{t.status==="lost"&&(r.interrupt(),rp(),Jt(!1),ze.current?.stop())},[t.status,rp,r]);let{xrStore:xP,inARSession:np,presenterRef:wP,arSupported:Fg,vrSupported:Ug,quickLookSupported:Gg,resolvedMobileHandoffUrl:Fl,isMobileHandoffOpen:Hg,arOverlay:MP,openMobileHandoff:SP,closeMobileHandoff:CP,openQuickLook:PP,handleARStateChange:TP}=e0({enableXR:_o,usdzUrl:B,mobileHandoffUrl:V,configuredHandoff:!!$,engagement:r}),an=Mt(()=>Cx(()=>Jt(!1)),[Re,n]),ip=Mt(()=>({current:null}),[Re,n]),Wg=ge(G);Wg.current=G;let op=ge(H);op.current=H;let qg=ye(M=>{ip.current=M,Wg.current?.(M)},[ip]),Xg=Mt(()=>{try{return ec(Ne.sequences??[])}catch{return[]}},[Ne.sequences]);Ge(()=>(op.current?.(Pt?an:null),()=>op.current?.(null)),[an,Pt]),Ge(()=>()=>an.destroy(),[an]),Ge(()=>{ei&&an.pause()},[an,ei]);let Oo=Kv(Pr),$g=ge(Oo);$g.current=Oo;let ii=Oo==="webgpu",Ul=ii?null:xP,Yg=Ii||Ne.section?.enabled===!0;Ge(()=>{if(!ii)return;let M=[Yg&&"the section cut",(st||Ze)&&"the transform gizmo"].filter(Boolean);M.length!==0&&console.info(`[react-immersive] With WebGPU, ${M.join(" and ")} ${M.length>1?"aren't":"isn't"} available; ${M.length>1?"they need":"it needs"} WebGL.`)},[ii,Yg,st,Ze]);let{annotations:oN,pendingAnnotation:Xi,setPendingAnnotation:Kg,annotationForm:_P,setAnnotationForm:ap,currentAnnotationIndex:EP,isNavigating:AP,localAnnotationCategories:RP,selectedAnnotationCategories:kP,visibleAnnotations:Qg,availableAnnotationCategories:DP,annotationFiltersVisible:sp,changeAnnotationCategories:OP,sortedAnnotations:lp,currentAnnotation:Jg,setActiveAnnotation:aN,focusAnnotation:sN,startGuidedTour:LP,goToPreviousAnnotation:IP,goToNextAnnotation:BP,stopGuidedTour:NP,closeViewingAnnotation:Gl,activeAnnotation:lN,activeViewingAnnotation:Hl,isGuidedTourActive:Xa,handleAnnotationOk:jP,handleAnnotationCancel:zP,handleAnnotationMarkerClick:Zg}=VC({sceneAnnotations:Se?.annotations,controlledAnnotationCategories:gt,onAnnotationCategoriesChange:Je,showAnnotationFilters:he,initialCategories:jt?.annotationCategories??null,controlledActiveAnnotation:be,onActiveAnnotationChange:Pe,onAnnotationsChange:q,controlsRef:ze,sceneRef:Ke,annotationWorldPositionsRef:Nd,tourCameraOffsetRef:Bd,initialCameraStateRef:Hr,engagement:r,engagementRef:Gf}),VP=Ne.section??ss,eb=yl&&Pt&&Ha.length>0;eg.current=Ha;let tb=K||Ue||Ae&&Ll.supported||W&&lp.length>0;nn.current=Oe,Ge(()=>{if(!ar)return;let M=Oe[ar.objectKey]?.style?.material?.[ar.textureKey]?.path;(!Fa||!M)&&Va(null)},[Oe,Fa,ar]);let cp=ge({}),[Wl,FP]=Ee({});Ge(()=>{let M={...Wl},L=!1,F=new Set;for(let[Q,ve]of Object.entries(Oe)){F.add(Q);let et=ve.style?.material,Xe=cp.current[Q]??{},Qe={};for(let Ot of mi){let sr=et?.[Ot]?.path;sr&&(Qe[Ot]=sr,sr!==Xe[Ot]&&(M[Q]!==Ot&&(L=!0),M[Q]=Ot))}let tt=M[Q];if(tt&&!Qe[tt]){let Ot=mi.find(sr=>!!Qe[sr]);Ot?M[Q]=Ot:delete M[Q],L=!0}cp.current[Q]=Qe}for(let Q of Object.keys(M))F.has(Q)||(delete M[Q],delete cp.current[Q],L=!0);L&&FP(M)},[Oe]);let up=Mt(()=>Object.entries(Oe).map(([M,L])=>JSON.stringify([M,L.modelObjectId,L.transform??null])).sort().join(""),[Oe]),{measureMode:yr,measureModeRef:rb,measurePoints:dp,measurementTool:pp,areaClosed:mp,measurementError:UP,selectMeasurementTool:GP,undoMeasurementPoint:HP,finishMeasureArea:WP,snapMode:qP,setSnapMode:XP,snapPreview:nb,handleMeasurePointerMove:$P,clearSnapPreview:ib,showDimensions:hp,measureBox:ql,modelBounds:YP,refreshBounds:ob,clearMeasurements:KP,toggleMeasureMode:QP,toggleDimensions:JP,handleMeasurePointerDown:ZP,handleMeasureClick:eT,saveMeasurement:tT,canSaveMeasurement:rT,canCalibrate:nT,calibrate:iT,savedResults:oT,setSavedResults:ab,exportMeasurementJson:aT,exportMeasurementCsv:sT,importMeasurements:lT}=Kw({canvasAreaRef:Ur,controlsRef:ze,sceneRef:Ke,modelUrl:Re,tilesetUrl:i,measurementModelId:Rd,savedMeasurements:El,measurementSettings:Ba,measurementUnit:Zn,onMeasurementsChange:Kf,onMeasurementSettingsChange:Qf,onCollectionChange:M=>{Ni?.(M.items),ji?.(M.settings),Ia(M)},modelRotation:Ne.model.rotation,bindingTransformSignature:up,modelLoaded:Pt,enabled:St&&!bt}),cT=ye(()=>{if(!nt||nt.length<2)return null;let M=nt.map(L=>{let F=Fi.current[Be(L)];if(!F)return null;let Q=Be(L)===Re?ti.current:yg.current[Be(L)]?.current??{};return{scene:F,objectBindings:zi(L),matRefs:Q,label:L.label||bd(L.url)}}).filter(L=>L!==null);return M.length>0?M:null},[nt,Re,n,zi]),uT=ye(()=>{if(!nt||nt.length<2)return null;let M=nt.map(L=>{let F=Fi.current[Be(L)];return F?{scene:F,label:L.label||bd(L.url)}:null}).filter(L=>L!==null);return M.length>0?M:null},[nt]);Ge(()=>{(qa||yr||bt||np||t.status!=="ready")&&an.stop()},[an,qa,yr,bt,np,t.status]);let fp=ge(null),dT=ye(()=>{if(!Pt)throw new Error("Wait for the current model to finish loading before preparing AR.");if(i)throw new Error("Streaming tiles are incomplete model data. Provide arHandoff.createUSDZ to prepare this asset.");let M=Dt?nt:void 0,L=M?M.filter(F=>F.visible!==!1).map(F=>{let Q=Be(F),ve=Fi.current[Q];if(!ve)throw new Error("Wait for every visible model to finish loading before preparing AR.");let et=Q===Re?fp.current??zi(F):cs(zi(F),F.sceneConfig?.product).objectBindings;return{scene:ve,instanceId:Q,objectBindings:et,materialOverrides:Q===Re?ti.current:yg.current[Q]?.current}}):Ke.current?[{scene:Ke.current,objectBindings:fp.current??Oe,materialOverrides:ti.current}]:[];if(!L.length)throw new Error("Wait for a visible model to finish loading before preparing AR.");for(let F of L)zv(F.scene);return L},[Pt,i,Dt,nt,zi,Re,Oe]),[pT,mT]=Ee(34),sb=ge(void 0),hT=zw({openConfiguredAR:_o&&$?()=>sb.current?.():void 0,sceneRef:Ke,materialRefs:ti,rendererCaptureRef:Er,objectBindings:Oe,downloadFilename:oe,getAllLoadedModels:cT,getAllLoadedModelUvSources:uT,captureVideo:tp}),lb=Mt(()=>Object.fromEntries(Object.entries(Oe).filter(([,M])=>M.visible===!1).map(([M])=>[M,!0])),[Oe]),oi=Mt(()=>{let M=new WeakMap,L=new Map,F=new Map;for(let[Q,ve]of Object.entries(Oe))M.set(ve,Q),L.has(ve.id)||L.set(ve.id,Q),F.has(ve.modelObjectId)||F.set(ve.modelObjectId,Q);return{byReference:M,byId:L,byModelObjectId:F}},[Oe]),Wr=ye(M=>M?oi.byReference.get(M)??oi.byModelObjectId.get(M.modelObjectId)??oi.byId.get(M.id)??null:null,[oi]),gp=h!==void 0,$i=gp?h??null:nP,mt=Wr($i);Ge(()=>{r.setSelectedPart(mt)},[mt,r]);let Yi=mt?Ut.current[mt]??null:null,fT=mt?Wl[mt]:void 0,cb=Wr(Te?f??Nl??tP:null),gT=cb?Ut.current[cb]??null:null,bp=y??(b?b.map(M=>Ut.current[M]).filter(Boolean):null),Xl=Mt(()=>{let M=bp??(Yi&&Oe[mt??""]?.transform?.shear?[Yi]:null);if(!M?.length)return null;let L=new Set(M),F=Object.entries(Ut.current).filter(([,Q])=>L.has(Q)).map(([Q,ve])=>({key:Q,node:ve,transform:Oe[Q]?.transform}));return F.length>1||F.some(({transform:Q})=>Q?.shear)?F:null},[bp,Oe,Yi,mt]),ub=ye(M=>{rP(M),_?.(M)},[_]),db=se&&$i!==null&&mt!==null,Ki=(mt?Oe[mt]:null)??$i,$a=Ki&&(Ki.modelObjectId||Ki.id)||null,Ya=$a?oP[$a]??null:null,[bT,pb]=Ee(""),mb=ge(null);Ge(()=>{let M=mb.current;if(M!==mt)if(mb.current=mt,mt){let L=Ki?.label||$i?.label||mt;pb(Qt("objectSelected",{name:L}))}else M&&pb(Qt("selectionCleared"))},[mt,Ki,$i,Qt]),Ge(()=>{re?.(lb)},[lb,re]);let Lo=ye((M,L)=>{if(Vi==="pointerLock"){Rl("orbit");return}M&&L?r.viewPart({objectId:M.id,objectKey:Wr(M)??(M.modelObjectId||M.id),label:M.label,source:L}):M||r.setSelectedPart(null),gp||iP(M),x?.(M)},[Vi,Rl,gp,x,Wr,r]),hb=ge(jt?.objectBindings?`${n}
80
+ ${i??""}`:null),$l=ye((M,L)=>{if(!_d)return;let F=`${n}
81
+ ${i??""}`,Q=hb.current===F?nn.current:$2;hb.current=F;let ve=ky(M,L);for(let et of Object.keys(ve))Q[et]&&(ve[et]=Q[et]);Vr(ve)},[_d,n,i,Vr]),{glowMemoryRef:fb,readObjectGlow:gb,applyGlow:bb}=dw({nodeRefsMap:Ut,currentObjectBindingsRef:nn,applyObjectBindings:Vr}),vT=ye(M=>{let L=mt;if(!L||!M)return;let F=nn.current[L];F&&Vr({...nn.current,[L]:{...F,transform:{...F.transform,...M}}})},[Vr,mt]),yT=ye(M=>{let L=nn.current,F={...L};for(let{key:Q,transform:ve}of M){let et=L[Q];et&&(F[Q]={...et,transform:{...et.transform,...ve}})}Vr(F)},[Vr]),ai=ye((M,L)=>Oe[M]?M:L?Wr(L):oi.byId.get(M)??oi.byModelObjectId.get(M)??null,[Oe,Wr,oi]),Yl=ye((M,L)=>{let F=ai(M),Q=F?Oe[F]:void 0;!F||!Q||Vr({...Oe,[F]:{...Q,style:L(Q.style)}})},[ai,Oe,Vr]),sn=ye(()=>{if(Gr){let M=Ui[Gr.objectId]?.hex;M!==void 0&&(Yl(Gr.objectId,L=>({...L,material:{...L?.material,baseColor:M}})),Bl(L=>({...L,[Gr.objectId]:{}})))}Mg(null)},[Gr,Ui,Yl]),vp=ye(()=>{Lo(null),Vd(null),sn()},[Lo,sn]),xT=ye((M,L,F,Q,ve)=>{let et=xg.current,Xe=Ur.current,Qe=ze.current?.camera;if(!et)return{objectId:M,x:24,y:24};let tt=et.getBoundingClientRect(),Ot=12,sr=tt.width-L-Ot,_n=tt.height-F-Ot,es=Math.max(Ot,(tt.width-L)/2),ts=Math.max(Ot,(tt.height-F)/2),rs=ai(M,Q),ln=rs?Ut.current[rs]:null,wr=(En,An)=>An<=Ot?Ot:Math.min(Math.max(En,Ot),An);if(Xe&&Qe&&ln){let En=Xe.getBoundingClientRect(),An=new Rf;new G2().setFromObject(ln).getCenter(An),An.project(Qe);let li=(An.x+1)/2*En.width+(En.left-tt.left),os=(1-An.y)/2*En.height+(En.top-tt.top);return{objectId:M,x:wr(li+24,sr),y:wr(os-F/2,_n)}}let ns=typeof ve?.screenX=="number"?ve.screenX-tt.left:es,is=typeof ve?.screenY=="number"?ve.screenY-tt.top:ts;return{objectId:M,x:wr(ns,sr),y:wr(is,_n)}},[ai]),Kl=pw({setCurrentAction:Vd,bindingKeyIndex:oi,currentObjectBindings:Oe,applyObjectBindings:Vr,resolveObjectKey:ai,closeColorPicker:sn,setColorPicker:Mg,setMaterialPopupsByObject:aP,setItemMaterials:Bl,getPopoverPosition:xT,decalRequestRef:ag,setDecalError:og,setDecalDragging:sg,setDecalControl:ng,resolvedSceneConfigRef:Eo,applyLightPatches:tg,readObjectGlow:gb,applyGlow:bb,glowMemoryRef:fb,setLightControl:rg,onAction:te});Ge(()=>{if(Gr)return window.addEventListener("pointerdown",sn),()=>window.removeEventListener("pointerdown",sn)},[Gr,sn]),Ge(()=>{if(!Hl)return;let M=L=>{if(Il.current&&!Il.current.contains(L.target)){if(L.target.closest?.(".ri-annotationMarker"))return;Gl()}};return document.addEventListener("mousedown",M),document.addEventListener("touchstart",M),()=>{document.removeEventListener("mousedown",M),document.removeEventListener("touchstart",M)}},[Hl,Gl]),Ge(()=>{if(!Xi)return;let M=L=>{let F=L.target;if(F.closest?.(".ri-annotationPopup")||F.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let Q=Ur.current;!Q||!Q.contains(F)||(Kg(null),ap({title:"",description:""}))};return document.addEventListener("mousedown",M,!0),document.addEventListener("touchstart",M,!0),()=>{document.removeEventListener("mousedown",M,!0),document.removeEventListener("touchstart",M,!0)}},[Xi]);let{handleFileChange:wT,triggerFileUpload:vb,clearTexture:yb,texturePositioningEnabled:MT,texturePositioningOverrides:ST,setMaterialTextureOffset:CT,setMaterialTextureRotation:PT,endMaterialTexturePositioning:TT}=e1({applyBindingStyle:Yl,resolveObjectKey:ai,onTextureUpload:X,fileInputRef:bg,pendingObjectId:Y1,createdBlobUrls:vg,texturePositioning:Lf,setMoveZoomTarget:Va}),yp=ge(ne);yp.current=ne;let Ar=ye(()=>{let M=ze.current;!M||!yp.current||yp.current({objectBindings:nn.current,homeCameraState:Hr.current,captureImage:L=>zg()?Promise.reject(new Error("Wait for video export to finish before capturing an image.")):jc(Er.current,L),isLoadingTiles:()=>Gd.current,captureVideo:tp,invalidate:()=>Er.current?.invalidate(),rendererBackend:$g.current??"webgl",raw:{controls:M,scene:Ke.current,nodes:Ut.current}})},[tp,zg]),Ka=ye(async(M=!1)=>{let L=ze.current,F=Gi.current??Ke.current;if(!L||!F)return!1;Ao.current=bs;try{return await wx(L,F,{flyIn:M,onStart:()=>Wi(!0),invalidate:()=>Er.current?.invalidate()}),(Gi.current??Ke.current)!==F?!1:(rn.current=!0,ko(),Ar(),!0)}catch(Q){return console.error("Fit scene error:",Q),!1}},[ko,Ar]);Ge(()=>{let M={url:Re,usesSlots:Dt},L=gx(Ga.current,M,(kl.current??[]).map(Qe=>Be(Qe)),Fi.current,Fr.current,_r),F=Ga.current?Fr.current[Ga.current.url]:void 0;if(L&&F&&!Fr.current[Re]&&(Fr.current[Re]=F),Ga.current=M,rn.current=!1,Ua.current=!1,Hr.current=Dt?Fr.current[Re]??null:null,Ke.current=null,Ud.current=null,Gd.current=!1,jl.current=null,Gi.current=null,Pg(!1),Tg([]),Xd(!1),$d(null),Ro(!1),Yd.current="",Eg.current=new Set,Kd.current=new Set,Lg({total:0,missing:0}),Ig("loadingModel"),Zd(null),jt?.model!==Uc(Re,i)&&(zl.current=null),!n){Hi(!1),Wi(!0);return}if(Dt&&Dl.current.has(Re)){Hi(!1),Wi(!0);return}Hi(!L),Wi(L||!!We||qd.current);let Q=!1,ve=null,et=Qe=>{ve=setTimeout(Xe,Qe)},Xe=()=>{if(Q||rn.current||Ua.current||Dt&&Dl.current.has(Re))return;let Qe=Gi.current??Ke.current;if(!ze.current||!Qe){et(100);return}Wd.current=bx(Qe,ze.current,ft?.maxDistance)??Wd.current;let tt=zl.current;if(tt){zl.current=null,iw(ze.current,tt.camera),rn.current=!0,tt.home?(Hr.current=tt.home,Dt&&(Fr.current[Re]=tt.home)):ko(),Ar(),Hi(!1),Wi(!0),Er.current?.invalidate();return}if(Iy(ze.current)||L){rn.current=!0,ko(),Ar(),Hi(!1),Wi(!0),Er.current?.invalidate();return}Ua.current=!0,(We?We():qd.current?Promise.resolve(!0):Ka(!0)).then(sr=>{Q||(rn.current=sr!==!1,rn.current?(ko(),Ar(),Hi(!1)):Q||et(100))}).catch(()=>{rn.current=!1,Q||et(100)}).finally(()=>{Q||(Ua.current=!1)})};return et(50),()=>{Q=!0,ve&&clearTimeout(ve)}},[ko,Fr,ft?.maxDistance,Ka,Re,_r,n,Ar,We,jt,i,Dt]),C1({enabled:_t,canvasAreaElement:zd,fitAttemptedRef:rn,fitInFlightRef:Ua,controlsRef:ze,cameraFramingRef:Ao,nodeRefsMap:Ut,fitScene:Ka});let Ql=ye(M=>{let L=ze.current;if(!L)return;let F=M.cameraState;if(F?.position&&F?.target){let[et,Xe,Qe]=F.position,tt=new Rf(...F.target);L.setPosition(et,Xe,Qe,!0),L.setTarget(tt.x,tt.y,tt.z,!0),Ao.current={kind:"view",target:tt};return}let Q=Wr(M),ve=Q?Ut.current[Q]:null;!Q||!ve||(L.fitToBox(ve,!0,Dc).catch(()=>{}),Ao.current={kind:"object",key:Q})},[Wr]);Ge(()=>{mt||(Ao.current=bs)},[mt]);let xp=ye((M,L="canvas")=>{if(rb.current)return;let F=hg.current;F.dragging||performance.now()-F.endedAt<150||(Jt(!1),sn(),Vd(null),Lo(M,L),!(at||!Le)&&Ql(M))},[Lo,sn,Ql,at,Le]),{beginMoveZoom:xb,handleMoveZoomPointerDown:_T}=XC({moveZoomTarget:ar,setMoveZoomTarget:Va,currentObjectBindingsRef:nn,materialRefsOut:ti,rendererCaptureRef:Er,canvasAreaRef:Ur,canvasAreaElement:zd,applyBindingStyle:Yl}),wb=ye(M=>{if(!Fa)return!1;let L=Wr(M);if(!L)return!1;let F=Wl[L];return F?(xb({objectKey:L,textureKey:F}),!0):!1},[Fa,Wr,Wl,xb]),wp=ge(!1),{editDecals:uN,activeDecalMove:Io,addCenteredDecal:dN,decalSizeFor:ET,startImageDecal:pN,decalControlHandlers:AT}=GC({currentObjectBindings:Oe,currentObjectBindingsRef:nn,applyObjectBindings:Vr,nodeRefsMap:Ut,controlsRef:ze,decalMove:w,decalDragging:Ld,setDecalDragging:sg,setDecalError:og,setDecalControl:ng,decalRequestRef:ag,onTextureUpload:X,currentPanelObjectId:$a,modelUrl:Re}),Jl=_e===!0?J2:_e||null,Qi=pr.product?JSON.stringify([Re,pr.product.definition.id,pr.product.definition.revision]):null,[Mp,RT]=Ee(null),Bo=Mt(()=>pr.product&&Jl&&Mp?.key===Qi?{...pr.product,selections:Mp.selections}:pr.product,[pr.product,Jl,Mp,Qi]),kT=ye(M=>{RT(Qi?{key:Qi,selections:M}:null)},[Qi]),Qa=Mt(()=>cs(Oe,Bo,kn(pr.model),Ha),[Oe,Bo,pr.model,Ha]);fp.current=Qa.objectBindings;let Zt=Mt(()=>Bo?{...pr,product:Bo,model:{...pr.model,activeVariants:Qa.activeVariants}}:pr,[pr,Bo,Qa.activeVariants]),Mb=Mt(()=>Ty(Qa.objectBindings,Zt.styleRules),[Qa.objectBindings,Zt.styleRules]),[Sb,Cb]=Ee(()=>jt?.isolation??null);Ln(()=>{Cb(null)},[Re,n]);let Ji=Bi!==void 0?Bi:Sb,Sp=ye(M=>{Bi===void 0&&Cb(M),Jn?.(M)},[Bi,Jn]),xr=Mt(()=>Ey(Mb,Ji),[Mb,Ji]),DT=Mt(()=>({bindings:xr.bindings,model:Zt.model,camera:Zt.camera,animations:Zt.animations}),[xr.bindings,Zt.model,Zt.camera,Zt.animations]),No=Ix({revision:String(Do),enabled:_o&&!!$,options:mc($),baseUrl:V,state:{version:1,objectBindings:Oe,configuration:{modelUrl:n,modelFormat:l,tilesetUrl:i,activeModelId:Re,models:nt?.map(M=>({...M,objectBindings:zi(M),sceneConfig:Be(M)===Re?Zt:M.sceneConfig})),mergeModels:Cd,sceneConfig:Zt,arScaleMode:z,isolation:Ji,backgroundColor:J,shadows:$e}},getSources:dT});sb.current=No.show;let Tn=Mt(()=>xr.setAside.size>0?_y(Oe,Ji):null,[xr,Oe,Ji]),OT=ye(M=>{let L=Wr(M),F=L!==null&&Tn?.size===1&&Tn.has(L);Sp(F?null:{...Ji,target:M.id})},[Sp,Ji,Tn]),{sourceOf:si}=xr,LT=Mt(()=>Pn?pC(Oe,xr):[],[Pn,Oe,xr]),Cp=ye(M=>{let L=si(M);xp(L)},[xp,si]),Pp=ye(M=>ub(M&&si(M)),[ub,si]),Tp=ye((M,L)=>{let F=si(M);return v?.({binding:F,...L})===!0?(wp.current=!0,!0):wb(F)},[v,wb,si]),_p=Mt(()=>A?(M,L)=>A({binding:si(M),...L}):void 0,[A,si]),Pb=ye(M=>{Lo(M,"panel"),!at&&Ql(M)},[Lo,Ql,at]);Ge(()=>{Ar()},[Ar,Oe,K1]);let Tb=ye((M,L)=>{vx(L,Wd.current),Z?.($r(M,L)),Ar()},[Ar,Z]),IT=ye(M=>{Cg.current=new Set(M.map(L=>L.name)),lP(L=>L+1),$l(M.map(L=>L.name)),s?.(M)},[$l,s]),BT=ye(M=>{Gi.current=M,Er.current?.invalidate()},[]),jo=ye(M=>{Ke.current=M,ob(M),Lg(S1(M));let L=Yv(M);pP(L>Hp?L:null),Og(!1),Zd(null),L>Hp&&Ig("preparingLargeModel"),Pg(!0),Tg(Pv(M)),Xd(!1),$d(null),kg(!1),i||(s&&s(_S(M)),$l(Oy(M),Dy(M))),E?.(M),T?.(Py(M)),Ar()},[$l,Ar,T,s,E,ob,i]),NT=ye(()=>Gi.current??Ke.current,[]),{background:Ep}=Ne,jT=Ep.enabled&&Ep.type==="color"&&new H2(Ep.color).getHSL({h:0,s:0,l:0}).l>.5?"#000000":"#ffffff",Ja=Pt?Ke.current:null,_b=!!O;Ge(()=>{if(!_b)return;if(Wa){if(jl.current?.url!==n||jl.current.error!==qi)return;let L=qi&&typeof qi=="object"?us(qi):void 0;Hd.current?.(qv({...L,name:L?.name??Up(n),format:L?.format??l??Gp(n).format}));return}if(!Ja||Ke.current!==Ja)return;let M=Gp(n);Hd.current?.(Wv(Ja,{scope:i?"resident-tiles":"asset",source:{...us(Ja),format:i?"3d-tiles":l??M.format,name:M.entryPath??Up(n)}}))},[_b,Ja,n,l,i,Dg,Wa,qi]);let Ap=ye(M=>{Hi(!1),Wi(!0),Xd(!0),$d(M),jl.current={url:Sg.current,error:M},N?.(M)},[N]),{reportError:Eb,clearError:Ab}=zx({enabled:Dt,activeUrl:Re,models:nt,errorsRef:Dl,activeFailed:Wa,activeError:qi,onActiveError:Ap,onExtraError:If}),zT=ye((M,L)=>{!Dt||!kl.current?.some(F=>Be(F)===M)||(delete Fi.current[M],delete Fr.current[M],Eb(M,L))},[Dt,Eb,Fr]),VT=ye((M,L)=>{!Dt||!kl.current?.some(F=>Be(F)===M)||(Ab(M),Fi.current[M]=L,M===Re&&(Ol.current!==M||Ke.current!==L)&&(Ol.current=M,jo(L)),Ml?.(M,L))},[Dt,Re,n,jo,Ml,Ab]);Ge(()=>{if(!Dt||Dl.current.has(Re))return;let M=Fi.current[Re];M&&(Ol.current===Re&&Ke.current===M||(Ol.current=Re,jo(M)))},[Dt,Re,n,Pt,jo]);let Rb=ye((M,L)=>{Kd.current.add(M),dP(F=>F+1),Bf?.(M,L)},[Bf]),kb=Dt&&nt?nt.find(M=>Be(M)===Re)?.mergeModels:Cd,Db=Mt(()=>new Set((kb??[]).map(M=>M.url)),[kb]),Ob=ye(M=>{M.lengthComputable&&M.total>0&&Zd(M.loaded/M.total*100),D?.(M)},[D]),Lb=ye((M,L,F)=>{if(!je)return;let Q={...Ne,lighting:{...Ne.lighting,lights:Ne.lighting.lights.map(ve=>ve.id===M?{...ve,position:L,...F?{rotation:F}:{}}:ve)}};je(Q)},[Ne,je]);Ge(()=>{let M=Ke.current;if(!Pt||!M){Ro(!1);return}if(Array.from(Db).some(Xe=>!Kd.current.has(Xe))){Ro(!1);return}let F=Object.entries(Oe).filter(([,Xe])=>!Xe.removed);if(F.length===0){Ro(!1);return}let Q=i?Cg.current:(()=>{let Xe=Eg.current;for(let Qe of Object.keys(ci(M).nodesById))Xe.add(Qe);return Xe})();if(!Q||Q.size===0){Ro(!1);return}let ve=F.map(([Xe,Qe])=>Qe.modelObjectId??Xe).filter(Xe=>!Q.has(Xe));Ro(ve.length>0),uP(ve.length);let et=ve.join(`
82
+ `);if(ve.length>0&&et!==Yd.current){let Xe=ve.slice(0,10).map(tt=>`"${tt}"`).join(", "),Qe=ve.length>10?` and ${ve.length-10} more`:"";console.warn(`[react-immersive] ${ve.length} object binding(s) point at nodes this model doesn't have, so they can't be selected: ${Xe}${Qe}. Each binding's modelObjectId (or its key) must match a node name; log onObjectCatalog to see this model's names.`)}Yd.current=et},[Pt,Oe,sP,i,Db,Dg]),Ge(()=>{if(te||_r)return;let M=[];for(let[F,Q]of Object.entries(Oe))for(let ve of Q.actions??[])qp.includes(ve.id)||M.push(`"${ve.id}" on "${Q.label??F}"`);let L=M.join(`
83
+ `);if(M.length>0&&L!==Ag.current){let F=M.slice(0,10).join(", "),Q=M.length>10?` and ${M.length-10} more`:"";console.warn(`[react-immersive] ${M.length} action button(s) do nothing because ModelViewer has no onAction handler: ${F}${Q}. ModelViewer itself handles ${qp.join(", ")}; handle other ids in onAction, or pass useViewerActions().handleAction to run their effects.`)}Ag.current=L},[Oe,_r,te]);let Rp=ye(async()=>{if(ze.current&&Hr.current&&Go(ze.current,Hr.current),We){await We();return}let M=ze.current;if(!M)return;let L=Hr.current;try{if(L){Ao.current=bs;let F=Sc(L,M);await sm(M,()=>M.setLookAt(F[0],F[1],F[2],L.target[0],L.target[1],L.target[2],!0))}else await Ka()}catch(F){console.error("Reset camera error:",F)}},[We,Ka]),mN=ye(()=>{ni(!1),Jt(!0)},[]),hN=ye(()=>{Jt(!1)},[]),FT=ye(()=>{Jt(!1),ni(!0),setTimeout(()=>{Rp()},100)},[Rp]),UT=ye((M,L)=>{Tb(M,L)},[Tb]),GT=ye(M=>{if(rb.current)return;if(wp.current){wp.current=!1;return}if(M.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let F=Ur.current,Q=ze.current,ve=Q?.camera,et=Ke.current;if(!F||!Q||!ve||!et||!Sl&&!Q.enabled)return;let Xe=F.getBoundingClientRect(),Qe=(M.clientX-Xe.left)/Xe.width*2-1,tt=-((M.clientY-Xe.top)/Xe.height)*2+1,Ot=new W2;Ot.setFromCamera(new q2(Qe,tt),ve);let sr=Ot.intersectObject(et,!0);if(sr.length===0)return;if(!Sl&&R){let ln=sr[0].point,wr=null;for(let[ns,is]of Object.entries(nn.current)){if(!is.decals?.length)continue;let En=Ut.current[ns];if(!En)continue;let An=En.worldToLocal(ln.clone());for(let li of is.decals){if(!li.position)continue;let os=An.distanceTo(new Rf(li.position[0],li.position[1],li.position[2]));os<=li.size/2&&(!wr||os<wr.distance)&&(wr={binding:is,id:li.id,distance:os})}}if(wr){Va(null),R(wr.binding,wr.id);return}}if(!Sl){let{x:ln,y:wr,z:ns}=sr[0].point;Q.setOrbitPoint(ln,wr,ns);return}let _n=sr[0],es=_n.point,ts=et.worldToLocal(_n.point.clone()),rs=[0,0,1];if(_n.face){let ln=_n.face.normal.clone().transformDirection(_n.object.matrixWorld).normalize();rs=[ln.x,ln.y,ln.z]}Kg({worldPosition:[es.x,es.y,es.z],localPosition:[ts.x,ts.y,ts.z],worldNormal:rs,anchor:NC(_n),screenX:M.clientX-Xe.left,screenY:M.clientY-Xe.top}),ap({title:"",description:""})},[Sl,R]);if(Ge(()=>{Pd.current={snapshot:()=>{let M=ze.current,L=zl.current;return{model:zr,camera:rn.current&&M?Uo(M):L?.camera,home:Hr.current??L?.home,lightEdits:Ed,variantEdit:Pl,sectionEdit:Tl,measurementEdits:_l,isolation:Sb,objectBindings:Hf||Dt?void 0:Oe,modelBindingEdits:Hf?void 0:B1,explodeFactor:Do,cameraControllerType:dg,uvCheckerOverride:lg,annotationCategories:RP}},captureFrame:()=>{let M=Er.current;return!M||t.status!=="ready"||!Pt||!ri?Promise.resolve(null):ry(M)}}}),Ge(()=>()=>{Pd.current=null},[Pd]),Cl.status==="checking"){let M=Vf??jf;return M?Y("div",{className:"ri-viewer ri-viewerPlaceholder",style:{background:ug},children:Y(Wp,{src:M})}):Y("div",{className:"ri-viewer ri-viewer--license-checking",children:!p&&Y(_c,{title:Qt("verifyingLicense"),message:Qt("checkingYourLicenseKey")})})}if(Cl.status==="invalid")return Y("div",{className:"ri-viewer ri-viewer--license-invalid",children:Y(_c,{tone:"error",title:Qt("invalidLicense"),message:Cl.isLocalDomain?Cl.reason??Qt("licenseHasBeenRevokedOrHasExpired"):Qt("failedToLoadPleaseContactTheSiteAdministrator")})});let{materialTextureUrl:Ib,materialTargetTakesImage:Bb,materialTextureOffset:Nb,materialTextureRotationDegrees:jb,isMaterialTexturePositioning:zb,materialTextureOnOffsetChange:Vb,materialTextureOnRotationChange:Fb,materialTextureOnEndPositioning:Ub}=t1({materialPopup:Ya,resolveObjectKey:ai,currentObjectBindings:Oe,nodeRefsMap:Ut,moveZoomTarget:ar,texturePositioningEnabled:MT,texturePositioningOverrides:ST,setMaterialTextureOffset:CT,setMaterialTextureRotation:PT,endMaterialTexturePositioning:TT}),HT=Ur.current?.offsetWidth??600,WT=Ur.current?.offsetHeight??400,qT=350,XT=290,$T=Xi?Math.min(Xi.screenX+12,HT-qT-8):0,YT=Xi?Math.min(Xi.screenY,WT-XT-8):0,KT=we&&!!n&&!Wa&&!Pt,Gb=_o&&(Ul&&(Fg||Ug)||Gg||!!$||!!Fl),zo=Gb&&!_r,Za=St&&!_r,kp=Ii&&!_r,Hb=(zo?1:0)+(Rt?1:0),Zi=M=>(_r?50:16)+M*42+(Za&&M>Hb?Math.max(0,pT-34):0),Dp=Gb?Y(g1,{configuredHandoff:!!$,top:Zi(0),xrStore:Ul,arSupported:Fg,vrSupported:Ug,quickLookSupported:Gg,mobileHandoffUrl:Fl,mobileHandoffOpen:$?No.open:Hg,onQuickLook:$?No.show:PP,onOpenMobileHandoff:$?No.show:SP}):null;return Br("div",{className:"ri-viewer",ref:Ll.rootRef,style:{background:ug},"data-reduced-motion":ei?"":void 0,children:[Y("div",{className:"ri-visuallyHidden",role:"status","aria-atomic":"true",children:bT}),t.status!=="ready"&&Y(ZC,{rebuilding:t.status==="rebuilding",onReload:t.reload}),Br("div",{className:"ri-viewerLeft",ref:xg,inert:t.status!=="ready",children:[De?De({isOpen:db,selectedObject:Ki,currentAction:wg,onClose:vp,onAction:Kl}):Y(lf,{translateDefaultActions:_d,isOpen:db,selectedObject:Ki,currentAction:wg,onClose:vp,onAction:Kl,renderActionExtra:M=>{if(M==="change-color"&&Gr)return Y(rf,{inline:!0,colorPicker:Gr,onClose:sn,itemMaterials:Ui,setItemMaterials:Bl});if((M==="change-light-color"||M==="set-brightness")&&Dd?.kind===M&&Dd.objectId===$a)return Y(mw,{control:Dd,lights:Ne.lighting.lights,readObjectGlow:gb,applyGlow:bb,glowMemoryRef:fb,applyLightPatches:tg,onControlChange:rg});if((M==="add-text"||M==="add-image")&&Od?.kind===M&&Od.objectId===$a){let L=Od,F=ai(L.objectId);if(!F)return null;let Q=M==="add-image";return Y(yw,{kind:M,decals:(Oe[F]?.decals??[]).filter(ve=>!!ve.image===Q),activeId:L.activeId,error:ig?Qt.message(ig):null,moving:Ld?.objectKey===F&&Ld.decalId===L.activeId,defaultSize:ET(F),...AT(L,F)})}return M==="change-material"&&Ya?Y(nf,{inline:!0,triggerFileUpload:vb,materialPopup:Ya,textureUrl:Ib,clearTexture:yb,canPlaceImage:Bb,offset:Nb,rotationDegrees:jb,onOffsetChange:Vb,onRotationChange:Fb,isPositioning:zb,onEndPositioning:Ub}):null}}),Br("div",{className:`ri-canvasArea ${yr?"ri-canvasArea--measuring":""} ${ri?"":"ri-canvasArea--positioning"} ${st||Ze?"ri-canvasArea--moveMode":""}`,ref:eP,tabIndex:Ft?0:void 0,role:Ft?"group":void 0,"aria-label":Ft?Qt("cameraKeyboardHelp"):void 0,onDoubleClick:GT,onPointerDown:M=>{if(Ft&&Ur.current?.focus({preventScroll:!0}),ar){_T(M);return}ZP(M)},onClick:ar?void 0:eT,onPointerMove:$P,onPointerLeave:ib,onWheel:ib,children:[Pt&&!yr&&t.status==="ready"?Y(yC,{objects:LT,selectedKey:mt,onHighlight:Fd,onSelect:M=>xp(M,"keyboard"),onClearSelection:()=>{vp(),P?.()}}):null,Fa&&!i&&(ar||fT)&&Y("div",{className:"ri-moveZoomHint",role:"status",style:{position:"absolute",top:12,left:"50%",transform:"translateX(-50%)",zIndex:5,padding:"6px 12px",borderRadius:999,fontSize:12,fontWeight:500,color:"#fff",background:ar?"rgba(37, 99, 235, 0.92)":"rgba(0, 0, 0, 0.6)",pointerEvents:"none",whiteSpace:"nowrap"},children:Qt(ar?"texturePositioningHint":"texturePositioningStartHint")}),_g&&!Rg&&Y(YC,{count:cP,onDismiss:()=>kg(!0)}),Qd!==null&&!mP&&Y(KC,{triangles:Qd,offset:_g&&!Rg,onDismiss:()=>Og(!0)}),Zt.model.renderer==="uv-checker"&&Jd.missing>0&&Y(QC,{missing:Jd.missing,total:Jd.total}),Y("input",{ref:bg,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:wT}),Y(ia,{onError:t.fail,children:Oo?Br(Xm,{backend:Oo,onRendererCreated:t.onRendererCreated,suspended:t.status!=="ready",paused:L1&&!bt,camera:pe,backgroundColor:J,shadows:$e&&Ne.shadows.enabled,sceneConfig:Zt,selectedObjectRef:Yi,selectedObjectRefs:bp,selectedObjectOutlineColor:S,hoveredObjectRef:gT,highlightOnHover:Te,renderMode:nr,maxDpr:ir,reduceGpuLoad:q1,runtimeStats:j?{onStats:j,intervalMs:I,profile:en,streamingRef:Ud}:void 0,xrStore:Ul,rendererCaptureRef:Er,preserveDrawingBuffer:Zr,children:[Y(Km,{lightingConfig:Ne.lighting,shadowConfig:Ne.shadows,shadowsEnabled:$e,environmentRotation:Ne.environment.rotation,environmentConfig:Ne.environment,modelBounds:YP,objectBindings:Oe,nodeRefs:Ut}),V1&&Ne.lighting.lights.map(M=>!M.visible||M.type==="none"||M.type==="hemisphere"||M.attachment?null:Y(DC,{light:M,position:M.position,rotation:M.rotation,color:M.color,intensity:M.intensity,visible:M.visible,onPositionChange:L=>Lb(M.id,L,M.rotation),onRotationChange:L=>Lb(M.id,M.position,L),onDraggingChange:mg},M.id)),Y(Zh,{setAside:xr.setAside,nodeRefs:Ut}),!ii&&Y(tf,{section:Ne.section??ss,box:ql,modelRef:Ke,showHandle:Ii,onChange:Jf,onDraggingChange:H1}),Y($m,{controlsRef:ze,onCameraChange:UT,cameraLimits:ft,controllerType:Vi,onPointerLockExit:()=>Rl("orbit"),reducedMotion:ei}),Y(Ef,{enabled:bt||yr||Io||ei||Vi==="pointerLock"?!1:La??Ne.model.autoRotate??!1,speed:k1??Ne.model.autoRotateSpeed??1,controlsRef:ze}),Yt&&!ii&&!bt&&Y(Jv,{getTarget:NT,revision:`${Re}:${Pt}`,lineColor:jT}),Oa&&!bt&&Y(Wx,{onUpdate:()=>{ze.current?.update(0),Er.current?.invalidate()}}),(st||Ze)&&!ii&&!Xl&&Yi&&mt&&Y(yf,{node:Yi,space:kt,moveEnabled:st,gizmoTool:pt,scaleEnabled:Ze,onTransformChange:vT,transform:Oe[mt]?.transform,onDraggingChange:M=>{fg(M),$i&&C?.($i,M)}},mt),(st||Ze)&&!ii&&Xl&&Y(Sf,{entries:Xl,referenceNode:Yi,space:kt,moveEnabled:st,gizmoTool:pt,scaleEnabled:Ze,onTransformChange:yT,onDraggingChange:M=>{fg(M);for(let L of Xl){let F=Oe[L.key];F&&C?.(F,M)}}}),Io&&Y(Rw,{target:Io,nodes:Ut,controls:ze}),(()=>{let M=Dt&&nt?Br(kf,{children:[nt.map(L=>Y($0,{entry:{...L,objectBindings:Be(L)===Re?xr.bindings:zi(L)},isActive:Be(L)===Re,pulses:xr.pulses,decoderConfig:Al,itemMaterials:Ui,sceneConfig:Zt,zoomOnSelected:Le,highlightOnHover:Te,explodeFactor:Do,suspendBindingTransforms:za,onLoadProgress:Ob,onAnimationsReady:qg,onModelAnimationsReady:Ie,onLoadError:zT,onModelLoaded:VT,selectedItem:mt,panelHoveredItem:f??Nl,onItemClick:Cp,onItemDoubleClick:Tp,onItemContextMenu:_p,onItemHover:Pp,nodeRefsOut:Ut,onNodeRefsChange:jd,materialRefsOut:Be(L)===Re?ti:J1(Be(L)),onMergeModelLoaded:Rb,onMergeModelError:Nf},Be(L))),Y(Yu,{anchorSceneRef:Ke,annotations:Uf?Qg:[],sceneConfig:Ne,activeAnnotation:Hl,popupRef:Il,canvasRootRef:Ur,worldPositionsRef:Nd,modelLoaded:Pt,onAnnotationClick:Zg,onCloseAnnotation:Gl,hideCloseButton:Xa,showAnnotationOnHover:le}),Y(pd,{annotation:Jg,enabled:Xa&&!bt,controlsRef:ze,offsetRef:Bd}),bt?Y(na,{controlsRef:ze,sceneRef:Ke,config:bt.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:bt.onStarted,onFinished:bt.onFinished,onProgress:Vg},"video-export"):on&&Y(na,{controlsRef:ze,sceneRef:Ke,config:on,playing:qa&&!yr,resetOnPlay:jg,onFinished:()=>{Jt(!1),ni(!1)},onUserInteract:()=>{Jt(!1)}},"cinematic-preview"),St&&Br(kf,{children:[Y(Ju,{items:El,sceneRef:Ke,modelId:Rd,tilesetUrl:i,settings:Ba,legacyUnit:Zn,revision:up,onResults:ab}),Y(xa,{points:dp,unit:Na.displayUnit,scale:Na.factor,box:ql,showDimensions:hp,tool:pp,areaClosed:mp,snapPreview:yr?nb:null})]})]}):Y(hn,{onLoadError:Ap,children:Br(P1,{fallback:null,children:[i?Y(Gh,{diagnosticsRef:j?Ud:void 0,loadingRef:Gd,url:i,rotation:Zt.model.rotation,errorTarget:o,cacheSize:a,decoderConfig:Al,objectBindings:xr.bindings,itemMaterials:Ui,sceneConfig:Zt,selectedItem:mt,panelHoveredItem:f??Nl,highlightOnHover:Te,onItemClick:Cp,onItemHover:Pp,onItemDoubleClick:Tp,onItemContextMenu:_p,onObjectCatalog:IT,onTilesetBounds:BT,onModelLoaded:jo,onLoadError:Ap,nodeRefsOut:Ut,onNodeRefsChange:jd,materialRefsOut:ti,explodeFactor:Do,suspendBindingTransforms:za}):Y(Is,{url:n,modelFormat:l,objectBindings:xr.bindings,selectedItem:mt,itemMaterials:Ui,onItemClick:Cp,onItemDoubleClick:Tp,onItemContextMenu:_p,onItemHover:Pp,onModelLoaded:jo,onAnimationsReady:qg,nodeRefsOut:Ut,onNodeRefsChange:jd,materialRefsOut:ti,panelHoveredItem:f??Nl,sceneConfig:Zt,zoomOnSelected:Le,highlightOnHover:Te,decoderConfig:Al,onLoadProgress:Ob,explodeFactor:Do,suspendBindingTransforms:za,originalNodePoses:O1,mergeModels:Cd,onMergeModelLoaded:Rb,onMergeModelError:Nf,pulses:xr.pulses}),D1?.map(L=>Y(W0,{url:L,decoderConfig:Al,onLoadError:If,onModelLoaded:Ml?F=>Ml(L,F):void 0},L)),Y(Yu,{anchorSceneRef:Ke,annotations:Uf?Qg:[],sceneConfig:Ne,activeAnnotation:Hl,popupRef:Il,canvasRootRef:Ur,worldPositionsRef:Nd,modelLoaded:Pt,onAnnotationClick:Zg,onCloseAnnotation:Gl,hideCloseButton:Xa,showAnnotationOnHover:le}),Y(pd,{annotation:Jg,enabled:Xa&&!bt,controlsRef:ze,offsetRef:Bd}),bt?Y(na,{controlsRef:ze,sceneRef:Ke,config:bt.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:bt.onStarted,onFinished:bt.onFinished,onProgress:Vg},"video-export"):on&&Y(na,{controlsRef:ze,sceneRef:Ke,config:on,playing:qa&&!yr,resetOnPlay:jg,onFinished:()=>{Jt(!1),ni(!1)},onUserInteract:()=>{Jt(!1)}},"cinematic-preview"),St&&Br(kf,{children:[Y(Ju,{items:El,sceneRef:Ke,modelId:Rd,tilesetUrl:i,settings:Ba,legacyUnit:Zn,revision:up,onResults:ab}),Y(xa,{points:dp,unit:Na.displayUnit,scale:Na.factor,box:ql,showDimensions:hp,tool:pp,areaClosed:mp,snapPreview:yr?nb:null})]})]})},i??n);return Ul?Y(YS,{ref:wP,box:ql,scaleMode:z,onARStateChange:TP,children:M}):M})(),Y(Ax,{controller:an,source:Ke,controls:ze,animations:ip,ready:Pt&&ri,sequences:Ne.sequences,autoPlay:xe&&!ei,authoredRevision:DT}),m&&Y(Sx,{source:Ke,highlights:m}),Kt&&Y(P1,{fallback:null,children:Kt})]}):null}),Y(Wp,{src:Vf??jf,hidden:Pt&&ri}),or&&Y("div",{className:"ri-overlay",children:or}),we&&n&&Wa&&Y(JC,{failure:Ky(qi,i||n,i?void 0:l,e),source:i||n}),Y(Ry,{visible:KT,message:Qt(hP,{millions:Math.round((Qd??0)/1e6)}),progress:gP??void 0}),_r?Wf&&Dp&&U2(Dp,Wf):Dp,MP,ae&&!_r&&!np&&!bt&&!yr&&Xg.length>0&&Y(iv,{controls:an,sequences:Xg}),No.open&&Y(Bx,{handoff:No,filename:oe,onQuickLook:()=>r.requestARLaunch("quick-look")}),!$&&Hg&&Fl&&Y(b1,{url:Fl,onClose:CP}),Rt&&Y(v1,{top:Zi(zo?1:0),active:Id,onToggle:()=>cg(M=>!(M??ja))}),St&&Y(Kh,{top:Zi(Hb),active:yr,disabled:!!bt,tool:pp,snap:qP,pointCount:dp.length,areaClosed:mp,error:UP,showDimensions:hp,onToggle:()=>{Jt(!1),yr||z1?.(),QP()},onTool:GP,onSnap:XP,onUndo:HP,onClear:KP,onFinishArea:WP,onDimensions:JP,onHeight:mT,settings:Ba,displayUnit:Na.displayUnit,onSettings:Qf,items:El,results:oT,onItems:Kf,onSave:tT,canSave:rT,canCalibrate:nT,onCalibrate:iT,onExportJson:aT,onExportCsv:sT,onImport:lT,readOnly:Da!==void 0&&!Ni,settingsReadOnly:xl!==void 0&&!ji}),Cn&&Y(y1,{top:Zi((zo?1:0)+(Rt?1:0)+(Za?1:0)),open:bP,factor:Do,onToggleOpen:()=>Ng(M=>!M),onFactorChange:Bg}),kp&&!ii&&Y(x1,{top:Zi((zo?1:0)+(Rt?1:0)+(Za?1:0)+(Cn?1:0)),section:VP,onChange:Jf}),on&&Y(w1,{top:Zi((zo?1:0)+(Rt?1:0)+(Za?1:0)+(Cn?1:0)+(kp?1:0)),playing:qa,disabled:!!bt||yr,onPlay:()=>{ni(!1),Jt(!0)},onPause:()=>Jt(!1),onStop:FT}),bt&&Y(M1,{progress:yP,onCancel:rp}),!_r&&Dt&&nt&&nt.length>1&&(Ff||Td)&&Y("div",{className:"ri-modelSwitcher",style:{top:`${Zi((zo?1:0)+(Rt?1:0)+(Za?1:0)+(Cn?1:0)+(kp?1:0)+(on?1:0))}px`},role:"group","aria-label":"Switch model",children:nt.map(M=>Y("button",{type:"button",className:`ri-modelSwitcherButton ${Be(M)===Re?"ri-modelSwitcherButton--active":""}`,onClick:()=>Td?Td(Be(M)):Ff?.(M.url),title:`Switch to ${M.label||bd(M.url)}`,"aria-pressed":Be(M)===Re,children:M.label||bd(M.url)},Be(M)))}),(sp||eb||Io||To&&Tn)&&Br("div",{className:`ri-bottomStack ${tb?"ri-bottomStack--aboveButtons":""} ${sp?"ri-bottomStack--annotationFilters":""}`,children:[sp&&Y(i1,{categories:DP,selected:kP,disabled:!!bt,onChange:OP}),Io&&Y(o1,{onCancel:Io.onCancel}),To&&Tn&&Y(a1,{label:Tn.size===1?Qt("isolatedObject",{name:(()=>{let[M]=Tn;return Oe[M]?.label??M})()}):Qt("isolatedObjects",{count:Tn.size}),onShowAll:()=>Sp(null)}),eb&&Y(s1,{groups:Ha,activeVariants:kd,onSelect:W1})]}),tb&&Br("div",{className:"ri-buttonContainer",children:[Y("div",{className:"ri-tourControls",children:W&&lp.length>0&&Y(l1,{count:lp.length,active:Xa,index:EP,navigating:AP,onStart:LP,onPrevious:IP,onNext:BP,onStop:NP})}),Br("div",{className:"mv-rightControls",children:[Ae&&Ll.supported&&Y(c1,{fullscreen:Ll,disabled:!!bt}),K&&Y("button",{className:"mv-resetButton",onClick:Rp,disabled:!!bt,title:Qt("resetCameraView"),children:Y(X2,{})}),Y(u1,{open:$1,current:Vi,disabled:!!bt,onSelect:Rl,onToggle:()=>pg(M=>!M)}),Ue&&Y(d1,{menu:hT,recording:!!bt,hasScene:!!Ke.current,canCaptureImage:Zr||Oo==="webgpu",canRecord:Pt&&ri&&!Vl,hasCinematic:!!on,hasMultipleModels:!!(nt&&nt.length>=2)})]})]}),Xi&&Y(p1,{x:$T,y:YT,form:_P,setForm:ap,onOk:jP,onCancel:zP})]}),De&&Gr&&Y(rf,{colorPicker:Gr,onClose:sn,itemMaterials:Ui,setItemMaterials:Bl}),De&&Ya&&Y(nf,{triggerFileUpload:vb,materialPopup:Ya,textureUrl:Ib,clearTexture:yb,canPlaceImage:Bb,offset:Nb,rotationDegrees:jb,onOffsetChange:Vb,onRotationChange:Fb,isPositioning:zb,onEndPositioning:Ub})]}),Jl&&Bo&&Qi?Y(ZS,{product:pr.product,options:Jl,onSelectionsChange:kT,top:ie?56:12},Qi):null,ie&&Y("div",{className:"ri-viewerRight",inert:t.status!=="ready",children:He?He({objectBindings:Oe,onAction:Kl,onFocus:Pb,onHover:Fd}):Y(cf,{objectBindings:Oe,onAction:Kl,onFocus:Pb,onHover:Fd,isolatedKeys:Tn,onIsolate:To?OT:void 0})}),qe&&Y(KS,{controlsRef:ze,enabled:t.status==="ready",opacity:ot,moveSensitivity:ee,position:Ye})]})}import{useState as vd}from"react";import{ArrowRight as eN,ChevronRight as tN,Download as rN}from"lucide-react";import{jsx as yt,jsxs as Ct}from"react/jsx-runtime";function yd(e){return e===void 0?"Not set":JSON.stringify(e)}var Df={changes:"Changes only",all:"All objects",added:"Added",removed:"Removed",modified:"Modified",unchanged:"Unchanged",ambiguous:"Unmatched"},T1={all:"All categories",identity:"Identity",appearance:"Appearance",transform:"Transform",visibility:"Visibility",data:"Data",behavior:"Behavior"};function _1({change:e}){return Ct("div",{className:"ri-semanticPanel__change",children:[yt("code",{title:e.path,children:e.path}),Ct("span",{children:[yt("del",{title:yd(e.before),children:yd(e.before)}),yt(eN,{size:11,"aria-hidden":"true"}),yt("ins",{title:yd(e.after),children:yd(e.after)})]})]})}function CK({report:e,selected:t,onSelect:r,onClear:n,matchBy:i,onMatchByChange:o,showOutlines:a,onShowOutlinesChange:s}){let[l,d]=vd(!0),[u,p]=vd(""),[c,h]=vd("changes"),[m,b]=vd("all"),y=e.objects.filter(f=>(c==="all"||(c==="changes"?f.status!=="unchanged":f.status===c))&&(m==="all"||f.changes.some(g=>g.category===m))&&`${f.label} ${f.identity}`.toLowerCase().includes(u.toLowerCase())),S=()=>{let f=URL.createObjectURL(new Blob([JSON.stringify(e,null,2)],{type:"application/json"})),g=document.createElement("a");g.href=f,g.download="configuration-comparison.json",g.click(),setTimeout(()=>URL.revokeObjectURL(f),1e3)};return Ct("aside",{className:"ri-semanticPanel","aria-label":"Configuration comparison",onPointerDown:f=>f.stopPropagation(),children:[Ct("button",{className:"ri-semanticPanel__heading",type:"button","aria-expanded":l,onClick:()=>d(!l),children:[yt(tN,{size:13,"aria-hidden":"true",className:l?"ri-semanticPanel__chevron--open":void 0}),"Changes",Ct("span",{className:"ri-semanticPanel__counts",children:[Ct("span",{"data-status":"added",title:`${e.counts.added} added`,children:["+",e.counts.added]}),Ct("span",{"data-status":"removed",title:`${e.counts.removed} removed`,children:["\u2212",e.counts.removed]}),Ct("span",{"data-status":"modified",title:`${e.counts.modified} modified`,children:["~",e.counts.modified]})]})]}),l&&Ct("div",{className:"ri-semanticPanel__body",children:[o&&Ct("details",{children:[yt("summary",{children:"Matching"}),Ct("label",{children:["Match by",Ct("select",{"aria-label":"Match objects by",value:typeof i=="object"?"metadata":i??"modelObjectId",onChange:f=>o(f.target.value==="metadata"?{metadataKey:"partId"}:f.target.value),children:[yt("option",{value:"modelObjectId",children:"Model object ID"}),yt("option",{value:"id",children:"Binding ID"}),yt("option",{value:"metadata",children:"Metadata value"})]})]}),typeof i=="object"&&Ct("label",{children:["Key",yt("input",{"aria-label":"Comparison metadata key",value:i.metadataKey,onChange:f=>o({metadataKey:f.target.value})})]})]}),yt("input",{className:"ri-semanticPanel__search","aria-label":"Search comparison",placeholder:"Filter objects",value:u,onChange:f=>p(f.target.value)}),Ct("div",{className:"ri-semanticPanel__filters",children:[yt("select",{"aria-label":"Filter comparison status",value:c,onChange:f=>h(f.target.value),children:Object.keys(Df).map(f=>yt("option",{value:f,children:Df[f]},f))}),yt("select",{"aria-label":"Filter change category",value:m,onChange:f=>b(f.target.value),children:Object.keys(T1).map(f=>yt("option",{value:f,children:T1[f]},f))})]}),Ct("div",{className:"ri-semanticPanel__rows",children:[y.map(f=>Ct("div",{className:"ri-semanticPanel__row","data-status":f.status,children:[Ct("button",{type:"button","aria-pressed":t===f.id,onClick:()=>r(f),children:[yt("span",{children:f.label}),yt("small",{children:Df[f.status]})]}),t===f.id&&Ct("div",{className:"ri-semanticPanel__details",children:[f.message&&yt("p",{children:f.message}),f.changes.map(g=>yt(_1,{change:g},g.path)),!f.changes.length&&!f.message&&yt("p",{children:f.status==="unchanged"?"No authored changes.":`Object ${f.status}.`})]})]},f.id)),!y.length&&yt("p",{className:"ri-semanticPanel__empty",children:"No matching objects."})]}),e.sceneChanges.length>0&&Ct("details",{children:[Ct("summary",{children:["Scene changes (",e.sceneChanges.length,")"]}),yt("div",{className:"ri-semanticPanel__details",children:e.sceneChanges.map(f=>yt(_1,{change:f},f.path))})]}),Ct("div",{className:"ri-semanticPanel__footer",title:"Compares authored bindings and settings. Geometry changes inside model files are not detected.",children:[Ct("label",{className:"ri-semanticPanel__outlineToggle",children:[yt("input",{type:"checkbox",checked:a,onChange:f=>s(f.target.checked)}),"Outlines"]}),t&&n&&yt("button",{type:"button",onClick:n,children:"Clear focus"}),Ct("button",{type:"button",onClick:S,children:[yt(rN,{size:12,"aria-hidden":"true"}),"Report"]})]})]})]})}import{Vector3 as xd}from"three";var vl=1e-6;function EK(){let e=[null,null],t=0,r=!1,n=new xd,i=new xd,o=new xd,a=new xd,s=(d,u)=>{let p=e[d],c=e[u];if(!p||!c)return;p.controls.getPosition(n,!1),p.controls.getTarget(o,!1),c.controls.getPosition(i,!1),c.controls.getTarget(a,!1);let h=p.controls.camera.zoom,m=p.controls.camera.fov,b=typeof m=="number"&&typeof c.controls.camera.fov=="number"&&Math.abs(m-c.controls.camera.fov)>=vl;if(!(n.distanceToSquared(i)<vl&&o.distanceToSquared(a)<vl&&Math.abs(h-c.controls.camera.zoom)<vl&&!b)){r=!0;try{b&&(c.controls.camera.fov=m,c.controls.camera.updateProjectionMatrix?.()),Math.abs(h-c.controls.camera.zoom)>=vl&&c.controls.zoomTo(h,!1),c.controls.setLookAt(n.x,n.y,n.z,o.x,o.y,o.z,!1)}finally{r=!1}c.invalidate()}},l=d=>{r||(d===t?s(d,1-d):s(t,d))};return{attach(d,u,p){let c=e[d];if(c?.controls===u){c.invalidate=p;return}c?.detach();let h=()=>l(d),m=()=>{t=d};u.addEventListener("update",h),u.addEventListener("controlstart",m),e[d]={controls:u,invalidate:p,detach:()=>{u.removeEventListener("update",h),u.removeEventListener("controlstart",m)}},s(t,1-t)},setLeader(d){t=d},get leader(){return t},detach(){e.forEach(d=>d?.detach()),e[0]=e[1]=null}}}import{Fragment as nN,jsx as Of,jsxs as R1}from"react/jsx-runtime";var wd=.05,E1=.2,A1=e=>Math.min(Math.max(Number.isFinite(e)?e:.5,0),1);function kK({split:e,onSplitChange:t,labels:r,containerRef:n,beforeAction:i}){let o=ue(),a=p=>{let c=n.current?.getBoundingClientRect();c&&c.width>0&&t(A1((p-c.left)/c.width))},s=p=>{p.preventDefault(),p.stopPropagation(),p.currentTarget.setPointerCapture(p.pointerId),p.currentTarget.focus(),a(p.clientX)},l=p=>{p.currentTarget.hasPointerCapture(p.pointerId)&&a(p.clientX)},d=p=>{let c={ArrowLeft:e-wd,ArrowDown:e-wd,ArrowRight:e+wd,ArrowUp:e+wd,PageDown:e-E1,PageUp:e+E1,Home:0,End:1}[p.key];c!==void 0&&(p.preventDefault(),p.stopPropagation(),t(A1(c)))},u=Math.round(e*100);return R1(nN,{children:[R1("span",{className:"ri-compare__label ri-compare__label--before",hidden:e<.08,children:[r[0],i]}),Of("span",{className:"ri-compare__label ri-compare__label--after",hidden:e>.92,children:r[1]}),Of("div",{className:"ri-compare__divider",role:"slider",tabIndex:0,"aria-label":o("compareDivider"),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":u,"aria-valuetext":o("compareDividerValue",{before:r[0],after:r[1],percent:u,rest:100-u}),onPointerDown:s,onPointerMove:l,onKeyDown:d,children:Of("span",{className:"ri-compare__handle","aria-hidden":"true"})})]})}export{AN as a,_c as b,tm as c,Ky as d,ZT as e,gw as f,dn as g,Ow as h,po as i,cu as j,jU as k,ux as l,Xy as m,Qp as n,ff as o,LB as p,RC as q,px as r,hx as s,h1 as t,bx as u,Dc as v,Q2 as w,CK as x,EK as y,A1 as z,kK as A,WN as B,c_ as C};