cozyclay 3.1.0 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/bin/agent/agent-routes.mjs +12 -11
  3. package/bin/agent/main-agent.mjs +21 -7
  4. package/bin/agent/main-prompt.mjs +7 -6
  5. package/bin/agent/plan-tool.mjs +114 -0
  6. package/bin/agent/script-tool.mjs +4 -1
  7. package/bin/agent/sculpt-sketch.mjs +190 -0
  8. package/bin/agent/session-store.mjs +2 -1
  9. package/bin/agent/sketch-code.mjs +151 -0
  10. package/bin/agent/sketch-sandbox.mjs +102 -0
  11. package/bin/agent/studio-prompt.mjs +1 -1
  12. package/bin/agent/studio-rebase.mjs +5 -4
  13. package/bin/agent/studio-task-routes.mjs +1 -1
  14. package/bin/agent/studio-tasks.mjs +116 -25
  15. package/bin/agent/studio-tools.mjs +3 -2
  16. package/bin/agent/turn-frames.mjs +4 -0
  17. package/bin/cozyclay.mjs +4 -2
  18. package/bin/live-endpoint.mjs +2 -0
  19. package/dist/app/index.html +6 -6
  20. package/dist/assets/{TaskBoard-DdDXMgZm.js → TaskBoard-GR8xZm5c.js} +1 -1
  21. package/dist/assets/{app-BlwOpest.css → app-Bhe0TpGz.css} +1 -1
  22. package/dist/assets/app-C4QTcDcb.js +5144 -0
  23. package/dist/assets/compile-worker-oy_P9HHh.js +6 -0
  24. package/dist/assets/motion3-compile-dgGhrvPK.js +1 -0
  25. package/dist/assets/scene-asset-sync-BEjjhNEo.css +1 -0
  26. package/dist/assets/scene-asset-sync-qoxcdrhj.js +13 -0
  27. package/dist/assets/task-board-BqReHzOi.js +15 -0
  28. package/dist/assets/workflow-C87p6E1E.js +179 -0
  29. package/dist/cozyclay-package.json +1 -1
  30. package/dist/index.html +1 -1
  31. package/dist/sitemap.xml +1 -1
  32. package/dist/workflow/index.html +4 -4
  33. package/mcp/README.md +1 -1
  34. package/mcp/live-hub.mjs +5 -3
  35. package/mcp/tool-handlers.mjs +7 -7
  36. package/package.json +3 -1
  37. package/src/App.jsx +44 -66
  38. package/src/bus-task-scopes.js +59 -11
  39. package/src/bus-task-targets.js +35 -9
  40. package/src/bus-tasks.js +23 -10
  41. package/src/command-bus.js +7 -4
  42. package/src/commands/ai.js +1 -1
  43. package/src/commands/elements.js +4 -3
  44. package/src/commands/export.js +1 -1
  45. package/src/commands/motion3.js +27 -7
  46. package/src/commands/objects.js +1 -1
  47. package/src/export-workspace.js +244 -0
  48. package/src/keyframe-pack.js +5 -1
  49. package/src/live-control.js +14 -7
  50. package/src/material-look.js +189 -0
  51. package/src/material-presets.js +78 -0
  52. package/src/material-textures.js +157 -0
  53. package/src/motion3/compile-job.js +15 -3
  54. package/src/motion3/compiler/channels.js +74 -24
  55. package/src/motion3/compiler/compile.js +2 -1
  56. package/src/motion3/compiler/idle.js +2 -0
  57. package/src/motion3/compiler/overlap.js +180 -0
  58. package/src/motion3/compiler/pose.js +6 -4
  59. package/src/motion3/compiler/validate-common.js +1 -0
  60. package/src/motion3/compiler/validate-parts.js +5 -1
  61. package/src/motion3/compiler/validate.js +30 -10
  62. package/src/motion3/correct.js +236 -0
  63. package/src/motion3/docs.js +8 -6
  64. package/src/motion3/face-lean.js +31 -0
  65. package/src/motion3/fix/index.js +5 -1
  66. package/src/motion3/fix/reach-body.js +172 -0
  67. package/src/motion3/hint-check.js +44 -0
  68. package/src/motion3/json-patch.js +120 -12
  69. package/src/motion3/lenient.js +46 -4
  70. package/src/motion3/object-keys.js +17 -5
  71. package/src/motion3/pipeline.js +46 -9
  72. package/src/motion3/qa/arm-checks.js +96 -0
  73. package/src/motion3/qa/asked.js +113 -0
  74. package/src/motion3/qa/goals.js +37 -8
  75. package/src/motion3/qa/hints-goal.js +6 -5
  76. package/src/motion3/qa/index.js +5 -2
  77. package/src/motion3/qa/key-checks.js +4 -3
  78. package/src/motion3/qa/motion-life.js +243 -0
  79. package/src/motion3/qa/spec-checks.js +15 -9
  80. package/src/motion3/qa/verdict.js +50 -0
  81. package/src/motion3/refs.js +38 -14
  82. package/src/motion3/repair-watch.js +132 -0
  83. package/src/motion3/repair.js +52 -19
  84. package/src/motion3/report.js +50 -9
  85. package/src/motion3/schema/topics.js +6 -4
  86. package/src/motion3/schema/types.js +1 -1
  87. package/src/motion3/skills/basic.js +15 -8
  88. package/src/motion3/skills/index.js +52 -18
  89. package/src/motion3/skills/info.js +1 -1
  90. package/src/motion3/skills/stance.js +6 -0
  91. package/src/motion3/skills/walk-fit.js +170 -0
  92. package/src/object-look.js +9 -5
  93. package/src/panels/PoseImagePanel.jsx +3 -2
  94. package/src/panels/SculptPanel.jsx +2 -2
  95. package/src/primitive-look.js +38 -0
  96. package/src/props.jsx +20 -28
  97. package/src/render-passes.js +7 -1
  98. package/src/result-modal.jsx +3 -3
  99. package/src/scene-objects.js +2 -2
  100. package/src/sculpt-colours.js +65 -0
  101. package/src/sculpt-compare.js +13 -50
  102. package/src/sculpt-csg.js +112 -0
  103. package/src/sculpt-curve.js +123 -0
  104. package/src/sculpt-cutters.js +43 -0
  105. package/src/sculpt-detail.js +207 -0
  106. package/src/sculpt-geometry-loft-convex.js +100 -0
  107. package/src/sculpt-geometry-shapes.js +250 -0
  108. package/src/sculpt-geometry.js +33 -15
  109. package/src/sculpt-loft-rings.js +225 -0
  110. package/src/sculpt-noise.js +65 -0
  111. package/src/sculpt-part-fields.js +27 -0
  112. package/src/sculpt-recipe-read.js +65 -0
  113. package/src/sculpt-recipe.js +33 -75
  114. package/src/sculpt-run.js +1 -1
  115. package/src/sculpt-scatter-items.js +183 -0
  116. package/src/sculpt-scatter-shape.js +57 -0
  117. package/src/sculpt-scatter.js +124 -0
  118. package/src/sculpt-shapes-curved.js +211 -0
  119. package/src/sculpt-shapes-loft-convex.js +218 -0
  120. package/src/sculpt-shapes.js +138 -0
  121. package/src/sculpt-sketch-state.js +76 -0
  122. package/src/sculpt-sketch.jsx +124 -0
  123. package/src/sculpt-surface-fields.js +65 -0
  124. package/src/shell/ExportFolderPreference.jsx +103 -0
  125. package/src/shell/PreferencesDialog.jsx +3 -166
  126. package/src/shell/StatusBar.jsx +1 -1
  127. package/src/shell/preference-controls.jsx +114 -0
  128. package/src/shell/preference-pages.jsx +72 -0
  129. package/src/shell/preferences.css +46 -0
  130. package/src/shot-prompt.js +29 -9
  131. package/src/studio-actions.js +2 -2
  132. package/src/studio-agent-motion.js +19 -9
  133. package/src/studio-agent-protocol.js +1 -1
  134. package/src/studio-app-binding.js +3 -2
  135. package/src/studio-elements.js +5 -1
  136. package/src/workflow/AgentPanel.jsx +6 -6
  137. package/src/workflow/AgentPlanCard.jsx +41 -0
  138. package/src/workflow/CozySceneNode.jsx +1 -1
  139. package/src/workflow/WorkflowBuilder.jsx +2 -2
  140. package/src/workflow/agent-client.js +14 -11
  141. package/src/workflow/agent-plan.css +93 -0
  142. package/src/workflow/agent-plan.js +59 -0
  143. package/src/workflow/keyframe-pack-request.js +3 -10
  144. package/src/workflow/task-board.css +1 -1
  145. package/src/workflow/task-board.js +7 -5
  146. package/tools/loc-baseline.json +1 -2
  147. package/tools/run-tests.mjs +8 -8
  148. package/dist/assets/app-B2BpfCl2.js +0 -5088
  149. package/dist/assets/compile-worker-D0pKioa0.js +0 -5
  150. package/dist/assets/motion3-compile-B887n77J.js +0 -1
  151. package/dist/assets/scene-asset-sync-COGOlF5T.css +0 -1
  152. package/dist/assets/scene-asset-sync-CQzEdsqu.js +0 -13
  153. package/dist/assets/task-board-BKaM7d-9.js +0 -14
  154. package/dist/assets/workflow-B8Dhzexj.js +0 -179
@@ -1,14 +0,0 @@
1
- import{t as e}from"./rolldown-runtime-hePW80VL.js";var t=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ee=/\/+/g;function te(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function ne(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function re(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,re(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+te(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(ee,`$&/`)+`/`),re(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ee,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u<e.length;u++)a=e[u],s=l+te(a,u),c+=re(a,r,i,s,o);else if(u=m(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+te(a,u++),c+=re(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return re(ne(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function ie(e,t,n){if(e==null)return e;var r=[],i=0;return re(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function ae(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t)},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var oe=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)},se={map:ie,forEach:function(e,t,n){ie(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return ie(e,function(){t++}),t},toArray:function(e){return ie(e,function(e){return e})||[]},only:function(e){if(!O(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=se,e.Component=v,e.Fragment=r,e.Profiler=a,e.PureComponent=b,e.StrictMode=i,e.Suspense=l,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=w,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return w.H.useMemoCache(e)}},e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=g({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!T.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return E(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)T.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return E(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=O,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:ae}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=function(e){var t=w.T,n={};w.T=n;try{var r=e(),i=w.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(C,oe)}catch(e){oe(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),w.T=t}},e.unstable_useCacheRefresh=function(){return w.H.useCacheRefresh()},e.use=function(e){return w.H.use(e)},e.useActionState=function(e,t,n){return w.H.useActionState(e,t,n)},e.useCallback=function(e,t){return w.H.useCallback(e,t)},e.useContext=function(e){return w.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return w.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return w.H.useEffect(e,t)},e.useEffectEvent=function(e){return w.H.useEffectEvent(e)},e.useId=function(){return w.H.useId()},e.useImperativeHandle=function(e,t,n){return w.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return w.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return w.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return w.H.useMemo(e,t)},e.useOptimistic=function(e,t){return w.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return w.H.useReducer(e,t,n)},e.useRef=function(e){return w.H.useRef(e)},e.useState=function(e){return w.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return w.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return w.H.useTransition()},e.version=`19.2.8`})),n=e(((e,n)=>{n.exports=t()})),r=e=>e&&typeof e==`object`?Object.freeze({...e}):e,i=Object.freeze([{path:`character.position`,type:`vec3`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`,min:{x:-240,y:0,z:-240},max:{x:240,y:240,z:240},gizmo:{min:{x:-4,y:0,z:-4},max:{x:4,y:240,z:4}},note:`y is the feet`},{path:`character.rot`,type:`number`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`,min:-180,max:180,angle:!0,note:`yaw degrees, wrapped at the upper bound`},{path:`character.scale`,type:`number`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`,min:.2,max:3},{path:`character.subject`,type:`string`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`},{path:`character.hidden`,type:`boolean`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`},{path:`character.parent`,type:`id`,nullable:!0,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`,note:`scene object id the character is grouped under and rides; null stands in the world`},{path:`character.model`,type:`enum`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`,enum:[`y-bot-tpose`,`x-bot-tpose`,`proxy-figure`]},{path:`character.posture`,type:`enum`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`,enum:[`stand`,`sit`,`lie`]},{path:`character.tint`,type:`color`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`},{path:`character.identityImage`,type:`image`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`,note:`data:image only`},{path:`character.pose`,type:`id`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`},{path:`character.waypoints`,type:`array`,persisted:!0,undoDomain:`cast`,normalizer:`createCharacterEntry`,actions:[`character.addWaypoint`,`character.moveWaypoint`,`character.removeWaypoint`,`character.clearWaypoints`],note:`root path pins, addressed by frame`},{path:`character.sessionMotion`,type:`array`,persisted:!1,undoDomain:`cast`,normalizer:`createCharacterEntry`,note:`dropped by createCharacterEntry`},{path:`character.ikKeys`,type:`array`,persisted:!1,undoDomain:`cast`,normalizer:`createCharacterEntry`,actions:[`character.setIkKey`,`character.removeIkKey`,`character.clearIkKeys`],note:`dropped by createCharacterEntry; keys travel as JSON quaternions/positions`},{path:`object.renderer`,type:`enum`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,enum:[`cube`,`sphere`,`capsule`,`cylinder`,`cone`,`plane`,`empty`,`light`,`effect`,`text`],note:`light is made from catalogue kind point-light or spot-light; effect (smoke, fire, rain, trail...) from kind effect; text (words, a sign, a logo) from kind text`},{path:`object.position`,type:`vec3`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,min:{x:-240,y:0,z:-240},max:{x:240,y:240,z:240},note:`y is the object's base: y=0 rests on the floor; height/supportY rise from it`},{path:`object.rotation`,type:`vec3`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,min:{x:-180,y:-180,z:-180},max:{x:180,y:180,z:180},angle:!0,note:`rot/rotX/rotZ degrees, wrapped at the upper bound`},{path:`object.scale`,type:`vec3`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,min:{x:.01,y:.01,z:.01},max:{x:100,y:100,z:100}},{path:`object.name`,type:`string`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`},{path:`object.color`,type:`color`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`},{path:`object.opacity`,type:`number`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,min:.05,max:1,note:`1 is solid; lower is see-through, e.g. 0.3 for clear glass`},{path:`object.parent`,type:`id`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`},{path:`object.attach`,type:`id`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,actions:[`object.attach`,`object.detach`],note:`carried by a character's root or bone; channels convert so the prop stays put`},{path:`object.path`,type:`array`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`},{path:`object.remove`,type:`boolean`,persisted:!0,undoDomain:`objects`,normalizer:null,note:`lifecycle operation, not a document field`},{path:`object.cutout`,type:`image`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,actions:[`asset.import`],note:`assetId-backed cutout record; imported pictures and models are placed by asset.import`},{path:`object.light`,type:`object`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,note:`renderer light only. { type point|spot, color, intensity 0..1000 candela (lighter 0.45, candle 0.3, desk lamp 5, street lamp 40), range m (0 none), angle 1..89 deg spot half-angle, softness 0..1, shadow (first 2 lights only; inside a solid record it is blocked: receipt LIGHT_BLOCKED), flicker 0..1 (lighter 0.6), aim {x,y,z} world point or null = local -Y }, e.g. { intensity: 40, aim: { x: 0, y: 0, z: 1 } }; a take level track scales it`},{path:`object.glow`,type:`object`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,note:`any record: self-lit colour plus additive halo, same under any stage light; casts no shadow, so a light inside a glowing bulb shines out. { color, intensity 0..20, halo 0..4 x the record's radius }, e.g. ember { color: "#ff5a1f", intensity: 6, halo: 2 }; null removes; a take level track scales it`},{path:`object.text`,type:`object`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,note:`renderer text only: words in one record, e.g. object.add { kind: "text", text: { value: "CozyClay", size: 0.4 }, placement: { x, y, z, rot } }. { value: the words (up to 200 characters, \\n starts a line), size m height of a capital letter (default 0.3), depth m (0 = flat lettering in any script, default; above 0 = solid letters for Latin, digits and punctuation, and words with other characters stay flat), align left|center|right for several lines }. The record's footprint and height are measured from the words: x is the centre, y the bottom of the lowest line, and the letters face local +z and read toward local +x, so on a side facing +x set rot 90. Flat lettering on a surface: keep it 3 mm or more off the face. color is the letters' colour`},{path:`object.grasp`,type:`object`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,note:`grasp sockets: where a hand takes hold of the record, in its own axes (m from the base pivot), moving and saving with it. { <name>: { at: [x,y,z], axis?: [x,y,z] the line across the palm (a bar, a handle), from?: [x,y,z] the side the hand comes from (the palm faces against it), thumb?: [x,y,z] the axis end the thumb takes } }, at most 8; null removes. A motion spec anchor { kind: "object", object, socket: <name>, grasp } takes a hand by one; a thin body (a bar, a can, a handle) is a socket of its own, named by its id`},{path:`object.effect`,type:`object`,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,note:`renderer effect only (object.add kind "effect"). { preset: smoke|exhale|steam|fire|sparks|dust|rain|snow|trail, rate particles/s, life s, size m start diameter, grow end/start size, speed m/s along the record's local +Y (rotX 90 aims +Z), spread 0..1 cone, gravity m/s2 (+ falls, - rises), wind {x,y,z} m/s, color, opacity 0..1, additive (emissive: fire, sparks), seed int, area {x,y,z} m birth box (rain/snow/dust fall through it from its top), width m trail ribbon across local Y }. A new preset loads its defaults and fields in the same set override them, e.g. { preset: "fire", rate: 40 }; the record stores the merged numbers. Particles are born where the record is at each frame (route, parent, take carry), only while it and its parents are shown, at rate x the take level. To emit from the body (a breath at the mouth), a motion spec entry objects.<id> = { follow: "landmark:mouth", aim: "face" } moves it there every frame. Measure with inspect_studio { scope: "entities", ids }: effect { frame (the playhead), alive, emitter [x,y,z], bounds { min, max } m }`},{path:`stage.keyLight.x`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:-30,max:30},{path:`stage.keyLight.y`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:.5,max:30},{path:`stage.keyLight.z`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:-30,max:30},{path:`stage.keyLight.intensity`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:4},{path:`stage.keyLight.warmth`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:1},{path:`stage.environmentImage`,type:`image`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`data:image only`},{path:`stage.environment`,type:`string`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`location description every shot prompt is built from`},{path:`stage.style`,type:`string`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`look / style line for shot prompts`},{path:`stage.hasEnvSheet`,type:`boolean`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`author supplies an environment sheet instead of a description`},{path:`stage.camera`,documentPath:`shotAspect`,type:`enum`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,enum:[`16:9`,`2.39:1`,`9:16`,`1:1`,`4:3`,`12:7`,`fal 480P`],note:`output aspect ratio`},{path:`stage.cameraPresetId`,type:`id`,nullable:!0,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`},{path:`stage.sensorId`,type:`enum`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,enum:[`super16`,`super35`,`fullFrame`,`65mm`]},{path:`stage.keyLight.color`,type:`color`,nullable:!0,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`key light colour #rrggbb, overrides warmth, e.g. "#9db6e6" cool moonlight or "#ffad5c" low sun; null = white tinted by warmth`},{path:`stage.lighting.preset`,type:`enum`,persisted:!0,readOnly:!0,undoDomain:`stage`,normalizer:`createSceneStage`,enum:[`studio`,`day`,`overcast`,`golden`,`dusk`,`night`,`interior`,`stage`],note:`label of the last recipe stage.applyLighting applied; studio is the neutral grey default`},{path:`stage.lighting.sky`,type:`color`,nullable:!0,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`background and fog colour at the horizon, e.g. "#0b1426" night; null = the UI theme's studio grey`},{path:`stage.lighting.skyTop`,type:`color`,nullable:!0,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`sky colour overhead: shot camera and exports grade from sky at the horizon to this, e.g. "#020408"; null = flat sky`},{path:`stage.lighting.ambient`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:3,note:`multiplier on the hemisphere and ambient light; 1 = studio, 0.6 = night, 0 = black stage`},{path:`stage.lighting.hemiSky`,type:`color`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`hemisphere light from above, e.g. "#34507f" cool night sky; studio "#ffffff"`},{path:`stage.lighting.hemiGround`,type:`color`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`hemisphere bounce from below, e.g. "#6e5136" warm ground; studio "#5a5d64"`},{path:`stage.lighting.fill`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:3,note:`multiplier on the fixed fill and rim lights; 1 = studio, 0 = key only`},{path:`stage.lighting.fog`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:1,note:`haze 0..1 fading the set into the sky colour: 0 = far horizon only, 0.45 = from ~18 m to ~38 m, 1 = from 2 m to 14 m`},{path:`stage.lighting.exposure`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:.2,max:3,note:`camera exposure multiplier on lit surfaces; 1 = studio, e.g. 1.4 to lift a dark frame`},{path:`stage.lighting.shadowSoftness`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:1,note:`key shadow penumbra; 0 = crisp (studio), 0.75 = soft moonlight, 1 = overcast`},{path:`stage.lighting.envLight`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:2,note:`sky environment light on every surface: a map from sky, skyTop, hemiGround and a glow toward the key (sun or moon) tints and fills clay from all sides; it takes over the flat hemisphere as it rises. 0 = hemisphere only (studio), 1 = the map alone at the same brightness (every other recipe), e.g. 1.4 for a brighter fill`},{path:`stage.lighting.ao`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:1,note:`ambient occlusion strength: contact darkening within ~0.5 m where a body meets the floor or a prop and in creases (armpits, the back of a squat's knees), in the viewport and every export. 0 = off (studio), 0.8 = most recipes, 1 = overcast`},{path:`stage.lighting.hdr`,type:`id`,nullable:!0,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`HDR environment map that replaces the sky environment light: a built-in ("builtin:night-street", "builtin:overcast-field", "builtin:studio-softbox") or a file the user loaded ("hdr-<32 hex>"); inspect_studio { scope: "catalogue" } environments lists them with each map's brightest direction. It lights the set only while envLight > 0 (its light = map x hdrIntensity x envLight; studio has envLight 0, so set envLight 1). stage.applyLighting clears it unless keep has "lighting.hdr". null = the look's own sky`},{path:`stage.lighting.hdrRotation`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:-180,max:180,angle:!0,note:`degrees the HDR map turns about the vertical axis, light and backdrop together: +90 carries a light at +x (screen right from the default camera) to -z (behind the subject), so a brightest [x, y, z] lands at [x cos r + z sin r, y, z cos r - x sin r]; wrapped at the upper bound`},{path:`stage.lighting.hdrIntensity`,type:`number`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,min:0,max:4,note:`multiplier on the HDR map's radiance in its light and its backdrop; 1 = the file as authored, e.g. 0.5 to calm a bright daylight map`},{path:`stage.lighting.hdrBackground`,type:`boolean`,persisted:!0,undoDomain:`stage`,normalizer:`createSceneStage`,note:`true = the HDR map is the backdrop behind the set (the floor fades into its horizon), in the viewport, shot and every export; false = keep the look's sky as the backdrop and use the map only as light`},{path:`shot.crud`,type:`array`,persisted:!0,undoDomain:`shot`,normalizer:null,actions:[`shot.create`,`shot.split`,`shot.duplicate`,`shot.remove`,`shot.setRange`,`shot.reorder`],note:`create/split/duplicate/reorder/remove/range through the shared action registry`},{path:`shot.cameraKeys`,type:`array`,persisted:!0,undoDomain:`shot`,normalizer:null,frameMin:0},{path:`shot.cameraRail`,type:`array`,persisted:!0,undoDomain:`shot`,normalizer:`repairCamera`,actions:[`shot.setCameraRail`,`shot.clearCameraRail`],note:`rail points; crane/dolly timing follow the shot's camera block`},{path:`shot.targetModel`,type:`id`,persisted:!0,undoDomain:`shot`,normalizer:`repairCamera`},{path:`shot.kind`,type:`enum`,persisted:!0,undoDomain:`shot`,normalizer:null,readOnly:!0,enum:[`clip`,`still`],note:`clip or still; a still holds one picture for endFrame - startFrame + 1 frames`},{path:`shot.caption`,type:`string`,persisted:!0,undoDomain:`shot`,normalizer:null,readOnly:!0,note:`trimmed, at most 500 characters`},{path:`shot.cast`,type:`array`,persisted:!0,undoDomain:`shot`,normalizer:null,readOnly:!0,note:`per-shot placement overrides keyed by character id: { x, z, rot, posture?, pose? }`},{path:`shot.stylizedAssetId`,type:`id`,nullable:!0,persisted:!0,undoDomain:`shot`,normalizer:null,readOnly:!0,note:`image asset id only`},{path:`shot.freeCamera`,type:`vec3`,persisted:!1,undoDomain:`shot`,normalizer:null,note:`transient until keyed`},{path:`scenes`,type:`array`,persisted:!0,undoDomain:null,normalizer:null,actions:[`scene.create`,`scene.duplicate`,`scene.rename`,`scene.delete`,`scene.switch`],note:`the project's scene list and the open scene; outside the undo history`},{path:`project`,type:`string`,persisted:!0,undoDomain:null,normalizer:null,actions:[`project.save`],note:`save to the current project file; opening one needs the user's file picker`},{path:`selection`,type:`id`,persisted:!1,undoDomain:null,normalizer:null},{path:`timeline`,type:`number`,persisted:!1,undoDomain:null,normalizer:null},{path:`view.mode`,type:`enum`,persisted:!1,undoDomain:null,normalizer:null,enum:[`scene`,`pose`,`camera`,`motion`]},{path:`view.partColoursGuideModeInset`,type:`array`,persisted:!1,undoDomain:null,normalizer:null,actions:[`view.setPartColours`,`view.setGuideMode`,`view.setInset`,`view.setGhosts`],note:`partColours/guideMode/inset/ghosts; viewer settings, not document fields`},{path:`read.sceneDescription`,type:`string`,persisted:!1,undoDomain:null,normalizer:null},{path:`read.captureFrame`,type:`image`,persisted:!1,undoDomain:null,normalizer:null},{path:`undo`,type:`boolean`,persisted:!1,undoDomain:null,normalizer:null}].map(e=>Object.freeze({...e,...e.enum?{enum:Object.freeze([...e.enum])}:{},...e.actions?{actions:Object.freeze([...e.actions])}:{},...e.min&&typeof e.min==`object`?{min:r(e.min)}:{},...e.max&&typeof e.max==`object`?{max:r(e.max)}:{},...e.gizmo?{gizmo:Object.freeze({min:r(e.gizmo.min),max:r(e.gizmo.max)})}:{}})));function a(e){return i.find(t=>t.path===e)}var o=e=>e.persisted!==!1&&!e.actions&&!e.readOnly,s=Object.freeze(`INVALID_ARGUMENT.INVALID_CONTEXT.INVALID_IDENTITY.INVALID_TURN_ID.INVALID_SESSION_ID.INVALID_RECEIPT.INVALID_RANGE.INVALID_REQUEST.UNKNOWN_TOOL.UNKNOWN_VARIANT.DUPLICATE_NAME.CONTEXT_LIMIT.CONTEXT_TOO_LARGE.AMBIGUOUS_TARGET.AMBIGUOUS_BASIS.TARGET_NOT_READY.TARGET_BUSY.STALE_TARGET.STALE_SCENE.STALE_ENVIRONMENT.STALE_CURSOR.CAPABILITY_MISSING.LIVE_HUB_UNAVAILABLE.AUTH_REQUIRED.GENERATION_LIMIT.RATE_LIMITED.BACKEND_UNAVAILABLE.VERIFICATION_FAILED.REPAIR_REGRESSED.CANCELLED.UNCERTAIN_APPLY.UNDO_CONFLICT.CONFIRMATION_REQUIRED.TIMEOUT.UNDO_EXPIRED.INTERNAL_ERROR.SCOPE_DENIED.SCOPE_BUSY`.split(`.`)),c=e=>e?.code??([`TypeError`,`ReferenceError`,`RangeError`,`SyntaxError`].includes(e?.name)?`INTERNAL_ERROR`:`INVALID_ARGUMENT`),l=`#c2c6c8`,u=[`#e2e5e6`,l,`#9aa1a5`,`#767d81`,`#d9b18c`,`#8fae9b`,`#d94a4a`,`#4a7bd9`,`#e2c04a`,`#4fa86a`],d=6,f=`cozyclay.objectColors.recent`,p=/^#?([0-9a-f]{3})$/i,m=/^#?([0-9a-f]{6})$/i;function h(e){if(typeof e!=`string`)return null;let t=e.trim(),n=p.exec(t);if(n)return`#${n[1].toLowerCase().replace(/./g,e=>e+e)}`;let r=m.exec(t);return r?`#${r[1].toLowerCase()}`:null}function g(e,t){let n=Array.isArray(e)?e.map(h).filter((e,t,n)=>e&&n.indexOf(e)===t&&!u.includes(e)):[],r=h(t),i=(r&&!u.includes(r)?[r,...n.filter(e=>e!==r)]:n).slice(0,d);return Array.isArray(e)&&i.length===e.length&&i.every((t,n)=>t===e[n])?e:i}function _(e){try{let t=JSON.parse(e?.getItem(f)??`[]`);return g(Array.isArray(t)?t:[],null)}catch{return[]}}function v(e,t){try{e?.setItem(f,JSON.stringify(t))}catch{}}var y=`effect`,b={kind:y,label:`Effect`,group:`Effects`,footprint:{width:0,depth:0},height:0,color:`#7fd4f0`},x=(e,t,n)=>({x:e,y:t,z:n}),S=x(0,0,0),C=Object.freeze({smoke:{rate:60,life:2.8,size:.012,grow:6,speed:.05,spread:.1,gravity:-.3,wind:x(.02,0,0),color:`#7d8a99`,opacity:.42,additive:!1,area:S,width:0},exhale:{rate:120,life:2.4,size:.035,grow:8,speed:.9,spread:.35,gravity:-.35,wind:x(.02,0,0),color:`#a3abb4`,opacity:.3,additive:!1,area:x(.01,0,.01),width:0},steam:{rate:26,life:2,size:.03,grow:4,speed:.1,spread:.2,gravity:-.45,wind:x(.02,0,0),color:`#bcc5ce`,opacity:.2,additive:!1,area:x(.07,0,.07),width:0},fire:{rate:140,life:.75,size:.12,grow:.3,speed:.4,spread:.15,gravity:-2.2,wind:S,color:`#ff7a1f`,opacity:1,additive:!0,area:x(.22,0,.22),width:0},sparks:{rate:40,life:1,size:.012,grow:.6,speed:2.6,spread:.55,gravity:6,wind:S,color:`#ff9d33`,opacity:1,additive:!0,area:x(.05,0,.05),width:0},dust:{rate:30,life:7,size:.014,grow:1.2,speed:0,spread:1,gravity:.01,wind:x(.04,0,.01),color:`#a89a82`,opacity:.55,additive:!1,area:x(3,2.2,3),width:0},rain:{rate:1600,life:1.2,size:.01,grow:1,speed:0,spread:0,gravity:9.8,wind:S,color:`#9aabbd`,opacity:.4,additive:!1,area:x(8,5,8),width:0},snow:{rate:220,life:8,size:.025,grow:1,speed:0,spread:0,gravity:9.8,wind:x(.1,0,0),color:`#ffffff`,opacity:.85,additive:!1,area:x(8,4,8),width:0},trail:{rate:0,life:.3,size:0,grow:1,speed:0,spread:0,gravity:0,wind:S,color:`#a7b8ca`,opacity:.75,additive:!1,area:S,width:.5}}),w=Object.freeze(Object.keys(C)),T={rate:[0,2e3],life:[.05,12],size:[.001,5],grow:[.05,20],speed:[0,60],spread:[0,1],gravity:[-30,30],opacity:[0,1],width:[0,10]},E={wind:[-20,20],area:[0,100]},D=2147483647,O=([e,t],n,r)=>{let i=Number(n);return Number.isFinite(i)?Math.min(t,Math.max(e,i)):r};function k(e){let t=e&&typeof e==`object`&&!Array.isArray(e)?e:{},n=w.includes(t.preset)?t.preset:`smoke`,r=C[n],i={preset:n};for(let[e,n]of Object.entries(T))i[e]=O(n,t[e],r[e]);for(let[e,n]of Object.entries(E)){let a=t[e]&&typeof t[e]==`object`?t[e]:{};i[e]=x(...[`x`,`y`,`z`].map(t=>O(n,a[t],r[e][t])))}i.color=h(t.color)??r.color,i.additive=typeof t.additive==`boolean`?t.additive:r.additive;let a=Number(t.seed);return i.seed=Number.isFinite(a)?Math.min(D,Math.max(0,Math.round(a))):1,i}function ee(e){return e?.renderer===`effect`?{effect:k(e.effect)}:{}}function te(e,t){let n=e?.set?.effect?.preset;if(!w.includes(n))return e;let r=t?.find?.(t=>t.id===e.id)?.effect;if(r?.preset===n)return e;let i=structuredClone(C[n]);return{...e,set:{...e.set,effect:{...i,seed:r?.seed??1,...e.set.effect}}}}var ne=(e,t)=>({type:`number`,minimum:e,maximum:t}),re=([e,t])=>({type:`object`,properties:{x:ne(e,t),y:ne(e,t),z:ne(e,t)},required:[],additionalProperties:!1}),ie=Object.freeze({type:`object`,properties:{preset:{type:`string`,enum:[...w]},...Object.fromEntries(Object.entries(T).map(([e,[t,n]])=>[e,ne(t,n)])),...Object.fromEntries(Object.entries(E).map(([e,t])=>[e,re(t)])),color:{type:`string`,minLength:1,maxLength:32,pattern:`^#[0-9a-fA-F]{6}$`},additive:{type:`boolean`},seed:{type:`integer`,minimum:0,maximum:D}},required:[],additionalProperties:!1}),ae=`text`,oe=[375,307,454,1117,800,1213,1007,289,486,486,828,828,303,525,303,828,828,828,828,828,828,828,828,828,828,828,304,306,828,828,828,785,1374,1069,938,1043,968,824,778,1057,953,365,760,996,763,1135,949,1094,838,1096,947,915,894,926,997,1399,999,931,906,444,532,446,828,828,288,786,822,828,836,808,525,839,782,326,361,771,363,1174,782,871,824,833,513,775,511,782,828,1150,826,828,753,599,240,597,949],se=Object.freeze({resolution:1e3,ascent:1090,descent:333}),ce=1.5,le=1.25,ue=.8,de=.005,fe={size:[.02,10],depth:[0,2]},pe=200,me=8,he=[`left`,`center`,`right`],ge=Object.freeze({value:`Text`,size:.3,depth:0,align:`center`}),_e={kind:ae,label:`Text`,group:`Text`,footprint:{width:1,depth:de},height:.3,color:l},ve=Object.freeze({type:`object`,properties:{value:{type:`string`,minLength:1,maxLength:pe},size:{type:`number`,minimum:fe.size[0],maximum:fe.size[1]},depth:{type:`number`,minimum:fe.depth[0],maximum:fe.depth[1]},align:{type:`string`,enum:he}},required:[],additionalProperties:!1}),ye=([e,t],n,r)=>{let i=Number(n);return Number.isFinite(i)?Math.min(t,Math.max(e,i)):r};function be(e){let t=e&&typeof e==`object`&&!Array.isArray(e)?e:{},n=[...(typeof t.value==`string`?t.value.replace(/\r\n?/g,`
2
- `).split(`
3
- `).slice(0,me):[]).join(`
4
- `)].slice(0,pe).join(``);return{value:n.trim()?n:ge.value,size:ye(fe.size,t.size,ge.size),depth:ye(fe.depth,t.depth,ge.depth),align:he.includes(t.align)?t.align:ge.align}}var xe=e=>e>=4352&&e<=4607||e>=11904&&e<=42191||e>=44032&&e<=55215||e>=63744&&e<=64255||e>=65280&&e<=65519;function Se(e){let t=e.codePointAt(0);return t>=32&&t<=126?oe[t-32]/se.resolution:xe(t)?le:ue}function Ce(e){return e.depth>0&&[...e.value].every(e=>e===`
5
- `||e.codePointAt(0)>=32&&e.codePointAt(0)<=126)}function we(e){let{size:t,align:n}=e,r=e.value.split(`
6
- `),i=r.map(e=>[...e].reduce((e,t)=>e+Se(t),0)*t),a=Math.max(...i,t*.2),o=se.descent/se.resolution*t;return{width:a,height:(r.length-1)*ce*t+(se.ascent+se.descent)/se.resolution*t,rows:r.map((e,s)=>({text:e,width:i[s],x:n===`left`?-a/2:n===`right`?a/2-i[s]:-i[s]/2,baseline:o+(r.length-1-s)*ce*t}))}}function Te(e){if(e?.renderer!==`text`)return{};let t=be(e.text),{width:n,height:r}=we(t),i=e=>Number(e.toFixed(4));return{text:t,footprint:{width:i(n),depth:i(Math.max(t.depth,de))},height:i(r),supportY:i(r)}}function Ee(e,t){if(e?.renderer!==`text`||t?.text===void 0||!t.text||typeof t.text!=`object`)return{};let n=Te({renderer:ae,text:{...e.text,...t.text}});return JSON.stringify(n.text)===JSON.stringify(e.text)?{}:n}var De=24,Oe=40,ke=e=>{let t=JSON.stringify(e)??String(e);return t.length>Oe?`${t.slice(0,37)}...`:t},Ae=e=>e===null?`null`:Array.isArray(e)?`an array`:typeof e==`object`?`an object`:typeof e==`number`&&!Number.isFinite(e)?String(e):`a ${typeof e}`,je=e=>e.length>De?`${e.slice(0,De).join(`, `)}, ... (${e.length} in all)`:e.join(`, `),Me=e=>Object.hasOwn(e,`const`)?JSON.stringify(e.const):e.type===`integer`?`an integer`:e.type===`array`?`an array${e.items?.type?` of ${e.items.type}s`:``}`:e.type===`object`?`an object`:e.type===`null`?`null`:`a ${e.type}`,Ne=(e,t,n)=>`${e}: expected ${Me(t)}, got ${Object.hasOwn(t,`const`)?ke(n):Ae(n)}.`,Pe=(e,t,n)=>{let r=Object.keys(t.properties);return`${e} has unknown field ${ke(n)}; ${r.length?`allowed: ${je(r)}`:`it takes no fields`}.`},Fe=(e,t)=>`${e}: missing required field "${t}".`;function Ie(e,t,n){if(!Array.isArray(n))return Ne(e,t,n);let r=t.minItems??0,i=t.maxItems??1/0;return`${e}: expected ${r===i?`exactly ${r}`:i===1/0?`at least ${r}`:r===0?`at most ${i}`:`${r} to ${i}`} item${r===i&&r===1?``:`s`}, got ${n.length}.`}var Le=(e,t)=>{let n=new Set,r=t.map(e=>JSON.stringify(e)).find(e=>n.has(e)?!0:(n.add(e),!1));return`${e}: items must be unique; ${r&&r.length<=Oe?r:`one item`} appears twice.`};function Re(e,t,n){if(typeof n!=`string`)return Ne(e,t,n);if(!n.trim())return`${e}: must not be empty.`;let r=[...n].length;return t.maxLength!==void 0&&r>t.maxLength?t.description?`${e}: over ${t.maxLength} characters. ${t.description}`:`${e}: at most ${t.maxLength} characters, got ${r}.`:`${e}: ${ke(n)} does not match ${t.pattern}.`}var ze=(e,t,n)=>`${e}: ${ke(n)} is not one of: ${je(t.enum)}.`;function Be(e,t,n){return typeof n!=`number`||!Number.isFinite(n)?Ne(e,t,n):t.type===`integer`&&!Number.isSafeInteger(n)?`${e}: expected an integer, got ${n}.`:`${e}: must be greater than ${t.exclusiveMinimum}, got ${n}.`}var Ve=e=>e.oneOf??e.anyOf?(e.oneOf??e.anyOf).every(Ve):e.type!==`object`&&e.type!==`array`,He=e=>[e.minimum,e.maximum].some(e=>e!==void 0)?` within [${[e.minimum??`-inf`,e.maximum??`inf`].join(`, `)}]`:``,Ue=e=>e.oneOf??e.anyOf?(e.oneOf??e.anyOf).flatMap(Ue):Object.hasOwn(e,`const`)?[JSON.stringify(e.const)]:e.enum?e.enum.map(e=>JSON.stringify(e)):e.type===`boolean`?[`true`,`false`]:[`${Me(e)}${e.type===`number`||e.type===`integer`?He(e):``}`];function We(e,t,n){if(!t.every(({error:t})=>t.details?.path===e)||typeof n==`object`&&n&&!t.every(({branch:e})=>Ve(e)))return null;let r=[...new Set(t.flatMap(({branch:e})=>Ue(e)))],i=r.length>De?[...r.slice(0,De),`... (${r.length} in all)`]:r;return`${e} must be ${i.length>1?`${i.slice(0,-1).join(`, `)} or ${i.at(-1)}`:i[0]}, got ${typeof n==`object`&&n?Ae(n):ke(n)}.`}var Ge=[`storyboard`,`animation`],Ke=[`stand`,`sit`,`lie`],qe=65536,Je=Object.freeze({entities:24,entityIndex:400,shots:8,assets:48,recentReceipts:3,jobs:8}),Ye=Object.freeze([`inspect_studio`,`run_action`,`verify_result`]);Object.freeze([`operate_studio`,`arrange_objects`,`arrange_characters`,`patch_elements`,`frame_shot`,`undo_edit`]);var Xe=Object.freeze({inspect_studio:`Read the scene`,operate_studio:`Selection and view`,arrange_objects:`Arrange objects`,arrange_characters:`Arrange characters`,patch_elements:`Edit properties`,frame_shot:`Frame the shot`,verify_result:`Verify the result`,undo_edit:`Undo an edit`,run_action:`Run an editor action`}),Ze=Object.freeze(Object.keys(Xe)),Qe=Object.freeze([`character`,`object`,`shot`,`stage`]),$e=nt({selectionKinds:[`scene`,`object`,`character`,`rig`,`camera`],modes:[`scene`,`pose`,`camera`,`motion`],shotModes:[`keys`,`follow`,`rail`],framingSizes:[`extreme close-up`,`close-up`,`medium close-up`,`medium shot`,`medium-wide shot`,`wide shot`,`extreme wide shot`],framingViews:[`front`,`front three-quarter`,`profile`,`rear three-quarter`,`back`],framingLevels:[`ground`,`low`,`hip`,`eye`,`high`,`overhead`],framingSides:[`left`,`right`],positionSides:[`left`,`right`,`front`,`behind`],positionBases:[`world`,`subject`,`shot_camera`],collisionPolicies:[`report`,`avoid`],objectOps:[`create`,`update`,`remove`,`group`,`ungroup`],characterOps:[`create`,`update`,`remove`],inspectionScopes:[`selection`,`scene`,`entities`,`shot`,`motion`,`catalogue`,`actions`,`document`],receiptStatuses:[`applied`,`partial`,`noop`,`transient`,`installed`,`undone`],opStatuses:[`applied`,`partial`,`noop`],jobStates:[`queued`,`generating`,`preparing`,`verifying`,`repairing`,`committing`,`reconciling`,`installed`,`review_required`,`failed`,`cancelled`,`stale_target`,`stale_environment`]}),et=class extends Error{constructor(e,t,n={}){super(t),this.name=`StudioProtocolError`,this.code=e,this.details=n}toJSON(){return{code:this.code,message:this.message,...Object.keys(this.details).length?{details:this.details}:{}}}},tt=e=>new TextEncoder().encode(e).byteLength;function nt(e){if(e&&typeof e==`object`&&!Object.isFrozen(e)){for(let t of Object.values(e))nt(t);Object.freeze(e)}return e}var A=(e,t,n=`$`,r={})=>{throw new et(e,t,{path:n,...r})},rt=e=>typeof e==`object`&&!!e&&!Array.isArray(e),it=(e=120)=>({type:`string`,minLength:1,maxLength:e}),j=(e,t)=>({type:`number`,...e===void 0?{}:{minimum:e},...t===void 0?{}:{maximum:t}}),M=(e=0,t=2**53-1)=>({...j(e,t),type:`integer`}),N={type:`boolean`},P=e=>({const:e}),F=e=>({type:`string`,enum:e}),I=e=>({oneOf:[e,{type:`null`}]}),L=(e,t,n=0,r=!1)=>({type:`array`,items:e,minItems:n,maxItems:t,...r?{uniqueItems:r}:{}}),R=(e,t={})=>({type:`object`,properties:{...e,...t},required:Object.keys(e),additionalProperties:!1}),at=(...e)=>({oneOf:e}),ot={type:`object`,properties:{},required:[],additionalProperties:!0},z={...it(),pattern:`^[A-Za-z0-9][A-Za-z0-9._:-]*$`},st={...it(36),pattern:`^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`},ct=R({x:j(),y:j(),z:j()}),lt={type:`number`,exclusiveMinimum:0},ut=R({x:lt,y:lt,z:lt}),dt={...R({startFrame:M(),endFrameExclusive:M(1)}),"x-studio-range":!0},ft=(e=100,t=1)=>L(z,e,t,!0),pt=it(120),mt={...it(120),description:`Object id, or the name of a part created EARLIER in this ops list (create it first).`},ht={workspaceId:z,documentEpoch:z,sceneId:z,sceneEpoch:z},gt=R(ht),_t=R({surface:P(`studio`),...ht,workspaceHandle:I(z)}),vt=R({scene:M(),physics:M(),view:M()}),yt=I(R({kind:F($e.selectionKinds),id:z},{hierarchyId:z})),bt=R({mode:F($e.modes),frame:M(),playing:N,lookThrough:N,grid:N,autoColor:N}),xt=at(R({world:ct}),R({relativeTo:mt,basis:F($e.positionBases),side:F($e.positionSides),gapM:j(0),support:at(P(`floor`),R({objectId:mt}))}),R({between:L(mt,2,2,!0),fraction:j(0,1),support:P(`floor`)}),R({onObject:mt},{offsetXZ:R({x:j(),z:j()})})),St=at(R({yawDeg:j()}),R({towardId:mt}),R({sameAsId:mt}),R({awayFromId:mt})),Ct=at(R({intent:R({size:F($e.framingSizes),view:F($e.framingViews),level:F($e.framingLevels),side:F($e.framingSides)},{focalMm:lt})}),R({exact:R({position:ct,lookAt:ct,focalMm:lt})})),wt={...F([`parent`]),description:`"parent" reads position.world, rotationDeg and facing.yawDeg in the parent's local frame (its pivot and rotation, not its scale); omit for world space.`},Tt=at(R({op:P(`create`),source:R({kind:z}),position:xt},{name:pt,facing:St,scale:ut,rotationDeg:{...ct,description:`Euler XYZ degrees (x pitch, y yaw, z roll), as in update. Exclusive with facing. A pitched/rolled part rests its lowest corner on its support.`},parent:{...pt,description:`Group this new object under a parent: an existing object id, or the name of an object created earlier in this same ops list. Moving the parent then moves it too.`},space:wt}),R({op:P(`update`),id:z},{position:xt,facing:St,rotationDeg:ct,scale:ut,color:it(32),name:pt,hidden:N,space:wt}),R({op:P(`remove`),id:z}),R({op:P(`group`),parentId:z,childIds:ft()}),R({op:P(`ungroup`),childIds:ft()})),Et=at(R({op:P(`create`),name:pt,position:xt},{facing:St,scale:lt}),R({op:P(`update`),characterId:z},{position:xt,facing:St,scale:lt,name:pt,hidden:N}),R({op:P(`remove`),characterId:z})),Dt={...it(2097152),pattern:`^data:image/[A-Za-z0-9.+-]+[;,]`},Ot=R({frame:M(),framing:R({pos:ct,yaw:j(),pitch:j(),fovDeg:j(1,179)})},{id:z}),kt=at(j(0,1),R({t:j(0,1)},{bank:j(-90,90),pitch:j(-90,90)})),At=I(R({points:L(ct,64,2)},{speed:j(0,50),faceTravel:N,loop:N,extend:N,marks:L(kt,6)})),jt=R({},{type:F([`point`,`spot`]),color:{...it(32),pattern:`^#[0-9a-fA-F]{6}$`},intensity:j(0,1e3),range:j(0,100),angle:j(1,89),softness:j(0,1),shadow:N,flicker:j(0,1),aim:I(ct)}),Mt=I(R({},{color:{...it(32),pattern:`^#[0-9a-fA-F]{6}$`},intensity:j(0,20),halo:j(0,4)})),Nt=I(ot),Pt={"character.pose":I(z),"character.identityImage":I(Dt),"object.light":jt,"object.glow":Mt,"object.grasp":Nt,"object.effect":ie,"object.text":ve,"object.parent":I(z),"object.path":At,"stage.environmentImage":I(Dt),"shot.cameraKeys":L(Ot,64),"shot.targetModel":I(z)};function Ft(e){if(Object.hasOwn(Pt,e.path))return Pt[e.path];if(e.type===`number`)return j(e.min,e.max);if(e.type===`boolean`)return N;if(e.type===`enum`)return F([...e.enum]);if(e.type===`id`)return z;if(e.type===`color`)return{...it(32),pattern:`^#[0-9a-fA-F]{6}$`};if(e.type===`image`)return I(Dt);if(e.type===`vec3`){let{min:t,max:n}=e;return t&&typeof t==`object`&&n&&typeof n==`object`?R({x:j(t.x,n.x),y:j(t.y,n.y),z:j(t.z,n.z)}):ct}return e.type===`string`?it(240):null}function It(e){return e.filter(o).map(({path:e,type:t,min:n,max:r,enum:i,note:a})=>({path:e,type:t,...n===void 0?{}:{min:n&&typeof n==`object`?{...n}:n},...r===void 0?{}:{max:r&&typeof r==`object`?{...r}:r},...i?{enum:[...i]}:{},...a?{note:a}:{}}))}var Lt=nt(It(i));function Rt(e){let t={};for(let n of Qe){let r={};for(let t of e){if(!o(t)||!t.path.startsWith(`${n}.`))continue;let e=Ft(t);e&&(r[t.path.slice(n.length+1)]=e)}t[n]={type:`object`,properties:r,required:[],additionalProperties:!1}}return t}var zt=nt(Rt(i)),Bt=nt(Object.fromEntries(Qe.map(e=>[e,Object.keys(zt[e].properties).map(t=>`${e}.${t}`)]))),Vt=at(R({target:R({kind:P(`character`),id:z}),set:zt.character}),R({target:R({kind:P(`object`),id:z}),set:zt.object}),R({target:R({kind:P(`shot`)},{id:z}),set:zt.shot}),R({target:R({kind:P(`stage`)}),set:zt.stage})),Ht={inspect_studio:R({scope:F($e.inspectionScopes)},{ids:ft(32),select:ft(32),query:pt,cursor:it(512),limit:{...M(1,32),default:12}}),operate_studio:R({},{selection:yt,shotId:z,frame:M(),playing:N,mode:F($e.modes),view:R({},{lookThrough:N,grid:N,autoColor:N})}),arrange_objects:R({ops:{...L(Tt,100,1),description:`Applied in order, as one undo step. Each op sees the parts created by earlier ops, so build an assembly in one call: create the main part, then place the rest with position.onObject / relativeTo(+side,gapM) / between naming earlier parts (e.g. relativeTo "Hood"). Reference parts created in this call by name, never by id.`}},{collisionPolicy:{...F($e.collisionPolicies),default:`report`}}),arrange_characters:R({ops:L(Et,8,1)}),patch_elements:R({ops:L(Vt,32,1)}),frame_shot:R({subjectIds:ft(1),framing:Ct},{shotId:z,caption:{type:`string`,maxLength:500},keyAtFrame:M()}),verify_result:R({checks:{...L(F([`placement`,`framing`,`motion`,`lighting`]),4,1,!0),description:`lighting measures the shot frame rendered at the playhead: checks.lighting { meanLuma 0..1, clippedPct (a channel at full scale), crushedPct (pure black), subjects: [{ id, meanLuma, contrast (5th to 95th percentile luma spread, 0..1) }] inside each target character's projected box, look: { preset, envLight, ao } the stage look's environment light and occlusion strength }. motion also answers exportFraming (one per character with a take): what the camera the export renders shows of the take over sampledFrames: camera (shot where a shot covers the frame, studio = the Studio camera as it stands when none does; shotIds), character { screenFraction [min, max] of the frame height, inFrame [lowest share of its joints' screen box inside the frame, frame], behindCamera, cut { head, hand_l, hand_r, foot_l, foot_r } }, and every object the take names { id, name, inFrame, out, cut }; out, cut and behindCamera are spans [first, last] of sampled frames; { character: { id }, reason } when it cannot be measured`}},{receiptId:z,targets:ft(),range:at(P(`whole_clip`),dt),visual:{...F([`none`,`frame`,`contact_sheet`,`plan`,`trace`]),default:`none`},frames:{...at(F([`even`,`beats`]),L(M(),8,1,!0)),default:`even`,description:`contact_sheet frames: even spacing, beats (grab/release, beat starts, the worst QA frames, then even fill, answered in visualRefs[0].picks), or up to 8 timeline frames of your choice`},views:{...L(F([`front`,`side`,`three-quarter`,`top`]),2,1,!0),description:`contact_sheet from cameras of its own around the character instead of the shot camera (which stays as it is): a row per view, each held still over the frames and framed on focus, so small actions fill the tile; side and three-quarter look from the focus's side; a sheet always holds two views at least 60 degrees apart: if the asked ones look along nearly one line, side, front or top is added and named in visualRefs[0].addedView`},focus:{...at(it(120),L(it(120),3,1,!0)),description:`with views: what to frame, as refs (object:<id>, joint:<Bone>, prop:<prop>.<point>, landmark:mouth); default the whole character`},trail:{...at(it(120),L(it(120),3,1,!0)),description:`with views: refs whose path over the range is drawn as one dot per frame (spacing shows speed; later frames faint, the tile's own frame ringed), colours in visualRefs[0].trails`},ghosts:{...N,description:`with views: each tile also shows the first target's poses around its frame as translucent ghosts (onion skin), earlier ones blue, later ones orange, carried props included, so spacing and arcs read in one tile; how many and how far apart is view.setGhosts (while it is off: 3 each side, every 4 frames), answered in visualRefs[0].ghosts`}}),undo_edit:R({receiptId:z}),run_action:R({action:z},{args:ot,confirmationToken:z})},Ut=nt(Ht),Wt=nt(Ze.map(e=>({name:e,slice:1,parameters:Ht[e]}))),Gt=R({min:ct,max:ct}),Kt=R({id:z,kind:F([`object`,`character`,`rig`]),token:z},{name:pt,detailsOmitted:N,position:ct,yawDeg:j(),rotationDeg:ct,scale:at(lt,ut),bounds:I(Gt),libraryKind:z,renderer:z,color:I(it(32)),tint:I(it(32)),modelId:I(it(120)),assetId:z,parentId:I(z),attachment:I(R({characterId:z,bone:I(z)})),pathPointCount:M(0,64),pathMarks:L(at(j(0,1),R({t:j(0,1)},{bank:j(-90,90),pitch:j(-90,90)})),6),local:R({position:ct,rotationDeg:ct}),motion:R({takeId:I(z),frames:M(),ikKeyCount:M()},{poseId:I(z),keyIds:ft(8,0)}),capabilities:R({rigReady:N,ik:N,measuredFeet:N}),characterKind:F([`rig`,`proxy`]),posture:F(Ke)}),qt=R({id:z,kind:F([`object`,`character`,`rig`])},{name:pt,position:ct}),Jt=R({id:z},{label:pt,generation:P(`motion`),timeoutMs:M(1,3e5)}),Yt=R({id:z,name:pt,range:dt,keyCount:M()},{subjectIds:ft(24,0),kind:F([`clip`,`still`]),caption:it(500)}),Xt=R({id:z,name:pt,range:dt,mode:F($e.shotModes)},{subjectIds:ft(24,0),kind:F([`clip`,`still`]),caption:it(500)}),Zt=R({position:ct,lookAt:ct,focalMm:lt,sensorId:z,slate:pt}),Qt=F([`primitive`,`set-piece`,`image`,`mesh`]),$t=at(R({kind:z,name:pt,type:Qt}),R({id:z,name:pt,type:Qt})),en=R({id:z,characterId:z,state:F($e.jobStates)},{targetIds:ft(24,0),progress:I(j(0,1)),phase:pt}),tn=R({schema:P(`studio-context-v1`),host:_t,revision:vt,units:R({distance:P(`m`),angle:P(`deg`),up:P(`+Y`),yawZero:P(`+Z`),yawPositiveToward:P(`+X`),pivot:P(`base`),fps:P(24),rangeEnd:P(`exclusive`)}),scene:R({name:pt,aspect:it(40),floorY:j(),frameCount:M(),objectCount:M(),characterCount:M()},{previsMode:F(Ge)}),selection:yt,activeCharacterId:I(z),view:bt,shot:I(Xt),camera:I(Zt),entities:L(Kt,24),entityPage:R({returned:M(0,24),total:M(),truncated:N,nextCursor:I(it(512))}),shots:L(Yt,8),shotsTruncated:N,assets:L($t,Je.assets),recentReceipts:L(R({id:z,summary:pt,canUndoDirect:N}),3),jobs:L(en,8),capabilities:R({profile:P(`studio-slice-1`),tools:L(F(Ze),Ze.length,0,!0)},{rigReady:N,cameraReady:N,bridgeReady:N,storyboard:N})},{entityIndex:L(qt,Je.entityIndex),actionIndex:L(Jt,512)}),nn=R({...ht,targetId:z,token:z}),rn=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`,`ultra`],an=R({dataUrl:{...it(6e6),pattern:`^data:image/(png|jpeg|webp);base64,`}},{name:it(120)}),on=R({surface:P(`studio`),sessionId:st,turnId:st,text:it(16e3),context:tn},{model:it(120),effort:F(rn),attachFrame:N,attachments:L(an,4,1),supervisor:N}),sn=R({surface:P(`studio`),sessionId:st,turnId:st},{jobId:z}),cn=R({before:M(),after:M()}),ln=R({historyEntryId:z,entries:P(1),canUndoDirect:N}),un=R({characterId:z,beforeTakeId:I(z),takeId:z,targetToken:z,frameCount:M(1),fps:P(24),durationSeconds:lt,blocks:L(R({sourceBeat:M(0,7),startFrame:M(),endFrameExclusive:M(1)}),120,1),selectionChanged:P(!1)}),dn=R({id:z,status:F([`verified`,`unverified`]),profile:P(`studio-motion-v1`),range:dt,evaluatedFrames:M(),physicsRevision:M(),limitations:L(pt,12)},{surfaceMeasured:N,maxFloorPenetrationM:j(0),maxContactSlipM:j(0),maxContactFloatM:j(0),unsupportedFrames:M(),supportedCollisionFrames:M(),continuityRegressed:N,semanticStatus:F([`pending_image_review`,`passed`,`failed`,`unavailable`])}),fn=R({path:it(120)},{number:j(),text:I(it(512)),flag:N,vec:ct,count:M(),bytes:M()}),pn=R({},{position:ct,yawDeg:j(),rotationDeg:ct,scale:at(lt,ut),name:pt,color:it(32),hidden:N,modelId:z,renderer:z,parentId:I(z),childIds:ft(100,0),childCount:M(0),bounds:I(Gt),removed:N,range:dt,camera:Zt,keyId:z,frame:M(),subjectIds:ft(24,0),selection:yt,activeCharacterId:I(z),shotId:I(z),view:bt,token:z,takeId:I(z),statureM:lt,patched:L(fn,32,1)}),mn=[`left`,`right`,`on-axis`],hn=R({coverage:pt},{relationSatisfied:N,overlapIds:ft(100,0),actualGapM:j(),requestedGapM:j(0),maximumFootprintOverlapM:j(0),basis:F($e.positionBases),clipped:N,occluded:N,behindCamera:N,screenFraction:j(0),derivedSize:F($e.framingSizes),support:pt,baseY:j(),facesTargetId:z,cameraSide:F(mn),axisConsistent:N,evaluatedFrames:M(1),sampledFrames:L(M(),64,1),sampledChecks:L(R({frame:M(),screenFraction:j(),clipped:N,behindCamera:N,occluded:N}),64,1),issueFrames:L(R({frame:M(),codes:L(pt,4,1),screenFraction:j()}),64,0)}),gn=R({subjects:L(R({id:z,position:ct,yawDeg:j()}),24),pairs:L(R({a:z,b:z,distanceM:j(0)}),24),shots:L(R({shotId:z,subjectIds:ft(2,0),camera:I(R({position:ct,lookAt:ct})),cameraSide:I(F(mn)),occluders:L(R({subjectId:z,byObjectId:z}),8)}),8),axisConsistent:I(N)}),_n=R({code:z},{id:z,message:pt,suggestedOutwardDeltaM:j(),count:M()}),vn={ok:P(!0),commandId:z,receiptId:z,host:gt,status:F($e.receiptStatuses),authored:N,revision:cn,affectedIds:ft(100,0),delta:L(R({id:z,after:pn}),8),checks:hn,undo:I(ln),warnings:L(_n,12)},yn={counts:R({created:M(),updated:M(),deleted:M()}),detailCursor:I(it(512))},bn=L(R({index:M(),status:F($e.opStatuses)},{droppedPaths:L(it(120),32,1)}),32,1),xn={...vn,authored:P(!0),undo:ln},Sn={action:z,summary:it(240)},Cn={completed:R({...vn,status:P(`completed`),kind:F([`job`,`document`,`transaction`,`mutation`])},{...Sn,...yn,output:ot,jobId:z,txId:z,nextHost:gt,ops:bn}),started:R({...vn,status:P(`started`),kind:P(`job`),jobId:z,authored:P(!1),undo:P(null)},{...Sn}),applied:R({...xn,status:P(`applied`)},{mutated:P(!0),ops:bn,...yn,...Sn}),partial:R({...xn,status:P(`partial`),ops:bn},{mutated:P(!0),...yn}),noop:R({...vn,status:P(`noop`),authored:P(!1),mutated:P(!1),undo:P(null)},{ops:bn,...Sn}),transient:R({...vn,status:P(`transient`),authored:P(!1),view:cn,undo:P(null)},{mutated:N,...Sn}),installed:R({...xn,status:P(`installed`),jobId:z,artifactId:z,installed:un,verification:dn},{mutated:P(!0),explicitUnverifiedAcceptance:N,acceptance:P(`advisory-policy`),...yn}),undone:R({...xn,status:P(`undone`),undoneReceiptId:z,restoredTargets:L(nn,100,1)},{mutated:P(!0),...yn})},wn=at(...Object.values(Cn)),Tn=R({ok:P(!1),commandId:z,host:gt,code:F(s),phase:F([`admission`,`execution`,`prepare`,`verify`,`repair`,`commit`,`reconcile`,`undo`]),affectedIds:ft(100,0),expectedTargets:L(nn,24),currentTargets:L(nn,24),mutated:at(N,P(`unknown`)),preserved:R({authoredState:F([`unchanged`,`changed`,`unknown`])}),recovery:R({action:F([`none`,`inspect`,`retry`,`new_intent`,`reconcile`,`sign_in`])},{retryAllowed:N})},{message:it(500),jobId:z,txId:z,candidates:L(R({id:z,kind:F([`object`,`character`,`rig`]),position:I(ct)}),5)}),En=nt({catalogue:Wt,variants:$e,Vec3:ct,FrameRange:dt,PositionSpec:xt,FacingSpec:St,ObjectOp:Tt,CharacterOp:Et,Framing:Ct,Identity:gt,Host:_t,TargetGuard:nn,Entity:Kt,ShotSummary:Yt,StudioContextV1:tn,StudioTurn:on,StudioStop:sn,Receipt:wn,ReceiptVariants:Cn,Failure:Tn,GeometryFacts:gn});function Dn(e,t,n=`INVALID_ARGUMENT`,r=`$`){if(e.oneOf||e.anyOf){let i=[],a=[];for(let o of e.oneOf??e.anyOf)try{i.push(Dn(o,t,n,r))}catch(e){if(!(e instanceof et))throw e;a.push({branch:o,error:e})}if(i.length===0&&a.length){let e=rt(t)&&rt(t.target)?t.target.kind:void 0,i=e!==void 0&&a.find(({branch:t})=>t.properties?.target?.properties?.kind?.const===e),o=!i&&We(r,a,t);throw o&&A(n,o,r),(i||a.reduce((e,t)=>t.error.details.path.length>e.error.details.path.length?t:e)).error}return i.length!==1&&e.oneOf&&A(n,`${r}: matches ${i.length} variants; send the fields of exactly one.`,r),i[0]}if(Object.hasOwn(e,`const`))return t!==e.const&&A(n,Ne(r,e,t),r),t;if(e.type===`null`)return t!==null&&A(n,Ne(r,e,t),r),null;if(e.type===`object`){rt(t)||A(n,Ne(r,e,t),r);let i=e.additionalProperties===!0;for(let a of Object.keys(t))!Object.hasOwn(e.properties,a)&&!i&&A(n,Pe(r,e,a),r);let a={};if(i)for(let n of Object.keys(t))Object.hasOwn(e.properties,n)||(a[n]=structuredClone(t[n]));for(let[i,o]of Object.entries(e.properties))Object.hasOwn(t,i)?a[i]=Dn(o,t[i],n,`${r}.${i}`):e.required.includes(i)?A(n,Fe(r,i),`${r}.${i}`):Object.hasOwn(o,`default`)&&(a[i]=structuredClone(o.default));return e[`x-studio-range`]&&a.endFrameExclusive<=a.startFrame&&A(n,`Frame range must be nonempty and half-open.`,r),a}if(e.type===`array`){(!Array.isArray(t)||t.length<e.minItems||t.length>e.maxItems)&&A(n,Ie(r,e,t),r);let i=t.map((t,i)=>Dn(e.items,t,n,`${r}[${i}]`));return e.uniqueItems&&new Set(i.map(e=>JSON.stringify(e))).size!==i.length&&A(n,Le(r,i),r),i}if(e.type===`string`)return(typeof t!=`string`||!t.trim()||e.maxLength!==void 0&&[...t].length>e.maxLength||e.pattern&&!new RegExp(e.pattern).test(t))&&A(n,Re(r,e,t),r),e.enum&&!e.enum.includes(t)&&A(n,ze(r,e,t),r),t;if(e.type===`boolean`)return typeof t!=`boolean`&&A(n,Ne(r,e,t),r),t;if(e.type===`number`||e.type===`integer`)return(typeof t!=`number`||!Number.isFinite(t)||e.type===`integer`&&!Number.isSafeInteger(t)||e.exclusiveMinimum!==void 0&&t<=e.exclusiveMinimum)&&A(n,Be(r,e,t),r),(e.minimum!==void 0&&t<e.minimum||e.maximum!==void 0&&t>e.maximum)&&A(n,`${r}: Expected a number within [${[e.minimum,e.maximum].filter(e=>e!==void 0).join(`, `)}], got ${t}.`,r),t;throw Error(`Unsupported internal Studio schema.`)}var On=e=>Dn(gt,e,`INVALID_IDENTITY`);function kn(e){return[...new Set([...[`object`,`character`,`rig`].includes(e.selection?.kind)?[e.selection.id]:[],...e.activeCharacterId?[e.activeCharacterId]:[],...e.shot?.subjectIds??[],...e.jobs.flatMap(e=>[e.characterId,...e.targetIds??[]])])]}function An(e){let t=tt(JSON.stringify(e)??``);t>65536&&A(`CONTEXT_TOO_LARGE`,`Studio context exceeds ${qe/1024} KiB.`,`$`,{bytes:t,maxBytes:qe});let n=Dn(tn,e,`INVALID_CONTEXT`),r=new Set(n.entities.map(e=>e.id));r.size!==n.entities.length&&A(`INVALID_CONTEXT`,`Duplicate entity ID.`);for(let e of kn(n))r.has(e)||A(`TARGET_NOT_READY`,`Mandatory target is absent from context.`);n.activeCharacterId&&!n.entities.some(e=>e.id===n.activeCharacterId&&e.kind===`character`)&&A(`INVALID_CONTEXT`,`Active target is not a character.`),[`object`,`character`,`rig`].includes(n.selection?.kind)&&!n.entities.some(e=>e.id===n.selection.id&&e.kind===n.selection.kind)&&A(`INVALID_CONTEXT`,`Selection kind disagrees with the selected entity.`),n.selection?.kind===`scene`&&n.selection.id!==n.host.sceneId&&A(`INVALID_CONTEXT`,`Selected scene is not the bound scene.`);for(let e of n.entities)e.bounds&&[`x`,`y`,`z`].some(t=>e.bounds.min[t]>e.bounds.max[t])&&A(`INVALID_CONTEXT`,`Inverted entity bounds.`),e.kind===`object`&&typeof e.scale==`number`&&A(`INVALID_CONTEXT`,`Objects use three-axis scale.`),e.kind!==`object`&&rt(e.scale)&&A(`INVALID_CONTEXT`,`Cast uses scalar scale.`);let i=n.entityPage;if((i.returned!==n.entities.length||i.total<i.returned||i.truncated!==i.total>i.returned||(i.truncated?i.nextCursor===null:i.nextCursor!==null))&&A(`INVALID_CONTEXT`,`Entity pagination is inconsistent.`),n.entityIndex){let e=new Set(n.entityIndex.map(e=>e.id));e.size!==n.entityIndex.length&&A(`INVALID_CONTEXT`,`Duplicate entity index ID.`),(n.entityIndex.length>i.total||n.entities.some(t=>!e.has(t.id)))&&A(`INVALID_CONTEXT`,`Entity index must cover every detailed entity and no more than the total.`)}n.view.frame>=Math.max(1,n.scene.frameCount)&&A(`INVALID_CONTEXT`,`Playhead is outside the scene.`),new Set(n.shots.map(e=>e.id)).size!==n.shots.length&&A(`INVALID_CONTEXT`,`Duplicate shot ID.`);for(let e of[...n.shots,...n.shot?[n.shot]:[]])e.range.endFrameExclusive>n.scene.frameCount&&A(`INVALID_CONTEXT`,`Shot is outside the scene.`);return n.shot&&!n.shots.some(e=>e.id===n.shot.id&&e.range.startFrame===n.shot.range.startFrame&&e.range.endFrameExclusive===n.shot.range.endFrameExclusive)&&A(`INVALID_CONTEXT`,`Current shot and range must survive projection.`),n}function jn(e){let t=new Set;for(let n of Array.isArray(e?.ops)?e.ops:[]){let e=rt(n)?n.target?.kind:void 0;if(Qe.includes(e)){t.add(e);for(let t of rt(n.set)?Object.keys(n.set):[])Object.hasOwn(zt[e].properties,t)||A(`INVALID_ARGUMENT`,`Unknown ${e} path "${e}.${t}". Valid ${e} paths: ${Bt[e].join(`, `)}.`)}}t.size>1&&A(`INVALID_ARGUMENT`,`One domain per patch: split character, object, shot and stage edits into separate commands.`)}function Mn(e){(!rt(e)||!Ze.includes(e.name))&&A(`UNKNOWN_TOOL`,`Unsupported Studio tool.`),e.name===`patch_elements`&&jn(e.args);let{args:t}=Dn(R({name:F(Ze),args:Ht[e.name]}),e);if(e.name===`inspect_studio`&&t.ids&&t.query!==void 0&&A(`INVALID_ARGUMENT`,`IDs and query are exclusive.`),e.name===`operate_studio`&&(!Object.keys(t).length||t.view&&!Object.keys(t.view).length)&&A(`INVALID_ARGUMENT`,`Transient operation must specify an action.`),t.ops){let e=t.ops.filter(e=>e.op===`create`&&e.name!==void 0).map(e=>e.name.normalize(`NFC`).trim());new Set(e).size!==e.length&&A(`DUPLICATE_NAME`,`Create names must be unique; resolve existing targets by ID.`);for(let e of t.ops)e.op===`update`&&Object.keys(e).length===2&&A(`INVALID_ARGUMENT`,`Update has no fields.`),e.facing&&e.rotationDeg&&A(`INVALID_ARGUMENT`,`Facing and rotationDeg are exclusive: facing sets yaw only (toward/away/same-as/yawDeg); rotationDeg {x,y,z} sets the full rotation, with y as the yaw.`),e.op===`group`&&e.childIds.includes(e.parentId)&&A(`INVALID_ARGUMENT`,`Cannot group an object under itself.`),e.op===`create`&&e.parent!==void 0&&e.name!==void 0&&e.parent.normalize(`NFC`).trim()===e.name.normalize(`NFC`).trim()&&A(`INVALID_ARGUMENT`,`Cannot group an object under itself.`);t.collisionPolicy===`avoid`&&!t.ops.some(e=>[`create`,`update`].includes(e.op)&&e.position?.relativeTo)&&A(`INVALID_ARGUMENT`,`collisionPolicy avoid needs at least one op with position.relativeTo (it nudges outward from that reference); other ops are placed as given.`)}if(e.name===`frame_shot`&&t.framing.exact&&JSON.stringify(t.framing.exact.position)===JSON.stringify(t.framing.exact.lookAt)&&A(`INVALID_ARGUMENT`,`Camera position and aim cannot coincide.`),e.name===`patch_elements`)for(let e of t.ops)Object.keys(e.set).length||A(`INVALID_ARGUMENT`,`Patch has no fields.`);return e.name===`verify_result`&&(!!t.receiptId==!!t.targets&&A(`INVALID_ARGUMENT`,`Exactly one of receiptId or targets is required.`),t.checks.includes(`motion`)&&t.range===void 0&&(t.range=`whole_clip`,Object.defineProperty(t,"rangeWasDefaulted",{value:!0,enumerable:!1}))),{name:e.name,args:t}}function Nn(e){if(e?.ok===!1){let t=Dn(Tn,e,`INVALID_RECEIPT`);return tt(JSON.stringify(t))>8192&&A(`INVALID_RECEIPT`,`Failure receipt exceeds 8 KiB.`),(t.mutated===!1&&t.preserved.authoredState!==`unchanged`||t.mutated===!0&&t.preserved.authoredState!==`changed`||t.mutated===`unknown`&&(t.preserved.authoredState!==`unknown`||t.recovery.action!==`reconcile`||t.recovery.retryAllowed===!0))&&A(`INVALID_RECEIPT`,`Failure must preserve uncertainty and actual state evidence.`),nt(t)}let t=Dn(wn,e,`INVALID_RECEIPT`);if(tt(JSON.stringify(t))>8192&&A(`INVALID_RECEIPT`,`Receipt exceeds 8 KiB; use a detail cursor.`),t.delta.some(e=>!t.affectedIds.includes(e.id)||!Object.keys(e.after).length)&&A(`INVALID_RECEIPT`,`Readback must identify affected targets and actual state.`),t.ops){let e=t.ops.some(e=>e.status===`partial`);t.ops.some((e,t)=>e.index!==t)&&A(`INVALID_RECEIPT`,`Operation results must report every operation in order.`),t.ops.some(e=>e.status===`partial`!=!!e.droppedPaths?.length)&&A(`INVALID_RECEIPT`,`A partial operation must name the paths the domain dropped, and only a partial one may.`),t.status===`applied`&&e&&A(`INVALID_RECEIPT`,`Applied status cannot hide a dropped path.`),t.status===`partial`&&!e&&A(`INVALID_RECEIPT`,`Partial status requires at least one dropped path.`),t.status===`noop`&&t.ops.some(e=>e.status===`applied`)&&A(`INVALID_RECEIPT`,`A noop cannot report an applied operation.`)}if(t.status===`started`||t.status===`completed`?(t.revision.after<t.revision.before&&!t.nextHost&&A(`INVALID_RECEIPT`,`Completion revisions must not move backwards in one document.`),t.status===`started`&&(t.authored||t.undo||t.revision.before!==t.revision.after)&&A(`INVALID_RECEIPT`,`Started jobs cannot claim an authored commit.`),t.kind===`mutation`&&(!t.authored||!t.undo||t.revision.after<=t.revision.before||!t.delta.length)&&A(`INVALID_RECEIPT`,`A completed composite mutation needs retained undo and advancing revision evidence.`),t.undo&&(!t.authored||!t.affectedIds.length)&&A(`INVALID_RECEIPT`,`An undo entry requires an authored result and affected targets.`)):t.status===`noop`||t.status===`transient`?((t.authored||t.undo!==null||t.revision.before!==t.revision.after)&&A(`INVALID_RECEIPT`,`Non-authored operations cannot create history or advance authored revision.`),t.status===`noop`&&(t.mutated!==!1||t.delta.length)&&A(`INVALID_RECEIPT`,`Noop must prove no mutation.`),t.status===`transient`&&(!t.view||t.view.after<t.view.before||!t.delta.length)&&A(`INVALID_RECEIPT`,`Transient receipt requires view revisions and actual readback.`)):((!t.authored||!t.undo||t.revision.after!==t.revision.before+1||!t.affectedIds.length||!t.delta.length||t.mutated===!1)&&A(`INVALID_RECEIPT`,`Authored mutation requires one revision and one undo entry with actual readback.`),t.delta.length<t.affectedIds.length&&!t.detailCursor&&A(`INVALID_RECEIPT`,`Omitted batch readback requires a detail cursor.`)),t.status===`undone`&&(new Set(t.restoredTargets.map(e=>e.targetId)).size!==t.affectedIds.length||t.restoredTargets.some(e=>!t.affectedIds.includes(e.targetId)||Object.keys(ht).some(n=>e[n]!==t.host[n])))&&A(`INVALID_RECEIPT`,`Undo must identify every restored target and its new token in the bound host.`),t.status===`installed`){(!t.jobId||!t.artifactId||!t.installed||!t.verification||!t.affectedIds.includes(t.installed.characterId))&&A(`INVALID_RECEIPT`,`Installation requires correlated target, artifact and verification evidence.`);let{frameCount:e,blocks:n}=t.installed,r=0;for(let e of n)(e.startFrame!==r||e.endFrameExclusive<=r||e.endFrameExclusive-r>120)&&A(`INVALID_RECEIPT`,`Installed schedule is not contiguous or bounded.`),r=e.endFrameExclusive;(r!==e||t.installed.durationSeconds!==e/24||t.verification.range.startFrame!==0||t.verification.range.endFrameExclusive!==e||t.verification.evaluatedFrames>e)&&A(`INVALID_RECEIPT`,`Installed schedule and verification coverage disagree.`),t.verification.status===`verified`&&t.verification.evaluatedFrames!==e&&A(`INVALID_RECEIPT`,`Verified motion requires whole-clip coverage.`),t.verification.status===`unverified`&&t.explicitUnverifiedAcceptance!==!0&&t.acceptance!==`advisory-policy`&&A(`INVALID_RECEIPT`,`Unverified installation requires explicit user or advisory-policy acceptance.`)}else(t.installed||t.verification||t.jobId&&![`started`,`completed`].includes(t.status)||t.artifactId||t.explicitUnverifiedAcceptance!==void 0)&&A(`INVALID_RECEIPT`,`Installation evidence is exclusive to installed receipts.`);return nt(t)}var Pn=`cozyclay.locale`;function Fn(){try{let e=localStorage.getItem(Pn);return e===`ko`||e===`en`?e:null}catch{return null}}var In=Fn()??`en`,Ln=In===`ko`,Rn=Fn()!==null;function B(e,t){return Ln?t:e}function zn(e){if(e===`ko`||e===`en`){try{localStorage.setItem(Pn,e)}catch{}window.location.reload()}}var Bn=.02,Vn=(e,t,n)=>Math.min(n,Math.max(t,e)),Hn=(e,t=0)=>typeof e==`number`&&Number.isFinite(e)?e:t;function Un(e){let t=0;for(let n=0;n<e.length-1;n+=1)t+=(e[n]+e[n+1])/2;return t}function Wn(e,t){let n=Vn(t,0,1)*(e.length-1),r=Math.min(e.length-2,Math.floor(n)),i=n-r;return e[r]*(1-i)+e[r+1]*i}function Gn(e,t=24){if(!e.length)return Array(t).fill(1);if(e.length===1)return Array(t).fill(e[0]);let n=Array(t);for(let r=0;r<t;r+=1)n[r]=Wn(e,r/(t-1));return n}function Kn(e){let t=e.map(e=>Math.max(0,Hn(e,0))),n=Un(t)/(t.length-1);return n<=1e-9?t.map(()=>1):t.map(e=>e/n)}function qn(e){return e.every(e=>Math.abs(e-1)<1e-6)}function Jn(){return{cuts:[],envelopes:[Array(24).fill(1)]}}function Yn(e){return!e||e.cuts.length===0&&e.envelopes.every(qn)}function Xn(e){if(!e||typeof e!=`object`)return null;let t=Array.isArray(e.cuts)?e.cuts:[],n=[];for(let e of t){let t=Hn(e?.t,NaN),r=Hn(e?.d,NaN);if(!(t>0&&t<1&&r>0&&r<1))continue;let i=n[n.length-1];i&&(t<=i.t+1e-6||r<=i.d+1e-6)||n.push({t,d:r})}let r=Array.isArray(e.envelopes)?e.envelopes:[],i=[];for(let e=0;e<=n.length;e+=1){let t=Array.isArray(r[e])?r[e].map(e=>Hn(e,1)):[];i.push(Kn(Gn(t.length>=2?t:[1,1])))}return{cuts:n,envelopes:i}}function Zn(e,t,n,r=.18){let i=e.length,a=Math.max(0,Hn(n,0)),o=Vn(Hn(t,0),0,1),s=r/3,c=Array(i);for(let e=0;e<i;e+=1){let t=Math.abs(e/(i-1)-o);c[e]=t<=s?1:t>=r?0:.5*(1+Math.cos((t-s)/(r-s)*Math.PI))}let l=e.map((e,t)=>Math.max(0,e*(1-c[t])+a*c[t])),u=e=>e===0||e===i-1?.5:1,d=i-1,f=0,p=0;for(let e=0;e<i;e+=1)c[e]>1e-9?f+=u(e)*l[e]:p+=u(e)*l[e];if(p>1e-9){let e=Math.max(0,(d-f)/p);for(let t=0;t<i;t+=1)c[t]<=1e-9&&(l[t]*=e);if(d-f<0){let e=d/f;for(let t=0;t<i;t+=1)c[t]>1e-9&&(l[t]*=e)}}else if(f>1e-9){let e=d/f;for(let t=0;t<i;t+=1)l[t]*=e}else return Array(i).fill(1);return l}function Qn(e,t){let n=e.length,r=Un(e);if(r<=1e-9)return Vn(t,0,1);let i=Vn(t,0,1)*(n-1),a=Math.min(n-2,Math.floor(i)),o=i-a,s=0;for(let t=0;t<a;t+=1)s+=(e[t]+e[t+1])/2;let c=e[a]*(1-o)+e[a+1]*o;return s+=(e[a]+c)/2*o,s/r}function $n(e,t){let n=Vn(Hn(t,0),0,1);if(!e)return n;let r=[{t:0,d:0},...e.cuts,{t:1,d:1}],i=0;for(;i<r.length-2&&n>r[i+1].t;)i+=1;let a=r[i],o=r[i+1],s=o.t-a.t,c=s>1e-9?(n-a.t)/s:1;return a.d+(o.d-a.d)*Qn(e.envelopes[i],c)}function er(e,t,n){let r=Array(24);for(let i=0;i<24;i+=1)r[i]=Wn(e,t+(n-t)*(i/23));return r}function tr(e,t){let n=e??Jn(),r=Hn(t,NaN);if(!(r>.02&&r<.98))return e;for(let t of n.cuts)if(Math.abs(t.t-r)<.02)return e;let i=$n(n,r);if(!(i>1e-6&&i<1-1e-6))return e;let a=0;for(;a<n.cuts.length&&r>n.cuts[a].t;)a+=1;let o=a===0?{t:0}:n.cuts[a-1],s=a===n.cuts.length?{t:1}:n.cuts[a],c=(r-o.t)/(s.t-o.t),l=n.envelopes[a];return{cuts:[...n.cuts.slice(0,a),{t:r,d:i},...n.cuts.slice(a)],envelopes:[...n.envelopes.slice(0,a),Kn(er(l,0,c)),Kn(er(l,c,1)),...n.envelopes.slice(a+1)]}}function nr(e,t){if(!e||!e.cuts[t])return e;let n=[{t:0,d:0},...e.cuts,{t:1,d:1}],r=n[t],i=n[t+1],a=n[t+2],o=(i.t-r.t)/(a.t-r.t),s=(i.d-r.d)/(a.d-r.d),c=1-o,l=1-s,u=e.envelopes[t],d=e.envelopes[t+1],f=Array(24);for(let e=0;e<24;e+=1){let t=e/23;if(t<=o){let n=Wn(u,o>1e-9?t/o:0);f[e]=s/Math.max(1e-9,o)*n}else{let n=Wn(d,c>1e-9?(t-o)/c:0);f[e]=l/Math.max(1e-9,c)*n}}return{cuts:[...e.cuts.slice(0,t),...e.cuts.slice(t+1)],envelopes:[...e.envelopes.slice(0,t),Kn(f),...e.envelopes.slice(t+2)]}}function rr(e){return{width:(e.footprint?.width??1)*(e.scaleX??1),height:(e.height??1)*(e.scaleY??1),depth:(e.footprint?.depth??1)*(e.scaleZ??1)}}var V=(e,t)=>[e[0]+t[0],e[1]+t[1],e[2]+t[2]],H=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],U=(e,t)=>[e[0]*t,e[1]*t,e[2]*t],W=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],ir=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],G=e=>Math.hypot(e[0],e[1],e[2]),ar=(e,t)=>G(H(e,t));function K(e){let t=G(e);return t>1e-12?[e[0]/t,e[1]/t,e[2]/t]:[0,0,0]}var or=(e,t,n)=>Math.min(n,Math.max(t,e)),sr=e=>e*Math.PI/180,cr=e=>e*180/Math.PI,lr=()=>[[1,0,0],[0,1,0],[0,0,1]];function q(e,t){let n=[[0,0,0],[0,0,0],[0,0,0]];for(let r=0;r<3;r++)for(let i=0;i<3;i++)n[r][i]=e[r][0]*t[0][i]+e[r][1]*t[1][i]+e[r][2]*t[2][i];return n}var J=(e,t)=>[e[0][0]*t[0]+e[0][1]*t[1]+e[0][2]*t[2],e[1][0]*t[0]+e[1][1]*t[1]+e[1][2]*t[2],e[2][0]*t[0]+e[2][1]*t[1]+e[2][2]*t[2]],Y=e=>[[e[0][0],e[1][0],e[2][0]],[e[0][1],e[1][1],e[2][1]],[e[0][2],e[1][2],e[2][2]]],ur=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]];function dr(e){let t=sr(e),n=Math.cos(t),r=Math.sin(t);return[[1,0,0],[0,n,-r],[0,r,n]]}function X(e){let t=sr(e),n=Math.cos(t),r=Math.sin(t);return[[n,0,r],[0,1,0],[-r,0,n]]}function fr(e){let t=sr(e),n=Math.cos(t),r=Math.sin(t);return[[n,-r,0],[r,n,0],[0,0,1]]}function pr(e,t){let[n,r,i]=K(e),a=sr(t),o=Math.cos(a),s=Math.sin(a),c=1-o;return[[o+n*n*c,n*r*c-i*s,n*i*c+r*s],[r*n*c+i*s,o+r*r*c,r*i*c-n*s],[i*n*c-r*s,i*r*c+n*s,o+i*i*c]]}function mr(e,t){let n=K(e),r=H(t,U(n,W(t,n)));return G(r)<1e-9&&(r=H([0,1,0],U(n,n[1])),G(r)<1e-9&&(r=H([1,0,0],U(n,n[0])))),r=K(r),ur(n,r,ir(n,r))}var hr=(e,t,n,r)=>q(mr(n,r),Y(mr(e,t)));function gr(e){let t=e[0][0],n=e[1][1],r=e[2][2],i=t+n+r,a,o,s,c;if(i>0){let t=.5/Math.sqrt(i+1);c=.25/t,a=(e[2][1]-e[1][2])*t,o=(e[0][2]-e[2][0])*t,s=(e[1][0]-e[0][1])*t}else if(t>n&&t>r){let i=2*Math.sqrt(1+t-n-r);c=(e[2][1]-e[1][2])/i,a=.25*i,o=(e[0][1]+e[1][0])/i,s=(e[0][2]+e[2][0])/i}else if(n>r){let i=2*Math.sqrt(1+n-t-r);c=(e[0][2]-e[2][0])/i,a=(e[0][1]+e[1][0])/i,o=.25*i,s=(e[1][2]+e[2][1])/i}else{let i=2*Math.sqrt(1+r-t-n);c=(e[1][0]-e[0][1])/i,a=(e[0][2]+e[2][0])/i,o=(e[1][2]+e[2][1])/i,s=.25*i}let l=Math.hypot(a,o,s,c);return[a/l,o/l,s/l,c/l]}function _r([e,t,n,r]){return[[1-2*(t*t+n*n),2*(e*t-n*r),2*(e*n+t*r)],[2*(e*t+n*r),1-2*(e*e+n*n),2*(t*n-e*r)],[2*(e*n-t*r),2*(t*n+e*r),1-2*(e*e+t*t)]]}var vr=(e,t)=>cr(Math.acos(or(W(K(e),K(t)),-1,1))),yr=.01;function br(e){let t=e.bones,n=t.map(e=>e.name),r=Object.fromEntries(n.map((e,t)=>[e,t])),i=t.map(e=>e.parent),a=n.map(()=>[]);i.forEach((e,t)=>{e>=0&&a[e].push(t)});let o=n.map((e,t)=>{let n=[],r=[t];for(;r.length;){let e=r.shift();n.push(e),r.unshift(...a[e])}return n}),s=t.map(e=>e.localPos.map(e=>e*yr)),c=t.map(e=>_r(e.localQuat)),l=t.map(e=>e.worldPos.map(e=>e*yr)),u=t.map(e=>_r(e.worldQuat)),d=e.landmarks,f=r.Head,p=e=>J(Y(u[f]),H(e.map(e=>e*yr),l[f])),m={mouth:p(d.mouth),headCentre:p(d.headEllipsoid.centre),headRadii:d.headEllipsoid.radii.map(e=>e*yr),sole:{ball:(d.sole?.ball??0)*yr,tip:(d.sole?.tip??0)*yr}};return{model:e.model,names:n,index:r,parent:i,children:a,subtree:o,restLocalPos:s,restLocalRot:c,restWorldPos:l,restWorldRot:u,landmarks:m}}function xr(e){return{P:e.restWorldPos.map(e=>e.slice()),R:e.restWorldRot.map(e=>e.map(e=>e.slice()))}}function Sr(e,t,n,r,i){for(let a of e.subtree[n])t.P[a]=V(r,J(i,H(t.P[a],r))),t.R[a]=q(i,t.R[a])}function Cr(e,t){return{quats:e.names.map((n,r)=>{let i=e.parent[r];return gr(i<0?t.R[r]:q(Y(t.R[i]),t.R[r]))}),hips:t.P[e.index.Hips].slice()}}function wr(e,t,n){let r=[],i=[];for(let a of e.subtree[e.index.Hips]){let o=e.parent[a],s=_r(t[a]);if(o<0){i[a]=s,r[a]=n.slice();continue}i[a]=q(i[o],s),r[a]=V(r[o],J(i[o],e.restLocalPos[a]))}return{P:r,R:i}}var Tr=(e,t,n)=>V(e.P[t],J(e.R[t],n)),Er=(e,t,n,r)=>J(t.R[n],J(Y(e.restWorldRot[n]),r)),Dr=(e,t,n)=>Math.acos(or((n*n-e*e-t*t)/(2*e*t),-1,1))*180/Math.PI,Or=(e,t,n)=>Math.sqrt(e*e+t*t+2*e*t*Math.cos(n*Math.PI/180));function kr(e,t,n,r=145,i=150){let a=Or(e,t,r);if(n>=a)return n;let o=a-Or(e,t,i);return n>a-2*o?n+(a-n)*(a-n)/(4*o):a-o}function Ar(e,t,n,r,i,a=145,o=150){let s=Or(n,r,a),c=G(H(t,e));if(c>=s)return t;let l=kr(n,r,c,a,o),u=U(i,Or(n,r,o)),d=V(e,u),f=H(t,d),p=G(f)>1e-9?K(f):U(i,-1),m=W(p,u);return V(d,U(p,-m+Math.sqrt(Math.max(0,m*m-W(u,u)+l*l))))}var jr=(e,t)=>Er(e,t,e.index.Spine2??e.index.Hips,[0,0,-1]),Mr=(e,t)=>Er(e,t,e.index.Hips,[0,1,0]),Nr=(e,t,n)=>Dr(e,t,kr(e,t,Or(e,t,n)));function Pr(e,t,n,r,[i,a,o]=[`Arm`,`ForeArm`,`Hand`]){let s=t.P[e.index[`${n}${i}`]],c=t.P[e.index[`${n}${a}`]],l=t.P[e.index[`${n}${o}`]];return Dr(G(H(c,s)),G(H(l,c)),G(H(r,s)))}function Fr(e,t,n){let r=e.index[`${n}Arm`],i=e.index[`${n}ForeArm`],a=H(t.P[i],t.P[r]),o=H(t.P[e.index[`${n}Hand`]],t.P[i]),s=Math.acos(or(W(K(a),K(o)),-1,1))*180/Math.PI,c=ir(a,o);s>145&&G(c)>1e-12&&Sr(e,t,i,t.P[i].slice(),pr(c,Nr(G(a),G(o),s)-s))}var Ir={elbow:[145,150,jr],knee:[150,160,Mr]};function Lr(e,t,n,r,i,a,o,s,c=null){let l=t.P[n],u=t.P[r],d=t.P[i],f=G(H(u,l)),p=G(H(d,u)),m=Ir[c],h=m?Ar(l,a,f,p,m[2](e,t),m[0],m[1]):a,g=h===a?0:G(H(h,a)),_=H(h,l),v=G(_),y=U(_,1/Math.max(v,1e-9)),b=or(v,Math.abs(f-p)+1e-4,(f+p)*.9995),x=(f*f-p*p+b*b)/(2*b),S=Math.sqrt(Math.max(f*f-x*x,0)),C=K(H(o,U(y,W(o,y)))),w=V(l,V(U(y,x),U(C,S))),T=Er(e,t,n,s);Sr(e,t,n,l.slice(),hr(H(u,l),T,H(w,l),C));let E=Er(e,t,r,s),D=V(l,U(y,b));return Sr(e,t,r,t.P[r].slice(),hr(H(t.P[i],t.P[r]),E,H(D,t.P[r]),C)),g||v-b}function Rr(e,t,n,r,i,a=null){let o=e.index[`${n}Foot`],s=e.index[`${n}ToeBase`],c=H(e.restWorldPos[s],e.restWorldPos[o]),l=a?J(a.R,J(X(r-a.yaw),J(dr(i),c))):J(X(r),J(dr(i),c)),u=a?J(a.R,[0,1,0]):[0,1,0];Sr(e,t,o,t.P[o].slice(),hr(H(t.P[s],t.P[o]),Er(e,t,o,[0,1,0]),l,u));let d=e.index[`${n}Toe_End`];if(!a&&i>0&&d!==void 0){let n=H(t.P[d],t.P[s]),r=[n[0],0,n[2]];G(r)>1e-6&&Sr(e,t,s,t.P[s].slice(),hr(n,[0,1,0],r,[0,1,0]))}}function zr(e,t,n){let r=e.index[`${n}Hand`],i=e.index[`${n}HandMiddle1`],a=K(H(t.P[i],t.P[r])),o=H(t.P[e.index[`${n}HandIndex1`]],t.P[e.index[`${n}HandPinky1`]]);return o=K(H(o,U(a,W(o,a)))),{d:a,l:o,n:ir(a,o)}}function Br(e,t,n,r){let i=e.index[`${n}Arm`],a=e.index[`${n}Hand`],o=pr(H(t.P[a],t.P[i]),r);Sr(e,t,i,t.P[i].slice(),o),Sr(e,t,a,t.P[a].slice(),Y(o))}function Vr(e,t,n,r,i){if(!r&&!i)return;let a=e.index[`${n}Hand`],o=e.index[`${n}ForeArm`],s=K(H(t.P[a],t.P[o])),{l:c}=zr(e,t,n),l=K(H(c,U(s,W(c,s))));Sr(e,t,a,t.P[a].slice(),pr(l,or(i,-70,70))),Sr(e,t,a,t.P[a].slice(),pr(s,or(r,-85,85)))}var Hr={relaxed:{Index:[12,18,10],Middle:[15,20,12],Ring:[18,22,12],Pinky:[20,24,14],Thumb:[15,10,8]},fist:{Index:[80,95,60],Middle:[85,95,60],Ring:[85,95,60],Pinky:[85,95,60],Thumb:[15,10,8]},grip:{Index:[55,60,35],Middle:[60,62,35],Ring:[62,62,35],Pinky:[65,62,35],Thumb:[15,10,8]},cigarette:{Index:[8,10,6],Middle:[10,12,8],Ring:[60,75,45],Pinky:[65,80,45],Thumb:[35,25,20]},point:{Index:[0,0,0],Middle:[80,95,60],Ring:[85,95,60],Pinky:[85,95,60],Thumb:[40,30,30]},spherical:{Index:[35,40,25],Middle:[38,42,25],Ring:[40,42,25],Pinky:[42,44,25],Thumb:[15,10,8]}},Ur={spherical:{Index:9,Middle:2,Ring:-5,Pinky:-12}};function Wr(e,t,n){let r=Hr.relaxed;return r[t][n]+Object.entries(e??{}).reduce((e,[i,a])=>e+(a||0)*((Hr[i]?.[t]?.[n]??r[t][n])-r[t][n]),0)}var Gr=(e,t)=>Hr.fist[e][t];function Kr(e,t,n,r){let i=n===`Left`?-1:1,a=(e,t)=>Wr(r,e,t);for(let i of[`Index`,`Middle`,`Ring`,`Pinky`]){let a=Object.entries(r??{}).reduce((e,[t,n])=>e+(n||0)*(Ur[t]?.[i]??0),0),o=e.index[`${n}Hand${i}1`];a&&o!==void 0&&Sr(e,t,o,t.P[o].slice(),pr(zr(e,t,n).n,a))}for(let r of[`Index`,`Middle`,`Ring`,`Pinky`,`Thumb`])for(let o=0;o<3;o++){let s=e.index[`${n}Hand${r}${o+1}`];if(s===void 0)continue;let{l:c,d:l}=zr(e,t,n),u=r===`Thumb`&&o===0?l:c;Sr(e,t,s,t.P[s].slice(),pr(u,i*a(r,o)))}let o=[0,1,2,3].map(e=>Object.entries(r??{}).reduce((t,[n,r])=>t+(r||0)*(qr[n]?.[e]??0),0));o.some(Boolean)&&Jr(e,t,n,o)}var qr={fist:[-70,-5,5,80],grip:[-30,-30,30,10],spherical:[-40,-20,20,10]};function Jr(e,t,n,[r,i,a,o]){let s=n===`Left`?-1:1,c=t=>e.index[`${n}HandThumb${t}`];if(c(1)===void 0)return;let{d:l,n:u}=zr(e,t,n);Sr(e,t,c(1),t.P[c(1)].slice(),pr(l,s*r)),Sr(e,t,c(1),t.P[c(1)].slice(),pr(u,i));for(let[n,r]of[[2,a],[3,o]]){let i=K(ir(K(H(t.P[c(n+1)],t.P[c(n)])),u));Sr(e,t,c(n),t.P[c(n)].slice(),pr(i,s*r))}}var Yr=(e,t)=>[e[3]*t[0]+e[0]*t[3]+e[1]*t[2]-e[2]*t[1],e[3]*t[1]-e[0]*t[2]+e[1]*t[3]+e[2]*t[0],e[3]*t[2]+e[0]*t[1]-e[1]*t[0]+e[2]*t[3],e[3]*t[3]-e[0]*t[0]-e[1]*t[1]-e[2]*t[2]],Xr=e=>[-e[0],-e[1],-e[2],e[3]],Zr=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3];function Qr(e){let t=Math.hypot(e[0],e[1],e[2],e[3]);return t>1e-12?[e[0]/t,e[1]/t,e[2]/t,e[3]/t]:[0,0,0,1]}function $r(e){let t=e[3]<0?-1:1,n=e[0]*t,r=e[1]*t,i=e[2]*t,a=e[3]*t,o=Math.hypot(n,r,i);if(o<1e-12)return[2*n,2*r,2*i];let s=2*Math.atan2(o,a)/o;return[n*s,r*s,i*s]}function ei(e){let t=Math.hypot(e[0],e[1],e[2]);if(t<1e-12)return Qr([e[0]/2,e[1]/2,e[2]/2,1]);let n=Math.sin(t/2)/t;return[e[0]*n,e[1]*n,e[2]*n,Math.cos(t/2)]}var ti=(e,t)=>Yr(Yr(e,[t[0],t[1],t[2],0]),Xr(e)).slice(0,3);function ni(e,t){let n=1+e[0]*t[0]+e[1]*t[1]+e[2]*t[2];if(n>1e-9)return Qr([e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0],n]);let r=Math.abs(e[0])<.9?[0,e[2],-e[1]]:[-e[2],0,e[0]],i=Math.hypot(...r);return[r[0]/i,r[1]/i,r[2]/i,0]}var ri=(e,t)=>{let n=t*Math.PI/360,r=Math.sin(n);return[e[0]*r,e[1]*r,e[2]*r,Math.cos(n)]},ii=(e,t,n)=>Yr(e,ei($r(Yr(Xr(e),t)).map(e=>e*n))),ai={"y-bot-tpose":new URL(`/assets/y-bot-tpose-body-Dy1VKChZ.json`,``+import.meta.url),"x-bot-tpose":new URL(`/assets/x-bot-tpose-body-BusyR3eg.json`,``+import.meta.url)},oi=new Map;function si(e){let t=e.protocol===`file:`?globalThis.process?.getBuiltinModule?.(`node:fs`):null;if(t)return JSON.parse(t.readFileSync(e,`utf8`));let n=new XMLHttpRequest;if(n.open(`GET`,e.href,!1),n.send(),n.status!==200)throw Error(`motion body fit ${e.pathname}: HTTP ${n.status}`);return JSON.parse(n.responseText)}function ci(e){return oi.has(e)||oi.set(e,si(ai[e])),oi.get(e)}function li(){return Promise.all(Object.entries(ai).map(async([e,t])=>{if(oi.has(e))return;let n=await fetch(t);if(!n.ok)throw Error(`motion body fit ${t.pathname}: HTTP ${n.status}`);let r=await n.json();oi.has(e)||oi.set(e,r)}))}var ui=.1,di=new Map;function fi(e){let t=typeof Buffer<`u`?Buffer.from(e,`base64`):Uint8Array.from(atob(e),e=>e.charCodeAt(0));return new Int8Array(t.buffer,t.byteOffset,t.byteLength)}function pi(e,t){let n=new Set([t,e.parent[t],...e.children[t]]);return/^(Left|Right)Arm$/.test(e.names[t])&&n.add(e.parent[e.parent[t]]),/^(Left|Right)UpLeg$/.test(e.names[t])&&n.add(e.index.Spine),n}function mi(e){if(!ai[e.model])return null;if(di.has(e.model))return di.get(e.model);let t=ci(e.model),n=Object.entries(t.grids).map(([n,r])=>{let i=r.dims.map(e=>(e-1)*t.step/2),a=r.min.map((e,t)=>e+i[t]);return{b:e.index[n],min:r.min,dims:r.dims,data:fi(r.data),centre:a,reach:G(i)}}),r=Object.fromEntries(Object.entries(t.radii).map(([t,n])=>[e.index[t],n])),i={step:t.step,grids:n,radii:r,skip:new Map(Object.keys(r).map(t=>[+t,pi(e,+t)]))};return di.set(e.model,i),i}function hi(e,t,n){let[r,i,a]=t.dims,o=e.step,s=(n[0]-t.min[0])/o,c=(n[1]-t.min[1])/o,l=(n[2]-t.min[2])/o;if(s<0||c<0||l<0||s>r-1||c>i-1||l>a-1)return ui;let u=Math.min(r-2,Math.floor(s)),d=Math.min(i-2,Math.floor(c)),f=Math.min(a-2,Math.floor(l)),p=s-u,m=c-d,h=l-f,g=(e,n,r)=>t.data[((u+e)*i+d+n)*a+f+r],_=g(0,0,0)*(1-p)+g(1,0,0)*p,v=g(0,0,1)*(1-p)+g(1,0,1)*p,y=g(0,1,0)*(1-p)+g(1,1,0)*p,b=g(0,1,1)*(1-p)+g(1,1,1)*p;return((_*(1-m)+y*m)*(1-h)+(v*(1-m)+b*m)*h)/1e3}var gi=new WeakMap;function _i(e,t){let n=gi.get(t);return n||(n=e.grids.map(e=>V(t.P[e.b],J(t.R[e.b],e.centre))),gi.set(t,n)),n}function vi(e,t,n,r=null){let i=ui,a=-1,o=_i(e,t);return e.grids.forEach((s,c)=>{if(r?.has(s.b)||G(H(n,o[c]))-s.reach>i)return;let l=hi(e,s,J(Y(t.R[s.b]),H(n,t.P[s.b])));l<i&&(i=l,a=s.b)}),{d:i,bone:a}}function yi(e,t,n,r=null,i=.01){let a=[0,1,2].map(a=>{let o=[0,0,0];return o[a]=i,vi(e,t,V(n,o),r).d-vi(e,t,H(n,o),r).d}),o=G(a);return o>1e-9?U(a,1/o):null}var bi=e=>/^(Left|Right)Arm$/.test(e)?.5:/^(Left|Right)UpLeg$/.test(e)?.3:0,xi=(e,t)=>/Hand$/.test(e.names[t])?e.index[e.names[t].replace(/Hand$/,`HandMiddle1`)]:e.children[t][0];function Si(e,t,n,r){let i=e.radii[r],a=xi(t,r);if(!i||a===void 0)return[];let o=n.P[r],s=H(n.P[a],o),c=bi(t.names[r]);return i.filter(([e])=>e>=c).map(([e,t])=>({p:V(o,U(s,e)),r:t,t:e}))}var Ci=/^(Spine\d?|Neck|Head)$/,wi=(e,t)=>e.children[t].find(t=>Ci.test(e.names[t]))??xi(e,t),Ti=.25;function Ei(e,t,n,r,i,a=null){let o=vi(e,n,r,a);if(o.d>=i||o.bone<0)return r;let s=n.P[o.bone],c=wi(t,o.bone),l=H(c===void 0?s:n.P[c],s),u=H(r,V(s,U(l,W(l,l)>1e-9?or(W(H(r,s),l)/W(l,l),0,1):0))),d=G(u)>1e-4?U(u,1/G(u)):yi(e,n,r,a);if(!d)return r;let f=new Set(e.grids.map(e=>e.b).filter(e=>e!==o.bone)),p=t=>vi(e,n,V(r,U(d,t)),f).d>=i,m=0,h=.02;for(;!p(h)&&h<Ti;)m=h,h=Math.min(Ti,h*2);for(let e=0;e<10;e++){let e=(m+h)/2;p(e)?h=e:m=e}return V(r,U(d,h))}var Di=.03;function Oi(e){let t=mi(e);return t&&{body:t,skip:new Set(e.names.map((e,t)=>/(Arm|ForeArm|Hand|Neck|Head.*)$/.test(e)?t:-1).filter(e=>e>=0))}}function ki(e,t,n,r,i,a){let o=0,s=bi(t.names[r]);for(let[t,c]of e.radii[r]??[]){if(t<s)continue;let{d:l,bone:u}=vi(e,n,V(i,U(H(a,i),t)),e.skip.get(r));u>=0&&(o=Math.max(o,c-l))}return o}function Ai(e,t,n,r){let i={depth:0,p:null,into:-1};for(let a of Si(e,t,n,r)){let{d:t,bone:o}=vi(e,n,a.p,e.skip.get(r)),s=a.r-t;o>=0&&s>i.depth&&(i={depth:s,p:a.p,into:o,r:a.r})}return i}var ji={twist:[-85,85],flex:[-70,70],dev:[-35,20]},Mi={twist:[-50,50],flex:[-40,40],dev:[-25,15]},Ni=.5,Pi=[0,0,-1],Fi=72,Ii=.02,Li=400,Ri=.5,zi=100/(180/Math.PI),Bi=180/Math.PI,Vi=70,Hi=30,Ui=2;function Wi(e,t=8,n=400){let r=0;for(let i of[`twist`,`flex`,`dev`]){let a=e[i],o=a>=0?Mi[i][1]:-Mi[i][0],s=a>=0?ji[i][1]:-ji[i][0],c=Math.abs(a);r+=c<=o?(c/o)**2:1+t*((Math.min(c,s)-o)/Math.max(1e-6,s-o))**2+(c>s?n*((c-s)/s)**2:0)}return r}function Gi(e,t){let n=K(H(t,e)),r=Math.acos(or(-n[1],-1,1))*Bi;return Ui*(Math.max(0,r-Vi)/Hi)**2}function Ki(e,t,n,r){let i=gr(q(t,Y(e)));i[3]<0&&(i=i.map(e=>-e));let a=2*Math.atan2(W([i[0],i[1],i[2]],n),i[3]),o=ei(U(n,a)),s=$r(Yr(i,Xr(o))),c=J(_r(o),r),l=K(H(c,U(n,W(c,n)))),u=ir(n,l);return{twist:a*Bi,flex:W(s,l)*Bi,dev:W(s,u)*Bi,axF:l,axD:u}}function qi(e,t=0){let n=0;for(let[r,[i,a]]of Object.entries(ji)){let o=(e[r]-(i+a)/2)/((a-i)/2),s=Math.max(0,Math.abs(o)-1+t);n+=o*o+Li*s*s}return n}function Ji(e,t,n,r,i,a,o,s=0,c=!1){let l=e.index,u=l[`${n}Arm`],d=l[`${n}ForeArm`],f=l[`${n}Hand`],p=t.P[u],m=G(H(t.P[d],p)),h=G(H(t.P[f],t.P[d])),g=H(Ar(p,i,m,h,jr(e,t)),p),_=G(g),v=U(g,1/Math.max(_,1e-9)),y=or(_,Math.abs(m-h)+1e-4,(m+h)*.9995),b=(m*m-h*h+y*y)/(2*y),x=Math.sqrt(Math.max(m*m-b*b,0)),S=e=>H(e,U(v,W(e,v))),C=K(G(S(a))>1e-6?S(a):ir(v,Math.abs(v[1])<.9?[0,1,0]:[1,0,0])),w=ir(v,C),T=V(p,U(v,y)),E=e.restWorldRot,D=J(Y(E[d]),H(e.restWorldPos[f],e.restWorldPos[d])),O=J(Y(E[d]),o),k=q(Y(E[d]),E[f]),ee=J(Y(t.R[f]),zr(e,t,n).l),te=e=>{let t=V(U(C,Math.cos(e)),U(w,Math.sin(e))),n=H(T,V(p,V(U(v,b),U(t,x)))),i=q(hr(D,O,n,t),k),a=Ki(i,r,K(n),J(i,ee)),o=Math.abs(Math.atan2(Math.sin(e),Math.cos(e)))/zi,l=V(p,V(U(v,b),U(t,x)));return{pv:t,need:a,elbow:l,cost:(c?Wi(a)+Gi(p,l):qi(a,s))+Ri*(1-Math.cos(e))+Li*Math.max(0,o-1)**2}},ne=e=>G(S(e))>1e-6?Math.atan2(W(e,w),W(e,C)):0;return{at:te,angleOf:ne,softmin:()=>{let e=Array.from({length:Fi},(e,t)=>te(2*Math.PI*t/Fi)),t=Math.min(...e.map(e=>e.cost)),n=e.reduce((e,n)=>V(e,U(n.pv,Math.exp(-(n.cost-t)/Ii))),[0,0,0]);return G(n)>.001?ne(n):2*Math.PI*e.findIndex(e=>e.cost===t)/Fi},miss:Math.max(0,_-y)}}function Yi(e,t,n,r,i,a,o,{toward:s,w:c=1,margin:l=0,comfort:u=!1}={}){let d=Ji(e,t,n,r,i,a,o,l,u),f=s?d.angleOf(s):d.softmin(),p=d.at(c*Math.atan2(Math.sin(f),Math.cos(f)));return{pole:p.pv,need:p.need,cost:p.cost,miss:d.miss,elbow:p.elbow}}var Xi=3,Zi=1,Qi=.005,$i=.15,ea=4,ta=(e,[t,n])=>Math.min(n,Math.max(t,e));function na(e,t,n,r,i,a){let o=U(H(t.P[r],t.P[i]),1/G(H(t.P[r],t.P[i]))),s=q(t.R[i],q(Y(e.restWorldRot[i]),e.restWorldRot[r])),{axF:c,axD:l,...u}=Ki(s,a,o,J(q(s,Y(t.R[r])),zr(e,t,n).l)),d=Object.fromEntries(Object.entries(u).map(([e,t])=>[e,ta(t,ji[e])])),f=q(q(pr(V(U(c,d.flex),U(l,d.dev)),Math.hypot(d.flex,d.dev)),pr(o,d.twist)),s);return Sr(e,t,i,t.P[i].slice(),pr(o,Ni*d.twist)),Sr(e,t,r,t.P[r].slice(),q(f,Y(t.R[r]))),u}function ra(e,t,n){let r=e.index,i=r[`${n}Arm`],a=H(t.P[r[`${n}ForeArm`]],U(V(t.P[i],t.P[r[`${n}Hand`]]),.5));return G(a)>Qi?a:Er(e,t,i,Pi)}function ia(e,t,n,r,i,a,o){let s=e.index[`${n}Hand`],c=q(Y(t.R[s]),i.R),l=J(Y(t.R[s]),H(i.pos,t.P[s])),u=_r(ii(gr(t.R[s]),gr(q(r.R,Y(c))),a)),d=t.P[s].slice(),f=e=>H(r.pos,J(e,l));return{goal:u,plane:ra(e,t,n),wristAt:o===`wrist`?()=>d:o===`palm`?f:e=>V(d,U(H(f(e),d),a))}}function aa(e,t,n,r,i,a,o){let s=e.index,c=s[`${n}Arm`],l=s[`${n}ForeArm`],u=s[`${n}Hand`],{w:d}=r,{goal:f,plane:p,wristAt:m}=ia(e,t,n,r.palm,r.measure(t),d,r.pin),h=Yi(e,t,n,f,m(f),p,i,{toward:r.pole,w:d,comfort:r.comfort}),g=0,_=0,v={twist:0,flex:0,dev:0};for(let r=0;r<Xi;r++){let a=m(r?t.R[u]:f);_=Pr(e,t,n,a),g=Lr(e,t,c,l,u,a,h.pole,i,`elbow`),v=na(e,t,n,u,l,f)}a[`hold_${o}`]={w:d,miss:Math.max(0,g),...v,swivel:la(t,c,l,u,p),..._>145?{fold:_}:{},...r.second?{second:r.second}:{}},a[`arm_miss_${o}`]*=1-d}function oa(e,t,n,r){let{goal:i,plane:a,wristAt:o}=ia(e,t,n,r.palm,r.measure(t),r.w);return Ji(e,t,n,i,o(i),a,Pi,0,r.comfort)}function sa(e,t,n,r,i,{shoulder:a=!1}={}){let{goal:o,plane:s,wristAt:c}=ia(e,t,n,r,i,1),l=c(o),u=Yi(e,t,n,o,l,s,Pi,{margin:$i}),d=e.index,f=t.P[d[`${n}Arm`]],p=G(H(t.P[d[`${n}ForeArm`]],f)),m=G(H(t.P[d[`${n}Hand`]],t.P[d[`${n}ForeArm`]])),h=Math.max(0,Or(p,m,145)-G(H(l,f))),g=a?Yi(e,t,n,o,l,s,Pi,{comfort:!0}):u;return(a?Wi(g.need)+Gi(f,g.elbow)+ca(e,t,n,f,g.elbow,l):u.cost)+Zi*((u.miss*100)**2+(h*100)**2)}function ca(e,t,n,r,i,a){let o=mi(e),s=e.index;return o?ea*(Math.max(ki(o,e,t,s[`${n}Arm`],r,i),ki(o,e,t,s[`${n}ForeArm`],i,a))*100)**2:0}function la(e,t,n,r,i){let a=K(H(e.P[r],e.P[t])),o=e=>H(e,U(a,W(e,a)));return vr(o(H(e.P[n],e.P[t])),o(i))}var ua=[[`torso_lo`,`Spine`,`Spine2`,.12],[`torso_hi`,`Spine2`,`Neck`,.105],[`hips`,`LeftUpLeg`,`RightUpLeg`,.095],[`neck`,`Neck`,`Head`,.055],...[`Left`,`Right`].flatMap(e=>{let t=e===`Left`?`l`:`r`;return[[`thigh_${t}`,`${e}UpLeg`,`${e}Leg`,.07],[`shin_${t}`,`${e}Leg`,`${e}Foot`,.05],[`uarm_${t}`,`${e}Arm`,`${e}ForeArm`,.042],[`farm_${t}`,`${e}ForeArm`,`${e}Hand`,.033],[`hand_${t}`,`${e}Hand`,`${e}HandMiddle3`,.022]]})],da=(e,t,n=9)=>Array.from({length:n},(r,i)=>V(e,U(H(t,e),i/(n-1))));function fa(e,t){let n=J(Y(t.R),H(e,t.pos)),r=[0,t.half[1],0],i=[Math.abs(n[0]-r[0])-t.half[0],Math.abs(n[1]-r[1])-t.half[1],Math.abs(n[2]-r[2])-t.half[2]];return G([Math.max(i[0],0),Math.max(i[1],0),Math.max(i[2],0)])+Math.min(Math.max(i[0],i[1],i[2]),0)}function pa(e,t,n,r){let i=1/0,a=H(r,n),o=W(a,a);for(let r of da(e,t)){let e=o<1e-12?0:or(W(H(r,n),a)/o,0,1);i=Math.min(i,G(H(r,V(n,U(a,e)))))}return i}function ma(e,t,n){let r=Tr(t,e.index.Head,e.landmarks.headCentre),i=t.R[e.index.Head],a=J(Y(i),H(n,r)),o=e.landmarks.headRadii;return(1-G([a[0]/o[0],a[1]/o[1],a[2]/o[2]]))*Math.min(...o)}var ha=e=>Math.round(e.restWorldPos[e.index.LeftFoot][1]*1e3)/1e3,ga=(e,t,n,r)=>r?Tr(t,n,J(Y(e.restWorldRot[n]),[0,-r,0])):t.P[n];function _a(e,t,n){let r=e.index,i=e.restWorldPos,a=e.landmarks.sole??{},o=r[`${n}Foot`],s=r[`${n}ToeBase`],c=r[`${n}Toe_End`]??s,l=[i[o][0],.005,i[o][2]-.045];return{heel:Tr(t,o,J(Y(e.restWorldRot[o]),H(l,i[o]))),ball:ga(e,t,s,a.ball),tip:ga(e,t,c,a.tip)}}function va(e,t){let n=J(Y(t.R),H(e,t.pos));n[1]-=t.half[1];let r=n.map((e,n)=>Math.abs(e)-t.half[n]),i;if(Math.max(...r)<0){let e=r.indexOf(Math.max(...r));i=[0,0,0],i[e]=Math.sign(n[e])||1}else i=n.map((e,t)=>r[t]>0?Math.sign(e)*r[t]:0);let a=G(i);return J(t.R,a>1e-12?U(i,1/a):[0,1,0])}var ya=.05;function ba(e){let t=e?.half;if(!t)return{kind:`box`};if(e.renderer===`sphere`){let e=(t[0]+t[1]+t[2])/3;return Math.max(...t)-Math.min(...t)<=ya*e?{kind:`sphere`,r:e}:{kind:`box`}}return e.renderer===`cylinder`?{kind:`cylinder`,r:Math.min(t[0],t[2]),h:2*t[1]}:{kind:`box`}}var xa=(e,t)=>{let n=J(Y(e.R),H(t,e.pos));return n[1]-=e.half[1],n},Sa=e=>V(e.pos,J(e.R,[0,e.half[1],0]));function Ca(e,t){let n=ba(e);if(n.kind===`sphere`)return G(H(t,Sa(e)))-n.r;if(n.kind===`cylinder`){let r=xa(e,t),i=Math.hypot(r[0],r[2])-n.r,a=Math.abs(r[1])-n.h/2;return Math.hypot(Math.max(i,0),Math.max(a,0))+Math.min(Math.max(i,a),0)}return fa(t,e)}function wa(e,t){let n=ba(e);if(n.kind===`sphere`){let n=H(t,Sa(e)),r=G(n);return r>1e-12?U(n,1/r):J(e.R,[0,1,0])}if(n.kind===`cylinder`){let r=xa(e,t),i=Math.hypot(r[0],r[2]),a=i-n.r,o=Math.abs(r[1])-n.h/2,s=i>1e-12?[r[0]/i,0,r[2]/i]:[1,0,0],c=[0,Math.sign(r[1])||1,0],l;l=a<=0&&o<=0?a>o?s:c:V(U(s,Math.max(a,0)),U(c,Math.max(o,0)));let u=G(l);return J(e.R,u>1e-12?U(l,1/u):s)}return va(t,e)}function Ta(e,t){return H(t,U(wa(e,t),Ca(e,t)))}function Ea(e,t,n,r){let i=-1/0;for(let a of da(t,n))i=Math.max(i,r-Ca(e,a));return i}var Da=.022,Oa=.012,ka=.04,Aa=.15,ja=12,Ma=(e,t,n,r)=>e?.fix!==!1&&e?.fix?.grasp!==!1&&!!t?.prop&&(t.grasp!==void 0||t.at===void 0&&t.along===void 0&&Na(n,r));function Na(e,t){let n=Object.entries(e?.objects??{}).filter(([e,n])=>e===t||n.ancestors?.includes(t));return n.length===1&&ba(n[0][1]).kind!==`box`}var Pa=new WeakMap;function Fa(e,t,n,r,i,a){Pa.has(n)||Pa.set(n,new Map);let o=Pa.get(n),s=`${r}|${i.prop}|${a.pos.map(e=>e.toFixed(6)).join(`,`)}`;if(o.has(s))return o.get(s);let c=t.props[i.prop],l=wf[c.hand],u=xr(e),d=Jf(e,t,u,{prop:i.prop},!0),f=e=>J(Y(d.R),H(e,d.pos)),p=t=>f(u.P[e.index[`${l}${t}`]]),m=[[p(`Hand`),p(`HandMiddle1`),Da],[p(`HandIndex1`),p(`HandPinky1`),Oa]],h=Ia(n,r),g=Object.entries(n.objects).filter(([e,t])=>e===r||t.ancestors?.includes(r)),_=[0,1,0],v=e=>{let t={pos:V(a.pos,U(_,e)),R:a.R},n=-1/0;for(let[,e]of g){let r={...e,...Yf(t,Xf(h,e))};for(let[e,t,i]of m)n=Math.max(n,Ea(r,e,t,i))}return n},y=v(0),b=c.hand===`l`?1:-1,x=y>-.002,S=0,C=x?Aa:ka,w=x?b:-b;if(x||v(w*C)>-.002)for(let e=0;e<ja;e++){let e=(S+C)/2;v(w*e)>-.002===x?S=e:C=e}else S=0;let T={pos:V(a.pos,U(_,w*(x?C:S))),R:a.R};return o.set(s,T),T}function Ia(e,t){let n=e.objects[t];return n?{pos:n.pos,R:n.R}:Object.values(e.objects).find(e=>e.ancestors?.[0]===t)?.ancestorPoses?.[0]??{pos:[0,0,0],R:[[1,0,0],[0,1,0],[0,0,1]]}}function La(e,t){let n=Math.min(1,Math.max(0,(t-e)/4));return n*n*(3-2*n)}var Ra=(e,t,n)=>({pos:V(e.pos,U(H(t.pos,e.pos),n)),R:t.R}),za=[`schema`,`fps`,`frames`,`label`,`keys`,`anchors`,`props`,`fits`,`objects`,`generators`,`checks`,`fix`,`use`,`channels`,`detourRadius`,`search`,`goals`,`flow`,`idle`],Ba=[`f`,`set`,`step`,`src`],Va=[`skill`,`args`,`f0`],Ha={world:[`p`],body:[`p`],bone:[`bone`,`offset`],segment:[`from`,`to`,`t`,`tMin`,`offset`,`reach`],object:[`object`,`local`,`socket`,`grasp`],landmark:[`name`],prop:[`prop`,`point`,`offset`],person:[`person`,`bone`,`offset`]},Ua=[`hand`,`origin`,`points`],Wa=[`side`,`anchor`,`effector`,`offset`,`orient`],Ga={hinge:[`pivot`,`axis`,`channel`],carry:[`prop`,`at`,`along`,`visible`,`level`,`grab`,`release`,`keys`,`fall`,`grasp`,`mass`],switch:[`visible`,`level`],follow:[`follow`,`offset`,`aim`,`visible`,`level`],free:[`keys`,`fall`,`visible`,`level`]},Ka=[`at`,`onto`,`bounce`,`tumble`,`v`],qa=[`f`,`pos`,`rot`,`aim`,`roll`,`lean`],Ja=[`type`,`f0`,`steps`,`step`,`period`,`swing`,`halfWidth`,`lift`,`heading`,`turnDistance`,`pelvisHigh`,`pelvisLow`,`firstStep`,`armSwing`,`vary`],Ya=[`contacts`,`orient`,`below`,`clearance`,`appear`,`supports`,`allow`,`limits`,`mouthPoints`],Xa={contacts:[`name`,`point`,`target`,`tol`,`when`],orient:[`name`,`from`,`to`,`along`,`minCos`,`when`],below:[`name`,`joint`,`ref`,`min`,`when`],clearance:[`name`,`part`,`object`,`min`,`frames`],appear:[`name`,`channel`,`joint`,`anchor`,`tol`],supports:[`object`,`part`,`tol`],allow:[`part`,`object`,`depth`]},Za=[`name`,`near`,`above`,`moved`,`still`,`speed`,`tol`,`by`,`at`,`mode`,`after`,`before`],Qa=[`name`,`distance`,`position`,`frames`,`every`],$a=[`joint`,`bone`,`prop`,`anchor`,`landmark`,`object`,`person`],eo=[`essentials`,`spec`,`skills`,`anchors`,`props`,`objects`,`checks`,`goals`,`probes`,`channels`,`refs`,`fix`,`examples`],to=e=>e.flatMap(e=>[`${e}_l`,`${e}_r`]),no=new Set([`root`,...to([`foot`,`knee`,`hand`,`elbow`])]),ro=new Set(to([`knee`,`elbow`])),io=new Set([`yaw`,`pitch`,`roll`,`spine_yaw`,`spine_pitch`,`spine_roll`,`head_yaw`,`head_pitch`,`head_roll`,`arm_rest`,`arm_hang`,...to([`fyaw`,`fpitch`,`armw`,`wtwist`,`wflex`,`aswing`,`abend`])]),ao=new Set(to([`fingers`])),oo=new Set([`arm_hang`]),so=[`relaxed`,`fist`,`grip`,`cigarette`,`point`,`spherical`],co=[`power`,`pinch`,`hook`,`palm`,`spherical`],lo={power:`grip`,pinch:`cigarette`,hook:`grip`,palm:`relaxed`,spherical:`spherical`},uo={power:[0,0,.02],hook:[0,0,.02],pinch:[.025,0,.01],palm:[-.045,0,.015],spherical:[-.015,0,.035]},fo=[[/^(armw)_[lr]$/,0,1,`0 FK, 1 IK to the hand target`],[/^arm_hang$/,0,1,`1 = a free FK forearm hangs plumb`],[/^w_.+_[lr]$/,0,1,`hand-target weight; a hand's sum <= 1`],[/^wtwist_[lr]$/,-85,85,`twist about the forearm, deg`],[/^wflex_[lr]$/,-70,70,`flex about the knuckle line, deg`],[/^fpitch_[lr]$/,-60,90,`toe-down pitch, deg: + lifts the heel (toes flat), - lifts the toes`],[/^(spine_pitch|head_pitch)$/,-120,120,`degrees, + bends forward`],[/^(spine_roll|head_roll)$/,-90,90,`degrees`]],po=e=>fo.find(([t])=>t.test(e))??null,mo={yaw:`yaw 0 faces +Z and + turns toward +X`,fyaw:`foot heading, as yaw`,pole:`body-frame direction (root yaw): +z forward, +x its left, +y up`,foot:`ANKLE target, world m (standing 0.087 X Bot, 0.105 Y Bot)`,hand:`WRIST target, world m`,root:`hips joint, world m (standing 1.03 X Bot, 0.99 Y Bot)`},ho={root:mo.root,yaw:`deg; ${mo.yaw}`,pitch:`degrees`,roll:`degrees`,spine_yaw:`degrees`,spine_pitch:`deg, + bends forward`,spine_roll:`degrees`,head_yaw:`degrees`,head_pitch:`degrees, + looks down`,head_roll:`degrees`,arm_rest:`FK arms down, deg, default 72`,arm_hang:`1 = a free FK forearm hangs plumb (standIdle and walks key it)`,foot:mo.foot,fyaw:mo.fyaw,fpitch:`toe-down pitch, degrees, + heel up`,knee:`knee pole, ${mo.pole}`,armw:`0 = FK arm, 1 = IK to hand_* / the anchors`,hand:mo.hand,elbow:`elbow pole, ${mo.pole}`,wtwist:`wrist twist, degrees`,wflex:`wrist flex, degrees`,aswing:`FK arm swing, deg, + forward`,abend:`FK elbow bend, deg`,fingers:`{ preset: weight 0..1 }`},go=e=>e.replace(/_[lr]$/,``),_o=[[[`frames`,`when`,`range`,`f`,`from`,`within`,`during`,`at`],[`when`,`frames`,`at`,`f`]],[[`max`,`maxDist`,`distance`,`tolerance`,`limit`],[`tol`,`min`]]];function vo(e,t){for(let[n,r]of _o){let i=n.includes(e)&&r.find(n=>t.includes(n)&&n!==e);if(i)return`; did you mean "${i}"?`}return xo(e,t,Math.max(2,Math.floor(e.length/3)))}var yo=e=>Array.isArray(e)&&e.length===3&&e.every(Number.isFinite),Z=e=>JSON.stringify(e)?.slice(0,60);function bo(e,t){let n=Array.from({length:e.length+1},(e,n)=>[n,...Array(t.length).fill(0)]);for(let e=1;e<=t.length;e++)n[0][e]=e;for(let r=1;r<=e.length;r++)for(let i=1;i<=t.length;i++)n[r][i]=Math.min(n[r-1][i]+1,n[r][i-1]+1,n[r-1][i-1]+(e[r-1]===t[i-1]?0:1));return n[e.length][t.length]}function xo(e,t,n=Math.max(3,Math.floor(e.length/3))){let r=null,i=1/0;for(let n of t){let t=bo(e,n);t<i&&(r=n,i=t)}return r&&i<=n?`; did you mean "${r}"?`:``}var So={pelvis:`Hips`,hip:`Hips`,hips:`Hips`,root:`Hips`,chest:`Spine2`,upperchest:`Spine2`,torso:`Spine1`,belly:`Spine`,abdomen:`Spine`,neck:`Neck`,head:`Head`},Co={hand:`Hand`,wrist:`Hand`,foot:`Foot`,ankle:`Foot`,toe:`ToeBase`,toes:`ToeBase`,ball:`ToeBase`,arm:`Arm`,upperarm:`Arm`,forearm:`ForeArm`,lowerarm:`ForeArm`,elbow:`ForeArm`,shoulder:`Shoulder`,clavicle:`Shoulder`,thigh:`UpLeg`,upleg:`UpLeg`,upperleg:`UpLeg`,leg:`Leg`,lowerleg:`Leg`,shin:`Leg`,calf:`Leg`,knee:`Leg`},wo={l:`Left`,left:`Left`,r:`Right`,right:`Right`},To=e=>e.toLowerCase().replace(/[\s_.-]+/g,``);function Eo(e,t){let n=t.toLowerCase();return e.names.find(e=>e.toLowerCase()===n)??null}function Do(e,t){let n=To(t);if(So[n])return Eo(e,So[n]);let r=t.toLowerCase().trim(),i=/^(l|r|left|right)[\s_.-]+(.+)$/.exec(r)??/^(left|right)(.+)$/.exec(r),a=/^(.+?)[\s_.-]+(l|r|left|right)$/.exec(r)??/^(.+?)(left|right)$/.exec(r),[o,s]=i?[i[1],i[2]]:a?[a[2],a[1]]:[];return o?Eo(e,`${wo[o]}${Co[To(s)]??To(s)}`):null}function Oo(e,t){if(typeof t!=`string`||!t)return{bone:null,hint:``};if(e.index[t]!==void 0)return{bone:t,hint:``};let n=t.replace(/^mixamorig\d*:/i,``),r=Eo(e,t)??Eo(e,n)??Do(e,n);return r?{bone:r,hint:``}:{bone:null,hint:xo(n,e.names)}}function ko(e,t,n,r){return!t||t.index[r]!==void 0||(e(`${n} names unknown bone "${r}"${xo(String(r),t.names)}`),!1)}function Ao(e,t,n,r,{groups:i=!1}={}){let a=Object.keys(t?.objects??{});if(!a.length||a.includes(r))return!0;let o=Ud(t,r);return o.length&&i?!0:(o.length?e(`${n} names "${r}", a group (Empty) with no body of its own; its parts are ${o.join(`, `)}. Name one part`):e(`${n} names object "${r}", which is not in the scene${xo(String(r),[...new Set([...a,...a.flatMap(e=>t.objects[e].ancestors??[]),...Object.keys(t.others??{})])])}`),!1)}function jo(e,t,n,r,i){let[a,o]=String(i).split(/:(.*)/s);if(a===`joint`)return ko(t,n,r,o);if(a===`anchor`)return e.anchors?.[o]?!0:t(`${r} "${i}" names no anchor`);if(a===`prop`){let[n,a]=(o??``).split(`.`);return e.props?.[n]?.points?.[a]||a===`origin`?!0:t(`${r} "${i}" names no prop point`)}t(`${r} "${i}" must be joint:<Bone>, prop:<prop>.<point> or anchor:<name>`)}var Mo=new Set([`empty`,`plane`,`cutout`]);function No(e,t){let n=[];for(let r=t.get(e.parent);r&&!n.includes(r)&&!r.attach;r=t.get(r.parent))n.push(r);return n}var Po=e=>({pos:[e.x??0,e.y??0,e.z??0],R:q(dr(e.rotX??0),q(X(e.rot??0),fr(e.rotZ??0)))}),Fo=new WeakMap;function Io(e){let t=e?.objects??{};if(Fo.has(t))return Fo.get(t);let n={};for(let[e,r]of Object.entries(t))(r.ancestors??[]).forEach((t,i)=>{let a=r.ancestorPoses?.[i];n[t]??={pos:a?.pos??[0,0,0],R:a?.R??[[1,0,0],[0,1,0],[0,0,1]],ancestors:r.ancestors.slice(i+1),children:[]};let o=i?r.ancestors[i-1]:e;n[t].children.includes(o)||n[t].children.push(o)});return Fo.set(t,n),n}function Lo(e=[]){let t={},n={},r=new Map(e.filter(Boolean).map(e=>[e.id,e]));for(let i of e){if(!i||i.hidden)continue;let e=rr(i),a=No(i,r);if(Mo.has(i.renderer)||!(e.width>0&&e.height>0&&e.depth>0)){n[i.id]={renderer:i.renderer,ancestors:a.map(e=>e.id),...i.grasp?{grasp:i.grasp}:{}};continue}t[i.id]={name:i.name,renderer:i.renderer,...Po(i),half:[e.width/2,e.height/2,e.depth/2],ancestors:a.map(e=>e.id),...a.length?{ancestorPoses:a.map(Po)}:{},...i.glow?{glow:!0}:{},...i.grasp?{grasp:i.grasp}:{}}}return{objects:t,groups:Io({objects:t}),others:n}}var Ro={"x-bot-tpose":{model:`x-bot-tpose`,units:`cm`,mesh:`Beta_Surface`,bones:[{name:`Hips`,parent:-1,localPos:[-7727290721959434e-21,104.27487182617188,1.5543158054351807],localQuat:[.006458545995471647,0,0,.9999791433743129],worldPos:[-7727290721959434e-21,104.27487182617188,1.5543158054351807],worldQuat:[.006458545995471649,0,0,.9999791433743129]},{name:`Spine`,parent:0,localPos:[-42558306661763523e-26,10.182436647133528,-383026943495679e-29],localQuat:[-.0801557216468605,0,-2.4806808368112424e-7,.9967823535191669],worldPos:[-7727716305026052e-21,114.45645899708516,1.6858405330789255],worldQuat:[-.07371628519129939,1.6021591284630476e-9,-2.4806290981795794e-7,.9972792534177845]},{name:`Spine1`,parent:1,localPos:[0,10.00267477114727,3552713678800501e-30],localQuat:[6162975822039155e-48,-49630836753181624e-40,5211237859084076e-38,1],worldPos:[-2780995758607294e-21,124.35042288428505,.21513282040928483],worldQuat:[-.07371628519129939,1.6021591284630476e-9,-2.480629098179579e-7,.9972792534177845]},{name:`Spine2`,parent:2,localPos:[113754220886636e-28,9.322090642186126,2.823681128916178e-7],localQuat:[.01288561985057818,-4771173867766652e-25,-3.7024045453006494e-8,.9999169769541195],worldPos:[18291488873430703e-22,133.57119939581565,-1.1555073459065734],worldQuat:[-.06085960369636199,-4.799512607436978e-9,-2.849511007796114e-7,.9981463362843349]},{name:`Neck`,parent:3,localPos:[41474883340816403e-26,16.865321474300316,55067062021407764e-30],localQuat:[-693889390390723e-32,-8271806125530272e-39,5190558343770245e-38,1],worldPos:[11433183430736414e-21,150.31158623305856,-3.204535645093104],worldQuat:[-.060859603696361994,-4.799512607436981e-9,-2.8495110077961134e-7,.9981463362843349]},{name:`Head`,parent:4,localPos:[-1.0756747747233872e-7,9.341923497302815,2.841040809958507],localQuat:[-693889390390723e-32,-36734198463196485e-56,-10339757656912817e-40,1],worldPos:[1671650538423477e-20,159.92947501239226,-1.5195243864816557],worldQuat:[-.060859603696362,-4.7995126074369775e-9,-2.849511007796113e-7,.9981463362843349]},{name:`HeadTop_End`,parent:5,localPos:[9.856974393531148e-7,20.962781993760927,10.122935199433357],localQuat:[9020562075079394e-32,-4963083675318166e-39,-3143286327701505e-38,1],worldPos:[298931534294587e-19,181.96684091859,5.981578858112073],worldQuat:[-.060859603696361904,-4.799512607437009e-9,-2.8495110077961134e-7,.9981463362843349]},{name:`RightShoulder`,parent:3,localPos:[-4.569970073784302,11.195844421252815,-.8066318609761822],localQuat:[-.48443063216376725,.5709636753028516,-.52616363833282,-.4030871739493107],worldPos:[-4.569961889633833,144.58610943784936,-3.316387285708532],worldQuat:[.45900076979447035,-.5378833301202727,.5599368183567869,.4318223893631366]},{name:`RightArm`,parent:7,localPos:[39968028886505635e-31,10.838175719528936,-2842170943040401e-29],localQuat:[-.024616241704842487,.002562291621043601,-.10349841681885355,.9943216547083585],worldPos:[-15.162807207946486,144.06130443716168,-5.548485110836629],worldQuat:[.4999999123070338,-.5000002750229358,.49999979787788545,.5000000147920203]},{name:`RightForeArm`,parent:8,localPos:[-9.964063352185804e-9,27.841518023440628,0],localQuat:[-17109853453384572e-39,-8816207631167156e-54,2938735877055719e-54,1],worldPos:[-43.004325231382126,144.06132057494256,-5.548489180140211],worldQuat:[.4999999123070338,-.5000002750229358,.49999979787788545,.5000000147920203]},{name:`RightHand`,parent:9,localPos:[2285859917883215e-20,28.328838348366197,4472538876143517e-21],localQuat:[6229948061854065e-38,2350988701644575e-53,-19852334701272682e-39,1],worldPos:[-71.33316357974921,144.0613325226415,-5.548470451934339],worldQuat:[.4999999123070338,-.5000002750229358,.49999979787788545,.5000000147920203]},{name:`RightHandMiddle1`,parent:10,localPos:[-2368732377888705e-20,9.532501220730282,3985569264841615e-20],localQuat:[-9.781740202927786e-7,4908535656919963e-25,-.0005018059094885016,.9999998740949284],worldPos:[-80.86566480049744,144.061298192282,-5.5484955291275435],worldQuat:[.5002502631148101,-.4997497980010115,.4997483431213557,.5002513440251519]},{name:`RightHandMiddle2`,parent:11,localPos:[-8881784197001252e-30,3.700000000000017,0],localQuat:[3986107263256567e-37,1323489458050882e-38,.0008498714387871692,.9999996388592037],worldPos:[-84.56566293763908,144.0613075740096,-5.544782705328028],worldQuat:[-.4998253593741713,.5001747659318385,-.5001733119713432,-.4998264415205831]},{name:`RightHandMiddle3`,parent:12,localPos:[-25224267119483557e-29,2.9500000000000455,-1.5411302456413978e-8],localQuat:[-5680000760156732e-38,-3970467145889554e-38,-.00032184201183913403,.9999999482088584],worldPos:[-87.51566222254714,144.06131507131767,-5.54683672237727],worldQuat:[-.4999863107405839,.5000138752279871,-.5000124209192871,-.49998739241899415]},{name:`RightHandMiddle4`,parent:13,localPos:[1127986593019159e-28,2.9466287337241255,7.20586967872805e-9],localQuat:[1.5498268359238913e-7,.0009288141658670982,.00016639448508219264,.9999995548084492],worldPos:[-90.46229095218658,144.06132253675315,-5.546991694384452],worldQuat:[.49943854746932836,-.4996323747246579,.5005598653243383,.5003683130007397]},{name:`RightHandRing1`,parent:10,localPos:[-1.8651332219504173,9.103592315445724,.043069650068900955],localQuat:[6.963165823826897e-8,10850652509911485e-27,.0001558292973731088,.9999999878586124],worldPos:[-80.43675564821785,144.01826884807926,-7.413605017339948],worldQuat:[-.4999220263552031,.5000781487660197,-.5000777412794597,-.4999220592937387]},{name:`RightHandRing2`,parent:15,localPos:[-4440892098500626e-30,3.379273006312431,-2842170943040401e-29],localQuat:[75254050543037e-37,13234890125559426e-39,-.00022151509096650696,.9999999754655319],worldPos:[-83.81602849026015,144.01827033659325,-7.414658689507339],worldQuat:[.5000327889464959,-.4999673962237241,.4999669887298773,.5000328217947667]},{name:`RightHandRing3`,parent:16,localPos:[26290081223123707e-29,2.889684678650127,8202221124520293e-25],localQuat:[16000775075877487e-39,13234889885055366e-39,-.00011280510431914317,.9999999936375041],worldPos:[-86.70571314402952,144.01827160815185,-7.4142794883596075],worldQuat:[.5000891846393266,-.4999109867917636,.499910579294214,.5000892174416297]},{name:`RightHandRing4`,parent:17,localPos:[4716227408607665e-28,2.638815675202565,5682068149326369e-25],localQuat:[-1.339645129809642e-7,.00014607500499735936,-.0007992862081225936,.9999996699017618],worldPos:[-89.34452865122908,144.01827276927736,-7.41333786395688],worldQuat:[.5004155000832223,-.4994381238192544,.4995836834200939,.5005617154884825]},{name:`RightHandIndex1`,parent:10,localPos:[2.25983507131116,9.1082835183702,.5178621137028756],localQuat:[-6.059340578197898e-7,9953529057906979e-26,-.00016426752705445157,.9999999865079061],worldPos:[-80.4414477277744,143.54347484170384,-3.288636902648485],worldQuat:[.5000817363528871,-.4999184374449017,.49991735444845625,.5000824447930416]},{name:`RightHandIndex2`,parent:19,localPos:[-843769498715119e-29,3.7000000000000313,0],localQuat:[-47359322790488744e-39,-3970467069997446e-38,.00025564424489899254,.9999999673230096],worldPos:[-84.14144752826542,143.54348146979163,-3.2874218624291216],worldQuat:[-.4999539187402696,.5000462641269495,-.5000451813116483,-.49995462745726243]},{name:`RightHandIndex3`,parent:20,localPos:[-3423927807943983e-28,2.8500000000000227,-8893152880773414e-25],localQuat:[-13914829894769055e-38,-39704669556009313e-39,-8792197348428728e-20,.9999999961348633],worldPos:[-86.99144748059157,143.54348657664548,-3.287943125263367],worldQuat:[-.49999788186225497,.5000023052590155,-.5000012223814067,-.4999985904840416]},{name:`RightHandIndex4`,parent:21,localPos:[7900347043232614e-28,2.7721906128530236,5114202394906897e-25],localQuat:[8.659859370723384e-8,.0010026920012318767,8705832638285169e-20,.9999994935146673],worldPos:[-89.76363809337116,143.54349154251554,-3.2879626838817946],worldQuat:[.49945279532966436,-.4995441931072631,.5005458853548749,.5004561129854466]},{name:`RightHandThumb1`,parent:10,localPos:[2.6818519535315546,2.464805039121785,1.5739839631865493],localQuat:[.2532844925861686,.06161827244019283,-.22821025705768283,.9380672859078498],worldPos:[-73.79796992221794,142.48734898334772,-2.866619447484665],worldQuat:[.6789718782579114,-.19747746019729454,.5123797682139857,.48730566831705546]},{name:`RightHandThumb2`,parent:23,localPos:[-1887379141862766e-29,4.188985472990834,-2842170943040401e-29],localQuat:[-.002315749257559554,-.0011704489169351957,.009300110231568928,.9999533865657887],worldPos:[-77.01316043621617,140.61457222434876,-.9423386824772395],worldQuat:[.6765749035040036,-.20553967786615746,.5156358706838127,.4838589563451013]},{name:`RightHandThumb3`,parent:24,localPos:[-14210854715202004e-30,3.416271152352966,0],localQuat:[-.0016647383095556567,-.0008077810781858194,.006919747685379302,.9999743462849742],worldPos:[-79.66799955910238,139.08658379209294,.5702713693484767],worldQuat:[.6747462864925903,-.21146538352949726,.5180821304204447,.4812387625412099]},{name:`RightHandThumb4`,parent:25,localPos:[-13822276656583199e-30,2.5749773944199115,0],localQuat:[.005774853769703311,-.11750920454458612,-.048743708782553366,.9918579982867299],worldPos:[-81.68681626684736,137.9345819337196,1.6783234442112593],worldQuat:[.7432186106607572,-.23041213116196285,.41233882500284114,.47382807005935446]},{name:`RightHandPinky1`,parent:10,localPos:[-3.8062774279108913,8.076676225678526,.4867036950552688],localQuat:[4670719286902752e-21,2.4304698046602542e-9,.0005203629947084559,.9999998646002598],worldPos:[-79.40983953257197,143.5746349351307,-9.354749239786173],worldQuat:[.499741997111188,-.5002580522008165,.500262248259257,.49973743155597233]},{name:`RightHandPinky2`,parent:27,localPos:[-8881784197001252e-30,3.6000000000000654,0],localQuat:[4870027600139235e-37,529395781586262e-37,.0008462316753971022,.9999996419459117],worldPos:[-83.0098375822885,143.57460339401808,-9.358496377738998],worldQuat:[.49931848396687806,-.5006807705888573,.500684962782278,.49931391486245963]},{name:`RightHandPinky3`,parent:28,localPos:[-53290705182007514e-30,2.1000000000000085,-2.116385644512775e-8],localQuat:[1859605644060166e-37,-39704674301868344e-39,-.000496777829639297,.9999998766058863],worldPos:[-85.1098297375345,143.5745850175554,-9.364236374919699],worldQuat:[.49956714946047176,-.5004326584550336,.5004368529177667,.4995625824392057]},{name:`RightHandPinky4`,parent:29,localPos:[12789769243681803e-29,2.1157810760144855,1.4407362414203817e-8],localQuat:[-6.420659236909123e-8,.0015694812069815289,-4128528174330759e-20,.9999987675113715],worldPos:[-87.22560761141007,143.5745664664587,-9.367917366015948],worldQuat:[.4988017359417918,-.4996273949534528,.5011996406746996,.5003680791387806]},{name:`LeftShoulder`,parent:3,localPos:[4.570446071555214,11.195644630655181,-.80662723793772],localQuat:[.48442267749711376,.5709704717068556,-.5261616291252289,.40308972946685606],worldPos:[4.570454255590543,144.58590649477904,-3.316358019038552],worldQuat:[-.4589930047913493,-.5378899562605334,.5599354515710177,-.4318241616452356]},{name:`LeftArm`,parent:31,localPos:[-17763568394002505e-31,10.837705310376135,0],localQuat:[-.02460635908641656,-.002561394687342173,.10350452783474903,.9943212655210948],worldPos:[15.162823921302898,144.06131195632307,-5.548478497344785],worldQuat:[.5000007152647227,.4999994684527458,-.5000001196887698,.4999996965928613]},{name:`LeftForeArm`,parent:32,localPos:[8881784197001252e-30,27.841521654197066,-2842170943040401e-29],localQuat:[9612242362214153e-38,13234889800848425e-39,-2646977960169688e-38,1],worldPos:[43.00434557545168,144.06126546354233,-5.548455563844584],worldQuat:[.5000007152647227,.4999994684527458,-.5000001196887698,.4999996965928612]},{name:`LeftHand`,parent:33,localPos:[5438735050766752e-21,28.328834533709,-5.564248510836478e-7],localQuat:[-626962918533632e-37,-3970466940254537e-38,-26469779601696903e-39,1],worldPos:[71.333180109117,144.06121871342071,-5.548437667671921],worldQuat:[.5000007152647227,.4999994684527458,-.5000001196887698,.4999996965928613]},{name:`LeftHandThumb1`,parent:34,localPos:[-2.681731448380733,2.466144851985561,1.5761928025685847],localQuat:[.25309644676633125,-.06132323271522458,.2273527590163699,.9383455508133752],worldPos:[73.79932012001562,142.48502080725694,-2.866704767040701],worldQuat:[.6787362281261902,.19828588307841977,-.512706326258779,.48696207677299685]},{name:`LeftHandThumb2`,parent:35,localPos:[-6439293542825908e-30,4.18709445950184,2842170943040401e-29],localQuat:[-.002067032129087745,.0010427308040619535,-.008213407893731095,.9999635893478415],worldPos:[77.01712188965233,140.61296547844856,-.9502182343475976],worldQuat:[.6766109604816792,.2054209516609806,-.5155696739884216,.48392949077136155]},{name:`LeftHandThumb3`,parent:36,localPos:[5440092820663267e-30,3.4183883081631072,5684341886080802e-29],localQuat:[-.0015313589649970979,.0007452552330187441,-.006073119605284013,.9999801081784668],worldPos:[79.67313738956891,139.08416322654404,.5642862932655532],worldQuat:[.6749931166817439,.2106761779810745,-.5176795589715161,.48167179145825934]},{name:`LeftHandThumb4`,parent:37,localPos:[1482147737874584e-29,2.580581439610723,0],localQuat:[.005153407131366997,.12268277993699259,.04165153492193895,.9915581311958046],worldPos:[81.69402483309037,137.93008677758235,1.6794194947408763],worldQuat:[.7440625177876421,.2372081988172148,-.41152267473439397,.46984287609461295]},{name:`LeftHandIndex1`,parent:34,localPos:[-2.2598629283141953,9.109308911975873,.5180343214524328],localQuat:[6.665759936749852e-7,-29380348585960335e-27,-44076517660685066e-21,.9999999990284081],worldPos:[80.44248629452144,143.5431683499078,-3.28856742622205],worldQuat:[-.4999790098166289,-.5000211729545403,.5000224907507637,-.4999773245691765]},{name:`LeftHandIndex2`,parent:39,localPos:[-6217248937900877e-30,3.6999999999999886,-5684341886080802e-29],localQuat:[3.407213613716439e-7,3580919473408932e-26,.0001050981787351313,.9999999944771283],worldPos:[84.14248628039589,143.54315723870565,-3.2888905447059225],worldQuat:[.5000317287407754,.49996845295921,-.49997011163297345,.5000297028895362]},{name:`LeftHandIndex3`,parent:40,localPos:[-7172040739078511e-28,2.849999999999966,5684341886080802e-29],localQuat:[3.347505650683504e-7,-22176925334093855e-27,-6624910485486997e-20,.9999999978054721],worldPos:[86.99248625886426,143.54314673774508,-3.2885403736491297],worldQuat:[-.49999877255511554,-.5000014111400769,.5000034044318037,-.499996411845041]},{name:`LeftHandIndex4`,parent:41,localPos:[858424442640171e-27,2.7748656282368103,0],localQuat:[1.0594603907920247e-8,-.0003775632648206345,-13069537623522493e-21,.9999999286375816],worldPos:[89.76735188694607,143.54313465598005,-3.288567098859584],worldQuat:[.4998034244662043,.4998191246365437,-.5001986899385569,.5001786182186978]},{name:`LeftHandMiddle1`,parent:34,localPos:[-3660436011010404e-20,9.53340148931592,-3254047146583616e-20],localQuat:[4.084735851900896e-7,-12926721325528698e-27,-3164640698382836e-20,.9999999994991691],worldPos:[80.86658159844058,144.06123533397496,-5.548393210486787],worldQuat:[-.49998509605784175,-.5000150871851532,.5000161468752833,-.499983668904545]},{name:`LeftHandMiddle2`,parent:43,localPos:[-26645352591003757e-31,3.6999999999999744,-2842170943040401e-29],localQuat:[-1.6358384175735772e-7,-34673461654660564e-28,2119614093572879e-20,.9999999997753484],worldPos:[84.5665815912097,144.0612261326968,-5.548624346151146],worldQuat:[-.49999561254479435,-.500004571111091,.5000054672459868,-.49999434899615885]},{name:`LeftHandMiddle3`,parent:44,localPos:[-28697044740511046e-28,2.9500000006246694,-2842170943040401e-29],localQuat:[-4.275899279477681e-7,-884662274908745e-26,20689502181930057e-21,.9999999997858808],worldPos:[87.51658159123295,144.06121976164127,-5.548683572757025],worldQuat:[.5000057434864292,.4999944401365919,-.4999949087122563,.5000049075508173]},{name:`LeftHandMiddle4`,parent:45,localPos:[-8713030297258229e-27,2.952863459443819,-14210854715202004e-29],localQuat:[-2.6759425390821073e-8,-.0010241407152540845,279847572642705e-19,.9999994751761864],worldPos:[90.46944505000428,144.06121590958617,-5.548620670295296],worldQuat:[.499507394771273,.49946812318416767,-.5004927166472543,.5005307154158994]},{name:`LeftHandRing1`,parent:34,localPos:[1.865081040398466,9.104528720799948,.04302823471783768],localQuat:[6.248995762954407e-7,39451643110942306e-28,6313277301958232e-21,.9999999999798759],worldPos:[80.43771029434576,144.0181759602736,-7.413511224335965],worldQuat:[.5000041843415268,.49999599935162675,-.4999972754894557,.5000025407699983]},{name:`LeftHandRing2`,parent:47,localPos:[-4440892098500626e-30,3.1500000002318416,0],localQuat:[-19345585602378175e-38,0,4235164736267838e-37,1],worldPos:[83.58771029427925,144.01816676318134,-7.413468855985753],worldQuat:[.5000041843415268,.4999959993516267,-.4999972754894557,.5000025407699983]},{name:`LeftHandRing3`,parent:48,localPos:[2643289183090758e-21,2.9500000001810776,5.209859352817148e-7],localQuat:[-8757673760813274e-38,1323488980045867e-38,12839125457873287e-48,1],worldPos:[86.53771029421749,144.01815762904647,-7.413431820978903],worldQuat:[.5000041843415268,.4999959993516267,-.4999972754894557,.5000025407699983]},{name:`LeftHandRing4`,parent:49,localPos:[-23274330810174604e-21,2.644316435477009,-14607575451464072e-22],localQuat:[-2.7316933950438635e-7,.0004934373218353761,16047023509748673e-21,.9999998781310067],worldPos:[89.18202672913526,144.0181513691535,-7.413372979877784],worldQuat:[.5002587275852554,.5002347713372702,-.49974233369355947,.49976392320219065]},{name:`LeftHandPinky1`,parent:34,localPos:[3.806263215177876,8.077778818742132,.4868770149745387],localQuat:[-4975537953269548e-21,1.0178097892277194e-8,.0020448023965822897,.9999979093770162],worldPos:[79.41096125008677,143.57432960785403,-9.354694407950916],worldQuat:[.5010195873847003,.4989785133401168,-.498974180943756,.5010235354085267]},{name:`LeftHandPinky2`,parent:51,localPos:[-3552713678800501e-30,3.6000000000000796,2842170943040401e-29],localQuat:[6.285466836481913e-7,-13240964884135178e-26,-.00021066000242779323,.9999999778109838],worldPos:[83.01093113307373,143.5743594144743,-9.339968896109413],worldQuat:[.5009147763033496,.49908373336086237,-.499080029188825,.5009180955410079]},{name:`LeftHandPinky3`,parent:52,localPos:[23803181647963356e-29,2.1000000536000414,5684341886080802e-29],localQuat:[1.0560541723515637e-7,-70842344057535595e-28,-6708211165014274e-20,.9999999977499896],worldPos:[85.11091705114045,143.57437416212716,-9.332263779357556],worldQuat:[.500881348481691,.4991172819497667,-.4991136834189969,.5008845621759181]},{name:`LeftHandPinky4`,parent:53,localPos:[11048939541069558e-28,2.12553132909224,0],localQuat:[2.2034709579345264e-7,-.0007833987784531817,-.0002953855857226705,.9999996495167691],worldPos:[87.23643510003559,143.57438864025644,-9.324750154134009],worldQuat:[.5003428461990634,.49887255781562256,-.4996539623833923,.5011278531377935]},{name:`RightUpLeg`,parent:0,localPos:[-8.207789844904983,-6.771764137627812,-1.5122187689572422],localQuat:[2.7047671429134563e-9,.010356475588677583,.9999463702685825,2.6115275064568443e-7],worldPos:[-8.207797572195703,97.52320568879888,-.04524648166077205],worldQuat:[4.391377782486676e-9,.0038980599621582274,.9999924025353709,2.611298350175175e-7]},{name:`RightLeg`,parent:55,localPos:[6.19727558159866e-9,44.37146193723237,-16631140908884845e-29],localQuat:[-.03809137752293408,-816315213450579e-24,2.1414893185802513e-8,.9992742601300231],worldPos:[-8.207820750122902,53.15309218889458,.3006761286643062],worldQuat:[-4.658818794361865e-9,-.03419585714041286,.9994151506528081,2.396960478727042e-7]},{name:`RightFoot`,parent:56,localPos:[-5.538291603102152e-9,44.52781411684904,18207657603852567e-30],localQuat:[.45974006194132166,3725814189701004e-38,-1.2432846936543718e-7,.8880535318583977],worldPos:[-8.207842064194724,8.729415862750969,-2.742876350631811],worldQuat:[1.1031211398837241e-7,.4291034315577479,.903255359809859,3.3926052346823936e-7]},{name:`RightToeBase`,parent:57,localPos:[0,13.816866143314009,6217248937900877e-30],localQuat:[.335241516804437,7023902526244116e-39,-1.1130089220595614e-7,.9421322228915896],worldPos:[-8.207849224193675,.0007420744116171107,7.96768124078066],worldQuat:[1.6990321486208088e-7,.7070808667083169,.7071326947149592,3.8318019813577996e-7]},{name:`RightToe_End`,parent:58,localPos:[-17763568394002505e-31,9.278120542404253,4288670113483661e-30],localQuat:[-3388360082792521e-36,.01160806788231821,11912203416067455e-38,.9999326241102645],worldPos:[-8.207852022918948,6202649694084369e-20,17.245801758262132],worldQuat:[-.008208274430290369,.7070332309537893,.7070850529927397,-.0082074595446575]},{name:`LeftUpLeg`,parent:0,localPos:[8.207788043566438,-6.771802818529409,-1.5122137762205135],localQuat:[2.8191483378909245e-9,.01036795967915088,.9999462512615453,2.718950400523856e-7],worldPos:[8.207780316275715,97.52316694663398,-.04524198897490894],worldQuat:[4.575136162088223e-9,.00390954458172457,.9999923577013424,2.7187116164010067e-7]},{name:`LeftLeg`,parent:60,localPos:[6.468269475590205e-9,44.37138978410286,37414515929867775e-30],localQuat:[-.0381124510208252,-8172602612650612e-25,2.142781333519525e-8,.9992734566059407],worldPos:[8.207756184976574,53.15313355499844,.30169921260475335],worldQuat:[-4.888837197809569e-9,-.034205455626157316,.9994148221861352,2.504235506344471e-7]},{name:`LeftFoot`,parent:61,localPos:[-5.547779124981389e-9,44.52784595754781,-2220446049250313e-29],localQuat:[.4597486071334844,-3725832749974238e-39,-1.1668517803347452e-7,.8880491080108168],worldPos:[8.207733916824536,8.729483932050528,-2.742708742345943],worldQuat:[1.147816207643381e-7,.4291034480907216,.9032553519556492,3.412529433141002e-7]},{name:`LeftToeBase`,parent:62,localPos:[17763568394002505e-31,13.81686480841043,-17763568394002505e-31],localQuat:[.33524149798857344,10535853714492708e-39,-1.1452079069214378e-7,.94213222958689],worldPos:[8.207726760093172,.0008113791108694812,7.967848133811215],worldQuat:[1.7340034603185666e-7,.707080865528955,.7071326958942321,3.864673509538802e-7]},{name:`LeftToe_End`,parent:63,localPos:[0,9.278136754869934,-13125351500109517e-31],localQuat:[0,-.011869165745076847,18530151004086692e-38,.9999295589712888],worldPos:[8.207723964114914,.00013129905961646127,17.245984863756057],worldQuat:[.008393248559463194,.7070310534383599,.7070828826815805,.008392846428263363]}],landmarks:{mouth:[0,158.500185546875,11.717991638183594],headEllipsoid:{centre:[-95367431640625e-19,167.56204986572266,-.15480518341064453],radii:[8.804292678833008,13.326271057128906,12.424483299255371]},headJoint:[1671650538423477e-20,159.92947501239226,-1.5195243864816557],headTop:[298931534294587e-19,181.96684091859,5.981578858112073],sole:{ball:0,tip:-.7}}},"y-bot-tpose":{model:`y-bot-tpose`,units:`cm`,mesh:`Alpha_Surface`,bones:[{name:`Hips`,parent:-1,localPos:[-6757011760782916e-21,99.79193878173828,4844740033149719e-20],localQuat:[7615435492247396e-26,-17453292503320135e-22,4363323128594654e-20,.9999999990465473],worldPos:[-6757011760782916e-21,99.79193878173828,4844740033149719e-20],worldQuat:[7615435492247396e-26,-17453292503320135e-22,4363323128594654e-20,.9999999990465473]},{name:`Spine`,parent:0,localPos:[.0008597856133863019,9.923461876522225,-1.2273349078167588],localQuat:[-.06073022898235704,5303745488019905e-37,6119354919596912e-21,.9981542161661715],worldPos:[-8672608244745512e-21,109.71540069587908,-1.227286457407732],worldQuat:[-.060730228859120175,-4391963877518737e-21,4956605444176136e-20,.9981542149520963]},{name:`Spine1`,parent:1,localPos:[0,11.731977989043784,-3552713678800501e-30],localQuat:[.0001960924550491026,4662287733052689e-29,-9316072744031837e-21,.9999999807304797],worldPos:[-.0011632832276606084,121.36083978703566,-2.649627688070991],worldQuat:[-.06053449713743436,-494801144686156e-20,4026803743853935e-20,.9981661049195772]},{name:`Spine2`,parent:2,localPos:[1931491945550423e-26,13.458836780167971,6235012506294879e-28],localQuat:[.057711730916465316,21958232674411106e-22,3285013706200134e-21,.9983332890868721],worldPos:[-.0022371547694859653,134.72103871836885,-4.27608729015328],worldQuat:[-.002827710078055566,-2.2517339024978275e-7,4363254684471116e-20,.9999960010679366]},{name:`Neck`,parent:3,localPos:[2548122992670175e-20,15.027761372130044,.8779068542021755],localQuat:[.0028277058943183713,-8816242878226746e-54,-7234126583784003e-36,.9999960020316957],worldPos:[-.003523660156014883,149.7535246254643,-3.4831824403326026],worldQuat:[-4.186445695616128e-9,-1.017924801167934e-7,4363300912729469e-20,.999999999048075]},{name:`Head`,parent:4,localPos:[2562548663041439e-21,10.32183835340436,3.1424288991299827],localQuat:[12407709188295404e-40,13234889800848435e-39,-33812794736012347e-37,1],worldPos:[-.0044224830930743595,160.07536296607333,-.3407536277174854],worldQuat:[-4.1864456956161264e-9,-1.0179248011679337e-7,43633009127294685e-21,.999999999048075]},{name:`HeadTop_End`,parent:5,localPos:[.00015451594228192873,18.474670356296826,6.63639947863672],localQuat:[693889473108785e-32,-661744490042423e-38,-10158249377722142e-36,1],worldPos:[-.005881529143937624,178.55003332101543,6.295645696100038],worldQuat:[-4.186445688677232e-9,-1.0179248011679308e-7,4363300912729468e-20,.999999999048075]},{name:`LeftShoulder`,parent:3,localPos:[6.105824524896,9.10629188078309,.757062475638635],localQuat:[-.45383506682997793,-.5448493479758866,.5511388470821386,-.4397941465761588],worldPos:[6.10279217248512,143.83199925791556,-3.5705353792059826],worldQuat:[-.4525659925709384,-.5433084112379314,.5526580275773418,-.44109987213863294]},{name:`LeftArm`,parent:7,localPos:[4884981308350689e-30,12.92228632488431,2842170943040401e-29],localQuat:[-.010451820107802023,-.0010627185813176982,.10115046260752789,.9948156683526521],worldPos:[18.75785325853472,143.5671732022338,-6.171454434247386],worldQuat:[.49997802104022876,.5000219779933275,-.4999777974641308,.5000222015503447]},{name:`LeftForeArm`,parent:8,localPos:[3.059411390893274e-9,27.404682159441652,-2842170943040401e-29],localQuat:[-10173904404505293e-36,6815758221109549e-42,13234889800848457e-39,1],worldPos:[46.162535310990236,143.5695947084291,-6.171442183765884],worldQuat:[.49997802104022876,.5000219779933275,-.4999777974641308,.5000222015503447]},{name:`LeftHand`,parent:9,localPos:[-12820418092474029e-21,27.614463806173113,2.3361064904747764e-7],localQuat:[-3397640826470449e-36,-18680226235633534e-43,52939559203393736e-39,1],worldPos:[73.77699900937316,143.57203451753804,-6.171417016006557],worldQuat:[.49997802104022876,.5000219779933275,-.4999777974641308,.5000222015503447]},{name:`LeftHandRing1`,parent:10,localPos:[2.216630558205681,12.147010274148471,-.009996226470974534],localQuat:[5.56794949511021e-7,-3.067028835367668e-9,4777353976607745e-21,.9999999999884335],worldPos:[85.92400934395243,143.5831040665074,-8.388042142881478],worldQuat:[.49998068669282075,.5000193094968617,-.4999756886184537,.500024313263825]},{name:`LeftHandRing2`,parent:11,localPos:[0,3.601188659840844,0],localQuat:[-2306826384812874e-21,1861861504887997e-26,-8071095064110734e-21,.999999999964768],worldPos:[89.52519798990681,143.58341826103262,-8.388006124364832],worldQuat:[.4999754975118546,.5000244982373176,-.49997857087756026,.5000214312542258]},{name:`LeftHandRing3`,parent:12,localPos:[-7140954494389007e-28,3.3073120118204997,22737367544323206e-29],localQuat:[-32584970000852863e-37,-2067951531382572e-40,-6352747104407258e-37,1],worldPos:[92.83250998771065,143.5837220743585,-8.388026432414401],worldQuat:[.49997549751185466,.5000244982373176,-.49997857087756026,.5000214312542258]},{name:`LeftHandRing4`,parent:13,localPos:[-241726316367874e-19,3.660118102908669,16886514032421474e-21],localQuat:[8486035821629225e-21,.007396474405473809,.0007707649842267434,.9999723486255485],worldPos:[96.49262807680708,143.5840414103271,-8.388024734185503],worldQuat:[.5040493957792119,.5033194611486261,-.4958855340273986,.4966903097363882]},{name:`LeftHandMiddle1`,parent:10,localPos:[-18344155402694184e-21,12.77552795411546,-10320898695681535e-22],localQuat:[5.567949752588633e-7,-2.6633364343577455e-9,2.0800236288001427e-7,.9999999999998233],worldPos:[86.55252691351437,143.5731644085546,-6.171392959489538],worldQuat:[.49997840212413347,.5000215942797767,-.49997797319957754,.5000220284932966]},{name:`LeftHandMiddle2`,parent:15,localPos:[-3552713678800501e-30,3.61396789550858,-2842170943040401e-29],localQuat:[23697741078528623e-36,6203854594147698e-40,-26469779601696844e-39,1],worldPos:[90.16649479526663,143.5734797180353,-6.171389840137076],worldQuat:[.49997840212413347,.5000215942797767,-.49997797319957754,.5000220284932966]},{name:`LeftHandMiddle3`,parent:16,localPos:[28508498060020315e-21,3.4597625732240687,-8526512829121202e-29],localQuat:[1692147750009982e-35,20679515313825724e-41,264697796016969e-37,1],worldPos:[93.62625735534596,143.57378157349484,-6.171415362383127],worldQuat:[.49997840212413347,.5000215942797767,-.49997797319957754,.5000220284932966]},{name:`LeftHandMiddle4`,parent:17,localPos:[-30473889779614183e-21,3.680191040059995,-2842170943040401e-29],localQuat:[-133272714831852e-20,.004579424073341433,-.000654144096597114,.9999893004272004],worldPos:[97.30644838137125,143.57410266077613,-6.171381711981186],worldQuat:[.5019349111684311,.5026337814312043,-.4980094305837711,.4974004762403589]},{name:`LeftHandThumb1`,parent:10,localPos:[-3.002975029424964,3.7888090485209744,2.1671489778191813],localQuat:[.25189492500135036,-.05946403657250492,.2219235197808198,.940086659027326],worldPos:[77.56599819190912,141.40522033116738,-3.168440292478436],worldQuat:[.6772116616355364,.20343190021506413,-.5147394802435296,.484812432594653]},{name:`LeftHandThumb2`,parent:19,localPos:[-19984014443252818e-31,4.744970523440218,2842170943040401e-29],localQuat:[69460704858849485e-22,55796786860811154e-28,8.032883032279416e-7,.9999999999755533],worldPos:[81.24162844278966,139.28353174695044,-1.0464306132517085],worldQuat:[.6772151925776482,.20342778079987783,-.5147405038353289,.48480814210593404]},{name:`LeftHandThumb3`,parent:20,localPos:[-5984102102729594e-28,4.3821287009303775,5172751116333529e-27],localQuat:[7030691099565929e-33,7121429504040547e-33,-15407439555097887e-48,1],worldPos:[84.63615479208448,137.32403482337068,.9133179986734019],worldQuat:[.6772151925776482,.20342778079987775,-.5147405038353289,.48480814210593404]},{name:`LeftHandThumb4`,parent:21,localPos:[-51284654249972306e-22,3.459077859769903,4.03463474185628e-7],localQuat:[.009146816027813427,.1256374250101491,.07207247635857116,.9894125182879566],worldPos:[87.31565650284612,135.77728679427992,2.4602700847142343],worldQuat:[.7538118553684166,.20866722684171796,-.3911265183168664,.4850213622280347]},{name:`LeftHandIndex1`,parent:10,localPos:[-2.822044006965872,12.266617250897596,.23182516767607808],localQuat:[5.567949601161418e-7,-3.075281477739248e-9,487076476385117e-20,.9999999999879827],worldPos:[86.04363543486608,143.34129324170544,-3.34936752423002],worldQuat:[.49998073339592125,.5000192627891642,-.4999756419148924,.5000243599710406]},{name:`LeftHandIndex2`,parent:23,localPos:[-13322676295501878e-31,3.891967773631521,0],localQuat:[-30225470980600983e-37,0,-6214320207710297e-21,.999999999980691],worldPos:[89.93560319348254,143.34163280596658,-3.349327870283342],worldQuat:[.49997762610645813,.5000223698198841,-.4999787492167228,.5000212529526508]},{name:`LeftHandIndex3`,parent:24,localPos:[4071321058063404e-26,3.415161132822689,-11368683772161603e-29],localQuat:[46684518186119064e-39,-9183549615799121e-56,21175823681357537e-38,1],worldPos:[93.35076431329836,143.34193077006435,-3.3493355202090695],worldQuat:[.49997762610645813,.5000223698198841,-.4999787492167229,.5000212529526508]},{name:`LeftHandIndex4`,parent:25,localPos:[5.854722480158614e-7,3.0779876709090814,5684341886080802e-29],localQuat:[10393592226093013e-22,.004001602788212073,22779581052790166e-21,.9999919932955144],worldPos:[96.4287519724834,143.34219931663745,-3.3493430003052733],worldQuat:[.5019862492920715,.5020073437901309,-.4979631636001596,.4980272281710877]},{name:`LeftHandPinky1`,parent:10,localPos:[4.72583130478205,10.908194092064392,.22613216873591568],localQuat:[28521120612919424e-22,-3.0577730863769185e-9,.000141051374267014,.9999999900481878],worldPos:[84.68521515320175,143.3468662092345,-10.897243443373178],worldQuat:[.5000499694422342,.49995002290857044,-.49990869131728644,.5000912946652625]},{name:`LeftHandPinky2`,parent:27,localPos:[-5329070518200751e-30,4.136657059551979,2842170943040401e-29],localQuat:[-59544873416476465e-22,2.190560405006969e-9,-.0003678839387923365,.9999999323129735],worldPos:[88.82187203349876,143.3472081321215,-10.896074631422186],worldQuat:[.4998630353195086,.5001369272162459,-.5000896549937187,.49991032888321396]},{name:`LeftHandPinky3`,parent:28,localPos:[43876013933186186e-29,2.594834461051775,0],localQuat:[36591694282576963e-22,8409112616016821e-25,.00022980932036022433,.999999973587143],worldPos:[91.41670621645012,143.34745351466333,-10.897250657097295],worldQuat:[.49997978792115133,.5000202113293842,-.49997658739741363,.5000234114387793]},{name:`LeftHandPinky4`,parent:29,localPos:[-2948752353404416e-28,2.9238662720287607,-2842170943040401e-29],localQuat:[-10497831164166655e-22,.004099894588367042,-.0005750644579927158,.9999914300453439],worldPos:[94.34057247729058,143.3477086145383,-10.89723194250163],worldQuat:[.5017372856540723,.5023540149301887,-.4982094589732469,.49768210220741194]},{name:`RightShoulder`,parent:3,localPos:[-6.1056956701096174,9.10638358733786,.7570756312724551],localQuat:[.4538375688887134,-.5448472538987562,.5511399888422243,.43979272809263187],worldPos:[-6.1087279840345,143.8310253866605,-3.5705252284969617],worldQuat:[.45261579666489365,-.5432669079313696,.5526977464106563,.44105012013225253]},{name:`RightArm`,parent:31,localPos:[39968028886505635e-31,12.922286714484947,0],localQuat:[-.01045541384979725,.0010630628959740092,-.10114940861202837,.9948157373885607],worldPos:[-18.763745414580892,143.56389953844294,-6.171423447408117],worldQuat:[.5000215299672571,-.4999784691060287,.5000215360351153,.4999784630368383]},{name:`RightForeArm`,parent:32,localPos:[8.327427636345419e-9,27.404682159441318,-2842170943040401e-29],localQuat:[-3388329060809388e-36,-15146129380243438e-44,8271806125530284e-40,1],worldPos:[-46.16842747236397,143.56153906740224,-6.171423771692651],worldQuat:[.5000215299672571,-.49997846910602883,.5000215360351153,.4999784630368383]},{name:`RightHand`,parent:33,localPos:[12842842382454478e-21,27.614463806155165,15492399938921153e-21],localQuat:[-19727179218464944e-41,-7573064690121704e-44,0,1],worldPos:[-73.78289117474843,143.55914503465877,-6.17141126400836],worldQuat:[.5000215299672571,-.4999784691060287,.5000215360351153,.4999784630368383]},{name:`RightHandThumb1`,parent:34,localPos:[3.002974470681663,3.7888088905192205,2.1671490371761024],localQuat:[.25189499102226326,.05946427874712486,-.2219234615465524,.9400866397658112],worldPos:[-77.57151342274972,141.3916696607838,-3.168436839313407],worldQuat:[.6772291629398663,-.20337279117491877,.5147821060302558,.4847675236487542]},{name:`RightHandThumb2`,parent:35,localPos:[-68833827526759706e-31,4.744970470128291,2842170943040401e-29],localQuat:[8453832451066965e-21,-33376070678072775e-28,-3.9480215616198235e-7,.9999999999641884],worldPos:[-81.24677425676067,139.26933968812125,-1.0464288158806956],worldQuat:[.6772333413527709,-.20336817191604672,.5147836339017984,.48476200168592604]},{name:`RightHandThumb3`,parent:36,localPos:[-17763568394002505e-29,4.382135391768333,-4092726157978177e-27],localQuat:[-14347996972659013e-33,-5998687332454958e-33,-1387778780781447e-32,1],worldPos:[-84.64095942776746,137.30923516924733,.9133180789494266],worldQuat:[.6772333413527709,-.20336817191604672,.5147836339017984,.48476200168592604]},{name:`RightHandThumb4`,parent:37,localPos:[11177533225659175e-21,3.4590709023307085,-23241859054223823e-21],localQuat:[.00923206336161341,-.1271302153500302,-.0723276818427547,.989202397788438],worldPos:[-87.32019182850055,135.76203483248253,2.460268746809576],worldQuat:[.7545499013151971,-.2090649481886763,.389944180490974,.4846543407061524]},{name:`RightHandIndex1`,parent:34,localPos:[2.822042502024897,12.266617102415225,.23182522345669554],localQuat:[5.567922673046469e-7,-7.224337929733461e-9,-4743924457641052e-21,.9999999999885925],worldPos:[-86.04948829791044,143.32626324098368,-3.3493689108641775],worldQuat:[.5000241838181078,-.4999758222398485,.5000194389411731,.4999805530753941]},{name:`RightHandIndex2`,parent:39,localPos:[0,3.891967773619811,0],localQuat:[1695401251774016e-35,-4135903062840235e-40,602627167052741e-20,.9999999999818419],worldPos:[-89.94145605654246,143.32592367674323,-3.3493320316989923],worldQuat:[.5000211708188947,-.4999788355123435,.5000224519507367,.4999775398133359]},{name:`RightHandIndex3`,parent:40,localPos:[-51669779566054785e-28,3.4151611328221207,11368683772161603e-29],localQuat:[-13593959205239575e-36,0,0,1],worldPos:[-93.35661717635494,143.32562571266394,-3.349340831998884],worldQuat:[.5000211708188947,-.4999788355123435,.5000224519507367,.4999775398133359]},{name:`RightHandIndex4`,parent:41,localPos:[-12771572572845002e-22,3.0779876709101757,-2842170943040401e-29],localQuat:[-7290381402922513e-20,-.006709307422924062,.0013745331778991744,.9999765449936721],worldPos:[-96.4346048355366,143.3253571661075,-3.3493500406116747],worldQuat:[-.5026405594004304,.5040453607575476,-.49730671352060296,-.49596045712511533]},{name:`RightHandMiddle1`,parent:34,localPos:[16632154487439266e-21,12.775527954114011,-10320893863990932e-22],localQuat:[5.567949633221699e-7,-7.289108692409176e-9,-3.662527039828292e-7,.9999999999997777],worldPos:[-86.55841908156046,143.55804566121927,-6.171394786911078],worldQuat:[.5000219951158138,-.4999780112066047,.5000216276573223,.4999783641170999]},{name:`RightHandMiddle2`,parent:43,localPos:[8881784197001252e-31,3.6139678955093757,0],localQuat:[-33759614098155274e-37,-4135903062765133e-40,0,1],worldPos:[-90.17238696331393,143.55773035173834,-6.171392183522983],worldQuat:[.5000219951158138,-.4999780112066047,.5000216276573223,.4999783641170999]},{name:`RightHandMiddle3`,parent:44,localPos:[-29421479796454264e-21,3.4597625732165085,14210854715202004e-29],localQuat:[34003021678244415e-37,-8271806125530284e-40,-7940933880509075e-38,1],worldPos:[-93.63214952338268,143.55742849627876,-6.1714191126993185],worldQuat:[.5000219951158138,-.4999780112066047,.5000216276573223,.4999783641170999]},{name:`RightHandMiddle4`,parent:45,localPos:[28549065814509333e-21,3.680191040067001,-5684341886080802e-29],localQuat:[-5158123071926063e-20,-.006695195594000001,-.0017083442773867367,.9999761263426065],worldPos:[-97.31234054942114,143.557107408997,-6.171387912540353],worldQuat:[.504186145435319,-.5024851098604104,.49578202059538456,.49749897806327625]},{name:`RightHandRing1`,parent:34,localPos:[-2.216632303077052,12.147002761381543,-.009996270293299858],localQuat:[5.567954667309114e-7,-7.224304767843245e-9,-4803651127566965e-21,.9999999999883074],worldPos:[-85.92989472518438,143.5680950366908,-8.38804371451417],worldQuat:[.5000242136815972,-.49997579237346873,.5000194090805982,.49998058293828956]},{name:`RightHandRing2`,parent:47,localPos:[0,3.6011962892353893,-8526512829121202e-29],localQuat:[-5732183384702703e-36,0,8071083662125689e-21,.9999999999674287],worldPos:[-89.53109100054763,143.5677808414962,-8.388009160440863],worldQuat:[.5000201783188615,-.4999798280944457,.5000234444494263,.4999765472235214]},{name:`RightHandRing3`,parent:48,localPos:[-6055600465515454e-27,3.307312011785328,-11368683772161603e-29],localQuat:[32821615918857455e-37,-36734198463196485e-56,21175823681357546e-38,1],worldPos:[-92.83840299967426,143.56749228695628,-8.38803081342569],worldQuat:[.5000201783188615,-.4999798280944457,.5000234444494263,.4999765472235214]},{name:`RightHandRing4`,parent:49,localPos:[2417262415121968e-20,3.6601181029476635,-2842170943040401e-29],localQuat:[-6164489635359998e-20,-.007613221748708619,-.000300224892743606,.9999709720384515],worldPos:[-96.49852108877111,143.56717295098406,-8.388030603602541],worldQuat:[.5039317385023292,-.503652452411389,.49602123868179077,.49633651979941534]},{name:`RightHandPinky1`,parent:34,localPos:[-4.725833119502555,10.90819434071372,.2261320753251539],localQuat:[5.567949828639406e-7,-7.530380981813863e-9,-3132050030138696e-21,.99999999999494],worldPos:[-84.69106594001192,143.3320733953033,-10.897244515904388],worldQuat:[.5000233780731588,-.4999766283665967,.5000202446951756,.49997974695226793]},{name:`RightHandPinky2`,parent:51,localPos:[0,4.13665008553545,-2842170943040401e-29],localQuat:[1470867824118891e-37,8271806125977124e-40,10394374390791114e-21,.9999999999459783],worldPos:[-88.8277160097222,143.33171248313417,-10.897218653721097],worldQuat:[.5000181811018849,-.4999818257697831,.5000254416448413,.49997454952763204]},{name:`RightHandPinky3`,parent:52,localPos:[-3950617610826157e-27,2.5948410036845218,-8526512829121202e-29],localQuat:[6674018442413745e-36,1836709923259698e-55,-10428465638715964e-21,.9999999999456235],worldPos:[-91.42255700325643,143.33148608987582,-10.897256374372848],worldQuat:[.5000233951179858,-.49997661132017523,.5000202276502416,.4999797639985816]},{name:`RightHandPinky4`,parent:53,localPos:[4362732397567015e-27,2.923866272034857,5684341886080802e-29],localQuat:[-8226663950025322e-20,-.00849884034311731,.0022061069470672434,.9999614472754239],worldPos:[-94.34642326410449,143.33123099000105,-10.897237895108226],worldQuat:[-.5031095764062739,.5053508241180749,-.4968132089402998,-.4946493041680384]},{name:`LeftUpLeg`,parent:0,localPos:[9.123873709849553,-6.657188518716367,-.05540310527662988],localQuat:[20251728747483253e-21,-.006350177975401161,.9999754277247583,-.002969642442257367],worldPos:[9.12444806072654,93.13554649657034,-.05532280954860631],worldQuat:[18783520922709306e-21,-.006350171978846871,.999975297231096,-.00301328568169704]},{name:`LeftLeg`,parent:55,localPos:[-4618527782440651e-29,40.59943638074365,1170175067954915e-28],localQuat:[-.018114309191591866,.00018249364298742092,-.005920146666904975,.9998183786878614],worldPos:[9.369107731941927,52.540121711606496,-.5709414745281038],worldQuat:[-715314874584385e-19,-.02446331907456045,.9996964939479204,.00290876113461602]},{name:`LeftFoot`,parent:56,localPos:[-10658141036401503e-30,42.09902591219656,20872192862952943e-30],localQuat:[.5405498192560871,.01436647216366454,.024951033886733327,.8408192096329419],worldPos:[9.12441738143423,10.49219684921195,-2.6300976499043784],worldQuat:[-.01346031169880001,.5198601039256607,.853859207560786,-.022107600933591907]},{name:`LeftToeBase`,parent:57,localPos:[17763568394002505e-31,15.721559146548017,-1509903313490213e-29],localQuat:[.2276920621809942,-.032521469150786096,-.015365592016704316,.9730686396375217],worldPos:[9.497939603229476,3.2836504838127345,11.336461068911172],worldQuat:[.0016492651748272183,.7007886739142866,.7132730439227728,.01157925951782756]},{name:`LeftToe_End`,parent:58,localPos:[17763568394002505e-31,9.999999999999991,4.890746918562172e-9],localQuat:[3842630640765734e-25,-2181956872127079e-33,8673617379884037e-34,1],worldPos:[9.355871856763304,3.108427383452366,21.333916426176543],worldQuat:[.0016492651792767014,.700788674188371,.7132730436534856,.011579259517193808]},{name:`RightUpLeg`,parent:0,localPos:[-9.125032356625555,-6.655601347887028,-.05535274484958799],localQuat:[-17972283601838397e-21,-.006333801286546503,.9999752669985558,.0030574547301418053],worldPos:[-9.12445807483328,93.1355411499169,-.055336149820714026],worldQuat:[-19441205218510228e-21,-.006333807477113975,.9999753994199062,.00301381152055421]},{name:`RightLeg`,parent:60,localPos:[7105427357601002e-30,40.59943859177964,26645352591003757e-30],localQuat:[-.018147073530042527,-.00018249394989624574,.005920149654138874,.9998177845219228],worldPos:[-9.369160167563622,52.54009755727,-.5696263108436963],worldQuat:[7086285029500266e-20,-.024479715368387448,.9996960941175567,-.0029082503401009767]},{name:`RightFoot`,parent:61,localPos:[-24868995751603507e-30,42.09902387472938,-6217248937900877e-29],localQuat:[.5405636018310247,-.014366037304083883,-.024951225824318232,.8408103506008421],worldPos:[-9.12451164224619,10.492242047309674,-2.6301615125796047],worldQuat:[.013459958226241265,.5198600714589466,.8538592128932476,.02210837363015364]},{name:`RightToeBase`,parent:62,localPos:[3552713678800501e-30,15.721558809599616,26645352591003757e-31],localQuat:[.22770869920802236,.03211960072148292,.015257901862228916,.9730797891155923],worldPos:[-9.498060396707743,3.2836958492734345,11.33639620371245],worldQuat:[-.0013617607248561205,.700801240791512,.7132661380535977,-.011277536030161229]},{name:`RightToe_End`,parent:63,localPos:[3.1880595940947387e-9,9.999999999999998,5.687534443410414e-9],localQuat:[-3109963189751316e-25,-16439215440311446e-32,-17347234759768052e-34,1],worldPos:[-9.356269180688868,3.1086870931784847,21.33385924122101],worldQuat:[-.0013617607213487338,.7008012405696887,.7132661382715444,-.011277536030584614]}],landmarks:{mouth:[0,158.399150390625,12.493875312805176],headEllipsoid:{centre:[-16689300537109375e-21,167.32984161376953,.6807799339294434],radii:[8.005595684051514,13.133369445800781,12.374487400054932]},headJoint:[-.0044224830930743595,160.07536296607333,-.3407536277174854],headTop:[-.005881529143937624,178.55003332101543,6.295645696100038],sole:{ball:3.3,tip:2.6}}}},zo=new Map;function Bo(e){return Ro[e]?(zo.has(e)||zo.set(e,br(Ro[e])),zo.get(e)):null}var Vo=new WeakMap,Ho=e=>Math.round(e*1e5)/1e5;function Uo(e,t){let n=JSON.stringify(t),r=Vo.get(e);if(r?.key===n)return r.value;let i=Bo(e.rig),a=e.bones.length,o=e.frameCount,s=i.names,c=s.length,l=s.map(t=>e.bones.indexOf(t)),u=X(t.yaw),d=new Float64Array(o*c*3);for(let n=0;n<o;n++){let r=wr(i,l.map(t=>t<0?[0,0,0,1]:Array.from(e.rot.subarray((n*a+t)*4,(n*a+t)*4+4))),Array.from(e.hips.subarray(n*3,n*3+3)));for(let e=0;e<c;e++)d.set(V(t.position,J(u,r.P[e])).map(Ho),(n*c+e)*3)}let f={rig:e.rig,frames:o,names:s,P:d};return Vo.set(e,{key:n,value:f}),f}function Wo(e,t,n){let r={};for(let i of e??[]){if(!i||i.id===t||i.hidden)continue;let e=n(i.id);e?.schema!==`cozyclay.take.v3`||!e.frameCount||!Bo(e.rig)||(r[i.id]={name:i.subject||i.name||i.id,...Uo(e,{position:[i.x??0,i.y??0,i.z??0],yaw:i.rot??0})})}return r}function Go(e,t,n,r){let i=e?.people?.[t];if(!i)return null;let a=i.names.indexOf(Oo(Bo(i.rig),n).bone??``);if(a<0)return null;let o=(Math.max(0,Math.min(i.frames-1,Math.round(r)))*i.names.length+a)*3;return[i.P[o],i.P[o+1],i.P[o+2]]}var Ko=e=>Object.entries(e?.people??{}).map(([e,t])=>`${e} (${t.name})`).join(`, `)||`none: no other character has an installed take`;function qo(e,t){let n=new Map,r=(t,r)=>{let i=e?.people?.[t],a=i&&Oo(Bo(i.rig),r).bone;a&&n.set(t,new Set([...n.get(t)??[],a]))},i=(e,t)=>{if(typeof e==`string`){let n=/^person:([^.]+)(?:\.(.+))?$/.exec(e);n&&(n[2]||t===`from`)&&r(n[1],n[2]??`Hips`)}else if(Array.isArray(e))e.forEach(e=>i(e));else if(e&&typeof e==`object`){e.kind===`person`&&r(e.person,e.bone);for(let[t,n]of Object.entries(e))i(n,t)}};return i(t),n.size?Object.fromEntries([...n].map(([t,n])=>{let r=e.people[t],i=[...n],a=r.names.length,o=[];for(let e=0;e<r.frames;e++)for(let t of i){let n=(e*a+r.names.indexOf(t))*3;o.push(r.P[n],r.P[n+1],r.P[n+2])}return[t,{name:r.name,rig:r.rig,frames:r.frames,names:i,P:o}]})):null}var Jo=.045,Yo=[[1,0,0],[0,1,0],[0,0,1]],Xo=(e,t)=>H(e,U(t,W(e,t)));function Zo(e){if(!e)return-1;let t=[0,1,2].reduce((t,n)=>e[n]>e[t]?n:t,0);return[0,1,2].filter(e=>e!==t).every(t=>e[t]<Jo)?t:-1}var Qo=(e,t)=>e===`cylinder`&&!!t&&t[1]<Jo&&Math.min(t[0],t[2])>=Jo&&Math.abs(t[0]-t[2])<.1*t[0],$o=(e,t)=>e?.objects?.[t]?.grasp??e?.others?.[t]?.grasp??null;function es(e,t){let n=[],r=(t,r)=>Object.entries($o(e,t)??{}).forEach(([e,i])=>n.push({...i,name:r+e,owner:t}));r(t,``);for(let i of Ud(e,t)){i!==t&&r(i,`${i}.`);let{half:a,renderer:o}=e.objects[i],s=Zo(a);s>=0?n.push({name:i,owner:i,at:[0,a[1],0],axis:Yo[s],radius:Math.min(...a.filter((e,t)=>t!==s))}):Qo(o,a)&&n.push({name:i,owner:i,at:[0,a[1],0],rim:a[0],normal:Yo[1]})}return n}var ts=(e,t,n)=>es(e,t).find(e=>e.name===n);function ns(e,t){let n=e=>e?K(J(t.R,e)):void 0;return{p:V(t.pos,J(t.R,e.at??[0,0,0])),axis:n(e.axis),from:n(e.from),thumb:n(e.thumb),radius:e.radius,...e.rim?{rim:e.rim,normal:n(e.normal)}:{}}}function rs(e,t){let n=Xo(H(t,e.p),e.normal),r=G(n)>1e-6?K(n):K(Xo(Math.abs(e.normal[1])<.9?[0,1,0]:[1,0,0],e.normal));return{p:V(e.p,U(r,e.rim)),axis:K(ir(e.normal,r))}}function is(e,t){let n;for(let r of e){let e=J(Y(r.R),H(t,V(r.pos,J(r.R,[0,r.half[1],0])))),i=[0,1,2].map(t=>Math.abs(e[t])-r.half[t]),a=[0,1,2].reduce((e,t)=>i[t]>i[e]?t:e,0),o=Math.max(...i);(!n||o<n.gap)&&(n={gap:o,n:U([r.R[0][a],r.R[1][a],r.R[2][a]],e[a]<0?-1:1)})}return n?.n}function as(e,t){let n=H(t,e.p);return e.rim?Math.hypot(W(n,e.normal),G(Xo(n,e.normal))-e.rim):G(e.axis?Xo(n,e.axis):n)}function os(e,t,n,r,i=0){let a=e===`Right`,o=e=>a?e:U(e,-1);if(t.axis&&n!==`palm`&&!(t.from&&G(Xo(t.axis,t.from))<.001)){if(t.from){let e=o(t.from),n=K(Xo(t.axis,e)),i=n=>t.thumb?W(n,t.thumb):W(ir(n,e),r),a=i(n)>=i(U(n,-1))?n:U(n,-1);return cs(ir(a,e),a,e)}let e=ss(r,t.axis),n=J(X(i),[a?1:-1,0,0]),s=Math.abs(e[1]),c=t.thumb??Xo(V(U([0,1,0],1-s),U(n,s)),e),l=K(Xo(t.axis,e)),u=W(l,c)>=0?l:U(l,-1);return cs(e,u,ir(e,u))}let s=o(t.from??U(r,-1)),c=ss(r,s);return cs(c,ir(s,c),s)}function ss(e,t){let n=Xo(e,t);return K(G(n)>.001?n:Xo(Math.abs(t[1])<.9?[0,1,0]:[1,0,0],t))}var cs=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]];function ls(e,t){let n=wf[t],r=e.restWorldPos,i=e.index;return G(H(r[i[`${n}ForeArm`]],r[i[`${n}Arm`]]))+G(H(r[i[`${n}Hand`]],r[i[`${n}ForeArm`]]))}var us=new Set([`body`]);function ds(e,t,n,r,i,a){let o=e.spec.anchors?.[t];if(!o)throw Error(`MOTION_SPEC_INVALID: unknown anchor "${t}"`);let s=_s(e,o,t,n,r,i,a),c=us.has(o.kind)&&e.keepOut;return c?Ei(c.body,e.sk,n,Ei(c.body,e.sk,n,s,Di,c.skip),Di,c.skip):s}var fs=[`r`,`l`],ps={l:`left`,r:`right`};function ms(e,t,n,{s:r,diag:i,c:a},o){let s=i.frame,c=()=>e.restingAt?.(t.object,s)??e.objectsAt(s)[t.object]??Io(e.scene)[t.object],l=e.objectPose&&s!==void 0?e.objectHand(t.object,s):null;if(o&&l&&fs.indexOf(l)>fs.indexOf(o))throw Error(`MOTION_SPEC_INVALID: anchor "${n}" is on "${t.object}", which the ${ps[l]} hand holds at f${s}; the right arm is solved before the left, so the right hand cannot follow it. Carry "${t.object}" in the right hand (a right-hand prop) and put the left hand on it, or give the right hand another anchor`);let u=!e.objectPose||s===void 0||l===o?c():gs(e,n,t.object,s,()=>e.objectPose(t.object,s,{s:r,diag:i,c:a}));if(!u)throw Error(`MOTION_SPEC_INVALID: anchor "${n}" names unknown object "${t.object}"`);return u}var hs=16;function gs(e,t,n,r,i){if((e.nest??0)>=hs)throw Error(`MOTION_SPEC_INVALID: anchor "${t}" on "${n}" at f${r} reads a pose that needs this frame solved again (an anchor and carry loop); anchor the hand on a point that does not ride on the hand it moves`);e.nest=(e.nest??0)+1;try{return i()}finally{e.nest--}}function _s(e,t,n,r,i,a,o){let{sk:s}=e,c=s.index;switch(t.kind){case`world`:return t.p.slice();case`body`:return V(a.root??r.P[c.Hips],J(X(a.yaw??0),t.p));case`bone`:return V(r.P[c[t.bone]],t.offset??[0,0,0]);case`segment`:{let e=r.P[c[t.from]],n=r.P[c[t.to]],i=t.offset??[0,0,0],a=t=>V(V(e,U(H(n,e),t)),i);if(!t.reach)return a(t.t??.5);let o=r.P[c[`${wf[t.reach]}Arm`]],l=.95*ls(s,t.reach);for(let e=t.t??.45;e>=(t.tMin??.15);e-=.01)if(G(H(a(e),o))<=l)return a(e);return a(t.tMin??.15)}case`object`:{if(t.grasp&&t.local===void 0)return ys(e,n,r,i,a,o).p;let s=ms(e,t,n,{s:r,diag:i,c:a},o);return V(s.pos,J(s.R,t.local??[0,0,0]))}case`landmark`:return Tr(r,c.Head,s.landmarks[t.name]??(()=>{throw Error(`MOTION_SPEC_INVALID: unknown landmark "${t.name}"`)})());case`prop`:{let r=vs(e,t,n,i?.frame)??i.props?.[t.prop]?.[t.point];if(!r)throw Error(`MOTION_SPEC_INVALID: anchor "${n}" needs prop ${t.prop}.${t.point}, which is held by an arm solved later`);return V(r,t.offset??[0,0,0])}case`person`:{let r=Go(e.scene,t.person,t.bone,i?.frame??0);if(!r)throw Error(`MOTION_SPEC_INVALID: anchor "${n}" names person "${t.person}" bone "${t.bone}", which the scene does not have (people: ${Ko(e.scene)})`);return V(r,t.offset??[0,0,0])}default:throw Error(`MOTION_SPEC_INVALID: anchor "${n}" has unknown kind "${t.kind}"`)}}function vs(e,t,n,r){let i=e.spec.props?.[t.prop]?.hand;if(!i||r===void 0||!e.solvedAt||!e.carrySpan)return null;let a=null;for(let[t,n]of Object.entries(e.spec.objects??{})){if(!Hf(n)||e.spec.props?.[n.prop]?.hand!==i)continue;let[o,s]=e.carrySpan(n);if(r>=o&&r<=s)return null;let c=r<o?o:s;(!a||Math.abs(r-c)<Math.abs(r-a.at))&&(a={id:t,at:c})}if(!a)return null;let o=gs(e,n,a.id,a.at,()=>e.solvedAt(a.at).diag.props?.[t.prop]?.[t.point]),s=e.objectPose(a.id,a.at),c=e.objectPose(a.id,r);return o&&s&&c?V(c.pos,J(c.R,J(Y(s.R),H(o,s.pos)))):null}function ys(e,t,n,r,i,a){let o=e.spec.anchors[t],s={s:n,diag:r,c:i},c=n=>ms(e,{...o,object:n},t,s,a),l=o.local&&(e=>V(e.pos,J(e.R,o.local)))(c(o.object));if(e.sockets??=new Map,!e.sockets.has(t)){let r=es(e.scene,o.object),i=e.sk.index,s=l??n.P[i[a?`${wf[a]}Arm`:`Hips`]],u=o.socket?ts(e.scene,o.object,o.socket):r.map(e=>({k:e,d:as(ns(e,c(e.owner)),s)})).sort((e,t)=>e.d-t.d)[0]?.k;e.sockets.set(t,u??null)}let u=e.sockets.get(t),d=u?ns(u,c(u.owner)):{p:l??c(o.object).pos};if(u?.rim)d=bs(e,t,a,u,c(u.owner),d,l??n.P[e.sk.index[a?`${wf[a]}Arm`:`Hips`]]);else if(l)d.p=l;else if(d.axis&&d.radius>0){let t=Math.abs(uo[o.grasp]?.[2]??0),r=d.radius-t,i=n.P[e.sk.index[`${wf[a]??`Right`}Arm`]],s=H(i,d.p),c=H(s,U(d.axis,W(s,d.axis)));r>1e-4&&G(c)>1e-6&&(d.p=V(d.p,U(K(c),r)))}return!d.axis&&!d.from&&(d.from=is(Ud(e.scene,o.object).map(t=>({...c(t),half:e.scene.objects[t].half})),d.p)),d}function bs(e,t,n,r,i,a,o){e.rims??=new Map;let s=(n?null:[...e.rims.keys()].find(e=>e.startsWith(`${t}|`)&&!e.endsWith(`|`)))??`${t}|${n??``}`;if(!e.rims.has(s)){let t=rs(a,o),n=e=>J(Y(i.R),e);e.rims.set(s,{at:n(H(t.p,i.pos)),axis:n(t.axis)})}return ns(e.rims.get(s),i)}function xs(e,t,n,r){let{sk:i}=e;for(let[a,o]of Object.entries(e.spec.props??{})){if(o.hand!==t)continue;let e=zr(i,n,wf[t]),s=U(o.origin.map(e=>n.P[i.index[e]]).reduce((e,t)=>V(e,t),[0,0,0]),1/o.origin.length),c={};for(let[t,[n,r,i]]of Object.entries(o.points??{}))c[t]=V(s,V(U(e.d,n),V(U(e.l,r),U(e.n,i))));c.origin=s,c.axes=e,(r.props??={})[a]=c}}var Ss={joint:`joint:<Bone>`,bone:`bone:<Bone>`,prop:`prop:<prop>.<point>`,anchor:`anchor:<name>`,landmark:`landmark:mouth`,object:`object:<id>[.center|.top|.base]`,person:`person:<id>.<Bone>`};function Cs(e){let t=/^([a-z]+):(.+)$/s.exec(String(e));if(!t)return null;let[,n,r]=t;if(n===`prop`){let[e,t]=r.split(`.`);return{kind:n,name:e,point:t??``}}if(n===`object`){let e=/^(.+)\.(center|top|base)$/s.exec(r);return{kind:n,name:e?e[1]:r,point:e?e[2]:null}}if(n===`person`){let e=r.lastIndexOf(`.`);return{kind:n,name:e>0?r.slice(0,e):r,point:e>0?r.slice(e+1):``}}return{kind:n,name:r,point:null}}function ws(e,t){let n=[1/0,1/0,1/0],r=[-1/0,-1/0,-1/0];for(let t of e)for(let e of[-1,1])for(let i of[0,2])for(let a of[-1,1]){let o=V(t.pos,J(t.R,[e*t.half[0],i*t.half[1],a*t.half[2]]));for(let e=0;e<3;e++)n[e]=Math.min(n[e],o[e]),r[e]=Math.max(r[e],o[e])}let i=[(n[0]+r[0])/2,(n[1]+r[1])/2,(n[2]+r[2])/2];return t===`top`?[i[0],r[1],i[2]]:t===`base`?[i[0],n[1],i[2]]:i}function Ts(e,t,n){let r=e.frames?.[t-(e.f0??0)],i=Cs(n);if(!r||!i)return null;let{s:a,diag:o,c:s}=r,c=e.ctx.sk;switch(i.kind){case`joint`:case`bone`:{let{bone:e}=Oo(c,i.name);return e?a.P[c.index[e]].slice():null}case`prop`:{let e=o.props?.[i.name]?.[i.point];return Array.isArray(e)?e.slice():null}case`anchor`:return e.ctx.spec.anchors?.[i.name]?ds(e.ctx,i.name,a,{...o,frame:t},s):null;case`landmark`:return c.landmarks?.[i.name]?Tr(a,c.index.Head,c.landmarks[i.name]):null;case`object`:{let n=of(e,i.name,t);return n?ws(n,i.point):null}case`person`:return Go(e.ctx.scene,i.name,i.point,t);default:return null}}function Es(e,t,n,r){let i=e=>{let t=Cs(e);return t?.kind===`object`&&t.point===null?t:null},a=i(r)?[n,i(r)]:i(n)?[r,i(n)]:null;if(a){let n=Ts(e,t,a[0]),r=of(e,a[1].name,t);return n&&r?Math.max(0,Math.min(...r.map(e=>fa(n,e)))):null}let o=Ts(e,t,n),s=Ts(e,t,r);return o&&s?G(H(o,s)):null}function Ds(e,{sk:t,scene:n},r,i){if(typeof r!=`string`||!r)return``;let a=r.replace(/\.(center|top|base)$/,``),[o,s]=r.split(`.`),c=t&&(i.includes(`joint`)||i.includes(`bone`))?Oo(t,r).bone:null,l=[i.includes(`object`)&&(n?.objects?.[a]||Ud(n,a).length)&&`object:${r}`,c&&`${i.includes(`joint`)?`joint`:`bone`}:${c}`,i.includes(`anchor`)&&e.anchors?.[r]&&`anchor:${r}`,i.includes(`prop`)&&e.props?.[o]&&(s===`origin`||e.props[o].points?.[s])&&`prop:${r}`,i.includes(`landmark`)&&r===`mouth`&&`landmark:mouth`].filter(Boolean);return l.length?`; did you mean ${l.map(e=>`"${e}"`).join(` or `)}?`:``}function Os(e,t,{sk:n,scene:r},i,a,o=$a){let s=Cs(a),c=`${i} "${a}"`;if(!s||!o.includes(s.kind))return t(`${c} must be ${o.map(e=>Ss[e]).join(`, `)}${s?``:Ds(e,{sk:n,scene:r},a,o)}`),!1;if(s.kind===`joint`||s.kind===`bone`){let{bone:e,hint:r}=n?Oo(n,s.name):{bone:s.name};return e||t(`${c}: unknown bone${r}`),!!e}if(s.kind===`prop`){let n=!!(e.props?.[s.name]&&(s.point===`origin`||e.props[s.name].points?.[s.point]));return n||t(`${c}: spec.props has no point ${s.name}.${s.point}`),n}if(s.kind===`anchor`)return e.anchors?.[s.name]||t(`${c}: no anchor "${s.name}" in spec.anchors${xo(s.name,Object.keys(e.anchors??{}))}`),!!e.anchors?.[s.name];if(s.kind===`landmark`)return s.name!==`mouth`&&t(`${c}: the only landmark is "mouth"`),s.name===`mouth`;if(s.kind===`person`){let e=!!Go(r,s.name,s.point,0);return e||t(`${c}: no person "${s.name}" with joint "${s.point}" (people with an installed take: ${Ko(r)})`),e}return Ao(t,r,c,s.name,{groups:!0})}var ks=[0,1,0];function As(e,t,n=`up`,r){if(Array.isArray(n))return K(n);if(n===`face`){let{sk:n}=e.ctx;return K(Er(n,e.frames[t-(e.f0??0)].s,n.index.Head,[0,0,1]))}let i=n===`up`?null:Ts(e,t,n),a=i?H(i,r):ks;return G(a)>1e-9?K(a):ks}function js(e,t,n){let r=e.f0??0,i=Math.max(r,Math.min(r+e.frames.length-1,n)),a=Ts(e,i,t.follow);if(!a)return null;let o=_r(ni(ks,As(e,i,t.aim,a)));return{pos:V(a,J(o,t.offset??[0,0,0])),R:o}}function Ms(e,t){let n=t.length,r=Array(n).fill(0);for(let i=1;i<n-1;i++){let n=e[i]-e[i-1],a=e[i+1]-e[i],o=(t[i]-t[i-1])/n,s=(t[i+1]-t[i])/a;if(o*s>0){let e=2*a+n,t=a+2*n;r[i]=(e+t)/(e/o+t/s)}}return r}function Ns(e,t,n,r){if(e.length===1||r<=e[0])return t[0];if(r>=e[e.length-1])return t[t.length-1];let i=0;for(;r>e[i+1];)i++;let a=e[i+1]-e[i],o=(r-e[i])/a,s=o*o,c=s*o;return(2*c-3*s+1)*t[i]+(c-2*s+o)*a*n[i]+(-2*c+3*s)*t[i+1]+(c-s)*a*n[i+1]}var Ps=/^(spine|head)_(yaw|pitch|roll)$|^(aswing|abend)_[lr]$/,Fs={spine:0,head:2,arms:3},Is=.15,Ls=6,Rs=e=>/^(spine|head)_/.test(e)?[`l`,`r`]:/^(aswing|abend)_([lr])$/.test(e)?[e.slice(-1)]:[],zs=e=>/^spine_/.test(e)?`spine`:/^head_/.test(e)?`head`:/^(aswing|abend)_[lr]$/.test(e)?`arms`:null;function Bs(e){if(e===!1)return{smooth:!1,lag:{spine:0,head:0,arms:0}};let t=e??{},n=t.lag===!1?0:t.lag,r=typeof n==`number`?{spine:n,head:n,arms:n}:{...Fs,...n??{}};return{smooth:t.smooth!==!1,lag:r}}function Vs(e,t){let n=t.length,r=Array(n).fill(0);for(let i=1;i<n-1;i++)t[i]!==t[i-1]&&t[i]!==t[i+1]&&(r[i]=(t[i+1]-t[i-1])/(e[i+1]-e[i-1]));for(let i=0;i<n-1;i++){let n=e[i+1]-e[i],a=Math.min(t[i],t[i+1]),o=Math.max(t[i],t[i+1]),s=Math.min(Ls,Is*(o-a));for(let c=0;c<12;c++){let c=0;for(let s=1;s<16;s++){let l=Ns([e[i],e[i+1]],[t[i],t[i+1]],[r[i],r[i+1]],e[i]+n*s/16);c=Math.max(c,l-o,a-l)}if(c<=s+1e-9)break;r[i]*=.7,r[i+1]*=.7}}return r}var Hs=e=>Array.isArray(e)?`vec`:e&&typeof e==`object`?`map`:`num`;function Us(e,t,n=Bs()){let r=new Map;for(let t of[...e].sort((e,t)=>e.f-t.f))for(let[e,n]of Object.entries(t.set??{}))r.has(e)||r.set(e,[]),r.get(e).push({f:t.f,value:n,step:t.step?.includes(e)});let i={},a={};for(let[e,o]of r){let r=[...new Map(o.map(e=>[e.f,e])).values()],s=Hs(r[0].value),c=s===`vec`?r[0].value.length:0,l=s===`num`?[r.map(e=>e.value)]:s===`vec`?Array.from({length:c},(e,t)=>r.map(e=>e.value[t])):[...new Set(r.flatMap(e=>Object.keys(e.value)))].map(e=>({name:e,y:r.map(t=>t.value[e]??0)})),u=r.map(e=>e.f),d=n.smooth&&Ps.test(e),f=n.lag[zs(e)]??0,p=e=>f>0?e-f*Math.min(1,(t-1-e)/(2*f)):e,m=(e,t=!0)=>{let n=d&&t?Vs(u,e):Ms(u,e);return i=>{let a=t?p(i):i;for(let t=1;t<r.length;t++)if(r[t].step&&a>=u[t-1]&&a<u[t])return e[t-1];return Ns(u,e,n,a)}},h=Array(t);if(s===`num`){let e=m(l[0]);for(let n=0;n<t;n++)h[n]=e(n)}else if(s===`vec`){let e=l.map(m);for(let n=0;n<t;n++)h[n]=e.map(e=>e(n))}else{let e=l.map(({name:e,y:t})=>[e,m(t)]);for(let n=0;n<t;n++)h[n]=Object.fromEntries(e.map(([e,t])=>[e,t(n)]))}if(i[e]=h,s===`num`&&(d||f>0)&&Rs(e).length){let n=m(l[0],!1);a[e]=Array.from({length:t},(e,t)=>n(t))}}for(let[e,t]of Object.entries(a)){let n=Rs(e).map(e=>i[`armw_${e}`]).filter(Boolean);n.length&&(i[e]=i[e].map((e,r)=>{let i=Math.min(1,4*Math.max(0,...n.map(e=>e[r])));return e+(t[r]-e)*i*(2-i)}))}return i}var Ws=(e,t)=>Object.fromEntries(Object.entries(e).map(([e,n])=>[e,n[t]])),Gs=24,Ks=360/Gs,qs=.2,Js=12,Ys=8,Xs=e=>Math.round(e*1e5)/1e5,Zs=(e,t)=>2*Math.acos(Math.min(1,Math.abs(Zr(e,t)))),Qs=(e,t,n)=>e.lean>0&&e.aim&&n>0?V(e.pos,U(H(K(e.aim),ti(t,[0,1,0])),n)):e.pos;function $s(e,t){let n=K(ir(e,Math.abs(e[1])<.9?[0,1,0]:[1,0,0])),r=ir(e,n),i=[e];for(let a of[t/2,t])for(let t=0;t<Ys;t++){let o=2*Math.PI*t/Ys,s=Math.min(a,45)*Math.PI/180,c=V(U(n,Math.cos(o)),U(r,Math.sin(o)));i.push(K(V(U(e,Math.cos(s)),U(c,Math.sin(s)))))}return i}function ec(e){let t=e[0].map(e=>({total:e.cost,from:-1})),n=[t];for(let r=1;r<e.length;r++)t=e[r].map(t=>{let i={total:1/0,from:-1};return e[r-1].forEach((e,a)=>{let o=n[r-1][a].total+qs*Zs(e.q,t.q)**2;o<i.total&&(i={total:o,from:a})}),{total:i.total+t.cost,from:i.from}}),n.push(t);let r=[];for(let i=e.length-1,a=t.reduce((e,n,r)=>n.total<t[e].total?r:e,0);i>=0;a=n[i][a].from,i--)r[i]=a;return r}function tc(e,t,n){let r=(Math.sqrt(5)-1)/2,i=t,a=n,o=a-r*(a-i),s=i+r*(a-i),c=e(o),l=e(s);for(let t=0;t<Js;t++)c<l?(a=s,s=o,l=c,o=a-r*(a-i),c=e(o)):(i=o,o=s,c=l,s=i+r*(a-i),l=e(s));return(i+a)/2}function nc(e,t,n){let r=e.map((e,r)=>{if(e.aim===void 0)return{fixed:Qr(e.rot)};let i=Qr(t(r)),a=e=>{let t=Yr(ni(K(ti(i,[0,1,0])),e),i);return n=>Yr(ri(e,n),t)};if(e.lean>0&&n)return{leans:$s(K(e.aim),e.lean).map(a),roll:e.roll};let o=a(K(e.aim));return e.roll!==void 0||!n?{fixed:e.roll?o(e.roll):o(0)}:{rolled:o}}),i=e=>e.roll===void 0?Array.from({length:Gs},(e,t)=>t*Ks-180):[e.roll],a=r.map((e,t)=>e.fixed?[{q:e.fixed,cost:0,r:0}]:e.leans?e.leans.flatMap(r=>i(e).map(i=>{let a=r(i);return{q:a,cost:n(t,a),r:i,rolled:r,fixedRoll:e.roll!==void 0}})):Array.from({length:Gs},(r,i)=>{let a=i*Ks-180,o=e.rolled(a);return{q:o,cost:n(t,o),r:a}})),o=ec(a),s=a.map((e,t)=>e[o[t]]);for(let[e,t]of r.entries())t.leans&&(r[e]=s[e].fixedRoll?{fixed:s[e].q}:{rolled:s[e].rolled});let c=[],l=null;for(let[t,i]of r.entries()){if(e[t].aim===void 0){c.push(e[t].rot),l=i.fixed;continue}let r=(i.fixed??i.rolled(tc(e=>{let r=i.rolled(e),a=[s[t-1],s[t+1]].filter(Boolean);return n(t,r)+a.reduce((e,t)=>e+qs*Zs(t.q,r)**2,0)},s[t].r-Ks/2,s[t].r+Ks/2))).map(Xs);l&&Zr(r,l)<0&&(r=r.map(e=>-e)),c.push(r),l=Qr(r)}return c}var rc=1e3,ic=4,ac=.03,oc=.6,sc=.05,cc=45,lc=2,uc=.05,dc=10,fc=400,pc=16,mc=4,hc=Array.from({length:72},(e,t)=>2*Math.PI*t/72-Math.PI);function gc(e,t){let n=t.length,r=Array.from(t);for(let t=0;t<n;t++)for(let i=t+1;i<=Math.min(t+2,n-1);i++){let a=e[i][t-i+2]/e[t][2];for(let r=t;r<=Math.min(t+2,n-1);r++)e[i][r-i+2]-=a*e[t][r-t+2];r[i]-=a*r[t]}for(let t=n-1;t>=0;t--){for(let i=t+1;i<=Math.min(t+2,n-1);i++)r[t]-=e[t][i-t+2]*r[i];r[t]/=e[t][2]}return r}function _c(e,t,n,r=null){let i=n.length,a=n.slice();for(let e=1;e<i;e++)a[e]=a[e-1]+Math.atan2(Math.sin(a[e]-a[e-1]),Math.cos(a[e]-a[e-1]));for(let n=0;n<ic&&i>2;n++){let n=a.map(()=>new Float64Array(5)),o=new Float64Array(i);a.forEach((t,r)=>{let i=e(r,t),a=e(r,t+ac),s=e(r,t-ac);n[r][2]=Math.max(sc,(a+s-2*i)/(ac*ac)),o[r]=-(a-s)/(2*ac)});let s=a.map((e,n)=>t(n,e)),c=a.map((e,n)=>U(H(t(n,e+ac),t(n,e-ac)),1/(2*ac)));for(let e=0;e+2<i;e++){let t=[1,-2,1],i=V(H(s[e],U(s[e+1],2)),s[e+2]),a=r?2*rc*r[e]:2*rc;for(let r=0;r<3;r++){o[e+r]-=a*t[r]*W(i,c[e+r]);for(let i=0;i<3;i++)n[e+r][i-r+2]+=a*t[r]*t[i]*W(c[e+r],c[e+i])}}let l=gc(n,o);a.forEach((e,t)=>{a[t]=e+Math.max(-.6,Math.min(oc,l[t]))})}return a}function vc(e,t,n){let r=e.map((e,t)=>n(t,e)),i=e=>e>=0&&e+1<r.length?G(H(r[e+1],r[e])):0;return e.slice(1).map((e,t)=>t).filter(n=>i(n)>uc&&i(n)>lc*Math.max(i(n-1),i(n+1))&&vr(t(n,e[n]),t(n+1,e[n+1]))>cc)}function yc(e,t,n,r){let i=r.length,a=cc*Math.PI/180,o=[],s=[];for(let i=0;i<n;i++)o.push(r.map(t=>e(i,t))),s.push(r.map(e=>t(i,e)));let c=o[0].slice(),l=[];for(let e=1;e<n;e++){let t=Array(i),n=new Int32Array(i);for(let r=0;r<i;r++){let l=1/0;for(let t=0;t<i;t++){let i=Math.acos(Math.max(-1,Math.min(1,W(s[e-1][t],s[e][r])))),o=c[t]+dc*i*i+(i>a?fc*(i-a)**2:0);o<l&&(l=o,n[r]=t)}t[r]=l+o[e][r]}l.push(n),c=t}let u=Array(n);u[n-1]=c.indexOf(Math.min(...c));for(let e=n-1;e>0;e--)u[e-1]=l[e-1][u[e]];return u.map(e=>r[e])}function bc(e,t,n,r,i=hc){let a=_c(e,t,n);if(!vc(a,r,t).length)return a;let o=yc(e,r,a.length,i),s=_c(e,t,o),c=vc(s,r,t);if(!c.length)return s;let l=_c(e,t,o,new Float64Array(Math.max(0,s.length-2)).map((e,t)=>c.some(e=>e>=t-mc&&e<=t+1+mc)?pc:1));return vc(l,r,t).length?a:l}function xc(e){return e.map((t,n)=>{let r=0,i=0;for(let t=Math.max(0,n-6);t<=Math.min(e.length-1,n+6);t++){let a=Math.exp(-((t-n)**2)/8);r+=a*e[t],i+=a}return r/i})}function Sc(e,t,n,r){let i=n.map(n=>{let{s:i,held:a}=r(n);return oa(e,i,t,a)}),a=bc((e,t)=>i[e].at(t).cost,(e,t)=>i[e].at(t).elbow,i.map(e=>e.softmin()),(e,t)=>i[e].at(t).pv);return new Map(n.map((e,t)=>[e,i[t].at(a[t]).pv]))}var Cc=ua.filter(e=>e[0].startsWith(`torso`)),wc=ua.find(e=>e[0]===`hand_l`)[3],Tc=.004;function Ec(e,t,n){let r=H(n,t);return G(H(e,V(t,U(r,or(W(H(e,t),r)/Math.max(W(r,r),1e-12),0,1)))))}function Dc(e){let t=[];for(let n of[-1,1])for(let r of[0,2])for(let i of[-1,1])t.push(V(e.pos,J(e.R,[n*e.half[0],r*e.half[1],i*e.half[2]])));return t}function Oc(e,t,n,r,i=()=>null){let a=e.index,o=Object.entries(t.ctx.spec.objects??{}).filter(([,e])=>Gf(e)).map(([e])=>e);for(let e=0;e<t.frames.length;e++){let{s,diag:c}=t.frames[e],l=s.P,u=[];for(let[e,t]of Object.entries(c.props??{}))for(let[n,r]of Object.entries(t))Array.isArray(r)&&n!==`origin`&&u.push([`prop_${e}`,r,Tc]);for(let[t,i,o,s]of Cc){let c=new Map;for(let[e,t,n]of u)c.set(e,Math.max(c.get(e)??-1/0,s+n-Ec(t,l[a[i]],l[a[o]])));for(let[i,a]of c)a>n.body&&r(`BODY`,`${i} into ${t}`,e,a,n.body)}let d=2*wc-pa(l[a.LeftHand],l[a.LeftHandMiddle3],l[a.RightHand],l[a.RightHandMiddle3]),f=Math.max(i(`hand_l`,`hand_r`)??0,n.hands);if(d>f&&r(`SELF`,`hands overlap`,e,d,f),!o.length)continue;let p=t.objectsAt(e);for(let t of o){if(!p[t]?.half)continue;let i=Dc(p[t]);for(let[a,s]of Object.entries(p)){if(o.includes(a)||!s.half||s.ignore)continue;let c=-Math.min(...i.map(e=>fa(e,s)));c>n.object&&r(`OBJECT`,`${t} into ${a}`,e,c,n.object)}}}}var kc=[[/^Hips$/,`hips`],[/^(Spine|Spine1)$/,`torso_lo`],[/^Spine2$/,`torso_hi`],[/^Neck$/,`neck`],[/^Head/,`head`],[/Shoulder$/,`shoulder`],[/UpLeg$/,`thigh`],[/Leg$/,`shin`],[/(Foot|Toe)/,`foot`],[/ForeArm$/,`farm`],[/Arm$/,`uarm`],[/Hand$/,`hand`]];function Ac(e,t){let n=e.names[t]??``,r=/^Left/.test(n)?`_l`:/^Right/.test(n)?`_r`:``,i=kc.find(([e])=>e.test(n));return i?`${i[1]}${r}`:n}var jc=[`Arm`,`ForeArm`,`Hand`].flatMap(e=>[`Left${e}`,`Right${e}`]);function Mc(e,t,n,r,i){let a=mi(e);if(!a)return;let o=jc.map(t=>e.index[t]);t.frames.forEach(({s:t},s)=>{for(let c of o){let o=Ai(a,e,t,c);if(o.into<0)continue;let l=Ac(e,c),u=Ac(e,o.into),d=Math.max(i(l,u)??0,n.skin);o.depth>d&&r(`BODY`,`${l} into ${u}`,s,o.depth,d)}})}var Nc=.05,Pc=new WeakMap;function Fc(e){let t=Pc.get(e);return t||(t=Object.values(e).filter(e=>e.half&&!e.ignore).map(e=>({RT:Y(e.R),c:[e.pos[0]+e.R[0][1]*e.half[1],e.pos[1]+e.R[1][1]*e.half[1],e.pos[2]+e.R[2][1]*e.half[1]],half:e.half,up:[e.R[1][0],e.R[1][1],e.R[1][2]],r:G(e.half)})),Pc.set(e,t)),t}function Ic(e,t){if(Math.hypot(t[0]-e.c[0],t[2]-e.c[2])>e.r)return null;let n=J(e.RT,H(t,e.c)),r=-1/0,i=1/0;for(let t=0;t<3;t++){let a=e.up[t],o=e.half[t];if(Math.abs(a)<1e-9){if(Math.abs(n[t])>o)return null;continue}let s=(-o-n[t])/a,c=(o-n[t])/a;r=Math.max(r,Math.min(s,c)),i=Math.min(i,Math.max(s,c))}return r<=i?t[1]+i:null}function Lc(e,t,n){let r=0;for(let i of Fc(e.objectsAt(t))){let e=Ic(i,n);e!==null&&e<=n[1]+Nc&&e>r&&(r=e)}return r}function Rc(e,t,n){let r=_a(e.ctx.sk,e.frames[t].s,n);for(let n of[`heel`,`ball`,`tip`])r[n]=[r[n][0],r[n][1]-Lc(e,t,r[n]),r[n][2]];return r}var zc=[`Hips`,`Head`,`LeftHand`,`RightHand`,`LeftFoot`,`RightFoot`,`LeftLeg`,`RightLeg`,`LeftForeArm`,`RightForeArm`],Bc=new Set([`Hips`,`Head`]),Vc=[[`knee_l`,`LeftUpLeg`,`LeftLeg`,`LeftFoot`],[`knee_r`,`RightUpLeg`,`RightLeg`,`RightFoot`],[`elbow_l`,`LeftArm`,`LeftForeArm`,`LeftHand`],[`elbow_r`,`RightArm`,`RightForeArm`,`RightHand`]],Hc=2,Uc=.75,Wc=.05,Gc=e=>Math.round(e*100)/100;function Kc(e,t){let n=t.frames,r=n.length;return zc.map(t=>{let i=n.map(n=>n.s.P[e.index[t]]),a=new Float64Array(r),o=new Float64Array(r),s=i.map(()=>[0,0,0]);for(let e=1;e<r;e++)a[e]=G(H(i[e],i[e-1]));for(let e=2;e<r;e++)s[e]=H(H(i[e],i[e-1]),H(i[e-1],i[e-2])),o[e]=G(s[e]);return{j:t,core:Bc.has(t),v:a,a:o,A:s}})}function qc({a:e,A:t},n){let r=0;for(let t of[n-3,n-2,n+2,n+3])t>=2&&t<e.length&&(r=Math.max(r,e[t]));let i=e[n]>0?[n-1,n+1].filter(t=>t>=2&&t<e.length).map(r=>W(t[r],t[n])/e[n]):[];return i.length?Math.max(r,Math.max(...i)+Math.min(0,...i)):r}var Jc=(e,t,n)=>e.a[t]>n&&e.a[t]>Hc*qc(e,t);function Yc(e,t,n,r){for(let i of Kc(e,t)){let e=i.core?n.accCore:n.accLimb;for(let t=2;t<i.a.length;t++)Jc(i,t,e)&&r(`POP`,`${i.j} accel ${(i.a[t]*100).toFixed(2)} cm/f^2 in one frame`,t,i.a[t],e)}}var Xc=[`hips`,`torso_lo`,`torso_hi`],Zc=.04;function Qc(e,t,n){let{P:r}=e.frames[t].s,i=e.ctx.sk.index;return ua.some(([e,t,n,a])=>Xc.includes(e)&&Math.min(r[i[t]][1],r[i[n]][1])-a<Zc)?!0:n.some(n=>{let a=e.objectsAt(t)[n.object],o=ua.find(e=>e[0]===(n.part??`hips`));return a&&o&&Math.min(...da(r[i[o[1]]],r[i[o[2]]]).map(e=>fa(e,a)))-o[3]<(n.tol??.04)})}function $c(e,t=[]){let n=e.ctx.sk.index,r=e.frames;return r.map(({s:i},a)=>{if(Qc(e,a,t))return null;let{P:o}=i,s=a>0&&a<r.length-1&&Math.hypot(r[a+1].s.P[n.Hips][0]-r[a-1].s.P[n.Hips][0],r[a+1].s.P[n.Hips][2]-r[a-1].s.P[n.Hips][2])/2>.006,c=[];for(let t of[`Left`,`Right`]){let n=Rc(e,a,t);(s||Math.min(n.heel[1],n.ball[1])<.02)&&c.push(n.heel,n.ball,n.tip)}if(!c.length)return`air`;let l=U([`Hips`,`Spine1`,`Spine2`,`Head`].reduce((e,t)=>V(e,o[n[t]]),[0,0,0]),.25),u=c.map(e=>e[0]),d=c.map(e=>e[2]);return Math.min(l[0]-Math.min(...u),Math.max(...u)-l[0],l[2]-Math.min(...d),Math.max(...d)-l[2])})}var el=.06;function tl(e,t){let{P:n}=e.frames[t].s,r=e.ctx.sk.index;return[`Left`,`Right`].some(i=>[`${i}Hand`,`${i}HandMiddle1`].some(i=>r[i]!==void 0&&n[r[i]][1]-Lc(e,t,n[r[i]])<el))}function nl(e,t=[]){let n=e.frames.length,r=[],i=e.frames.map((n,r)=>!Qc(e,r,t)&&[`Left`,`Right`].every(t=>{let n=Rc(e,r,t);return Math.min(n.heel[1],n.ball[1])>=.02})&&!tl(e,r));for(let e=0;e<n;e++){if(!i[e])continue;let t=e;for(;t+1<n&&i[t+1];)t++;r.push([e,t]),e=t}return r}function rl(e,t={}){let n=e.frames,r=n.length,i=e.ctx.sk.index,a=9.81/(e.fps??24)**2,o=e.f0??0,s=[],c=e=>n[Math.max(0,Math.min(r-1,e))].s.P[i.Hips][1];for(let[n,i]of nl(e,t.supports)){let e=i-n+1;if(e<4)continue;let t=1-((n>0?c(n)-c(n-1):c(n+1)-c(n))-(i<r-1?c(i+1)-c(i):c(i)-c(i-1)))/e/a;if(!(t<=Uc))for(let e=n;e<=i;e++)s.push({kind:`FLOAT`,msg:`no foot on the ground f${n+o}-f${i+o}, hips fall at ${Math.round(Math.max(0,1-t)*100)}% of g`,frame:e,value:+t.toFixed(4),limit:Uc})}return s}var il=(e,t,[,n,r,i])=>vr(H(t.P[e.index[r]],t.P[e.index[n]]),H(t.P[e.index[i]],t.P[e.index[r]]));function al(e,t,n,r){let i=n?.limits??{},a=e=>Object.hasOwn(i,e),o=[],s=(e,t,n,r,i)=>o.push({kind:e,msg:t,frame:n,value:+r.toFixed(4),limit:i});for(let n of Kc(e,t)){let{j:e,core:t,v:i,a:o}=n,c=t?`speedCore`:`speedLimb`,l=t?`accCore`:`accLimb`;for(let t=1;t<i.length;t++)a(c)&&i[t]>r[c]&&s(`SPEED`,`${e} ${(i[t]*100).toFixed(1)} cm/frame`,t,i[t],r[c]),a(l)&&t>1&&o[t]>r[l]&&!Jc(n,t,r[l])&&s(`ACC`,`${e} accel ${(o[t]*100).toFixed(2)} cm/f^2`,t,o[t],r[l])}return a(`knee`)&&t.frames.forEach(({s:t},n)=>{for(let i of Vc.slice(0,2)){let a=il(e,t,i);a>r.knee&&s(`KNEE`,`${i[0]===`knee_l`?`Left`:`Right`} knee bent ${a.toFixed(0)}deg`,n,a,r.knee)}}),a(`balance`)&&$c(t,n.supports).forEach((n,i)=>{if(n===`air`)s(`BALANCE`,`no foot on the ground`,i,0,0);else if(n!==null&&-n>r.balance){let a=U([`Hips`,`Spine1`,`Spine2`,`Head`].reduce((n,r)=>V(n,t.frames[i].s.P[e.index[r]]),[0,0,0]),.25);s(`BALANCE`,`centre of mass ${a[0].toFixed(2)},${a[2].toFixed(2)} outside the feet`,i,-n,r.balance)}}),o}function ol(e,t,n={}){let r=t.f0??0,i=t.fps??24,a=(e,t)=>{let n=0;for(let t=1;t<e.length;t++)e[t]>e[n]&&(n=t);return[Math.round(e[n]*t*100)/100,n+r]},o=Object.fromEntries(Kc(e,t).map(({j:e,v:t,a:n})=>[e,{speed:a(t,i),accel:a(n,i*i)}]).filter(([,e])=>e.speed[0]>=Wc)),s=$c(t,n.supports),c=e=>{let t=s.map((t,n)=>e(t)?n+r:-1).filter(e=>e>=0);return t.length?[t[0],t[t.length-1]]:null},l=nl(t,n.supports).slice(0,4).map(([e,t])=>[e+r,t+r]),u=null;s.forEach((e,t)=>{typeof e==`number`&&(!u||e<u[0])&&(u=[Gc(e),t+r])});let d=c(e=>typeof e==`number`&&e<0),f=Object.fromEntries(Vc.map(n=>{let i=[0,r];return t.frames.forEach(({s:t},a)=>{let o=il(e,t,n);o>i[0]&&(i=[o,a+r])}),[n[0],[Math.round(i[0]),i[1]]]}));return{units:`[value, frame]; speed m/s, accel m/s^2, balance m inside the feet (< 0 outside), bend deg (0 straight)`,peaks:o,balance:{min:u,...d?{outside:d}:{},...l.length?{air:l}:{}},bend:f}}function sl(e,t,n,r){let i=e=>Object.hasOwn(n??{},e),a=new Float64Array(t.frames.length);for(let n of Kc(e,t)){let{core:e,v:t,a:o}=n,s=e?`speedCore`:`speedLimb`,c=e?`accCore`:`accLimb`;for(let e=1;e<t.length;e++)i(s)&&(a[e]=Math.max(a[e],t[e]/r[s])),!(e<2)&&(Jc(n,e,r[c])&&(a[e]=Math.max(a[e],Math.sqrt(o[e]/Math.max(r[c],Hc*qc(n,e))))),i(c)&&(a[e]=Math.max(a[e],Math.sqrt(o[e]/r[c]))))}return a}var cl=[0,1,0],ll=.7,ul=.025,dl=new Map;function fl(e,t){let n=`${e.model}:${t}`;if(dl.has(n))return dl.get(n);let r=mi(e),i=r?[]:null;for(let n of r?.grids??[]){if(n.b!==e.index[`${t}Foot`]&&n.b!==e.index[`${t}ToeBase`])continue;let[a,o,s]=n.dims,c=new Set;for(let e=0;e<a;e++)for(let t=0;t<o;t++)for(let a=0;a<s;a++){if(Math.abs(n.data[(e*o+t)*s+a]/1e3)>r.step/2)continue;let l=[n.min[0]+e*r.step,n.min[1]+t*r.step,n.min[2]+a*r.step],u=l.map(e=>Math.floor(e/ul)).join();c.has(u)||(c.add(u),i.push([n.b,l]))}}return dl.set(n,i),i}function pl(e,t,n){let r=fl(e,n);if(!r?.length){let r=_a(e,t,n),i=(e,t)=>U(V(e,t),.5);return[r.heel,i(r.heel,r.ball),r.ball,i(r.ball,r.tip),r.tip]}return r.map(([e,n])=>V(t.P[e],J(t.R[e],n)))}function ml(e,t){let n={top:-1/0,side:-1/0,topAt:null,sideAt:null};for(let r of e){let e=-fa(r,t);if(e<=0)continue;let i=W(va(r,t),cl)>ll?`top`:`side`;e>n[i]&&(n[i]=e,n[`${i}At`]=r)}return n}function hl(e,t,n,r,i,a,o){for(let[s,c]of[[`Left`,`l`],[`Right`,`r`]]){let l=pl(e,t,s),u=`foot_${c}`;for(let[e,t,s,c]of r){if(l.every(e=>ar(e,s)>c))continue;let r=ml(l,t),d=a(u,e),f=d??i.allow,p=d??i.groundAllow;r.side>f?o(`COLLIDE`,`${u} x ${e}`,n,r.side,f):r.top>p&&o(`COLLIDE`,`${u} x ${e}`,n,r.top,p)}}}var gl={allow:.005,groundAllow:.01,reach:.01,slide:.0015,plantH:.012,speedCore:.04,speedLimb:.16,accCore:.015,accLimb:.05,flip:60,knee:150,headAllow:.003,self:0,body:.005,skin:.015,hands:.01,object:.005,grab:.03,balance:.08},_l=20,vl=.01,yl=(e,t,n)=>{for(let r of e??[])if(t.startsWith(r.part)&&(r.object===n||r.object.endsWith(`*`)&&n.startsWith(r.object.slice(0,-1))))return r.depth;return null};function bl(e,t,n={}){let r={...gl,...n.limits},i=[],a=e.index,o=t.frames,s=o.length,c=(e,t,n,r,a)=>i.push({kind:e,msg:t,frame:n,value:+r.toFixed(4),limit:a});for(let i=0;i<s;i++){let{s,diag:l}=o[i],u=t.objectsAt(i),d=Object.entries(u).filter(([,e])=>e.half&&!e.ignore).map(([e,t])=>[e,t,V(t.pos,J(t.R,[0,t.half[1],0])),G(t.half)]);for(let[e,t,o,l]of ua){let u=s.P[a[t]],f=s.P[a[o]],p=U(V(u,f),.5),m=l+ar(u,f)/2,h=null;for(let[t,a,o,s]of d){let d=yl(n.allow,e,t)??r.allow;if(m-(ar(p,o)-s)<=d)continue;h??=da(u,f);let g=l-Math.min(...h.map(e=>fa(e,a)));g>d&&c(`COLLIDE`,`${e} x ${t}`,i,g,d)}}hl(e,s,i,d,r,(e,t)=>yl(n.allow,e,t),c);for(let t of[`Left`,`Right`]){let n=_a(e,s,t),a=Math.min(n.heel[1],n.ball[1],n.tip[1]);a<-r.groundAllow&&c(`GROUND`,`${t} sole below floor`,i,-a,r.groundAllow)}for(let[e,t]of Object.entries(l))/miss_[lr]$/.test(e)&&t>r.reach&&c(`REACH`,e,i,t,r.reach);let f=[];for(let e of[`Left`,`Right`])f.push(...da(s.P[a[`${e}Hand`]],s.P[a[`${e}HandMiddle3`]],5).map(t=>[`hand_${e[0].toLowerCase()}`,t,.022]));for(let[e,t]of Object.entries(l.props??{}))for(let[r,i]of Object.entries(t))Array.isArray(i)&&r!==`origin`&&!(n.mouthPoints??[]).includes(`${e}.${r}`)&&f.push([`prop_${e}`,i,.004]);for(let[t,n,a]of f){let o=ma(e,s,n)+a;o>r.headAllow&&c(`FACE`,`${t} into head`,i,o,r.headAllow)}pa(s.P[a.LeftLeg],s.P[a.LeftFoot],s.P[a.RightLeg],s.P[a.RightFoot])<.1+r.self&&c(`SELF`,`shins touch`,i,.1,.1),pa(s.P[a.LeftUpLeg],s.P[a.LeftLeg],s.P[a.RightUpLeg],s.P[a.RightLeg])<.135+r.self&&c(`SELF`,`thighs overlap`,i,.135,.135);let p=K(H(s.P[a.Spine],s.P[a.Hips]))[1]<.5;for(let e of[`Left`,`Right`]){let t=s.P[a[`${e}UpLeg`]],n=s.P[a[`${e}Leg`]],r=s.P[a[`${e}Foot`]],o=vr(H(n,t),H(r,n)),l=H(s.P[a[`${e}ToeBase`]],r);if(p){let e=K(H(r,n));l=H(l,U(e,W(l,e)))}else l[1]=0;let u=H(n,[(t[0]+r[0])/2,(t[1]+r[1])/2,(t[2]+r[2])/2]);o>3&&W(u,l)<-.002&&c(`KNEE`,`${e} knee bends backward`,i,o,0),o>160+vl&&c(`KNEE`,`${e} knee folds ${o.toFixed(0)}deg`,i,o,160);let d=vr(H(s.P[a[`${e}ForeArm`]],s.P[a[`${e}Arm`]]),H(s.P[a[`${e}Hand`]],s.P[a[`${e}ForeArm`]]));d>150+vl&&c(`ELBOW`,`${e} elbow folds ${d.toFixed(0)}deg`,i,d,150)}}let l=(e,t)=>yl(n.allow,e,t);Oc(e,t,r,c,l),Mc(e,t,r,c,l);for(let e of[`Left`,`Right`]){let n=o.map((n,r)=>Rc(t,r,e));for(let t=1;t<s;t++){let i=n[t-1],a=n[t];for(let n of[`heel`,`ball`]){let o=a[n][1]<r.plantH&&i[n][1]<r.plantH&&Math.abs(a[n][1]-i[n][1])<5e-4,s=Math.hypot(a[n][0]-i[n][0],a[n][2]-i[n][2]);o&&s>r.slide&&c(`SLIDE`,`${e} ${n} slides`,t,s,r.slide)}}}for(let t=0;t<e.names.length;t++){let n=e.parent[t];if(n<0)continue;let r=ar(e.restWorldPos[t],e.restWorldPos[n]),i=Math.max(...o.map(e=>Math.abs(ar(e.s.P[t],e.s.P[n])-r)));i>.001&&c(`LENGTH`,`${e.names[n]}-${e.names[t]}`,0,i,.001)}return Yc(e,t,r,c),xl(e,o,r,c),i}function xl(e,t,n,r){let i=e.index,a=Math.sin(_l*Math.PI/180);for(let e of[`Left`,`Right`])for(let[o,s,c]of[[`${e}UpLeg`,`${e}Leg`,`${e}Foot`],[`${e}Arm`,`${e}ForeArm`,`${e}Hand`]]){let e=null,l=0;for(let u=0;u<t.length;u++){let d=t[u].s.P,f=H(d[i[s]],d[i[o]]),p=H(d[i[c]],d[i[s]]),m=ir(f,p);if(G(m)<a*G(f)*G(p))continue;let h=K(m),g=e?vr(h,e):0,_=u-l;g/_>n.flip&&r(`FLIP`,`${s} bend plane jumps ${g.toFixed(0)}deg${_>1?` over ${_} frames`:``}`,u,g/_,n.flip),e=h,l=u}}}var Sl=36,Cl=.05,wl=.3,Tl=3,El=10,Dl=36,Ol=1,kl=100,Al=ua.filter(e=>e[0].startsWith(`torso`)),jl=Object.fromEntries(ua.map(e=>[e[0],e[3]])),Ml=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],Nl=(e,t)=>[e[0][t],e[1][t],e[2][t]];function Pl(e,t,n,r){let i=H(t,e),a=H(r,n),o=H(e,n),s=W(i,i),c=W(a,a),l=W(a,o);if(s<1e-12||c<1e-12)return G(o);let u=W(i,o),d=W(i,a),f=s*c-d*d,p=f>1e-12?or((d*l-u*c)/f,0,1):0,m=(d*p+l)/c;return m<0?(m=0,p=or(-u/s,0,1)):m>1&&(m=1,p=or((d-u)/s,0,1)),G(H(V(e,U(i,p)),V(n,U(a,m))))}function Fl(e,t,n){let r=e.index,i=zr(e,t,n);return{pos:U(V(t.P[r[`${n}HandIndex2`]],t.P[r[`${n}HandMiddle2`]]),.5),R:Ml(i.d,i.l,i.n)}}function Il(e,t,n,r,i,a){let o=t.objects[n];if(t.props[o.prop].hand!==`r`)return null;let s=Object.entries(t.anchors??{}).reduce((e,[t,n])=>e+(n.kind===`prop`&&n.prop===o.prop?Math.max(0,i[`w_${t}_l`]??0):0),0);if(!(s>1e-4))return null;let c=Fl(e,r,wf.r).R,l=Nl(c,0),u=K(ir(a,H(l,U(a,W(l,a))))),d=e=>H(e,U(u,2*W(e,u))),f=Ml(d(l),d(Nl(c,1)),U(d(Nl(c,2)),-1)),p=Fl(e,r,wf.l),m=e.index,h=m.LeftHand,g=r.P[h],_=q(Y(r.R[h]),p.R),v=J(Y(r.R[h]),H(p.pos,g)),y=(t.fits??[]).some(e=>e.side===`l`&&t.anchors?.[e.anchor]?.kind===`prop`&&t.anchors[e.anchor].prop===o.prop&&i[`w_${e.anchor}_l`]>1e-4)?`palm`:`wrist`,b=e=>q(pr(a,e*180/Math.PI),f),x=e=>q(b(e),Y(_)),S=e=>y===`wrist`?V(g,J(x(e),v)):H(p.pos,J(x(e),v)),C=e=>y===`wrist`?g:S(e),w=J(Y(r.R[h]),H(r.P[m.LeftHandMiddle3],g)),T=r.P[m.LeftArm],E=ra(e,r,wf.l),D=t.fix===!1||t.fix?.self===!1?null:mi(e),O={uarm_l:m.LeftArm,farm_l:m.LeftForeArm,hand_l:m.LeftHand},k=(t,n,i)=>D?ki(D,e,r,O[i],t,n):Math.max(0,...Al.map(([,e,a,o])=>jl[i]+o-Pl(t,n,r.P[m[e]],r.P[m[a]]))),ee=new Map,te=t=>{if(ee.has(t))return ee.get(t);let n=C(t),i=Ji(e,r,wf.l,x(t),n,E,Pi),a=e=>{let t=i.at(e);return{pv:t.pv,elbow:t.elbow,cost:t.cost+Ol*((100*k(T,t.elbow,`uarm_l`))**2+(100*k(t.elbow,n,`farm_l`))**2)}},o={th:0,cost:1/0};for(let e=0;e<Dl;e++){let t=2*Math.PI*e/Dl-Math.PI,n=a(t).cost;n<o.cost&&(o={th:t,cost:n})}let s=V(n,J(x(t),w)),c=k(n,s,`hand_l`),l=Math.max(0,c-gl.body),u=2*jl.hand_l-Pl(n,s,r.P[m.RightHand],r.P[m.RightHandMiddle3]),d=Math.max(0,u-gl.hands),f=Ol*((100*c)**2+(100*i.miss)**2)+(l>0?kl*(100*l)**2:0)+(d>0?kl*(100*d)**2:0),p={at:a,best:{th:o.th,pole:a(o.th).pv,cost:o.cost+f}};return ee.set(t,p),p},ne=e=>te(e).best.cost+wl*(1-Math.cos(e));return{id:n,weight:s,pin:y,at:p.pos,rolled:b,arm:te,cost:ne,point:S,softmin:()=>{let e=Array.from({length:Sl},(e,t)=>{let n=2*Math.PI*t/Sl-Math.PI;return[n,ne(n)]}),t=Math.min(...e.map(e=>e[1])),n=e.reduce((e,[n,r])=>{let i=Math.exp(-(r-t)/Cl);return[e[0]+i*Math.cos(n),e[1]+i*Math.sin(n)]},[0,0]);return Math.atan2(n[1],n[0])},measure:t=>Fl(e,t,wf.l)}}var Ll=(e,t)=>Math.exp(-Math.max(0,e.cost(t)-Tl)/El),Rl=(e,t,n,r,i)=>({w:t*Math.min(1,e.weight)*r,second:e.id,pin:e.pin,pole:i,palm:{pos:e.at,R:e.rolled(n)},measure:e.measure}),zl=.045,Bl=4,Vl=8,Hl=[30,10],Ul=2,Wl=4,Gl=2,Kl=.1,ql=1.5,Jl=20,Yl=4,Xl=8,Zl=400,Ql=[`the fingers' line`,`the palm normal`,`the knuckle line`],$l=(e,t)=>[e[0][t],e[1][t],e[2][t]],eu=e=>{let t=Y(e.R);return{pos:U(J(t,e.pos),-1),R:t}},tu=e=>Math.round(e*100)/100;function nu(e,t,n){let r=gr(e),i=gr(t);return Zr(r,i)<0&&(i=i.map(e=>-e)),_r(ii(r,i,n))}function ru(e,[t,n],[r,i]){let a=e>=0?n:-t,o=e>=0?i:-r,s=Math.abs(e);if(s<=a)return(s/a)**2;let c=(Math.min(s,o)-a)/Math.max(1e-6,o-a);return 1+Xl*c*c+(s>o?Zl*((s-o)/o)**2:0)}function iu(e,t,n,r,i){let{goal:a,plane:o,wristAt:s}=ia(e,t,n,r,i,1),c=s(a),l=Ji(e,t,n,a,c,o,Pi),u=l.at(l.softmin()),d=e.index,f=t.P[d[`${n}Arm`]],p=G(H(t.P[d[`${n}ForeArm`]],f)),m=G(H(t.P[d[`${n}Hand`]],t.P[d[`${n}ForeArm`]])),h=Math.max(0,Or(p,m,145)-G(H(c,f))),g=mi(e),_=g?Math.max(ki(g,e,t,d[`${n}Arm`],f,u.elbow),ki(g,e,t,d[`${n}ForeArm`],u.elbow,c),ki(g,e,t,d[`${n}Hand`],c,r.pos)):0;return[`twist`,`flex`,`dev`].reduce((e,t)=>e+ru(u.need[t],Mi[t],ji[t]),0)+Jl*((l.miss*100)**2+(h*100)**2)+Yl*(_*100)**2}function au(e,t,n,r,i,a,o){if(r.aim===void 0)return o({pos:r.pos,R:_r(r.rot)});let s=gr(Yf(i,a).R),c=K(r.aim),l=Yr(ni(K(ti(s,[0,1,0])),c),s),u=e=>({pos:r.pos,R:_r(Yr(ri(c,e),l))});if(r.roll!==void 0)return o(u(r.roll));let d=null;for(let r=0;r<Bl;r++){let o=u(360/Bl*r-180),s=sa(e,t,n,Yf(o,eu(a)),i);(!d||s<d.strain)&&(d={p:o,strain:s})}return o(d.p)}function ou(e,t){let n=Object.entries(e?.objects??{}).filter(([e,n])=>(e===t||n.ancestors?.includes(t))&&n.half);if(!n.length)return!1;let r=n.map(([,e])=>e.half).reduce((e,t)=>t[0]*t[1]*t[2]>e[0]*e[1]*e[2]?t:e),i=[0,1,2].reduce((e,t)=>r[t]>r[e]?t:e,0);return[0,1,2].filter(e=>e!==i).every(e=>r[e]<zl)}var su=(e,t)=>e.length<=t?e:Array.from({length:t},(n,r)=>e[Math.round(r*(e.length-1)/(t-1))]);function cu(e,t){let n=$r(gr(q(Y(e),t)));return`today's grip turned ${Math.round(2*G(n)*180/Math.PI)} deg, mostly about ${Ql[[0,1,2].reduce((e,t)=>Math.abs(n[t])>Math.abs(n[e])?t:e,0)]}`}function lu({sk:e,o:t,side:n,grab:r,rest:i,plain:a,palmOf:o,map:s=e=>e}){let c=new Map,l=e=>{let t=Math.round(e);if(!c.has(t)){let e=a(t);c.set(t,{s:e,now:o(e)})}return c.get(t)},{s:u,now:d}=l(r),f=[...t.keys].sort((e,t)=>e.f-t.f),p=su(f,Vl),m=e=>Xf({pos:d.pos,R:e},i),h=(t,r,i)=>{let{s:a,now:o}=l(r);return iu(e,a,n,Yf(i,eu(t)),o)},g=t=>iu(e,u,n,Yf(i,eu(t)),d),_=t=>{let r=m(t);return g(r)+p.reduce((t,i)=>{let{s:a,now:o}=l(s(i.f));return t+au(e,a,n,i,o,r,e=>h(r,s(i.f),e))},0)},v=r=>{let a=m(r),o=Math.round(s(f[0].f)),c=Math.round(s(f[f.length-1].f)),u=Pu(t,s,e=>gr(Yf(l(e).now,a).R),(t,r,i,o)=>{let{s,now:c}=l(t);return sa(e,s,n,Yf({pos:r,R:_r(i)},eu(a)),c,o)},2*(i?.half?.[1]??0)),d=g(a),p=d;for(let e=o;e<=c;e+=Wl){let t=h(a,e,Lu(u,e));d+=t,p=Math.max(p,t)}return{A:a,cost:d,worst:p}},y={name:`today`,R:d.R,...v(d.R)};if(y.worst<=ql)return{offset:y.A,name:`today`,cost:tu(y.cost),today:tu(y.cost)};let b={R:d.R,rough:_(d.R)};for(let e of Hl)for(let t=0,n=!0;n&&t<Ul;t++){n=!1;for(let t of[0,1,2])for(let r of[1,-1]){let i=q(pr($l(b.R,t),r*e),b.R),a=_(i);a<b.rough-1e-6&&(b={R:i,rough:a},n=!0)}}let x=b.R===d.R?y:{name:cu(d.R,b.R),...v(b.R)},S=x.cost<y.cost-Math.max(Gl,Kl*y.cost)?x:y;return{offset:S.A,name:S.name,cost:tu(S.cost),today:tu(y.cost)}}var uu=3,du=12,fu=.05,pu=.3,mu=180/Math.PI,hu=40,gu=1,_u=.3,vu=[-40,-40/2,0,hu/2,hu];function yu(e){let t=Math.min(...e.map(e=>e[1])),n=e.map(([e,n])=>[e,Math.exp(-(n-t)/_u)]);return n.reduce((e,[t,n])=>e+t*n,0)/n.reduce((e,[,t])=>e+t,0)}function bu(e){let t=Array.from({length:du},(t,n)=>{let r=2*Math.PI*n/du-Math.PI;return[r,e(r)]}),n=Math.min(...t.map(e=>e[1])),r=t.reduce((e,[t,r])=>{let i=Math.exp(-(r-n)/fu);return[e[0]+i*Math.cos(t),e[1]+i*Math.sin(t)]},[0,0]);return Math.atan2(r[1],r[0])}var xu=({d:e,l:t,n})=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],Su=(e,t)=>e.anchors?.[t]?.kind===`object`&&!!e.anchors[t].grasp,Cu=(e,t)=>(e.keys??[]).some(e=>(!e.src||e.src.startsWith(`keys[`))&&(e.set?.[`wtwist_${t}`]!==void 0||e.set?.[`wflex_${t}`]!==void 0));function wu(e,t,n,r){let i=new Set(Ud(t,n));return(e.fits??[]).some(a=>{if(a.side!==r||!Su(e,a.anchor))return!1;let o=e.anchors[a.anchor].object;return o===n||i.has(o)||Ud(t,o).some(e=>i.has(e))})}function Tu(e,t,n){let{spec:r,scene:i}=e;if(!e.objectHand||!(r.fits??[]).some(e=>e.side===t&&Su(r,e.anchor)))return null;for(let[a,o]of Object.entries(r.objects??{}))if(o?.prop&&e.objectHand(a,n)===t&&wu(r,i,a,t))return{id:a,grab:e.carrySpan(o)[0],keyed:!!o.keys?.length};return null}function Eu(e,t,n,r,i,a,o,s,c,l=null,u=void 0){let d=t.index,f=d[`${r}Arm`],p=d[`${r}ForeArm`],m=d[`${r}Hand`],h=n.R[p],g=l?.w??ys(e,s.fit.anchor,n,o,a,i),_=c(n),v=K(H(n.P[m],n.P[p])),y=l?.type??e.spec.anchors[s.fit.anchor].grasp,b=os(r,g,y,v,a.yaw),x=(e=>({pos:c(e),R:xu(zr(t,e,r))}))(n),S=e=>{let i=ia(t,n,r,{pos:_,R:e},x,1,`palm`);return Yi(t,n,r,i.goal,i.wristAt(i.goal),i.plane,Pi).cost},C=(e,t)=>[e[0][t],e[1][t],e[2][t]],w=e=>q(pr(C(b,1),e*mu),b),{R:T,roll:E,tilt:D}=Du(e,s.fit.anchor,i,u,()=>{let e=g.axis&&!g.from&&y!==`palm`?bu(e=>S(w(e))+pu*(1-Math.cos(e))):0,t=w(e),n=e=>q(pr(C(t,2),e),t),r=g.axis&&y!==`palm`?yu(vu.map(e=>[e,S(n(e))+gu*(e/hu)**2])):0;return{R:n(r),roll:e,tilt:r}}),{goal:O,plane:k,wristAt:ee}=ia(t,n,r,{pos:_,R:T},x,s.w,`palm`),te=Yi(t,n,r,O,ee(O),k,Pi,{w:s.w}),ne={twist:0,flex:0,dev:0};for(let e=0;e<uu;e++)Lr(t,n,f,p,m,ee(e?n.R[m]:O),te.pole,Pi,`elbow`),ne=na(t,n,r,m,p,O);o[`grip_${i}`]={w:s.w,socket:!0,...ne,roll:E*mu,tilt:D},o[`socket_${i}`]={rel:q(Y(h),n.R[m])}}function Du(e,t,n,r,i){let a=`w_${t}_${n}`,o=t=>e.weightAt?.(a,t)??0;if(!e.weightAt||!Number.isInteger(r))return i();let s=r,c;for(;s>0&&o(s-1)>.001;)s--;for(c=s;c<e.frameCount-1&&o(c)<.999&&o(c+1)>.001;c++);let l=`${a}:${s}`;if(e.graspPlans??=new Map,r>=c){let t=i();return r===c&&e.graspPlans.set(l,t),t}return e.graspPlans.has(l)||(e.graspPlans.set(l,null),(e.hold?.plainFrame??e.solvedAt)(c)),e.graspPlans.get(l)??i()}function Ou(e,t,n,r,i,a){let o=`${i}:${a.grab}`;e.socketTurns??=new Map,e.socketTurns.has(o)||(e.socketTurns.set(o,null),e.socketTurns.set(o,(e.hold?.plainFrame??e.solvedAt)(a.grab)?.diag?.[`socket_${i}`]?.rel??null));let s=e.socketTurns.get(o);if(!s)return;let c=t.index,l=c[`${r}ForeArm`],u=c[`${r}Hand`];na(t,n,r,u,l,q(n.R[l],s))}var ku=12,Au={m:.01,deg:5},ju=e=>e*e*(3-2*e),Mu=(e,t)=>{let n=t=>e.timeMap?Math.round(e.timeMap(t)):t;return[n(t.grab??0),t.release===void 0?e.frameCount-1:n(t.release)]},Nu=e=>{let t=Y(e.R);return{pos:U(J(t,e.pos),-1),R:t}};function Pu(e,t,n,r,i=0){let a=[...e.keys].sort((e,t)=>e.f-t.f),o=a.map(e=>t(e.f)),s=[],c=nc(a,e=>n(o[e]),r&&((e,t)=>r(o[e],Qs(a[e],t,i),t,a[e].lean?{shoulder:!0}:void 0))),l=a.map((e,t)=>Qs(e,Qr(c[t]),i).slice());for(let e of c){let t=Qr(e);s.push(s.length&&Zr(s[s.length-1],t)<0?t.map(e=>-e):t)}let u=a.length-1,d=e=>U($r(Yr(Xr(s[e]),s[e+1])),1/(o[e+1]-o[e])),f=(e,t)=>e===0||e===u?[0,0,0]:U(V(U(t(e),o[e]-o[e-1]),U(t(e-1),o[e+1]-o[e])),1/(o[e+1]-o[e-1]));return{t:o,p:l,q:s,m:l.map((e,t)=>f(t,e=>U(H(l[e+1],l[e]),1/(o[e+1]-o[e])))),w:s.map((e,t)=>f(t,d)),rots:c}}var Fu=new WeakMap;function Iu(e,t){Fu.has(e)||Fu.set(e,new Map);let n=Fu.get(e),r=e.timeMap,i=e.baked,a=n.get(t);if(!a||a.map!==r||a.baked!==i){let a=e.ctx.hold,o=new Map,s=e=>{let t=Math.round(e);return o.has(t)||o.set(t,a.plainFrame(t).s),o.get(t)};n.set(t,{map:r,baked:i,curve:Pu(e.ctx.spec.objects[t],e=>r?r(e):e,e=>gr(a.carryOn(t,s(e)).R),(e,n,r,i)=>a.strainOn(t,s(e),{pos:n,R:_r(r)},i),2*(e.ctx.scene?.objects?.[t]?.half?.[1]??0))})}return n.get(t).curve}function Lu({t:e,p:t,q:n,m:r,w:i},a){let o=e.length;if(o===1||a<=e[0])return{pos:t[0].slice(),R:_r(n[0])};if(a>=e[o-1])return{pos:t[o-1].slice(),R:_r(n[o-1])};let s=0;for(;a>e[s+1];)s++;let c=e[s+1]-e[s],l=(a-e[s])/c,u=l*l,d=u*l,f=2*d-3*u+1,p=d-2*u+l,m=-2*d+3*u,h=d-u,g=V(V(U(t[s],f),U(r[s],c*p)),V(U(t[s+1],m),U(r[s+1],c*h))),_=Yr(Xr(n[s]),n[s+1]),v=V(V(U($r(_),m),U(i[s],c*p)),U(ti(_,i[s+1]),c*h));return{pos:g,R:_r(Yr(n[s],ei(v)))}}function Ru(e,[t,n],r){let i=e.t[0],a=e.t[e.t.length-1];if(r<t||r>n)return 0;if(r>=i&&r<=a)return 1;let o=r<i?Math.min(8,i-t):8,s=r<i?i-r:r-a;return o>0&&s<o?ju(1-s/o):0}var zu=e=>Object.entries(e.objects??{}).filter(([,e])=>Hf(e)&&e.keys?.length);function Bu(e,t,n,r){let{sk:i,spec:a,scene:o}=e,s=zu(a);if(!s.length)return null;let c=new Set(s.map(([e])=>e).filter(e=>Ma(a,a.objects[e],o,e)).map(e=>a.objects[e])),l=(e,t)=>Jf(i,a,t,{prop:e.prop},c.has(e)),u=new WeakMap,d=new Set,f=(t,n)=>e.restingAt?.(t,n)??o?.objects?.[t]??Io(o)[t],p=new WeakMap,m=e=>t.timeMap?Math.round(t.timeMap(e)):e,h=e=>{p.has(t)||p.set(t,new Map);let r=p.get(t),s=a.objects[e],c=a.props?.[s.prop]?.hand,u=Mu(t,s)[0],h=t.baked??{};if(r.has(e))return r.get(e);if(r.set(e,null),!(c&&s.at===void 0&&s.along===void 0&&(s.grab!==void 0||!o?.objects?.[e])&&ou(o,e)&&!(a.fits??[]).some(e=>e.side===c&&e.orient===!1)&&!wu(a,o,e,c)&&![`wtwist`,`wflex`].some(e=>Math.abs(h[`${e}_${c}`]?.[u]??0)>.001)&&m(Math.min(...s.keys.map(e=>e.f)))<=u))return null;d.add(e);try{r.set(e,lu({sk:i,o:s,side:wf[c],grab:u,rest:f(e,u),plain:e=>n(e).s,palmOf:e=>l(s,e),map:m}))}finally{d.delete(e)}return r.get(e)},g=r=>{u.has(t.baked)||u.set(t.baked,new Map);let s=u.get(t.baked),f=a.objects[r];if(s.has(r))return s.get(r);let p=h(r);if(p&&p.name!==`today`){let e=c.has(f)?Fa(i,a,o,r,f,p.offset):p.offset;return s.set(r,e),s.set(`${r}|taken`,p.offset),e}let m=o?.objects?.[r]??Io(o)[r],g=!o?.objects?.[r]&&!!m,_=f.at===void 0&&f.along===void 0&&(g||f.grab!==void 0);d.add(r);let v;try{v=_?n(Mu(t,f)[0]).s:xr(i)}finally{d.delete(r)}let y=Xf(l(f,v),_?e.restingAt?.(r,Mu(t,f)[0])??{pos:m.pos,R:m.R}:Jf(i,a,v,f)),b=_&&c.has(f)?Fa(i,a,o,r,f,y):y;return s.set(r,b),s.set(`${r}|taken`,y),b},_=(e,n)=>{let r=g(e),i=u.get(t.baked)?.get(`${e}|taken`);return i&&i!==r&&n!==void 0?Ra(i,r,La(Mu(t,a.objects[e])[0],n)):r},v=(e,t)=>Yf(l(a.objects[e],t),g(e)),y=(e,t,n,r)=>{let o=a.objects[e];return sa(i,t,wf[a.props[o.prop].hand],Yf(n,Nu(g(e))),l(o,t),r)},b=(e,n,r)=>{let i=Iu(t,e),a=Ru(i,Mu(t,n),r);return a>0?{w:a,palm:Yf(Lu(i,r),Nu(_(e,r))),measure:e=>l(n,e),comfort:n.keys.some(e=>e.lean>0)}:null},x=new WeakMap,S=(e,r)=>{x.has(t.baked)||x.set(t.baked,new Map);let o=x.get(t.baked),s=o.get(e);if(s&&s.map===t.timeMap)return s.plan;let[c,l]=Mu(t,r),u=[];for(let n=Math.max(0,c);n<=Math.min(t.frameCount-1,l);n++)Ru(Iu(t,e),[c,l],n)>0&&u.push(n);let d=Sc(i,wf[a.props[r.prop].hand],u,t=>({s:n(t).s,held:b(e,r,t)}));return o.set(e,{map:t.timeMap,plan:d}),d},C=!1,w=(e,t,n)=>{let r=v(e,t).R;return Il(i,a,e,t,n,[r[0][1],r[1][1],r[2][1]])},T=new WeakMap,E=(e,n)=>{T.has(t.baked)||T.set(t.baked,new Map);let i=T.get(t.baked),a=i.get(e);if(a&&a.map===t.timeMap)return a.plan;let[o,s]=Mu(t,n),c=new Map;C=!0;let l=[],u=()=>{let e=_c((e,t)=>l[e].grip.cost(t),(e,t)=>l[e].grip.point(t),l.map(e=>e.grip.softmin())),t=xc(l.map((t,n)=>Ll(t.grip,e[n]))),n=t=>l[t].grip.arm(e[t]),r=_c((e,t)=>n(e).at(t).cost,(e,t)=>n(e).at(t).elbow,l.map((e,t)=>n(t).best.th));l.forEach((i,a)=>c.set(i.f,{roll:e[a],gate:t[a],pole:n(a).at(r[a]).pv})),l=[]};for(let n=Math.max(0,o);n<=Math.min(t.frameCount-1,s);n++){let i=Ru(Iu(t,e),[o,s],n)>0?r(n):null,a=i&&w(e,i.s,i.c);a?l.push({f:n,grip:a}):l.length&&u()}return l.length&&u(),C=!1,i.set(e,{map:t.timeMap,plan:c}),c},D=(e,n,r)=>{let i=h(e);if(!i||i.name===`today`)return null;let a=Iu(t,e),o=a.t[0],s=a.t[a.t.length-1],[c,u]=Mu(t,n);if(r>=o&&r<=s)return null;let d=Yf(Lu(a,r<o?o:s),Nu(i.offset)),f=e=>l(n,e),p=S(e,n).get(Math.round(r<o?o:s));if(r<c||r>u){let e=ju(Math.max(0,1-(r<c?c-r:r-u)/ku));return e>.001?{w:e,palm:d,measure:f,pole:p}:null}let m=b(e,n,r);return{w:1,palm:m?{pos:V(U(d.pos,1-m.w),U(m.palm.pos,m.w)),R:nu(d.R,m.palm.R,m.w)}:d,measure:f,pole:p}},O=new WeakMap,k=(e,r,i)=>{O.has(t.baked)||O.set(t.baked,new Map);let a=O.get(t.baked),o=a.get(e);if(o&&o.map===t.timeMap)return o.off;d.add(e);let s;try{s=l(r,n(Math.max(Mu(t,r)[0],Math.round(Iu(t,e).t[0]))).s)}finally{d.delete(e)}let c=Xf(s,i).R,u=Math.acos(Math.min(1,Math.max(-1,(c[0][0]+c[1][1]+c[2][2]-1)/2)))*180/Math.PI,f=Math.hypot(...H(i.pos,s.pos))>Au.m||u>Au.deg;return a.set(e,{map:t.timeMap,off:f}),f},ee=(e,n,r)=>{let i=Iu(t,e),[a,o]=Mu(t,n),s=Math.max(a,Math.round(i.t[0]));if(!(r<s&&r>=s-ku)||s-a>=8||s>o)return null;let c=Yf(Lu(i,s),Nu(g(e)));if(!k(e,n,c))return null;let u=ju(1-(s-r)/ku);return u>.001?{w:u,palm:c,measure:e=>l(n,e),pole:S(e,n).get(s)}:null},te=(e,n,r)=>{let i=Iu(t,e),a=i.t[i.t.length-1],o=Mu(t,n)[1];return r>o&&r-a<8?{curve:i,release:o,w:ju(1-(r-a)/8)}:null},ne=(e,t,n)=>{let r=te(e,t,n);return r&&{w:r.w,palm:Yf(Lu(r.curve,r.release),Nu(g(e))),measure:e=>l(t,e),pole:S(e,t).get(r.release)}};return{lead:(e,n,r,i)=>{for(let[o,c]of s){let s=a.props?.[c.prop]?.hand===e?D(o,c,n)??ee(o,c,n)??ne(o,c,n):null;if(s)return s;let l=a.props?.[c.prop]?.hand===e?b(o,c,n):null;if(l)return{...l,pole:S(o,c).get(n)};let u=e===`l`&&r&&!C?te(o,c,n):null,d=e===`l`&&r&&!C?Ru(Iu(t,o),Mu(t,c),n)||(u?.w??0):0,f=d>0?w(o,r,i):null,p=f&&E(o,c).get(u?u.release:n),m=p?.roll??f?.softmin();if(f)return Rl(f,d,m,p?.gate??Ll(f,m),p?.pole??f.arm(m).best.pole)}return null},attach:g,attachAt:_,attaching:e=>d.has(e),plainFrame:n,carryOn:v,strainOn:y,span:e=>Mu(t,a.objects[e]),firstKey:e=>{let n=Math.min(...a.objects[e].keys.map(e=>e.f));return t.timeMap?Math.round(t.timeMap(n)):n},grips:()=>s.map(([e,t])=>{let n=h(e);return n&&{id:e,hand:a.props[t.prop].hand,name:n.name,cost:n.cost,today:n.today}}).filter(Boolean)}}var Vu=[0,0,0];function Hu(e,t,n,r){return Array.isArray(e?.v)?e.v:e?.v===`hand`&&n?U(H(t.pos,n.pos),r):Vu}var Uu=e=>e.some(e=>e!==0),Wu=(e,t,n)=>(t+Math.sqrt(t*t+2*n*Math.max(0,e)))/n,Gu=(e,t,n)=>{let r=Math.min(t,n);return[e[0]*r,0,e[2]*r]};function Ku(e,t,n,r,i=[]){let a=e(t),o=a.top+a.h,s=e=>({pos:V(t.pos,Gu(n,Wu(o-e,n[1],r),1/0)),R:t.R});for(let t of[...new Set(i)].filter(e=>e<=o).sort((e,t)=>t-e)){let n=e(s(t));if(Math.abs(n.top-t)<1e-9)return n}return e(s(0))}var qu=.3,Ju=.5,Yu=15,Xu=1,Zu=6*Math.PI,Qu=3,$u=[0,-1,0],ed=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],td=e=>e*180/Math.PI;function nd(e){let t=e.filter(e=>e.half[0]*e.half[1]*e.half[2]>1e-12);if(!t.length)return null;let n=0,r=[0,0,0],i=[];for(let e of t){let t=e.half[0]*e.half[1]*e.half[2];n+=t,r=V(r,U(V(e.pos,J(e.R,[0,e.half[1],0])),t));for(let t of[-1,1])for(let n of[0,2])for(let r of[-1,1])i.push(V(e.pos,J(e.R,[t*e.half[0],n*e.half[1],r*e.half[2]])))}return{com:U(r,1/n),lo:[0,1,2].map(e=>Math.min(...i.map(t=>t[e]))),hi:[0,1,2].map(e=>Math.max(...i.map(t=>t[e])))}}var rd=e=>[0,1,2,3,4,5,6,7].map(t=>[t&1?e.hi[0]:e.lo[0],t&2?e.hi[1]:e.lo[1],t&4?e.hi[2]:e.lo[2]]),id=(e,t)=>V(e.pos,J(e.R,t)),ad=(e,t)=>Math.min(...rd(e).map(e=>id(t,e)[1])),od=(e,t,n)=>({pos:[t.pos[0],t.pos[1]+n-ad(e,t),t.pos[2]],R:t.R}),sd=(e,t,n)=>({pos:V(t,J(n,H(e.pos,t))),R:q(n,e.R)}),cd=e=>ed.reduce((t,n,r)=>W(J(e,n),$u)>W(J(e,ed[t]),$u)?r:t,0),ld=(e,t)=>{let n=t>>1;return ed[t][n]>0?e.hi[n]:e.lo[n]},ud=(e,t)=>Math.abs(ld(e,t)-e.com[t>>1]);function dd(e,t,n){let r=q(t,[[e[0][0],e[1][0],e[2][0]],[e[0][1],e[1][1],e[2][1]],[e[0][2],e[1][2],e[2][2]]]),i=Math.acos(or((r[0][0]+r[1][1]+r[2][2]-1)/2,-1,1));if(i*n<Xu)return[0,0,0];let a=K([r[2][1]-r[1][2],r[0][2]-r[2][0],r[1][0]-r[0][1]]),o=Math.min(Zu,i*n);return G(a)>0?U(a,o):[0,0,0]}function fd(e,t,n,r,i,a=[0,0,0]){let o=G(n),s=id(t,e.com),c=!a.some(e=>e!==0),l=r=>{let i=o>0?q(pr(n,td(o*r)),t.R):t.R,l=c?[0,-.5*_d*r*r,0]:[a[0]*r,a[1]*r-.5*_d*r*r,a[2]*r];return{pos:H(V(s,l),J(i,e.com)),R:i}},u=Math.max(0,ad(e,t)-r);if(o===0)return{tl:c?Math.sqrt(2*u/_d):Wu(u,a[1],_d),at:l};let d=1/(i*8),f=(c?Math.sqrt(2*(u+G(H(e.hi,e.lo)))/_d):Wu(u+G(H(e.hi,e.lo)),a[1],_d))+d,p=0,m=d;for(;m<f&&ad(e,l(m))>r;)p=m,m+=d;for(let t=0;t<24&&m-p>1e-7;t++){let t=(p+m)/2;ad(e,l(t))>r?p=t:m=t}return{tl:m,at:l}}var pd=(e,t)=>.12+.9*Math.sqrt(Math.max(e,1e-4)/_d)*Math.sqrt(t/90);function md(e,t,n,r,i=[0,0,0]){let a=[],o=od(e,t,n),s=0,c=(t,r,i)=>{let c=pd(id(o,e.com)[1]-n,i);a.push({from:o,pivot:t,axis:r,angle:i,time:c}),o=od(e,sd(o,t,pr(r,i)),n),s+=c},l=cd(o.R),u=e=>td(Math.acos(or(W(J(o.R,ed[e]),$u),-1,1))),d=u(l);if(d>Ju){let t=[0,1,2,3,4,5].filter(e=>e>>1!=l>>1).reduce((e,t)=>u(t)<u(e)?t:e,l===0||l===1?2:0);d>td(Math.atan2(ud(e,t),ud(e,l)))&&(l=t);let r=rd(e).map(e=>id(o,e)).filter(e=>e[1]<=n+1e-4),i=J(o.R,ed[l]);c(U(r.reduce(V,[0,0,0]),1/r.length),K(ir(i,$u)),u(l))}let f=d>Ju||G(i)>0?r:0;for(let t=0;t<Qu;t++){let t=id(o,e.com),r=t[1]-n,a=null;for(let n=0;n<6;n++){if(n>>1==l>>1)continue;let s=J(o.R,ed[n]),c=id(o,ed[n].map((t,r)=>t?ld(e,n):r===l>>1?ld(e,l):e.com[r])),u=-W(H(t,c),s),d=ud(e,n);if(!(u<0||d<r*.8))continue;let f=u<0||td(Math.atan2(u,r))<Yu?0:Math.hypot(r,u)-r,p=W(s,i);(!a||f<a.cost-1e-9||Math.abs(f-a.cost)<=1e-9&&p>a.side)&&(a={j:n,out:s,edge:c,cost:f,side:p})}if(!a||a.cost>f)break;f-=a.cost;let s=rd(e).map(e=>id(o,e)).filter(e=>e[1]<=n+1e-4&&W(H(e,a.edge),a.out)>=-1e-4);c(s.length?U(s.reduce(V,[0,0,0]),1/s.length):[a.edge[0],n,a.edge[2]],K(ir(a.out,$u)),90),l=a.j}return{steps:a,rest:o,time:s}}function hd(e,t){let n=t;for(let t of e.steps){if(n<t.time){let e=n/t.time;return sd(t.from,t.pivot,pr(t.axis,t.angle*e*e))}n-=t.time}return e.rest}var gd=(e,t)=>G(t)**2*((e.hi[0]-e.lo[0])**2+(e.hi[1]-e.lo[1])**2+(e.hi[2]-e.lo[2])**2)/(24*_d),_d=9.8,vd=.03,yd=.25,bd=[`prop`,`follow`,`pivot`,`axis`,`channel`],xd=e=>!!e&&typeof e==`object`&&!Array.isArray(e)&&bd.every(t=>e[t]===void 0)&&(e.keys!==void 0||e.fall!==void 0),Sd=e=>e?.fall===void 0?[]:Array.isArray(e.fall)?e.fall:[e.fall],Cd=(e,t)=>e?.objects?.[t]??Io(e)[t]??null,wd=(e,t)=>Object.keys(e?.objects??{}).filter(n=>n===t||e.objects[n].ancestors?.includes(t));function Td(e){let t=[];for(let n of[-1,1])for(let r of[0,2])for(let i of[-1,1])t.push(V(e.pos,J(e.R,[n*e.half[0],r*e.half[1],i*e.half[2]])));return t}var Ed=e=>Math.max(...Td(e).map(e=>e[1])),Dd=(e,t)=>{let n=J(Y(e.R),H([t[0],e.pos[1]+e.half[1],t[2]],e.pos));return Math.abs(n[0])<=e.half[0]&&Math.abs(n[2])<=e.half[2]};function Od(e,t){let n=new Set;for(let[r,i]of Object.entries(t?.objects??{}))[r,...i.ancestors??[]].some(t=>Gf(e.objects?.[t]))&&n.add(r);return n}function kd(e,t,n){let r=Cd(e,t);return wd(e,t).map(t=>({id:t,...Yf(n,Xf(r,e.objects[t])),half:e.objects[t].half}))}function Ad(e,t,n,r,i=null){let a=kd(t,n,r),o=new Set(a.map(e=>e.id)),s=Od(e,t);if(!a.length)return{support:null,top:0,h:0};let c=Math.min(...a.flatMap(e=>Td(e).map(e=>e[1]))),l=a.flatMap(Td).reduce((e,t)=>V(e,t),[0,0,0]).map(e=>e/(a.length*8)),u=(i?wd(t,i):Object.keys(t.objects)).filter(e=>!o.has(e)&&!s.has(e)),d=null;for(let e of u){let n=t.objects[e],r=Ed(n);Dd(n,l)&&r<=c+.005&&(!d||r>d.top)&&(d={support:e,top:r})}if(!d&&i)for(let e of u){let n=Ed(t.objects[e]);n<=c+.005&&(!d||n>d.top)&&(d={support:e,top:n})}return d??={support:null,top:0},{...d,h:Math.max(0,c-d.top)}}var jd=new WeakMap;function Md(e,t){jd.has(e)||jd.set(e,new Map);let n=jd.get(e);return n.has(t)||n.set(t,nd(kd(e,t,{pos:[0,0,0],R:lr()}))),n.get(t)}function Nd(e,t,n,r,i,a,o,s=null){let c=Hu(a,r,s,o),l=Uu(c),u=r=>Ad(e,t,n,r,a.onto??null),d=l?Ku(u,r,c,_d,Object.values(t.objects).map(Ed)):u(r),f=a.tumble===!1?null:Md(t,n);if(f){let e=s?dd(s.R,r.R,o):[0,0,0],t=fd(f,r,e,d.top,o,c),n=md(f,t.at(t.tl),d.top,qu*d.h+gd(f,e),[-e[2],0,e[0]]);if(n.steps.length||e.some(e=>e)||l)return{t0:i,land:i+t.tl*o,end:i+(t.tl+n.time)*o,h:d.h,support:d.support,top:d.top,at:e=>{let a=(e-i)/o;return a<=0?r:a<=t.tl?t.at(a):hd(n,a-t.tl)},rest:n.rest}}let p=d.h,m=l?Wu(p,c[1],_d):Math.sqrt(2*p/_d),h=Gu(c,1/0,m),g=Math.min(.6,Math.max(0,a.bounce??yd)),_=Math.min(g*_d*m,Math.sqrt(2*_d*vd)),v=2*_/_d,y={pos:[r.pos[0]+h[0],r.pos[1]-p,r.pos[2]+h[2]],R:r.R};return{t0:i,land:i+m*o,end:i+(m+v)*o,h:p,support:d.support,top:d.top,at:e=>{let t=(e-i)/o;if(t<=0)return r;let n=t<=m?(l?c[1]*t:0)-.5*_d*t*t:t<=m+v?-p+_*(t-m)-.5*_d*(t-m)**2:-p,a=Gu(c,t,m);return{pos:[r.pos[0]+a[0],r.pos[1]+(l?n:Math.min(0,n)),r.pos[2]+a[2]],R:r.R}},rest:y}}function Pd(e,t,n=-1/0,r=1/0){let i=Hf(e)?[]:[...e.keys??[]].sort((e,t)=>e.f-t.f),a=Sd(e).map(e=>({...e,t:t(e.at)})).filter(e=>e.t>=n&&e.t<r).sort((e,t)=>e.t-t.t),o=[],s=[],c=0;for(let e of i){for(;c<a.length&&a[c].t<t(e.f);)s.length&&o.push({run:s}),s=[],o.push({fall:a[c++]});s.push(e)}for(s.length&&o.push({run:s});c<a.length;)o.push({fall:a[c++]});return o}function Fd(e,t,n,r,i=!0){let a=n;for(let n of e)if(n.run){let{t:e}=n.curve;if(t<e[0])return a;if(t<=e[e.length-1])return Lu(n.curve,t);a=Lu(n.curve,e[e.length-1])}else{if(t<n.fall.t)return a;let e=i?n.plan??=r(a,n.fall):r(a,n.fall);if(t<e.end)return e.at(t);a=e.rest}return a}var Id=new WeakMap;function Ld(e,t,n,r,i){Id.has(e.scene)||Id.set(e.scene,new Map);let a=Id.get(e.scene),o=`${t}|${i}|${e.grab}|${e.release}`,s=a.get(o);if(s&&s.map===r&&s.o===n&&s.spec===e.spec)return s.events;let c=Cd(e.scene,t),l=r??(e=>e),[u,d]=i===`before`?[-1/0,e.grab]:i===`after`?[e.release,1/0]:[-1/0,1/0],f=Pd(n,l,u,d);for(let e of f)e.run&&(e.curve=Pu({keys:e.run},l,()=>gr(c.R),null));return a.set(o,{map:r,o:n,spec:e.spec,events:f}),f}var Rd=(e,t)=>(n,r)=>Nd(e.spec,e.scene,t,n,r.t,r,e.spec.fps??30);function zd(e,t,n){let r=Cd(e.scene,t),i=e.spec.objects?.[t];return!r||!i?null:Fd(Ld(e,t,i,e.timeMap,`all`),n,{pos:r.pos,R:r.R},Rd(e,t))}function Bd(e,t,n,r,i){let a=Cd(e.scene,t);return!a||!Sd(n).length?a&&{pos:a.pos,R:a.R}:Fd(Ld({...e,grab:i},t,n,e.timeMap,`before`),r,{pos:a.pos,R:a.R},Rd(e,t))}function Vd(e,t,n,r,i,a,o=null){let s=Sd(n).length?Ld({...e,release:i},t,n,e.timeMap,`after`):[];return s.length?Fd(s,r,a,(n,r)=>Nd(e.spec,e.scene,t,n,r.t,r,e.spec.fps??30,r.t<=i+1?o:null),!1):null}function Hd(e,t,n){let r=e.timeMap??(e=>e);return Sd(t).some(e=>r(e.at)>=n)}function Ud(e,t){let n=e?.objects??{};return Object.keys(n).filter(e=>e===t||n[e].ancestors?.includes(t))}function Wd(e,t){return Hf(e)&&t>=(e.grab??0)&&(e.release===void 0||t<=e.release)}function Gd(e,t){return e?.objects?.[t]??Io(e)[t]??null}function Kd(e,t,n){return[n,...t?.objects?.[n]?.ancestors??Io(t)[n]?.ancestors??[]].find(t=>Gf(e.objects?.[t]))??null}function qd(e,t){let n=t=>e.timeMap?Math.round(e.timeMap(t)):t;return[n(t.grab??0),t.release===void 0?e.frameCount-1:n(t.release)]}var Jd=(e,t,n)=>n.at===void 0&&n.along===void 0&&(!e?.objects?.[t]&&!!Io(e)[t]||n.grab!==void 0),Yd=new WeakMap,Xd=new WeakMap,Zd=new WeakMap,Qd=e=>({spec:e.ctx.spec,scene:e.ctx.scene,timeMap:e.timeMap});function $d(e,t,n){let{spec:r,scene:i}=e.ctx,a=Kd(r,i,t),o=r.objects?.[a];if(!Hf(o))return null;let s=Bd(Qd(e),a,o,n,qd(e,o)[0]);return s&&(a===t?s:Yf(s,Xf(Gd(i,a),Gd(i,t))))}function ef(e,t){Zd.has(e)||Zd.set(e,new Map);let n=Zd.get(e);if(n.has(t))return n.get(t);let{spec:r,scene:i}=e.ctx,a=r.objects?.[t],o=Gd(i,t),s=Ud(i,t),c=null;if(Hf(a)&&a.release!==void 0&&o&&s.length){let n=qd(e,a)[1];if(n<e.frameCount-1&&!Hd(Qd(e),a,n)){let l=rf(e,t,a,n),u=s.flatMap(e=>Td({...Yf(l,Xf(o,i.objects[e])),half:i.objects[e].half})),d=Math.min(...u.map(e=>e[1])),f=u.reduce((e,t)=>V(e,t),[0,0,0]).map(e=>e/u.length);for(let[a,o]of Object.entries(i.objects)){let l=s.includes(a)?null:Kd(r,i,a),u=r.objects?.[l];if(!l||l===t||Hf(u)||Uf(u))continue;let p={...cf(e,a,n),half:o.half},m=Ed(p);Dd(p,f)&&m<=d+.005&&(!c||m>c.top)&&(c={mover:l,top:m})}}}return n.set(t,c?.mover??null),c?.mover??null}function tf(e,t){let n=e.frames[t-(e.f0??0)];if(n)return n;Yd.has(e)||Yd.set(e,new Map);let r=Yd.get(e);return r.has(t)||r.set(t,$g(e.ctx,Ws(e.baked,t),t)),r.get(t)}function nf(e,t,n,r,i){let{sk:a,spec:o,scene:s}=e.ctx;if(!Jd(s,t,n))return Jf(a,o,i,n);let c=Ma(o,n,s,t);if(n.keys?.length&&e.ctx.hold){if(e.ctx.hold.attaching(t))return Gd(s,t);let l=Yf(Jf(a,o,i,{prop:n.prop},c),e.ctx.hold.attachAt(t,r)),u=qd(e,n)[0];return c?Ra($d(e,t,u)??Gd(s,t),l,La(u,r)):l}let l=e=>Jf(a,o,e,{prop:n.prop},c),u=qd(e,n)[0],d=Xf(l(u===r?i:tf(e,u).s),$d(e,t,u)??Gd(s,t));return c?Ra(Yf(l(i),d),Yf(l(i),Fa(a,o,s,t,n,d)),La(u,r)):Yf(l(i),d)}function rf(e,t,n,r){let i=tf(e,r);Xd.has(i)||Xd.set(i,new Map);let a=Xd.get(i);return a.has(t)||a.set(t,nf(e,t,n,r,i.s)),a.get(t)}function af(e,t,n,r=null){let{spec:i,scene:a}=e.ctx,o=Gf(i.objects?.[t])?i.objects[t]:void 0,s=Gd(a,t);if(Uf(o))return js(r?{...e,f0:n,frames:[r]}:e,o,n);if(Hf(o)&&(s||!Jd(a,t,o))){let[i,a]=qd(e,o),c=Math.max(i,Math.min(n,a));if(n<i&&s)return $d(e,t,n);let l=n>a?Vd(Qd(e),t,o,n,a,rf(e,t,o,a),a>0?rf(e,t,o,a-1):null):null;if(l)return l;let u=n>a?ef(e,t):null;if(u){let r=rf(e,t,o,a);return Yf(af(e,u,n),Xf(af(e,u,a),r))}return r&&c===n?nf(e,t,o,n,r.s):rf(e,t,o,c)}if(!s)return null;if(xd(o))return zd(Qd(e),t,n);if(o&&a.objects[t])return e.ctx.objectsAt(n)[t];if(o){let r=Ud(a,t)[0],i=e.ctx.objectsAt(n)[r];return Yf(i,Xf(a.objects[r],s))}return{pos:s.pos,R:s.R}}function of(e,t,n){let r=e.frames?.[n-(e.f0??0)],i=e.ctx.scene,a=Ud(i,t);return!r||!a.length?null:a.map(t=>{let r=cf(e,t,n);return{id:t,pos:r.pos,R:r.R,half:i.objects[t].half}})}function sf(e,t,n){let{spec:r,scene:i,sk:a}=e.ctx,o=r.objects?.[Kd(r,i,t)];if(Hf(o)){let[t,i]=qd(e,o);return n>=t&&n<=i?r.props?.[o.prop]?.hand??null:null}if(!Uf(o))return null;let[s,c=``]=String(o.follow).split(/:(.*)/s);if(s===`prop`)return r.props?.[c.split(`.`)[0]]?.hand??null;let l=(s===`joint`||s===`bone`)&&/^(Left|Right)(Arm|ForeArm|Hand)/.exec(Oo(a,c).bone??``);return l?l[1]===`Left`?`l`:`r`:null}function cf(e,t,n,r=null){let{spec:i,scene:a}=e.ctx,o=Gd(a,t),s=Kd(i,a,t),c=i.objects?.[s];if(!o)return null;if(Hf(c)||Uf(c)||xd(c)){let t=af(e,s,n,r);return t&&Yf(t,Xf(Gd(a,s),o))}return s?a.objects[t]?e.ctx.objectsAt(n)[t]??o:s===t?af(e,t,n):Yf(af(e,s,n),Xf(Gd(a,s),o)):{pos:o.pos,R:o.R}}var lf=.009,uf=8,df=70,ff=[`Index`,`Middle`,`Ring`,`Pinky`],pf=.6,mf=e=>{let t=Math.min(1,Math.max(0,(e-pf)/.30000000000000004));return t*t*(3-2*t)};function hf(e,t){let n=-1/0;for(let r=0;r+1<e.length;r++)for(let i of t)n=Math.max(n,Ea(i,e[r],e[r+1],lf));return n}function gf(e,t,n,r,i){if(r<=0||hf(e,i)>=-.002)return 0;let a=r=>{let i=pr(n,r);return e.map(e=>V(t,J(i,H(e,t))))};if(hf(a(r),i)<-.002)return null;let o=0,s=r;for(let e=0;e<uf;e++){let e=(o+s)/2;hf(a(e),i)>=-.002?s=e:o=e}return s}function _f(e,t,n,r,i){if(hf(e,i)<-.002)return 0;let a=r=>{let i=pr(n,-r);return e.map(e=>V(t,J(i,H(e,t))))};if(hf(a(r),i)>=-.002)return hf(a(r),i)<hf(e,i)?r:0;let o=0,s=r;for(let e=0;e<uf;e++){let e=(o+s)/2;hf(a(e),i)<-.002?s=e:o=e}return s}function vf(e,t,n,r,i,a,o,s,c=!0){let l=gf(r.map(e=>t.P[e]),t.P[n],i,a,o),u=l??(c?a:0);return u>0&&Sr(e,t,n,t.P[n].slice(),pr(i,u*s)),l!==null}function yf(e,t,n,{entries:r,stops:i=[],weight:a,preset:o}){if(!r?.length||!(a>0))return{touched:[]};let s=[...r,...i],c=n===`Left`?-1:1,l=t=>e.index[`${n}Hand${t}`],u=[];for(let i of ff){let d=[1,2,3,4].map(e=>l(`${i}${e}`));if(d.some(e=>e===void 0))continue;let f=!1,p=d.map(e=>t.P[e]),m=U(zr(e,t,n).l,c),h=[0,1,2].reduce((e,t)=>{let n=pr(m,-Wr(o,i,t));return e.map((r,i)=>i>t?V(e[t],J(n,H(r,e[t]))):r)},p),g=hf(p,r)>=-.002&&hf(h,r)<hf(p,r);for(let r=0;r<3;r++){let l=U(zr(e,t,n).l,c),u=Wr(o,i,r),p=g?u:0;p>0&&Sr(e,t,d[r],t.P[d[r]].slice(),pr(l,-p*a)),f=vf(e,t,d[r],d.slice(r),l,Math.max(0,Gr(i,r)-u+p),s,a,!1)}f&&u.push(i)}let d=[1,2,3,4].map(e=>l(`Thumb${e}`));if(d.every(e=>e!==void 0)){let{n:r}=zr(e,t,n),i=!1;for(let n of[1,2]){let o=U(K(ir(K(H(t.P[d[n+1]],t.P[d[n]])),r)),c),l=_f(d.slice(n).map(e=>t.P[e]),t.P[d[n]],o,df,s);l>0&&Sr(e,t,d[n],t.P[d[n]].slice(),pr(o,-l*a)),i=vf(e,t,d[n],d.slice(n),o,df,s,a,!1)}i&&u.push(`Thumb`)}return{touched:u}}function bf(e,t,n,r,i){let a=null;for(let i of e.spec.fits??[]){let o=e.spec.anchors?.[i.anchor],s=t[`w_${i.anchor}_${r}`]??0;if(i.side!==r||o?.kind!==`object`||!o.grasp||!(s>1e-4)||a&&a.weight>=s||e.objectHand(o.object,n)===r||e.sockets?.get(i.anchor)?.rim)continue;let c=e.objectsAt(n),l=Ud(e.scene,o.object).map(e=>c[e]).filter(Boolean),u=Math.min(1,Object.entries(t[`fingers_${r}`]??{}).reduce((e,[t,n])=>e+(t===`relaxed`?0:n||0),0));l.length&&(a={entries:l,weight:mf(s)*u,preset:t[`fingers_${r}`]})}return a??xf(e,t,n,r,i)}function xf(e,t,n,r,i){let{spec:a,scene:o}=e;for(let[s,c]of Object.entries(a.objects??{})){if(!Ma(a,c,o,s)||a.props?.[c.prop]?.hand!==r||!i)continue;let[l,u]=e.carrySpan(c);if(n<l||n>u||e.hold?.attaching(s))continue;let d=Ud(o,s).map(t=>({...o.objects[t],...e.objectPose(t,n,{s:i})})),f=Object.entries(e.objectsAt(n)).filter(([e,t])=>!Ud(o,s).includes(e)&&t.half&&!t.carried&&d.some(e=>Math.hypot(...e.pos.map((e,n)=>e-t.pos[n]))<.25+Math.hypot(...t.half))).map(([,e])=>e);if(d.length)return{entries:d,stops:f,weight:1,preset:t[`fingers_${r}`]}}return null}var Sf=(e,[t,n])=>Math.min(n,Math.max(t,e));function Cf(e,t,n){let r=e.index,i=r[`${n}Hand`],a=r[`${n}ForeArm`],o=e.restWorldRot,s=K(H(t.P[i],t.P[a])),c=q(t.R[a],q(Y(o[a]),o[i])),{axF:l,axD:u,...d}=Ki(c,t.R[i],s,J(q(c,Y(t.R[i])),zr(e,t,n).l)),f=Object.fromEntries(Object.entries(d).map(([e,t])=>[e,Sf(t,ji[e])]));if(Object.keys(d).every(e=>Math.abs(d[e]-f[e])<1e-6))return null;let p=q(q(pr(V(U(l,f.flex),U(u,f.dev)),Math.hypot(f.flex,f.dev)),pr(s,f.twist)),c);return Sr(e,t,i,t.P[i].slice(),q(p,Y(t.R[i]))),{need:d,got:f}}var wf={l:`Left`,r:`Right`},Tf=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)},Ef=[0,0,1],Df=[`UpLeg`,`Leg`,`Foot`],Of=(e,t=[0,0,0])=>Array.isArray(e)||ArrayBuffer.isView(e)?[e[0],e[1],e[2]]:t,kf=(e,t=0)=>typeof e==`number`&&Number.isFinite(e)?e:t;function Af(e,t,n,r,i,a){let o=n.length;for(let s of n){let n=e.index[s];Sr(e,t,n,t.P[n].slice(),q(X(r/o),q(dr(i/o),fr(a/o))))}}var jf=.99,Mf=.9995;function Nf(e,t,n,r,i,a,o,s){let c=G(H(t.P[r],t.P[n]))+G(H(t.P[i],t.P[r])),l=H(a,t.P[n]),u=G(l),d=jf*c,f=.009500000000000064*c;if(u<=d||u-Mf*c>.05)return a;let p=d+f*(1-Math.exp(-(u-d)/f));return o[`reach_over_${s}`]=Math.max(0,u-Mf*c),V(t.P[n],U(l,p/u))}var Pf=.095,Ff=2,If=new Map;function Lf(e,t){let n=`${e.model}|${t}`;if(If.has(n))return If.get(n);let r=(90-t)*Math.min(1,Math.max(0,(t-45)/27)),i=Oi(e),a=n=>{let r=xr(e);return[[`Left`,-1],[`Right`,1]].every(([a,o])=>{let s=e.index[`${a}Arm`],c=e.index[`${a}ForeArm`],l=e.index[`${a}Hand`],u=e.index[`${a}HandMiddle1`];return Sr(e,r,s,r.P[s].slice(),fr(o*t)),Sr(e,r,c,r.P[c].slice(),fr(o*n)),[.5,.75,1].map(e=>V(r.P[c],U(H(r.P[l],r.P[c]),e))).concat([r.P[u]]).every(e=>vi(i.body,r,e,i.skip).d>=Pf)})},o=r;if(i&&r>0){for(let e=0;e<=r;e+=.5)if(!a(e)){o=Math.max(0,e-Ff);break}}return If.set(n,o),o}var Rf=60,zf=e=>e-360*Math.round(e/360);function Bf(e,t,n){let r=zf(t),i=zf(n),a=(Math.max(Math.abs(r),Math.abs(i))-Rf)/60;if(a<=0)return null;let o=a>=1?1:a*a*(3-2*a);return{yaw:e,R:q(X(e),q(dr(r*o),fr(i*o)))}}function Vf(e,t,n={}){let r=xr(e),i={},a=kf(t.arm_rest,72),o=kf(t.arm_hang)&&kf(t.arm_hang)*Lf(e,a);for(let[n,i,s]of[[`Left`,-1,`l`],[`Right`,1,`r`]]){let c=e.index[`${n}Arm`],l=e.index[`${n}ForeArm`],u=o*(1-Math.min(1,Math.max(0,kf(t[`armw_${s}`])+kf(t[`hangoff_${s}`]))));Sr(e,r,c,r.P[c].slice(),fr(i*a)),u&&Sr(e,r,l,r.P[l].slice(),fr(i*u))}for(let[n,i]of Object.entries(wf)){let a=kf(t[`abend_${n}`]),o=kf(t[`aswing_${n}`]),s=e.index[`${i}ForeArm`],c=e.index[`${i}Arm`];a&&(Sr(e,r,s,r.P[s].slice(),dr(-a)),Fr(e,r,i)),o&&Sr(e,r,c,r.P[c].slice(),dr(-o))}Af(e,r,[`Neck`,`Head`],kf(t.head_yaw),kf(t.head_pitch),kf(t.head_roll)),Af(e,r,[`Spine`,`Spine1`,`Spine2`],kf(t.spine_yaw),kf(t.spine_pitch),kf(t.spine_roll));let s=e.index.Hips,c=kf(t.yaw);Sr(e,r,s,r.P[s].slice(),q(X(c),q(dr(kf(t.pitch)),fr(kf(t.roll)))));let l=H(Of(t.root,r.P[s]),r.P[s]);for(let e=0;e<r.P.length;e++)r.P[e]=V(r.P[e],l);let u=Bf(c,kf(t.pitch),kf(t.roll)),d=u?.R??X(c);for(let[n,a]of Object.entries(wf)){if(!t[`foot_${n}`])continue;let o=Of(t[`foot_${n}`]);i[`leg_miss_${n}`]=Lr(e,r,e.index[`${a}UpLeg`],e.index[`${a}Leg`],e.index[`${a}Foot`],o,J(d,Of(t[`knee_${n}`],Ef)),Ef,`knee`);let s=Pr(e,r,a,o,Df);s>150&&(i[`leg_fold_${n}`]=s),Rr(e,r,a,kf(t[`fyaw_${n}`],c),kf(t[`fpitch_${n}`]),u)}for(let a of n.armOrder??[`r`,`l`]){let o=wf[a],s=kf(t[`armw_${a}`]),c=e.index[`${o}Arm`],l=e.index[`${o}ForeArm`],u=e.index[`${o}Hand`],f=K(J(d,Of(t[`elbow_${a}`],[0,-1,-.3])));if(i[`arm_miss_${a}`]=0,s>1e-4&&n.handTarget){let t=r.P[u].slice(),d=V(t,U(H(n.handTarget(a,r,i)??t,t),s));n.keepOut&&(d=n.keepOut(a,r,d));let p=n.push?.(a);p&&(d=V(d,p));let m=n.sag?.(a,r,d);m&&(d=V(d,m));let h=n.skinPush?.(a);h&&(d=V(d,U(h,Tf(s)))),n.softReach&&(d=Nf(e,r,c,l,u,d,i,a));let g=V(U(K(H(r.P[l],U(V(r.P[c],t),.5))),1-s),U(f,s));i[`arm_miss_${a}`]=Lr(e,r,c,l,u,d,g,Pi,n.foldFree?null:`elbow`);let _=Pr(e,r,o,d);_>145&&!n.foldFree&&(i[`arm_fold_${a}`]=_)}Vr(e,r,o,kf(t[`wtwist_${a}`]),kf(t[`wflex_${a}`])),Kr(e,r,o,t[`fingers_${a}`]);let p=n.hold?.(a,r);(!p||p.w<1)&&n.grip?.(a,r,i),p&&aa(e,r,o,p,Pi,i,a);let m=n.swivel?.(a);m&&(Br(e,r,o,m*Tf(s)),p||Cf(e,r,o));let h=n.heldShapes?.(a,r);h&&(i[`closed_${a}`]=yf(e,r,o,h).touched),n.afterArm?.(a,r,i)}return{s:r,diag:i}}var Hf=e=>typeof e?.prop==`string`,Uf=e=>!Hf(e)&&e?.follow!==void 0,Wf=e=>!!e&&typeof e==`object`&&!Array.isArray(e)&&[`prop`,`follow`,`pivot`,`axis`,`channel`,`keys`,`fall`].every(t=>e[t]===void 0),Gf=e=>!!e&&typeof e==`object`&&!Wf(e);function Kf(e,t,n,r){let i=t.props[r.prop];return U(i.origin.map(t=>n.P[e.index[t]]).reduce((e,t)=>V(e,t),[0,0,0]),1/i.origin.length)}function qf(e,t,n){let r=e.index[`${wf[t.hand]}Hand`],i=e.restWorldPos,a=U(t.origin.map(t=>i[e.index[t]]).reduce((e,t)=>V(e,t),[0,0,0]),1/t.origin.length);return Tr(n,r,J(Y(e.restWorldRot[r]),H(a,i[r])))}function Jf(e,t,n,r,i=!1){let a=zr(e,n,wf[t.props[r.prop].hand]),o=i?qf(e,t.props[r.prop],n):Kf(e,t,n,r),s=e=>V(U(a.d,e[0]),V(U(a.l,e[1]),U(a.n,e[2]))),c=K(s(r.along??[0,0,1])),l=H(a.d,U(c,W(a.d,c)));Math.hypot(...l)<1e-6&&(l=H(a.l,U(c,W(a.l,c)))),l=K(l);let u=ir(l,c);return{pos:V(o,s(r.at??[0,0,0])),R:[[l[0],c[0],u[0]],[l[1],c[1],u[1]],[l[2],c[2],u[2]]]}}var Yf=(e,t)=>({pos:V(e.pos,J(e.R,t.pos)),R:q(e.R,t.R)}),Xf=(e,t)=>({pos:J(Y(e.R),H(t.pos,e.pos)),R:q(Y(e.R),t.R)});function Zf(e,t,n,r){let i=n[e.channel]?.[r]??0,a=pr(e.axis??[0,1,0],i);return{pos:V(e.pivot,J(a,H(t.pos,e.pivot))),R:q(a,t.R??lr()),angle:i}}var Qf=.06,$f=.8,ep=.045,tp=.3,np=30,rp=180/Math.PI,ip=2,ap=[0,1,0],op=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],sp=(e,t)=>H(e,U(t,W(e,t)));function cp(e,t,n){let r=null;for(let i of e.fits??[]){let e=t[`w_${i.anchor}_${i.side}`]??0;i.side===n&&i.orient!==!1&&e>1e-4&&(!r||e>r.w)&&(r={fit:i,w:e})}return r&&{...r,w:r.w*Math.min(1,Math.max(0,t[`armw_${n}`]??0))}}function lp(e,t,n,r,i){if(i.prop){let a=t.props?.[i.prop];if(!a)return null;let o=zr(e,n,r),s=U(a.origin.map(t=>n.P[e.index[t]]).reduce(V,[0,0,0]),1/a.origin.length),[c,l,u]=i.point===`origin`?[0,0,0]:a.points?.[i.point]??[0,0,0];return V(s,V(U(o.d,c),V(U(o.l,l),U(o.n,u))))}let a=i.joints??[`${r}HandIndex2`,`${r}HandMiddle2`];return U(a.map(t=>n.P[e.index[t]]).reduce(V,[0,0,0]),1/a.length)}function up(e,t){let{spec:n}=e,r=e.scene?.objects?.[t];for(let e of[t,...r?.ancestors??[]]){let t=n.objects?.[e];if(t?.prop)return{key:e,entry:t,side:n.props?.[t.prop]?.hand??null}}return null}function dp(e,t,n,r){let i=e.spec.objects?.[t],a=e.scene?.objects?.[t]?.half;if(!e.hold?.span||!i?.prop||e.spec.props?.[i.prop]?.hand!==n||!i.keys?.length||i.grab===void 0||i.at!==void 0||i.along!==void 0||a&&mp(a)>=0)return null;let[o]=e.hold.span(t);return o>=1&&r<=Math.max(o,e.hold.firstKey(t)-1)?Math.min(r,o-1):null}function fp(e,t,n,r,i,a){let o=e.scene?.objects??{},s=i?.kind===`object`?Ud(e.scene,i.object):Object.keys(o),c=null;for(let i of s){let s=o[i]?.half;if(!s)continue;let l=dp(e,up(e,i)?.key,n,t),u=e.objectPose?.(i,l??t,l===null?a:null)??o[i];if(!u?.R)continue;let d={pos:u.pos,R:u.R,half:s},f=fa(r,d);(!c||f<c.d)&&(c={box:d,d:f,id:i})}let l=c&&up(e,c.id);return!c||l?.side===n&&dp(e,l.key,n,t)===null?null:i?.kind===`object`||c.d<=Qf?{...c.box,id:c.id}:null}var pp=[0,1,2];function mp(e){let t=pp.reduce((t,n)=>e[n]>e[t]?n:t,0);return pp.filter(e=>e!==t).every(t=>e[t]<ep)?t:-1}function hp(e,t,n,r,i){let a=e===`Right`,o=J(X(r??0),[a?1:-1,0,0]),s=Math.abs(t[1]),c=sp(V(U(ap,1-s),U(o,s)),t),l=K(G(c)>.001?c:sp(o,t)),u=i?sp(i,t):null;if(!u||G(u)<=tp)return op(t,l,ir(t,l));let d=e=>Math.acos(Math.max(-1,Math.min(1,W(e,n))))*rp-(W(e,l)>0?np:0),f=K(u),p=d(f)<=d(U(f,-1))?f:U(f,-1);return op(t,p,ir(t,p))}function gp(e,t,n){let r=[e[0][0],e[1][0],e[2][0]],i=[e[0][1],e[1][1],e[2][1]],a=Math.atan2(W(ir(t,i),r),W(t,i))*rp,[o,s]=Mi.twist,c=Math.min(s,Math.max(o,n+a))-n;if(Math.abs(c-a)<1e-6)return e;let l=J(pr(r,c),t);return op(r,l,ir(r,l))}function _p(e,t,n,r,i,a,o,s){let c=cp(e.spec,a,i),l=Tu(e,i,o),u=c&&c.w>=.001&&Su(e.spec,c.fit.anchor);if(l||u?Cu(e.spec,i):Math.abs(a[`wtwist_${i}`]??0)>.001||Math.abs(a[`wflex_${i}`]??0)>.001)return;if(l&&o>l.grab)return l.keyed?void 0:Ou(e,t,n,r,i,l);if(!c||c.w<.001)return;if(u)return Eu(e,t,n,r,i,a,s,c,n=>lp(t,e.spec,n,r,c.fit.effector??{}),null,o);if(Object.keys(e.spec.objects??{}).some(t=>e.spec.objects[t]?.prop&&e.objectHand?.(t,o)===i&&dp(e,t,i,o)===null))return;let d={s:n,diag:s,c:a},f=e.spec.anchors?.[c.fit.anchor];if(f?.kind===`prop`)return;let p=V(ds(e,c.fit.anchor,n,s,a,i),c.fit.offset??[0,0,0]),m=fp(e,o,i,p,f,d),h=m&&lp(t,e.spec,n,r,c.fit.effector??{});if(!h)return;let g=n=>({pos:lp(t,e.spec,n,r,c.fit.effector??{}),R:(({d:e,l:t,n})=>op(e,t,n))(zr(t,n,r))}),_=t.index,v=_[`${r}Arm`],y=_[`${r}ForeArm`],b=_[`${r}Hand`],x=mp(m.half),S=x>=0?J(m.R,pp.map(e=>+(e===x))):null;if(S&&Math.abs(S[1])>$f&&!up(e,m.id))return Eu(e,t,n,r,i,a,s,c,n=>lp(t,e.spec,n,r,c.fit.effector??{}),{w:{p,axis:S},type:`power`},o);let C=zr(t,n,r),w=K(sp(C.l,C.d)),T=K(H(n.P[b],n.P[y])),E=q(n.R[y],q(Y(t.restWorldRot[y]),t.restWorldRot[b])),D=Ki(E,n.R[b],T,J(q(E,Y(n.R[b])),C.l)).twist,{goal:O,plane:k,wristAt:ee}=ia(t,n,r,{pos:h,R:gp(hp(r,C.d,w,a.yaw,S),w,D)},g(n),c.w,`palm`),te={twist:0,flex:0,dev:0};for(let e=0;e<ip;e++)Lr(t,n,v,y,b,ee(e?n.R[b]:O),k,Pi,`elbow`),te=na(t,n,r,b,y,O);s[`grip_${i}`]={w:c.w,...te}}var vp={period:3.8,deg:.8},yp={yaw:.9,pitch:.6},bp={period:5.6,m:.012,list:1.4},xp=.5,Sp=1e-4,Cp=2*Math.PI,wp=e=>e*e*(3-2*e),Tp=(e,t)=>Array.isArray(e)?e.some((e,n)=>Math.abs(e-t[n])>Sp):e&&typeof e==`object`?Object.keys({...e,...t}).some(n=>Math.abs((e[n]??0)-(t?.[n]??0))>.001):Math.abs((e??0)-(t??0))>.01;function Ep(e,t){let n=2166136261;for(let t=0;t<e.length;t++)n=Math.imul(n^e.charCodeAt(t),16777619);let r=n>>>0;return Array.from({length:t},()=>{r=r+1831565813>>>0;let e=Math.imul(r^r>>>15,r|1);return e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296*Cp})}function Dp(e,t,n,r){let i=Array(n).fill(!1),a=Object.keys(e);i[0]=!0;for(let t=1;t<n;t++)a.some(n=>Tp(e[n][t],e[n][t-1]))&&(i[t]=i[t-1]=!0);let o=a.filter(e=>/^(armw_[lr]|w_.+_[lr])$/.test(e));for(let t=0;t<n;t++)o.some(n=>e[n][t]>.001)&&(i[t]=!0);for(let e of Object.values(t.objects??{}))if(Number.isFinite(e?.grab))for(let t=Math.max(0,e.grab);t<Math.min(n,Number.isFinite(e.release)?e.release:n);t++)i[t]=!0;for(let e of t.goals??[]){let t=Array.isArray(e?.at)?e.at:null;if(!(e?.still===void 0||!t?.length))for(let e=Math.max(0,Math.round(t[0]));e<=Math.min(n-1,Math.round(t[t.length-1]));e++)i[e]=!0}let s=Math.max(1,Math.round(xp*r)),c=Array(n).fill(1/0);for(let e=0,t=-1/0;e<n;e++)i[e]&&(t=e),c[e]=e-t;for(let e=n-1,t=1/0;e>=0;e--)i[e]&&(t=e),c[e]=Math.min(c[e],t-e);return c.map(e=>wp(Math.min(1,e/s)))}function Op(e,t,n,r){let i={},a=Math.max(1,Math.round(xp*r));for(let r of[`l`,`r`]){let o=Object.keys(e).filter(e=>e===`armw_${r}`||RegExp(`^w_.+_${r}$`).test(e)),s=Array.from({length:n},(t,n)=>o.some(t=>e[t][n]>.001));for(let e of Object.values(t.objects??{}))if(!(!Number.isFinite(e?.grab)||t.props?.[e.prop]?.hand!==r))for(let t=Math.max(0,e.grab);t<Math.min(n,Number.isFinite(e.release)?e.release:n);t++)s[t]=!0;if(!s.some(Boolean)){i[r]=null;continue}let c=Array(n).fill(1/0);for(let e=0,t=-1/0;e<n;e++)s[e]&&(t=e),c[e]=e-t;for(let e=n-1,t=1/0;e>=0;e--)s[e]&&(t=e),c[e]=Math.min(c[e],t-e);i[r]=c.map(e=>1-wp(Math.min(1,e/a)))}return i}function kp(e,{spec:t,sk:n,frameCount:r}){if(t.idle===!1||!e.root||!e.foot_l||!e.foot_r)return null;let i=t.fps??30,a=Dp(e,t,r,i);if(!a.some(e=>e>0))return null;let o=n.restWorldPos,s=o[n.index.Hips][1],c=o[n.index.LeftFoot][1],[l,u,d,f,p]=Ep(JSON.stringify([e.root[0].map(e=>e.toFixed(3)),(e.yaw?.[0]??0).toFixed(1)]),5),m=Array(r).fill(null);for(let t=0;t<r;t++){if(!(a[t]>0))continue;let n=t/i,r=a[t],o=m[t]={spine_pitch:-r*vp.deg*Math.sin(Cp*n/vp.period+l),head_yaw:r*yp.yaw*(.6*Math.sin(Cp*n/7.3+u)+.4*Math.sin(Cp*n/11.9+p)),head_pitch:r*yp.pitch*Math.sin(Cp*n/9.1+d)};if(![`l`,`r`].every(n=>e[`foot_${n}`][t][1]<c+.03&&Math.abs(e[`fpitch_${n}`]?.[t]??0)<2)||e.root[t][1]<s-.15)continue;let h=r*Math.sin(Cp*n/bp.period+f),g=(e.yaw?.[t]??0)*Math.PI/180;o.root=[Math.cos(g)*bp.m*h,0,-Math.sin(g)*bp.m*h],o.roll=bp.list*h,o.spine_roll=-bp.list*h}return m}function Ap(e,t,n){let r=t?.[n];if(!r)return e;let i={...e};for(let[t,n]of Object.entries(r))i[t]=Array.isArray(n)?Array.isArray(e[t])?e[t].map((e,t)=>e+n[t]):e[t]:(Number(e[t])||0)+n;return i}var jp=(e,t,n)=>Math.min(n,Math.max(t,e));function Mp(e){let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619);let n=t>>>0;return()=>{n=n+1831565813>>>0;let e=Math.imul(n^n>>>15,n|1);return e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296*2-1}}var Np={noise:.02,side:.03,first:.22,second:.08,last:.22,beforeLast:.08,turn:0},Pp={noise:.025,side:.012,stride:.035,second:.05,beforeLast:.06,turn:.06},Fp={noise:.1,first:.1,last:.25},Ip=.1,Lp=3,Rp=60;function zp(e,{s0:t,turn:n,seed:r}){let i=e.steps,a=jp(e.vary??1,0,2),o=Mp(r),s=Array.from({length:i},()=>({time:o(),length:o(),lift:o(),arm:o()})),c=o()<0?1:-1,l=e=>e%2==0?c:-c,u=Array.from({length:Math.ceil(i/2)},()=>o()),d=e=>u[Math.floor((e-1)/2)],f=Array.from({length:i},(t,n)=>n===i-1?0:n===0?e.firstStep:e.step),p=t,m=f.map(e=>{let t=Math.abs(n(p,p+e));return p+=e,Math.min(1,t/Rp)}),h=i>=4,g=s.map((e,t)=>{if(i<2)return 1;let n=(t===0||t===i-1?.5:1)*(Np.noise*e.time+Np.side*l(t))+Np.turn*m[t];return t===0&&(n+=Np.first*(1-m[0])),t===1&&h&&(n+=Np.second),t===i-1&&(n+=Np.last),t===i-2&&h&&(n+=Np.beforeLast),1+a*n}),_=g.reduce((e,t)=>e+t,0),v=i*e.period,y=[];for(let e=0,t=0;e<i;e++)y.push(Math.round(t)),t+=v*g[e]/_;let b=e.period-e.swing,x=y.map((t,n)=>{if(a===0)return e.swing;let r=(n<i-1?y[n+1]:v)-t;return Math.min(r-2,Math.max(e.swing,r-b),n===i-1?e.swing+Lp:1/0)}),S=f.map((e,t)=>t>0&&t<i-1),C=s.map((e,t)=>{if(!S[t])return 1;let n=Pp.noise*(.7*e.length+.3*e.time)+Pp.side*l(t)+Pp.stride*d(t)-Pp.turn*m[t];return t===1&&h&&(n-=Pp.second),t===i-2&&h&&(n-=Pp.beforeLast),1+a*n}),w=S.filter(Boolean).length,T=C.reduce((e,t,n)=>e+(S[n]?t:0),0);return{lift:y,air:x,inc:f.map((e,t)=>S[t]&&a>0?e*C[t]*w/T:e),height:s.map((t,n)=>e.lift*(1+a*(Fp.noise*t.lift-(n===0?Fp.first:0)-(n===i-1&&i>1?Fp.last:0)))),arm:s.map(e=>1+a*Ip*e.arm)}}var Bp=18,Vp=22,Hp=7,Up=45,Wp=1,Gp=.4,Kp=50,qp=15,Jp=13,Yp={strike:4,load:4,mid:3,toeOff:5},Xp={strike:2,load:14,mid:7,toeOff:48,pow:1.8},Zp=[1,2.2],Qp=e=>{let t=Math.min(1,Math.max(0,((e??Zp[1])-Zp[0])/(Zp[1]-Zp[0])));return t*t*(3-2*t)},$p=.004,em=8,tm=.008,nm=.35,rm=.001,im=.25,am=[.25,.5],om=.008,sm=e=>e*e*e*(e*(6*e-15)+10),cm=new WeakSet,lm=(e,t,n,r)=>V(e,J(X(t),J(dr(n),J(X(-t),H(r,e)))));function um(e,t,n){let r=e.index,i=e.restWorldPos,a=G(H(i[r.LeftLeg],i[r.LeftUpLeg])),o=G(H(i[r.LeftFoot],i[r.LeftLeg])),s=Math.min(1,Math.max(0,(Jp-t)/4)),c=Qp(n),l=(e,t)=>e+(t-e)*c,u=l(Xp.strike,Bp)+s*Yp.strike,d=l(Xp.load,Vp)+s*Yp.load,f=l(Xp.mid,Hp)+s*Yp.mid,p=l(Xp.toeOff,Up)+s*Yp.toeOff;return{reach:e=>Math.sqrt(a*a+o*o+2*a*o*Math.cos(e*Math.PI/180)),hipOff:{l:H(i[r.LeftUpLeg],i[r.Hips]),r:H(i[r.RightUpLeg],i[r.Hips])},strike:u,load:d,mid:f,trail:e=>f+(p-f)*Math.min(1,Math.max(0,e))**l(Xp.pow,Wp)}}var dm=(e,t,n)=>V(e.root[t],J(X(e.yaw?.[t]??0),J(fr(e.roll?.[t]??0),n)));function fm(e,t,{f0:n,end:r,period:i,pace:a,ground:o,start:s}){let c=e.index,l=e.restWorldPos,{reach:u,hipOff:d,strike:f,load:p,mid:m,trail:h}=um(e,i,a),g=Math.max(2,Math.round(nm*i)),_=(e,t)=>{if(t<e.a)return f;if(e.heel!==void 0&&t>=e.heel)return h((t-e.heel)/Math.max(1,e.b-e.heel));let n=(t-e.a)/i/Gp;return e.strike&&n<1?(n<.5?f:m)+(p-(n<.5?f:m))*Math.sin(Math.PI*n):m},v=Us(t,r+1),y=l[c.Hips][1]-tm,b=v.root.map(e=>[e[0],e[2]]);for(let e=0;e<2;e++)b=b.map((e,t)=>{if(t<=n||t>=r)return e;let i=0,a=0,o=0;for(let e=-6;e<=6;e++){let s=Math.min(r,Math.max(n,t+e)),c=Math.exp(-(e*e)/8);i+=c*b[s][0],a+=c*b[s][1],o+=c}let s=Math.min(1,(t-n)/em,(r-t)/em),c=s*s*(3-2*s);return[e[0]+(i/o-e[0])*c,e[1]+(a/o-e[1])*c]});let x=e=>{let t=[b[e][0],v.root[e][1],b[e][1]],i=v.yaw?.[e]??0,a=v.roll?.[e]??0,s=[];for(let n of[`l`,`r`]){let r=o[n].find(t=>e>=t.a-(t.strike?g:0)&&e<=t.b);if(!r||r.free!==void 0&&e>=r.free)continue;let c=v[`foot_${n}`][e],l=J(X(i),J(fr(a),d[n])),f=u(_(r,e)),p=Math.hypot(t[0]+l[0]-c[0],t[2]+l[2]-c[2]);p<f&&s.push(c[1]+Math.sqrt(f*f-p*p)-l[1])}if(!s.length)return y;let c=Math.min(...s),l=Math.min(y,c-$p*Math.log(s.reduce((e,t)=>e+Math.exp(-(t-c)/$p),0)))-rm,f=Math.min(1,(e-n)/em,(r-e)/em),p=f*f*(3-2*f);return t[1]+(l-t[1])*p};for(let e of[`l`,`r`])for(let t of o[e]){if(t.heel===void 0||!t.flat)continue;let e=J(X(t.yw),[0,0,1]),r=Math.max(n+1,t.a);for(;r<t.heel&&(b[r][0]-t.flat[0])*e[0]+(b[r][1]-t.flat[2])*e[2]<0;)r++;t.free=r}let S=[];for(let e=n;e<=r;e++)S[e]=x(e);let C=Math.max(2,Math.round(im*i)),w=(e,t)=>{let n=e;for(let r=e;r<=t;r++)S[r]<S[n]&&(n=r);return n},T=[...new Set([`l`,`r`].flatMap(e=>o[e].filter(e=>e.strike&&e.a>n+2&&e.a<r-2).map(e=>e.a)))].sort((e,t)=>e-t),E=[{f:n,y:S[n]}];T.forEach((e,t)=>{let n=w(Math.max(E.at(-1).f+2,e-2),Math.min(r-2,e+C));if(t>0){let e=E.at(-1),t={f:n,y:S[n]},r=t.f-e.f,i=null;for(let n=Math.ceil(e.f+am[0]*r);n<=Math.floor(e.f+am[1]*r);n++){let r=S[n];for(let t=e.f+1;t<n;t++){let i=sm((t-e.f)/(n-e.f));i>1e-6&&(r=Math.min(r,e.y+(S[t]-e.y)/i))}for(let e=n+1;e<t.f;e++){let i=sm((e-n)/(t.f-n));i<1-1e-6&&(r=Math.min(r,(S[e]-t.y*i)/(1-i)))}(!i||r>i.y)&&(i={f:n,y:r})}i&&i.y>Math.max(e.y,t.y)&&E.push(i)}n>E.at(-1).f&&E.push({f:n,y:S[n]})}),E.push({f:r,y:S[r]});for(let e=1;e+1<E.length;e++){let t=E[e],n=Math.min(...[E[e-1],E[e+1]].map(e=>e.y+om*(t.f-e.f)**2/2));t.y>Math.max(E[e-1].y,E[e+1].y)&&(t.y=Math.min(t.y,n))}let D=[];for(let e=0;e<30;e++){let e=0,t=mm(E.map(e=>e.f),E.map(e=>e.y),0,0);for(let i=0;i+1<E.length;i++){let a=E[i],o=E[i+1],s=0;for(let e=a.f;e<=o.f;e++)D[e]=t(e),s=Math.max(s,D[e]-S[e]);if(s>3e-4){let t=a.y>o.y&&i>0||o.f===r?a:o;t.f!==n&&t.f!==r&&(t.y-=s,e=Math.max(e,s))}}if(!e)break}for(let e=n;e<=r;e++)D[e]=Math.min(D[e],S[e]);let O=t.filter(e=>/ step \d+$/.test(e.src??``)).sort((e,t)=>e.f-t.f),k=0,ee=s;for(let e=n+1;e<r;e++){for(;k<O.length&&O[k].f<=e;)ee=O[k++].src;t.push({f:e,set:{root:[b[e][0],D[e],b[e][1]]},src:ee})}}function pm(e,t,{end:n,period:r,pace:i,ground:a}){let{reach:o,hipOff:s,trail:c}=um(e,r,i),l=Us(t,n+1),u=new Map(t.map(e=>[e.f,e.src]));for(let e of[`l`,`r`])for(let r of a[e]){if(r.free===void 0||!Number.isFinite(r.b)||r.b>n)continue;let i=[],a=[],d=0;for(let t=r.free;t<=r.b;t++){let n=dm(l,t,s[e]),u=o(c((t-r.heel)/Math.max(1,r.b-r.heel))),f=e=>G(H(n,lm(r.ball,r.yw,e,r.flat)))-u,p=d,m=Kp;if(f(p)<=0)m=p;else if(f(m)<=0)for(let e=0;e<24;e++){let e=(p+m)/2;f(e)>0?p=e:m=e}d=m,i.push(m),a.push({f:t,hip:n,want:u})}let f=i.map((e,t)=>Math.max(...i.slice(t).map((e,t)=>e-t*qp)));for(let e=0;e<2;e++)f=f.map((e,t)=>Math.max(i[t],((f[t-1]??0)+e+(f[t+1]??e))/3));a.forEach(({f:n,hip:i,want:a},o)=>{let s=lm(r.ball,r.yw,f[o],r.flat),c=G(H(i,s))-a;c>0&&(s=V(s,U(H(i,s),c/G(H(i,s))))),t.push({f:n,set:{[`foot_${e}`]:s,[`fpitch_${e}`]:f[o],[`fyaw_${e}`]:r.yw},src:u.get(n)})})}}function mm(e,t,n,r){let i=e.length-1,a=e.slice(1).map((t,n)=>t-e[n]),o=[],s=[],c=[],l=[];for(let e=0;e<=i;e++)e===0?(o[e]=0,s[e]=2*a[0],c[e]=a[0],l[e]=6*((t[1]-t[0])/a[0]-n)):e===i?(o[e]=a[i-1],s[e]=2*a[i-1],c[e]=0,l[e]=6*(r-(t[i]-t[i-1])/a[i-1])):(o[e]=a[e-1],s[e]=2*(a[e-1]+a[e]),c[e]=a[e],l[e]=6*((t[e+1]-t[e])/a[e]-(t[e]-t[e-1])/a[e-1]));for(let e=1;e<=i;e++){let t=o[e]/s[e-1];s[e]-=t*c[e-1],l[e]-=t*l[e-1]}let u=[];u[i]=l[i]/s[i];for(let e=i-1;e>=0;e--)u[e]=(l[e]-c[e]*u[e+1])/s[e];return n=>{let r=0;for(;r<i-1&&n>e[r+1];)r++;let o=n-e[r],s=a[r],c=(e[r+1]-n)/s,l=o/s;return c*t[r]+l*t[r+1]+((c**3-c)*u[r]+(l**3-l)*u[r+1])*s*s/6}}var hm=3,gm=.35,_m=.2,vm=.03,ym=.04,bm=.025,xm=e=>e*180/Math.PI,Sm=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)};function Cm(e,t,n,r,i){let a=H(t,e),o=Math.min(r+i-1e-6,Math.max(Math.abs(r-i)+1e-6,G(a))),s=U(a,1/G(a)),c=H(n,U(s,W(n,s)));c=U(c,1/(G(c)||1));let l=(r*r+o*o-i*i)/(2*r*o),u=H(t,V(e,V(U(s,r*l),U(c,r*Math.sqrt(Math.max(0,1-l*l))))));return xm(Math.atan2(-W(u,n),-u[1]))}function wm(e,{end:t,ground:n,sk:r}){let i=Us(e,t+2),a=new Map(e.map(e=>[e.f,e.src])),o=r?.index,s=r?.restWorldPos,c=r&&G(H(s[o.LeftLeg],s[o.LeftUpLeg])),l=r&&G(H(s[o.LeftFoot],s[o.LeftLeg]));for(let u of[`l`,`r`]){let d=n[u],f=u===`l`?`Left`:`Right`,p=r&&H(s[o[`${f}UpLeg`]],s[o.Hips]),m=r&&H(s[o[`${f}ToeBase`]],s[o[`${f}Foot`]]),h=r&&s[o[`${f}ToeBase`]][1],g=r&&[0,.005-s[o[`${f}Foot`]][1],-.045];for(let n=0;n+1<d.length;n++){let o=d[n],s=d[n+1];if(!Number.isFinite(o.b)||!s.strike||s.a>t||s.a-o.b<3)continue;let f=[...new Set(e.filter(e=>!cm.has(e)&&e.f>o.b&&e.f<s.a&&e.set[`foot_${u}`]).map(e=>e.f))].sort((e,t)=>e-t),_=[o.b,...f,s.a],v=i[`foot_${u}`],y=e=>v[Math.max(0,Math.min(v.length-1,e))],b=H(y(o.b),y(o.b-1)),x=H(y(s.a+1),y(s.a)),S=[0,1,2].map(e=>mm(_,_.map(t=>y(t)[e]),b[e],x[e])),C=e=>i[`fyaw_${u}`]?.[e]??0,w=e=>i[`fpitch_${u}`]?.[e]??0,T=(e,t)=>Cm(dm(i,e,p),t,J(X(C(e)),[0,0,1]),c,l)-hm,E=s.a-o.b,D=r&&w(o.b)-T(o.b,y(o.b)),O=r&&w(s.a)-T(s.a,y(s.a));for(let t=o.b+1;t<s.a;t++){let n=S.map(e=>e(t)),i={[`foot_${u}`]:n};if(r){let e=Math.min(Kp,T(t,n)+D*(1-Sm((t-o.b)/(gm*E)))+O*(1-Sm((s.a-t)/(_m*E)))),r=h+vm*Sm(Math.min(t-o.b,s.a-t)/3),a=e=>n[1]+J(dr(e),m)[1];if(a(e)<r){let t=-30,n=e;for(let e=0;e<20;e++){let e=(t+n)/2;a(e)<r?n=e:t=e}e=t}let c=w(t),l=e=>n[1]+J(dr(e),g)[1],d=Math.min(ym,Math.max(l(c),bm));if(e<c&&l(e)<d){let t=e,n=c;for(let e=0;e<20;e++){let e=(t+n)/2;l(e)<d?t=e:n=e}e=n}i[`fpitch_${u}`]=e}let c={f:t,set:i,src:a.get(t)};cm.add(c),e.push(c)}}}}var Tm=[6,4],Em=50,Dm=1.1,Om=[18,3],km=[6,3],Am=8,jm=4.5,Mm=5.5,Nm=.015,Pm=[.52,.64],Fm=.3,Im=4,Lm=6.4,Rm=.8,zm=e=>or(.66-.18*e,.2,.48),Bm=e=>or(.32-.11*e,0,.45),Vm=e=>or(2.8-.45*e,1.2,3),Hm=.92,Um=e=>or(4.7-1.1*e,1.8,4),Wm=[.2,.6],Gm=.9,Km=.18,qm=.35,Jm=.18,Ym=.55,Xm=10,Zm=.22,Qm=.03,$m=50,eh=e=>J(X(e),[0,0,1]),th=e=>J(X(e),[1,0,0]),nh=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)};function rh(e,t){let n={};for(let r of[...e].sort((e,t)=>e.f-t.f))r.f<=t&&Object.assign(n,r.set);return n}function ih(e,t,n,r=`walk`){let i=`${r} start`,a=[],o=(e,t)=>{let n={f:e,set:t,src:i};return a.push(n),n},s=rh(t,e.f0);if(!s.foot_l||!s.foot_r||!s.root)throw Error(`MOTION_SPEC_INVALID: walk needs foot_l, foot_r and root keyed before f0`);if(e.vary!==void 0&&!(Number.isFinite(e.vary)&&e.vary>=0&&e.vary<=2))throw Error(`MOTION_SPEC_INVALID: ${r} vary must be a number from 0 (every step the same) to 2, got ${JSON.stringify(e.vary)}`);let c=n.index,l=n.restWorldPos,u=l[c.LeftFoot][1],d=l[c.Hips][1],f={l:H(l[c.LeftToeBase],l[c.LeftFoot]),r:H(l[c.RightToeBase],l[c.RightFoot])},p=[0,.005-u,-.045],m={l:-1/0,r:-1/0},h=G(H(l[c.LeftLeg],l[c.LeftUpLeg]))+G(H(l[c.LeftFoot],l[c.LeftLeg])),g=l[c.Hips][1]-l[c.LeftUpLeg][1],_=e.step??.5,v=e.halfWidth??.08,y=e=>Math.sqrt(Math.max(0,(.98*h)**2-e**2))+u+g-d,b={steps:8,step:_,period:20,swing:14,halfWidth:v,lift:.08,turnDistance:.4,firstStep:.4,pelvisHigh:Math.min(-.005,y(Math.hypot(.03,v-.035))),pelvisLow:y(Math.hypot(_/2,v)),vary:1,...e},x=b.step/b.period/(.5/20);b.armSwing=e.armSwing??or(Lm*x,4,22);let S=zm(x),C=Bm(x),w=Vm(x),T=Um(x),E=or(Gm*x,0,3),D=Om[0]+Om[1]*Math.min(x,2.5),O=km[0]+km[1]*Math.min(x,2.5),[k,ee]=b.heading??[s.yaw??0,s.yaw??0],te=e=>k+(ee-k)*nh(e/b.turnDistance),ne=U(V(s.foot_l,s.foot_r),.5);ne[1]=0;let re=[ne];for(let e=0;e<4e3;e++)re.push(V(re[e],U(eh(te(e*.01)),.01)));let ie=e=>re[Math.max(0,Math.min(re.length-1,Math.round(e/.01)))],ae=(e,t)=>{let n=V(ie(e),U(th(te(e)),(t===`l`?1:-1)*b.halfWidth));return n[1]=u,n},oe={l:-.07,r:.07},se={foot_l:s.foot_l,foot_r:s.foot_r,fyaw_l:s.fyaw_l??k,fyaw_r:s.fyaw_r??k},ce=[`root`,`yaw`,`roll`,`foot_l`,`foot_r`,`fyaw_l`,`fyaw_r`,`spine_yaw`,`spine_roll`,`spine_pitch`,`aswing_l`,`aswing_r`,`abend_l`,`abend_r`,`wflex_l`,`wflex_r`,`head_yaw`],le=s.roll??0,ue=s.spine_roll??0,de=s.spine_pitch??0,fe={l:[{a:e.f0,b:1/0,strike:!1}],r:[{a:e.f0,b:1/0,strike:!1}]};o(e.f0,Object.fromEntries(ce.map(e=>[e,s[e]??se[e]??(e===`yaw`?k:0)])));let pe=oe.r,me=null,he=zp(b,{s0:pe,turn:(e,t)=>te(t)-te(e),seed:[e.f0,b.steps,b.step,b.period,b.swing,b.firstStep,k,ee,ne[0].toFixed(3),ne[2].toFixed(3)].join(`|`)});for(let t=0;t<b.steps;t++){i=`${r} step ${t+1}`;let n=t%2==0?`l`:`r`,a=n===`l`?`r`:`l`,c=t===b.steps-1,l=c?pe:pe+he.inc[t],u=e.f0+16+he.lift[t],h=u+he.air[t],g=u+Math.floor(he.air[t]/2);if(t===0){let e=V(ie(oe[a]),U(th(k),(a===`l`?1:-1)*b.halfWidth*.75));e[1]=s.root[1],o(u-4,{root:e,yaw:k}),o(u,{arm_hang:1})}let ee=or(Math.abs(l-oe[n])/Dm,.3,1.15),ne=Em*(.55+.45*ee)*(c?.8:1),re=se[`foot_${n}`],ce=se[`fyaw_${n}`],ge=V(re,J(X(ce),f[n])),_e=Math.max(u-Math.max(Im,Math.round((t===0?.35:Fm)*b.period)),m[n]+1,e.f0+1);Object.assign(fe[n].at(-1),{b:u,heel:_e,ball:ge,yw:ce,flat:re});for(let e=_e;e<=u;e++){let t=ne*((e-_e)/Math.max(1,u-_e))**1.8;o(e,{[`foot_${n}`]:lm(ge,ce,t,re),[`fpitch_${n}`]:t,[`fyaw_${n}`]:ce})}let ve=Math.max(1,Math.round(Zm*he.air[t])),ye=ae((oe[n]+l)/2,n);ye[1]+=he.height[t];let be=lm(ge,ce,Math.min(ne,$m),re),xe=V(be,U(H(ye,be),qm));xe[1]=be[1]+Jm*ee*Math.min(1,(he.air[t]/Xm)**2)*(Ym+.44999999999999996*Qp(x))*(he.height[t]/b.lift);let Se=U(th(te(oe[a])),n===`l`?1:-1),Ce=se[`foot_${a}`],we=e=>(e[0]-Ce[0])*Se[0]+(e[2]-Ce[2])*Se[2],Te=we(ye)-we(xe);Te>0&&(xe[0]+=Se[0]*Te,xe[2]+=Se[2]*Te);let Ee=u+Math.max(2,Math.round(Km*he.air[t]));!c&&Ee<g-1&&o(Ee,{[`foot_${n}`]:xe,[`fpitch_${n}`]:.7*Math.min(ne,$m)}),o(g,{[`foot_${n}`]:ye,[`fyaw_${n}`]:te((oe[n]+l)/2),[`fpitch_${n}`]:0});let De=oe[a]+(Pm[0]+(Pm[1]-Pm[0])*Qp(x))*(l-oe[a]),Oe=me?me.s+(De-me.s)*((g-me.f)/(h-me.f)):null,ke=Oe===null?oe[a]+.03:Oe-Nm*Math.abs(l-oe[n])/2,Ae=t===0?.015:.032,je=V(ie(ke),U(th(te(ke)),(a===`l`?1:-1)*Ae));je[1]=d+b.pelvisHigh;let Me=e.pelvisLow??(he.inc[t]>_?Math.min(b.pelvisLow,y(Math.hypot(he.inc[t]/2,v))):b.pelvisLow),Ne=ie(De).slice();Ne[1]=d+(c?b.pelvisHigh:Me),me={f:h,s:De};let Pe=ae(l,n),Fe=te(l),Ie=V(Pe,J(X(Fe),p)),Le=-(Tm[0]+(Tm[1]-Tm[0])*Qp(x))*(c?.5:1),Re=Math.max(2,Math.round(.2*b.period)),ze=V(lm(Ie,Fe,Le,Pe),U(eh(Fe),-.12*Math.abs(l-oe[n])));ze[1]+=Qm,!c&&ve>1&&h-ve>g+1&&o(h-ve,{[`foot_${n}`]:ze,[`fpitch_${n}`]:.6*Le});for(let e=0;e<=Re;e++){let t=Le*(1-nh(e/Re));o(h+e,{[`foot_${n}`]:lm(Ie,Fe,t,Pe),[`fpitch_${n}`]:t,[`fyaw_${n}`]:Fe})}m[n]=h+Re,fe[n].push({a:h,b:1/0,strike:!0}),se[`foot_${n}`]=Pe,se[`fyaw_${n}`]=Fe,oe[n]=l;let Be=(c?0:t<3?[0,.3,.7][t]:1)*he.arm[t],Ve=n===`l`?1:-1,He=or(ee,.4,1.1),Ue=c?0:t===0?.5:1,We=jm*He*Ue*(a===`l`?1:-1),Ge=(h-g)/b.period,Ke=e=>{let t=[Math.cos(Math.PI*(e-Ge)),Math.cos(Math.PI*e)];return t.map(e=>e/Math.max(...t.map(Math.abs)))},qe=Ke(-C).map(e=>-4.5*He*Ve*Be*e),Je=Ke(S).map(e=>Mm*He*Ve*Be*e),Ye=Ke(Hm).map(e=>-Math.sign(We)*w*He*Ue*e),Xe=Ke(Ge).map((e,t)=>t?Rm*e:e),Ze=e=>({aswing_l:-.85*b.armSwing*Ve*Be*e,aswing_r:b.armSwing*Ve*Be*e,abend_l:Be*(D-Ve*O*e),abend_r:Be*(D+Ve*O*e)});o(g,{root:je,yaw:te(ke)+qe[0],roll:le+We,spine_roll:ue-We*1.26+Ye[0],spine_yaw:Je[0]-qe[0],...Ze(Xe[0]),wflex_l:Am*Be,wflex_r:Am*Be}),o(h,{root:Ne,yaw:te(De)+qe[1],roll:le,spine_roll:ue+Ye[1],spine_yaw:Je[1]-qe[1],...Ze(Xe[1]),head_yaw:0});let Qe=de+E*Ue,$e=T*He*Ue;o(Math.max(e.f0+1,h-Math.round(Wm[1]*b.period)),{spine_pitch:Qe-.6*$e}),o(Math.max(e.f0+1,h-Math.round(Wm[0]*b.period)),{spine_pitch:Qe+$e}),pe=l}let ge=e.f0+16+b.steps*b.period+18,_e=Math.max(...a.map(e=>e.f));return e.pelvisHigh===void 0&&e.pelvisLow===void 0&&(wm(a,{end:_e,ground:fe}),fm(n,a,{f0:e.f0,end:_e,period:b.period,pace:x,ground:fe,start:`${r} start`}),pm(n,a,{end:_e,period:b.period,pace:x,ground:fe}),wm(a,{end:_e,ground:fe,sk:n})),i=`${r} end`,o(ge,rh(a,ge)),a}function ah(e,t){let n=(e.keys??[]).map((e,t)=>e.src?e:{...e,src:`keys[${t}]`});return(e.generators??[]).forEach((e,r)=>{if(e.type!==`walk`)throw Error(`MOTION_SPEC_INVALID: generators[${r}] has unknown type "${e.type}" (only "walk")`);n=n.concat(ih(e,n,t,`generators[${r}] walk`))}),n}var oh={yaw:.5,pitch:.2,roll:.7},sh={yaw:4,pitch:6,roll:10},ch=33,lh=8,uh=[`yaw`,`pitch`,`roll`];function dh(e){let t=new Map;for(let n of e){let e=/ (start|step \d+)$/.exec(n.src??``),r=e&&n.src.slice(0,-e[0].length);if(!e||!/\bwalk(To)?$/.test(r))continue;let i=t.get(r)??[1/0,-1/0];t.set(r,[Math.min(i[0],n.f),Math.max(i[1],n.f)])}return[...t.values()].filter(([e,t])=>t>e)}var fh=(e,t)=>{let n=Math.floor(t/2),r=t=>e[Math.max(0,Math.min(e.length-1,t))];return e.map((e,t)=>{let i=0;for(let e=t-n;e<=t+n;e++)i+=r(e);return i/(2*n+1)})};function ph(e,t,n){let r=dh(t);if(!r.length)return;let i=t=>e[t]??Array(n).fill(0);for(let a of uh){let o=i(`spine_${a}`),s=i(a).map((e,t)=>e+o[t]),c=fh(s,ch),l=null;for(let[e,o]of r)if(!t.some(t=>t.f>=e&&t.f<=o&&t.set?.[`head_${a}`]!==void 0&&!/\bwalk(To)? (start|step \d+|end)$/.test(t.src??``))){l??=i(`head_${a}`).slice();for(let t=Math.max(0,e);t<=Math.min(n-1,o);t++){let n=Math.min(1,(t-e)/lh,(o-t)/lh),r=Math.max(-sh[a],Math.min(sh[a],s[t]-c[t]));l[t]-=oh[a]*r*n*n*(3-2*n)}}l&&(e[`head_${a}`]=l)}}function mh(e,t){let n=e.length,r=new Float64Array(n);for(let i=0;i<n;i++)if(e[i]>0)for(let a=Math.max(0,i-t-1);a<=Math.min(n-1,i+t+1);a++){let n=1-Math.abs(i-a)/(t+1),o=n*n*(3-2*n);r[a]=Math.max(r[a],e[i]*o)}return r}var hh=e=>Math.round(e*1e4)/1e4,gh=6;function _h(e,t){let{sk:n}=e.ctx,r=n.index,i=n.restWorldPos,a=e.baked.root;if(!a)return null;let o=e.frames.length,s=new Float64Array(o);for(let t=0;t<o;t++){let{s:n,diag:a,c:o}=e.frames[t];for(let[e,c]of Object.entries(wf)){if(!(a[`leg_miss_${e}`]>5e-4)||!Array.isArray(o[`foot_${e}`]))continue;let l=.999*(G(H(i[r[`${c}Leg`]],i[r[`${c}UpLeg`]]))+G(H(i[r[`${c}Foot`]],i[r[`${c}Leg`]]))),u=H(o[`foot_${e}`],n.P[r[`${c}UpLeg`]]),d=u[1]*u[1]-W(u,u)+l*l,f=d>=0?-u[1]-Math.sqrt(d):-u[1];f>0&&f<=.05&&(s[t]=Math.max(s[t],f+5e-4))}}let c=s.filter(e=>e>0).length;if(!c)return null;let l=mh(s,gh),u=[];for(let t=0;t<o;t++){if(!(l[t]>0))continue;let n=e.f0+t,r=a[n];a[n]=[r[0],r[1]-l[t],r[2]],u.push(n)}return t.solve(u),{frames:c,eased:u.length,max:hh(Math.max(...s)),how:`hips lowered`}}function vh(e){let t=0,n=0;for(let r of e.frames)for(let e of[`l`,`r`]){let i=r.diag[`reach_over_${e}`]??0;i>.001&&(t++,n=Math.max(n,i))}return t?{frames:t,max:hh(n),how:`wrist target clamped to reach`}:null}var yh=.01,bh=4,xh=.03,Sh=.02;function Ch(e,t){let n=e.frames.length,r=gl.plantH,i=0,a=0,o=0,s=new Set;for(let[t,c]of[[`l`,`Left`],[`r`,`Right`]]){let l=e.baked[`foot_${t}`];if(!l)continue;let u=e.frames.map((t,n)=>Rc(e,n,c)),d=(e,t)=>u[e][t][1]<r&&u[e-1][t][1]<r&&Math.abs(u[e][t][1]-u[e-1][t][1])<5e-4,f=Array.from({length:n},()=>null);for(let e=1;e<n;){if(!d(e,`ball`)&&!d(e,`heel`)){e++;continue}let t=null,s=null,c=e,l=0,p=[0,0,0],m=!1,h=[],g=e=>{let n=H(s,u[e][t]);n[1]=0,p=n,h.push([e,n]),l=Math.max(l,Math.hypot(n[0],n[2]))};for(;c<n&&(d(c,`ball`)||d(c,`heel`));c++){let e=d(c,`ball`)?`ball`:`heel`;m||=u[c][e===`ball`?`heel`:`ball`][1]>=r,e!==t&&(t=e,s=V(u[c-1][t],p)),g(c)}if(m&&l>=yh)for(;c<n&&u[c][t][1]<xh;c++)g(c);if(l>2e-4&&(l<yh||m)){i++,o=Math.max(o,l),l>=yh&&a++;for(let[e,t]of h)f[e]=t;let e=Math.max(bh,Math.ceil(Math.hypot(p[0],p[2])/Sh));for(let t=1;t<=e&&c-1+t<n&&!f[c-1+t];t++){let n=t/(e+1),r=1-n*n*(3-2*n);f[c-1+t]=[p[0]*r,0,p[2]*r]}}e=c}for(let t=0;t<n;t++){if(!f[t])continue;let n=e.f0+t;l[n]=V(l[n],f[t]),s.add(n)}}return i?(t.solve([...s]),{plants:i,...a?{pivots:a}:{},frames:s.size,max:hh(o),how:a?`planted heel/ball held in place; turning feet pivot on it`:`planted heel/ball held in place`}):null}var wh=6,Th=4,Eh=1,Dh=e=>e*e*(3-2*e);function Oh(e,t){let n=e.frames.length,r=gl.plantH,i=new Set,a=0;for(let[t,o]of[[`l`,`Left`],[`r`,`Right`]]){let s=e.baked[`fyaw_${t}`]??e.baked.yaw;if(!e.baked[`foot_${t}`]||!s)continue;let c=e.frames.map((t,n)=>Rc(e,n,o)),l=(e,t)=>c[e][t][1]<r&&c[e-1][t][1]<r&&Math.abs(c[e][t][1]-c[e-1][t][1])<5e-4,u=e=>e>0&&e<n&&l(e,`heel`)&&l(e,`ball`),d=Array.from({length:n},(t,n)=>s[e.f0+n]),f=d.slice();for(let e=1;e<n;e++){if(!u(e))continue;let t=f[e-1],r=e,i=0;for(;u(r);r++)i=Math.max(i,Math.abs(f[r]-t));if(i<=Eh){e=r;continue}a=Math.max(a,i);for(let n=e;n<r;n++)f[n]=t;let o=r<n?d[r]-t:0,s=Math.max(Th,Math.ceil(Math.abs(o)/wh));for(let e=0;o&&e<s&&r+e<n&&!u(r+e);e++)f[r+e]=d[r+e]-o*(1-Dh((e+1)/(s+1)));e=r}let p=f.map((e,t)=>e!==d[t]);if(!p.some(Boolean))continue;let m=e.baked[`fyaw_${t}`]=s.slice();p.forEach((t,n)=>{t&&(m[e.f0+n]=f[n],i.add(e.f0+n))})}return i.size?(t.solve([...i]),{frames:i.size,max:hh(a)}):null}var kh=.001,Ah=.15,jh=2;function Mh(e,t){let{sk:n}=e.ctx,r=e.frames.length,i=new Set,a=0;for(let[t,o]of Object.entries(wf)){let s=e.baked[`foot_${t}`],c=n.index[`${o}Foot`];if(!s)continue;let l=e.frames.map(({s:t},r)=>{let i=_a(n,t,o),a=Math.min(i.heel[1],i.ball[1],i.tip[1])-t.P[c][1]+s[e.f0+r][1];return Math.min(Ah,-a-kh)});if(!l.some(e=>e>0))continue;let u=mh(l,jh);for(let t=0;t<r;t++){if(!(u[t]>0))continue;let n=e.f0+t;s[n]=[s[n][0],s[n][1]+u[t],s[n][2]],a=Math.max(a,l[t]),i.add(n)}}return i.size?(t.solve([...i]),{frames:i.size,max:hh(a),how:`soles lifted onto the floor`}):null}var Nh=4,Ph=.002,Fh=3,Ih={l:ua.filter(e=>e[0]===`hand_l`||e[0]===`farm_l`),r:ua.filter(e=>e[0]===`hand_r`||e[0]===`farm_r`)};function Lh(e,t,n,r,i){let{sk:a}=e.ctx,o=a.index,s=e.frames.length,c=Array.from({length:s},()=>null);for(let a=0;a<s;a++){let{s,c:l}=e.frames[a],u=e.objectsAt(a),d=null;for(let[e,a]of Object.entries(u)){if(!a.half||a.ignore)continue;let c=null;for(let[l,u,d,f]of Ih[t]){let t=yl(r,l,e)??gl.allow,p=da(s.P[o[u]],s.P[o[d]]),m=p.map(e=>fa(e,a)),h=Math.min(...m),g=f-h-t;if(!(g<=0)){if(g>n){i.deep++;continue}(!c||g>c[0])&&(c=[g,p[m.indexOf(h)]])}}c&&(d=V(d??[0,0,0],U(va(c[1],a),c[0]+Ph)))}if(d){if(!(l[`armw_${t}`]>1e-4)){i.skipped++;continue}c[a]=d}}return c}function Rh(e,t,n){let r=e.ctx.spec.checks?.allow,i=e.frames.length,a={deep:0,skipped:0},o=new Set,s=0;for(let c=0;c<Fh;c++){a.deep=0,a.skipped=0;let c=new Set;for(let t of[`l`,`r`]){let l=Lh(e,t,n,r,a),u=e.ctx.push[t],d=Array.from({length:i},()=>null);for(let e=0;e<i;e++)if(l[e]){o.add(`${t}${e}`);for(let t=Math.max(0,e-Nh-1);t<=Math.min(i-1,e+Nh+1);t++){let n=1-Math.abs(e-t)/5,r=U(l[e],n*n*(3-2*n));(!d[t]||G(r)>G(d[t]))&&(d[t]=r)}}for(let t=0;t<i;t++){if(!d[t])continue;let n=e.f0+t,r=V(u.get(n)??[0,0,0],d[t]);u.set(n,r),s=Math.max(s,G(r)),c.add(n)}}if(!c.size)break;t.solve([...c])}return!o.size&&!a.skipped?null:{frames:o.size,max:hh(s),skipped:a.skipped,tooDeep:a.deep,how:`hand pushed out along the box normal`}}var zh=1.1,Bh=.35,Vh=3,Hh=e=>{let t=e.ctx.spec?.checks?.limits;return sl(e.ctx.sk,e,t,{...gl,...t})};function Uh(e,t,n){let r=[];for(let i=1;i<n;i++){if(e[i]<=1)continue;let a=i;for(;a+1<n&&e[a+1]>1;)a++;let o=Math.max(6,2*(a-i+1)),s=Math.max(0,...t.filter(e=>e<=i-1-o)),c=Math.min(n-1,...t.filter(e=>e>=a+o));r.length&&s<=r[r.length-1][1]?r[r.length-1][1]=Math.max(r[r.length-1][1],c):r.push([s,c]),i=a}return r}function Wh(e,t){let n=t[t.length-1]-t[0],r=t.slice(1).map((n,r)=>{let i=0;for(let a=Math.floor(t[r])+1;a<=Math.ceil(n);a++)i=Math.max(i,e[a]??0);return{len:n-t[r],need:zh*i}}),i=e=>r.reduce((t,n)=>t+n.len*Math.max(n.need,e),0),a=Bh,o=1;for(let e=0;e<40;e++){let e=(a+o)/2;i(e)>n?o=e:a=e}let s=r.map(e=>e.len*Math.max(e.need,a)),c=n/s.reduce((e,t)=>e+t,0),l=[t[0]];return s.forEach((e,t)=>l.push(l[t]+e*c)),l[l.length-1]=t[t.length-1],{T:l,stretch:Math.max(...s.map((e,t)=>e*c/r[t].len))}}function Gh(e,t){let n=e.frames.length,r=[],i=0,a=1;for(let o=0;o<Vh;o++){let o=Hh(e),s=[...new Set(e.keys.map(e=>e.f))].sort((e,t)=>e-t),c=Uh(o,s,n);if(!c.length)break;let l=c.map(([e,t])=>{let n=[...new Set([e,...s.filter(n=>n>e&&n<t),t])].sort((e,t)=>e-t),r=Wh(o,n);return a=Math.max(a,r.stretch),{cuts:n,T:r.T}});i+=c.length;let u=e=>{for(let{cuts:t,T:n}of l){if(e<t[0]||e>t[t.length-1])continue;let r=0;for(;r<t.length-2&&e>t[r+1];)r++;return n[r]+(n[r+1]-n[r])*(e-t[r])/(t[r+1]-t[r])}return e};r.push(u),t.rebake(e.keys.map(e=>({...e,f:u(e.f)}))),t.solve(t.all())}if(!r.length)return null;e.timeMap=e=>r.reduce((e,t)=>t(e),e);let o=Hh(e).filter(e=>e>1).length;return{windows:i,maxStretch:Math.round(a*100)/100,stillFast:o,how:`key intervals around speed spikes stretched`}}var Kh=Array.from({length:19},(e,t)=>-90+t*10),qh=3,Jh=5,Yh=.003,Xh=.003,Zh=.03,Qh=.08,$h=.03,eg=40,tg=.05,ng=4,rg=2,ig=.09,ag=400;function og(e,t,n){let r=null;for(let i of e.ctx.spec.checks?.below??[]){let a=String(i.joint).replace(/^joint:/,``),o=String(i.ref).replace(/^joint:/,``),s=e.f0+t;(Array.isArray(i.when)?s>=i.when[0]&&s<=i.when[1]:!i.when||(e.frames[t].c[i.when]??0)>.5)&&a===`${n}ForeArm`&&o===`${n}Arm`&&Number.isFinite(i.min)&&(r=Math.max(r??0,i.min))}return r}var sg=10,cg={l:`Left`,r:`Right`};function lg(e,t,n){let r=0;for(let i of e.fits??[]){let a=e.anchors?.[i.anchor],o=t[`w_${i.anchor}_${i.side}`]??0;(i.side===n||a?.kind===`prop`&&e.props?.[a.prop]?.hand===n)&&(r=Math.max(r,o))}return Math.min(1,r)}var ug=Object.fromEntries(ua.map(e=>[e[0],e[3]]));function dg(e,t,n,r){let i=0;for(let a of e)i=Math.max(i,r-Math.min(...da(t,n,5).map(e=>fa(e,a))));return i}function fg(e,t,n,r,i,a=[]){let o=t.index,s=o[`${r}Arm`],c=o[`${r}ForeArm`],l=n.P[s],u=n.P[o[`${r}Hand`]],d=i?V(l,J(pr(H(u,l),i),H(n.P[c],l))):n.P[c],f=Math.max(ki(e,t,n,s,l,d),ki(e,t,n,c,d,u)),p=r===`Left`?`l`:`r`;return{depth:f,scene:a.length?Math.max(dg(a,l,d,ug[`uarm_${p}`]),dg(a,d,u,ug[`farm_${p}`])):0,rise:Math.max(0,d[1]-(l[1]-ig)),under:l[1]-d[1]}}var pg=(e,t)=>{let n=e.index,r=e.restWorldPos;return G(H(r[n[`${t}ForeArm`]],r[n[`${t}Arm`]]))+G(H(r[n[`${t}Hand`]],r[n[`${t}ForeArm`]]))};function mg(e,t,n){let{sk:r}=e.ctx,i=cg[n],a=e.frames.length,o=e.ctx.swivel[n],s=e.frames.map(({s:a,c:s},c)=>{let l=Tf(s[`armw_${n}`]??0),u=(o.get(e.f0+c)??0)*l;if(!u&&fg(t,r,a,i,0).depth<=Xh)return null;let d=a.P[r.index[`${i}Arm`]],f=pg(r,i)+.15,p=Object.values(e.objectsAt(c)).filter(e=>e.half&&!e.ignore&&G(H(V(e.pos,J(e.R,[0,e.half[1],0])),d))-G(e.half)<f),m=fg(t,r,a,i,-u,p).scene,h=og(e,c,i);return Kh.map(e=>{let{depth:n,scene:o,rise:s,under:c}=fg(t,r,a,i,e*l-u,p),d=Math.max(0,n-Xh)*100,f=h===null?0:Math.max(0,h-c),g=Math.max(0,o-Math.max(m,Xh))*100;return eg*(d*d+g*g)+tg*(e/10)**2+ng*(s*100)**2+ag*(f*100)**2})});if(s.every(e=>!e))return null;let c=Kh.indexOf(0),l=Kh.map((e,t)=>t===c?0:1/0),u=Kh.map(()=>0),d=[];for(let e=0;e<a;e++){let t=s[e]??l,n=u,r=[];u=t.map((e,t)=>{let i=1/0,a=c;for(let e=0;e<Kh.length;e++){if(Math.abs(Kh[t]-Kh[e])>sg)continue;let r=n[e]+rg*((Kh[t]-Kh[e])/10)**2;r<i&&(i=r,a=e)}return r.push(a),i+e}),d.push(r)}let f=Array(a),p=u.indexOf(Math.min(...u));for(let e=a-1;e>=0;e--)f[e]=Kh[p],p=d[e][p];return f.map((e,t)=>(f[Math.max(0,t-1)]+2*f[t]+f[Math.min(a-1,t+1)])/4)}function hg(e,t,n,r){let{sk:i}=e.ctx,a=cg[n],o=i.index,s=e.frames.length,c=Array(s).fill(null),l=[o.Head,o.Neck,o.HeadTop_End].filter(e=>e!==void 0);for(let u=0;u<s;u++){let{s,c:d}=e.frames[u],f=e.f0+u,p=1-lg(e.ctx.spec,d,n);if(p<.05)continue;let m=null;for(let n of[o[`${a}Hand`],o[`${a}ForeArm`]]){let r=Ai(t,i,s,n);if(r.into<0||l.includes(r.into))continue;let a=Math.min($h,yl(e.ctx.spec.checks?.allow,Ac(i,n),Ac(i,r.into))??0),o=r.depth-Math.max(a,Xh);o>0&&(!m||o>m.past)&&(m={...r,b:n,past:o})}if(!m)continue;if(!(d[`armw_${n}`]>1e-4)){r.skipped++;continue}let h=G(e.ctx.skinPush[n].get(f)??[0,0,0]);if(h>=Qh){r.deep++;continue}let g=yi(t,s,m.p,new Set([...t.skip.get(m.b),...l]));g&&(c[u]=U(g,p*Math.min(Zh,Qh-h,m.past+Yh)))}let u=Array(s).fill(null);return c.forEach((e,t)=>{if(e)for(let n=Math.max(0,t-Jh-1);n<=Math.min(s-1,t+Jh+1);n++){let r=1-Math.abs(t-n)/6,i=U(e,r*r*(3-2*r));(!u[n]||G(i)>G(u[n]))&&(u[n]=i)}}),u}function gg(e,t){let n=mi(e.ctx.sk);if(!n)return null;let r=e.frames.length,i={skipped:0,deep:0},a=new Set,o=new Set,s=0,c=0;for(let r=0;r<qh;r++){let r=new Set;for(let t of[`r`,`l`]){let i=mg(e,n,t);i&&i.forEach((n,i)=>{let o=e.f0+i,c=e.ctx.swivel[t].get(o)??0,l=Math.abs(n)<.5?0:n;Math.abs(l-c)<.5||(l?e.ctx.swivel[t].set(o,l):e.ctx.swivel[t].delete(o),s=Math.max(s,Math.abs(l)),l&&a.add(`${t}${i}`),r.add(o))})}r.size&&t.solve([...r]),r=new Set,i.skipped=0,i.deep=0;for(let t of[`r`,`l`])hg(e,n,t,i).forEach((n,i)=>{if(!n)return;let a=e.f0+i,s=V(e.ctx.skinPush[t].get(a)??[0,0,0],n);e.ctx.skinPush[t].set(a,s),c=Math.max(c,G(s)),o.add(`${t}${i}`),r.add(a)});if(!r.size)break;t.solve([...r])}if(o.size){let n=new Set;for(let t of[`r`,`l`]){let i=n=>e.ctx.skinPush[t].get(e.f0+n)??[0,0,0];for(let a=0;a<2;a++){let a=Array.from({length:r},(e,t)=>i(t));a.forEach((i,o)=>{let s=[-2,-1,0,1,2].reduce((e,t,n)=>V(e,U(a[Math.min(r-1,Math.max(0,o+t))],[1,4,6,4,1][n]/16)),[0,0,0]);G(s)<1e-5&&!e.ctx.skinPush[t].has(e.f0+o)||(e.ctx.skinPush[t].set(e.f0+o,s),n.add(e.f0+o))})}}n.size&&t.solve([...n])}return!a.size&&!o.size&&!i.skipped?null:{elbowFrames:a.size,maxTurn:Math.round(s),handFrames:o.size,maxPush:hh(c),skipped:i.skipped,tooDeep:i.deep,how:`elbow turned about the shoulder-wrist line; a hand a little inside pushed out along the skin`}}var _g=[`reach`,`slide`,`penetration`,`self`,`retime`,`stance`,`grasp`];function vg(e){if(e===!1)return{reach:!1,slide:!1,penetration:0,self:!1,retime:!1,stance:!1,grasp:!1};let t=e??{},n=t.penetration===!0?.02:Math.min(.05,Math.max(0,Number(t.penetration)||0));return{reach:t.reach!==!1,slide:t.slide!==!1,penetration:n,self:t.self!==!1,retime:t.retime===!0,stance:t.stance!==!1,grasp:t.grasp!==!1}}var yg=(e,t)=>e?{...t??{frames:0,how:`planted heel/ball held in place`},turns:e,how:`${t?.how??`planted heel/ball held in place`}; a flat planted foot keeps its heading until it lifts`}:t,bg=(e,t)=>e&&t?{frames:Math.max(e.frames,t.frames),eased:Math.max(e.eased,t.eased),max:Math.max(e.max,t.max),how:e.how}:e??t;function xg(e,t,n,{whole:r=!0}={}){let i={},a=(e,t)=>{t&&(i[e]=t)};return t.retime&&r&&a(`retime`,Gh(e,n)),t.slide&&a(`ground`,Mh(e,n)),t.reach&&a(`reachLegs`,_h(e,n)),t.slide&&a(`slide`,yg(Oh(e,n),Ch(e,n))),t.reach&&i.slide?.pivots&&a(`reachLegs`,bg(i.reachLegs,_h(e,n))),t.penetration>0&&a(`penetration`,Rh(e,n,t.penetration)),t.self&&a(`self`,gg(e,n)),t.reach&&a(`reachArms`,vh(e)),i}var Sg=.15,Cg=.12,wg=400,Tg=.02,Eg=60;function Dg(e){let t=ba(e),n=e.half;return t.kind===`sphere`?4/3*Math.PI*t.r**3:t.kind===`cylinder`?Math.PI*t.r*t.r*t.h:8*n[0]*n[1]*n[2]}function Og(e,t,n){let r=e?.objects?.[n]?.mass;if(Number.isFinite(r))return r;let i=Ud(t,n).map(e=>t.objects[e]);if(i.length===1&&ba(i[0]).kind===`sphere`&&2*ba(i[0]).r<Cg)return Sg;let a=i.reduce((e,t)=>e+Dg(t)*wg,0);return Math.min(Eg,Math.max(Tg,a))}var kg=10,Ag=9.81,jg=2,Mg=.06,Ng=.006,Pg=25,Fg=.5,Ig=`load: what each hand carries, kg, and its most N m (mass x 9.81 x the shoulder-to-wrist distance across) at f; frames [first, last] held`,Lg=e=>e?.fix!==!1&&e?.fix?.grasp!==!1,Rg=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)},zg=e=>Object.entries(e.objects??{}).filter(([,t])=>Hf(t)&&e.props?.[t.prop]).map(([t,n])=>[t,n,e.props[n.prop].hand]);function Bg(e,t,n,r,i,a){let{spec:o,scene:s,sk:c}=e;if(!Lg(o)||!(a>.001))return null;for(let[l,u,d]of zg(o)){if(d!==t||u.keys?.length)continue;let f=Og(o,s,l),[p,m]=e.carrySpan(u);if(n<p||n>m||f*Ag*ls(c,t)<jg)continue;let h=Rg((n-p)/4)*Rg((m-n)/4)*a,g=Math.min(Mg,Ng*f)*h;if(!(g>0))return null;let _=H(r.P[c.index[`${wf[t]}Arm`]],i),v=G([_[0],0,_[2]])>1e-6?K([_[0],0,_[2]]):[0,0,0];return V([0,-g,0],U(v,g))}return null}var Vg=(e,t,n,r)=>{let i=H(t.P[e.index[`${wf[n]}Hand`]],t.P[e.index[`${wf[n]}Arm`]]);return r*Ag*Math.hypot(i[0],i[2])};function Hg(e,t,n){let{spec:r,scene:i}=t.ctx,a=t.f0??0;if(!Lg(r))return;let o=zg(r).map(([e,t,n])=>({id:e,o:t,k:n,mass:Og(r,i,e)}));o.length&&t.frames.forEach(({s:r},i)=>{let s=i+a;for(let i of o)sf(t,i.id,s)===i.k&&n({...i,f:s,Nm:Vg(e,r,i.k,i.mass)})})}function Ug(e,t){let n={};Hg(e,t,({id:e,k:t,mass:r,f:i,Nm:a})=>{let o=n[`hand_${t}`]??={object:e,mass:Math.round(r*1e3)/1e3,maxNm:0,at:i,frames:[i,i]};a>o.maxNm&&(o.maxNm=a,o.at=i),o.frames[1]=i});for(let e of Object.values(n))e.maxNm=Math.round(e.maxNm*10)/10;return Object.keys(n).length?n:null}function Wg(e,t,n,r,i){let a=r===`r`?`l`:`r`,{spec:o,scene:s}=e.ctx,c=new Set([t,...Ud(s,t)]);return Object.entries(o.anchors??{}).some(([t,r])=>(e.baked?.[`w_${t}_${a}`]?.[i]??0)>Fg&&(r.kind===`object`&&c.has(r.object)||r.kind===`prop`&&r.prop===n.prop))}function Gg(e,t){let n=[];return Hg(e,t,({id:e,o:r,k:i,f:a,Nm:o})=>{o>Pg&&!Wg(t,e,r,i,a)&&n.push({kind:`LOAD`,msg:`${wf[i].toLowerCase()} holds ${e} at ${o.toFixed(0)} N m`,frame:a,value:Math.round(o*10)/10,limit:Pg})}),n}function Kg(e,t,n){let{sk:r,scene:i}=e.ctx,a=e.frames[n-(e.f0??0)]?.s,o=cf(e,t,n),s=Ia(i,t),c=i.objects[Ud(i,t)[0]]??i.objects[t];if(!a||!o||!c?.half)return null;let l=e=>J(Y(o.R),H(e,o.pos)),u=J(Y(s.R),H(V(c.pos,J(c.R,[0,c.half[1],0])),s.pos)),d=l(U(V(a.P[r.index.RightHand],a.P[r.index.RightHandMiddle1]),.5)),f=l(a.P[r.index.LeftArm]),p=[0,1,2].flatMap(e=>[-1,1].map(t=>{let n=u.slice();return n[e]+=t*c.half[e],{p:n,i:e,sg:t}})).filter(e=>!(e.i===1&&e.sg<0)),m=p.reduce((e,t)=>Math.abs(d[t.i]-t.p[t.i])<Math.abs(d[e.i]-e.p[e.i])?t:e);return p.filter(e=>e!==m).reduce((e,t)=>G(H(t.p,f))<G(H(e.p,f))?t:e).p.map(e=>Math.round(e*1e3)/1e3)}var qg={LOAD(e,t){let[,n,r]=/^(left|right) holds (\S+) at/.exec(t.subject)??[],i=e.spec?.objects?.[r];if(!i||!e.out)return null;let a=n===`left`?`l`:`r`,o=a===`r`?`left`:`right`,[s]=qd(e.out,i),c=Og(e.spec,e.out.ctx.scene,r),l={cause:`objects.${r} (${c.toFixed(1)} kg)`,hint:`${r} weighs ${c.toFixed(1)} kg: ${t.worst.toFixed(0)} N m on the ${n} arm at f${t.worstFrame} (one hand holds ${Pg}); put the ${o} hand on it too (a reachGrip on an object anchor on ${r} from f${s}), or carry it closer to the body`};if(a!==`r`)return l;let u=Kg(e.out,r,Math.max(s,Math.min(t.worstFrame,qd(e.out,i)[1])));if(!u)return l;let d=`${r}Other`,f={kind:`object`,object:r,local:u,grasp:`palm`};return{...l,fix:{ops:t=>[t.anchors?{op:`add`,path:`/anchors/${d}`,value:f}:{op:`add`,path:`/anchors`,value:{[d]:f}},{op:`add`,path:`/use/-`,value:{skill:`reachGrip`,f0:Math.max(0,s-kg),args:{anchor:d,side:`l`,reach:Math.min(kg,s)||1,hold:Math.max(1,qd(e.out,i)[1]-s),release:1}}}]}}}},Jg=e=>e*e*(3-2*e),Yg=.02;function Xg(e,t,n,r=()=>void 0){let i=new Map,a=new Map,o=r(),s=s=>{if(r()!==o&&(o=r(),i.clear(),a.clear()),i.has(s))return i.get(s);let c={};for(let[r,i]of Object.entries(t?.objects??{})){let a=[r,...i.ancestors??[]].find(t=>Gf(e.objects?.[t])),l=e.objects?.[a];c[r]=l?Hf(l)||Uf(l)?{...i,carried:a}:xd(l)?{...i,...Yf(zd({spec:e,scene:t,timeMap:o},a,s),Xf(t.objects[a]??Io(t)[a],i))}:{...i,...Zf(l,i,n,s)}:i}return i.set(s,c),c};return{all:s,obstacles:e=>(r()!==o&&s(e),a.has(e)||a.set(e,Object.fromEntries(Object.entries(s(e)).filter(([,e])=>!e.carried))),a.get(e))}}function Zg(e,t,n,r){if(r.prop)return n.props?.[r.prop]?.[r.point];let i=r.joints??[`RightHandIndex2`,`RightHandMiddle2`];return U(i.map(n=>t.P[e.index[n]]).reduce((e,t)=>V(e,t),[0,0,0]),1/i.length)}function Qg(e,t,n,r=!1,i=!0,a=null){let{sk:o}=e;return{softReach:e.softReach,foldFree:r,hold:i&&e.hold?(r,i)=>r===a?null:e.hold.lead(r,n,i,t):void 0,push:r?void 0:t=>e.push?.[t]?.get(n),swivel:t=>e.swivel?.[t]?.get(n),skinPush:r?void 0:t=>e.skinPush?.[t]?.get(n),handTarget(r,i,a){a.frame=n;let s=i.P[o.index[r===`l`?`LeftHand`:`RightHand`]],c=[];for(let[n,o]of Object.entries(t)){let s=/^w_(.+)_([lr])$/.exec(n);!s||s[2]!==r||!(o>1e-6)||c.push([o,V(ds(e,s[1],i,a,t,r),t[`fit_${s[1]}_${r}`]??[0,0,0])])}let l=c.reduce((e,[t])=>e+t,0);if(l>1){for(let e of c)e[0]/=l;l=1}let u=U(t[`hand_${r}`]??s,1-l);for(let[e,t]of c)u=V(u,U(t,e));let d=Math.max(0,...c.map(([e])=>Jg(Math.min(1,Math.min(e,1-e)*3))));if(d>0){let n=i.P[o.index.Spine],r=i.P[o.index.Neck],a=H(r,n),s=V(n,U(a,Math.min(1,Math.max(0,W(H(u,n),a)/W(a,a))))),c=e.spec.detourRadius??.25,l=H(u,s),f=G(l);if(f<c){let e=J(pr([0,1,0],t.yaw??0),[0,0,1]),n=K(V(f>1e-6?U(l,1/f):e,U(e,.6)));u=V(u,U(H(V(s,U(n,c)),u),d))}}return u},keepOut:e.keepOut&&!r?(n,r,i)=>{let a=(1-lg(e.spec,t,n))*Math.min(1,Math.max(0,t[`armw_${n}`]??0));for(let t=0;t<2&&a>.001;t++){let t=Ei(e.keepOut.body,o,r,i,Di,e.keepOut.skip);if(t===i)break;i=V(i,U(H(t,i),a))}return i}:void 0,afterArm:(t,n,r)=>xs(e,t,n,r),grip:r?void 0:(r,i,a)=>_p(e,o,i,wf[r],r,t,n,a),sag:r?void 0:(r,i,a)=>Bg(e,r,n,i,a,(1-lg(e.spec,t,r))*Math.min(1,Math.max(0,t[`armw_${r}`]??0))),heldShapes:r||!e.grasp?void 0:(r,i)=>bf(e,t,n,r,i)}}function $g(e,t,n,r=!0){let i={...Ap(t,e.idle,n)};for(let t of[`l`,`r`])e.busy?.[t]&&(i[`hangoff_${t}`]=e.busy[t][n]);for(let t of e.spec.fits??[]){let a=`w_${t.anchor}_${t.side}`;if(!(i[a]>1e-4))continue;let o={...i,[a]:1,[`armw_${t.side}`]:1};for(let e of Object.keys(o))e!==a&&RegExp(`^w_.+_${t.side}$`).test(e)&&(o[e]=0);let s=[0,0,0],c=null,l=null,u=Su(e.spec,t.anchor),d=e.sk.index[`${wf[t.side]}Arm`],f=e.sk.index[`${wf[t.side]}Hand`];for(let i=0;i<6;i++){o[`fit_${t.anchor}_${t.side}`]=s;let{s:i,diag:a}=Vf(e.sk,o,Qg(e,o,n,!0,r,t.side)),p=Zg(e.sk,i,a,t.effector),m=V(ds(e,t.anchor,i,a,o,t.side),t.offset??[0,0,0]);if(!p)break;let h=H(m,p),g=G(h);u&&(!c||g<c.err)&&(c={err:g,hand:H(i.P[f],p)}),l={goal:m,shoulder:i.P[d]},s=V(s,h)}u&&c&&l&&G(H(V(l.goal,s),l.shoulder))>ls(e.sk,t.side)+Yg&&(s=c.hand),i[`fit_${t.anchor}_${t.side}`]=s}let{s:a,diag:o}=Vf(e.sk,i,Qg(e,i,n,!1,r));return o.frame=n,{s:a,diag:o,c:i}}function e_(e,{sk:t,scene:n},r={}){if(e?.schema!==`cozyclay.motion-spec.v1`)throw Error(`MOTION_SPEC_INVALID: schema must be cozyclay.motion-spec.v1`);let i=Math.round(e.frames);if(!(i>=1&&i<=2e4))throw Error(`MOTION_SPEC_INVALID: frames must be 1..20000`);let a=vg(e.fix),[o,s]=r.window?[Math.max(0,r.window[0]),Math.min(i-1,r.window[1])]:[0,i-1],c={sk:t,spec:e,scene:n,grasp:a.grasp,softReach:a.reach,push:{l:new Map,r:new Map},swivel:{l:new Map,r:new Map},skinPush:{l:new Map,r:new Map},keepOut:a.self?Oi(t):null},l={ctx:c,fps:e.fps??30,frameCount:i,f0:o,frames:[]};c.objectPose=(e,t,n)=>cf(l,e,t,n),c.objectHand=(e,t)=>sf(l,e,t),c.restingAt=(e,t)=>$d(l,e,t),c.carrySpan=e=>qd(l,e),c.solvedAt=e=>tf(l,e),c.weightAt=(e,t)=>l.baked?.[e]?.[t],c.frameCount=i;let u={rebake(r){l.keys=r,l.baked=Us(r,i,Bs(e.flow)),c.socketTurns=new Map,c.graspPlans=new Map,ph(l.baked,r,i),c.idle=kp(l.baked,{spec:e,sk:t,frameCount:i}),c.busy=Op(l.baked,e,i,l.fps);let a=Xg(e,n,l.baked,()=>l.timeMap);c.objectsAt=a.all,l.objectsAt=o?e=>a.obstacles(e+o):a.obstacles},solve(e){for(let t of e)t>=o&&t<=s&&(l.frames[t-o]=$g(c,Ws(l.baked,t),t))},all:()=>Array.from({length:s-o+1},(e,t)=>o+t)};return c.hold=Bu(c,l,e=>$g(c,Ws(l.baked,e),e,!1),e=>$g(c,Ws(l.baked,e),e)),u.rebake(r.keys??ah(e,t)),u.solve(u.all()),l.fixed=r.fixes===!1?{}:xg(l,a,u,{whole:!r.window}),c.hold&&l.timeMap&&u.solve(u.all()),l}var t_=`{ f, pos: [x, y, z], rot: [x, y, z, w] } or { f, pos, aim: [x, y, z], roll? }`,n_=`{ at, onto?, bounce?, tumble?, v? }`,r_=e=>Array.isArray(e)&&e.length===4&&e.every(Number.isFinite)&&Math.abs(Math.hypot(...e)-1)<=.01,i_=e=>yo(e)&&Math.hypot(...e)>1e-9;function a_(e,t,n){if(n.rot!==void 0&&n.aim!==void 0)return e(`${t} gives both rot and aim; give one: rot [x, y, z, w], or aim [x, y, z] (the world direction its +Y points) with roll`);if(n.aim===void 0){n.roll!==void 0&&e(`${t}.roll turns the object about aim; give aim [x, y, z] with it, or leave roll out (rot fixes the roll)`),n.lean!==void 0&&e(`${t}.lean lets the compiler lean aim; give aim [x, y, z] with it (rot is used exactly)`),r_(n.rot)||e(`${t}.rot must be a unit quaternion [x, y, z, w], got ${Z(n.rot)}${n.rot===void 0?`; or give aim [x, y, z], the world direction its +Y points`:``}`);return}i_(n.aim)||e(`${t}.aim must be a non-zero world direction [x, y, z] for the object's +Y (a bat: knob to barrel), got ${Z(n.aim)}`),n.roll!==void 0&&!Number.isFinite(n.roll)&&e(`${t}.roll must be degrees about aim (a number), got ${Z(n.roll)}`),n.lean!==void 0&&!(Number.isFinite(n.lean)&&n.lean>=0&&n.lean<=45)&&e(`${t}.lean must be the most degrees the compiler may lean aim (0..45), got ${Z(n.lean)}`)}function o_(e,t,n,r,i,a=!1){if(!Array.isArray(r.keys))return e(`${n}.keys must be an array of ${t_}`);let o=Number.isInteger(i)?i-1:1/0,s=a?0:r.grab??0,c=a?o:r.release??o,l=new Map;r.keys.forEach((r,i)=>{let o=`${n}.keys[${i}]`;if(!r||typeof r!=`object`||Array.isArray(r))return e(`${o} must be ${t_}, got ${Z(r)}`);for(let e of Object.keys(r))qa.includes(e)||t(`${o} has unknown field "${e}"${xo(e,qa)}; a key is ${t_}`);Number.isInteger(r.f)?r.f<s||r.f>c?e(a?`${o}.f = ${r.f} is outside the take (0..${c})`:`${o}.f = ${r.f} is outside grab..release (${s}..${c}); keys pose a carried object only while it is in hand (drop its prop to move it on its own, C17)`):l.has(r.f)?e(`${o}.f = ${r.f}: keys[${l.get(r.f)}] is at that frame already; one key per frame`):l.set(r.f,i):e(`${o}.f must be a whole frame, got ${Z(r.f)}`),yo(r.pos)||e(`${o}.pos must be [x, y, z], the world position of the object's base (a group: its root), got ${Z(r.pos)}`),a_(e,o,r)})}function s_(e,t,n,r,i){let a=/^object:(.+?)(?:\.(?:center|top|base))?$/s.exec(i)?.[1];if(a===void 0)return;let o=Ud(n,a).flatMap(t=>[t,...n.objects[t].ancestors??[]].find(t=>Gf(e.objects?.[t]))??[]).find(t=>Uf(e.objects[t]));o&&t(`${r} "${i}": "${a}" moves with the follow entry objects.${o}; a follow entry rides a joint, landmark, prop or anchor point, or an object no follow entry moves`)}function c_(e,t,n,r,i){Os(e,t,n,`${r}.follow`,i.follow)&&s_(e,t,n.scene,`${r}.follow`,i.follow),i.offset!==void 0&&!yo(i.offset)&&t(`${r}.offset must be [x, y, z], metres along the record's own axes after aim (+Y along aim), got ${Z(i.offset)}`);let a=i.aim;if(a!==void 0&&a!==`face`&&a!==`up`){if(Array.isArray(a)){i_(a)||t(`${r}.aim must be a non-zero world direction [x, y, z], got ${Z(a)}`);return}if(typeof a!=`string`||!/^[a-z]+:/.test(a))return t(`${r}.aim must be "face", "up", a world direction [x, y, z] or a point ref (toward it), where the record's +Y points; got ${Z(a)}`);Os(e,t,n,`${r}.aim`,a)&&s_(e,t,n.scene,`${r}.aim`,a)}}function l_(e,t,n,r){return n===void 0||Number.isInteger(n)&&n>=0&&(!Number.isInteger(r)||n<r)?!0:(e(`${t} must be a whole frame 0..${Number.isInteger(r)?r-1:`frames-1`}, got ${Z(n)}`),!1)}function u_(e,t,n,r,{frames:i,scene:a,carry:o}){let s=Array.isArray(r.fall)?r.fall:[r.fall],c=new Set;s.length||e(`${n}.fall is an empty list; give ${n_} or a list of them`),s.forEach((s,l)=>{let u=Array.isArray(r.fall)?`${n}.fall[${l}]`:`${n}.fall`;if(!s||typeof s!=`object`||Array.isArray(s))return e(`${u} must be ${n_} (at: the frame it starts to fall), got ${Z(s)}`);for(let e of Object.keys(s))Ka.includes(e)||t(`${u} has unknown field "${e}"${xo(e,Ka)}; a fall is ${n_}`);if(s.at===void 0)e(`${u}.at must be the whole frame it starts to fall`);else if(l_(e,`${u}.at`,s.at,i)){c.has(s.at)&&e(`${u}.at = ${s.at}: another fall starts on that frame`),c.add(s.at);let t=r.grab??0,n=r.release;o&&s.at>=t&&(n===void 0||s.at<n)&&e(`${u}.at = ${s.at} is while it is in hand (grab ${t}..release ${n??`end`}); a carried object falls before its grab or from its release on`)}s.onto!==void 0&&Ao(e,a,`${u}.onto`,s.onto,{groups:!0}),s.bounce!==void 0&&!(Number.isFinite(s.bounce)&&s.bounce>=0&&s.bounce<=.6)&&e(`${u}.bounce must be 0..0.6 (the share of its landing speed it bounces back with; 0 lands dead), got ${Z(s.bounce)}`),s.v!==void 0&&!(o&&s.v===`hand`||yo(s.v))&&e(`${u}.v must be [vx, vy, vz] m/s (the velocity it leaves with)${o?` or "hand" (the velocity the hand gives it at the release)`:``}, got ${Z(s.v)}`),s.tumble!==void 0&&typeof s.tumble!=`boolean`&&e(`${u}.tumble must be true (it rolls to rest on a stable face, the default) or false (it drops straight down as it was), got ${Z(s.tumble)}`)})}var d_=(e,t)=>{let n=0;for(;n<e.length&&e[n]===t[n];)n+=1;return n};function f_(e){let t=String(e),n=co.reduce((e,n)=>d_(n,t)>d_(e,t)?n:e);return d_(n,t)>=4?`; did you mean "${n}"?`:xo(t,co)}function p_(e,t,n){n.mass!==void 0&&!(Number.isFinite(n.mass)&&n.mass>=.01&&n.mass<=60)&&e(`${t}.mass must be kg in 0.01..60, got ${Z(n.mass)}`)}function m_(e,t,n){n.visible!==void 0&&(typeof n.visible!=`string`||!n.visible)&&e(`${t}.visible must name a channel (shown above 0.5)`),n.level!==void 0&&(typeof n.level!=`string`||!n.level)&&e(`${t}.level must name a channel (the record's level 0..4: 0 dark, 1 as authored; it scales its light, glow and effect rate)`)}function h_(e,t,{sk:n,scene:r,frames:i=e.frames,unknown:a=t}){for(let[o,s]of Object.entries(e.objects??{})){let c=`objects.${o}`,l=s?.prop===void 0?Uf(s)?`follow`:xd(s)?`free`:Wf(s)?`switch`:`hinge`:`carry`,u=Ga[l];(l!==`switch`&&l!==`follow`||!r?.others?.[o])&&Ao(t,r,c,o,{groups:!0});for(let e of Object.keys(s??{}))!u.includes(e)&&(l!==`hinge`||e!==`keys`&&e!==`fall`)&&a(`${c} (${l}) has unknown field "${e}"${xo(e,u)}; fields: ${u.join(`, `)}`);if(p_(t,c,s),l===`follow`){c_(e,t,{sk:n,scene:r},c,s),m_(t,c,s);continue}if(l===`switch`){s.visible===void 0&&s.level===void 0&&t(`${c} needs visible or level (a channel): a switch shows, hides or dims "${o}" without moving it; a carry needs prop, a hinge pivot and channel`),m_(t,c,s);continue}if(l===`free`){s.keys!==void 0&&o_(t,a,c,s,i,!0),s.fall!==void 0&&u_(t,a,c,s,{frames:i,scene:r,carry:!1}),m_(t,c,s);continue}if(l===`carry`){e.props?.[s.prop]||t(`${c}.prop "${s.prop}" is not in spec.props`);for(let e of[`at`,`along`])s[e]!==void 0&&!yo(s[e])&&t(`${c}.${e} must be [d, l, n] along the palm axes, got ${Z(s[e])}`);s.grasp!==void 0&&!co.includes(s.grasp)&&t(`${c}.grasp must be one of ${co.join(`, `)}${f_(s.grasp)}, got ${Z(s.grasp)}`),m_(t,c,s),l_(t,`${c}.grab`,s.grab,i)&&l_(t,`${c}.release`,s.release,i)&&s.grab!==void 0&&s.release!==void 0&&!(s.grab<s.release)&&t(`${c}: grab (${s.grab}) must come before release (${s.release})`),s.keys!==void 0&&o_(t,a,c,s,i),s.fall!==void 0&&u_(t,a,c,s,{frames:i,scene:r,carry:!0});continue}(s?.keys!==void 0||s?.fall!==void 0)&&t(`${c}: a hinge turns by its channel "${s.channel}", keyed in spec.keys; keys and fall move an object with no pivot, axis or channel (C17), or a carried one (prop)`),yo(s?.pivot)||t(`${c}.pivot must be [x, y, z] (world hinge point), got ${Z(s?.pivot)}`),s?.axis!==void 0&&(!yo(s.axis)||Math.hypot(...s.axis)<1e-9)&&t(`${c}.axis must be a non-zero [x, y, z], got ${Z(s.axis)}`),(typeof s?.channel!=`string`||!s.channel)&&t(`${c}.channel must name the angle channel (degrees)`)}}var Q=e=>{let t=Math.round(e*1e3)/1e3;return Object.is(t,-0)?0:t},g_=e=>`[${e.map(e=>{let t=Q(e);return t>0?`+${t}`:`${t}`}).join(`, `)}]`,__=[`near`,`above`,`moved`,`still`,`speed`],v_={near:.05,above:0,moved:.05,still:.01},y_=new Set([`near`,`still`]),b_=new Set([`moved`,`still`,`speed`]),x_=e=>__.filter(t=>e?.[t]!==void 0),S_=(e,t)=>e.name??`goals[${t}]`,C_=(e,t)=>(y_.has(t)?e.tol:e.by)??v_[t],w_=(e,t)=>e.mode??(t===`speed`?`any`:`all`),T_=e=>!e.startsWith(`object:`)||/\.(center|top|base)$/.test(e)?e:`${e}.base`;function E_(e,t){let[,n,r]=/^object:(.+)\.(center|top|base)$/s.exec(T_(t))??[],i=Ud(e,n).map(t=>e.objects[t]);if(!i.length)return null;let a=[1/0,1/0,1/0],o=[-1/0,-1/0,-1/0];for(let e of i)for(let t of[-1,1])for(let n of[0,2])for(let r of[-1,1]){let i=V(e.pos,J(e.R,[t*e.half[0],n*e.half[1],r*e.half[2]]));for(let e=0;e<3;e++)a[e]=Math.min(a[e],i[e]),o[e]=Math.max(o[e],i[e])}let s=[(a[0]+o[0])/2,(a[1]+o[1])/2,(a[2]+o[2])/2];return r===`top`?[s[0],o[1],s[2]]:r===`base`?[s[0],a[1],s[2]]:s}var D_=e=>e.moved??e.still,O_=(e,t,n=Array.isArray(t.at)?t.at[0]:t.at)=>D_(t).startsWith(`object:`)?E_(e.ctx.scene,D_(t)):Ts(e,n,D_(t));function k_(e,t,n){let r=Ts(e,n,t),i=e.fps??24;if(!r)return null;let a=Ts(e,n-1,t),o=Ts(e,n+1,t);if(a&&o)return G(H(o,a))*i/2;let s=a??o;return s?G(H(r,s))*i:null}function A_(e,t,n,r,i){if(n===`near`)return Es(e,r,t.near[0],t.near[1]);if(n===`above`){let n=Ts(e,r,t.above[0]),i=Ts(e,r,t.above[1]);return n&&i?n[1]-i[1]:null}if(n===`speed`)return k_(e,t.speed,r);let a=i&&Ts(e,r,T_(D_(t)));return a?G(H(a,i)):null}var j_=(e,t,n)=>y_.has(e)?t-n:n-t,M_=e=>Math.max(1e-4,Math.round(e*1e4)/1e4);function N_(e,t,n,r,i){let a=C_(t,n),o=(n===`moved`||n===`still`)&&!D_(t).startsWith(`object:`),s=n===`moved`||n===`still`?O_(e.out,t,r):null,c=[];for(let o=Math.max(r,e.f0);o<=Math.min(i,e.last);o++){let r=A_(e.out,t,n,o,s);r!==null&&c.push({f:o,v:r,short:j_(n,r,a)})}return{rows:c,from:o?r:void 0}}function P_(e,t){if(e.events.has(t))return e.events.get(t);if(e.visiting.has(t))return null;e.visiting.add(t);let n=e.goals[t],r=x_(n)[0],i=r&&F_(e,t),a;if(i&&!i.wait){let{rows:t}=N_(e,n,r,i.a,i.b);a=t.length?t.find(e=>e.short<=0)?.f??null:void 0}else a=i?.wait?null:void 0;return e.visiting.delete(t),e.events.set(t,a),a}function F_(e,t){let n=e.goals[t],[r,i]=Array.isArray(n.at)?n.at:[n.at,n.at];for(let a of[`after`,`before`]){if(n[a]===void 0)continue;let o=e.names.get(n[a]);if(o===void 0||o===t)return{wait:`${a} "${n[a]}" names no other goal`};let s=P_(e,o);if(s===void 0)return{skip:!0};if(s===null)return{wait:`waits for "${n[a]}" (${a}), which never holds`};if(a===`after`?r=Math.max(r,s+1):i=Math.min(i,s-1),r>i)return{wait:`no frames left ${a} "${n[a]}" (it holds first at f${s}; at is f${Array.isArray(n.at)?`${n.at[0]}-f${n.at[1]}`:n.at})`}}return{a:r,b:i}}function I_(e,t,n,r,i,a){let o=i?`f${n.f}, the best of f${i[0]}-f${i[1]}`:`f${n.f}`;return t===`near`?`${e}: ${Q(n.v)} m at ${o} (needs <= ${r})`:t===`above`?`${e}: ${Q(n.v)} m above at ${o} (needs >= ${r})`:t===`speed`?`${e}: ${Q(n.v)} m/s at ${o} (needs >= ${r})`:t===`still`?`${e}: ${Q(n.v)} m from ${a===void 0?`its scene pose`:`f${a}`} at ${o} (needs <= ${r})`:`${e}: moved ${Q(n.v)} m${a===void 0?``:` from f${a}`} at ${o} (needs >= ${r})`}function L_(e,t,n){let r=e.f0??0;return F_({out:e,goals:t,names:new Map(t.map((e,t)=>[S_(e,t),t])),f0:r,last:r+(e.frames?.length??0)-1,events:new Map,visiting:new Set},n)}function R_(e,t){let n=[],r=[],i=e.f0??0,a={out:e,goals:t,names:new Map(t.map((e,t)=>[S_(e,t),t])),f0:i,last:i+(e.frames?.length??0)-1,events:new Map,visiting:new Set};return t.forEach((e,t)=>{let o=x_(e)[0];if(!o)return;let s=S_(e,t),c=C_(e,o),l=F_(a,t),u=Array.isArray(e.at)?e.at[0]:e.at;if(l.skip)return;if(l.wait){r.push({name:s,kind:o,ok:!1,value:null,at:null,need:c}),u>=i&&u<=a.last&&n.push({kind:`GOAL`,msg:`${s}: ${l.wait}`,frame:u-i,value:.01,limit:0});return}let{rows:d,from:f}=N_(a,e,o,l.a,l.b);if(!d.length)return;o===`moved`&&f!==void 0&&(d=[d.reduce((e,t)=>t.v>e.v?t:e)]);let p=w_(e,o)===`any`,m=Array.isArray(e.at)?l.a!==l.b:!1,h=d.reduce((e,t)=>(p?t.short<e.short:t.short>e.short)?t:e),g=h.short<=0;if(r.push({name:s,kind:o,ok:g,value:Q(h.v),at:h.f,need:c}),!g)for(let e of p?[h]:d.filter(e=>e.short>0))n.push({kind:`GOAL`,msg:I_(s,o,e,c,p&&m?[l.a,l.b]:null,f),frame:e.f-i,value:M_(e.short),limit:0})}),{issues:n,results:r}}var z_=`{ name?, near | above | moved | still | speed, tol?, by?, at, mode?, after?, before? }`,B_=new Set([`near`,`still`]),V_=new Set([`above`,`moved`,`speed`]);function H_(e,t){let n=Number.isFinite(t)&&t!==0?Math.abs(t):.05;return e===`speed`?`speed takes by (the point reaches by m/s): use by: ${n} (m/s), not tol`:e===`above`?`above takes by (a.y - b.y >= by, default 0): use by: ${n} for a at least ${n} m above b, or by: -${n} to let a sit up to ${n} m below b, not tol`:`moved takes by (the object moves >= by, default 0.05): use by: ${n} (metres), not tol`}var U_=e=>typeof e==`string`&&e!==``&&!/^[a-z]+:/.test(e),W_=e=>[`moved`,`still`,`speed`].find(t=>U_(e?.[t]));function G_(e){return Array.isArray(e)&&e.some(W_)?e.map(e=>{let t=W_(e);return t?{...e,[t]:`object:${e[t]}`}:e}):e}function K_(e,t,n,r,i=``){let a=e=>Number.isInteger(e);if(n===void 0)return e(`${t} needs at: a frame or [f0, f1] (absolute frames within 0..${r-1})`);let o=Array.isArray(n)?n:[n,n];if(!(o.length===2&&o.every(a)&&o[0]<=o[1]))return e(`${t}.at must be an integer frame or [f0, f1] with f0 <= f1, got ${Z(n)}`);(o[0]<0||o[1]>r-1)&&e(`${t}.at = ${Z(n)} is outside 0..${r-1} (spec.frames ${r})${o[1]>r-1?i:``}`)}function q_(e,t,n,r,i,a){let o=i[a];if(typeof o!=`string`)return t(`${r}.${a} must be an object id or a point ref (object:<id>[.center|.top|.base], prop:<prop>.<point>, joint:<Bone>, landmark:mouth, anchor:<name>), got ${Z(o)}`);Os(e,t,n,`${r}.${a}`,o)&&a!==`speed`&&!o.startsWith(`object:`)&&(Number.isInteger(i.at)||Array.isArray(i.at)&&i.at[0]===i.at[1])&&t(`${r}.${a} "${o}" measures ${a===`moved`?`how far the point gets`:`how far the point strays`} from where it is at at[0], so at must be [f0, f1] with f0 < f1, got ${Z(i.at)}`)}function J_(e,t,n,r,i,a){let o=`goals[${i}]`,s={sk:n.sk,scene:n.scene},c=n.unknown??t;if(!r||typeof r!=`object`||Array.isArray(r))return t(`${o} must be ${z_}, got ${Z(r)}`);for(let e of Object.keys(r))Za.includes(e)||c(`${o} has unknown field "${e}"${xo(e,Za)} (fields: ${Za.join(`, `)})`);r.name!==void 0&&(typeof r.name!=`string`||!r.name.trim()?t(`${o}.name must be a non-empty string, got ${Z(r.name)}`):a.has(r.name)?t(`${o}.name "${r.name}" is already used by goals[${a.get(r.name)}]; goal names must differ`):a.set(r.name,i));let l=x_(r),u=l[0];if(l.length||t(`${o} needs one predicate: ${__.join(`, `)}`),l.length>1&&t(`${o} names ${l.join(` and `)}; a goal takes exactly one of ${__.join(`, `)} (split it into ${l.length} goals)`),l.length===1&&b_.has(u))q_(e,t,s,o,r,u);else if(l.length===1){let n=r[u];Array.isArray(n)&&n.length===2&&n.every(e=>typeof e==`string`)?n.forEach((n,r)=>Os(e,t,s,`${o}.${u}[${r}]`,n)):t(`${o}.${u} must be [ref, ref] (two point refs), got ${Z(n)}`)}r.tol!==void 0&&(l.length===1&&!B_.has(u)?t(`${o}.tol applies to near and still; ${H_(u,r.tol)}`):Number.isFinite(r.tol)&&r.tol>=0||t(`${o}.tol must be a number >= 0 (metres), got ${Z(r.tol)}`)),r.by===void 0?u===`speed`&&l.length===1&&t(`${o}.speed needs by: the speed the point must reach, in m/s (e.g. by: 2)`):l.length===1&&!V_.has(u)?t(`${o}.by applies to above, moved and speed; ${u} takes tol`):(!Number.isFinite(r.by)||u===`moved`&&r.by<0||u===`speed`&&r.by<=0)&&t(`${o}.by must be a ${u===`moved`?`number >= 0 (metres)`:u===`speed`?`number > 0 (m/s)`:`finite number (metres)`}, got ${Z(r.by)}`),r.mode!==void 0&&r.mode!==`all`&&r.mode!==`any`&&t(`${o}.mode must be "all" or "any", got ${Z(r.mode)}`),K_(t,o,r.at,n.frames,n.past)}function Y_(e,t){let n=new Map(e.map((e,t)=>[e&&typeof e==`object`?S_(e,t):`goals[${t}]`,t])),r=e.map((e,r)=>[`after`,`before`].flatMap(i=>{if(!e||typeof e!=`object`||e[i]===void 0)return[];let a=n.get(e[i]);return typeof e[i]!=`string`||a===void 0?(t(`goals[${r}].${i} must name another goal (its name, or goals[<i>] when it has none), got ${Z(e[i])}${typeof e[i]==`string`?xo(e[i],[...n.keys()]):``}`),[]):a===r?(t(`goals[${r}].${i} names the goal itself; name the goal whose first met frame this one waits for`),[]):[a]})),i=e.map(()=>0),a=[],o=n=>{if(i[n]!==2){if(i[n]===1){let r=a.slice(a.indexOf(n)).map(t=>`"${S_(e[t],t)}"`);return t(`goals wait on each other through after/before: ${[...r,r[0]].join(` -> `)}; one of them must not wait`)}i[n]=1,a.push(n);for(let e of r[n])o(e);a.pop(),i[n]=2}};e.forEach((e,t)=>o(t))}function X_(e,t,n){if(e.goals===void 0)return;if(!Array.isArray(e.goals))return t(`spec.goals must be an array of goals ${z_}, got ${Z(e.goals)}`);let r=new Map;e.goals.forEach((i,a)=>J_(e,t,n,i,a,r)),Y_(e.goals,t)}var Z_=new Set([`l`,`r`]),Q_=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function $_(e,t,n,r){if(Q_(n))for(let i of Object.keys(n))r.includes(i)||e(`${t} has unknown field "${i}"${vo(i,r)} (fields: ${r.join(`, `)})`)}function ev(e,t,{sk:n,scene:r,unknown:i=t}){for(let[a,o]of Object.entries(e.anchors??{})){let s=`anchors.${a}`;if(/_[lr]$/.test(a)&&t(`${s}: an anchor name may not end in _l or _r (the weight channel w_${a}_l would read as anchor "${a.slice(0,-2)}"); the side goes on the weight channel, so name it "${a.slice(0,-2)}"`),!o||!Ha[o.kind]){t(`${s}.kind must be one of ${Object.keys(Ha).join(`, `)}, got ${Z(o?.kind)}`);continue}$_(i,`${s} (${o.kind})`,o,[`kind`,...Ha[o.kind]]);for(let e of[`p`,`offset`,`local`])o[e]!==void 0&&!yo(o[e])&&t(`${s}.${e} must be [x, y, z], got ${Z(o[e])}`);(o.kind===`world`||o.kind===`body`)&&o.p===void 0&&t(`${s} (${o.kind}) needs p: [x, y, z]${o.kind===`body`?`, ${mo.pole}`:``}`),o.kind===`bone`&&ko(t,n,s,o.bone),o.kind===`segment`&&(ko(t,n,`${s}.from`,o.from),ko(t,n,`${s}.to`,o.to),o.reach!==void 0&&!Z_.has(o.reach)&&t(`${s}.reach must be "l" or "r"`)),o.kind===`object`&&Ao(t,r,s,o.object,{groups:!0})&&(o.grasp!==void 0&&!co.includes(o.grasp)&&t(`${s}.grasp must be one of ${co.join(`, `)}, got ${Z(o.grasp)}`),o.socket!==void 0&&r?.objects&&!ts(r,o.object,o.socket)&&t(`${s}.socket: "${o.object}" has no socket ${Z(o.socket)} (sockets: ${es(r,o.object).map(e=>e.name).join(`, `)||`none`})`),o.socket!==void 0&&o.grasp===void 0&&t(`${s}.socket needs grasp (${co.join(`, `)}): the socket says how the hand takes it`)),o.kind===`person`&&!Go(r,o.person,o.bone??``,0)&&t(`${s} (person) needs person: the id of another character with an installed take (people: ${Ko(r)}) and bone: one of its joints, got ${Z(o.person)} ${Z(o.bone)}`),o.kind===`landmark`&&o.name!==`mouth`&&t(`${s}: the only landmark is "mouth", got ${Z(o.name)}`),o.kind===`prop`&&!e.props?.[o.prop]?.points?.[o.point]&&o.point!==`origin`&&t(`${s} needs prop point ${o.prop}.${o.point}, which spec.props does not define`)}}function tv(e,t,{sk:n,unknown:r=t}){for(let[i,a]of Object.entries(e.props??{})){let e=`props.${i}`;$_(r,e,a,Ua),Z_.has(a?.hand)||t(`${e}.hand must be "l" or "r", got ${Z(a?.hand)}`),!Array.isArray(a?.origin)||!a.origin.length?t(`${e}.origin must list one or more bones`):a.origin.forEach(r=>ko(t,n,`${e}.origin`,r));for(let[n,r]of Object.entries(a?.points??{}))yo(r)||t(`${e}.points.${n} must be [d, l, n] along the palm axes, got ${Z(r)}`)}(e.fits??[]).forEach((i,a)=>{let o=`fits[${a}]`;$_(r,o,i,Wa),Z_.has(i?.side)||t(`${o}.side must be "l" or "r", got ${Z(i?.side)}`),e.anchors?.[i?.anchor]||t(`${o}.anchor "${i?.anchor}" is not in spec.anchors${xo(String(i?.anchor),Object.keys(e.anchors??{}))}`);let s=i?.effector;s?.prop===void 0?Array.isArray(s?.joints)?s.joints.forEach(e=>ko(t,n,`${o}.effector`,e)):t(`${o}.effector must be { prop, point } or { joints: [bone, ...] }`):e.props?.[s.prop]?.points?.[s.point]||t(`${o}.effector ${s.prop}.${s.point} is not a point of spec.props`),i?.offset!==void 0&&!yo(i.offset)&&t(`${o}.offset must be [x, y, z]`),i?.orient!==void 0&&typeof i.orient!=`boolean`&&t(`${o}.orient must be true or false (false: the hand takes no grip turn), got ${Z(i.orient)}`)})}function nv(e,t,{frames:n,unknown:r=t,past:i=``}){(e.generators??[]).forEach((e,a)=>{let o=`generators[${a}]`;if(e?.type!==`walk`)return t(`${o}.type must be "walk", got ${Z(e?.type)}`);$_(r,o,e,Ja),(!Number.isInteger(e.f0)||e.f0<0||e.f0>n-1)&&t(`${o}.f0 must be an integer frame within 0..${n-1}, got ${Z(e.f0)}${e.f0>n-1?i:``}`),e.heading!==void 0&&!(Array.isArray(e.heading)&&e.heading.length===2&&e.heading.every(Number.isFinite))&&t(`${o}.heading must be [h0, h1] in degrees (${mo.yaw}), got ${Z(e.heading)}`);for(let n of Ja.slice(2))n!==`heading`&&e[n]!==void 0&&!Number.isFinite(e[n])&&t(`${o}.${n} must be a finite number, got ${Z(e[n])}`);e.steps!==void 0&&!(Number.isInteger(e.steps)&&e.steps>=1)&&t(`${o}.steps must be an integer >= 1, got ${Z(e.steps)}`),e.turnDistance!==void 0&&!(e.turnDistance>0)&&t(`${o}.turnDistance must be > 0 m, got ${Z(e.turnDistance)}`)})}function rv(e,t,{sk:n,scene:r,frames:i,unknown:a=t,past:o=``}){let s=e.checks??{};for(let e of Object.keys(s))Ya.includes(e)||a(`checks.${e} is not a check${xo(e,Ya)} (checks: ${Ya.join(`, `)})`);let c=(e,n=()=>{})=>{let r=s[e],i=`{ ${Xa[e].join(`, `)} }`;if(r!==void 0){if(!Array.isArray(r))return t(`checks.${e} must be an array of ${i}, got ${Z(r)}`);r.forEach((r,o)=>{if(!Q_(r))return t(`checks.${e}[${o}] must be ${i}, got ${Z(r)}`);$_(a,`checks.${e}[${o}]`,r,Xa[e]),n(r,o)})}},l=(e,n)=>{n!==void 0&&typeof n!=`string`&&(Array.isArray(n)&&n.length===2&&n.every(Number.isInteger)&&n[0]<=n[1]&&n[0]>=0&&n[1]<=i-1||t(`${e}.when must be a weight channel or [f0, f1] within 0..${i-1}, got ${Z(n)}${Array.isArray(n)&&n[1]>i-1?o:``}`))};c(`contacts`,(r,i)=>{jo(e,t,n,`checks.contacts[${i}].point`,r.point),jo(e,t,n,`checks.contacts[${i}].target`,r.target),l(`checks.contacts[${i}]`,r.when)}),c(`orient`,(r,i)=>{jo(e,t,n,`checks.orient[${i}].from`,r.from),jo(e,t,n,`checks.orient[${i}].to`,r.to),l(`checks.orient[${i}]`,r.when),r.along===`face`||r.along===`up`||yo(r.along)||t(`checks.orient[${i}].along must be "face", "up" or [x, y, z]`)}),c(`below`,(e,r)=>{ko(t,n,`checks.below[${r}].joint`,e.joint),ko(t,n,`checks.below[${r}].ref`,e.ref),l(`checks.below[${r}]`,e.when)}),c(`clearance`,(e,n)=>{Ao(t,r,`checks.clearance[${n}]`,e.object),l(`checks.clearance[${n}]`,e.frames)}),c(`appear`,(r,i)=>{ko(t,n,`checks.appear[${i}].joint`,r.joint),e.anchors?.[r.anchor]||t(`checks.appear[${i}].anchor "${r.anchor}" is not in spec.anchors`)}),c(`supports`,(e,n)=>Ao(t,r,`checks.supports[${n}]`,e.object)),c(`allow`);for(let e of Object.keys(s.limits??{}))e in gl||a(`checks.limits.${e} is not a QA limit${xo(e,Object.keys(gl))}`);let u=e.fix;if(u!==void 0&&u!==!1&&(typeof u!=`object`||!u))t(`spec.fix must be false or { ${_g.join(`, `)} }`);else for(let e of Object.keys(u||{}))_g.includes(e)||a(`spec.fix.${e} is not a fix${xo(e,_g)} (fixes: ${_g.join(`, `)})`);u&&u.grasp!==void 0&&typeof u.grasp!=`boolean`&&t(`spec.fix.grasp must be true (fingers close on what a hand holds, the default) or false (the preset grip, the object at its grab-frame offset), got ${Z(u.grasp)}`)}function iv(e,t,n){ev(e,t,n),tv(e,t,n),h_(e,t,n),nv(e,t,n),rv(e,t,n),X_(e,t,n)}var av=12;function ov(e){let t=new Set(e.channels??[]);for(let n of Object.values(e.objects??{}))for(let e of[n?.channel,n?.visible,n?.level])typeof e==`string`&&e&&t.add(e);let n=e.checks??{},r=e=>Array.isArray(e)?e.filter(e=>e&&typeof e==`object`):[];for(let e of[n.contacts,n.orient,n.below,n.clearance].flatMap(r))typeof e.when==`string`&&t.add(e.when);for(let e of r(n.appear))typeof e.channel==`string`&&t.add(e.channel);return t}function sv(e,t,n,r){if(no.has(n)){if(!yo(r))return e(`${t} ${n} must be [x, y, z] (3 finite numbers), got ${Z(r)}`);if(ro.has(n)){let i=Math.hypot(...r);if(i<1e-6)return e(`${t} ${n} = ${Z(r)} has no direction; a pole is a ${mo.pole}`);n.startsWith(`knee`)&&r[2]<-.7*i&&e(`${t} ${n} = ${Z(r)} points backward; knees bend toward +z. A pole is a ${mo.pole}`)}n.startsWith(`foot`)&&r[1]<.04&&e(`${t} ${n} y = ${r[1]} puts the ankle into the floor; foot_* is the ${mo.foot}`);return}if(ao.has(n)){if(!r||typeof r!=`object`||Array.isArray(r))return e(`${t} ${n} must be { preset: weight }, presets ${so.join(`, `)}; got ${Z(r)}`);for(let[i,a]of Object.entries(r))so.includes(i)?Number.isFinite(a)&&a>=0&&a<=1||e(`${t} ${n}.${i} must be a weight within 0..1, got ${Z(a)}`):e(`${t} ${n} preset "${i}" is unknown${xo(i,so)} (presets: ${so.join(`, `)})`);return}if(!Number.isFinite(r))return e(`${t} ${n} must be a finite number${n===`yaw`?` (degrees; ${mo.yaw})`:n.startsWith(`fyaw`)?` (${mo.fyaw})`:``}, got ${Z(r)}`);let i=po(n);i&&(r<i[1]||r>i[2])&&e(`${t} ${n} = ${r} is outside ${i[1]}..${i[2]} (${i[3]})`)}var cv=e=>Array.isArray(e)?e:[],lv=e=>Array.isArray(e)?e[1]:e;function uv(e,t){let n=[...cv(e.keys).map(e=>e?.f),...cv(e.generators).map(e=>e?.f0)].filter(Number.isInteger),r=e.checks??{},i=[...[`contacts`,`orient`,`below`].flatMap(e=>cv(r[e]).map(e=>lv(e?.when))),...cv(r.clearance).map(e=>lv(e?.frames)),...cv(e.goals).map(e=>lv(e?.at))].filter(Number.isInteger),a=Math.max(t-1,...n,...i)+1;return`; set frames >= ${a}${Math.max(0,...n)+1>=a?` or frames: "auto"`:``}`}function dv(e,t,n,r,i=``){if(e.keys!==void 0&&!Array.isArray(e.keys))return t(`spec.keys must be an array of { f, set, step? }`);let a=Object.keys(e.anchors??{}),o=ov(e),s=[...no,...io,...ao,...o,...a.flatMap(e=>[`w_${e}_l`,`w_${e}_r`])];(e.keys??[]).forEach((e,c)=>{let l=e?.src?e.src.startsWith(`keys[`)?e.src:`${e.src} key`:`keys[${c}]`;if(!e||typeof e!=`object`)return t(`${l} must be { f, set, step? }`);for(let t of Object.keys(e))Ba.includes(t)||r(`${l} has unknown field "${t}"${vo(t,Ba)}; a key is { f, set, step? }`);if(!Number.isInteger(e.f))return t(`${l}.f must be an integer frame, got ${Z(e.f)}`);(e.f<0||e.f>n-1)&&t(`${l}.f = ${e.f} is outside 0..${n-1} (spec.frames ${n})${e.f>0?i:``}`);let u=`${l} (f${e.f})`;if(!e.set||typeof e.set!=`object`||Array.isArray(e.set))return t(`${u} needs set: { channel: value }`);for(let[n,r]of Object.entries(e.set)){let e=/^w_(.+)_([lr])$/.exec(n);e&&!a.includes(e[1])?t(`${u} sets ${n}, but there is no anchor "${e[1]}"${xo(n,s)}`):e||no.has(n)||io.has(n)||ao.has(n)?sv(t,u,n,r):o.has(n)||n.endsWith(`_vis`)?Number.isFinite(r)||t(`${u} ${n} must be a finite number, got ${Z(r)}`):t(`${u} sets unknown channel "${n}"${xo(n,s)}`)}for(let n of e.step??[])n in e.set||t(`${u} step names "${n}", which this key does not set`);e.step!==void 0&&!Array.isArray(e.step)&&t(`${u} step must be an array of channel names`)})}function fv(e,t,n){if(e===void 0||e===!1)return;if(!e||typeof e!=`object`||Array.isArray(e))return t(`spec.flow must be false or { smooth?, lag? }, got ${Z(e)}`);for(let t of Object.keys(e))t!==`smooth`&&t!==`lag`&&n(`spec.flow has unknown field "${t}" (fields: smooth, lag)`);e.smooth!==void 0&&typeof e.smooth!=`boolean`&&t(`spec.flow.smooth must be true or false, got ${Z(e.smooth)}`);let r=e=>Number.isFinite(e)&&e>=0&&e<=6,i=e.lag;if(!(i===void 0||i===!1||r(i))){if(!i||typeof i!=`object`||Array.isArray(i))return t(`spec.flow.lag must be false, 0..6 frames or { spine?, head?, arms? }, got ${Z(i)}`);for(let[e,a]of Object.entries(i))[`spine`,`head`,`arms`].includes(e)?r(a)||t(`spec.flow.lag.${e} must be 0..6 frames, got ${Z(a)}`):n(`spec.flow.lag has unknown field "${e}" (fields: spine, head, arms)`)}}function pv(e,{sk:t,scene:n,lenient:r=!1}={}){let i=[],a=e=>{i.length<av&&i.push(e)},o=r?()=>{}:a;if(!e||typeof e!=`object`)throw Error(`MOTION_SPEC_INVALID: spec must be an object`);e.schema!==`cozyclay.motion-spec.v1`&&a(`spec.schema must be "cozyclay.motion-spec.v1", got ${Z(e.schema)}`);for(let t of Object.keys(e))za.includes(t)||o(`spec.${t} is not a spec field${xo(t,za)} (fields: ${za.join(`, `)})`);e.fps!==void 0&&e.fps!==24&&a(`spec.fps must be 24, the timeline rate, got ${Z(e.fps)}`),fv(e.flow,a,o);let s=e.frames;(!Number.isInteger(s)||s<1||s>2e4)&&a(`spec.frames must be an integer 1..20000 or "auto", got ${Z(s)}`);let c=Number.isInteger(s)?uv(e,s):``;if(dv(e,a,Number.isInteger(s)?s:2e4,o,c),iv(e,a,{sk:t,scene:n,frames:Number.isInteger(s)?s:2e4,lenient:r,unknown:o,past:c}),i.length)throw Error(`MOTION_SPEC_INVALID: ${i.join(`
7
- `)}${i.length>=av?`
8
- (more problems not listed)`:``}`)}function mv(e,t,n){let{s:r,diag:i,c:a}=e.frames[t],[o,s]=n.split(/:(.*)/s);if(o===`joint`)return r.P[e.ctx.sk.index[s]];if(o===`prop`){let[e,t]=s.split(`.`);return i.props?.[e]?.[t]??null}if(o===`anchor`)return ds(e.ctx,s,r,i,a);throw Error(`MOTION_SPEC_INVALID: check point "${n}"`)}function hv(e,t,n){let r=/^prop:([^.]+)\./.exec(t)?.[1],i=e.ctx.spec.props?.[r]?.hand,{spec:a,scene:o}=e.ctx;return i?Object.keys(a.objects??{}).find(t=>Ma(a,a.objects[t],o,t)&&sf(e,t,n)===i)??null:null}function gv(e,t){let[n,r]=t.split(/:(.*)/s),i=n===`anchor`?e.ctx.spec.anchors?.[r]:null;return i?.kind!==`object`||!i.grasp?null:e.ctx.sockets?.get(r)?.owner??i.object}var _v=(e,t,n)=>Array.isArray(n)?t+(e.f0??0)>=n[0]&&t+(e.f0??0)<=n[1]:!n||(e.frames[t].c[n]??0)>.99;function vv(e,t,n){return n===`up`?[0,1,0]:n===`face`?Er(e.ctx.sk,e.frames[t].s,e.ctx.sk.index.Head,[0,0,1]):K(n)}function yv(e,t={}){let n=[],r=e.frames.length,i=e.ctx.sk.index,a=(e,t,r,i,a)=>n.push({kind:e,msg:t,frame:r,value:+i.toFixed(4),limit:a});for(let n=0;n<r;n++){for(let r of t.contacts??[])if(_v(e,n,r.when)){let t=mv(e,n,r.point),i=mv(e,n,r.target);if(!t||!i)continue;let o=gv(e,r.target)??hv(e,r.point,n+(e.f0??0)),s=o?Es(e,n,r.point,`object:${o}`)??G(H(t,i)):G(H(t,i));s>(r.tol??.01)&&a(`CONTACT`,`${r.name}: ${(s*100).toFixed(1)} cm apart`,n,s,r.tol??.01)}for(let r of t.orient??[])if(_v(e,n,r.when)){let t=mv(e,n,r.from),i=mv(e,n,r.to);if(!t||!i)continue;let o=W(K(H(i,t)),vv(e,n,r.along));o<(r.minCos??.64)&&a(`ORIENT`,`${r.name}: cos ${o.toFixed(2)}`,n,o,r.minCos??.64)}for(let r of t.below??[])if(_v(e,n,r.when)){let{P:t}=e.frames[n].s,o=t[i[r.ref]][1]-t[i[r.joint]][1];o<(r.min??.08)&&a(`BELOW`,`${r.name}: ${r.joint} only ${(o*100).toFixed(1)} cm below ${r.ref}`,n,o,r.min??.08)}for(let r of t.clearance??[])if(_v(e,n,r.frames)){let t=e.objectsAt(n)[r.object],o=ua.find(e=>e[0]===r.part);if(!t||!o)continue;let{P:s}=e.frames[n].s,c=Math.min(...da(s[i[o[1]]],s[i[o[2]]]).map(e=>fa(e,t)))-o[3];c<r.min&&a(`CLEARANCE`,`${r.name}: ${(c*100).toFixed(1)} cm`,n,c,r.min)}}for(let n of t.appear??[])for(let t=1;t<r;t++){if((e.frames[t-1].c[n.channel]??0)>.5==(e.frames[t].c[n.channel]??0)>.5)continue;let r=G(H(mv(e,t,`joint:${n.joint}`),mv(e,t,`anchor:${n.anchor}`)));r>(n.tol??.035)&&a(`APPEAR`,`${n.name}: switches with the hand ${(r*100).toFixed(1)} cm from ${n.anchor}`,t,r,n.tol??.035)}return n}var bv=/^(.+): [\d.]+ cm off its keys$/,xv={twist:`twist about the forearm`,flex:`flex`,dev:`deviation (+ toward the thumb)`};function Sv(e,t){let n=e.objects[t]??Io(e)[t];return Ud(e,t).flatMap(t=>{let r=e.objects[t],i=Xf(n,r),[a,o,s]=r.half;return[-a,a].flatMap(e=>[0,2*o].flatMap(t=>[-s,s].map(n=>V(i.pos,J(i.R,[e,t,n])))))})}function Cv(e,t,n){let{scene:r}=e.ctx,i=e.f0??0;for(let[a]of zu(e.ctx.spec)){let o=Iu(e,a),s=Sv(r,a);if(s.length)for(let r=Math.max(i,Math.ceil(o.t[0]));r<=Math.min(i+e.frames.length-1,Math.floor(o.t[o.t.length-1]));r++){let c=Lu(o,r),l=af(e,a,r),u=Math.max(...s.map(e=>ar(V(c.pos,J(c.R,e)),V(l.pos,J(l.R,e)))));u>t.reach&&n(`REACH`,`${a}: ${(u*100).toFixed(1)} cm off its keys`,r-i,u,t.reach)}}}function wv(e,t){let n=bv.exec(t.subject)?.[1],r=e.spec?.objects?.[n];if(!r?.keys?.length)return null;let i=t.worstFrame,a=e.spec.props?.[r.prop]?.hand,o=e.fr(i).diag[`hold_${a}`]??{},s=r.keys.reduce((e,t,n)=>Math.abs(t.f-i)<Math.abs(r.keys[e].f-i)?n:e,0),c=Object.entries(ji).filter(([e,[t,n]])=>o[e]<t||o[e]>n).map(([e,[t,n]])=>`the wrist ${xv[e]} needs ${Math.round(o[e])}deg (limit ${t}..${n})`);c.length&&(c[c.length-1]+=` after the elbow swung ${Math.round(o.swivel??0)}deg and the forearm turned`);let l=o.miss>.005&&o.fold,u=l?`the grip is ${(o.miss*100).toFixed(1)} cm inside the forearm's reach (the elbow would fold ${Math.round(o.fold)}deg; it bends to 145deg and stops at 150deg)`:`the arm is ${(o.miss*100).toFixed(1)} cm short`,d=[...o.miss>.005?[u]:[],...c],f=r.keys[s].aim&&r.keys[s].roll===void 0?``:`; an aim key without roll takes the roll the arm holds most easily`;return{cause:`objects.${n}.keys[${s}] f${r.keys[s].f}`,hint:`${n} at f${i}: ${d.length?d.join(`, `):`the hand cannot hold it there`}; ${l?`key a pose farther from the shoulder, or turn or move the body away from it`:`key a pose nearer the hand, or bring the body to it`} (root, yaw, spine_yaw)${f}`}}var Tv=e=>Math.round(e*10)/10,Ev=e=>Math.round(e*100)/100,Dv=`held: per key, deg = the drawn +Y off the asked one (aim, or rot's +Y), cm = the drawn base off pos, got = the drawn +Y (when 1 deg off or more), rot = what an aim key used`;function Ov(e){let t=zu(e.ctx.spec);return t.length?Object.fromEntries(t.map(([t,n])=>{let r=Iu(e,t);return[t,[...n.keys].sort((e,t)=>e.f-t.f).map((n,i)=>{let a=af(e,t,Math.round(r.t[i])),o=[a.R[0][1],a.R[1][1],a.R[2][1]],s=Tv(vr(n.aim?K(n.aim):J(_r(r.q[i]),[0,1,0]),o));return{f:n.f,deg:s,cm:Tv(ar(n.pos,a.pos)*100),...s>=1?{got:o.map(Ev)}:{},...n.aim?{rot:r.rots[i]}:{}}})]})):null}var kv=3,Av=.03,jv=e=>V(e.pos,J(e.R,[0,e.half[1],0])),Mv=(e,t)=>[e[0][t],e[1][t],e[2][t]];function Nv(e,t,n=null){let r=H(jv(e),jv(t)),i=[0,1,2].map(t=>Mv(e.R,t)),a=[0,1,2].map(e=>Mv(t.R,e)),o=[...i,...a,...i.flatMap(e=>a.map(t=>ir(e,t)))],s={depth:1/0,axis:[0,1,0]};for(let c of o){if(G(c)<1e-6)continue;let o=K(c),l=(e,t)=>t.reduce((t,n,r)=>t+Math.abs(W(n,o))*e.half[r],0),u=l(e,i)+l(t,a);if(u-Math.abs(W(r,o))<=0)return{depth:u-Math.abs(W(r,o)),axis:o};let d=W(n??r,o)<0?U(o,-1):o,f=u-W(r,d);f<s.depth&&(s={depth:f,axis:d})}return s}var Pv=(e,t,n,r)=>{let i=n===`l`?`Left`:`Right`,a=U(V(t.P[e.index[`${i}HandIndex2`]],t.P[e.index[`${i}HandMiddle2`]]),.5);return r.some(e=>fa(a,e)<=0)},Fv=(e,t,n)=>!t.visible||(e.baked?.[t.visible]?.[n]??0)>.5,Iv=(e,t,n)=>Ud(e.ctx.scene,t).map(t=>({...e.ctx.scene.objects[t],...$d(e,t,n)}));function Lv(e,t,n){let{sk:r,spec:i}=e.ctx,a=e.frames[n-(e.f0??0)];if(!a)return null;let o=Kf(r,i,a.s,i.objects[t]);return Math.max(0,Math.min(...Iv(e,t,n).map(e=>fa(o,e))))}function Rv(e,t,n){let r=Iv(e,t,n);if(!r.length)return null;let i=Math.min(...r.map(e=>e.pos[1]-Math.abs(e.R[1][0])*e.half[0]-Math.abs(e.R[1][2])*e.half[2])),a=U(r.map(jv).reduce((e,t)=>V(e,t),[0,0,0]),1/r.length),o=[a[0],i-.01,a[2]],s=null;for(let[t,r]of Object.entries(e.ctx.objectsAt(n))){if(r.carried||!r.half)continue;let e=fa(o,r);e<=.02&&(!s||e<s[1])&&(s=[t,e])}return s?.[0]??null}function zv(e,t,n){let r=Object.entries(t.ctx.spec.objects??{}).filter(([,e])=>Hf(e));if(!r.length)return[];let i=n.checks??{},a={...gl,...i.limits},o=i.allow,s=[],c=t.f0??0,l=e.index,u=(e,t,n,r,i)=>s.push({kind:e,msg:t,frame:n,value:+r.toFixed(4),limit:i}),d=(e,t)=>e.reduce((e,n)=>t.reduce((e,t)=>e??yl(o,n,t),e),null)??a.allow;for(let[i,o]of r){let[r,s]=qd(t,o),f=n.props?.[o.prop]?.hand,p=new Set([`hand_${f}`,`farm_${f}`]);if(o.grab!==void 0&&r>0&&t.frames[r-c]&&Fv(t,o,r-1)){let e=Lv(t,i,r),n=[o.fall??[]].flat().some(e=>Array.isArray(e.v)&&e.at<r);n&&e>Av?u(`CATCH`,`${i} missed by ${(e*100).toFixed(1)} cm`,r-c,e,Av):!n&&e>a.grab&&u(`GRAB`,`${i}: hand ${(e*100).toFixed(1)} cm from it at grab`,r-c,e,a.grab)}let m=o.grab===void 0?null:Rv(t,i,r),h=e=>Math.abs(e-r)<=kv||o.release!==void 0&&Math.abs(e-s)<=kv;for(let n=0;n<t.frames.length;n++){let a=n+c,s=of(t,i,a);if(!s||!Fv(t,o,a))continue;let f=s.map(e=>e.id),g=s.map(e=>[e,jv(e),G(e.half)]),{s:_}=t.frames[n],v=Object.entries(t.frames[n].diag).filter(([t,n])=>/^hold_[lr]$/.test(t)&&n?.second===i&&(n.w>=.5||Pv(e,_,t.slice(-1),s))).map(([e])=>`hand_${e.slice(-1)}`);for(let[e,t,r,a]of ua){if(p.has(e)||v.includes(e))continue;let o=_.P[l[t]],s=_.P[l[r]],c=U(V(o,s),.5),m=a+ar(o,s)/2,h=d([e],[i,...f]),y=null,b=-1/0;for(let[e,t,n]of g)m-(ar(c,t)-n)<=h||(y??=da(o,s),b=Math.max(b,a-Math.min(...y.map(t=>fa(t,e)))));b>h&&u(`COLLIDE`,`${e} x ${i}`,n,b,h)}if(!(a<r))for(let[e,r]of Object.entries(t.objectsAt(n))){if(!r.half||r.ignore||e===m&&h(a))continue;let t=d([i,...f],[e]),o=jv(r),s=G(r.half),c=-1/0;for(let[e,n,i]of g)ar(n,o)<i+s+t&&(c=Math.max(c,Nv(e,r).depth));c>t&&u(`COLLIDE`,`${i} x ${e}`,n,c,t)}}}return Cv(t,a,u),s}var Bv=.009,Vv=.022,Hv=.004,Uv=.995,Wv=.01,Gv=120,Kv=150,qv=-.3,Jv=[`Index`,`Middle`,`Ring`,`Pinky`],Yv={l:`Left`,r:`Right`};function Xv(e,t){let n=Ud(e,t),r=n.length===1?ba(e.objects[n[0]]).kind:`box`;return r===`sphere`?`spherical`:r===`cylinder`?`power`:null}function Zv(e){let{spec:t,scene:n}=e.ctx,r=[],i=t.fix?.grasp===!1?{...t,fix:{...t.fix,grasp:!0}}:t;for(let[t,a]of Object.entries(i.objects??{})){if(!Hf(a)||!Ma(i,a,n,t))continue;let o=i.props?.[a.prop]?.hand,[s,c]=qd(e,a);o&&r.push({id:t,k:o,grasp:a.grasp??Xv(n,t),from:s+4+1,to:c})}for(let t of i.fits??[]){let n=i.anchors?.[t.anchor];if(n?.kind!==`object`||!n.grasp||e.ctx.sockets?.get(t.anchor)?.rim)continue;let a=`w_${t.anchor}_${t.side}`,o=e.f0??0,s=e.baked?.[`fingers_${t.side}`],c=e=>Object.entries(s?.[e]??{}).reduce((e,[t,n])=>e+(t===`relaxed`?0:n||0),0);r.push({id:n.object,k:t.side,grasp:n.grasp,from:o,to:o+e.frames.length-1,held:t=>(e.baked?.[a]?.[t]??0)>=Uv&&c(t)>=Uv,rests:!0})}return r}var Qv=(e,t,n)=>Ud(e.ctx.scene,t).map(t=>({...e.ctx.scene.objects[t],...cf(e,t,n)}));function $v(e,t,n){let r=Yv[n],i=n=>t.P[e.index[`${r}Hand${n}`]],a=[{bone:`${r}Hand`,finger:`palm`,a:t.P[e.index[`${r}Hand`]],b:i(`Middle1`),r:Vv}];for(let e of[...Jv,`Thumb`])for(let t=1;t<=3;t++)a.push({bone:`${r}Hand${e}${t}`,finger:e,tip:t===3,a:i(`${e}${t}`),b:i(`${e}${t+1}`),r:Bv});return a}function ey(e,t){return e.map(e=>{let n={depth:-1/0};for(let r of t){let t=Ea(r,e.a,e.b,e.r);t>n.depth&&(n={depth:t,entry:r})}let r=U(V(e.a,e.b),.5),i=n.entry&&Ta(n.entry,r);return{...e,depth:n.depth,at:i,normal:n.entry&&wa(n.entry,r)}})}function ty(e,t){if(!t.length)return 1/0;let n=[e[0],e[2]],r=t.map(e=>[e[0],e[2]]),i=(e,t)=>{let r=[t[0]-e[0],t[1]-e[1]],i=Math.max(0,Math.min(1,((n[0]-e[0])*r[0]+(n[1]-e[1])*r[1])/(r[0]**2+r[1]**2||1)));return Math.hypot(n[0]-e[0]-i*r[0],n[1]-e[1]-i*r[1])},a=ny(r);return a.length>=3&&a.every((e,t)=>{let r=a[(t+1)%a.length];return(r[0]-e[0])*(n[1]-e[1])-(r[1]-e[1])*(n[0]-e[0])>=0})?0:Math.min(...a.map((e,t)=>i(e,a[(t+1)%a.length])))}function ny(e){let t=[...e].sort((e,t)=>e[0]-t[0]||e[1]-t[1]),n=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]);if(t.length<3)return t;let r=[],i=[];for(let e of t){for(;r.length>=2&&n(r.at(-2),r.at(-1),e)<=0;)r.pop();r.push(e)}for(let e of t.reverse()){for(;i.length>=2&&n(i.at(-2),i.at(-1),e)<=0;)i.pop();i.push(e)}return[...r.slice(0,-1),...i.slice(0,-1)]}function ry(e,t,n,r,i,a){let o=ey($v(e,t,n.k),r),s=Yv[n.k].toLowerCase();if(n.rests&&o[0].depth<-.03)return;for(let e of o)e.finger!==`palm`&&e.depth>Hv&&i(`FINGER_PEN`,`${e.bone} into ${n.id}`,a,e.depth,Hv);let c=e=>o.some(t=>t.finger===e&&t.tip&&t.depth>=-.008),l=Jv.filter(c).length,u=c(`Thumb`);(n.grasp===`pinch`?u&&c(`Index`):l>=3||u&&l>=2)||i(`FINGER_GAP`,`${s} fingers off ${n.id}`,a,l+ +!!u,n.grasp===`pinch`?2:3);let d=o.filter(e=>e.depth>=-.008&&e.normal),f=U(r.reduce((e,t)=>V(e,V(t.pos,J(t.R,[0,t.half[1],0]))),[0,0,0]),1/r.length),p=d.filter(e=>e.normal[1]<=qv).map(e=>e.at),m=d.filter(e=>e.finger===`Thumb`).map(e=>e.normal),h=d.filter(e=>Jv.includes(e.finger)).map(e=>e.normal),g=e=>e.length?K(e.reduce(V,[0,0,0])):null,_=g(m),v=g(h),y=_&&v&&Math.acos(Math.max(-1,Math.min(1,W(_,v))))*180/Math.PI>=Gv,b=(e,t)=>Math.acos(Math.max(-1,Math.min(1,W(e,t))))*180/Math.PI,x=d.some((e,t)=>d.slice(t+1).some(t=>b(e.normal,t.normal)>=Kv));!n.rests&&!y&&!x&&ty(f,p)>Wv&&i(`SUPPORT`,`${n.id} not supported`,a,Math.min(1,ty(f,p)),Wv)}function iy(e,t){if(t.ctx.spec.fix===!1)return[];let n=[],r=t.f0??0,i=(e,t,r,i,a)=>n.push({kind:e,msg:t,frame:r,value:+i.toFixed(4),limit:a});for(let n of Zv(t))for(let a=Math.max(n.from,r);a<=Math.min(n.to,r+t.frames.length-1);a++){if(n.held&&!n.held(a))continue;let o=Qv(t,n.id,a);o.length&&ry(e,t.frames[a-r].s,n,o,i,a-r)}return n}var ay=.5,oy=1,sy=90,cy={twist:1-Ni,flex:1,dev:1},ly=(e,t)=>t[e].map(t=>t*cy[e]),uy=`wrist: deg on the frames a hand holds (a fit, a carry or a grip on); flex + toward the palm, dev + radial / - ulnar, twist at the wrist joint; [min, f, max, f], frames past the comfortable range and at the limit; grip: the grip a keyed carry of a thin body keeps (grip-choice.js), cost [it, today's] (comfort-priced wrist, reach and body over the keys); elevation [max deg, f] of the upper arm (90 level), raised: frames the elbow is over the shoulder`;function dy(e,t,n,r){let{diag:i}=e.frames[n],a=e.baked??{};if((i[`hold_${t}`]?.w??0)>ay||(i[`grip_${t}`]?.w??0)>ay)return!0;for(let n of e.ctx.spec.fits??[])if(n.side===t&&(a[`w_${n.anchor}_${t}`]?.[r]??0)>ay)return!0;return Object.keys(e.ctx.spec.objects??{}).some(n=>e.ctx.spec.objects[n]?.prop&&sf(e,n,r)===t)}function fy(e,t){let n=e.index,r=e.restWorldRot,i=t.f0??0,a={};for(let[o,s]of[[`Left`,`l`],[`Right`,`r`]]){let c=n[`${o}Hand`],l=n[`${o}ForeArm`],u=n[`${o}Arm`],d={frames:0,past:0,limit:0,raised:0};t.frames.forEach(({s:n},a)=>{let f=a+i;if(!dy(t,s,a,f))return;let p=U(H(n.P[c],n.P[l]),1/Math.max(1e-9,G(H(n.P[c],n.P[l])))),m=q(n.R[l],q(Y(r[l]),r[c])),h=Ki(m,n.R[c],p,J(q(m,Y(n.R[c])),zr(e,n,o).l));d.frames++;for(let e of[`flex`,`dev`,`twist`]){let t=Math.round(h[e]),n=d[e];d[e]=n?[Math.min(n[0],t),t<n[0]?f:n[1],Math.max(n[2],t),t>n[2]?f:n[3]]:[t,f,t,f]}let g=(e,t)=>[`flex`,`dev`,`twist`].some(n=>{let[r,i]=ly(n,e);return h[n]<r+t||h[n]>i-t});g(Mi,-1)&&d.past++,g(ji,oy)&&d.limit++;let _=H(n.P[l],n.P[u]),v=Math.round(Math.acos(Math.max(-1,Math.min(1,-_[1]/Math.max(1e-9,G(_)))))*180/Math.PI);(!d.elevation||v>d.elevation[0])&&(d.elevation=[v,f]),v>sy&&d.raised++}),d.frames&&(a[`hand_${s}`]=d)}for(let e of t.ctx.hold?.grips?.()??[])a[`hand_${e.hand}`]&&(a[`hand_${e.hand}`].grip={object:e.id,chose:e.name,cost:[e.cost,e.today]});return Object.keys(a).length?a:null}var py=.5,my=.5,hy=[`flex`,`dev`,`twist`],gy={l:`Left`,r:`Right`},_y={flex:e=>e>=0?`flex`:`extension`,dev:e=>e>=0?`radial deviation`:`ulnar deviation`,twist:()=>`twist`};function vy(e){let t=null;for(let n of hy){let[r,i]=ji[n],a=e[n],o=a>=0?i:r,s=a>=0?a-i:r-a;(!t||s>t.past)&&(t={axis:n,value:a,edge:o,past:s})}return t}function yy(e,t,n,r){let{s:i,diag:a}=t.frames[r],o=a[`hold_${n}`];if((o?.w??0)>my)return o;let s=gy[n],c=e.index,l=c[`${s}Hand`],u=c[`${s}ForeArm`],d=e.restWorldRot,f=U(H(i.P[l],i.P[u]),1/Math.max(1e-9,G(H(i.P[l],i.P[u])))),p=q(i.R[u],q(Y(d[u]),d[l]));return Ki(p,i.R[l],f,J(q(p,Y(i.R[l])),zr(e,i,s).l))}function by(e,t){let n=[],r=t.f0??0;for(let i of[`l`,`r`])t.frames.forEach((a,o)=>{if(!dy(t,i,o,o+r))return;let s=vy(yy(e,t,i,o));if(s.past<=py)return;let c=Math.abs(s.edge);n.push({kind:`WRIST`,msg:`hand_${i} ${_y[s.axis](s.value)} ${Math.round(Math.abs(s.value))}deg (limit ${Math.round(c)})`,frame:o,value:+Math.abs(s.value).toFixed(2),limit:c})});return n}function xy(e,t){let n=/^hand_([lr]) /.exec(t.subject)?.[1];if(!n)return null;let r=t.worstFrame,i=`at f${r}${t.count>1?` (f${t.first}-f${t.last}, ${t.count} frames)`:``}`,a=Math.round(e.out.ctx?.swivel?.[n]?.get(r)??0);if(Math.abs(a)>=1)return{cause:`fix.self elbow turn ${a}deg at f${r}`,hint:`${t.subject} ${i}: fix.self turned the elbow ${a} deg to keep the arm out of the body and the hand kept its turn, so the wrist took it; key elbow_${n} (the elbow pole) or the hand's target so the arm clears the body without the turn`};let o=(e.out.frames[e.rel(r)]?.diag[`hold_${n}`]?.w??0)>my&&Object.keys(e.spec.objects??{}).find(t=>e.spec.props?.[e.spec.objects[t]?.prop]?.hand===n),s=e.fr(r).c.spine_pitch??0;return{cause:o?`objects.${o}.keys near f${r}`:e.cause(`armw_${n}`,r),hint:`${t.subject} ${i}: the arm cannot turn the hand that far from where the body stands; lean the upper body over the hand (spine_pitch ${Math.round(s)} at f${r}: try ${Math.round(s+20)}) or bring the body to it (root), ${o?`or key ${o} so the hand need not bend that far (its aim or pos)`:`or move what the hand reaches`}; repair: { rounds } tries leans of 10-30 deg here and keeps one that helps`}}var Sy={WRIST:xy},Cy=2.2;function wy(e,t){let n=Math.max(0,Math.min(e.frames-1,t))*e.names.length,r=t=>{let r=e.names.indexOf(t),i=(n+r)*3;return[e.P[i],e.P[i+1],e.P[i+2]]};return ua.map(([e,t,n,i])=>[e,r(t),r(n),i])}function Ty(e,t,n={}){let r=Object.entries(t.ctx?.scene?.people??{}),i=[];if(!r.length)return i;let a=e.index,o=t.f0??0,s={...gl,...n.limits}.allow;return t.frames.forEach(({s:e},t)=>{let c=t+o,l=ua.map(([t,n,r,i])=>[t,e.P[a[n]],e.P[a[r]],i]);for(let[o,u]of r){if(!ua.every(([,e,t])=>u.names.includes(e)&&u.names.includes(t)))continue;let r=wy(u,c),d=r.find(e=>e[0]===`hips`)[1];if(!(ar(e.P[a.Hips],d)>Cy))for(let[e,a,c,u]of l){let l=Math.max(...r.map(([,e,t,n])=>u+n-pa(a,c,e,t))),d=yl(n.allow,e,`person:${o}`)??s;l>d&&i.push({kind:`PERSON`,msg:`${e} x person:${o}`,frame:t,value:+l.toFixed(4),limit:d})}}}),i}var Ey=(e,t)=>` (${e}the knee would fold ${Math.round(t)}deg; it bends to 150deg and stops at 160deg)`;function Dy(e,t,n,r,i){let a=t===`l`?`Left`:`Right`,o=e.fr(n).s.P,s=o[e.I[`${a}UpLeg`]],c=o[e.I[`${a}Leg`]],l=o[e.I[`${a}Foot`]],u=H(i,s),d=Or(ar(s,c),ar(c,l),150)+.002,f=U(K(u),Math.max(0,d-G(u))),p=u[1]+Math.sqrt(Math.max(0,u[1]*u[1]-W(u,u)+d*d));return u[1]<0?{cause:e.cause(`root`,n),hint:`root: raise ${Q(p)} m at f${n}${r}, or key foot_${t} farther from the hip (wider or more forward)`,fix:{channel:`root`,f:n,delta:[0,p,0]}}:{cause:e.cause(`foot_${t}`,n),hint:`foot_${t}: move ${g_(f)} m out from the hip at f${n}${r}, or raise root ${Q(p)} m`,fix:{channel:`foot_${t}`,f:n,delta:f}}}var Oy=.003,ky=.25,Ay=e=>/(^|_)l$|^Left/.test(e)?`l`:/(^|_)r$|^Right/.test(e)?`r`:null;function jy(e,t,n,r,i){let a=e.spec.anchors?.[t],o=e=>`/anchors/${t}/${e}`;if(a?.kind===`world`)return{path:o(`p`),delta:r};if(a?.kind===`body`)return{path:o(`p`),delta:J(X(-(e.fr(n).c.yaw??0)),r)};if([`bone`,`segment`,`prop`,`person`].includes(a?.kind))return{path:o(`offset`),delta:r};if(a?.kind!==`object`)return;let s=e.fr(n),c=ms(e.out.ctx,a,t,{...s,diag:{...s.diag,frame:n}},i);return{path:o(`local`),delta:J(Y(c.R),r)}}function My(e,t,n,r,i=``){let a=/^prop_(.+)$/.exec(t),o=a?e.spec.props?.[a[1]]?.hand:Ay(t),s,c,l,u=r;if(/^(hand|farm|uarm)_/.test(t)||a){let t=e.hand(o,n);s=t.label,l=t.anchor?jy(e,t.anchor,n,r,o):t.ch===`hand_${o}`?{channel:t.ch,f:n,delta:r}:void 0;let i=t.anchor&&e.spec.anchors[t.anchor]?.kind===`object`?e.spec.anchors[t.anchor].object:null;i&&l&&(s=`anchors.${t.anchor}.local (a point on ${i}, in ${i}'s axes; ${i} stays)`,u=l.delta),c=t.anchor?`anchor ${t.anchor}${t.fit===null?``:` (fits[${t.fit}])`} via ${e.cause(t.ch,n)}`:e.cause(t.ch,n)}else/^(shin|foot|sole)_/.test(t)?(s=`foot_${o}`,c=e.cause(s,n),l={channel:s,f:n,delta:r}):(s=`root`,c=e.cause(`root`,n),l={channel:`root`,f:n,delta:r,.../^root held since /.test(c)?{hold:!0}:{}});return/ (walk|walkTo) /.test(` ${c}`)&&/step|start|end/.test(c)&&!/^anchor/.test(s)?{cause:c,hint:`walk path: ${s} needs ${g_(r)} m at f${n}${i}; change that walk's heading/turnDistance/step (or give one a { range: [lo, hi] })`}:{cause:c,hint:`${s}: move ${g_(u)} m at f${n}${i}`,fix:l}}var Ny=e=>ua.find(t=>t[0]===e);function Py(e,t,n,r){let[,i,a]=Ny(n),{s:o}=e.fr(t),s=da(o.P[e.I[i]],o.P[e.I[a]]),c=s.map(e=>fa(e,r)),l=Math.min(...c);return{p:s[c.indexOf(l)],n:va(s[c.indexOf(l)],r),d:l}}function Fy(e,t,n,r,i){let a=t.worstFrame,o=e.out.objectsAt(e.rel(a))[r];if(!o||!Ny(n))return null;let{n:s}=Py(e,a,n,o);return My(e,n,a,U(s,i),` (out of ${r})`)}function Iy(e,t,n,r){let i=t.worstFrame,a=e.out.objectsAt(e.rel(i))[r];if(!a)return null;let o=pl(e.sk,e.fr(i).s,n.endsWith(`_l`)?`Left`:`Right`),s=ml(o,a),c=t.worst-t.limit+Oy;if(!(s.side>0))return s.topAt?My(e,n,i,U(va(s.topAt,a),c),` (out of ${r}'s top)`):null;let l=Math.max(...o.filter(e=>fa(e,a)<0).map(e=>2*a.half[1]-J(Y(a.R),H(e,a.pos))[1]))+Oy,u=U(va(s.sideAt,a),c);if(l>ky)return My(e,n,i,u,` (out of ${r}'s side)`);let d=My(e,n,i,J(a.R,[0,l,0]),` (over ${r}'s top; its ${t.worst.toFixed(3)} m is through a side)`);return d.hint+=/^walk path/.test(d.hint)?`; a higher lift raises the swing`:`; or move ${g_(u)} m out of that side`,d}function Ly(e,t,n,r,i,a){return My(e,n,t.worstFrame,U(K(r),i),` (away from the ${a})`)}function Ry(e,t,n){let{s:r,diag:i}=e.fr(t),a=e.I;if(n.startsWith(`hand_`)){let e=n.endsWith(`l`)?`Left`:`Right`;return da(r.P[a[`${e}Hand`]],r.P[a[`${e}HandMiddle3`]],5)}return Object.entries(i.props?.[n.slice(5)]??{}).filter(([e,t])=>Array.isArray(t)&&e!==`origin`).map(([,e])=>e)}var zy={COLLIDE(e,t){let[,n,r]=/^(\S+) x (.+)$/.exec(t.subject)??[];if(/^foot_[lr]$/.test(n??``))return Iy(e,t,n,r);let i=Fy(e,t,n,r,t.worst-t.limit+Oy);return i&&/^(hand|farm)_/.test(n)&&!e.spec.fix?.penetration&&t.worst-t.limit<=.05&&(i.hint+=`; or fix.penetration: 0.02 pushes shallow hand hits out`,e.spec.fix!==!1&&(i.fix={path:`/fix/penetration`,value:.02})),i},PERSON(e,t){let[,n,r]=/^(\S+) x person:(.+)$/.exec(t.subject)??[],i=Ny(n),a=e.out?.ctx?.scene?.people?.[r];if(!i||!a)return null;let o=t.worstFrame,{s}=e.fr(o),c=da(s.P[e.I[i[1]]],s.P[e.I[i[2]]]),l=wy(a,o).map(([e,t,n,r])=>{let a=H(n,t),o=Math.max(W(a,a),1e-12);return c.map(n=>{let s=V(t,U(a,or(W(H(n,t),a)/o,0,1)));return{other:e,p:n,q:s,depth:i[3]+r-G(H(n,s))}}).reduce((e,t)=>t.depth>e.depth?t:e)}).reduce((e,t)=>t.depth>e.depth?t:e),u=My(e,n,o,U(G(H(l.p,l.q))>1e-6?K(H(l.p,l.q)):K([l.p[0]-l.q[0]||1,0,l.p[2]-l.q[2]]),t.worst-t.limit+Oy),` (out of ${a.name}'s ${l.other})`);return{...u,hint:`${u.hint}; or, for a touch you mean, checks.allow [{ part: "${n}", object: "person:${r}", depth: ${Q(t.worst+Oy)} }]`}},CLEARANCE(e,t){let n=(e.spec.checks?.clearance??[]).find(e=>t.subject.startsWith(`${e.name}:`));return n&&Fy(e,t,n.part,n.object,n.min-t.worst+Oy)},GROUND(e,t){let n=t.subject.startsWith(`Left`)?`l`:`r`,r=t.worstFrame,i=e.fr(r).c,a=e.fr(r).diag[`leg_fold_${n}`];if(a)return Dy(e,n,r,Ey(`the sole is in the floor because the knee is on its stop: `,a),i[`foot_${n}`]);let o=i[`fpitch_${n}`]?`, or less fpitch_${n} (now ${Q(i[`fpitch_${n}`])} deg; + lifts the heel)`:``;return{cause:e.cause(`foot_${n}`,r),hint:`foot_${n}: raise ${Q(t.worst+.001)} m at f${r} (foot_* is the ankle; it stands ${ha(e.sk)} m above the floor)${o}`,fix:{channel:`foot_${n}`,f:r,delta:[0,t.worst+.001,0]}}},FACE(e,t){let n=t.subject.replace(/ into head$/,``),r=t.worstFrame,{s:i}=e.fr(r),a=Tr(i,e.I.Head,e.sk.landmarks.headCentre);return Ly(e,t,n,H(Ry(e,r,n).reduce((t,n)=>ma(e.sk,i,n)>ma(e.sk,i,t)?n:t),a),t.worst-t.limit+Oy,`head`)},BODY(e,t){let[,n,r]=/^(\S+) into (\S+)$/.exec(t.subject)??[],i=Ny(r),a=t.worstFrame,{s:o}=e.fr(a),s=/^(hand|farm|uarm)_([lr])$/.exec(n??``),c=s&&mi(e.sk);if(c){let i=e.I[`${s[2]===`l`?`Left`:`Right`}${{hand:`Hand`,farm:`ForeArm`,uarm:`Arm`}[s[1]]}`],l=Ai(c,e.sk,o,i),u=l.p&&yi(c,o,l.p,c.skip.get(i));if(u){let i=My(e,n,a,U(u,t.worst-t.limit+Oy),` (out of the ${r})`);return s[1]!==`hand`&&(i.hint+=`; or turn elbow_${s[2]} away from the ${r}`),i}}if(!i)return null;let l=o.P[e.I[i[1]]],u=o.P[e.I[i[2]]],d=H(u,l),f=e=>V(l,U(d,or(W(H(e,l),d)/W(d,d),0,1))),p=Ry(e,a,n).reduce((e,t)=>G(H(t,f(t)))<G(H(e,f(e)))?t:e);return Ly(e,t,n,H(p,f(p)),t.worst-t.limit+Oy,`torso`)},SELF(e,t){let n=t.worstFrame,{s:r}=e.fr(n),i=r.P,a=e.I;if(t.subject===`hands overlap`){let r=K(H(i[a.LeftHand],i[a.RightHand])),o=(t.worst-t.limit+Oy)/2,s=My(e,`hand_l`,n,U(r,o));return{cause:s.cause,hint:`${s.hint}; and ${My(e,`hand_r`,n,U(r,-o)).hint}`,fix:My(e,`hand_l`,n,U(r,2*o)).fix}}let o=t.subject===`shins touch`,s=o?.1:.135,[c,l]=o?[`Leg`,`Foot`]:[`UpLeg`,`Leg`],u=pa(i[a[`Left${c}`]],i[a[`Left${l}`]],i[a[`Right${c}`]],i[a[`Right${l}`]]),d=H(i[a[`Left${l}`]],i[a[`Right${l}`]]);d[1]=0;let f=(s-u+Oy)/2,p=K(d);return{cause:e.cause(`foot_l`,n),hint:`foot_l: move ${g_(U(p,f))} m and foot_r ${g_(U(p,-f))} m at f${n} (${o?`shins`:`thighs`} ${Q(u)} m apart, need ${s}); or spread knee_l/knee_r`,fix:{channel:`foot_l`,f:n,delta:U(p,2*f)}}},OBJECT(e,t){let[,n,r]=/^(\S+) into (.+)$/.exec(t.subject)??[],i=e.spec.objects?.[n]?.channel;if(!i)return null;let a=t=>e.out.baked[i]?.[t]??0,o=t.first>0?a(t.first-1):a(0);return{cause:e.cause(i,t.worstFrame),hint:`${i}: keep it within ${Q(o)} deg (it reaches ${Q(a(t.worstFrame))} at f${t.worstFrame}, ${Q(t.worst)} m into ${r}), or move ${r}`,fix:{channel:i,f:t.worstFrame,value:o}}},BALANCE(e,t){let n=t.worstFrame,{s:r}=e.fr(n),i=r.P,a=e.I;if(t.subject===`no foot on the ground`)return{cause:e.cause(`root`,n),hint:`at f${n} lower foot_l or foot_r onto the ground, the floor or the top of an object under it (the ankle stands ${ha(e.sk)} m above it), or declare checks.supports for the seat the hips rest on`};let o=U([`Hips`,`Spine1`,`Spine2`,`Head`].reduce((e,t)=>V(e,i[a[t]]),[0,0,0]),.25),s=[`Left`,`Right`].flatMap(t=>Object.values(_a(e.sk,r,t))),c=s.map(e=>e[0]),l=s.map(e=>e[2]),u=.07,d=[or(o[0],Math.min(...c)-u,Math.max(...c)+u),o[1],or(o[2],Math.min(...l)-u,Math.max(...l)+u)];return{cause:e.cause(`root`,n),hint:`root: move ${g_(H(d,o))} m at f${n} (centre of mass over the feet), or step a foot under it`,fix:{channel:`root`,f:n,delta:H(d,o)}}}},By=.003,Vy=.02,Hy=.2;function Uy(e,t,n,r,i=``){let a=t===`l`?`Left`:`Right`,{s:o}=e.fr(n),s=H(o.P[e.I[`${a}Hand`]],o.P[e.I[`${a}Arm`]]),c=Math.hypot(s[0],s[2])/Math.max(G(s),1e-9);if(c<.5)return null;let l=U(K([s[0],0,s[2]]),Math.min(Hy,r/c));return{delta:l,hint:`body: move ${g_(l)} m toward the target at f${n}, ${e.cause(`root`,n)} (arm ${t} is at full reach)${i}`,fix:{channel:`root`,f:n,delta:l,hold:!0}}}var Wy=(e,t,n)=>(e.fr(n).diag[`reach_over_${t}`]??0)>.001||(e.fr(n).diag[`arm_miss_${t}`]??0)>.002&&!e.fr(n).diag[`arm_fold_${t}`];function Gy(e,t,n,r){let i=null;for(let[a,o]of Object.entries(e.fr(n).c))a===r||!RegExp(`^w_.+_${t}$`).test(a)||!(o>Vy)||i&&o<=i.w||(i={ch:a,w:o});return i}function Ky(e,t,n,r,i){let a=n.slice(-1),o=e.hand(a,r),s=o.anchor?Gy(e,a,r,o.ch):null;if(!s)return null;let c=Array.isArray(t.at)?t.at[1]:t.at,l=e.bracket(s.ch,r).prev,u=l&&Math.abs(e.out.baked[s.ch]?.[Math.round(l.f)]??1)<=Vy&&c>=r&&!(e.bracket(s.ch,r).next?.f<=c)?c:r,d=s.w/Math.max(1,(e.fr(r).c[o.ch]??1)+s.w),f=s.ch.replace(/^w_/,``).replace(/_[lr]$/,``);return{cause:e.cause(s.ch,r),hint:`${s.ch} is ${Q(s.w)} at f${r}, so anchor ${f} takes ${Math.round(d*100)}% of the hand target from ${o.label}: key ${s.ch} 0 at f${u}${i}`,fix:{channel:s.ch,f:u,value:0}}}function qy(e,t){let n=null;return(e.spec?.goals??[]).forEach((e,r)=>{let i=S_(e,r);t.subject.startsWith(`${i}:`)&&(!n||i.length>n.name.length)&&(n={goal:e,name:i,i:r})}),n}function Jy(e,t,n){let r=[t,...e.out.ctx.scene?.objects?.[t]?.ancestors??[]].find(t=>Wd(e.spec.objects?.[t],n));return r?e.spec.objects[r]:null}function Yy(e,t,n){let[,r,i]=/^([a-z]+):(.+)$/s.exec(t)??[];if(r===`prop`)return e.spec.props?.[i.split(`.`)[0]]?.hand?`hand_${e.spec.props[i.split(`.`)[0]].hand}`:null;if(r===`object`){let t=Jy(e,i.replace(/\.(center|top|base)$/,``),n),r=t&&e.spec.props?.[t.prop]?.hand;return r?`hand_${r}`:null}if(r===`landmark`)return`root`;if(r!==`joint`&&r!==`bone`)return null;let a=Oo(e.sk,i).bone??``,o=/^Left/.test(a)?`l`:/^Right/.test(a)?`r`:null;return o&&/^(Left|Right)(Hand|ForeArm)/.test(a)?`hand_${o}`:o&&/^(Left|Right)(Foot|Toe|Leg)/.test(a)?`foot_${o}`:`root`}function Xy(e,t,n,r){let i=t.slice(-1);if(!t.startsWith(`hand_`))return{channel:t,f:n,delta:r};let a=e.hand(i,n);return a.ch===`hand_${i}`?{channel:a.ch,f:n,delta:r}:a.anchor&&e.spec.anchors?.[a.anchor]?.kind===`world`?{path:`/anchors/${a.anchor}/p`,delta:r}:null}function Zy(e,t,n,r,i,a){if(n===`moved`||n===`still`){let o=t[n],s=Yy(e,o,r),c=O_(e.out,t,a),l=Ts(e.out,r,T_(o)),u=l&&c&&G(H(l,c))>.001?K(H(l,c)):[0,1,0];return s?[s,U(u,n===`still`?-i:i)]:null}let[o,s]=t[n],c=Yy(e,o,r),l=Yy(e,s,r),u=e=>e?.startsWith(`hand_`)?2:+!!e,d=u(c)>=u(l),f=d?c:l,p=d?1:-1;if(!f)return null;if(n===`above`)return[f,[0,p*i,0]];let m=Ts(e.out,r,o),h=Ts(e.out,r,s);return m&&h?[f,U(K(H(h,m)),p*i)]:null}var Qy={GOAL(e,t){let n=e.spec&&qy(e,t),r=t.worstFrame;if(!n)return{cause:`goal ${t.subject.split(`:`)[0]}`,hint:`change the keys around f${r} until the goal holds`};let{goal:i,name:a,i:o}=n,s=x_(i)[0],c=t.worst+By,l=L_(e.out,e.spec.goals,o);if(l.wait){let e=i.after??i.before;return{cause:`goal ${a}`,hint:`${a} ${l.wait}: make goal "${e}" hold${i.after!==void 0&&i.before!==void 0?` and "${i.before}"`:``} where this one needs it, or move at`}}let u=s===`speed`?`m/s`:`m`,d=s===`near`||s===`still`?`<=`:`>=`,f=` (goal "${a}" is ${Q(t.worst)} ${u} ${s===`still`?`off`:`short`}; needs ${d} ${C_(i,s)})`;if(s===`speed`){let t=Yy(e,i.speed,r);return{cause:t?e.cause(t,r):`goal ${a}`,hint:`${i.speed} is too slow at f${r}: put its keys around f${r} closer in time, or farther apart in space${f}`}}let p=Zy(e,i,s,r,c,l.a);if(!p){if(s===`still`&&i.still.startsWith(`object:`)){let e=i.still.slice(7).replace(/\.(center|top|base)$/,``);return{cause:`objects.${e}`,hint:`${e} moves at f${r}, where it should stay: hold its hinge channel or keys until then, or start them later${f}`}}if(s===`still`)return{cause:`goal ${a}`,hint:`${i.still} moves at f${r} and nothing that follows the body moves it; name a joint, prop point or held object${f}`};if(s===`moved`&&!i.moved.startsWith(`object:`))return{cause:`goal ${a}`,hint:`${i.moved} does not move with the body at f${r}; name a joint, prop point or held object`};if(s===`moved`){let e=i.moved.slice(7).replace(/\.(center|top|base)$/,``);return{cause:`objects.${e}`,hint:`${e} is not in a hand at f${r}, so nothing moves it: carry it (objects.${e} = { prop, grab }) or hinge it`}}return{cause:`goal ${a}`,hint:`neither ${i[s][0]} nor ${i[s][1]} moves with the body at f${r}; name a joint, prop point or held object`}}let[m,h]=p;if(m.startsWith(`hand_`)){let t=Ky(e,i,m,r,f);if(t)return t;let n=Wy(e,m.slice(-1),r)&&Uy(e,m.slice(-1),r,c,f);if(n)return{cause:e.cause(`root`,r),hint:n.hint,fix:n.fix}}let g=My(e,m,r,h,f),_=Xy(e,m,r,h);return{cause:g.cause,hint:g.hint,..._?{fix:_}:{}}}},$y={Leg:[`UpLeg`,`Leg`,`Foot`,`knee`],ForeArm:[`Arm`,`ForeArm`,`Hand`,`elbow`]},eb=e=>e.startsWith(`Left`)?`l`:`r`,tb=e=>/^(w_|armw)/.test(e)?.5:/^(root|foot|hand)/.test(e)?1:/^(knee|elbow)/.test(e)?.2:.01;function nb(e,t,n){let r=eb(t),i=e.out.baked,a=[`root`,`yaw`,`pitch`];t===`Head`?a=[`head_yaw`,`head_pitch`,`spine_pitch`,`spine_yaw`,`root`,`yaw`]:/Hand|ForeArm/.test(t)?a=[`hand_${r}`,`armw_${r}`,`elbow_${r}`,`aswing_${r}`,`abend_${r}`,...Object.keys(i).filter(e=>RegExp(`^w_.+_${r}$`).test(e)),`spine_yaw`,`spine_pitch`,`root`,`yaw`]:/Foot|Leg/.test(t)&&(a=[`foot_${r}`,`knee_${r}`,`fpitch_${r}`,`root`]);let o=e=>{let t=i[e]?.[n-1],r=i[e]?.[n];return t===void 0||r===void 0||typeof t==`object`&&!Array.isArray(t)?0:(Array.isArray(t)?ar(t,r):Math.abs(r-t))*tb(e)};return a.filter(e=>i[e]).sort((e,t)=>o(t)-o(e))}function rb(e,t,n){let r=t.subject.split(` `)[0],i=t.worstFrame,a=nb(e,r,i)[0]??`root`,{prev:o,next:s}=e.bracket(a,i),c=e.keys(a).find(e=>e.step&&Math.abs(e.f-i)<=1);if(c)return{cause:e.cause(a,i),hint:`${a}: a step key jumps at f${Math.round(c.f)}; ease it over 4+ frames (key the old value 4 frames earlier, drop the step)`};let l=Math.ceil((t.worst/t.limit)**+n*1.1*10)/10,u=Math.round(o?.f??i-4),d=Math.round(s?.f??i+4),f=Math.ceil((d-u)*(l-1)),p=/^w_(.+)_[lr]$/.exec(a);return{cause:e.cause(a,i),hint:`retime: stretch f${u}-f${d} by ${l}x (+${f} frames, move the keys from f${d} on later)${p?` - the hand switches to anchor ${p[1]} too fast`:``}; or fix.retime: true`,fix:e.spec.fix===!1?void 0:{path:`/fix/retime`,value:!0}}}function ib(e,t,n){let[r,i]=n.split(/:(.*)/s);if(r===`joint`)return t.s.P[e.I[i]];if(r===`prop`){let[e,n]=i.split(`.`);return t.diag.props?.[e]?.[n]}return ds(e.out.ctx,i,t.s,t.diag,t.c)}function ab(e,t,n,r){let i=Ws(e.out.baked,t),a=r(e.fr(t)),o=null;for(let[s,c,l]of n){let n=r($g(e.out.ctx,{...i,[s]:c},t))-a;n>1e-6&&(!o||n/l>o.gain/o.unit)&&(o={ch:s,value:c,gain:n,unit:l})}return{best:o,base:a,c0:i}}var ob=(e,t,n,r)=>e.fr(n).s.P[e.I[`${t===`l`?`Left`:`Right`}${$y[r][0]}`]],sb={REACH(e,t){let[,n,r]=/^(leg|arm)_miss_([lr])$/.exec(t.subject)??[],i=t.worstFrame,a=t.worst+.002;if(n===`leg`){let n=e.fr(i).diag[`leg_fold_${r}`];if(n)return Dy(e,r,i,Ey(`the ankle target is ${Q(t.worst)} m inside the shin's reach: `,n),e.fr(i).c[`foot_${r}`]);let o=e.fr(i).c[`foot_${r}`]??[0,0,0],s=ob(e,r,i,`Leg`),c=H(o,s),l=ar(s,o)-t.worst,u=c[1]*c[1]-W(c,c)+l*l,d=[c[0],0,c[2]],f=u>=0?`or root down ${Q(-c[1]-Math.sqrt(u)+.002)} m${t.worst<=.05?` (fix.reach does this when on)`:``}`:`or root ${g_(U(K(d),G(d)-l*.95))} m toward the foot (the foot is ${Q(G(d))} m sideways of the hip: the root and foot keys disagree)`;return{cause:e.cause(`foot_${r}`,i),hint:`foot_${r}: move ${g_(U(K(H(s,o)),a))} m toward the hip at f${i}, ${f}`,fix:{channel:`foot_${r}`,f:i,delta:U(K(H(s,o)),a)}}}let o=r===`l`?`Left`:`Right`,{s,diag:c}=e.fr(i),l=K(H(s.P[e.I[`${o}Hand`]],s.P[e.I[`${o}Arm`]])),u=c[`arm_fold_${r}`];if(u){let n=My(e,`hand_${r}`,i,U(l,a),` (the hand target is ${Q(t.worst)} m inside the forearm's reach: the elbow would fold ${Math.round(u)}deg; it bends to 145deg and stops at 150deg)`);return{cause:n.cause,hint:`${n.hint}, or bring root ${g_(U([-l[0],0,-l[2]],a))} m back from it`,fix:n.fix}}let d=My(e,`hand_${r}`,i,U(l,-a),``),f=e.hand(r,i).anchor,p=JSON.stringify([e.spec.goals??[],e.spec.checks?.contacts??[]]),m=f&&(e.spec.anchors?.[f]?.kind===`object`||p.includes(`"anchor:${f}"`)),h=e.spec.fits?.[e.hand(r,i).fit??-1],g=h?.effector?.prop&&e.fr(i).diag.props?.[h.effector.prop]?.[h.effector.point],_=g?ar(g,V(ib(e,e.fr(i),`anchor:${f}`),h.offset??[0,0,0]))+.01:a,v=m&&Uy(e,r,i,Math.min(a,_));return v?{cause:d.cause,hint:`${v.hint} (out of reach by ${Q(t.worst)} m), or ${d.hint}`,fix:v.fix}:{cause:d.cause,hint:`${d.hint} (out of reach by ${Q(t.worst)} m), or bring root ${g_(U([l[0],0,l[2]],a))} m closer`,fix:d.fix}},KNEE(e,t){let n=eb(t.subject),r=n===`l`?`Left`:`Right`,i=t.worstFrame,{s:a,c:o}=e.fr(i),s=a.P,c=e.I;if(/backward/.test(t.subject)){let t=H(s[c[`${r}ToeBase`]],s[c[`${r}Foot`]]);t[1]=0;let a=V(K(J(X(-(o.yaw??0)),t)),[0,.3,0]);return{cause:e.cause(`knee_${n}`,i),hint:`knee_${n}: key ${g_(K(a))} (body frame, along the foot) at f${i}; a knee pole is +z forward, +x the character's left`,fix:{channel:`knee_${n}`,f:i,value:K(a)}}}if(/ folds /.test(t.subject))return Dy(e,n,i,` (the knee folds ${Q(t.worst)}deg, past its ${t.limit}deg stop; it bends freely to 150deg)`,s[c[`${r}Foot`]]);let l=s[c[`${r}UpLeg`]],u=s[c[`${r}Leg`]],d=s[c[`${r}Foot`]],f=ar(l,u),p=ar(u,d),m=(180-(t.limit-5))*Math.PI/180,h=Math.sqrt(f*f+p*p-2*f*p*Math.cos(m));return{cause:e.cause(`foot_${n}`,i),hint:`foot_${n}: move ${g_(U(K(H(d,l)),h-ar(l,d)))} m away from the hip at f${i} (the knee folds ${Q(t.worst)} deg, limit ${t.limit})`,fix:{channel:`foot_${n}`,f:i,delta:U(K(H(d,l)),h-ar(l,d))}}},ELBOW(e,t){let n=eb(t.subject),r=n===`l`?`Left`:`Right`,i=t.worstFrame,a=e.fr(i).s.P,o=e.I,s=a[o[`${r}Arm`]],c=a[o[`${r}ForeArm`]],l=a[o[`${r}Hand`]],u=U(K(H(l,s)),Or(ar(s,c),ar(c,l),145)-ar(s,l));return My(e,`hand_${n}`,i,u,` (the elbow folds ${Q(t.worst)}deg, past its ${t.limit}deg stop; it bends freely to 145deg)`)},FLIP(e,t){let[,n,r]=/^(Left|Right)(Leg|ForeArm) /.exec(t.subject)??[],i=t.worstFrame;if(!r)return null;let a=eb(n),[o,s,c,l]=$y[r],u=e.I,d=+(/ over (\d+) frames$/.exec(t.subject)?.[1]??1),f=e.fr(i).diag,p=r===`ForeArm`&&(f[`arm_fold_${a}`]??f[`hold_${a}`]?.fold);if(p){let t=f[`hold_${a}`]?.fold&&Object.entries(e.spec.objects??{}).find(([,t])=>t.keys?.length&&e.spec.props?.[t.prop]?.hand===a)?.[0];return{cause:t?`objects.${t}.keys`:e.cause(e.hand(a,i).ch,i),hint:`the ${t?`keys of ${t} ask`:`hand target asks`} the elbow to fold ${Math.round(p)}deg at f${i}, past its 150deg stop, so the hand swings round the shoulder on the stop: move ${t?`the keyed pose`:`the target`} out from the shoulder (REACH says how far)`}}let m=t=>{let r=e.fr(t).s.P;return vr(H(r[u[`${n}${s}`]],r[u[`${n}${o}`]]),H(r[u[`${n}${c}`]],r[u[`${n}${s}`]]))},h=Array.from({length:Math.max(1,d-1)},(e,t)=>d>1?i-1-t:i).reduce((e,t)=>m(t)<m(e)?t:e),g=m(h),_=`${l}_${a}`,v=e.out.baked[_]?.[Math.max(0,i-1)];if(v&&G(v)<.5)return{cause:e.cause(_,i),hint:`${_}: the pole passes near zero (length ${Q(G(v))}) at f${i} while it turns between opposite keys; add an in-between pole key (e.g. the average direction, normalised) so it turns, not shrinks`};let y=g<12?`the limb is almost straight at f${h} (bend ${Q(g)} deg), so the pole cannot hold it: bring the ${r===`Leg`?`foot`:`hand`} target ~0.02 m toward the ${r===`Leg`?`hip`:`shoulder`}, or `:``;return{cause:e.cause(_,i),hint:`${_}: ${y}keep the pole on one side through f${i}${v?` (key ${g_(v)} there)`:``}`,fix:v&&{channel:_,f:i,value:v}}},SLIDE(e,t){let n=eb(t.subject),r=n===`l`?`Left`:`Right`,i=t.subject.includes(`heel`)?`heel`:`ball`,a=Math.max(0,t.first-1),o=t=>_a(e.sk,e.fr(t).s,r)[i],s=Math.hypot(o(t.last)[0]-o(a)[0],o(t.last)[2]-o(a)[2]),c=e.out.baked[`foot_${n}`]?.[a],l=e.out.baked[`fyaw_${n}`],u=e.out.baked[`foot_${n}`]?.[t.last];return l&&c&&u&&Math.hypot(u[0]-c[0],u[2]-c[2])<s/2&&Math.abs(l[t.last]-l[a])>1?{cause:e.cause(`fyaw_${n}`,t.worstFrame),hint:`fyaw_${n}: the flat foot turns ${Q(l[a])} -> ${Q(l[t.last])} deg over f${a}-f${t.last} and the ${i} slides ${Q(s)} m; key fyaw_${n} ${Q(l[a])} at f${t.last} so it turns once the foot is up, or lift the heel first (fpitch_${n} +) so it pivots on the ball`,fix:{channel:`fyaw_${n}`,f:t.last,value:l[a]}}:{cause:e.cause(`foot_${n}`,t.worstFrame),hint:`foot_${n}: hold it still over f${a}-f${t.last}${c?` (key ${g_(c)} at both ends)`:``}; the ${i} slides ${Q(s)} m${s<.01?`; fix.slide locks this when on`:``}`,fix:c&&{channel:`foot_${n}`,f:t.last,value:c}}},SPEED:(e,t)=>rb(e,t,1),POP:(e,t)=>rb(e,t,.5),ACC:(e,t)=>rb(e,t,.5),FLOAT:(e,t)=>({cause:e.cause(`root`,t.worstFrame),hint:`over f${t.first}-f${t.last} lower the root or key foot_l/foot_r back onto the ground, the floor or the top of an object under the foot (the ankle stands ${ha(e.sk)} m above it); a jump needs the hips to rise and fall; a seat or ledge the hips rest on goes in checks.supports (a foot on an object's top needs none)`}),LENGTH:()=>({cause:`compiler`,hint:`a bone changed length: report the spec, this is a compiler fault`}),CONTACT(e,t){let n=(e.spec.checks?.contacts??[]).find(e=>t.subject.startsWith(`${e.name}:`)),r=t.worstFrame,i=e.rel(r);if(!n)return null;let a=mv(e.out,i,n.point),o=mv(e.out,i,n.target),s=H(o,a),c=/^prop:([^.]+)/.exec(n.point),l=c?e.spec.props?.[c[1]]?.hand:eb(n.point.slice(6)),{diag:u}=e.fr(r),d=Math.max(u[`reach_over_${l}`]??0,u[`arm_miss_${l}`]??0),f=/^anchor:(.+)$/.exec(n.target)?.[1],p=(e.spec.fits??[]).findIndex(e=>e.side===l&&e.anchor===f),m=p>=0?`fits[${p}] (${l} -> anchor ${f})`:My(e,`hand_${l}`,r,s).cause,h=U(K([s[0],0,s[2]]),d+.01),g=u[`arm_fold_${l}`];if(d>.002&&g){let t=e.fr(r).s.P[e.I[`${l===`l`?`Left`:`Right`}Arm`]],n=U(K([t[0]-o[0],0,t[2]-o[2]]),d+.01);return{cause:m,hint:`inside the forearm's reach by ${Q(d)} m at f${r} (the elbow would fold ${Math.round(g)}deg; it stops at 150deg): bring root ${g_(n)} m back from ${f??`the target`}, or move the target out from the shoulder`,fix:{channel:`root`,f:r,delta:n}}}if(d>.002)return{cause:m,hint:`out of reach by ${Q(d)} m at f${r}: bring root ${g_(h)} m toward ${f??`the target`}, or move the target`,fix:{channel:`root`,f:r,delta:h}};let _=My(e,`hand_${l}`,r,s);return{cause:m,hint:`${_.hint}${p<0&&f?`; or add fits: [{ side: "${l}", anchor: "${f}", effector: ${c?`{ prop: "${c[1]}", point: "${n.point.split(`.`)[1]}" }`:`{ joints: [...] }`} }]`:``}`,fix:_.fix}},ORIENT(e,t){let n=(e.spec.checks?.orient??[]).find(e=>t.subject.startsWith(`${e.name}:`)),r=t.worstFrame;if(!n)return null;let i=/^prop:([^.]+)/.exec(n.from),a=i?e.spec.props?.[i[1]]?.hand:eb(n.from.slice(6)),o=n.minCos??.64,s=t=>n.along===`up`?[0,1,0]:n.along===`face`?Er(e.sk,t.s,e.I.Head,[0,0,1]):K(n.along),c=t=>W(K(H(ib(e,t,n.to),ib(e,t,n.from))),s(t)),l=Ws(e.out.baked,r),u=l[`wtwist_${a}`]??0,d=l[`wflex_${a}`]??0,{best:f,base:p}=ab(e,r,[[`wtwist_${a}`,or(u+15,-85,85),15],[`wtwist_${a}`,or(u-15,-85,85),15],[`wflex_${a}`,or(d+15,-70,70),15],[`wflex_${a}`,or(d-15,-70,70),15]],c);if(!f)return{cause:e.cause(`wtwist_${a}`,r),hint:`turn the prop another way: wrist twist/flex do not help at f${r} (cos ${Q(p)}, needs ${o}); change elbow_${a} or the prop points`};let m=f.ch.startsWith(`wtwist`)?u:d,h=f.ch.startsWith(`wtwist`)?85:70,g=or(m+(f.value-m)*Math.min(4,(o-p+.03)/f.gain),-h,h);return{cause:e.cause(f.ch,r),hint:`${f.ch}: key ${Q(g)} deg at f${r} (now ${Q(m)}; cos ${Q(p)}, needs ${o})`,fix:{channel:f.ch,f:r,value:g}}},BELOW(e,t){let n=(e.spec.checks?.below??[]).find(e=>t.subject.startsWith(`${e.name}:`)),r=t.worstFrame;if(!n)return null;let i=eb(n.joint),a=`${/Leg/.test(n.joint)?`knee`:`elbow`}_${i}`,o=Ws(e.out.baked,r)[a]??[0,-1,-.3],s=t=>t.s.P[e.I[n.ref]][1]-t.s.P[e.I[n.joint]][1],c=(n.min??.08)+.01,l=Ws(e.out.baked,r),u=s(e.fr(r)),d=[[0,-1,0],[.5,-1,0],[-.5,-1,0],[0,-1,-.4],[0,-1,.4],[.5,-1,.5],[-.5,-1,.5],[.5,-1,-.4],[-.5,-1,-.4]].map(t=>({p:t,d:s($g(e.out.ctx,{...l,[a]:t},r)),turn:vr(t,o)})),f=d.filter(e=>e.d>=c).sort((e,t)=>e.turn-t.turn)[0]??d.sort((e,t)=>t.d-e.d)[0];return f.d>u?{cause:e.cause(a,r),hint:`${a}: key ${g_(f.p)} (body frame: +y up, +z forward) at f${r} (${n.joint} ${Q(u)} m below ${n.ref} -> ${Q(f.d)}, needs ${n.min??.08})`,fix:{channel:a,f:r,value:f.p}}:{cause:e.cause(a,r),hint:`${a}: no pole change lowers ${n.joint} at f${r}; lower the hand target instead`}},APPEAR(e,t){let n=(e.spec.checks?.appear??[]).find(e=>t.subject.startsWith(`${e.name}:`)),r=t.worstFrame;if(!n)return null;let i=null;for(let t=Math.max(e.out.f0??0,r-24);t<=Math.min((e.out.f0??0)+e.out.frames.length-1,r+24);t++){let r=G(H(mv(e.out,e.rel(t),`joint:${n.joint}`),mv(e.out,e.rel(t),`anchor:${n.anchor}`)));(!i||r<i.d)&&(i={q:t,d:r})}let a=n.tol??.035;return{cause:e.cause(n.channel,r),hint:i.d<=a?`${n.channel}: move the step from f${r} to f${i.q} (${n.joint} ${Q(i.d)} m from ${n.anchor} there)`:`${n.joint} never gets within ${a} m of ${n.anchor} near f${r} (closest ${Q(i.d)} m at f${i.q}): hold its weight w_${n.anchor}_${eb(n.joint)} at 1 around the switch`}}},cb=.003,lb=24;function ub(e,t,n,r){let i=e.hand(t,n);if(i.ch===`hand_${t}`)return{channel:i.ch,f:n,delta:r};if(i.fit!==null&&i.fit!==void 0)return e.spec.fits[i.fit].offset?{path:`/fits/${i.fit}/offset`,delta:r}:{path:`/fits/${i.fit}/offset`,value:r};if(i.anchor&&e.spec.anchors?.[i.anchor]?.kind===`world`)return{path:`/anchors/${i.anchor}/p`,delta:r}}function db(e,t,n,r,i){let a=My(e,`hand_${t}`,n,r,i),o=ub(e,t,n,r);return o?{...a,fix:o}:a}function fb(e,t,n,r){let i=e.spec.anchors?.[e.hand(t,n).anchor],a=e.out.ctx.scene;return i?.kind===`object`&&[a.objects?.[i.object]?.ancestors,Io(a)[i.object]?.ancestors,[i.object]].some(e=>e?.includes(r))}function pb(e,t){let n=J(Y(e.R),H(t,e.pos)),r=[0,e.half[1],0];return V(e.pos,J(e.R,n.map((t,n)=>or(t,r[n]-e.half[n],r[n]+e.half[n]))))}var mb={REACH:(e,t)=>wv(e,t)??sb.REACH(e,t),GRAB(e,t){let n=t.subject.split(`:`)[0],r=t.worstFrame,i=e.spec?.objects?.[n],a={cause:`objects.${n}.grab`,hint:`${n}: move the hand to it by f${r}, or set objects.${n}.grab to the frame the hand arrives`};if(!e.out||!Hf(i))return a;let o=null;for(let i=r-lb;i<=r+lb;i++){let a=Lv(e.out,n,i);a!==null&&a<=t.limit&&(!o||Math.abs(i-r)<Math.abs(o[0]-r))&&(o=[i,a])}if(o)return{cause:a.cause,hint:`${n}: set objects.${n}.grab to ${o[0]} (the hand is ${(o[1]*100).toFixed(1)} cm from it there, ${(t.worst*100).toFixed(1)} cm at f${r})`,fix:{path:`/objects/${n}/grab`,value:o[0]}};let{sk:s,spec:c,scene:l}=e.out.ctx,u=Kf(s,c,e.fr(r).s,i),d=Ud(l,n).map(e=>pb(l.objects[e],u)).reduce((e,t)=>G(H(t,u))<G(H(e,u))?t:e),f=G(H(d,u)),p=U(H(d,u),f>1e-9?(f-t.limit/2)/f:0),m=db(e,c.props[i.prop].hand,r,p,` (to ${n} at grab)`);return{...m,hint:`${m.hint}; or set objects.${n}.grab to the frame the hand arrives`}},COLLIDE(e,t){let[,n,r]=/^(\S+) x (.+)$/.exec(t.subject)??[],i=e.spec?.objects??{},a=Hf(i[r])?r:Hf(i[n])?n:null;if(!a||!e.out)return zy.COLLIDE(e,t);let o=i[a],s=e.spec.props[o.prop].hand,[c,l]=qd(e.out,o),u=t.worst-t.limit+cb,d=t.worstFrame,f=d>=c&&d<=l,p=Math.min(d,l),m=of(e.out,a,d)??[];if(a===r){let t=ua.find(e=>e[0]===n),{s:r}=e.fr(d);if(!t||!m.length)return null;let i=da(r.P[e.I[t[1]]],r.P[e.I[t[2]]]),[o,c]=m.flatMap(e=>i.map(t=>[e,t])).reduce((e,t)=>fa(t[1],t[0])<fa(e[1],e[0])?t:e),l=va(c,o),p=/^(hand|farm|uarm)_([lr])$/.exec(n)?.[2];return f&&p&&p!==s&&fb(e,p,d,a)?My(e,`hand_${p}`,d,U(l,u),` (out of ${a})`):f?db(e,s,d,U(l,-u),` (${a} off ${n})`):My(e,n,d,U(l,u),` (out of ${a})`)}let h=e.out.objectsAt(e.rel(d))[r];if(!h||!m.length)return null;let g=of(e.out,a,Math.max(c,t.first-1))??m,_=m.map((e,t)=>Nv(e,h,H(g[t].pos,h.pos))).reduce((e,t)=>t.depth>e.depth?t:e);return db(e,s,p,U(_.axis,_.depth-t.limit+cb),f?` (${a} out of ${r})`:` (${a} is put down in ${r}; it stays where the hand lets go at f${l})`)}},hb=.005,gb=e=>e.spec?.fix?.grasp===!1,_b={cause:`spec.fix.grasp false: the fingers stopped at the preset curl`,hint:`turn grasp physics on (fix.grasp true): the fingers close until they touch and the thing rests in the hand`,fix:{path:`/fix/grasp`,value:!0}};function vb(e,t,n){let{scene:r}=e.out.ctx,i=e.out.objectsAt?.(e.rel(n))??{};return Ud(r,t).map(t=>({...r.objects[t],...e.out.ctx.objectPose?.(t,n)??i[t]??{}}))}var yb={FINGER_GAP(e,t){if(gb(e))return _b;let[,n,r]=/^(left|right) fingers off (\S+)$/.exec(t.subject)??[];if(!r||!e.out)return null;let i=n===`left`?`l`:`r`,a=n===`left`?`Left`:`Right`,o=t.worstFrame,{s}=e.fr(o),c=U(V(s.P[e.I[`${a}Hand`]],s.P[e.I[`${a}HandMiddle1`]]),.5),l=vb(e,r,o);if(!l.length)return null;let u=l.reduce((e,t)=>Ca(t,c)<Ca(e,c)?t:e),d=Ca(u,c);return My(e,`hand_${i}`,o,U(wa(u,c),-Math.max(0,d-.03)),` (onto ${r}: the fingers reach it from nearer)`)},FINGER_PEN(e,t){if(gb(e))return _b;let[,n,r]=/^(\S+) into (\S+)$/.exec(t.subject)??[];if(!r||!e.out||e.I[n]===void 0)return null;let i=n.startsWith(`Left`)?`l`:`r`,a=t.worstFrame,o=e.fr(a).s.P[e.I[n]],s=vb(e,r,a);if(!s.length)return null;let c=s.reduce((e,t)=>Ca(t,o)<Ca(e,o)?t:e);return My(e,`hand_${i}`,a,U(wa(c,o),t.worst-t.limit+hb),` (out of ${r})`)},SUPPORT(e,t){if(gb(e))return _b;let n=/^(\S+) not supported$/.exec(t.subject)?.[1],r=e.spec?.objects?.[n];if(!r||!e.out)return null;let i=e.out.ctx.scene.objects[Ud(e.out.ctx.scene,n)[0]],a=i?ba(i).kind:`box`,o=a===`sphere`?`spherical`:a===`cylinder`?`power`:`palm`;return r.grasp===o?{cause:`objects.${n}.grasp ${o}`,hint:`${n} rests on the fingers only: hold it nearer the palm (the hand lower under it) or with both hands`}:{cause:`objects.${n} (no grasp for a ${a})`,hint:`${n}: set objects.${n}.grasp to "${o}" (how a ${a} is held)`,fix:{path:`/objects/${n}/grasp`,value:o}}},CATCH(e,t){let[,n]=/^(\S+) missed by/.exec(t.subject)??[];if(!e.spec?.objects?.[n]||!e.out)return null;let r=t.worstFrame,i=e.spec.anchors?.[`${n}Catch0`]?.p;if(!i)return{cause:`objects.${n}.grab`,hint:`${n}: the hand is ${(t.worst*100).toFixed(1)} cm from it at f${r}; reach it earlier`};let a=null;for(let t=Math.max(0,r-30);t<r;t++){let r=$d(e.out,n,t)?.pos;r&&(!a||G(H(r,i))<a.d)&&(a={f:t,d:G(H(r,i))})}let o=a?r-a.f:0,s=`${n}: the hand gets there ${o} frame(s) after it passed (${(t.worst*100).toFixed(1)} cm off at f${r}); start catchObject ${o} frame(s) earlier`;return o>0?{cause:`use catchObject ${n} f0`,hint:s,fix:{ops:e=>{let t=(e.use??[]).findIndex(e=>e.skill===`catchObject`&&e.args?.object===n);return t<0?null:[{op:`replace`,path:`/use/${t}/f0`,value:Math.max(0,e.use[t].f0-o)}]}}}:{cause:`use catchObject ${n}`,hint:s}}},bb=[`add`,`remove`,`replace`,`test`],xb=e=>{throw Error(`MOTION_SPEC_INVALID: ${e}`)},Sb=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Cb=e=>e.split(`/`).slice(1).map(e=>e.replaceAll(`~1`,`/`).replaceAll(`~0`,`~`)),wb=e=>e.map(e=>`/${String(e).replaceAll(`~`,`~0`).replaceAll(`/`,`~1`)}`).join(``);function Tb(e,t){if(Array.isArray(e))return`${t} has ${e.length} entries`;let n=Object.keys(e);return n.length?`${t} has ${n.slice(0,8).join(`, `)}${n.length>8?`, ...`:``}`:`${t} is empty`}function Eb(e,t,n){let r=e;for(let e=0;e<t.length-1;e++){let i=t[e],a=e?t[e-1]:`the spec`;(typeof r!=`object`||!r||!Object.hasOwn(r,Array.isArray(r)?Number(i):i)||Array.isArray(r)&&!/^\d+$/.test(i))&&xb(`${n}: ${wb(t.slice(0,e+1))} does not exist${r&&typeof r==`object`?` (${Tb(r,a)})`:``}`),r=r[Array.isArray(r)?Number(i):i]}return(typeof r!=`object`||!r)&&xb(`${n}: ${wb(t.slice(0,-1))} is not an object or array`),r}function Db(e,t,n,r){(!t||typeof t!=`object`||!bb.includes(t.op))&&xb(`patch[${n}]: op must be ${bb.join(`, `)}, got ${JSON.stringify(t?.op)}`);let i=`patch[${n}] (${t.op} ${t.path})`;if((typeof t.path!=`string`||t.path!==``&&!t.path.startsWith(`/`))&&xb(`${i}: path must be a JSON Pointer such as "/keys/0/f"`),t.op!==`remove`&&!Object.hasOwn(t,`value`)&&xb(`${i}: needs a value`),t.path===``){if(t.op===`replace`)return structuredClone(t.value);if(t.op===`test`)return Sb(e,t.value)||xb(`${i}: the spec differs from the test value`),e;xb(`${i}: ${t.op} needs a path below the spec`)}let a=Cb(t.path),o=a[a.length-1],s=Eb(e,a,i),c=a.length>1?a[a.length-2]:`the spec`;if(Array.isArray(s)){if(o===`-`)return t.op!==`add`&&xb(`${i}: "-" (append) works with add only`),s.push(structuredClone(t.value)),e;let n=/^\d+$/.test(o)?Number(o):NaN,r=t.op===`add`?s.length:s.length-1;return n>=0&&n<=r||xb(`${i}: ${t.path} does not exist (${Tb(s,c)})`),t.op===`add`?s.splice(n,0,structuredClone(t.value)):t.op===`remove`?s.splice(n,1):t.op===`replace`?s[n]=structuredClone(t.value):Sb(s[n],t.value)||xb(`${i}: value is ${JSON.stringify(s[n])?.slice(0,60)}, not ${JSON.stringify(t.value)?.slice(0,60)}`),e}return t.op===`replace`&&r&&!Object.hasOwn(s,o)?r.push(`${i}: ${t.path} did not exist (${Tb(s,c)}); added`):t.op!==`add`&&!Object.hasOwn(s,o)&&xb(`${i}: ${t.path} does not exist (${Tb(s,c)})`),t.op===`remove`?delete s[o]:t.op===`test`?Sb(s[o],t.value)||xb(`${i}: value is ${JSON.stringify(s[o])?.slice(0,60)}, not ${JSON.stringify(t.value)?.slice(0,60)}`):s[o]=structuredClone(t.value),e}function Ob(e,t,n){return Array.isArray(t)||xb(`patch must be an array of { op, path, value }`),t.reduce((e,t,r)=>Db(e,t,r,n),structuredClone(e))}var kb=2,Ab=e=>Array.isArray(e)?e.map(Ab):typeof e==`number`?Math.round(e*1e4)/1e4:e,jb=e=>e.split(`/`).slice(1).map(e=>e.replaceAll(`~1`,`/`).replaceAll(`~0`,`~`)),Mb=e=>e.map(e=>`/${String(e).replaceAll(`~`,`~0`).replaceAll(`/`,`~1`)}`).join(``),Nb=e=>typeof e==`number`&&Number.isFinite(e);function Pb(e,t){let n=e;for(let e of t){if(typeof n!=`object`||!n||!Object.hasOwn(n,e))return;n=n[e]}return n}function Fb(e,t){if(Nb(e)&&Nb(t))return e+t;if(Array.isArray(e)&&Array.isArray(t)&&e.length===t.length&&e.every(Nb)&&t.every(Nb))return e.map((e,n)=>e+t[n])}function Ib(e,t,n){let r=-1;return(e.keys??[]).forEach((i,a)=>{!i?.set||!Object.hasOwn(i.set,t)||!Nb(i.f)||Math.abs(i.f-n)>kb||(r<0||Math.abs(i.f-n)<Math.abs(e.keys[r].f-n))&&(r=a)}),r}function Lb(e,t,n,r){let i=/^use\[(\d+)\] standIdle$/.exec(r?.src??``),a=n.delta;if(!i||n.channel!==`root`||!Array.isArray(a)||Math.hypot(a[0],a[2])<Math.abs(a[1]))return null;let o=Number(i[1]),s=t.use?.[o],c=e.fr(r.f).c.root;if(s?.skill!==`standIdle`)return null;let l=Array.isArray(s.args?.at)?s.args.at:c&&[c[0],c[2]];if(!l)return null;let u=Ab(l.map((e,t)=>e+(t===0?a[0]:t===l.length-1?a[2]:0)));return s.args?[{op:Object.hasOwn(s.args,`at`)?`replace`:`add`,path:`/use/${o}/args/at`,value:u}]:[{op:`add`,path:`/use/${o}/args`,value:{at:u}}]}function Rb(e,t,n,r){let i=t.use?.[n],a=i?.args??{},o=r.delta,s=(e.fr(r.f).c.yaw??0)*Math.PI/180,c=o[0]*Math.sin(s)+o[2]*Math.cos(s);if(i?.skill!==`walkTo`||Math.abs(o[0]*Math.cos(s)-o[2]*Math.sin(s))>Math.abs(c))return null;let l=(e,t)=>[i.args?{op:Object.hasOwn(a,e)?`replace`:`add`,path:`/use/${n}/args/${e}`,value:Ab(t)}:{op:`add`,path:`/use/${n}/args`,value:{[e]:Ab(t)}}];if(a.steps===void 0&&Array.isArray(a.to))return l(`to`,a.to.map((e,t)=>e+(t===0?o[0]:t===a.to.length-1?o[2]:0)));let u=a.steps??8,d=u<=2?`firstStep`:`step`,f=(a[d]??(d===`step`?.5:.4))+c/Math.max(1,u-2);return u>=2&&f>.05?l(d,f):null}function zb(e,t,n){let r=e.keys(`root`),i=e=>/^keys\[\d+\]$/.test(e.src),a=r.findLastIndex(e=>e.f<=n.f);if(a<0||!i(r[a]))return null;let o=a,s=a;for(;o>0&&i(r[o-1]);)--o;for(;s<r.length-1&&i(r[s+1]);)s+=1;return r.slice(o,s+1).map(e=>{let r=Number(/\d+/.exec(e.src)[0]),i=t.keys?.[r]?.set?.root;return Array.isArray(i)&&i.length===3?{op:`replace`,path:`/keys/${r}/set/root`,value:Ab([i[0]+n.delta[0],i[1],i[2]+n.delta[2]])}:null}).filter(Boolean)}function Bb(e,t,n){if(!Array.isArray(n.delta)||!e?.fr)return null;let r=e.bracket(`root`,n.f).prev,i=/^use\[(\d+)\] (standIdle|walkTo)\b/.exec(r?.src??``);if(i?.[2]===`standIdle`)return Lb(e,t,n,r);if(i?.[2]===`walkTo`)return Rb(e,t,Number(i[1]),n);let a=r&&zb(e,t,n);return a?.length?a:null}function Vb(e,t,n){let{channel:r,f:i}=n;if(typeof r!=`string`||!Nb(i))return null;if(n.hold)return Bb(e,t,n);let a=e=>n.value===void 0?Fb(e,n.delta):n.value,o=Ib(t,r,i);if(o>=0){let e=a(t.keys[o].set[r]);return e===void 0?null:[{op:`replace`,path:Mb([`keys`,o,`set`,r]),value:Ab(e)}]}if(!e?.fr)return null;let{prev:s,next:c}=e.bracket(r,i),l=s&&i-s.f<=kb?s:c&&c.f-i<=kb?c:null,u=n.delta!==void 0&&Lb(e,t,n,l);if(u)return u;let d=a(e.fr(i).c[r]);return d===void 0?null:[{op:`add`,path:`/keys/-`,value:{f:Math.round(i),set:{[r]:Ab(d)}}}]}function Hb(e,t){if(typeof t.path!=`string`||!t.path.startsWith(`/`))return null;let n=jb(t.path),r=Pb(e,n),i=t.delta===void 0?t.value:r===void 0&&t.path.endsWith(`/offset`)?t.delta:Fb(r,t.delta);return i===void 0?null:r===void 0?Pb(e,n.slice(0,-1))===void 0?n.length===2&&n[0]===`fix`?[{op:`add`,path:Mb([n[0]]),value:{[n[1]]:Ab(i)}}]:null:[{op:`add`,path:t.path,value:Ab(i)}]:[{op:`replace`,path:t.path,value:Ab(i)}]}function Ub(e,t,n){let r=e.ops?e.ops(n):e.channel===void 0?e.path===void 0?null:Hb(n,e):Vb(t,n,e);if(!r)return null;try{return JSON.stringify(Ob(n,r))===JSON.stringify(n)?null:r}catch{return null}}function Wb(e,{X:t,userSpec:n}={}){if(!n||typeof n!=`object`)return e;for(let r of e)if(r.fix)try{let e=Ub(r.fix,t,n);e&&(r.patch=e)}catch{}return e}var Gb={...zy,...sb,...mb,...Qy,...Sy,...qg,...yb};function Kb(e){let t=new Map;for(let n of e.keys??[])for(let e of Object.keys(n.set??{}))t.has(e)||t.set(e,[]),t.get(e).push({f:n.f,src:n.src??`keys`,step:n.step?.includes(e)});for(let e of t.values())e.sort((e,t)=>e.f-t.f);return t}function qb(e,t,n){let r=Kb(t),i={sk:e,out:t,spec:n,I:e.index,fr:e=>t.frames[Math.max(0,Math.min(t.frames.length-1,e-(t.f0??0)))],rel:e=>Math.max(0,Math.min(t.frames.length-1,e-(t.f0??0))),keys:e=>r.get(e)??[],bracket(e,t){let n=i.keys(e),r=null,a=null;for(let e of n)if(e.f<=t)r=e;else{a=e;break}return{prev:r,next:a}},cause(e,t){let{prev:n,next:r}=i.bracket(e,t);if(!n&&!r)return`${e} (not keyed)`;let a=n&&t-n.f<=2?n:r&&r.f-t<=2?r:null;return a?`${a.src} f${Math.round(a.f)} ${e}`:r?n?`${e} between ${n.src} f${Math.round(n.f)} and ${r.src===n.src?``:`${r.src} `}f${Math.round(r.f)}`:`${e} before ${r.src} f${Math.round(r.f)}`:`${e} held since ${n.src} f${Math.round(n.f)}`},hand(e,t){let r=i.fr(t).c;if(!(r[`armw_${e}`]>.5))return{label:`arm ${e} (FK: aswing_${e}/abend_${e}, or armw_${e} 1 and hand_${e})`,ch:`aswing_${e}`};let a=null;for(let[t,n]of Object.entries(r)){let r=/^w_(.+)_([lr])$/.exec(t);r&&r[2]===e&&n>.5&&(!a||n>a.w)&&(a={w:n,anchor:r[1],ch:t})}if(!a)return{label:`hand_${e}`,ch:`hand_${e}`};let o=(n.fits??[]).findIndex(t=>t.anchor===a.anchor&&t.side===e);return{label:`anchor ${a.anchor}`,ch:a.ch,anchor:a.anchor,fit:o>=0?o:null}}};return i}function Jb(e,t,n,r,{limit:i=16,userSpec:a}={}){if(!r.length)return r;let o=qb(e,t,n);for(let e of r.slice(0,i))try{let t=Gb[e.kind]?.(o,e);t&&(e.cause=t.cause,e.hint=t.hint),t?.fix&&Object.defineProperty(e,"fix",{value:t.fix,enumerable:!1,configurable:!0})}catch(t){e.cause=`unknown`,e.hint=`no hint (${t.message})`}return Wb(r,{X:o,userSpec:a})}var Yb=new Set([`ORIENT`,`BELOW`,`CLEARANCE`]),Xb=e=>Math.max(0,Yb.has(e.kind)?e.limit-e.worst:e.worst-e.limit),Zb=e=>e.count*(1+Math.min(3,Xb(e)/Math.max(Math.abs(e.limit),.01))),Qb=e=>Math.round(Zb(e)*100)/100,$b=/(?<![\w\-.[])[-+]?\d+(\.\d+)?|\bf\d+\b/g,ex=e=>{let t=e.subject.indexOf(`: `),n=t>=0?e.subject.slice(0,t+2):``;return`${e.kind} ${n}${e.subject.slice(n.length).replace($b,e=>e[0]===`f`?`f#`:`#`)}`};function tx(e){for(let t of e)t.excess=Math.round(Xb(t)*1e4)/1e4,t.severity=Qb(t);return e.sort((e,t)=>(t.kind===`GOAL`)-(e.kind===`GOAL`)||t.severity-e.severity||t.count-e.count)}function nx(e){let t=new Map;for(let n of e){let e=ex({kind:n.kind,subject:n.msg}),r=t.get(e)??{kind:n.kind,subject:n.msg,count:0,worst:n.value,worstFrame:n.frame,first:n.frame,last:n.frame,limit:n.limit};r.count++,r.first=Math.min(r.first,n.frame),r.last=Math.max(r.last,n.frame),(Yb.has(n.kind)?n.value<r.worst:n.value>r.worst)&&(r.worst=n.value,r.worstFrame=n.frame,r.subject=n.msg),t.set(e,r)}return tx([...t.values()])}function rx(e,t,n,r={}){let i=n.checks??{},a=R_(t,n.goals??[]),o=[...bl(e,t,{allow:i.allow,limits:i.limits,mouthPoints:i.mouthPoints}),...yv(t,i),...zv(e,t,n),...iy(e,t),...Gg(e,t),...rl(t,i),...al(e,t,i,{...gl,...i.limits}),...by(e,t),...Ty(e,t,i),...a.issues];if(t.f0)for(let e of o)e.frame+=t.f0;let s=nx(o);return r.explain!==!1&&Jb(e,t,n,s,{userSpec:r.userSpec}),{ok:o.length===0,total:o.length,problems:s.length,...n.goals?{goals:a.results}:{},groups:s}}var ix=[`contacts`,`orient`,`below`,`clearance`,`appear`];function ax(e){let t=e?.checks;if(!t||typeof t!=`object`||!ix.some(e=>Array.isArray(t[e])&&t[e].some(e=>e&&typeof e==`object`&&e.name===void 0)))return e;let n={...t};for(let e of ix)Array.isArray(t[e])&&(n[e]=t[e].map((t,n)=>t&&typeof t==`object`&&t.name===void 0?{...t,name:`${e}[${n}]`}:t));return{...e,checks:n}}var ox=(e,t)=>({...t,...e?{description:e}:{}}),sx=(e,t)=>ox(e,{type:`number`,...t}),cx=(e,t)=>ox(e,{type:`integer`,...t}),$=(e,t)=>ox(e,{type:`string`,...t}),lx=(e,t)=>ox(e,{type:`boolean`,...t}),ux=(e,t)=>ox(t,{$ref:`#/$defs/${e}`}),dx=e=>ox(e,{enum:[`l`,`r`]}),fx=(e,t)=>ox(t,{type:`array`,prefixItems:[e,e],minItems:2,maxItems:2}),px={vec3:{type:`array`,items:{type:`number`},minItems:3,maxItems:3},frameSpan:{type:`array`,items:{type:`integer`,minimum:0},minItems:2,maxItems:2,description:`[f0, f1] inclusive`},ref:{type:`string`,pattern:`^(${$a.join(`|`)}):.+$`,description:`a point ref (topic refs)`},checkRef:{type:`string`,pattern:`^(joint|prop|anchor):.+$`,description:`joint:<Bone> | prop:<prop>.<point> | anchor:<name>`},part:{type:`string`,description:`a body capsule: ${ua.map(e=>e[0]).join(`, `)}; allow matches a prefix (hand = hand_l and hand_r)`},when:{oneOf:[{type:`string`,description:`a weight channel: active where it is > 0.99`},{$ref:`#/$defs/frameSpan`}]}},mx={f:cx(`frame`,{minimum:0}),set:{type:`object`,description:`{ channel: value } (topic channels)`},step:{type:`array`,items:{type:`string`},description:`channels that jump at f instead of easing in`},src:$(`written by the skills expander; leave it out`)},hx={skill:$(`a skill name (topic skills)`),args:{type:`object`,description:`the skill's args (topic skills with name)`},f0:cx(`first frame`,{minimum:0})},gx={type:{const:`walk`},f0:cx(`first frame; needs a standing pose keyed before it`,{minimum:0}),steps:cx(`footsteps`,{minimum:1,default:8}),step:sx(`stride, m`,{default:.5}),period:cx(`frames per step`,{default:20}),swing:cx(`frames a foot is in the air`,{default:14}),halfWidth:sx(`feet half-width, m`,{default:.08}),lift:sx(`foot lift, m`,{default:.08}),heading:fx({type:`number`},`[h0, h1] degrees; ${mo.yaw}`),turnDistance:sx(`m walked while the heading turns h0 -> h1`,{default:.4}),pelvisHigh:sx(`hips offset over the stance foot, m`),pelvisLow:sx(`hips offset at double support, m`),firstStep:sx(`first stride, m`,{default:.4}),armSwing:sx(`degrees`,{default:14}),vary:sx(`0..2, uneven steps as people walk (build-up, slow stop, left/right, turns) around the averages above; 0 = every step period frames, step m`,{default:1,minimum:0,maximum:2})},_x={schema:{const:`cozyclay.motion-spec.v1`},fps:{const:24},frames:{oneOf:[cx(null,{minimum:1,maximum:2e4}),{const:`auto`,description:`the last skill end, generator end or key f, plus 1 (open values at their upper bound); the stored spec keeps the number`}]},label:$(`a short name for the take`),keys:{type:`array`,items:{$ref:`#/$defs/key`}},anchors:{type:`object`,description:`name -> anchor (topic anchors)`},props:{type:`object`,description:`name -> held prop (topic props)`},fits:{type:`array`,description:`topic props`},objects:{type:`object`,description:`scene object id -> hinge, carry, switch, follow or free (topic objects)`},generators:{type:`array`,items:{$ref:`#/$defs/walk`}},checks:{type:`object`,description:`topic checks`},fix:{oneOf:[{const:!1},{type:`object`}],description:`topic fix`},use:{type:`array`,items:{$ref:`#/$defs/use`}},channels:{type:`array`,items:{type:`string`},description:`extra numeric channels your keys set`},detourRadius:sx(`m; a hand moving between targets arcs around the torso this far out`,{default:.25}),search:{type:`object`,properties:{budget:cx(`compiles at most`,{minimum:1,maximum:64,default:32})},additionalProperties:!1},goals:{type:`array`,description:`topic goals`},flow:{oneOf:[{const:!1},{type:`object`}]},idle:{const:!1,description:`held poses do not breathe`}},vx={p:ux(`vec3`,`world: a world point (m); body: root-relative, ${mo.pole}`),bone:$(`bone name`),offset:ux(`vec3`,`world offset, m`),from:$(`bone`),to:$(`bone`),t:sx(`0 = from .. 1 = to`,{default:.5}),tMin:sx(`with reach: the lowest t to slide back to`,{default:.15}),reach:dx("slide toward `from` until this arm reaches"),object:$(`scene object id`),local:ux(`vec3`,`point in the object's frame, m`),name:{const:`mouth`},prop:$(`a prop held by the other hand`),point:$(`a point of that prop, or origin`),person:$(`a character id`),socket:$(`a socket of the object`),grasp:{enum:co,description:`the hand takes it by a socket`}},yx=e=>ux(`vec3`,`${e} [d, l, n] on the palm axes (d to the middle finger, l to the thumb side, n = d x l), m`),bx={world:[`p`],body:[`p`],bone:[`bone`],segment:[`from`,`to`],object:[`object`],landmark:[`name`],prop:[`prop`,`point`],person:[`person`,`bone`]},xx={hand:dx(),origin:{type:`array`,items:{type:`string`},minItems:1,description:`bones whose mean is the prop origin`},points:{type:`object`,additionalProperties:yx(`point:`),description:`name -> point`}},Sx={side:dx(),anchor:$(`an anchor name`),effector:{oneOf:[{type:`object`,properties:{prop:$(),point:$()},required:[`prop`,`point`]},{type:`object`,properties:{joints:{type:`array`,items:{type:`string`}}},required:[`joints`]}],description:`the hand point fitted onto the anchor`},offset:ux(`vec3`,`world offset, m`),orient:{type:`boolean`,description:`false: no grip turn`}},Cx={f:cx(),pos:ux(`vec3`),rot:{type:`array`,items:{type:`number`},minItems:4,maxItems:4,description:`quat x, y, z, w`},aim:ux(`vec3`,`or rot: +Y dir`),roll:sx(`deg about aim`),lean:sx(`aim tilt`,{minimum:0,maximum:45})},wx={type:`object`,properties:{at:cx(),onto:$(),bounce:sx(null,{default:.25,minimum:0,maximum:.6}),tumble:{type:`boolean`},v:{oneOf:[{$ref:`#/$defs/vec3`},{const:`hand`}],description:`m/s`}},required:[`at`],additionalProperties:!1},Tx={description:`as carry; keys at any frame`},Ex={keys:Tx,fall:Tx},Dx={pivot:ux(`vec3`,`world hinge point`),axis:ux(`vec3`,`default +Y`),channel:$(`angle channel, deg`),prop:$(`spec.props name: it rides that hand`),at:ux(`vec3`,`palm offset [d, l, n]`),along:ux(`vec3`,`+Y on the palm, fixed`),visible:$(`channel: shown > 0.5`),level:$(`channel: strength 0..4`),grab:cx(`hand takes it`,{default:0}),release:cx(`let go (else end)`),keys:{type:`array`,items:{type:`object`,properties:Object.fromEntries(qa.map(e=>[e,Cx[e]])),required:[`f`,`pos`],additionalProperties:!1},description:`world pose at f; hand follows`},fall:{...wx,description:`or a list; topic objects`},grasp:{enum:co},mass:sx(`kg`,{minimum:.01,maximum:60}),follow:ux(`ref`),offset:ux(`vec3`),aim:{oneOf:[{enum:[`face`,`up`]},{$ref:`#/$defs/vec3`},{$ref:`#/$defs/ref`}],default:`up`}},Ox={name:$(`the QA group's name`),point:ux(`checkRef`),target:ux(`checkRef`),tol:sx(`m; default contacts 0.01, appear 0.035, supports 0.04`),when:ux(`when`),from:ux(`checkRef`),to:ux(`checkRef`),along:{oneOf:[{enum:[`face`,`up`]},{$ref:`#/$defs/vec3`}]},minCos:sx(`default 0.64`),joint:$(`bone`),ref:$(`bone`),min:sx(`m; below default 0.08`),part:ux(`part`),object:$(`scene object id`),frames:ux(`frameSpan`),channel:$(`a visibility channel`),anchor:$(`an anchor name`),depth:sx(`allowed depth, m`)},kx={contacts:[`point`,`target`],orient:[`from`,`to`,`along`],below:[`joint`,`ref`],clearance:[`part`,`object`,`min`],appear:[`channel`,`joint`,`anchor`],supports:[`object`],allow:[`part`,`object`,`depth`]},Ax={limits:{type:`object`,properties:Object.fromEntries(Object.entries(gl).map(([e,t])=>[e,sx(null,{default:t})])),additionalProperties:!1},mouthPoints:{type:`array`,items:$(`prop.point`),description:`prop points allowed at the mouth`}},jx={name:$(),near:fx({$ref:`#/$defs/ref`},`distance <= tol`),above:fx({$ref:`#/$defs/ref`},`a.y - b.y >= by`),moved:$("a ref or an object id: an object's base moves at least `by` from the scene pose; any other point (prop:, joint:, landmark:, anchor:) at least `by` from where it is at at[0] (at: [f0, f1])"),still:$("a ref or an object id: stays within `tol` of where moved measures from (an object: its scene pose; a point: where it is at at[0], at: [f0, f1])"),speed:$("a point ref: its speed reaches `by` m/s (mode any by default)"),tol:sx(`m; near default 0.05, still 0.01`),by:sx(`above m, default 0; moved m, default 0.05; speed m/s, needed`),at:{oneOf:[cx(null,{minimum:0}),{$ref:`#/$defs/frameSpan`}],description:`absolute frame or span`},mode:{enum:[`all`,`any`],description:"every frame of `at`, or one; default all, speed any"},after:$(`a goal's name: at starts after the first frame that goal holds`),before:$(`a goal's name: at ends before the first frame that goal holds`)},Mx={name:$(`the key of the answer`),distance:fx({$ref:`#/$defs/ref`},`min/max/mean/first/last m`),position:ux(`ref`,`world points`),frames:ux(`frameSpan`,`absolute, default the whole take`),every:cx(`position: every n frames (<= 16 rows)`,{minimum:1})},Nx={reach:lx(`wrist targets past reach go onto it softly; hips lower for near-miss ankles`,{default:!0}),slide:lx(`lifts sunk soles; a planted heel or ball drifting under 1 cm stays put; a heel-up foot pivots on its ball`,{default:!0}),penetration:{oneOf:[{type:`boolean`},{type:`number`,minimum:0,maximum:.05}],default:0,description:`push hands out of boxes up to this depth, m (true = 0.02)`},self:lx(`arms kept out of the body's skin (wrists, elbows)`,{default:!0}),retime:lx(`speed spikes borrow frames from the neighbouring keys`,{default:!1}),stance:lx(`a standIdle stance in a scene body slides out of it (observations.placed)`,{default:!0}),grasp:lx(`fingers close on what the hand holds; it rests in the hand`,{default:!0})},Px={joint:`joint:<Bone>`,bone:`bone:<Bone> (= joint:)`,prop:`prop:<prop>.<point> (origin exists)`,anchor:`anchor:<name>`,landmark:`landmark:mouth`,object:`object:<id>[.center|.top|.base], a body or group; bare = its surface (distance)`,person:`person:<id>.<Bone>`},Fx=e=>e.f0+16+(e.steps??8)*(e.period??20)+18,Ix=e=>({type:`array`,items:{type:`number`},minItems:2,maxItems:2,description:e}),Lx=e=>Object.fromEntries(e.map(e=>[e,$(e===`car`?`car prefix: fills <car>_Seat_Driver, _Seat_Driver_Back, _Door_L/R, _Door_Handle, _Steering_Wheel`:`scene object id (overrides the car default)`)])),Rx=Object.fromEntries(Ja.filter(e=>e!==`type`&&e!==`f0`).map(e=>[e,gx[e]])),zx={standIdle:{args:{at:Ix(`[x, z] world m; default the root keyed before f0, else within reach of the next reachGrip's anchor (output.observations.placed); a stance in a body slides out of it`),heading:sx(`degrees (yaw); default the keyed yaw`),until:cx(`hold the pose to this frame`)},needs:`args.at, or a root keyed before f0`,frames:`1 (to args.until when given)`,adds:[`keys: a standing pose, FK arms down`],example:{f0:0,args:{at:[0,0],heading:0}},place:{at:.03}},walkTo:{args:{to:Ix(`[x, z] world m: the heading turns toward it and the steps cover the distance`),...Rx,heading:{oneOf:[sx(),gx.heading],description:`degrees: h1, or [h0, h1]`},arrive:cx(`with to and no steps/period/step/swing: the frame to end by (feet together); the engine picks the cadence (observations.planned)`)},needs:`a standing pose keyed before f0`,frames:`16 + steps * period + 18`,adds:[`keys: a walk ending feet together`],example:{f0:10,args:{to:[.5,1.5]}},tune:{lift:.01,halfWidth:.01,firstStep:.01,step:.01},place:{firstStep:.03,step:.03}},reachGrip:{args:{anchor:$(`not ending in _l/_r`),side:dx(`the hand`),reach:cx(`frames to reach`,{default:20}),hold:cx(`frames held`,{default:22}),release:cx(`frames to let go`,{default:12}),elbow:ux(`vec3`,`pole`),fingers:{enum:so,default:`grip`},define:{type:`object`,description:`defines anchor args.anchor`},orient:{type:`boolean`,description:`false: no grip turn`}},required:[`anchor`,`side`],needs:`args.anchor in anchors or define`,frames:`reach + hold + release (54)`,adds:[`props.<anchor>Grip (fingers point)`,`fits: fingers on the anchor`,`checks.contacts "fingers on <anchor>"`,`checks.allow hand on its object`,`keys: w_<anchor>_<side>, fingers_<side>, armw_<side>`],example:{f0:10,args:{anchor:`bar`,side:`r`,define:{kind:`world`,p:[-.2,1.2,.33]}}},tune:{reach:2,release:2}},sitInSeat:{args:{...Lx([`car`,`seat`,`seatBack`,`wheel`]),offset:{...ux(`vec3`,`hips from the seat top, seat frame`),default:[0,.17,.02]},floor:sx(`floor y under the feet, m`)},needs:`args.car or args.seat (a scene box)`,frames:`1`,adds:[`keys: seated, hands at the wheel`,`checks.supports seat`,`checks.allow seat, back, wheel`],example:{f0:0,args:{car:`Car`}}},exitCar:{args:{...Lx([`car`,`seat`,`door`,`handle`]),side:dx(`driver door side, default l`),channel:$(`the door hinge channel`,{default:`door`})},needs:`seated in the car before f0 (sitInSeat); a car on the ground (seat base y 0.4)`,frames:`246`,adds:[`objects: door and handle hinges`,`anchors handle, lthigh, rthigh`,`props.grip`,`fits, checks.contacts, checks.allow`],example:{f0:0,args:{car:`Car`}}},flip:{args:{kind:{enum:[`back`,`front`,`cartwheel`],default:`back`,description:`a standing back or front tuck, or a cartwheel`},travel:sx(`back/front: m along the heading at landing (default back -0.25, front 0.4)`),side:dx(`cartwheel: toward the character's l (default) or r`),heading:sx(`degrees (yaw); default the keyed yaw`)},needs:`a standing pose keyed before f0`,frames:`back/front 58 (one turn, the hips 0.5 m up); cartwheel 68`,adds:[`keys every frame: back/front crouch, push-off, a ballistic tucked flight turning the whole body (pitch to -360 back, +360 front) and a landing that stands up`,`cartwheel: a side step, then the whole body rolls 360 like a wheel on the straddled legs and the arms overhead, the hands planted in turn`,`whole-body pitch and roll take full turns in any key (no range); past 60 deg the knee and elbow poles and the feet turn with the body`],example:{f0:10,args:{kind:`back`}}},smokeCigarette:{args:{until:cx(`hold to this frame; default the last frame; under f0+264 the beats are paced to fit`),kit:{type:`object`,properties:{cig:$(`the cigarette kit's rootId (object.createKit)`),lighter:$(`the lighter kit's rootId`),exhale:$(`the exhale kit's rootId (or an effect): it follows the mouth`)},required:[`cig`,`lighter`],additionalProperties:!1,description:`kits the skill carries and lights: it adds their spec.objects entries itself`}},needs:`a stand or squat keyed before f0`,frames:`265 nominal; fits 199..264 by pacing`,adds:[`anchors lpocket, rpocket, hold, mouth, flame`,`props cig, lighter`,`channels cig_vis, lit_vis, flame_vis, ember_vis, exhale, ember`,`checks contacts, orient, below, appear, mouthPoints`],example:{f0:0,args:{}}},hitReaction:{args:{dir:Ix(`[x, z] the way the body is thrown`),from:$(`or what hits it: object:<id> | person:<id> (thrown away from it)`),speed:sx(`launch speed, m/s (a shove 2, a car at 30 km/h about 8)`,{default:4,exclusiveMinimum:0}),land:{enum:[`back`,`front`],description:`default: back when hit from the front`}},needs:`a pose; dir or from`,frames:`~40`,adds:[`keys: thrown to rest`],example:{f0:10,args:{dir:[0,-1],speed:3}}},throwObject:{args:{object:$(`the carried object's id (objects.<id>.prop on the hand's prop)`),side:dx(`the throwing hand (default r)`),to:{type:`array`,items:{type:`number`},minItems:3,maxItems:3,description:`[x, y, z] world m: where it lands`},arc:{enum:[`low`,`high`],description:`launch angle: low 20 deg, high 50 deg (default low)`}},required:[`object`,`to`],needs:`the object in that hand (its objects entry on the hand's prop)`,frames:`24 (wind-up, swing, release at f0+18, follow-through)`,adds:[`keys: wind-up, swing, follow-through`,`objects.<id>: release and fall { v: "hand" } when the entry leaves them out`,`goals: <id> lands at the target`],example:{f0:40,args:{object:`ball`,to:[0,0,5]}}},catchObject:{args:{object:$(`the flying object's id (objects.<id>.fall { at, v })`),side:{enum:[`r`,`both`],description:`the right hand, or both (a thing over 1 kg takes both)`}},required:[`object`],needs:`the object flying: objects.<id>.fall { at, v }`,frames:`to the catch (the first frame in reach, at least 10 from f0) + 14`,adds:[`keys: reach, close, give with it`,`objects.<id>: prop, grab, grasp when the entry leaves them out`,`props.<id>Catch`],example:{f0:0,args:{object:`ball`}}}},Bx={_l:`_r`,_r:`_l`},Vx=/^(yaw|roll|spine_yaw|spine_roll|head_yaw|head_roll|fyaw_[lr]|wtwist_[lr]|wflex_[lr])$/,Hx=/^(root|foot_[lr]|hand_[lr])$/,Ux=/^(knee|elbow)_[lr]$/,Wx=/^(yaw|fyaw_[lr])$/,Gx=e=>e&&typeof e==`object`?structuredClone(e):e,Kx=e=>e.replace(/_(l|r)$/,e=>Bx[e]).replace(/^(Left|Right)/,e=>e===`Left`?`Right`:`Left`),qx=()=>({origin:[0,0,0],yaw:0,mirror:!1,negate:new Set,names:{}}),Jx=(e,t)=>V(e.origin,J(X(e.yaw),e.mirror?[-t[0],t[1],t[2]]:t)),Yx=(e,t)=>e.mirror?[-t[0],t[1],t[2]]:t.slice();function Xx(e,t){if(!e.mirror)return t;let n=/^w_(.+)_([lr])$/.exec(t);return n?`w_${e.names[n[1]]??n[1]}_${n[2]===`l`?`r`:`l`}`:/_[lr]$/.test(t)?Kx(t):t}function Zx(e,t){let n={};for(let[r,i]of Object.entries(t)){let t=Gx(i);Hx.test(r)?t=Jx(e,t):Ux.test(r)?t=Yx(e,t):typeof t==`number`&&(e.mirror&&(Vx.test(r)||e.negate.has(r))&&(t=-t),Wx.test(r)&&(t+=e.yaw)),n[Xx(e,r)]=t}return n}function Qx(e,t=0,n=qx()){let r=[],i=e=>Xx(n,e);return{state:e,keys:r,frame:n,at(i,a){let o=Zx(n,a);Object.assign(e,Gx(o)),r.push({f:t+i,set:o})},hold(n,...a){r.push({f:t+n,set:Object.fromEntries(a.filter(t=>e[i(t)]!==void 0).map(t=>[i(t),Gx(e[i(t)])]))})},step(n,a,o){let s=i(a);r.push({f:t+n-1,set:{[s]:e[s]}}),e[s]=o,r.push({f:t+n,set:{[s]:o},step:[s]})}}}var $x=(e,t)=>{throw Error(`MOTION_SPEC_INVALID: ${e}: ${t}`)};function eS(e,t,n){let r=e.scene?.objects?.[n];return r||$x(e.tag,`args.${t} "${n}" is not a scene object`),r}var tS=e=>Math.atan2(e[0][2],e[2][2])*180/Math.PI,nS=.01,rS=.12,iS=.8,aS=.01,oS=.15,sS=.62,cS=[`Left`,`Right`].flatMap(e=>[[`${e}UpLeg`,`${e}Leg`,.07],[`${e}Leg`,`${e}Foot`,.05],[`${e}Foot`,`${e}ToeBase`,.045],[`${e}ToeBase`,`${e}Toe_End`,.04]]).concat([[`LeftUpLeg`,`RightUpLeg`,.095],[`Hips`,`Spine2`,.12]]),lS=[[0,-1],[1,0],[-1,0],[Math.SQRT1_2,-Math.SQRT1_2],[-Math.SQRT1_2,-Math.SQRT1_2]];function uS(e,t,n){let r=e.index,i=e.restWorldPos,a=i[r.Hips],o=X(n),s=e=>V([t[0],0,t[1]],J(o,[e[0]-a[0],e[1],e[2]-a[2]])),c=(e,t,n)=>[0,.25,.5,.75,1].map(r=>[V(e,H(t,e).map(e=>e*r)),n]),l=[`Left`,`Right`].flatMap(e=>{let t=i[r[`${e}Arm`]],n=Math.sign(t[0]-a[0])*.04;return c(s(t),s([t[0]+n,t[1]-sS,t[2]]),.045)});return cS.filter(([e,t])=>r[e]!==void 0&&r[t]!==void 0).flatMap(([e,t,n])=>c(s(i[r[e]]),s(i[r[t]]),n)).concat(l)}var dS=e=>Object.values(e?.objects??{}).filter(e=>e.half&&e.pos&&e.R&&e.pos[1]+2*e.half[1]*e.R[1][1]>rS);function fS(e,t,n,r){let i=1/0;for(let[a,o]of uS(e,n,r))for(let e of t)i=Math.min(i,fa(a,e)-o-nS);return i}function pS(e,t,n,r){let i=dS(t);if(!i.length||fS(e,i,n,r)>=0)return null;let a=X(r);for(let t=aS;t<=.600000001;t+=aS)for(let[o,s]of lS){let c=J(a,[o*t,0,s*t]),l=[n[0]+c[0],n[1]+c[2]];if(fS(e,i,l,r)>=0)return{at:l.map(e=>+e.toFixed(4)),moved:+t.toFixed(2)}}return null}function mS(e,t){if(t?.kind===`world`&&Array.isArray(t.p))return t.p;if(t?.kind!==`object`||!e)return null;let n=e.objects?.[t.object]??e.groups?.[t.object];if(!n)return null;if(!t.grasp||t.local)return V(n.pos,J(n.R,t.local??[0,0,0]));let r=Ud(e,t.object).map(t=>e.objects[t]).filter(e=>e?.half).map(e=>V(e.pos,J(e.R,[0,e.half[1],0])));return r.reduce((e,t)=>V(e,t.map(e=>e/r.length)),[0,0,0])}function hS(e){let{sk:t,scene:n,use:r=[],index:i=-1}=e,a=r.slice(i+1).find(e=>e?.skill===`reachGrip`),o=mS(n,a&&(a.args?.define??e.anchors?.[a.args?.anchor]));if(!o)return null;let s=t.index,c=t.restWorldPos,l=a.args.side===`l`?`Left`:`Right`,u=c[s.Hips],d=c[s[`${l}Arm`]],f=G(H(c[s[`${l}ForeArm`]],d))+G(H(c[s[`${l}Hand`]],c[s[`${l}ForeArm`]]))+G(H(c[s[`${l}HandMiddle2`]],c[s[`${l}Hand`]])),p=d[1]-o[1],m=Math.max(oS,Math.sqrt(Math.max(0,(iS*f)**2-p*p))),h=e.args.heading??e.state?.yaw??0,g=X(h),_=dS(n),v=J(g,[d[0]-u[0],0,d[2]-u[2]+m]),y=[o[0]-v[0],o[2]-v[2]],b=0,x=y;for(;b<=.600000001&&fS(t,_,x,h)<0;b+=aS){let e=J(g,[0,0,-(b+aS)]);x=[y[0]+e[0],y[1]+e[2]]}return{at:x.map(e=>+e.toFixed(4)),heading:h,anchor:a.args.anchor,moved:+b.toFixed(2)}}var gS=.65,_S=.75,vS=.75,yS=.025,bS=.1,xS=.08,SS=.12,CS=.4,wS=.3,TS=[.15,.3,.45,.6,.7,.8,.9],ES=e=>e*e*e*(10-15*e+6*e*e),DS=.9,OS=.7,kS=(e,t)=>{let n=Math.min(1,Math.max(0,e));return n<OS?DS*ES((n/OS)**+t):DS+.09999999999999998*ES((n-OS)/.30000000000000004)},AS=e=>[...new Map(TS.map(t=>Math.round(t*e)).filter(t=>t>0&&t<e).map(t=>[t,[kS(t/e,gS),kS(t/e,_S)]])).entries()].map(([e,[t,n]])=>[e,t,n]),jS=180/Math.PI,MS=(e,t,n)=>Math.max(t,Math.min(n,e));function NS(e,t){let n=PS(e,t),r=e.sk.index;return!!n&&n[1]>=e.sk.restWorldPos[r.LeftLeg][1]+bS}function PS(e,t){if(t?.kind===`world`&&Array.isArray(t.p))return t.p.map(Number);let n=t?.kind===`object`?e.scene?.objects?.[t.object]:null;return!n||[t.object,...n.ancestors??[]].some(t=>FS(e,t))?null:V(n.pos,J(n.R,t.local??[0,n.half?.[1]??0,0]))}function FS(e,t){let n=e.objects?.[t];return!n||typeof n!=`object`?!1:n.follow!==void 0||n.hinge!==void 0||Math.min(...(n.keys??[]).map(e=>e.f).filter(Number.isFinite),n.fall?.at??1/0)<(e.until??1/0)}var IS=new WeakMap;function LS(e){if(!IS.has(e)){let t=xr(e),n=e.index;Kr(e,t,`Right`,{}),IS.set(e,G(H(t.P[n.RightHandThumb4],t.P[n.RightHandIndex4])))}return IS.get(e)}function RS(e,t){let n=e.scene?.objects??{};if(t?.kind===`object`)return n[t.object]?.half?n[t.object]:null;if(t?.kind!==`world`||!Array.isArray(t.p))return null;let r=t.p.map(Number);return Object.values(n).filter(e=>e.half&&fa(r,e)<=.01).sort((e,t)=>fa(r,e)-fa(r,t))[0]??null}function zS(e,t,n,r){let i=n[0]-t[0],a=n[2]-t[2],o=Math.hypot(i,a);if(o<1e-6)return!1;let s=[t[0]+i/o*xS,t[1],t[2]+a/o*xS];return Object.entries(e.scene?.objects??{}).some(([e,t])=>{if(!t.half||r.has(e)||r.has(t.parent))return!1;let n=H(s,[0,SS,0]);return fa(s,t)>0&&fa(n,t)<=0})}function BS(e,t,n){let r=RS(e,t),i=PS(e,t)??(r&&V(r.pos,J(r.R,[0,r.half[1],0])));if(!r||!i||2*Math.min(...r.half)+yS>LS(e.sk))return!1;let a=new Set(Object.entries(e.scene.objects).filter(([,e])=>e===r).map(([e])=>e));return!(Array.isArray(n.root)&&zS(e,i,n.root,a))}function VS(e,t,n){let r=PS(e,t),i=n.root;if(!r||!Array.isArray(i))return null;let a=e.sk.restWorldPos,o=e.sk.index,s=[i[0],i[1]+a[o.Head][1]-a[o.Hips][1],i[2]],c=[r[0]-s[0],r[1]-s[1],r[2]-s[2]],l=Math.hypot(c[0],c[2]);if(l<.05)return null;let u=Math.atan2(c[0],c[2])*jS-(n.yaw??0)-(n.spine_yaw??0);for(;u>180;)u-=360;for(;u<-180;)u+=360;let d=Math.atan2(-c[1],l)*jS-(n.pitch??0)-(n.spine_pitch??0);return{head_yaw:MS(vS*u,-60,60),head_pitch:MS(vS*d,-30,50)}}var HS=(e,t,n)=>e.some(e=>e.f>=t&&e.f<=n&&(e.set?.head_yaw!==void 0||e.set?.head_pitch!==void 0)),US=(e,t)=>uo[e]?uo[e].map((e,n)=>n===2&&t===`r`?-e:e):[0,0,0];function WS(e){let{sk:t,args:n,state:r}=e,i=t.index,a=t.restWorldPos,o=a[i.LeftFoot][1],s=n.heading??r.yaw??0,c=n.at??(r.root?[r.root[0],r.root[2]]:null),l=null;if(!c){let t=hS(e);t||$x(e.tag,`needs args.at: [x, z] (no root is keyed before f0), or a reachGrip after it to stand within reach of`),{at:c,heading:s}=t,l={at:c,heading:s,why:`within reach of anchor ${t.anchor}`}}else if(n.at&&e.place!==!1){let n=pS(t,e.scene,[c[0],c[c.length-1]],s);n&&(c=n.at,l={at:c,heading:s,why:`moved ${n.moved} m out of a scene body`})}let u=[c[0],0,c[c.length-1]],d=X(s),f=e=>{let t=V(u,J(d,e));return t[1]=o,t},p={root:[u[0],a[i.Hips][1]-.01,u[2]],yaw:s,pitch:0,roll:0,spine_yaw:0,spine_pitch:0,spine_roll:0,head_yaw:0,head_pitch:0,foot_l:f([.09,0,-.03]),foot_r:f([-.09,0,.03]),fyaw_l:s,fyaw_r:s,fpitch_l:0,fpitch_r:0,knee_l:[.05,0,1],knee_r:[-.05,0,1],armw_l:0,armw_r:0,aswing_l:0,aswing_r:0,abend_l:0,abend_r:0,arm_hang:1},m=[{f:e.f0,set:p}];return n.until!==void 0&&m.push({f:n.until,set:structuredClone(p)}),{keys:m,end:n.until??e.f0,...l?{placed:l}:{}}}function GS(e){let{args:t,state:n}=e;(!n.foot_l||!n.foot_r||!n.root)&&$x(e.tag,`needs a standing pose keyed before f0 (use standIdle or another skill first)`);let r={type:`walk`,f0:e.f0,...t};delete r.to,delete r.arrive;let i=n.yaw??0,a=t.step??.5,o=t.firstStep??.4;if(t.to){let e=[(n.foot_l[0]+n.foot_r[0])/2,(n.foot_l[2]+n.foot_r[2])/2],s=t.to[0]-e[0],c=t.to[t.to.length-1]-e[1],l=Math.hypot(s,c),u=Math.atan2(s,c)*180/Math.PI;for(;u-i>180;)u-=360;for(;u-i<-180;)u+=360;r.heading=t.heading??[i,u],r.steps=t.steps??Math.max(2,2+Math.round((l-o)/a))}typeof r.heading==`number`&&(r.heading=[i,r.heading]);let s=ih(r,e.keys,e.sk,e.tag),c=Fx(r),l=e.frames-1;return c>l&&Math.max(...s.filter(e=>e.f<c).map(e=>e.f))<=l?{keys:s.filter(e=>e.f<=l),end:l,cut:`settle cut at f${l} (hold to the end)`}:{keys:s,end:c}}function KS(e={},t,n,r){let i=t=>e[t]&&JSON.stringify(e[t])!==JSON.stringify(r);if(!i(t))return t;let a=`${t}_${n}`;for(let e=2;i(a);e++)a=`${t}_${n}${e}`;return a}var qS=(e,t)=>{let n=e?.objects??{};if(!t||n[t]||t.startsWith(`person:`))return t?[t]:[];let r=Object.keys(n).filter(e=>n[e].ancestors?.includes(t));return r.length?r:[t]};function JS(e){let{args:t,state:n}=e,r=t.side,i=t.anchor;r!==`l`&&r!==`r`&&$x(e.tag,`args.side must be "l" or "r", got ${JSON.stringify(r)}`),(typeof i!=`string`||/_[lr]$/.test(i))&&$x(e.tag,`args.anchor must name an anchor (not ending in _l/_r)`);let a=t.reach??20,o=t.hold??22,s=t.release??12,c=(t.define??e.anchors?.[i])?.grasp,l=t.fingers??lo[c]??`grip`,u=`w_${i}_${r}`,d=`fingers_${r}`,f=`armw_${r}`,p=`elbow_${r}`,m=!(n[f]>.5),h=e.frames-1,g=e.f0+a<=h&&e.f0+a+o+s>h,_=Math.min(a+o,h-e.f0);for(let[e,t]of[[u,0],[d,{[l]:0}],[f,0]])n[e]===void 0&&(n[e]=t);let v=a+o+s,y={...e,until:e.f0+a},b=!HS(e.keys??[],e.f0,e.f0+v)&&VS(y,t.define??e.anchors?.[i],n),x=b?{head_yaw:n.head_yaw??0,head_pitch:n.head_pitch??0}:null,S=Qx(n,e.f0);S.hold(0,u,d,f,p,...b?[`head_yaw`,`head_pitch`]:[]);let C=t.define??e.anchors?.[i],w=n[u],T=n[f],E=(e,t,n)=>e+(t-e)*n;if(NS(y,C))for(let[e,t,n]of AS(a))S.at(e,{[u]:E(w,1,t),[f]:E(T,1,n)});let D=Math.round(CS*a);D>0&&D<a&&BS(y,C,n)&&S.hold(D,d),b&&S.at(Math.max(1,Math.round(wS*a)),b),S.at(a,{[u]:1,[d]:{...n[d],[l]:1},[f]:1,...t.elbow?{[p]:t.elbow}:{}}),S.hold(_,u,d,f,p,...b?[`head_yaw`,`head_pitch`]:[]),g||S.at(v,{[u]:0,[d]:{...n[d],[l]:0},...m?{[f]:0}:{},...x??{}});let O=r===`l`?`Left`:`Right`,k={hand:r,origin:[`${O}HandIndex2`,`${O}HandMiddle2`],points:{fingers:US(c,r)}},ee=KS(e.props,`${i}Grip`,r,k),te=t.define?{[i]:t.define}:{},ne=t.define??e.anchors?.[i],re=ne?.kind===`object`?ne.object:ne?.kind===`person`?`person:${ne.person}`:null;return{keys:S.keys,end:g?h:e.f0+a+o+s,...g?{cut:`${_<a+o?`hold`:`release`} cut at f${h} (hold to the end)`}:{},anchors:te,props:{[ee]:k},fits:[{side:r,anchor:i,effector:{prop:ee,point:`fingers`},...t.orient===!1?{orient:!1}:{}}],checks:{contacts:[{name:`fingers on ${i}`,point:`prop:${ee}.fingers`,target:`anchor:${i}`,tol:.04,when:u}],allow:qS(e.scene,re).map(e=>({part:`hand`,object:e,depth:.04}))}}}var YS=[.54,.4,-.075],XS=.4,ZS=1.0427487182617188,QS=new Set([`l`,`r`]);function $S(e,t=`l`){let n=e.car;return{seat:e.seat??(n&&`${n}_Seat_Driver`),seatBack:e.seatBack??(n&&`${n}_Seat_Driver_Back`),door:e.door??(n&&`${n}_Door_${t.toUpperCase()}`),handle:e.handle??(n&&`${n}_Door_Handle`),wheel:e.wheel??(n&&`${n}_Steering_Wheel`)}}function eC(e,t,n){let r=eS(e,`seat`,t);Math.abs(r.pos[1]-XS)>.05&&$x(e.tag,`seat "${t}" stands at y ${r.pos[1]}; the car skills are tuned for a seat base at y ${XS} (a car on the ground)`);let i=qx();i.yaw=tS(r.R),i.mirror=n===`r`;let a=H(r.pos,J(X(i.yaw),i.mirror?[-YS[0],YS[1],YS[2]]:YS));return i.origin=[a[0],0,a[2]],i.names={lthigh:`rthigh`,rthigh:`lthigh`},i}var tC=[[`hand`,`thigh*`,.07],[`farm`,`thigh*`,.07],[`hand`,`hips`,.07],[`farm`,`hips`,.07],[`hand_l`,`hand_r`,.035]].map(([e,t,n])=>({part:e,object:t,depth:n})),nC=e=>({A:e.restWorldPos[e.index.LeftFoot][1],H:t=>t+(e.restWorldPos[e.index.Hips][1]-ZS)});function rC(e){let{args:t,sk:n}=e,r=$S(t),i=eS(e,`seat`,r.seat),{A:a}=nC(n),o=tS(i.R),s=e=>J(X(o),e),c=t.offset??[0,.17,.02],l=t.floor??i.pos[1],u=V(V(i.pos,J(i.R,[0,2*i.half[1],0])),s(c)),d=e=>{let t=V(u,s([e,0,.452]));return t[1]=l+a,t},f=e=>V(u,s([e,.348,.324])),p={root:u,yaw:o,pitch:0,spine_pitch:-12,spine_yaw:0,spine_roll:0,head_yaw:0,head_pitch:10,foot_l:d(.17),foot_r:d(-.17),fyaw_l:o,fyaw_r:o,fpitch_l:0,fpitch_r:0,knee_l:[.15,.2,1],knee_r:[-.15,.2,1],armw_l:1,armw_r:1,hand_l:f(.22),hand_r:f(-.22),elbow_l:[.6,-1,-.3],elbow_r:[-.6,-1,-.3],aswing_l:0,aswing_r:0,abend_l:0,abend_r:0,wtwist_l:0,wtwist_r:0,wflex_l:0,wflex_r:0},m=[{part:`torso_lo`,object:r.seat,depth:.04},{part:`hips`,object:r.seat,depth:.04},{part:`thigh`,object:r.seat,depth:.045}];return r.seatBack&&e.scene.objects[r.seatBack]&&m.push({part:`torso`,object:r.seatBack,depth:.03}),r.wheel&&e.scene.objects[r.wheel]&&m.push({part:`hand`,object:r.wheel,depth:.05}),{keys:[{f:e.f0,set:p}],checks:{supports:[{object:r.seat,part:`hips`,tol:.04}],allow:m},end:e.f0}}function iC(e){let t=e.args.side??`l`;QS.has(t)||$x(e.tag,`args.side must be "l" or "r", got ${JSON.stringify(t)}`);let n=$S(e.args,t),r=eC(e,n.seat,t),i=e.args.channel??`door`;for(let[t,r]of[[`door`,n.door],[`handle`,n.handle]])eS(e,t,r);r.negate.add(i);let a={[i]:0,w_handle_l:0,w_lthigh_l:0,w_rthigh_r:0,fingers_l:{grip:0,fist:0}},o=Qx(e.state,e.f0,r),s={};for(let[t,n]of Object.entries(a))e.state[Xx(r,t)]===void 0&&(s[t]=n);Object.keys(s).length&&o.at(0,s),aC(o,i,nC(e.sk));let c=e.scene.objects[n.door],l=(r.mirror?-1:1)*c.half[0],u={pivot:V(c.pos,J(c.R,[l,0,c.half[2]])),axis:[0,1,0],channel:i},d=e=>r.mirror?Kx(e):e,f=e=>r.mirror?{lthigh:`rthigh`,rthigh:`lthigh`}[e]??e:e,p=(e,t)=>({kind:`segment`,from:d(`${e}UpLeg`),to:d(`${e}Leg`),t:.45,tMin:.15,offset:[0,.07,0],reach:r.mirror?t===`l`?`r`:`l`:t}),m=r.mirror?`r`:`l`;return{keys:o.keys,objects:{[n.door]:u,[n.handle]:u},anchors:{handle:{kind:`object`,object:n.handle,local:Yx(r,[-.005,.015,0])},[f(`lthigh`)]:p(`Left`,`l`),[f(`rthigh`)]:p(`Right`,`r`)},props:{grip:{hand:m,origin:[d(`LeftHandIndex2`),d(`LeftHandMiddle2`)],points:{fingers:[0,0,0]}}},fits:[{side:m,anchor:`handle`,effector:{prop:`grip`,point:`fingers`}}],checks:{contacts:[{name:`fingers on the door handle`,point:`prop:grip.fingers`,target:`anchor:handle`,tol:.04,when:`w_handle_${m}`}],allow:[{part:`hand`,object:n.door,depth:.03},{part:`hand`,object:n.handle,depth:.04},...tC]},end:e.f0+246}}function aC(e,t,{A:n,H:r}){e.hold(12,`w_handle_l`,`fingers_l`,`head_yaw`,`spine_yaw`,`spine_roll`,`elbow_l`,`hand_l`),e.at(32,{w_handle_l:1,fingers_l:{grip:1,fist:0},head_yaw:35,spine_yaw:10,spine_roll:-8,elbow_l:[.3,-1,-.6],hand_l:[1,.96,.06]}),e.hold(32,t),e.at(38,{[t]:-3}),e.at(50,{[t]:-10,spine_roll:-16,spine_yaw:14}),e.hold(54,`w_handle_l`,`fingers_l`,`w_lthigh_l`,`elbow_l`,t),e.at(66,{w_handle_l:0,fingers_l:{grip:0,fist:0},[t]:-10}),e.at(70,{w_lthigh_l:1,elbow_l:[.5,-.3,-1],spine_roll:-3,spine_yaw:6}),e.at(84,{[t]:-68,head_yaw:40}),e.hold(64,`w_rthigh_r`,`elbow_r`,`spine_pitch`),e.at(80,{w_rthigh_r:1,elbow_r:[-.5,-.3,-1],spine_roll:0,spine_yaw:0,spine_pitch:0}),e.hold(84,`yaw`,`root`,`foot_l`,`foot_r`,`fyaw_l`,`fyaw_r`,`knee_l`,`knee_r`),e.at(92,{foot_r:[.4,XS+n+.03,.36],fyaw_r:15}),e.at(97,{foot_l:[.96,.62,.32],fyaw_l:40,knee_l:[.5,.4,1],yaw:30,root:[.64,.915,-.06]}),e.at(101,{foot_r:[.56,XS+n,.34],fyaw_r:35}),e.at(105,{foot_l:[1.18,.5,.1],fyaw_l:60}),e.at(116,{foot_l:[1.28,n,-.12],fyaw_l:75,knee_l:[.4,.5,1],yaw:62,root:[.82,.9,-.06],head_yaw:20,knee_r:[.1,.6,1],spine_pitch:10}),e.hold(120,`foot_r`,`fyaw_r`),e.at(129,{foot_r:[.94,.64,.36],fyaw_r:65,knee_r:[0,.5,1],yaw:80,root:[.86,.9,-.03]}),e.at(135,{foot_r:[1.18,.5,.26],fyaw_r:85}),e.hold(142,`foot_l`,`fyaw_l`),e.at(144,{foot_r:[1.29,n,.22],fyaw_r:90,knee_r:[-.1,.4,1],yaw:90,root:[.88,.9,.02],head_yaw:0,knee_l:[.1,.4,1],spine_pitch:16}),e.hold(144,`head_pitch`,`pitch`,`elbow_l`,`elbow_r`),e.at(152,{spine_pitch:28,head_pitch:-8,root:[.91,.9,.02],elbow_l:[.6,-.2,-1],elbow_r:[-.6,-.2,-1]}),e.at(162,{spine_pitch:50,pitch:22,head_pitch:-36,root:[.99,.91,.02]}),e.at(174,{root:[1.09,.96,.02],spine_pitch:36,pitch:12,head_pitch:-24}),e.hold(166,`armw_l`,`armw_r`),e.at(186,{root:[1.19,r(1),.02],spine_pitch:12,pitch:3,head_pitch:-8,armw_l:0,armw_r:0}),e.hold(187,`w_lthigh_l`,`w_rthigh_r`),e.at(190,{w_lthigh_l:0,w_rthigh_r:0}),e.at(196,{root:[1.21,r(1.005),.02],spine_pitch:0,pitch:0,head_pitch:0}),e.at(205,{root:[1.26,r(.985),.165]}),e.hold(208,`foot_l`,`fyaw_l`),e.at(212,{root:[1.3,r(.985),.16]}),e.at(214,{foot_l:[1.4,n+.06,-.12]}),e.at(220,{foot_l:[1.535,n,-.132],fyaw_l:110,root:[1.38,r(.98),.05]}),e.at(230,{root:[1.5,r(.975),-.08]}),e.hold(232,`foot_r`,`fyaw_r`),e.at(236,{root:[1.52,r(.975),-.085]}),e.at(239,{foot_r:[1.53,n+.07,.09]}),e.at(246,{foot_r:[1.765,n,-.048],fyaw_r:125,yaw:110,root:[1.62,r(.98),-.08]})}var oC=[`cig`,`lighter`,`exhale`],sC={follow:`landmark:mouth`,aim:`face`,visible:`exhale`},cC={cig:`cigarette`,lighter:`lighter`},lC=.7,uC=[-.05,.07,.1],dC=.88,fC=.2,pC=[.245,.08,.02],mC={l:[.13,-.035,.08],r:[-.13,-.035,.08]};function hC(e,t){return Object.entries(e?.objects??{}).map(([e,t])=>[e,t,!0]).concat(Object.entries(e?.others??{}).map(([e,t])=>[e,t,!1])).filter(([,e])=>e.ancestors?.includes(t))}function gC(e,t,n){let r=t[n];return(typeof r!=`string`||!Io(e.scene)[r])&&$x(e.tag,`args.kit.${n} ${JSON.stringify(r)} is not a group in the scene; object.createKit { kit: "${cC[n]}" } answers its rootId`),r}var _C={cig:.03,lighter:.045},vC=.07,yC=.04;function bC(e,t){let n=e.args.kit;if(n===void 0)return null;(!n||typeof n!=`object`||Array.isArray(n))&&$x(e.tag,`args.kit must be { cig, lighter, exhale? } (kit root ids), got ${JSON.stringify(n)}`);for(let t of Object.keys(n))oC.includes(t)||$x(e.tag,`args.kit has unknown field "${t}"; fields: ${oC.join(`, `)}`);let r=gC(e,n,`cig`),i=gC(e,n,`lighter`),a={[r]:{prop:`cig`,grab:t.cig,at:[0,0,0],along:[0,0,1],visible:`cig_vis`},[i]:{prop:`lighter`,grab:t.lit,release:t.unlit,at:[0,0,0],along:[0,1,0],visible:`lit_vis`}};for(let[t,n,i]of hC(e.scene,r))i&&n.glow||!i&&n.renderer===`light`?a[t]={visible:`ember_vis`,level:`ember`}:!i&&n.renderer===`effect`&&(a[t]={visible:`ember_vis`});for(let[t,n,r]of hC(e.scene,i))(r&&n.glow||!r&&n.renderer===`light`)&&(a[t]={visible:`flame_vis`});n.exhale!==void 0&&((typeof n.exhale!=`string`||!(e.scene?.others?.[n.exhale]||e.scene?.objects?.[n.exhale]||Io(e.scene)[n.exhale]))&&$x(e.tag,`args.kit.exhale ${JSON.stringify(n.exhale)} is not a scene object; object.createKit { kit: "exhale" } answers its rootId (it follows the mouth)`),a[n.exhale]={...sC});let o=e=>t.squat?vC:e;return{objects:a,allow:[[`thigh_r`,r,o(_C.cig)],[`thigh_l`,i,o(_C.lighter)],[`hips`,r,o(_C.cig)],[`hips`,i,o(_C.lighter)],...t.squat?[[`shin`,r,vC],[`shin`,i,vC],[`hand_l`,`thigh_l`,yC],[`hand_r`,`thigh_r`,yC],[`hand`,`hips`,yC]]:[]].map(([e,t,n])=>({part:e,object:t,depth:n}))}}function xC(e){let{sk:t,state:n}=e,r=t.index,i=t.restWorldPos;if(!(n.root[1]<lC*i[r.Hips][1]))return null;let{s:a}=Vf(t,n),o=n.yaw??0,s=a.P[r.RightArm],c=e=>J(X(-o),H(e,n.root)),l=G(H(i[r.RightForeArm],i[r.RightArm]))+G(H(i[r.RightHand],i[r.RightForeArm])),u=V(a.P[r.RightLeg],J(X(o),uC)),d=G(H(u,s)),f=c(d>dC*l?V(s,U(H(u,s),dC*l/d)):u),p=V(c(Tr(a,r.Head,t.landmarks.mouth)),[0,0,fC]),m=Oi(t),h=(e,r)=>{let i=V(n.root,J(X(o),[r*pC[0],pC[1],pC[2]]));return c(m?Ei(m.body,t,a,i,Di,m.skip):i)},g=e=>e.map(e=>Math.round(e*1e3)/1e3);return{hold:g(f),mouthOut:g(p),lpocket:g(h(`Left`,1)),rpocket:g(h(`Right`,-1))}}var SC={TW_M:40,FX_M:0,TW_H:0,FX_H:10,TW_L:-80,FX_L:-50},CC=15,wC=20,TC=[[`hand_l`,`hand_r`,.045],[`hand_r`,`hand_l`,.045],[`farm_r`,`hand_l`,.02],[`hand_l`,`farm_r`,.02]].map(([e,t,n])=>({part:e,object:t,depth:n})),EC=[.4,-1,.6],DC=[-.4,-1,-.3],OC=[.9,-.6,.3],kC=[`armw_r`,`armw_l`,`w_rpocket_r`,`w_lpocket_l`,`w_hold_r`,`w_mouth_r`,`w_flame_l`,`elbow_r`,`elbow_l`,`wtwist_r`,`wflex_r`,`wtwist_l`,`wflex_l`,`head_pitch`,`head_yaw`,`spine_pitch`,`root`,`fingers_l`,`fingers_r`,`cig_vis`,`lit_vis`,`flame_vis`,`ember_vis`,`exhale`,`ember`],AC=264,jC=.75,MC=Math.ceil(AC*jC),NC=e=>(e/24).toFixed(1),PC={armw_r:0,armw_l:0,w_rpocket_r:0,w_lpocket_l:0,w_hold_r:0,w_mouth_r:0,w_flame_l:0,elbow_r:[-.5,-.4,-1],elbow_l:[.5,-.4,-1],wtwist_r:0,wflex_r:0,wtwist_l:0,wflex_l:0,head_pitch:0,head_yaw:0,spine_pitch:0,fingers_l:{grip:0,fist:0},fingers_r:{cigarette:0},cig_vis:0,lit_vis:0,flame_vis:0,ember_vis:0,exhale:0,ember:0};function FC(e){let t=e.args.until??(e.auto?e.f0+AC:e.frames-1),n=t-e.f0;n<MC&&$x(e.tag,`needs frames f${e.f0}..f${e.f0+MC} at least: 199 frames, ${NC(199)} s at 24 fps, paced ${jC} (265 frames, ${NC(265)} s, at its own pace); it has f${e.f0}..f${t}, `+(e.args.until===void 0?`so set frames >= ${e.f0+MC+1} or frames: "auto"`:`so set args.until >= ${e.f0+MC}`)),Array.isArray(e.state.root)||$x(e.tag,`needs a pose keyed before f0 (root): standing or squatting`);let r=Object.fromEntries(Object.entries(PC).filter(([t])=>e.state[t]===void 0));Object.keys(r).length&&Object.assign(e.state,structuredClone(r)),e.state.head_yaw=0;let i=e.state.head_pitch,a=(e.state.pitch??0)+e.state.spine_pitch,o=e=>e+i,s=a?J(dr(a),EC):EC,c=a?J(dr(a),DC):DC,l=xC(e),u=e.self?l?wC:CC:SC.FX_M;l&&(e.state.w_mouthOut_r=0);let d=n<AC?n/AC:1,f=e=>Math.round(e*d),p=Qx(e.state,e.f0),m=d===1?p:{...p,at:(e,t)=>p.at(f(e),t),hold:(e,...t)=>p.hold(f(e),...t),step:(e,t,n)=>p.step(f(e),t,n)},h=e.state.root.slice(),g=e.state.yaw??0,_=(e,t)=>{m.hold(e,`w_mouth_r`,`w_hold_r`,`wtwist_r`,`wflex_r`,`elbow_r`,`head_pitch`,`root`,...l?[`w_mouthOut_r`]:[]),l&&m.at(Math.round((e+t)/2),{w_hold_r:0,w_mouthOut_r:1,w_mouth_r:0}),m.at(t,{w_mouth_r:1,w_hold_r:0,...l?{w_mouthOut_r:0}:{},wtwist_r:SC.TW_M,wflex_r:u,elbow_r:s,head_pitch:o(6),root:h})},v=(e,t)=>{m.hold(e,`w_mouth_r`,`w_hold_r`,`wtwist_r`,`wflex_r`,`elbow_r`,`head_pitch`,...l?[`w_mouthOut_r`]:[]),l&&m.at(Math.round((e+t)/2),{w_mouth_r:0,w_mouthOut_r:1,w_hold_r:0}),m.at(t,{w_mouth_r:0,w_hold_r:1,...l?{w_mouthOut_r:0}:{},wtwist_r:SC.TW_H,wflex_r:SC.FX_H,elbow_r:c,head_pitch:o(0)})};m.hold(0,...kC),m.at(2,{w_rpocket_r:1,elbow_r:[-.5,-.4,-1]}),m.hold(6,`armw_r`,`w_rpocket_r`,`elbow_r`,`fingers_r`),m.at(20,{armw_r:1}),m.at(28,{fingers_r:{cigarette:1}}),m.step(28,`cig_vis`,1),m.hold(36,`w_rpocket_r`,`w_mouth_r`,`wtwist_r`,`wflex_r`,`elbow_r`,`head_pitch`),m.at(58,{w_rpocket_r:0,w_mouth_r:1,wtwist_r:SC.TW_M,wflex_r:u,elbow_r:s,head_pitch:o(6)}),m.at(2,{w_lpocket_l:1,elbow_l:[.5,-.4,-1]}),m.hold(12,`armw_l`,`w_lpocket_l`,`elbow_l`,`fingers_l`),m.at(26,{armw_l:1}),m.at(34,{fingers_l:{grip:0,fist:1}}),m.step(35,`lit_vis`,1),m.hold(44,`w_lpocket_l`,`w_flame_l`,`wtwist_l`,`wflex_l`,`elbow_l`),m.at(60,{w_lpocket_l:0,w_flame_l:1,wtwist_l:SC.TW_L,wflex_l:SC.FX_L,elbow_l:OC}),m.step(63,`flame_vis`,1),m.step(73,`ember_vis`,1),m.step(79,`flame_vis`,0),m.step(73,`ember`,1),m.at(80,{ember:2}),m.hold(90,`ember`),m.at(104,{ember:.6}),m.hold(194,`ember`),m.at(200,{ember:2}),m.hold(212,`ember`),m.at(224,{ember:.6}),m.step(116,`exhale`,1),m.step(138,`exhale`,0),m.step(238,`exhale`,1),m.step(260,`exhale`,0),m.hold(80,`w_flame_l`,`w_lpocket_l`,`wtwist_l`,`wflex_l`,`elbow_l`);let y=l&&e.self?8:0;m.at(y?96+y:l?100:96,{w_flame_l:0,w_lpocket_l:1,wtwist_l:0,wflex_l:0,elbow_l:[.5,-.4,-1]}),m.hold(101+y,`fingers_l`),m.step(102+y,`lit_vis`,0),m.hold(104+y,`armw_l`,`w_lpocket_l`),m.at(112,{fingers_l:{grip:0,fist:0}}),m.at(120,{armw_l:0,w_lpocket_l:1}),m.at(123,{w_lpocket_l:0}),v(92,114),m.at(124,{head_pitch:o(-14)}),m.at(140,{head_pitch:o(0)});let b=[Math.cos(g*Math.PI/180),0,-Math.sin(g*Math.PI/180)];m.hold(120,`root`,`head_yaw`),m.at(146,{root:h.map((e,t)=>e+.03*b[t]-(t===1?.005:0)),head_yaw:-22}),m.at(168,{head_yaw:0}),_(170,194),v(212,236),m.at(246,{head_pitch:o(-14)}),m.at(264,{head_pitch:o(0)}),p.hold(n,...kC,...l?[`w_mouthOut_r`]:[]);let x=!!l&&e.self,S=bC(e,{cig:e.f0+f(28),lit:e.f0+f(35),unlit:e.f0+f(x?110:102),squat:x});return{keys:p.keys,end:t,...d<1?{paced:Math.floor(d*100)/100}:{},channels:[`exhale`,`ember`],...S?{objects:S.objects}:{},anchors:{lpocket:{kind:`body`,p:e.self&&l?.lpocket||mC.l},rpocket:{kind:`body`,p:e.self&&l?.rpocket||mC.r},hold:{kind:`body`,p:l?.hold??[-.24,.03,.06]},...l?{mouthOut:{kind:`body`,p:l.mouthOut}}:{},mouth:{kind:`landmark`,name:`mouth`},flame:{kind:`prop`,prop:`cig`,point:`tip`,offset:[0,-.02,0]}},props:{cig:{hand:`r`,origin:[`RightHandIndex2`,`RightHandMiddle2`],points:{filter:[0,0,-.026],tip:[0,0,.058]}},lighter:{hand:`l`,origin:[`LeftHand`,`LeftHandMiddle1`],points:{body:[.01,0,0],flame:[.01,.036,0]}}},fits:[{side:`r`,anchor:`mouth`,effector:{prop:`cig`,point:`filter`}},{side:`l`,anchor:`flame`,effector:{prop:`lighter`,point:`flame`}}],checks:{contacts:[{name:`filter on the lips`,point:`prop:cig.filter`,target:`anchor:mouth`,tol:.01,when:`w_mouth_r`},{name:`flame under the cigarette tip`,point:`prop:lighter.flame`,target:`anchor:flame`,tol:.01,when:`flame_vis`}],orient:[{name:`lit end points away from the face`,from:`prop:cig.filter`,to:`prop:cig.tip`,along:`face`,minCos:.64,when:`w_mouth_r`},{name:`lighter upright`,from:`prop:lighter.body`,to:`prop:lighter.flame`,along:`up`,minCos:.85,when:`flame_vis`}],below:[{name:`no chicken-wing elbow`,joint:`RightForeArm`,ref:`RightArm`,min:.08,when:`w_mouth_r`}],appear:[{name:`cigarette from the right pocket`,channel:`cig_vis`,joint:`RightHand`,anchor:`rpocket`,tol:.035},{name:`lighter from the left pocket`,channel:`lit_vis`,joint:`LeftHand`,anchor:`lpocket`,tol:.035}],mouthPoints:[`cig.filter`],allow:[...S?.allow??[],...TC]}}}var IC=9.81/576,LC=10,RC=5,zC=6,BC=14,VC=50,HC=e=>Math.min(1,Math.max(0,e)),UC=e=>{let t=HC(e);return t*t*(3-2*t)},WC=(e,t,n)=>e+(t-e)*n,GC=(e,t,n)=>e.map((e,r)=>e+(t[r]-e)*n),KC=(e,t,n,r,i)=>UC((e-t)/(n-t))-UC((e-r)/(i-r)),qC={l:1,r:-1},JC=(e,t,n)=>q(X(e),q(dr(t),fr(n))),YC=(e,t,n,r,i)=>J(Y(Bf(e,t,n)?.R??X(e)),J(r,i));function XC(e,t,n,r,i,a){let o=Bf(e.h,n,r);if(!o)return{fyaw:e.h,fpitch:a};let s=e.toe[t],c=J(i,J(dr(a),s)),l=J(Y(o.R),c),u=Math.atan2(-s[1],s[2]),d=180/Math.PI,f=Math.asin(Math.max(-1,Math.min(1,-l[1]/Math.hypot(...l))))-u;return{fyaw:e.h+Math.atan2(l[0],l[2])*d,fpitch:Math.max(-60,Math.min(90,f*d))}}function ZC(e){let{sk:t,args:n,state:r}=e,i=t.index,a=t.restWorldPos;(!r.foot_l||!r.foot_r||!r.root)&&$x(e.tag,`needs a standing pose keyed before f0 (use standIdle or another skill first)`);let o=n.heading??r.yaw??0,s=X(o),c=a[i.Hips],l=ar(a[i.LeftUpLeg],a[i.LeftLeg])+ar(a[i.LeftLeg],a[i.LeftFoot]),u=ar(a[i.LeftArm],a[i.LeftForeArm])+ar(a[i.LeftForeArm],a[i.LeftHand]);return{h:o,R:s,F:J(s,[0,0,1]),L:J(s,[1,0,0]),ank:a[i.LeftFoot][1],y0:c[1]-.01,leg:l,arm:u,feet:{l:r.foot_l.slice(),r:r.foot_r.slice()},root:r.root.slice(),hipOff:{l:H(a[i.LeftUpLeg],c),r:H(a[i.RightUpLeg],c)},shoulder:{l:H(a[i.LeftArm],c),r:H(a[i.RightArm],c)},toe:{l:H(a[i.LeftToeBase],a[i.LeftFoot]),r:H(a[i.RightToeBase],a[i.RightFoot])}}}function QC(e,t,n){let{args:r}=e,i=(n===`back`?-1:1)*360,a=r.travel??(n===`back`?-.25:.4),o=t.y0+.05,s=t.y0-.02,c=Math.max(10,Math.round(Math.sqrt(.9/IC)+Math.sqrt(2*(o+.5-.05-s)/IC))),l=(s-o+IC*c*c/2)/c,u=l-IC*c,d=o-l*RC/2,f=s+u*zC/2,p=a/(RC/2+c+zC/2),m=e.f0,h=m+LC,g=h+RC,_=g+c,v=_+zC,y=v+BC,b=e=>V(t.feet[e],U(t.F,a)),x=e=>V(t.feet[e],J(t.R,t.toe[e])),S=e=>{let n,r;if(e<=h)n=WC(t.root[1],d,UC((e-m)/LC)),r=0;else if(e<=g){let t=e-h;n=d+l/RC*t*t/2,r=p/RC*t*t/2}else if(e<=_){let t=e-g;n=o+l*t-IC*t*t/2,r=p*RC/2+p*t}else if(e<=v){let t=e-_;n=s+u*t-u/zC*t*t/2,r=p*RC/2+p*c+p*t-p/zC*t*t/2}else n=WC(f,t.y0,UC((e-v)/BC)),r=a;return V([t.root[0],n,t.root[2]],U(t.F,r))},C=e=>i*UC((e-g+2)/(c+5)),w=e=>JC(t.h,C(e),0),T=(e,t)=>J(Y(w(e)),H(t,S(e))),E={l:T(g,lm(x(`l`),t.h,VC,t.feet.l)),r:T(g,lm(x(`r`),t.h,VC,t.feet.r))},D={l:T(_,b(`l`)),r:T(_,b(`r`))},O=[];for(let e=m;e<=y+1;e++){let n=e>y?0:C(e),r=JC(t.h,n,0),i=S(e),a=(e-g)/c,o=e>g&&e<_?KC(a,.12,.34,.6,.82):0,s={root:i,yaw:t.h,pitch:n,roll:0,armw_l:0,armw_r:0,fyaw_l:t.h,fyaw_r:t.h};for(let c of[`l`,`r`]){let l,u;if(e<=h)l=t.feet[c],u=0;else if(e<=g)u=VC*UC((e-h)/RC),l=lm(x(c),t.h,u,t.feet[c]);else if(e<_){let e=1-UC(a/.2),n=UC((a-.72)/.28),s=V(t.hipOff[c],GC([0,-t.leg*.97,0],[qC[c]*.02,-.24,.16],o));l=V(i,J(r,V(V(U(E[c],e),U(D[c],n)),U(s,1-e-n)))),u=WC(WC(VC,30,UC(a/.2)),0,UC((a-.7)/.3))}else l=b(c),u=0;let d=e>g&&e<_?XC(t,c,n,0,r,u):{fyaw:t.h,fpitch:u};Object.assign(s,{[`foot_${c}`]:l,[`fpitch_${c}`]:d.fpitch,[`fyaw_${c}`]:d.fyaw,[`knee_${c}`]:YC(t.h,n,0,r,[qC[c]*.05,.5*o,1])})}O.push({f:e,set:s})}let k=n===`back`?[-12,18]:[10,25];for(let[e,t,n,r,i]of[[m,0,0,0,0],[h,-45,15,20,0],[g,160,5,-8,k[0]],[Math.round(g+.3*c),55,85,32,k[1]],[Math.round(g+.62*c),55,85,32,k[1]],[_,75,25,22,0],[v,70,25,28,0],[y,0,0,0,0]])O.push({f:e,set:{aswing_l:t,aswing_r:t,abend_l:n,abend_r:n,spine_pitch:r,head_pitch:i}});return{keys:O,end:y+1}}function $C(e,t){let{args:n}=e,r=n.side===`r`?-1:1,i=-r,a=e.f0,o=a+12,s=o+34,c=s+14,l=r>0?`l`:`r`,u=l===`l`?`r`:`l`,d={foot:e=>V(t.hipOff[e],[qC[e]*.3,-t.leg*.93,0]),hand:e=>V(t.shoulder[e],[qC[e]*.32,t.arm*.88,0])},f={foot:t.ank,hand:.1},p=[[`foot`,l],[`hand`,l],[`hand`,u],[`foot`,u],[`foot`,l]],m=e=>e<=o?0:e<=s?i*360*UC((e-o)/34):i*360,h=(e,n,r,i)=>V(n,J(JC(t.h,0,m(e)),d[r](i))),g=JC(t.h,0,0),_=H(t.feet[u],J(g,d.foot(u))),v=h(o,_,`foot`,l);v[1]=t.ank;let y=[],b={foot:{l:[],r:[]},hand:{l:[],r:[]}},x=0,S=t.feet[l].slice(),C=o;b.foot[u].push({a,b:o,p:t.feet[u]});for(let e=a;e<=c+1;e++){if(e<=o){y.push(GC(t.root,_,UC((e-a)/12)));continue}e===o+1&&(S=v.slice());let n=H(S,J(JC(t.h,0,m(e)),d[p[x][0]](p[x][1]))),r=p[x+1];if(r&&e<=s){let i=h(e,n,...r);if(i[1]<=f[r[0]]){let a=h(e-1,y.at(-1),...r),o=a[1]-f[r[0]],s=i[1]-f[r[0]],c=GC(a,i,o>0?o/(o-s):1);b[p[x][0]][p[x][1]].push({a:C,b:e,p:S}),x++,C=e,S=[c[0],f[r[0]],c[2]],n=H(S,J(JC(t.h,0,m(e)),d[r[0]](r[1])))}}y.push(n)}b[p[x][0]][p[x][1]].push({a:C,b:c+1,p:S});let w=p[p.length-2];x>=p.length-1&&(b[w[0]][w[1]].at(-1).b=c+1);let T=y.map((e,t)=>{let n=[0,0,0],r=0;for(let e=-3;e<=3;e++){let i=Math.min(y.length-1,Math.max(0,t+e)),a=Math.exp(-(e*e)/4);n=V(n,U(y[i],a)),r+=a}return U(n,1/r)}),E=e=>e<=s?T[e-a]:V(T[s-a],[0,(t.y0-T[s-a][1])*UC((e-s)/14),0]),D=(e,t,n)=>{let r=H(e,t),i=Math.hypot(...r);return i>n?V(t,U(r,n/i)):e},O=(e,n,r,i)=>{for(let a of b[e][n]){if(r>=a.a-6&&r<=a.b)return GC(i,a.p,UC((r-a.a+6)/6));if(r>a.b&&r<=a.b+10){let i=J(Y(JC(t.h,0,m(a.b))),H(a.p,E(a.b))),o=V(E(r),J(JC(t.h,0,m(r)),GC(i,d[e](n),UC((r-a.b-1)/9))));return GC(a.p,o,UC((r-a.b)/8))}}return i},k=(e,t,n)=>b[e][t].some(e=>n>=e.a&&n<=e.b),ee=Object.fromEntries([`l`,`r`].map(e=>{let n=k(`foot`,e,s)?b.foot[e].at(-1).p.slice():h(s,E(s),`foot`,e);return n[1]=t.ank,[e,n]})),te=[];for(let e=a;e<=c+1;e++){let n=e===c+1?0:m(e),r=JC(t.h,0,m(e)),i=E(e),u={root:i,yaw:t.h,pitch:0,roll:n};for(let c of[`l`,`r`]){let d;if(e<=o&&c===l){let n=UC((e-a-1)/8);d=V(GC(t.feet[c],v,n),[0,.07*Math.sin(Math.PI*n),0])}else if(e>s)d=ee[c];else{let n=UC((e-s+4)/4);d=D(GC(O(`foot`,c,e,h(e,i,`foot`,c)),ee[c],n),V(i,J(r,t.hipOff[c])),t.leg*.995)}let f=e>o&&e<=s?XC(t,c,0,m(e),r,0):{fyaw:t.h,fpitch:0};Object.assign(u,{[`foot_${c}`]:d,[`fyaw_${c}`]:f.fyaw,[`fpitch_${c}`]:f.fpitch,[`knee_${c}`]:YC(t.h,0,n,r,[qC[c]*.05,0,1]),[`hand_${c}`]:D(e>o&&e<=s?O(`hand`,c,e,h(e,i,`hand`,c)):h(e,i,`hand`,c),V(i,J(r,t.shoulder[c])),t.arm*.995),[`elbow_${c}`]:YC(t.h,0,n,r,[qC[c]*.4,0,-1]),[`armw_${c}`]:e<=o?0:e<=s?UC((e-o)/6):1-UC((e-s)/8)})}u.arm_rest=e<=o?WC(72,-56,UC((e-a)/12)):e<=s?-56:WC(-56,72,UC((e-s)/14)),te.push({f:e,set:u})}return{keys:te,end:c+1}}function ew(e){let t=e.args.kind??`back`;[`back`,`front`,`cartwheel`].includes(t)||$x(e.tag,`kind must be "back", "front" or "cartwheel", got ${JSON.stringify(t)}`);let n=ZC(e);return t===`cartwheel`?$C(e,n):QC(e,n,t)}var tw=9.81,nw=24,rw=.75,iw={back:.16,front:.11},aw=.25,ow=.12,sw=.25,cw=e=>e-ow*(1-Math.exp(-e/ow)),lw=(e,t,n)=>t+n*Math.log1p(Math.exp((e-t)/n)),uw=3/nw,dw=.03,fw=.25,pw=e=>{let t=Math.min(1,Math.max(0,e));return t*t*t*(t*(6*t-15)+10)},mw=e=>(e+540)%360-180,hw=e=>e.map(e=>Math.round(e*1e3)/1e3),gw=e=>Math.round(e*10)/10;function _w(e,t,n){let r=null,i=null;for(let a of e){let e=a.set?.[t];Array.isArray(e)&&(a.f<=n&&(!r||a.f>=r.f)&&(r={f:a.f,v:e}),a.f>n&&(!i||a.f<i.f)&&(i={f:a.f,v:e}))}if(!r||!i)return r?.v;let a=(n-r.f)/(i.f-r.f);return r.v.map((e,t)=>e+(i.v[t]-e)*a)}function vw(e,t){let{args:n,scene:r}=e,i=n.dir;if(!i&&typeof n.from==`string`){let[a,o]=n.from.split(/:(.*)/s),s=a===`object`?r?.objects?.[o]?.pos:a===`person`?Go(r,o,`Hips`,e.f0):null;s||$x(e.tag,`args.from "${n.from}" must be object:<id> of a scene body or person:<id> of a character with an installed take`),i=[t[0]-s[0],t[2]-s[2]]}(!Array.isArray(i)||i.length!==2||!(Math.hypot(i[0],i[1])>1e-6))&&$x(e.tag,`needs args.dir: [x, z] (the way the body is thrown) or args.from: object:<id> | person:<id> (what hits it)`);let a=Math.hypot(i[0],i[1]);return[i[0]/a,i[1]/a]}function yw(e){let{sk:t,args:n,state:r}=e,i=t.index,a=t.restWorldPos;r.root||$x(e.tag,`needs a pose keyed before f0 (standIdle, a walk, ...)`);let o=_w(e.keys,`root`,e.f0)??r.root.slice(),s={};for(let t of[`l`,`r`]){let n=_w(e.keys,`foot_${t}`,e.f0),r=_w(e.keys,`foot_${t}`,e.f0-1);n&&(s[t]={at:n,v:r?n.map((e,t)=>e-r[t]):[0,0,0]})}let c=r.yaw??0,[l,u]=vw(e,o),d=n.speed??4;Number.isFinite(d)&&d>0||$x(e.tag,`args.speed must be a launch speed above 0 m/s, got ${JSON.stringify(n.speed)}`);let f=Math.min(2.5,Math.max(.8,.3*d)),p=J(X(c),[0,0,1]),m=(n.land??(l*p[0]+u*p[2]<=0?`back`:`front`))===`back`,h=Math.atan2(l,u)*180/Math.PI,g=mw((m?h+180:h)-c),_=m?-90:90,v=m?iw.back:iw.front,y=o[1],b=e=>y+f*cw(e)-.5*tw*e*e,x=e=>f*(1-Math.exp(-e/ow))-tw*e,S=0,C=(f+Math.sqrt(f*f+2*tw*Math.max(0,y-v)))/tw+1;for(let e=0;e<60;e++){let e=(S+C)/2;b(e)+x(e)*uw/2>v-dw||x(e)>0?S=e:C=e}let w=S,T=Math.min(0,x(w)),E=b(w),D=w+uw,O=d/(rw*tw),k=D+O,ee=e=>e<w?b(e):e<D?E+T*(e-w)-T/(2*uw)*(e-w)**2:v-dw*(1-pw((e-D)/fw)),te=a[i.LeftFoot][1],ne=a[i.Hips][1],re=m?1:-1,ie=.9*Math.hypot(...[0,1,2].map(e=>a[i.LeftFoot][e]-a[i.Hips][e])),ae=e.f0+Math.ceil((k+.6)*nw),oe=[];for(let t=e.f0;t<=ae;t++){let n=(t-e.f0)/nw,r=n<D,i=Math.min(Math.max(0,n-D),O),a=r?d*cw(n):d*cw(D)+d*i-.5*rw*tw*i*i,f=ee(n),p=[o[0]+l*a,f,o[2]+u*a],h=Math.max(.35,.9*D),v=c+g*pw(n/Math.max(aw,h)),y=_*pw(n/h),b=(e=>J(X(v),J(dr(y),e))),x=pw(n/ow)*Math.exp(-n/.18)*Math.sin(2*Math.PI*n/.55),S=pw(n/.3)*Math.exp(-n/.45)*Math.sin(2*Math.PI*n/.6),C=pw((n-D)/.3),w=-(ne-te)+.06*(1-C)+(m?.03:.01)*C,T=pw(n/sw),E=te+.01+(!m&&!r&&i<O?.04:0),k=(n,r,i)=>{let a=V(p,b([r,w,i])),o=p[1]-.05;m&&(a[1]=o-.05*Math.log1p(Math.exp((o-a[1])/.05))),a[1]=lw(a[1],E,.03);let c=s[n];if(!c)return a;let l=c.at.map((n,r)=>n+c.v[r]*(t-e.f0)*(1-T));return l[1]=Math.max(c.at[1],l[1]),ae(a.map((e,t)=>l[t]+(e-l[t])*T))},ae=e=>{let t=e.map((e,t)=>e-p[t]),n=Math.hypot(...t),r=ie-.02*Math.log1p(Math.exp((ie-n)/.02));return n>1e-9?p.map((e,i)=>e+t[i]*(1+(r/n-1)*T)):e},se=Bf(0,y,0),ce=se?J(se.R,[0,1,0]):[0,1,0],le=Math.atan2(ce[2],ce[1])*180/Math.PI,ue=J(dr(-le),[0,-Math.sin(y*Math.PI/180),Math.max(.05,Math.cos(y*Math.PI/180))]),de={root:hw(p),yaw:gw(v),pitch:gw(y),roll:0,foot_l:hw(k(`l`,.11,.04+.1*S*T-(m?.1:0)*C)),foot_r:hw(k(`r`,-.11,.04-.1*S*T-(m?.1:0)*C)),fyaw_l:gw(v),fyaw_r:gw(v),fpitch_l:gw(m?-50*C:-.5*le),fpitch_r:gw(m?-50*C:-.5*le),knee_l:hw([.05,ue[1],ue[2]]),knee_r:hw([-.05,ue[1],ue[2]]),spine_pitch:gw(re*22*x*Math.min(1,d/4)),spine_yaw:0,spine_roll:gw(10*S*(1-C)),head_pitch:gw(re*30*x*Math.min(1,d/4)+(m?-8:8)*C),head_roll:gw(12*C),arm_rest:gw(72-22*C),aswing_l:gw(re*45*S+8*C),aswing_r:gw(-re*35*S-8*C),abend_l:gw(25+30*S*S),abend_r:gw(30+25*S*S)};t===e.f0&&Object.assign(de,{armw_l:0,armw_r:0,fingers_l:{relaxed:1},fingers_r:{relaxed:1}}),oe.push({f:t,set:de})}return{keys:oe,end:ae}}var bw=20,xw=50,Sw=10,Cw=8,ww=10,Tw=8,Ew=.25,Dw=.42,Ow=.22,kw=.09,Aw=.25,jw=e=>e.map(e=>Math.round(e*1e3)/1e3);function Mw(e,t){let n=Object.entries(e?.objects??{}).filter(([e,n])=>e===t||n.ancestors?.includes(t)).map(([,e])=>e),r=e?.objects?.[t]?.pos??n[0]?.ancestorPoses?.[0]?.pos;return!r||!n.length?0:r[1]-Math.min(...n.map(e=>e.pos[1]))}function Nw(e){let{args:t,state:n,sk:r,scene:i,tag:a}=e,o=t.object,s=t.side??`r`,c=e.objects?.[o];s!==`l`&&s!==`r`&&$x(a,`args.side must be "l" or "r", got ${JSON.stringify(s)}`),(!c?.prop||e.props?.[c.prop]?.hand!==s)&&$x(a,`args.object "${o}" must be carried by the ${s===`r`?`right`:`left`} hand (objects.${o}.prop on a prop with hand "${s}")`),(!Array.isArray(t.to)||t.to.length!==3)&&$x(a,`args.to must be [x, y, z] world m (where it lands)`);let l=(t.arc===`high`?xw:bw)*Math.PI/180,u=e.fps??24,d=s===`l`?`Left`:`Right`,f=r.restWorldPos,p=V(n.root??f[r.index.Hips],J(X(n.yaw??0),H(f[r.index[`${d}Arm`]],f[r.index.Hips]))),m=[t.to[0]-p[0],0,t.to[2]-p[2]],h=G(m);h<.5&&$x(a,`args.to is ${h.toFixed(2)} m from the shoulder; throw it at least 0.5 m`);let g=U(m,1/h),_=V(p,V(U(g,Dw),[0,Ow,0])),v=V(_,U(g,kw)),y=t.to[1]+Mw(i,o),b=G([t.to[0]-v[0],0,t.to[2]-v[2]]),x=y-v[1],S=2*Math.cos(l)**2*(b*Math.tan(l)-x);S>0||$x(a,`args.to is too high for a ${t.arc??`low`} arc from the hand; use arc "high" or a lower point`);let C=Math.sqrt(_d*b*b/S),w=V(U(g,C*Math.cos(l)),[0,C*Math.sin(l),0]),T=(w[1]+Math.sqrt(w[1]**2+2*_d*Math.max(0,v[1]-y)))/_d,E=e.f0+Sw+Cw,D=Math.min(e.frames-1,E+Math.ceil(T*u)+Tw),O=U([g[2],0,-g[0]],s===`r`?-1:1),k=`hand_${s}`,ee=`armw_${s}`,te=V(p,V(V(U(g,-.12),U(O,Aw)),[0,-.05,0])),ne=V(p,V(V(U(O,.32),U(g,.12)),[0,.08,0])),re=V(_,U(w,.45/u)),ie=V(p,V(U(g,.46),[0,-.1,0])),ae=V(p,V(V(U(g,.3),U(O,-.15)),[0,-.4,0])),oe=`fingers_${s}`,se=lo[c.grasp]??`grip`,ce={...n[oe],[se]:1},le={...n[oe],[se]:0},ue=[{f:e.f0,set:{[ee]:n[ee]??0,[oe]:ce,...n[k]?{[k]:n[k]}:{}}},{f:E,set:{[oe]:ce}},{f:E+3,set:{[oe]:le}},{f:e.f0+Sw,set:{[ee]:1,[k]:jw(te)}},{f:e.f0+Sw+Math.round(Cw/2),set:{[ee]:1,[k]:jw(ne)}},{f:E-1,set:{[ee]:1,[k]:jw(H(_,U(w,1/u)))}},{f:E,set:{[ee]:1,[k]:jw(_)}},{f:E+1,set:{[ee]:1,[k]:jw(re)}},{f:E+3,set:{[ee]:1,[k]:jw(ie)}},{f:E+ww,set:{[ee]:1,[k]:jw(ae)}}],de=`${o}Target`;return{keys:ue,end:E+ww,anchors:{[de]:{kind:`world`,p:jw([t.to[0],y,t.to[2]])}},fills:{[o]:{release:E,fall:{at:E,v:jw(w)}}},goals:[{name:`${o} lands at the target`,near:[`object:${o}`,`anchor:${de}`],at:D,tol:Ew}],throw:{release:E,speed:Math.round(C*100)/100,v:jw(w),flight:Math.round(T*100)/100}}}var Pw=[.35,.65],Fw=.15,Iw=10,Lw=20,Rw=2,zw=6,Bw=8,Vw=1,Hw=e=>e.map(e=>Math.round(e*1e3)/1e3),Uw=(e,t,n)=>Math.min(n,Math.max(t,e));function Ww(e,t,n){let r=e.restWorldPos,i=t.root??r[e.index.Hips],a=X(t.yaw??0);return{hips:i,shoulder:V(i,J(a,H(r[e.index[`${n}Arm`]],r[e.index.Hips]))),head:V(i,J(a,H(r[e.index.Head],r[e.index.Hips]))),fwd:J(a,[0,0,1])}}function Gw(e){let{args:t,state:n,sk:r,scene:i,tag:a}=e,o=t.object,s=t.side??`r`,c=e.objects?.[o],l=e.fps??24;s!==`r`&&s!==`both`&&$x(a,`args.side must be "r" or "both", got ${JSON.stringify(s)}`);let u=Array.isArray(c?.fall)?c.fall[0]:c?.fall;Array.isArray(u?.v)||$x(a,`args.object "${o}" must fly: objects.${o}.fall { at, v: [vx, vy, vz] }`);let d=Ww(r,n,`Right`),f={spec:{objects:{[o]:{fall:c.fall}},fps:l},scene:i,timeMap:null},p=e=>zd(f,o,e)?.pos,m=null,h=null;for(let t=u.at+1;t<e.frames;t++){let e=p(t),n=G(H(e,d.shoulder)),r=W(H(e,d.hips),d.fwd),i=Math.max(0,Pw[0]-n,n-Pw[1],Fw-r,d.hips[1]-.1-e[1],e[1]-d.head[1]);if((!h||i<h.off)&&(h={f:t,p:e,off:i}),i===0){m={f:t,p:e};break}}m||$x(a,`${o} never comes within reach of the right hand (in front of the chest, ${Pw[0]}-${Pw[1]} m from the shoulder): nearest at f${h.f}, [${Hw(h.p).join(`, `)}], ${h.off.toFixed(2)} m out; move the body (standIdle at) or the throw`);let g=Math.max(m.f,e.f0+Iw+Rw),_=m.p,v=U(H(p(m.f),p(m.f-1)),l),y=G(v),b=Og({objects:e.objects},i,o),x=Uw(.08+.02*b*y,.08,.15),S=K(v),C=e=>1-(1-e)**3,w=[_,...Array.from({length:zw},(e,t)=>V(_,U(S,x*C((t+1)/zw)))),V(_,U(S,x*.4))],T=Math.max(e.f0,g-Rw-Lw),E=s===`both`||b>Vw,D=Math.max(0,...Object.values(i.objects).filter(e=>e===i.objects[o]||e.ancestors?.includes(o)).map(e=>Math.max(...e.half))),O=J(X(n.yaw??0),[1,0,0]),k={keys:[],end:g+zw+Bw,props:{},anchors:{},fits:[],channels:[],fills:{[o]:{prop:`${o}Catch`,grab:g,grasp:`spherical`}},catch:{contact:g,point:Hw(_),speed:Math.round(y*100)/100,give:Math.round(x*1e3)/1e3,hands:E?2:1}};for(let e of E?[`r`,`l`]:[`r`]){let t=e===`l`?`Left`:`Right`,r=e===`r`?`${o}Catch`:`${o}CatchL`,i=e===`r`?[0,0,0]:U(O,2*D+.04),a=`armw_${e}`,s=`fingers_${e}`,c={...n[s],spherical:0},l={...n[s],spherical:1},u=w.map((e,t)=>`${r}${t}`),d=t=>`w_${u[t]}_${e}`;k.keys.push({f:T,set:{[a]:n[a]??0,[d(0)]:0,[s]:c,[`elbow_${e}`]:e===`r`?[-1,-.5,-.5]:[1,-.5,-.5]}},...AS(g-Rw-T).map(([e,t,r])=>({f:T+e,set:{[d(0)]:t,[a]:(n[a]??0)+(1-(n[a]??0))*r}})),{f:g-Rw,set:{[a]:1,[d(0)]:1,[s]:c}},{f:g,set:{[d(0)]:1,[s]:l}},...w.slice(1).flatMap((e,t)=>{let n=t+1,r=n<=zw?g+n:g+zw+Bw;return[{f:n<=zw?r-1:g+zw,set:{[d(n-1)]:1,[d(n)]:0}},{f:r,set:{[d(n-1)]:0,[d(n)]:1}}]})),k.props[r]={hand:e,origin:[`${t}HandIndex2`,`${t}HandMiddle2`],points:{fingers:[0,0,0]}},u.forEach((t,n)=>{k.anchors[t]={kind:`world`,p:Hw(V(w[n],i))},k.fits.push({side:e,anchor:t,effector:{prop:r,point:`fingers`}}),k.channels.push(d(n))})}return k}var Kw={standIdle:WS,sitInSeat:rC,exitCar:iC,walkTo:GS,reachGrip:JS,smokeCigarette:FC,flip:ew,hitReaction:yw,throwObject:Nw,catchObject:Gw},qw=Object.keys(Kw),Jw=e=>{throw Error(`MOTION_SPEC_INVALID: ${e}`)},Yw=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function Xw(e,t,n,r){for(let[i,a]of Object.entries(t??{}))e[i]&&!Yw(e[i],a)&&Jw(`${r} defines ${n}.${i} differently from an earlier skill; rename one or define it yourself in spec.${n}`),e[i]=a}function Zw(e,t){for(let[n,r]of Object.entries(t??{})){if(n===`limits`&&r&&typeof r==`object`&&!Array.isArray(r)){e.limits={...e.limits,...r};continue}if(!Array.isArray(r)||e[n]!==void 0&&!Array.isArray(e[n])){e[n]=r;continue}let t=e[n]??(e[n]=[]);for(let e of r)t.some(t=>Yw(t,e))||t.push(e)}}function Qw(e,t,n){e.args!==void 0&&(!e.args||typeof e.args!=`object`||Array.isArray(e.args))&&Jw(`use[${t}].args must be an object, got ${JSON.stringify(e.args)}`);let r=Object.keys(zx[e.skill].args);if(!n)for(let n of Object.keys(e.args??{}))r.includes(n)||Jw(`use[${t}].args.${n} is not an arg of ${e.skill}${vo(n,r)} (args: ${r.join(`, `)})`)}function $w(e,{sk:t,scene:n,lenient:r=!1,auto:i=!1}){if(!e.use?.length)return{spec:e,used:[]};Array.isArray(e.use)||Jw(`spec.use must be an array of { skill, args, f0 }`);let a=(e.keys??[]).map((e,t)=>({...e,src:`keys[${t}]`})),o={anchors:{},props:{},objects:{},fits:[],checks:{},channels:[],fills:{},goals:[]},s=[],c=[];e.use.forEach((l,u)=>{let d=`use[${u}] ${l?.skill}`;Kw[l?.skill]||Jw(`use[${u}].skill "${l?.skill}" is not a skill${xo(String(l?.skill),qw)} (skills: ${qw.join(`, `)})`);for(let e of Object.keys(l))!Va.includes(e)&&!r&&Jw(`use[${u}] has unknown field "${e}"${vo(e,Va)}; an entry is { skill, args, f0 }`);Qw(l,u,r),(!Number.isInteger(l.f0)||l.f0<0||l.f0>e.frames-1)&&Jw(`use[${u}].f0 must be an integer frame within 0..${e.frames-1}, got ${JSON.stringify(l.f0)}`);let f=[...s,...a],p={sk:t,scene:n,frames:e.frames,fps:e.fps??24,auto:i,props:{...o.props,...e.props},self:e.fix!==!1&&e.fix?.self!==!1,f0:l.f0,args:structuredClone(l.args??{}),tag:d,keys:f,use:e.use,index:u,place:vg(e.fix).stance,state:structuredClone(rh(f,l.f0)),anchors:{...o.anchors,...e.anchors},objects:{...o.objects,...e.objects}},m=Kw[l.skill](p),h=Math.max(m.end??l.f0,...m.keys.map(e=>e.f));h>e.frames-1&&Jw(`${d} needs ${h-l.f0} frames from f${l.f0} (to f${h}), past the last frame f${e.frames-1}; set frames >= ${h+1} or frames: "auto"`),s.push(...m.keys.map(e=>({...e,src:e.src??d}))),Xw(o.anchors,m.anchors,`anchors`,d),Xw(o.props,m.props,`props`,d),Xw(o.objects,m.objects,`objects`,d);for(let e of m.fits??[])o.fits.some(t=>Yw(t,e))||o.fits.push(e);for(let e of m.channels??[])o.channels.includes(e)||o.channels.push(e);Zw(o.checks,m.checks);for(let[e,t]of Object.entries(m.fills??{}))o.fills[e]={...o.fills[e],...t};o.goals.push(...m.goals??[]),c.push({skill:l.skill,f0:l.f0,end:m.end,...m.paced?{paced:m.paced}:{},...m.cut?{cut:m.cut}:{},...m.placed?{placed:m.placed}:{}})});let l={...e,keys:[...s,...a],anchors:{...o.anchors,...e.anchors},props:{...o.props,...e.props},objects:{...o.objects,...e.objects}},u=[...new Set([...o.channels,...Array.isArray(e.channels)?e.channels:[]])];u.length&&(l.channels=u);let d=e.fits??[];l.fits=[...o.fits.filter(e=>!d.some(t=>t.side===e.side&&t.anchor===e.anchor)),...d],Zw(o.checks,e.checks),l.checks=o.checks;for(let[e,t]of Object.entries(o.fills))l.objects[e]&&(l.objects[e]={...t,...l.objects[e]});return o.goals.length&&(l.goals=[...o.goals,...e.goals??[]]),delete l.use,{spec:l,used:c}}var eT=new Set([`f`,`f0`,`steps`,`period`,`swing`,`until`,`reach`,`hold`,`release`]),tT=e=>e&&typeof e==`object`&&!Array.isArray(e)&&(e.range??e.search)!==void 0&&Object.keys(e).every(e=>[`range`,`search`,`int`].includes(e)),nT=e=>e.reduce((e,t)=>typeof t==`number`?`${e}[${t}]`:e?`${e}.${t}`:t,``);function rT(e){let t=[],n=(e,r)=>{if(tT(e)){let n=e.range??e.search;if(!(Array.isArray(n)&&n.length===2&&n.every(Number.isFinite)&&n[0]<n[1]))throw Error(`MOTION_SPEC_INVALID: ${nT(r)} range must be [lo, hi] with lo < hi, got ${JSON.stringify(n)}`);t.push({path:r,lo:n[0],hi:n[1],int:e.int??eT.has(r[r.length-1])});return}if(Array.isArray(e))e.forEach((e,t)=>n(e,[...r,t]));else if(e&&typeof e==`object`)for(let[t,i]of Object.entries(e))n(i,[...r,t])};for(let[t,r]of Object.entries(e??{}))[`schema`,`fps`,`frames`,`search`].includes(t)||n(r,[t]);return t}var iT=(e,t)=>{let n=Math.min(e.hi,Math.max(e.lo,t));return e.int?Math.round(n):Math.round(n*1e4)/1e4};function aT(e,t,n){let r=structuredClone(e);return t.forEach((e,t)=>{let i=r;for(let t of e.path.slice(0,-1))i=i[t];i[e.path[e.path.length-1]]=n[t]}),r}var oT=e=>e.groups.reduce((e,t)=>e+Zb(t),0);function sT(e,t,n,r,i){let a=n=>r(aT(e,t,n)),o=a(n),s=e=>JSON.stringify({...e,keys:void 0,generators:void 0}),c=e=>Us(ah(e,i),e.frames,Bs(e.flow)),l=c(o),u=1/0,d=-1/0;for(let r=0;r<t.length;r++)for(let i of[t[r].lo,t[r].hi]){let f=a(n.map((e,n)=>n===r?iT(t[r],i):e));if(s(f)!==s(o))return null;let p=c(f);for(let t of new Set([...Object.keys(l),...Object.keys(p)])){let n=l[t],r=p[t];for(let t=0;t<e.frames;t++)JSON.stringify(n?.[t])!==JSON.stringify(r?.[t])&&(u=Math.min(u,t),d=Math.max(d,t))}}return u>d?null:[Math.max(0,u-8),Math.min(e.frames-1,d+8)]}var cT=[2,3,5,7,11,13,17,19,23,29],lT=(e,t)=>Array.from({length:t},(t,n)=>{let r=1,i=0,a=e,o=cT[n%cT.length];for(;a>0;)r/=o,i+=a%o*r,a=Math.floor(a/o);return i});function uT(e,t,{sk:n,scene:r},i){let a=performance.now(),o=Math.max(1,Math.min(64,Math.round(e.search?.budget??32))),s=t.map(e=>iT(e,(e.lo+e.hi)/2)),c=sT(e,t,s,i,n),l=new Map,u=0,d=null,f=a=>{let s=a.join(`,`);if(l.has(s))return l.get(s);if(u>=o)return 1/0;u++;let f;try{let o=i(aT(e,t,a));f=oT(rx(n,e_({fps:24,...o},{sk:n,scene:r},{window:c}),o,{explain:!1}))}catch(e){if(!/MOTION_SPEC_INVALID/.test(e.message))throw e;f=1e9}return l.set(s,f),(!d||f<d.cost)&&(d={values:a,cost:f}),f},p=()=>d?.cost===0||u>=o,m=e=>t.map((t,n)=>iT(t,t.lo+(t.hi-t.lo)*e[n]));f(s);let h=t.length===1?[4,3,5,2,6,1,7,0,8].map(e=>[e/8]):Array.from({length:Math.min(o>>1,8*t.length)},(e,n)=>lT(n+1,t.length));for(let e of h){if(p())break;f(m(e))}let g=t.map(e=>(e.hi-e.lo)/8);for(;!p()&&g.some((e,n)=>e>(t[n].int?.5:(t[n].hi-t[n].lo)*.001));){let e=!1;for(let n=0;n<t.length&&!p();n++)for(let r of[-1,1]){let i=d.values.slice();i[n]=iT(t[n],i[n]+r*g[n]);let a=d.cost;f(i),d.cost<a&&(e=!0)}e||(g=g.map(e=>e/2))}return{spec:aT(e,t,d.values),search:{values:Object.fromEntries(t.map((e,t)=>[nT(e.path),d.values[t]])),evals:u,cost:Math.round(d.cost*100)/100,window:c,ms:Math.round(performance.now()-a)}}}var dT=2e4;function fT(e){let t=structuredClone(e);for(let n of rT(e)){let e=t;for(let t of n.path.slice(0,-1))e=e[t];e[n.path[n.path.length-1]]=n.hi}return t}function pT(e,{sk:t,scene:n,lenient:r=!1}={}){if(e?.frames!==`auto`)return e;let{spec:i,used:a}=$w({...fT(e),frames:dT},{sk:t,scene:n,lenient:r,auto:!0}),o=[...Array.isArray(i.keys)?i.keys.map(e=>e?.f):[],...a.map(e=>e.end),...Array.isArray(i.generators)?i.generators.map(e=>e&&Number.isFinite(e.f0)?Fx(e):null):[]];return{...e,frames:Math.max(0,...o.filter(Number.isFinite))+1}}var mT=new WeakSet;function hT(e){return mT.add(e),e}var gT=e=>Array.isArray(e)?`[${e.map(gT).join(`,`)}]`:e&&typeof e==`object`?`{${Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${JSON.stringify(t)}:${gT(e[t])}`).join(`,`)}}`:JSON.stringify(e)??`null`;function _T(e){let t=14695981039346656037n;for(let n of new TextEncoder().encode(gT(e)))t=BigInt.asUintN(64,(t^BigInt(n))*1099511628211n);return`spec-${t.toString(16).padStart(16,`0`).slice(0,12)}`}function vT(e=64){let t=new Map,n=Math.max(1,e),r=(e,r)=>{for(t.delete(e),t.set(e,r);t.size>n;)t.delete(t.keys().next().value);return r},i=e=>t.has(e)?r(e,t.get(e)):null;return{put(e){let n=_T(e),i=t.get(n);return r(n,{...i,spec:structuredClone(e),framesAuto:mT.has(e)||i?.framesAuto===!0}),n},get(e){let t=i(e);return t?.spec?{...structuredClone(t.spec),...t.framesAuto?{frames:`auto`}:{}}:null},keepParts(e,n){r(e,{...t.get(e),parts:n})},parts(e){return i(e)?.parts??null}}}var yT=12,bT=4,xT=3,ST=5e-4,CT=e=>Math.round(e*1e3)/1e3,wT=e=>Math.round(e*10)/10,TT=e=>e.map(CT);function ET(e,t,n){let r=e.frameCount-1,i=e.timeMap??(e=>e),a=t.map((e,t)=>({beat:e.skill,src:`use[${t}]`,f:[e.f0,e.end??e.f0]}));(n.generators??[]).forEach((e,t)=>a.push({beat:e.type,src:`generators[${t}]`,f:[e.f0,e.f0+16+(e.steps??8)*(e.period??20)+18]}));let o=e=>a.some(t=>e>=t.f[0]&&e<=t.f[1]),s=[...new Set((n.keys??[]).map(e=>e.f))].filter(e=>Number.isFinite(e)&&!o(e)).sort((e,t)=>e-t),c=null;for(let e of s)c&&!a.some(t=>t.src!==`keys`&&t.f[1]>c.f[1]&&t.f[0]<e)?c.f[1]=e:a.push(c={beat:`keys`,src:`keys`,f:[e,e]});let l=e=>Math.max(0,Math.min(r,Math.round(i(e))));for(let e of a)e.f=[l(e.f[0]),l(e.f[1])];return a.sort((e,t)=>e.f[0]-t.f[0]).slice(0,yT)}function DT(e){let t=e.frameCount,n=e.f0??0,r={l:new Uint8Array(t),r:new Uint8Array(t)};for(let[t,i]of[[`l`,`Left`],[`r`,`Right`]]){let a=e.frames.map((t,n)=>t?Rc(e,n,i):null);a.forEach((e,i)=>{let o=a[i>0?i-1:i+1];if(!e||!o)return;let s=[`heel`,`ball`].some(t=>e[t][1]<gl.plantH&&Math.abs(e[t][1]-o[t][1])<ST&&Math.hypot(e[t][0]-o[t][0],e[t][2]-o[t][2])<=gl.slide);r[t][n+i]=+!!s})}return r}function OT(e,[t,n]){let r=[],i=null;for(let a=t;a<=n+1;a++){let t=a<=n&&e[a]===1;t&&i===null&&(i=a),!t&&i!==null&&(a-i>=xT&&r.push([i,a-1]),i=null)}if(r.length<=bT)return r;let a=r.slice(1,-1).sort((e,t)=>t[1]-t[0]-(e[1]-e[0])||e[0]-t[0]).slice(0,2);return[r[0],...a,r[r.length-1]].sort((e,t)=>e[0]-t[0])}function kT(e,t){let n=e.frameCount,r=[],i=Object.entries(t.objects??{});for(let[e,t]of i)for(let i=1;i<n;i++){let n=Wd(t,i-1),a=Wd(t,i);a&&!n&&r.push({f:i,object:e,event:`grab`}),n&&!a&&r.push({f:i-1,object:e,event:`release`})}let a={};for(let[e,t]of i)typeof t?.visible==`string`&&(a[t.visible]??=[]).push(e);for(let t of new Set([...Object.keys(a),...Object.keys(e.baked??{}).filter(e=>e.endsWith(`_vis`))])){let i=e.baked?.[t];if(i)for(let e=1;e<n;e++){let n=i[e-1]>.5,o=i[e]>.5;if(n!==o)for(let n of a[t]??[t])r.push({f:e,object:n,event:o?`show`:`hide`})}}return r.sort((e,t)=>e.f-t.f)}function AT(e,t,n,r){for(let[t,i]of Object.entries(e.objects??{}))if(e.props?.[i?.prop]?.hand===n&&Wd(i,r))return`object:${t}`;let i=null,a=.5;for(let[e,r]of Object.entries(t)){let t=/^w_(.+)_([lr])$/.exec(e);t&&t[2]===n&&r>a&&(i=t[1],a=r)}return i&&`anchor:${i}`}function jT(e,t,n){let r=e.frames[n-(e.f0??0)];if(!r)return null;let{s:i,c:a}=r,o=e.ctx.sk.index;return{root:TT(i.P[o.Hips]),yaw:wT(a.yaw??0),hand_l:TT(i.P[o.LeftHand]),hand_r:TT(i.P[o.RightHand]),on_l:AT(t,a,`l`,n),on_r:AT(t,a,`r`,n)}}function MT(e,{used:t,spec:n}){let r=ET(e,t??[],n);if(!r.length)return[];let i=DT(e),a=kT(e,n);return r.map(t=>({...t,end:jT(e,n,t.f[1]),planted:{l:OT(i.l,t.f),r:OT(i.r,t.f)},events:a.filter(e=>e.f>=t.f[0]&&e.f<=t.f[1])}))}var NT=e=>`[${e[0]},${e[1]}]`,PT=(e,t)=>{e&&!e.includes(t)&&e.push(t)};function FT(e,t){if(!(Array.isArray(e)&&e.length===2&&e.every(Number.isInteger)&&e[0]<=e[1]))return null;let n=Math.max(0,e[0]),r=Math.min(t,e[1]);return n<=r?[n,r]:null}function IT(e,t){if(!Array.isArray(e.goals)||!Number.isInteger(e.frames))return;let n=e.frames-1;e.goals.forEach((e,r)=>{if(!e||typeof e!=`object`||!Array.isArray(e.at))return;let i=FT(e.at,n);!i||i[0]===e.at[0]&&i[1]===e.at[1]||(PT(t,`goals[${r}]${e.name?` "${e.name}"`:``} at ${NT(e.at)} -> ${NT(i)}: the clip is 0..${n}`),e.at=i)})}var LT=e=>e.rot===void 0?{aim:e.aim,...e.roll===void 0?{}:{roll:e.roll},...e.lean===void 0?{}:{lean:e.lean}}:{rot:e.rot},RT=e=>e&&(e.rot!==void 0||e.aim!==void 0),zT=e=>e&&typeof e==`object`&&!Array.isArray(e)&&!RT(e)&&e.roll===void 0&&e.lean===void 0;function BT(e,t,n,r){let i=t.keys.map((e,t)=>({k:e,i:t})).filter(({k:e})=>e&&Number.isInteger(e.f)).sort((e,t)=>e.k.f-t.k.f),a=i.filter(({k:e})=>zT(e));if(!a.length)return;let o=n?.objects?.[e]??Io(n??{})[e],s=o?Hf(t)?{aim:[o.R[0][1],o.R[1][1],o.R[2][1]].map(e=>Math.round(e*1e4)/1e4)}:{rot:gr(o.R)}:null,c=i.filter(e=>RT(e.k)),l=[],u=[];for(let{k:e,i:t}of a){let n=c.filter(t=>t.k.f<e.f).at(-1)??c.find(t=>t.k.f>e.f);n?(Object.assign(e,LT(n.k)),l.push(t)):s&&(Object.assign(e,s),u.push(t))}l.length&&PT(r,`objects.${e}.keys[${l.join(`,`)}] had no rot or aim: each holds the turn of the nearest key before it (else after)`),u.length&&PT(r,`objects.${e}.keys[${u.join(`,`)}] had no rot or aim: ${s.aim?`+Y as in the scene, aim [${s.aim}]`:`turned as in the scene`}`)}function VT(e,t,n){t.keys.forEach((t,r)=>{if(!Array.isArray(t?.rot)||t.rot.length!==4||!t.rot.every(Number.isFinite))return;let i=Math.hypot(...t.rot);Math.abs(i-1)<=.01||i<=.5||i>=2||(t.rot=t.rot.map(e=>e/i),PT(n,`objects.${e}.keys[${r}].rot had length ${i.toFixed(3)}: normalized`))})}function HT(e,t,n){if(!e||typeof e!=`object`)return e;IT(e,n);for(let[r,i]of Object.entries(e.objects??{}))!i||typeof i!=`object`||!Array.isArray(i.keys)||!(Hf(i)||xd(i))||(BT(r,i,t,n),VT(r,i,n));return e}function UT(e,t,n,r){let i=Number.isInteger(e)?[e,e]:e,a=FT(i,t);return a&&(a[0]!==i[0]||a[1]!==i[1])&&PT(r,`${n}.frames ${NT(i)} -> ${NT(a)}: the take is 0..${t}`),a}function WT(e,t,n,r,i){if(Math.ceil(t/e)<=n)return e;let a=Math.ceil(t/n);return PT(i,`${r}.every ${e} -> ${a}: a position probe answers at most ${n} rows`),a}function GT(e,[t,n]){let r=e.filter(e=>e<t||e>n),i=[...new Set(e.map(e=>Math.min(n,Math.max(t,e))))].sort((e,t)=>e-t);return r.length?{frames:i,adjusted:`frames ${r.join(`, `)} lie outside ${t}..${n}: drawn at ${i.filter(e=>e===t||e===n).join(`, `)}`}:{frames:i}}var KT={always:!0,yes:!0,true:!0,on:!0,never:`never`,no:`never`,false:`never`,off:`never`,none:`never`,ifclean:`ifClean`,whenclean:`ifClean`,onlyifclean:`ifClean`,clean:`ifClean`};function qT(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let t=e;if(typeof e.install==`string`&&e.install!==`ifClean`&&e.install!==`never`){let n=KT[e.install.toLowerCase().replace(/[^a-z]/g,``)];n!==void 0&&(t={...t,install:n})}return e.repair===!0?t={...t,repair:{}}:(e.repair===!1||e.repair&&typeof e.repair==`object`&&e.repair.rounds===0&&Object.keys(e.repair).length===1)&&(t=Object.fromEntries(Object.entries(t).filter(([e])=>e!==`repair`))),t}var JT=16,YT=16,XT=12,ZT=`{ name, distance: [refA, refB] | position: ref, frames: [f0, f1], every }`,QT=e=>Math.round(e*1e6)/1e6,$T=e=>Math.round(e*1e4)/1e4;function eE(e,t){let n=/^(joint|bone):(.+)$/s.exec(t);return n?`${n[1]}:${Oo(e,n[2]).bone??n[2]}`:t}function tE(e,t,n,r,i){let a=e.frames===void 0?[0,n]:UT(e.frames,n,t,i);return a||r(`${t}.frames must be [f0, f1], integer frames within 0..${n} with f0 <= f1, got ${Z(e.frames)}`),a}function nE(e,t,{spec:n,sk:r,scene:i,notes:a}){let o=[],s=e=>{o.length<XT&&o.push(e)},c=e.frameCount-1,l=[],u=new Map;if(Array.isArray(t)?t.length>JT?s(`probes has ${t.length} entries; at most ${JT} per compile`):t.forEach((e,t)=>{let o=`probes[${t}]`;if(!e||typeof e!=`object`||Array.isArray(e))return s(`${o} must be ${ZT}`);for(let t of Object.keys(e))Qa.includes(t)||s(`${o} has unknown field "${t}"${xo(t,Qa)}; a probe is ${ZT}`);let d=e.name??o;if(typeof d!=`string`||!d?s(`${o}.name must be a non-empty string, got ${Z(e.name)}`):u.has(d)?s(`${o}.name "${d}" is already used by ${u.get(d)}; probe names must differ`):u.set(d,o),e.distance===void 0==(e.position===void 0))return s(`${o} needs exactly one of distance: [refA, refB] or position: ref`);let f=e.distance===void 0?`position`:`distance`,p=f===`distance`?e.distance:[e.position];if(f===`distance`&&!(Array.isArray(p)&&p.length===2&&p.every(e=>typeof e==`string`)))return s(`${o}.distance must be [refA, refB], two point refs, got ${Z(e.distance)}`);if(f===`position`&&typeof e.position!=`string`)return s(`${o}.position must be a point ref, got ${Z(e.position)}`);let m=p.map((e,t)=>Os(n,s,{sk:r,scene:i},f===`distance`?`${o}.distance[${t}]`:`${o}.position`,e)).every(Boolean),h=tE(e,o,c,s,a);if(e.every!==void 0&&!(Number.isInteger(e.every)&&e.every>=1))return s(`${o}.every must be a positive integer, got ${Z(e.every)}`);if(!m||!h)return;let g=h[1]-h[0]+1,_=e.every??(f===`position`?Math.ceil(g/YT):1),v=f===`position`?WT(_,g,YT,o,a):_;l.push({name:d,kind:f,refs:p.map(e=>eE(r,e)),range:h,every:v})}):s(`probes must be an array of ${ZT}`),o.length)throw Error(`MOTION_SPEC_INVALID: ${o.join(`
9
- `)}${o.length>=XT?`
10
- (more problems not listed)`:``}`);return l}function rE([e,t],n){let r=[];for(let i=e;i<=t;i+=n)r.push(i);return r}function iE(e,t){let n=rE(t.range,t.every).map(n=>[n,Es(e,n,t.refs[0],t.refs[1])]).filter(([,e])=>Number.isFinite(e));if(!n.length)return{min:null,minAt:null,max:null,maxAt:null,mean:null,first:null,last:null};let r=n[0],i=n[0],a=0;for(let e of n)e[1]<r[1]&&(r=e),e[1]>i[1]&&(i=e),a+=e[1];return{min:QT(r[1]),minAt:r[0],max:QT(i[1]),maxAt:i[0],mean:QT(a/n.length),first:QT(n[0][1]),last:QT(n[n.length-1][1])}}function aE(e,t){return{at:rE(t.range,t.every).map(n=>{let r=Ts(e,n,t.refs[0]);return{f:n,p:r?r.map($T):null}})}}function oE(e,t,n){return Object.fromEntries(nE(e,t,n).map(t=>[t.name,t.kind===`distance`?iE(e,t):aE(e,t)]))}var sE=.3,cE=2,lE=[`Thumb4`,`Index4`,`Middle4`,`Ring4`,`Pinky4`],uE=e=>Math.round(e*1e3)/1e3,dE=`near: hand (palm, fingertips), foot (sole) to the nearest object within 0.3 m (top group; part: the body at the closest frame), 2 closest runs; gap [min, f, max, f] m, < 0 inside`;function fE(e,t){let n=e.index,r={};for(let[i,a]of[[`Left`,`l`],[`Right`,`r`]]){let o=U(V(t.P[n[`${i}Hand`]],t.P[n[`${i}HandMiddle1`]]),.5);r[`hand_${a}`]=[o,...lE.map(e=>t.P[n[`${i}Hand${e}`]]).filter(Boolean)],r[`foot_${a}`]=Object.values(_a(e,t,i))}return r}var pE=(e,t,n)=>[t,...e.ctx.scene.objects[t].ancestors??[]].some(t=>{let r=e.ctx.spec.objects?.[t];return r?.visible&&!((e.baked?.[r.visible]?.[n]??0)>.5)});function mE(e,t){let{scene:n,spec:r}=e.ctx,i=[];for(let[a,o]of Object.entries(n?.objects??{})){let n=o.ancestors??[];if([a,...n].some(e=>Uf(r.objects?.[e]))||pE(e,a,t))continue;let s=cf(e,a,t);if(!s)continue;let c={pos:s.pos,R:s.R,half:o.half};i.push({id:a,root:n[n.length-1]??a,hand:sf(e,a,t),box:c,c:V(c.pos,J(c.R,[0,o.half[1],0])),r:G(o.half)})}return i}function hE(e,t,n){let r=U(e.reduce((e,t)=>V(e,t),[0,0,0]),1/e.length),i=Math.max(...e.map(e=>ar(e,r))),a=null;for(let o of t){if(n&&o.hand===n||ar(r,o.c)-o.r-i>(a?a[2]:sE))continue;let t=Math.min(...e.map(e=>fa(e,o.box)));t<=sE&&(!a||t<a[2])&&(a=[o.root,o.id,t])}return a}function gE(e,t){let n=[];return e.forEach((e,r)=>{let i=n[n.length-1];if(!e)return;let[a,o,s]=e,c=r+t;i&&i.object===a&&i.frames[1]===c-1?(i.frames[1]=c,s<i.gap[0]&&(i.gap[0]=s,i.gap[1]=c,i.part=o),s>i.gap[2]&&(i.gap[2]=s,i.gap[3]=c)):n.push({object:a,part:o,frames:[c,c],gap:[s,c,s,c]})}),n.sort((e,t)=>e.gap[0]-t.gap[0]).slice(0,cE).sort((e,t)=>e.frames[0]-t.frames[0]).map(({object:e,part:t,frames:n,gap:r})=>({object:e,...t===e?{}:{part:t},frames:n,gap:[uE(r[0]),r[1],uE(r[2]),r[3]]}))}function _E(e,t){if(!Object.keys(t.ctx.scene?.objects??{}).length)return null;let n=t.f0??0,r={hand_l:[],hand_r:[],foot_l:[],foot_r:[]};t.frames.forEach(({s:i},a)=>{let o=mE(t,a+n),s=fE(e,i);for(let e of Object.keys(r))r[e].push(hE(s[e],o,e.startsWith(`hand_`)?e.slice(-1):null))});let i=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,gE(t,n)]).filter(([,e])=>e.length));return Object.keys(i).length?i:null}var vE=9.7,yE=.25,bE=.75,xE=.88,SE=.5,CE=22,wE=24,TE=Array.from({length:16},(e,t)=>9+t),EE=[`steps`,`period`,`step`,`swing`],DE=new Set([`POP`,`REACH`,`SLIDE`,`FLOAT`,`FLIP`,`KNEE`]),OE=new Map,kE=e=>Math.round(e*100)/100,AE=e=>(Array.isArray(e?.use)?e.use:[]).map((e,t)=>({i:t,u:e})).filter(({u:e})=>e?.skill===`walkTo`&&Number.isInteger(e.args?.arrive)&&Array.isArray(e.args?.to)&&!EE.some(t=>e.args[t]!==void 0)&&Object.values(e.args).every(e=>!(e&&typeof e==`object`&&!Array.isArray(e))));function jE(e,t){if(t===2)return e>=yE&&e<=bE?{first:e,step:e}:null;let n=Math.min(.62,Math.max(.3,.8*e/(t-2+.8))),r=(e-n)/(t-2);return r>=yE&&r<=bE?{first:n,step:r}:null}function ME(e,t,n){let r=[];for(let i of TE)for(let a=2;a<=40;a++){let o=jE(e,a);if(!o)continue;let s=t+16+a*i+18,c=o.step*wE/i,l=Math.abs(Math.log(o.step*i/vE)),u=Math.max(0,n-s)/Math.max(1,n-t);r.push({args:{steps:a,period:i,swing:Math.round(xE*i),step:kE(o.step),firstStep:kE(o.first)},end:s,v:c,late:s>n,score:l+1.5*u+Math.max(0,SE-c)*4})}return{onTime:r.filter(e=>!e.late).sort((e,t)=>e.score-t.score),late:r.filter(e=>e.late).sort((e,t)=>e.end-t.end||e.score-t.score)}}function NE(e,t){let{steps:n,period:r}=e.args,i=Math.round(.8*r),a=n>2&&e.args.firstStep<.62?{firstStep:.62,step:kE((t-.62)/(n-2))}:null;return[{},a,{lift:.06},a&&{...a,lift:.06}].filter(Boolean).map(t=>({...e,args:{...e.args,swing:i,...t}})).filter(e=>e.args.step>=yE&&e.args.step<=bE)}var PE=(e,t,n)=>e.groups.filter(e=>DE.has(e.kind)&&e.last>=t&&e.first<=n).reduce((e,t)=>e+t.count,0);function FE(e,{sk:t,scene:n,trial:r}){let i=[];for(let{i:a,u:o}of AE(e)){let s=JSON.stringify([e.keys,e.use.slice(0,a+1),e.anchors,e.props,e.fits,e.fix,n?.objects??null]);if(OE.has(s)){i.push(OE.get(s));continue}let c=e.use.slice(0,a).filter(e=>e.f0<o.f0),l,u=[];try{let{spec:r,used:i}=$w({...e,frames:2e4,use:c},{sk:t,scene:n,lenient:!0});l=rh(r.keys??[],o.f0),u=i.map(e=>e.end??0)}catch{l=null}if(!l?.foot_l||!l?.foot_r)continue;let d=[(l.foot_l[0]+l.foot_r[0])/2,(l.foot_l[2]+l.foot_r[2])/2],f=o.args.to,p=Math.hypot(f[0]-d[0],f[f.length-1]-d[1]),{onTime:m,late:h}=ME(p,o.f0,o.args.arrive),g=t=>{let n=Math.max(t.end,...u)+1;return{schema:e.schema,fps:e.fps??wE,frames:n,keys:(e.keys??[]).filter(e=>e.f<n),use:[...c,{...o,args:{...o.args,...t.args}}],...e.anchors?{anchors:e.anchors}:{},...e.props?{props:e.props}:{},...e.fits?{fits:e.fits}:{},...e.fix===void 0?{}:{fix:e.fix}}},_=null,v=0,y=null,b=0,x=[...m.slice(0,6),...m.slice(0,3).flatMap(e=>NE(e,p))].slice(0,18);for(let e of[...x,...h.slice(0,CE-x.length)]){let t;try{t=PE(r(g(e)),o.f0,e.end)}catch{t=1/0}if(v++,b+=+!e.late,(!y||t<y.issues)&&(y={c:e,issues:t}),t===0){_=e;break}}if(_??=y?.issues<1/0?y.c:m[0]??h[0],!_)continue;let S=_.args,C=o.args.arrive,w=`use[${a}] walkTo arrive f${C}: steps ${S.steps}, period ${S.period}, swing ${S.swing}, step ${S.step} m, firstStep ${S.firstStep} m${S.lift?`, lift ${S.lift} m`:``} (${kE(_.v)} m/s), ends f${_.end}`,T=m.length?`the ${b} walks tried that end by f${C} pop or miss a foot`:`even the quickest walk over ${kE(p)} m (a step every ${TE[0]} frames, strides up to ${bE} m, 34 frames to start and stop) ends f${h[0]?.end}`,E=_.late?`; f${C} is too soon: ${T}; give arrive >= f${_.end} or a shorter distance`:``,D=y&&y.c===_&&y.issues>0?`; no candidate walked clean (${y.issues} issues in its frames)`:``,O={i:a,args:S,end:_.end,note:`${w}${E}${D} (${v} checked)`};OE.size>=64&&OE.delete(OE.keys().next().value),OE.set(s,O),i.push(O)}return i}function IE(e,t){if(!t.length)return e;let n=e.use.map((e,n)=>{let r=t.find(e=>e.i===n);return r&&e?.skill===`walkTo`?{...e,args:{...e.args,...r.args}}:e});return{...e,use:n}}var LE=e=>Math.round(performance.now()-e);function RE(e,t){let n=structuredClone(e.checks??{}),r=e=>Array.isArray(e)?[Math.round(t(e[0])),Math.round(t(e[1]))]:e;for(let e of[`contacts`,`orient`,`below`])for(let t of n[e]??[])t.when=r(t.when);for(let e of n.clearance??[])e.frames=r(e.frames);return{...e,checks:n}}function zE(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return{spec:e,probes:t};let n=G_(e.goals);if(e.probes===void 0&&n===e.goals)return{spec:e,probes:t};let{probes:r,...i}=e,a=r===void 0?t:t?[...t,...Array.isArray(r)?r:[r]]:r;return{spec:n===e.goals?i:{...i,goals:n},probes:a}}function BE(e,{sk:t,scene:n},r={}){let{spec:i,probes:a}=zE(e,r.probes),o=performance.now(),s={sk:t,scene:n,lenient:r.lenient===!0},c=[],l=r.checks&&ax({checks:r.checks}).checks,u=[],d=e=>{let{spec:t,used:r}=$w(ax(IE(e,u)),s),i=HT(JSON.parse(JSON.stringify(l?{...t,checks:l}:t)),n,c);return pv(i,s),{full:i,used:r}};u=FE(i,{sk:t,scene:n,trial:e=>{let n=d(e).full;return rx(t,e_({fps:24,...n},s),n,{explain:!1})}});let f=i?.frames===`auto`&&u.length?{...i,frames:pT(IE(i,u),s).frames}:pT(i,s),p=rT(f),m=f,h=null;p.length&&({spec:m,search:h}=uT(f,p,s,e=>d(e).full)),i?.frames===`auto`&&hT(m);let g=performance.now(),{full:_,used:v}=d(m),y=e_({fps:24,..._},s),b=LE(g),x=performance.now(),S=y.timeMap?RE(_,y.timeMap):_,C=rx(t,y,S,{userSpec:m}),w=ol(t,y,S.checks),T=Ov(y);T&&Object.assign(w,{units:`${w.units}; ${Dv}`,held:T});let E=_E(t,y),D=fy(t,y);E&&Object.assign(w,{units:`${w.units}; ${dE}`,near:E}),D&&Object.assign(w,{units:`${w.units}; ${uy}`,wrist:D});let O=Ug(t,y);O&&Object.assign(w,{units:`${w.units}; ${Ig}`,load:O});let k=v.filter(e=>e.paced).map(e=>`${e.skill} paced ${e.paced.toFixed(2)} to fit f${e.f0}..f${e.end}`);k.length&&(w.paced=k);let ee=v.filter(e=>e.cut).map(e=>`${e.skill}: ${e.cut}`);ee.length&&(w.cut=ee);let te=v.filter(e=>e.placed).map(e=>`${e.skill} f${e.f0}: ${e.placed.why}: at [${e.placed.at.join(`, `)}], heading ${e.placed.heading}`);te.length&&(w.placed=te),u.length&&(w.planned=u.map(e=>e.note));let ne=MT(y,{used:v,spec:_}),re=a&&oE(y,a,{spec:_,sk:t,scene:n,notes:c});return{out:y,qa:C,observations:w,spec:m,expanded:_,used:v,fixed:y.fixed,search:h,timeline:ne,...re?{probes:re}:{},...c.length?{notes:c}:{},ms:{compile:b,qa:LE(x),total:LE(o)}}}var VE=`cozyclay.take.v3`;function HE(e,t,n={position:[0,0,0],yaw:0},r={}){let i=t.frames.length,a=e.names.length,o=new Float32Array(i*a*4),s=new Float32Array(i*3),c=X(-(n.yaw??0));for(let r=0;r<i;r++){let i=t.frames[r].s,{quats:l,hips:u}=Cr(e,{P:i.P.map(e=>J(c,H(e,n.position))),R:i.R.map(e=>q(c,e))});l.forEach((e,t)=>o.set(e,(r*a+t)*4)),s.set(u,r*3)}let l={},u=t.f0??0;for(let[e,n]of Object.entries(t.ctx.spec.objects??{})){let r=Hf(n),a=Uf(n),o=r||a,s=!Wf(n),c=s?new Float32Array(i*3):null,d=s?new Float32Array(i*4):null,f=o||!s||xd(n),p=f&&n.visible?new Uint8Array(i):null,m=o?new Uint8Array(i):null,h=f&&n.level?new Float32Array(i):null,[g,_]=r?qd(t,n):[0,0],v=r&&ef(t,e)?new Uint8Array(i):null;for(let r=0;r<i;r++){if(p&&(p[r]=+((t.baked?.[n.visible]?.[r+u]??0)>.5)),h&&(h[r]=Math.max(0,Math.min(4,t.baked?.[n.level]?.[r+u]??1))),!s)continue;let i=af(t,e,r+u);i&&(c.set(i.pos,r*3),d.set(gr(i.R),r*4),m&&(m[r]=a||r+u>=g&&r+u<=_?1:0),v&&(v[r]=+(r+u>_)))}l[e]={...s?{pos:c,quat:d}:{},...p?{vis:p}:{},...m?{hold:m}:{},...v?{world:v}:{},...h?{lvl:h}:{}}}return{schema:VE,fps:t.fps,frameCount:i,rig:e.model,bones:e.names.slice(),rot:o,hips:s,objects:l,placement:n,...r}}function UE(e,t){let n=Math.max(0,Math.min(e.frameCount-1,Math.round(t)))*3;return[e.hips[n],e.hips[n+1],e.hips[n+2]]}var WE=`modulepreload`,GE=function(e){return`/`+e},KE={},qE=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=GE(t,n),t=s(t),t in KE)return;KE[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:WE,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},JE=Object.freeze([`keys`,`follow`,`rail`]),YE=Object.freeze({distance:3,height:1.6,response:.7,lead:.25,railStartMode:`head`,maxDollySpeed:4,pitchOffsetDeg:0,orbitOffsetDeg:0});function XE(e){return Array.isArray(e)?e.map(e=>({x:e.x,z:e.z})):null}function ZE(e){if(!e||typeof e!=`object`)return null;let t=Array.isArray(e.points)?e.points:Number.isFinite(e.start)&&Number.isFinite(e.end)?[{t:0,height:e.start},{t:1,height:e.end}]:null;if(!t)return null;let n=t.filter(e=>e&&Number.isFinite(e.t)&&Number.isFinite(e.height)).map(e=>({t:Math.max(0,Math.min(1,e.t)),height:Math.max(.1,e.height)})).sort((e,t)=>e.t-t.t).filter((e,t,n)=>t===n.length-1||n[t+1].t-e.t>1e-6).slice(0,8);return n.length<2?null:(n[0]={...n[0],t:0},n[n.length-1]={...n[n.length-1],t:1},{points:n})}function QE(e){return!e||typeof e!=`object`?null:e.mode===`off`?{mode:`off`}:e.mode===`range`?{mode:`range`,startFrame:e.startFrame,endFrame:e.endFrame}:null}function $E(e){let t=Array.isArray(e?.ids)?e.ids.filter(e=>typeof e==`string`&&e).slice(0,4):[];if(t.length)return Number.isFinite(e.height)?{ids:t,height:e.height}:{ids:t};let n=e?.point;return n&&[n.x,n.y,n.z].every(Number.isFinite)?{point:{x:n.x,y:n.y,z:n.z}}:null}function eD(e,t){let n=t?$E(e.aim):null,r=t&&Number.isFinite(e.focalMm)&&e.focalMm>0?e.focalMm:null;return{...n?{aim:n}:{},...r?{focalMm:r}:{}}}function tD(e={}){let t=e&&typeof e==`object`?e:{},n=JE.includes(t.mode)?t.mode:`keys`,r={...YE,...t.followCam??{}},i=XE(t.cameraRail),a=ZE(t.craneHeight)??(n===`rail`&&i?{points:[{t:0,height:r.height},{t:1,height:r.height}]}:null),o=Xn(t.dollyTiming);return{mode:n,followCam:r,cameraRail:i,railFollow:QE(t.railFollow),craneHeight:a,dollyTiming:Yn(o)?null:o,...eD(t,i)}}function nD(e){return tD(e)}function rD(e,t={}){let n=tD(e),r=t&&typeof t==`object`?t:{};return tD({...n,...r,followCam:r.followCam?{...n.followCam,...r.followCam}:n.followCam,cameraRail:Object.hasOwn(r,`cameraRail`)?r.cameraRail:n.cameraRail,railFollow:Object.hasOwn(r,`railFollow`)?r.railFollow:n.railFollow,craneHeight:Object.hasOwn(r,`craneHeight`)?r.craneHeight:n.craneHeight,dollyTiming:Object.hasOwn(r,`dollyTiming`)?r.dollyTiming:n.dollyTiming})}function iD(e){let t=tD(e);return rD(t,{mode:t.mode===`rail`?`follow`:t.mode,cameraRail:null,railFollow:null,craneHeight:null})}var aD=[`begin`,`mark`,`rollback`,`finish`,`cancel`],oD=(e,t)=>Object.fromEntries(aD.map(n=>[`agent.turn.${n}`,e({turnId:t})]));function sD(e,t){if(e===`agent.turn.mark`)return t.mark={point:t.session?.savepoint()??null,affectedIds:new Set(t.affectedIds),since:new Set},{txId:t.txId,affectedIds:[],toasts:[]};let{mark:n}=t;if(!n)throw new et(`STALE_TARGET`,`The agent turn has no mark to roll back to.`);return t.mark=null,t.edits=(t.edits??[]).filter(e=>e.mark!==n),t.session?.rollback(n.point??void 0),t.affectedIds=n.affectedIds,{txId:t.txId,affectedIds:[...n.since],toasts:[]}}var cD=e=>e&&{point:e.session?.savepoint()??null,affectedIds:new Set(e.affectedIds),since:e.mark&&new Set(e.mark.since),mark:e.mark};function lD(e,t,n){return e&&t&&n?.ok&&n.authored&&(e.edits??=[]).push({...t,receiptId:n.receiptId,ids:n.affectedIds}),n}function uD(e,t,n,r,i){let a=e.edits??[],o=a.findIndex(e=>e.receiptId===t.receiptId);if(o<0)throw new et(`TARGET_BUSY`,`Finish the agent turn before traversing history or opening another transaction. Inside the turn, undo_edit with the receiptId of this message's newest edit reverts it${a.length?` (now ${a.at(-1).receiptId})`:``}; an earlier message's edit is undone after this one ends.`);let s=a[o];if(o<a.length-1)throw new et(`UNDO_CONFLICT`,`Later edits of this message come after it; undo them first, newest first: ${a.slice(o+1).reverse().map(e=>e.receiptId).join(`, `)}.`);return e.session.rollback(s.point??void 0),a.pop(),e.affectedIds=s.affectedIds,e.mark&&s.mark!==e.mark?e.mark={point:e.session.savepoint(),affectedIds:new Set(e.affectedIds),since:new Set}:e.mark&&(e.mark.since=s.since),{ok:!0,status:`completed`,kind:`transaction`,action:`edit.undo`,txId:e.txId,commandId:n.commandId,receiptId:crypto.randomUUID(),host:r.host,summary:`Undid ${s.receiptId} inside this message.`,authored:!1,revision:{before:r.revision,after:i().revision},affectedIds:s.ids,delta:[],checks:{coverage:`agent-turn-savepoint`},undo:null,warnings:[],output:{undoneReceiptId:s.receiptId}}}var dD=new Set([`timeline`,`scene`]),fD=/^(?:(?:object|character|shot):[A-Za-z0-9][A-Za-z0-9._:-]*|stage|timeline|scene)$/,pD=e=>typeof e==`string`&&e.length<=140&&fD.test(e),mD=[`cast.replace`,`cast.setCustomPoses`,`cast.showExtras`,`cast.removePose`,`objects.replace`,`shot.replace`,`ai.prepareShot`],hD=[`shot.create`,`shot.createStill`,`shot.split`,`shot.duplicate`,`shot.remove`,`shot.reorder`,`shot.setRange`,`shot.setTimeline`],gD=[`object.add`,`object.createKit`,`asset.import`,`character.add`],_D=/^(character\.|characters?\b|cast\.(savePose|setLayer)$|ik\.|motion\.)/;function vD(e,t){let n=t?.objects??[],r=new Set,i=e=>{if(!(!e||r.has(`object:${e}`))){r.add(`object:${e}`);for(let t of n)t.parent===e&&i(t.id)}};for(let t of e)i(t);return[...r]}var yD=(e,t)=>e.flatMap(e=>e.op===`create`?[]:e.op===`group`?vD([e.parentId,...e.childIds],t):e.op===`ungroup`?vD(e.childIds,t):vD([e.id],t));function bD(e,t={},n={},r={}){if(r.kind===`document`||/^(scene|project)\./.test(e)||e===`load_scenes`||mD.includes(e))return[`scene`];if(r.readOnly||r.kind===`transient`||/^(view|timeline)\./.test(e)||[`motion.qa`,`motion.sample`,`motion.describe`,`motion.report`,`sculpt.compare`,`export.shotVideo`].includes(e)||gD.includes(e))return[];if(e===`objects.batch`)return[...new Set(t.ops.flatMap(e=>bD(e.name,e.args,n)))];if(e===`objects.arrange`)return[...new Set(yD(t.ops,n))];if(e===`characters.arrange`)return t.ops.flatMap(e=>e.op===`create`?[]:[`character:${e.characterId}`]);if(e.startsWith(`stage.`)||e===`shot.setLens`)return[`stage`];if(hD.includes(e))return[`timeline`];if(e.startsWith(`shot.`)){let e=t.shotId??t.id??n.selectedShotId;return e?[`shot:${e}`]:[`timeline`]}return e===`object.group`?vD([t.parent,...t.children],n):e===`object.ungroup`?vD(t.children,n):e===`object.remove`?vD(t.ids,n):e===`object.attach`||e===`motion.keyObject`?[`character:${t.characterId}`,...vD([t.objectId],n)]:e.startsWith(`object.`)?vD([t.id??t.objectId],n):_D.test(e)&&(t.characterId??t.id)?[`character:${t.characterId??t.id}`]:[`scene`]}function xD(e,t={}){return(t.objects??[]).some(t=>t.id===e)?`object:${e}`:(t.characters??[]).some(t=>t.id===e)?`character:${e}`:(t.shots??[]).some(t=>t.id===e)?`shot:${e}`:null}function SD(e,t,n){for(let r of n.values()){if(r.taskId===e)continue;let n=t.find(e=>r.keys.has(e)||dD.has(e)||[...r.keys].some(e=>dD.has(e)));if(n)return`${n} is held by task ${r.taskId}${r.title?` (${r.title})`:``}`}return null}var CD=(e,t)=>{throw new et(e,t)},wD=[`begin`,`requestScope`,`mark`,`rollback`,`finish`,`cancel`,`undo`],TD=32,ED=e=>[...e].slice(0,6).join(`, `)+(e.length>6?` and ${e.length-6} more`:``);function DD({ports:e,emit:t}){let n=new Map,r=new Map,i=new Map,a=t=>{let[n,r]=t.split(/:(.*)/s);if(r!==void 0)return e.readTarget?.(r)??`absent`;let i=e.read();return n===`scene`?`r${i.revision}`:`${n}:${i.domainRevisions?.[n===`timeline`?`shot`:n]??0}`},o=t=>({key:t,value:e.snapshotTarget?e.snapshotTarget(t):CD(`CAPABILITY_MISSING`,`This editor cannot snapshot task targets.`)});function s(n,r,o){if(n.skipped=r.filter(e=>e.value===null).map(e=>e.key),r=r.filter(e=>e.value!==null),!r.length)return null;e.restoreTargets||CD(`CAPABILITY_MISSING`,`This editor cannot restore task targets.`);let{historyEntryId:s=null}=e.restoreTargets(r)??{};s&&i.set(s,n.taskId),n.restored=[...new Set(r.map(({key:t})=>t.includes(`:`)?t.slice(t.indexOf(`:`)+1):e.read().host.sceneId))];for(let{key:e}of r)n.tokens.set(e,a(e));return t?.({type:`task.${o}`,taskId:n.taskId,keys:r.map(e=>e.key)}),s}function c(e,t){let r=t.find(e=>!pD(e));r!==void 0&&CD(`INVALID_ARGUMENT`,`"${r}" is not a scope key: object:<id>, character:<id>, shot:<id>, stage, timeline or scene.`);let i=SD(e.taskId,t,n);i&&CD(`SCOPE_BUSY`,`${i}; wait for it, or ask for what is free.`);for(let n of t)e.keys.has(n)||(e.keys.add(n),e.tokens.set(n,a(n)))}function l(t,n,r,i,{historyEntryId:a=null,affectedIds:o=[],output:s,warnings:c=[]}={}){let l=e.read();return n.skipped?.length&&(c=[...c,{code:`SCOPE_NOT_RESTORED`,message:`Left as they are (a document change has no undo): ${ED(n.skipped)}.`}]),n.skipped=null,Nn({ok:!0,status:`completed`,kind:`transaction`,commandId:r.commandId,receiptId:crypto.randomUUID(),host:i.host,action:t,txId:n.taskId,authored:!!a,revision:{before:i.revision,after:l.revision},affectedIds:a&&!o.length?n.restored:o,delta:[],checks:{coverage:`task-scope`},warnings:c,undo:a?{historyEntryId:a,entries:1,canUndoDirect:!1}:null,output:{scope:[...n.keys],...s}})}let u=(e,t)=>{(e.origin!==`agent`||e.taskId!==t)&&CD(`CAPABILITY_MISSING`,`Only the owning task can control it.`)};return{get size(){return n.size},controls:(e,t)=>Object.fromEntries(wD.map(n=>[`task.${n}`,n===`begin`||n===`requestScope`?{...e({taskId:t,scope:{type:`array`,items:{type:`string`},maxItems:64}}),properties:{taskId:t,scope:{type:`array`,items:{type:`string`},maxItems:64},reads:{type:`array`,items:{type:`string`},maxItems:64},title:{type:`string`,maxLength:120}}}:e({taskId:t})])),of(e,t){if(!e.taskId)return null;let r=n.get(e.taskId);return!r&&!t.startsWith(`task.`)&&CD(`STALE_TARGET`,`Task ${e.taskId} is not open.`),r??null},control(e,i,d,f,p){if(e===`task.undo`){let t=r.get(i.taskId)??CD(`UNDO_EXPIRED`,`Task ${i.taskId} is not a finished task this editor still holds.`),n=[...t.final].filter(([e,{token:t,value:n}])=>a(e)!==t&&JSON.stringify(o(e).value)!==n).map(([e])=>e);n.length&&CD(`UNDO_CONFLICT`,`Changed since the task finished: ${ED(n)}; undo those first or edit by hand.`);let c=s(t,[...t.pre.values()],`undone`);return r.delete(i.taskId),l(e,t,d,f,{historyEntryId:c,affectedIds:t.affectedIds})}if(u(d,i.taskId),e===`task.begin`){p&&CD(`TARGET_BUSY`,p),(n.has(i.taskId)||r.has(i.taskId))&&CD(`INVALID_ARGUMENT`,`Task ${i.taskId} already exists.`);let a={taskId:i.taskId,title:i.title??``,keys:new Set,reads:new Set(i.reads??[]),tokens:new Map,pre:new Map,edits:[],notices:[],affectedIds:[]};return c(a,i.scope),n.set(a.taskId,a),t?.({type:`task.begun`,taskId:a.taskId,scope:[...a.keys]}),l(e,a,d,f)}let m=n.get(i.taskId)??CD(`STALE_TARGET`,`Task ${i.taskId} is not open.`);if(e===`task.requestScope`)return c(m,i.scope),t?.({type:`task.scope`,taskId:m.taskId,scope:[...m.keys]}),l(e,m,d,f);if(e===`task.mark`)return m.mark={values:[...m.keys].map(o),keys:new Set(m.keys)},l(e,m,d,f);if(e===`task.rollback`){let t=m.mark??CD(`STALE_TARGET`,`The task has no mark to roll back to.`);m.mark=null;let n=[...m.keys].filter(e=>!t.keys.has(e)).map(e=>m.pre.get(e)??o(e)),r=s(m,[...t.values,...n],`rolledBack`);return m.edits=m.edits.filter(e=>e.mark!==t),l(e,m,d,f,{historyEntryId:r})}if(n.delete(m.taskId),e===`task.cancel`)return l(e,m,d,f,{historyEntryId:s(m,[...m.pre.values()],`cancelled`),affectedIds:m.affectedIds});for(m.final=new Map([...m.pre.keys()].map(e=>[e,{token:a(e),value:JSON.stringify(o(e).value)}])),r.set(m.taskId,m);r.size>TD;)r.delete(r.keys().next().value);return t?.({type:`task.finished`,taskId:m.taskId}),l(e,m,d,f,{affectedIds:m.affectedIds,output:{edits:m.edits.length}})},admit(e,r,i,s,c){if(!e&&!n.size)return null;let l=r?.id?bD(r.id,i,c,r):[];if(!e&&s.origin===`ui`){for(let e of n.values()){let n=l.filter(t=>e.keys.has(t));n.length&&t?.({type:`task.userEdit`,taskId:e.taskId,keys:n})}return null}if(!e){let e=l.find(e=>SD(null,[e],n));return e&&CD(`SCOPE_BUSY`,`${SD(null,[e],n)}; this command waits for that task.`),null}let u=l.filter(t=>!e.keys.has(t));u.length&&CD(`SCOPE_DENIED`,`Outside this task's scope: ${ED(u)}. Ask for it with task.requestScope, or leave it to the task that holds it.`);let d=l.filter(t=>e.tokens.has(t)&&a(t)!==e.tokens.get(t));if(d.length){for(let t of d)e.tokens.set(t,a(t));CD(`STALE_TARGET`,`${ED(d)} changed outside this task (the user, or an undo) since it last looked; read it again, then retry.`)}for(let t of l)e.pre.has(t)||e.pre.set(t,o(t));return{task:e,keys:l,values:l.map(o),mark:e.mark}},record(r,o){if(!r||!o?.ok)return o;let{task:s}=r,c=e.read(),l=[],u=!1;for(let e of o.affectedIds??[]){let t=xD(e,c);!t||s.keys.has(t)||(SD(s.taskId,[t],n)?l.push({code:`SCOPE_DENIED`,message:`${t} changed outside the task's scope.`}):(s.keys.add(t),u=!0,r.keys.includes(t)||(s.pre.set(t,{key:t,value:void 0}),r.values.push({key:t,value:void 0}))))}u&&t?.({type:`task.scope`,taskId:s.taskId,scope:[...s.keys]});for(let e of s.keys)s.tokens.set(e,a(e));if(o.authored){s.edits.push({receiptId:o.receiptId,values:r.values,keys:r.keys,mark:r.mark}),s.affectedIds=[...new Set([...s.affectedIds,...o.affectedIds])],o.undo?.historyEntryId&&i.set(o.undo.historyEntryId,s.taskId);for(let e of n.values())for(let n of r.keys)e!==s&&e.reads.has(n)&&(e.notices.push({code:`DEPENDENCY_CHANGED`,message:`${n}, which this task reads, was changed by task ${s.taskId}.`}),t?.({type:`task.dependencyChanged`,taskId:e.taskId,key:n,by:s.taskId}))}let d=s.notices.splice(0);return d.length||l.length?{...o,warnings:[...o.warnings,...l,...d].slice(0,12)}:o},traversal(e,t,r,a,o){let c=r.taskId?n.get(r.taskId):null;if(c&&e===`edit.undo`){let n=c.edits.findIndex(e=>e.receiptId===t.receiptId);n<0&&CD(`TARGET_BUSY`,`Inside a task, undo_edit takes the receiptId of the task's own newest edit${c.edits.length?` (now ${c.edits.at(-1).receiptId})`:``}.`),n<c.edits.length-1&&CD(`UNDO_CONFLICT`,`Later edits of this task come after it; undo them first, newest first: ${c.edits.slice(n+1).reverse().map(e=>e.receiptId).join(`, `)}.`);let i=c.edits.pop();return l(e,c,r,a,{historyEntryId:s(c,i.values,`editUndone`),output:{undoneReceiptId:i.receiptId}})}let u=n.get(i.get(o));return!c&&u&&CD(`TARGET_BUSY`,`The last edit belongs to running task ${u.taskId}${u.title?` (${u.title})`:``}; cancel or undo it from that task.`),null},dispose(){n.clear(),r.clear(),i.clear()}}}var OD=(e,t)=>JSON.stringify(e)===JSON.stringify(t),kD=(e,t)=>{throw new et(e,t)},AD=(e,t,n)=>e?.then?e.then(t,n):t(e),jD=e=>e.slice(-12).map(e=>({code:`STUDIO_TOAST`,message:[...e.message].slice(0,120).join(``)})),MD=0;function ND({registry:e,ports:t}){let n=new Map,r=new Map,i=new Map,a=new Set,o=new Map,s=new Map,l=null,u=DD({ports:t,emit:e=>f(e)});function d(n,r,i){if(i.origin===`ui`)return;if(n.exposure===`ui-only`&&kD(`CAPABILITY_MISSING`,n.uiOnlyHint??`This command is available only from the Studio UI.`),n.id===`load_scenes`){let t=e=>[...new Set(e.map(e=>e.id))].sort();if(OD(t(r.document.scenes),t(e.state().scenes)))return}else if(n.exposure!==`confirm`||n.requiresConfirmation?.(e.state(),r)===!1)return;let a=o.get(i.confirmationToken);(!a||a.id!==n.id||!OD(a.args,r)||!OD(a.host,t.read().host)||a.expires<(t.now??Date.now)())&&kD(`CONFIRMATION_REQUIRED`,n.confirmationReason??`This command needs user confirmation.`),o.delete(i.confirmationToken)}let f=e=>{for(let t of a)t(e);t.emit?.(e)},p=En.TargetGuard.properties.targetId,m=e=>({type:`object`,properties:e,required:Object.keys(e),additionalProperties:!1}),h={type:`object`,properties:{},required:[],additionalProperties:!0},g={...oD(m,p),...u.controls(m,p),"run.begin":m({id:p,args:h}),"run.update":m({txId:p,args:h}),"run.commit":m({txId:p}),"run.cancel":m({txId:p}),"job.await":{...m({jobId:p}),properties:{jobId:p,timeoutMs:{type:`integer`,minimum:1,maximum:3e5,default:3e4}}},"job.cancel":m({jobId:p}),"edit.undo":{...m({receiptId:p}),required:[]},"edit.redo":{...m({receiptId:p}),required:[]}},_=e=>(t.clearTimeout??clearTimeout)(e);function v(e,n=!1,i=new et(`CANCELLED`,`Transaction was cancelled.`)){r.delete(e.txId),_(e.timer),e.workTimer!==void 0&&_(e.workTimer),e.controller.abort(i),e.session.cancel({restore:OD(e.before.host,t.read().host)}),f({type:`transaction.cancelled`,txId:e.txId,expired:n})}function y(e){e.timer!==void 0&&_(e.timer),e.timer=(t.setTimeout??setTimeout)(()=>v(e,!0),t.transactionIdleMs??3e4)}function b(n,a,o,c){if(n.startsWith(`task.`))return u.control(n,a,o,c,l?`Finish the agent turn first.`:r.size?`Finish the open command transaction first.`:null);if(n.startsWith(`agent.turn.`)){if((o.origin!==`agent`||o.turnId!==a.turnId)&&kD(`CAPABILITY_MISSING`,`Only the owning agent turn can control this transaction.`),n===`agent.turn.begin`)return(l||r.size||u.size)&&kD(`TARGET_BUSY`,`Finish the open transaction first.`),l={txId:a.turnId,before:c,affectedIds:new Set,toasts:[],session:null},x(n,l,o,c);l?.txId!==a.turnId&&kD(`STALE_TARGET`,`The agent turn is no longer open.`);let e=l;if(n===`agent.turn.mark`||n===`agent.turn.rollback`)return x(n,sD(n,e),o,c);if(n===`agent.turn.cancel`)return l=null,e.session?.cancel(),x(n,e,o,c);try{e.historyEntryId=e.session?.commit().historyEntryId}catch(t){throw e.session?.cancel(),t}finally{l=null}return x(n,e,o,e.before)}let f=n===`edit.undo`||n===`edit.redo`,p=f&&u.traversal(n,a,o,c,n===`edit.undo`?t.history?.(!1):null);if(p)return p;if(l&&!n.startsWith(`job.`)&&!(f&&!l.session)){if(n===`edit.undo`&&o.turnId===l.txId)return Nn(uD(l,a,o,c,()=>t.read()));kD(`TARGET_BUSY`,`Finish the agent turn before traversing history or opening another transaction.`)}if(f){let e=n===`edit.redo`,r=t.history?.(e),i=a.receiptId?t.receipt(a.receiptId):s.get(r)??(r?{receiptId:r,host:c.host,affectedIds:[c.host.sceneId],undo:{historyEntryId:r,entries:1,canUndoDirect:!0}}:null);if(!a.receiptId&&!i)return Nn({ok:!0,status:`noop`,action:n,commandId:o.commandId,receiptId:crypto.randomUUID(),host:c.host,authored:!1,mutated:!1,revision:{before:c.revision,after:c.revision},affectedIds:[],delta:[],checks:{coverage:`native-history-restoration`},undo:null,warnings:[]});(!i?.undo||!t.isRetained(i))&&kD(`UNDO_EXPIRED`,`The receipt no longer has a retained history entry.`),OD(i.host,c.host)||kD(`STALE_SCENE`,`The receipt belongs to another document.`),(e?r!==i.undo.historyEntryId:!t.canUndo(i))&&kD(`UNDO_CONFLICT`,`Another edit owns the history boundary.`),(e?t.redo:t.undo)();let l=t.read(),u=i.affectedIds,d=u.map(e=>({...c.host,targetId:e,token:t.readTarget?.(e)??`removed-${crypto.randomUUID()}`}));return Nn({ok:!0,status:e?`applied`:`undone`,commandId:o.commandId,receiptId:crypto.randomUUID(),host:c.host,authored:!0,revision:{before:c.revision,after:l.revision},affectedIds:u,delta:u.slice(0,8).map(e=>({id:e,after:{token:d.find(t=>t.targetId===e).token}})),checks:{coverage:`native-history-restoration`},undo:{...i.undo,canUndoDirect:e},warnings:[],...e?{action:n,mutated:!0}:{undoneReceiptId:i.receiptId,restoredTargets:d},...u.length>8?{detailCursor:o.commandId}:{}})}if(n.startsWith(`job.`)){let e=i.get(a.jobId);(!e||!OD(e.host,c.host))&&kD(`STALE_TARGET`,`Job is not in this document.`),n===`job.cancel`&&!e.outcome&&e.controller.abort(new et(`CANCELLED`,`Job was cancelled.`));let r;return(n===`job.await`&&!e.outcome?Promise.race([e.completion,new Promise((e,n)=>{r=(t.setTimeout??setTimeout)(()=>n(new et(`TIMEOUT`,`Job is still running.`)),a.timeoutMs)})]):e.completion).then(t=>Nn({...t,commandId:o.commandId,...t.ok?{receiptId:crypto.randomUUID()}:{},jobId:e.id})).finally(()=>{r!==void 0&&_(r)})}let m;if(n===`run.begin`){r.size&&kD(`TARGET_BUSY`,`Finish or cancel the open command transaction first.`);let n=e.prepare(a.id,a.args);d(n.entry,n.args,o),n.entry.kind!==`mutation`&&kD(`INVALID_ARGUMENT`,`Only mutations can open a transaction.`),m={txId:crypto.randomUUID(),entry:n.entry,before:c,origin:o.origin,targetId:n.args.characterId??null,controller:new AbortController,session:t.beginAction(n.entry.undoDomain,n.args.characterId??null),affectedIds:new Set,toasts:[]},r.set(m.txId,m),y(m)}else{if(m=r.get(a.txId),(!m||!OD(m.before.host,c.host))&&kD(`STALE_TARGET`,`Transaction is no longer open in this document.`),o.origin!==m.origin&&kD(`TARGET_BUSY`,`This transaction belongs to another origin.`),m.updating&&n!==`run.cancel`&&kD(`TARGET_BUSY`,`A transaction update is still running.`),n===`run.update`){let i=e.prepare(m.entry.id,a.args);m.entry.undoDomain===`motion`&&i.args.characterId!==m.targetId&&kD(`INVALID_ARGUMENT`,`A motion transaction keeps its original target.`);let s=[],l=t.captureToasts?.(e=>s.push(typeof e==`string`?{message:e}:e)),u={origin:o.origin,signal:m.controller.signal,check(){m.controller.signal.throwIfAborted(),(!r.has(m.txId)||!OD(m.before.host,t.read().host))&&kD(`STALE_TARGET`,`Transaction is no longer current.`)}},d=e=>{l?.(),_(m.workTimer),m.updating=!1,u.check(),s.length&&t.read().revision===c.revision&&kD(`TARGET_NOT_READY`,s.at(-1).message);for(let t of e.affectedIds)m.affectedIds.add(t);return m.toasts.push(...s),y(m),x(n,m,o,c)},f=e=>{throw l?.(),_(m.workTimer),m.updating=!1,!(e instanceof et)&&s.length&&t.read().revision===c.revision&&(e=new et(`TARGET_NOT_READY`,s.at(-1).message)),r.has(m.txId)&&v(m),e};try{m.updating=!0,_(m.timer),m.workTimer=(t.setTimeout??setTimeout)(()=>v(m,!0,new et(`TIMEOUT`,`${m.entry.id} exceeded its deadline.`)),m.entry.timeoutMs??3e4);let n=m.session.run(()=>e.invoke(m.entry,i.args,u));if(!n?.then)return d(n);let r=new Promise((e,t)=>m.controller.signal.addEventListener(`abort`,()=>t(m.controller.signal.reason),{once:!0}));return Promise.race([n,r]).then(d,f)}catch(e){return f(e)}}if(n===`run.cancel`&&v(m),n===`run.commit`){r.delete(m.txId),_(m.timer);try{m.historyEntryId=m.session.commit().historyEntryId}catch(e){throw m.session.cancel({restore:!1}),e}}}return x(n,m,o,n===`run.commit`?m.before:c)}function x(e,n,r,i){let a=t.read();return Nn({ok:!0,status:`completed`,kind:`transaction`,commandId:r.commandId,receiptId:crypto.randomUUID(),host:i.host,action:e,txId:n.txId,authored:!!n.historyEntryId,revision:{before:i.revision,after:a.revision},affectedIds:[...n.affectedIds],delta:[],checks:{coverage:`wire-transaction`},warnings:jD(n.toasts),undo:n.historyEntryId?{historyEntryId:n.historyEntryId,entries:1,canUndoDirect:!0}:null})}function S(e,n,r,i){let a=i??t.read().revision!==n.revision;return Nn({ok:!1,commandId:e.commandId,host:n.host,code:c(r),phase:a?`commit`:`admission`,affectedIds:[],expectedTargets:[],currentTargets:[],mutated:a,preserved:{authoredState:a?`changed`:`unchanged`},recovery:{action:`inspect`,retryAllowed:!1},message:[...String(r.message||r)].slice(0,500).join(``)})}let C=(e=[],t=[],n=0,r=12)=>{let i=[...n?[{code:`READBACK_TRUNCATED`,count:n,message:`Readback lists 8 of ${8+n} affected ids; inspect_studio scope entities with ids for the rest.`}]:[],...e,...jD(t)];return i.length<=r?i:[...i.slice(0,r-1),{code:`WARNINGS_TRUNCATED`,count:i.length-r+1,message:`${i.length-r+1} more warnings omitted.`}]};function w(e,n,r,i,a,o=[],s=null){let c=t.read(),l=c.revision!==r.revision,u=a??(l?s?.txId:null)??null;e.kind===`mutation`&&l&&!a&&!s&&kD(`UNCERTAIN_APPLY`,`${e.id} changed the scene without one undoable entry.`);let d=e.kind===`job`||e.kind===`document`||e.kind===`mutation`&&l&&(s||c.revision>r.revision+1),f=d||l?i.affectedIds:e.kind===`transient`?[r.host.sceneId]:[];if(s&&l)for(let e of f)s.affectedIds.add(e),s.mark?.since.add(e);let p=a=>Nn({ok:!0,commandId:n.commandId,receiptId:crypto.randomUUID(),host:r.host,action:e.id,summary:i.summary,status:d?`completed`:e.kind===`transient`?`transient`:l?`applied`:`noop`,authored:l,...d?{kind:e.kind,...i.output===void 0?{}:{output:i.output},...OD(r.host,c.host)?{}:{nextHost:c.host}}:e.kind===`transient`?{view:{before:r.viewRevision??0,after:c.viewRevision??0}}:{mutated:l},revision:{before:r.revision,after:c.revision},affectedIds:f,delta:f.slice(0,8).map(e=>({id:e,after:t.readback?.(e,c,a>0)??{removed:!0}})),checks:{coverage:`studio-action:${e.id}`,...i.checks},warnings:C(i.warnings,o,Math.max(0,f.length-8),a>1?4:12),undo:u?{historyEntryId:u,entries:1,canUndoDirect:!s}:null,...f.length>8?{detailCursor:n.commandId}:{}});for(let e=0;;e++)try{return p(e)}catch(t){if(e>=2||t?.code!==`INVALID_RECEIPT`||!/8 KiB/.test(t.message))throw t}}function T(a,o={},c={}){let p={origin:`ui`,commandId:crypto.randomUUID(),...c};p.origin===`ui`&&(a===`edit.undo`||a===`edit.redo`)&&t.finishHistoryGesture?.();let m=t.read(),h=t.journal();l&&!OD(l.before.host,m.host)&&(l.session?.cancel({restore:!1}),l=null);let v=p.origin===`agent`&&p.turnId===l?.txId?l:null,y=u.of(p,a),x=(e,n,r,i=!1)=>v?(v.session??=t.beginAction(e,r),{result:v.session.run(()=>t.beginAction(e,r).run(n)),historyEntryId:null}):t.recordAction(e,n,r,i),C=!1,T,E,D,O,k=!1,ee,te=new AbortController,ne=()=>{E!==void 0&&_(E),D!==void 0&&_(D)},re=[],ie=()=>re.length&&t.read().revision===m.revision?new et(`TARGET_NOT_READY`,re.at(-1).message):null,ae=e=>{if(O?.background){let t=O.completionCommandId??=crypto.randomUUID();h.begin(t),e=Nn({...e,commandId:t,jobId:O.id})}let n=h.record(e);n.undo?.canUndoDirect&&!a.startsWith(`edit.`)&&s.set(n.undo.historyEntryId,n);for(let[e,n]of s)t.isRetained?.(n)===!1&&s.delete(e);return t.remember?.(n),n},oe=e=>{ne(),T?.(),T=null,e instanceof et||(e=ie()??e),p.origin===`ui`&&e.uiMessage&&t.showRefusal?.(e.uiMessage);let n=S(p,m,e,O?k:void 0),r=C?ae(n):n;return O&&!O.completion&&(O.outcome=r,O.completion=Promise.resolve(r),f({type:`job.completed`,jobId:O.id,receipt:r})),r};try{p.origin!==`ui`&&!OD(On(p.host),m.host)&&kD(`STALE_SCENE`,`The live document changed.`),p.turnId&&!v&&a!==`agent.turn.begin`&&kD(`STALE_TARGET`,`The agent turn is no longer open.`);let s=JSON.stringify({id:a,args:o,...p});if(!h.begin(p.commandId,s))return h.get(p.commandId)??n.get(p.commandId)??S(p,m,new et(`UNCERTAIN_APPLY`,`Command is still executing.`));C=!0;let{entry:c,args:l}=g[a]?{args:Dn(g[a],o)}:e.prepare(a,o);if(p.origin!==`ui`&&(!y&&!a.startsWith(`task.`)&&!c?.readOnly&&![`job.await`,`job.cancel`,`agent.turn.mark`,`agent.turn.rollback`,`agent.turn.finish`,`agent.turn.cancel`].includes(a)&&p.expectedRevision!==m.revision&&kD(`STALE_SCENE`,`Authored state changed; obtain fresh intent.`),!c?.readOnly&&m.busy&&!v&&!r.has(l.txId)&&!a.startsWith(`job.`)&&kD(`TARGET_BUSY`,`Finish the current editor gesture first.`)),g[a])return AD(b(a,l,p,m),ae,oe);r.size&&kD(`TARGET_BUSY`,`Finish or cancel the open command transaction first.`),v&&c.kind===`document`&&kD(`TARGET_BUSY`,`Finish the agent turn before changing documents.`),d(c,l,p);let _=u.admit(y,c,l,p,m);T=t.captureToasts?.(e=>re.push(typeof e==`string`?{message:e}:e));let se=c.domain??c.undoDomain,ce=c.target?.(l,m)??l.characterId??l.shotId??l.objectId,le=ce?t.readTarget?.(ce):null,ue=se?m.domainRevisions?.[se]:null,de=()=>{let e=t.read();le=ce?t.readTarget?.(ce):null,ue=se?e.domainRevisions?.[se]:null},fe=new Set,pe={origin:p.origin,signal:te.signal,taskId:p.taskId??null,check(){te.signal.throwIfAborted();let e=t.read();OD(e.host,m.host)||kD(`STALE_TARGET`,`The open document or scene changed while the job was running.`),se&&!y&&e.domainRevisions?.[se]!==ue&&kD(`STALE_TARGET`,`The ${se} data changed while the job was running (revision ${ue} to ${e.domainRevisions?.[se]}); an edit landed between the request and its result.`),ce&&t.readTarget?.(ce)!==le&&kD(`STALE_TARGET`,`${ce} changed while the job was running.`)},commit(e){pe.check(),se||kD(`INVALID_ARGUMENT`,`A committing job must declare its domain.`);let t=x(se,e,ce??null);return t?.then&&kD(`INVALID_ARGUMENT`,`Job publication must be synchronous; prepare before commit.`),ee=t.historyEntryId,k||=!!ee,O&&de(),t.result},run(t,n={}){O?pe.check():te.signal.throwIfAborted();let r=e.prepare(t,n);d(r.entry,r.args,p);let i=()=>e.invoke(r.entry,r.args,pe),a=r.entry.kind===`mutation`?x(r.entry.undoDomain,i,r.args.characterId??null,!0):{result:i()};return O&&de(),AD(a,e=>AD(e.result,t=>{O&&(pe.check(),de(),k||=!!e.historyEntryId);for(let e of t.affectedIds)fe.add(e);return t}))}};c.kind===`job`&&(O={id:crypto.randomUUID(),host:m.host,controller:te,background:!1},i.set(O.id,O)),E=(t.setTimeout??setTimeout)(()=>{let e=new et(`TIMEOUT`,`${c.id} exceeded its deadline.`);te.abort(e)},O&&c.background===!0?3e5:c.timeoutMs??3e4);let me=()=>{let t=e.invoke(c,l,pe);if(!t?.then)return t;let n=new Promise((e,t)=>te.signal.addEventListener(`abort`,()=>t(te.signal.reason),{once:!0}));return Promise.race([t,n])},he=cD(v),ge=c.kind===`mutation`?x(c.undoDomain,me,l.characterId??null):{result:me(),historyEntryId:null},_e=({result:e,historyEntryId:t})=>AD(e,e=>{ne(),T?.(),T=null;let n=e?.output===void 0?ie():null;if(n)throw n;return u.record(_,lD(v,he,ae(w(c,p,m,{...e,affectedIds:[...new Set([...e.affectedIds,...fe])]},t??ee,re,v))))}),ve=ge?.then?ge.then(_e):_e(ge),ye=ve?.then?ve.catch(oe):ve;if(O){O.completion=Promise.resolve(ye).then(e=>(O.outcome=e,f({type:`job.completed`,jobId:O.id,receipt:e}),e));let e=()=>{O.background=!0;let e=t.read();return h.record(Nn({ok:!0,commandId:p.commandId,receiptId:crypto.randomUUID(),host:m.host,action:c.id,status:`started`,kind:`job`,jobId:O.id,authored:!1,revision:{before:e.revision,after:e.revision},affectedIds:[],delta:[],checks:{coverage:`studio-action:${c.id}`},warnings:[],undo:null}))};if(ye?.then&&p.wait===!1)return e();if(ye?.then&&c.background===!0){let r=Promise.race([O.completion,new Promise(n=>{D=(t.setTimeout??setTimeout)(()=>n(e()),c.timeoutMs??3e4)})]).finally(()=>n.delete(p.commandId));return n.set(p.commandId,r),r}}if(ye?.then){let e=(O?.completion??ye).finally(()=>n.delete(p.commandId));return n.set(p.commandId,e),e}return ye}catch(e){return oe(e)}}function E(...e){MD++;try{let t=T(...e);return t?.then?t.finally(()=>{MD--}):(MD--,t)}catch(e){throw MD--,e}}return{run:E,confirm(n,r={}){let i=e.prepare(n,r),a=crypto.randomUUID();return o.set(a,{id:n,args:i.args,host:t.read().host,expires:(t.now??Date.now)()+3e5}),a},subscribe(e){return a.add(e),()=>a.delete(e)},dispose(){l?.session?.cancel(),l=null,u.dispose();for(let e of r.values())v(e);for(let e of i.values())e.outcome||e.controller.abort(new et(`CANCELLED`,`Studio closed.`));a.clear()}}}var PD=Object.freeze([`pose_edit`,`object_insert`,`cutout_insert`,`object_transform`,`shot_add`,`shot_edit`,`camera_key_record`,`rail_edit`,`prompt_block_add`,`prompt_block_edit`]);function FD(e,t){if(e===t)return!0;if(typeof e==`number`&&typeof t==`number`)return Math.abs(e-t)<1e-8;if(!e||!t||typeof e!=`object`||typeof t!=`object`)return!1;if(e instanceof Map||t instanceof Map)return e instanceof Map&&t instanceof Map&&e.size===t.size&&[...e].every(([e,n])=>t.has(e)&&FD(n,t.get(e)));let n=Object.keys(e);return n.length===Object.keys(t).length&&n.every(n=>Object.hasOwn(t,n)&&FD(e[n],t[n]))}var ID=e=>({bones:e?.bones??{},rootY:e?.rootY??0}),LD=(e=[])=>e.map(({frame:e,framing:t})=>({frame:e,framing:t})),RD=e=>({...e,camera:tD(e.camera),cameraKeys:LD(e.cameraKeys)});function zD(e,t,n){if(t===n)return null;if(e===`pose`)return FD(t,n)?null:`pose_edit`;if(e===`objects`){let e=n.find(e=>!t.some(t=>t.id===e.id));return e?e.renderer===`cutout`?`cutout_insert`:`object_insert`:FD(t,n)?null:`object_transform`}if(e===`characters`){if(n.some(e=>!t.some(t=>t.id===e.id)))return`object_insert`;for(let e of n){let n=t.find(t=>t.id===e.id);if(n&&!FD(ID(n.pose),ID(e.pose)))return`pose_edit`}let e=e=>e.map(({id:e,x:t,y:n=0,z:r,rot:i,scale:a=1,hidden:o=!1,model:s,tint:c,subject:l,identityImage:u})=>({id:e,x:t,y:n,z:r,rot:i,scale:a,hidden:o,model:s,tint:c,subject:l,identityImage:u}));return FD(e(t),e(n))?null:`object_transform`}if(e===`shots`){if(n.some(e=>!t.some(t=>t.id===e.id)))return`shot_add`;for(let e of n){let n=t.find(t=>t.id===e.id);if(!n)continue;let r=tD(e.camera),i=tD(n.camera);if([`cameraRail`,`craneHeight`,`railFollow`,`dollyTiming`].some(e=>!FD(r[e],i[e])))return`rail_edit`;let a=e.cameraKeys??[],o=n.cameraKeys??[];if(a.length>o.length||a.some(e=>{let t=o.find(t=>t.frame===e.frame);return t&&!FD(t.framing,e.framing)}))return`camera_key_record`}return FD(t.map(RD),n.map(RD))?null:`shot_edit`}return null}function BD(e){let t=new Set;return(n,r,i,a)=>{if(![`craft`,`playground`].includes(n)||t.has(n))return!1;let o=zD(r,i,a);return o?(t.add(n),e(`${n}:first_edit`,{edit_kind:o,definition_version:1}),!0):!1}}var VD=Object.freeze([`read`,`camera`,`scene_write`,`prompt_authoring`,`frame_capture`,`motion_generate`,`motion_apply`,`project_io`,`other`]),HD=Object.freeze([`workflow_read`,`workflow_write`,`workflow_run`,`frame_capture`,`image_generate`,`scene_write`,`other`]),UD=Object.freeze([`workflow:run_requested`,`workflow:run_succeeded`,`workflow:run_failed`,`workflow:run_cancelled`,`workflow:result_applied`,`agent:turn_requested`,`agent:tool_executed`,`agent:turn_succeeded`,`agent:turn_failed`,`agent:turn_cancelled`,`agent:result_applied`,`mcp:tool_requested`,`mcp:tool_executed`,`mcp:result_applied`]),WD=Object.freeze({"workflow:run_requested":[`surface`,`run_id`,`node_count_bucket`],"workflow:run_succeeded":[`run_id`,`duration_bucket`],"workflow:run_failed":[`run_id`,`duration_bucket`,`failure_code`],"workflow:run_cancelled":[`run_id`,`duration_bucket`,`failure_code`],"workflow:result_applied":[`run_id`],"agent:turn_requested":[`surface`,`turn_id`],"agent:tool_executed":[`turn_id`,`tool_category`,`outcome`,`duration_bucket`],"agent:turn_succeeded":[`turn_id`,`duration_bucket`],"agent:turn_failed":[`turn_id`,`duration_bucket`,`failure_code`],"agent:turn_cancelled":[`turn_id`,`duration_bucket`,`failure_code`],"agent:result_applied":[`turn_id`],"mcp:tool_requested":[`tool_category`,`request_id`],"mcp:tool_executed":[`tool_category`,`outcome`,`duration_bucket`,`request_id`],"mcp:result_applied":[`request_id`]}),GD=Object.freeze({surface:new Set([`studio`,`workflow`]),node_count_bucket:new Set([`0`,`1-3`,`4-10`,`gte11`]),duration_bucket:new Set([`lt1s`,`1-3s`,`3-10s`,`10-30s`,`gte30s`]),tool_category:new Set([...VD,...HD]),outcome:new Set([`succeeded`,`failed`,`uncertain`,`cancelled`])}),KD=Object.freeze({source:new Set([`agent`,`manual`]),outcome:new Set([`ok`,`error`]),surface:new Set([`assets`,`agent`,`mcp`])}),qD=`cozyclay.analyticsOptOut`,JD=`cozyclay.internalQa`,YD=`cozyclay.analyticsActivation`,XD=`cozyclay.useCaseAsked`,ZD=Object.freeze({pose:Object.freeze([`pose_edit`]),camera:Object.freeze([`camera_key_record`,`rail_edit`]),object:Object.freeze([`object_insert`,`cutout_insert`,`object_transform`]),shot:Object.freeze([`shot_add`,`shot_edit`]),prompt:Object.freeze([`prompt_block_add`,`prompt_block_edit`])}),QD=Object.freeze(Object.keys(ZD).map(e=>`${e}_edit_bucket`)),$D=Object.freeze([`animation`,`film`,`game`,`ad_mv`,`personal`,`other`,`skip`]),eO=Object.freeze([`team`,`solo`,`skip`]),tO=new Set([`storyboard`,`animation`]),nO=Object.freeze([`latest`,`outdated`,`unknown`]),rO=Object.freeze([`https://cozyclay.org`,`https://www.cozyclay.org`]),iO=Object.freeze({"install:first_launch":[`heard_from`],"app:session_started":[],"app:session_ended":[`duration_bucket`,`action_count_bucket`,`scenes_touched`,...QD],"app:error":[`error_kind`,`error_type`,`error_source`,`error_file`,`error_line`,`error_col`],"device:profile":[`gpu_vendor`,`gpu_class`,`webgl`,`cpu_bucket`,`memory_bucket`,`frame_rate_bucket`],"survey:use_case":[`use_case`,`team`],"feature:used":[`name`],"hosted:composer_viewed":[],"hosted:login_started":[],"hosted:ticket_created":[],"hosted:result_opened":[],"hosted:opened_in_studio":[],"scene:created":[`scene_source`,`previs_mode`],"storyboard:panel_created":[`source`],"storyboard:panel_stylized":[`outcome`],"cast:proxy_added":[`surface`],"scene:loaded":[`scene_source`],"project:saved":[`object_count_bucket`,`shot_count_bucket`],"project:opened":[`age_bucket`],"craft:first_action":[`action_kind`],"craft:first_edit":[`edit_kind`,`definition_version`],"motion:generate_requested":[`surface`,`input_mode`,`request_id`],"motion:preflight_blocked":[`reason`,`surface`,`request_id`],"motion:preflight_passed":[`backend`,`surface`,`request_id`],"motion:job_started":[`backend`,`input_mode`,`request_id`],"motion:job_succeeded":[`backend`,`duration_bucket`,`input_mode`,`request_id`],"motion:job_failed":[`backend`,`duration_bucket`,`input_mode`,`error_code`,`request_id`],"motion:result_applied":[`request_id`,`backend`],"export:blocking_frame_succeeded":[`format`],"export:video_succeeded":[`format`],"export:keyframe_pack":[`entries`,`source`],"export:attempt_started":[`attempt_id`,`export_kind`,`format`,`surface`],"export:attempt_succeeded":[`attempt_id`,`export_kind`,`format`,`surface`,`duration_bucket`],"export:attempt_failed":[`attempt_id`,`export_kind`,`format`,`surface`,`duration_bucket`,`failure_code`],"export:attempt_cancelled":[`attempt_id`,`export_kind`,`format`,`surface`,`duration_bucket`,`failure_code`],"sample:played":[`from`],"playground:opened":[],"playground:first_action":[`action_kind`],"playground:first_edit":[`edit_kind`,`definition_version`],"activation:completed":[`activation_path`],sculpt_run:[`outcome`,`rounds`,`final_iou`,`duration_ms`,`had_target`],...WD}),aO=new Set([`pose_edit`,`pose_save`,`camera_fly`,`orbit`,`dolly_rail`,`crane_graph`,`timeline_scrub`,`prompt_block_add`,`shot_add`,`shot_cut`,`export_pose`,`export_frame`,`export_video`,`export_depth_video`,`export_keyframe_pack`,`mcp_connected`,`auto_color`,`plan_view`]),oO=Object.freeze([`x`,`hn`,`reddit`,`github`,`friend`,`other`,`site`,`playground`]),sO=new Set(oO),cO=new Set([`prompt`,`text`,`url`,`path`,`file`]),lO=Object.freeze({backend:new Set([`none`,`local_kimodo`,`hosted`,`fal`]),surface:new Set([`timeline`,`line_edit`,`trail`,`mcp`,`fal_card`,`agent`]),input_mode:new Set([`prompt`,`pose`,`edit`,`a_to_b`,`still`]),reason:new Set([`unconfigured`,`unreachable`,`unsupported_route`,`locked`,`missing_input`]),error_code:new Set([`aborted`,`unsupported_route`,`generation_failed`,`quota`,`unknown`]),duration_bucket:new Set([`lt1s`,`1-3s`,`3-10s`,`10-30s`,`gte30s`])}),uO=new Set([`unsupported_codec`,`encode_failed`,`render_failed`,`aborted`,`unknown`]),dO=Object.freeze({export_kind:new Set([`video`,`depth_video`,`frame`,`keyframe_pack`,`workflow_send`,`animation_project`,`contact_sheet`,`panel_pack`,`animatic`]),format:new Set([`mp4`,`png`,`zip`,`cclayproject`]),surface:new Set([`studio`,`workflow`,`embed`]),duration_bucket:new Set([`lt1s`,`1-3s`,`3-10s`,`10-30s`,`gte30s`]),failure_code:uO}),fO=Object.freeze([`done`,`cancelled`,`failed`]),pO=10,mO=864e5,hO=Object.freeze({workflow:new Set([`aborted`,`capture_failed`,`generation_failed`,`unknown`]),agent:new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`])}),gO=Object.freeze({error_kind:new Set([`error`,`unhandled_rejection`]),error_type:new Set([`Error`,`TypeError`,`RangeError`,`ReferenceError`,`SyntaxError`,`EvalError`,`URIError`,`AggregateError`,`AbortError`,`TimeoutError`,`NotAllowedError`,`NotSupportedError`,`NotFoundError`,`NotReadableError`,`InvalidStateError`,`QuotaExceededError`,`SecurityError`,`NetworkError`,`DataCloneError`,`OperationError`,`EncodingError`,`UnknownError`,`DOMException`,`non_error`,`other`]),error_source:new Set([`app`,`extension`,`external`,`unknown`])}),_O=/^[A-Za-z0-9_.-]{1,80}\.(?:m?js|jsx|ts|tsx)$/,vO=Object.freeze({gpu_vendor:new Set([`nvidia`,`amd`,`intel`,`apple`,`qualcomm`,`arm`,`software`,`other`,`unknown`]),gpu_class:new Set([`discrete`,`integrated`,`software`,`unknown`]),webgl:new Set([`webgl2`,`webgl1`,`none`]),cpu_bucket:new Set([`1-4`,`5-8`,`9-16`,`gte17`,`unknown`]),memory_bucket:new Set([`lt4`,`4-7`,`gte8`,`unknown`]),frame_rate_bucket:new Set([`lt20`,`20-40`,`40-55`,`gte55`,`unknown`])}),yO=null,bO=!1,xO=!1,SO=!1,CO=null,wO=!1,TO=!1,EO=0,DO=0,OO=0,kO=!1,AO=!1,jO=new Set,MO=new Map(Object.entries(ZD).flatMap(([e,t])=>t.map(t=>[t,e]))),NO=1e3,PO=Object.fromEntries(Object.keys(ZD).map(e=>[e,0])),FO=null,IO=-1/0,LO=10,RO=new Set,zO=!1,BO=!1,VO=new Set([`app:session_started`,`app:session_ended`,`install:first_launch`,`app:error`,`device:profile`]);function HO(){try{return globalThis.localStorage??null}catch{return null}}function UO(e){try{return HO()?.getItem(e)??null}catch{return null}}function WO(e,t){try{HO()?.setItem(e,t)}catch{}}function GO(e){return typeof e==`string`?e.trim().toLowerCase().replace(/[/.]+$/g,``):``}function KO(e){return e===void 0?[...rO]:e.split(`,`).map(GO).filter(Boolean)}function qO(e,t){let n=GO(e);return Array.isArray(t)&&t.some(e=>n===GO(e))}var JO=e=>typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e.length<=32&&!/\s/.test(e);function YO(e,t){let n=iO[e]??[];if(!t||typeof t!=`object`||Array.isArray(t))return{};let r={};for(let i of n)if(!(cO.has(i)||!Object.hasOwn(t,i))&&!(e===`feature:used`&&(i!==`name`||!aO.has(t[i])))&&!(e===`install:first_launch`&&(i!==`heard_from`||!sO.has(t[i])))){if(e.startsWith(`export:attempt_`)){if(i===`attempt_id`){if(typeof t[i]!=`string`||!/^[a-f0-9]{32}$/.test(t[i]))continue}else if(!dO[i]?.has(t[i]))continue}if(!(e===`export:keyframe_pack`&&(i===`source`&&t[i]!==`workflow`||i===`entries`&&(!Number.isFinite(t[i])||t[i]<0)))&&!((e===`craft:first_edit`||e===`playground:first_edit`)&&(i===`edit_kind`&&!PD.includes(t[i])||i===`definition_version`&&t[i]!==1))){if(e.startsWith(`motion:`)){if(i===`request_id`){if(typeof t[i]!=`string`||!/^[a-f0-9]{32}$/.test(t[i]))continue}else if(!lO[i]?.has(t[i]))continue}if(e.startsWith(`workflow:`)||e.startsWith(`agent:`)||e.startsWith(`mcp:`)){if(i===`run_id`||i===`turn_id`||i===`request_id`){if(typeof t[i]!=`string`||!/^[a-f0-9]{32}$/.test(t[i]))continue}else if(i===`surface`){if(!GD.surface.has(t[i])||e.startsWith(`workflow:`)&&t[i]!==`workflow`)continue}else if(i===`node_count_bucket`&&!GD.node_count_bucket.has(t[i]))continue;else if(i===`duration_bucket`&&!GD.duration_bucket.has(t[i]))continue;else if(i===`tool_category`){if(!(e.startsWith(`agent:`)?HD:VD).includes(t[i]))continue}else if(i===`outcome`){if(!(e===`mcp:tool_executed`?[`succeeded`,`failed`,`uncertain`,`cancelled`]:[`succeeded`,`failed`,`cancelled`]).includes(t[i]))continue}else if(i===`failure_code`&&!hO[e.startsWith(`agent:`)?`agent`:`workflow`].has(t[i]))continue}if(e===`app:error`){if(i===`error_file`){typeof t[i]==`string`&&_O.test(t[i])&&(r[i]=t[i]);continue}if(i===`error_line`||i===`error_col`){Number.isInteger(t[i])&&t[i]>=0&&t[i]<=1e7&&(r[i]=t[i]);continue}if(!gO[i]?.has(t[i]))continue}if(!(e===`device:profile`&&!vO[i]?.has(t[i]))){if(e===`sculpt_run`){let e=t[i];i===`outcome`&&fO.includes(e)||i===`rounds`&&Number.isInteger(e)&&e>=0&&e<=pO?r[i]=e:i===`final_iou`&&typeof e==`number`&&e>=0&&e<=1?r[i]=Math.round(e*100)/100:i===`duration_ms`&&typeof e==`number`&&e>=0&&e<=mO?r[i]=Math.round(e):i===`had_target`&&typeof e==`boolean`&&(r[i]=e);continue}i===`previs_mode`&&!tO.has(t[i])||(e.startsWith(`storyboard:`)||e.startsWith(`cast:`))&&!KD[i]?.has(t[i])||e===`survey:use_case`&&(i===`use_case`&&!$D.includes(t[i])||i===`team`&&!eO.includes(t[i]))||JO(t[i])&&(r[i]=t[i])}}}return r}Object.freeze([...aO]);function XO(e){let t=Number.isFinite(e)?Math.max(0,Math.floor(e)):0;return t===0?`0`:t<=3?`1-3`:t<=10?`4-10`:`gte11`}function ZO(e){return!Number.isFinite(e)||e<6e4?`lt1m`:e<3e5?`1-5m`:e<9e5?`5-15m`:e<18e5?`15-30m`:`gte30m`}function QO(e){return!Number.isFinite(e)||e<0||e<36e5?`lt1h`:e<864e5?`1-24h`:e<6048e5?`1-7d`:e<2592e6?`7-30d`:`gte30d`}function $O(){let e=String(globalThis.navigator?.userAgentData?.platform||globalThis.navigator?.platform||``).toLowerCase();return e.includes(`mac`)?`macos`:e.includes(`win`)?`windows`:e.includes(`linux`)?`linux`:e.includes(`android`)?`android`:e.includes(`iphone`)||e.includes(`ipad`)||e.includes(`ios`)?`ios`:`unknown`}function ek(e){return!Number.isFinite(e)||e<1e3?`lt1s`:e<3e3?`1-3s`:e<1e4?`3-10s`:e<3e4?`10-30s`:`gte30s`}function tk(e){return!Number.isFinite(e)||e<=0?`unknown`:e<=4?`1-4`:e<=8?`5-8`:e<=16?`9-16`:`gte17`}function nk(e){return!Number.isFinite(e)||e<=0?`unknown`:e<4?`lt4`:e<8?`4-7`:`gte8`}function rk(e){return!Number.isFinite(e)||e<=0?`unknown`:e<20?`lt20`:e<40?`20-40`:e<55?`40-55`:`gte55`}function ik(e){let t=String(e??``).toLowerCase();return t.trim()?/swiftshader|llvmpipe|softpipe|software|basic render driver/.test(t)?{gpu_vendor:`software`,gpu_class:`software`}:/nvidia|geforce|quadro|\brtx\b|\bgtx\b|tesla/.test(t)?{gpu_vendor:`nvidia`,gpu_class:`discrete`}:/\bamd\b|radeon|\bati\b/.test(t)?{gpu_vendor:`amd`,gpu_class:/radeon\(tm\) graphics|radeon graphics|vega \d+ graphics|\b(?:610|660|680|740|760|780|880|890)m\b/.test(t)?`integrated`:`discrete`}:/intel|iris|uhd graphics|hd graphics/.test(t)?{gpu_vendor:`intel`,gpu_class:/arc(?:\(tm\))? [ab]\d{3}/.test(t)?`discrete`:`integrated`}:/apple|\bm[1-9](?: pro| max| ultra)?\b/.test(t)?{gpu_vendor:`apple`,gpu_class:`integrated`}:/adreno|qualcomm/.test(t)?{gpu_vendor:`qualcomm`,gpu_class:`integrated`}:/\bmali\b|\barm\b|powervr/.test(t)?{gpu_vendor:`arm`,gpu_class:`integrated`}:{gpu_vendor:`other`,gpu_class:`unknown`}:{gpu_vendor:`unknown`,gpu_class:`unknown`}}var ak=/((?:https?|chrome-extension|moz-extension|safari-extension|safari-web-extension):\/\/[^\s()]+?):(\d+):(\d+)/g;function ok(e,t){if(typeof e!=`string`||!e)return`unknown`;if(/^(?:chrome|moz|safari|safari-web)-extension:/.test(e))return`extension`;try{return t&&new URL(e).origin===t?`app`:`external`}catch{return`unknown`}}function sk(e){try{let t=new URL(e).pathname.split(`/`).pop()??``;return _O.test(t)?t:null}catch{return null}}function ck(e){try{if(e===null||typeof e!=`object`&&typeof e!=`function`)return`non_error`;let t=typeof e.name==`string`?e.name:``;return t&&t!==`non_error`&&t!==`other`&&gO.error_type.has(t)?t:typeof DOMException<`u`&&e instanceof DOMException?`DOMException`:e instanceof Error?`other`:`non_error`}catch{return`other`}}function lk({error:e,filename:t,lineno:n,colno:r,kind:i=`error`}={},a=globalThis.location?.origin??``){let o={error_kind:i===`unhandled_rejection`?`unhandled_rejection`:`error`,error_type:ck(e),error_source:`unknown`},s=typeof t==`string`&&t?{url:t,line:n,col:r}:null;if(!s||ok(s.url,a)!==`app`){let t=``;try{t=typeof e?.stack==`string`?e.stack.slice(0,4e3):``}catch{t=``}let n=[...t.matchAll(ak)].map(e=>({url:e[1],line:Number(e[2]),col:Number(e[3])}));s=n.find(e=>ok(e.url,a)===`app`)??s??n[0]??null}if(!s||(o.error_source=ok(s.url,a),o.error_source!==`app`))return o;let c=sk(s.url);return c&&(o.error_file=c),Number.isInteger(s.line)&&s.line>=0&&(o.error_line=s.line),Number.isInteger(s.col)&&s.col>=0&&(o.error_col=s.col),o}function uk(e,t=Date.now()){let n=MO.get(e);if(!n)return!1;let r=n===FO&&t-IO<NO;return FO=n,IO=t,r||(PO[n]+=1),e===`pose_edit`&&Mk(`pose_edit`),!r}function dk(){return Object.fromEntries(Object.entries(PO).map(([e,t])=>[`${e}_edit_bucket`,XO(t)]))}function fk(e,t=`unknown`){try{if(e?.name===`AbortError`)return`aborted`;if(uO.has(e?.exportFailureCode))return e.exportFailureCode}catch{}return uO.has(t)?t:`unknown`}function pk(e,t={}){let n=!1,r=null,i=NaN,a=()=>performance.now(),o=Ak,s=()=>{try{return a()}catch{return NaN}},c=(e,t)=>{try{Promise.resolve(o(e,YO(e,t))).catch(()=>{})}catch{}};try{a=t.now??a,o=t.capture??o;let n=[...globalThis.crypto.getRandomValues(new Uint8Array(16))].map(e=>e.toString(16).padStart(2,`0`)).join(``);r={...YO(`export:attempt_started`,e),attempt_id:n},i=s(),c(`export:attempt_started`,r)}catch{r=null}let l=(e,t,a)=>{if(!n&&(n=!0,r))try{let n={...r,duration_bucket:ek(s()-i)};e===`failed`&&(n.failure_code=fk(t,a),n.failure_code===`aborted`&&(e=`cancelled`)),c(`export:attempt_${e}`,n)}catch{}};return{succeed(){l(`succeeded`)},fail(e,t=`unknown`){l(`failed`,e,t)}}}var mk=[`$current_url`,`$initial_current_url`,`$referrer`,`$initial_referrer`],hk=[`utm_source`,`utm_medium`,`utm_campaign`,`utm_content`,`utm_term`,`gad_source`,`mc_cid`,`gclid`,`gclsrc`,`dclid`,`gbraid`,`wbraid`,`fbclid`,`msclkid`,`twclid`,`li_fat_id`,`igshid`,`ttclid`,`rdt_cid`,`epik`,`qclid`,`sccid`,`irclid`,`_kx`,`ph_keyword`];function gk(e){return typeof e==`string`?e.split(`#`)[0].split(`?`)[0]:e}function _k(e){if(!e||typeof e!=`object`||!e.properties)return e;let t=[e.properties,e.properties.$set,e.properties.$set_once,e.$set,e.$set_once].filter(e=>e&&typeof e==`object`&&!Array.isArray(e));for(let e of t){for(let t of mk)typeof e[t]==`string`&&(e[t]=gk(e[t]));for(let t of hk)delete e[t],delete e[`$initial_${t}`];for(let t of Object.keys(e))t.startsWith(`$session_entry_`)&&delete e[t]}return e}function vk(e){return e?.activationTracked!==!0}function yk(){return SO?!0:wk()?.distribution===`npm`?wk()?.telemetryEnabled!==!0:UO(qD)===`1`}function bk(){try{let e=HO();if(!e)return;let t=[];for(let n=0;n<e.length;n+=1){let r=e.key(n);r&&r.startsWith(`ph_`)&&r.endsWith(`_posthog`)&&t.push(r)}for(let n of t)e.removeItem(n)}catch{}}async function xk(e){if(wk()?.distribution!==`npm`)return{ok:!0,enabled:e};try{let t=await fetch(`/__cozyclay/telemetry`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:e})});if(!t.ok)return{ok:!1,enabled:!e};let n=await t.json();return globalThis.__COZYCLAY_RUNTIME__=n,{ok:!0,enabled:n.telemetryEnabled===!0}}catch{return{ok:!1,enabled:!e}}}async function Sk(e){let t=e===!0,n=wk()?.distribution===`npm`;SO=t;let r=await xk(!t);if(SO=!1,!r.ok)return yk();let i=!r.enabled;if(WO(qD,i?`1`:`0`),i&&bk(),n&&!i)return globalThis.location?.reload(),!1;if(!yO&&!i&&await kk(),!yO)return i;try{i?(xO=!1,yO.opt_out_capturing()):(yO.opt_in_capturing(),xO=bO)}catch{xO=!1}return i}function Ck(){return{BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1,VITE_COZYCLAY_LIVE_PORT:`5184`}}function wk(){let e=globalThis.__COZYCLAY_RUNTIME__;return!e||typeof e!=`object`||Array.isArray(e)?null:e}function Tk(e){try{let t=new URL(e);return t.protocol===`http:`&&[`127.0.0.1`,`localhost`].includes(t.hostname)}catch{return!1}}function Ek({env:e=Ck(),origin:t=globalThis.location?.origin??``,runtime:n=wk()}={}){return e.PROD?n?.distribution===`npm`?n.telemetryEnabled===!0?Tk(t)?typeof n.apiKey!=`string`||n.apiKey.length===0?{kind:`disabled`,reason:`no key`}:typeof n.installationId!=`string`||!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n.installationId)?{kind:`disabled`,reason:`invalid anonymous identity`}:{kind:`enabled`,distribution:`npm`,apiKey:n.apiKey,apiHost:n.apiHost||`https://t.cozyclay.org`,appVersion:n.appVersion||null,installationId:n.installationId,firstLaunch:n.firstLaunch===!0,firstLaunchHeardFrom:sO.has(n.firstLaunchHeardFrom)?n.firstLaunchHeardFrom:null,installKind:[`npx`,`global`,`clone`].includes(n.installKind)?n.installKind:`npx`,originKind:`local`,internalQa:n.internalQa===!0,updateStatus:nO.includes(n.updateStatus)?n.updateStatus:`unknown`}:{kind:`disabled`,reason:`unapproved origin`}:{kind:`disabled`,reason:`opted out`}:e.VITE_POSTHOG_KEY?qO(t,KO(e.VITE_POSTHOG_ALLOWED_ORIGINS))?{kind:`enabled`,distribution:`hosted`,apiKey:e.VITE_POSTHOG_KEY,apiHost:e.VITE_POSTHOG_HOST||`https://us.i.posthog.com`,appVersion:e.VITE_APP_VERSION||null,installationId:null,firstLaunch:!1,firstLaunchHeardFrom:null,installKind:null,originKind:`hosted`,internalQa:UO(JD)===`1`,updateStatus:null}:{kind:`disabled`,reason:`unapproved origin`}:{kind:`disabled`,reason:`no key`}:{kind:`disabled`,reason:`not production`}}function Dk(e){return{distribution:e.distribution,...e.appVersion?{app_version:e.appVersion}:{},origin_kind:e.originKind,os:$O(),...e.installKind?{install_kind:e.installKind}:{},...e.updateStatus?{update_status:e.updateStatus}:{},internal_qa:e.internalQa}}function Ok(e){let t=Ek({env:e});return t.kind===`disabled`?t.reason:yk()?`opted out`:null}async function kk(){if(bO||CO)return CO;if(wk()?.distribution!==`npm`){let e=new URLSearchParams(globalThis.location?.search??``).getAll(`internal_qa`);e.length===1&&(e[0]===`1`||e[0]===`0`)&&WO(JD,e[0])}let e=Ck(),t=Ok(e);if(t){TO||=(console.info(`[analytics] disabled: `+t),!0);return}CO=(async()=>{try{let t=await qE(()=>import(`./module-MzlRiBjI.js`),[]);if(yk())return;let n=Ek({env:e});if(n.kind===`disabled`)return;yO=t.default??t,yO.init(n.apiKey,{api_host:n.apiHost,defaults:`2025-05-24`,autocapture:!1,capture_pageview:!1,capture_pageleave:!1,person_profiles:`never`,persistence:n.distribution===`npm`?`memory`:`localStorage`,respect_dnt:!0,disable_session_recording:!0,capture_dead_clicks:!1,capture_performance:!1,disable_capture_url_hashes:!0,save_campaign_params:!1,save_referrer:!1,mask_personal_data_properties:!0,request_batching:!1,advanced_disable_feature_flags:!0,disable_external_dependency_loading:!0,disable_surveys:!0,ui_host:`https://us.posthog.com`,bootstrap:n.installationId?{distinctID:n.installationId,isIdentifiedID:!1}:void 0,before_send:_k}),bO=!0,xO=!0;let r=Dk(n);if(yO.register(r),globalThis.__cozyclayAnalytics={instance:yO},yO.capture(`$pageview`),EO=Date.now(),Uk(n,r),Ik(),Hk(),n.distribution===`npm`&&(Ak(`app:session_started`),n.firstLaunch)){let e=n.firstLaunchHeardFrom;Ak(`install:first_launch`,e?{heard_from:e}:{})}}catch{console.info(`[analytics] initialization failed`)}})(),await CO}function Ak(e,t={}){if(!(!bO||!xO||!yO))try{if(yk())return;let n=YO(e,t);VO.has(e)||(DO+=1,(e===`scene:created`||e===`scene:loaded`)&&(OO+=1)),yO.capture(e,n)}catch{}}function jk(e,{hadTarget:t=!1}={}){return fO.includes(e?.stage)?{outcome:e.stage,rounds:e.round,...Number.isFinite(e.iou)?{final_iou:Math.round(e.iou*100)/100}:{},duration_ms:Math.round(e.elapsedMs),had_target:!!t}:null}function Mk(e){return!bO||!xO||!yO||!aO.has(e)||jO.has(e)?!1:(jO.add(e),Ak(`feature:used`,{name:e}),!0)}function Nk(){try{return bO&&xO&&!!yO&&!yk()}catch{return!1}}function Pk(){return Nk()&&UO(XD)!==`1`}function Fk(e,t){WO(XD,`1`),Ak(`survey:use_case`,{use_case:$D.includes(e)?e:`skip`,team:eO.includes(t)?t:`skip`})}function Ik(){if(zO||typeof window>`u`||typeof window.addEventListener!=`function`)return;zO=!0;let e=e=>{try{let t=lk(e),n=[t.error_kind,t.error_type,t.error_source,t.error_file,t.error_line,t.error_col].join(`|`);if(RO.has(n)||RO.size>=LO)return;RO.add(n),Ak(`app:error`,t)}catch{}};window.addEventListener(`error`,t=>{try{if(typeof t?.message==`string`&&t.message.startsWith(`ResizeObserver loop`)||!t?.error&&!t?.filename)return;e({error:t?.error,filename:t?.filename,lineno:t?.lineno,colno:t?.colno,kind:`error`})}catch{}}),window.addEventListener(`unhandledrejection`,t=>{e({error:t?.reason,kind:`unhandled_rejection`})})}function Lk(){try{let e=globalThis.document?.createElement?.(`canvas`);if(!e?.getContext)return{webgl:`none`,renderer:``};let t=e.getContext(`webgl2`),n=t?`webgl2`:`none`;if(t||(t=e.getContext(`webgl`),t&&(n=`webgl1`)),!t)return{webgl:n,renderer:``};let r=``;try{let e=t.getExtension(`WEBGL_debug_renderer_info`);r=String(t.getParameter(e?e.UNMASKED_RENDERER_WEBGL:t.RENDERER)??``)}catch{r=``}try{t.getExtension(`WEBGL_lose_context`)?.loseContext()}catch{}return{webgl:n,renderer:r}}catch{return{webgl:`none`,renderer:``}}}var Rk=8e3,zk=3e3,Bk=6e4;function Vk(){return new Promise(e=>{let t=globalThis.requestAnimationFrame;if(typeof t!=`function`){e(null);return}let n=()=>globalThis.document?.visibilityState===`hidden`,r=Date.now(),i=()=>{if(Date.now()-r>Bk){e(null);return}if(n()){setTimeout(i,2e3);return}let a=0,o=0,s=r=>{if(n()){setTimeout(i,2e3);return}if(o||=r,a+=1,r-o>=zk){e((a-1)*1e3/(r-o));return}t(s)};t(s)};setTimeout(i,Rk)})}async function Hk(){if(!(BO||globalThis.document===void 0||typeof globalThis.requestAnimationFrame!=`function`)){BO=!0;try{let{webgl:e,renderer:t}=Lk(),n=ik(t),r=await Vk();Ak(`device:profile`,{...n,webgl:e,cpu_bucket:tk(globalThis.navigator?.hardwareConcurrency),memory_bucket:nk(globalThis.navigator?.deviceMemory),frame_rate_bucket:rk(r)})}catch{}}}function Uk(e,t){if(AO||typeof window>`u`)return;AO=!0;let n=()=>{if(!(kO||!EO)){kO=!0;try{if(!xO||!yO||yk()||yO.has_opted_out_capturing())return;let n={api_key:e.apiKey,event:`app:session_ended`,properties:{...t,distinct_id:yO.get_distinct_id(),duration_bucket:ZO(Date.now()-EO),action_count_bucket:XO(DO),scenes_touched:Math.min(20,OO),...dk()}},r=JSON.stringify(n),i=`${e.apiHost.replace(/\/$/,``)}/e/`;typeof globalThis.navigator?.sendBeacon==`function`?globalThis.navigator.sendBeacon(i,new Blob([r],{type:`application/json`})):fetch(i,{method:`POST`,body:r,keepalive:!0,headers:{"content-type":`application/json`}})}catch{}}};window.addEventListener(`pagehide`,n,{once:!0}),window.addEventListener(`beforeunload`,n,{once:!0})}function Wk(e){if(!(!bO||!xO||wO)){if(!vk({activationTracked:UO(YD)===`1`})){wO=!0;return}wO=!0,WO(YD,`1`),Ak(`activation:completed`,{activation_path:e})}}function Gk(e){let t=Array.from(e?.files??[]).find(e=>e.type.startsWith(`image/`));if(t)return t;for(let t of Array.from(e?.items??[]))if(t.kind===`file`&&t.type.startsWith(`image/`)){let e=t.getAsFile?.();if(e)return e}return null}async function Kk(e){let t=new Uint8Array(await e.arrayBuffer()),n=``;for(let e=0;e<t.length;e+=32768)n+=String.fromCharCode.apply(null,t.subarray(e,e+32768));return`data:${e.type||`image/png`};base64,${btoa(n)}`}function qk(e,t){return{fileName:e.name&&e.name!==`image.png`?e.name:`pasted-${new Date().toISOString().slice(0,19).replace(/[:T]/g,`-`)}.png`,mimeType:e.type||`image/png`,fileUrl:t,image_url:t,localPreview:!0,outputs:[{value:t}]}}function Jk(e,t){return Gk(t)?!e||typeof e.matches!=`function`||!(e.isContentEditable||e.matches(`[contenteditable=true]`)):!1}var Yk=new Set([`mp4`,`m4v`,`mov`,`webm`,`ogv`,`mkv`]),Xk=9,Zk=3,Qk=480,$k=.85;function eA(e){let t=String(e?.type??``).toLowerCase();if(t)return t.startsWith(`video/`);let n=String(e?.name??``).toLowerCase().match(/\.([a-z0-9]+)$/)?.[1];return Yk.has(n)}function tA(e,t){return Array.from({length:t},(n,r)=>(r+.5)*e/t)}function nA(e){let t=Math.floor(e/60);return`${t}:${(e-t*60).toFixed(1).padStart(4,`0`)}`}function rA(e,t){return new Promise((n,r)=>{let i=()=>{e.removeEventListener(t,i),e.removeEventListener(`error`,a),n()},a=()=>{e.removeEventListener(t,i),e.removeEventListener(`error`,a),r(Error(`this browser cannot decode that video`))};e.addEventListener(t,i),e.addEventListener(`error`,a)})}async function iA(e,{doc:t=globalThis.document,frames:n=Xk}={}){let r=URL.createObjectURL(e),i=t.createElement(`video`);i.muted=!0,i.playsInline=!0,i.preload=`auto`;try{let a=rA(i,`loadeddata`);i.src=r,await a;let{duration:o,videoWidth:s,videoHeight:c}=i;if(!Number.isFinite(o)||o<=0||!s||!c)throw Error(`that video has no usable length or size`);let l=Math.min(Qk,s),u=Math.round(l*c/s),d=t.createElement(`canvas`);d.width=l*Zk,d.height=u*Math.ceil(n/Zk);let f=d.getContext(`2d`);if(!f)throw Error(`this browser cannot draw video frames — no 2D context`);f.fillStyle=`#000`,f.fillRect(0,0,d.width,d.height),f.font=`600 ${Math.max(12,Math.round(u/12))}px system-ui, sans-serif`,f.textBaseline=`top`;for(let[e,t]of tA(o,n).entries()){let n=rA(i,`seeked`);i.currentTime=t,await n;let r=e%Zk*l,a=Math.floor(e/Zk)*u;f.drawImage(i,r,a,l,u);let o=`${e+1} · ${nA(t)}`,s=f.measureText(o).width+12;f.fillStyle=`rgba(0, 0, 0, 0.6)`,f.fillRect(r+4,a+4,s,Math.round(u/12)+12),f.fillStyle=`#fff`,f.fillText(o,r+4+6,a+4+6)}return{blob:await new Promise((e,t)=>d.toBlob(n=>n?e(n):t(Error(`the contact sheet could not be encoded`)),`image/jpeg`,$k)),name:`${(String(e?.name??``).trim()||`video`).slice(0,70)} (${n} frames over ${o.toFixed(1)}s)`}}finally{i.removeAttribute(`src`),i.load(),URL.revokeObjectURL(r)}}var aA=1600,oA=4194304,sA=.85,cA=Object.freeze([`image/png`,`image/jpeg`,`image/webp`]),lA=`Up to 4 images per message`,uA=`Attach a PNG, JPEG or WebP image, or a video`,dA=`That image or video could not be attached`,fA=[...cA,`video/*`].join(`,`),pA={png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,webp:`image/webp`};function mA(e){let t=String(e?.type??``).toLowerCase();return cA.includes(t)?t:t?null:pA[String(e?.name??``).toLowerCase().match(/\.([a-z0-9]+)$/)?.[1]]??null}function hA(e){return Array.from(e?.types??[]).includes(`Files`)}function gA(e){let t=Array.from(e?.files??[]);if(!t.length){let n=Gk(e);n&&t.push(n)}let n=[],r=0;for(let e of t)mA(e)||eA(e)?n.push(e):String(e?.type??``).startsWith(`image/`)&&(r+=1);return{images:n,unsupported:r}}function _A(e){let t=String(e??``).slice(String(e??``).indexOf(`,`)+1);if(!t)return 0;let n=t.endsWith(`==`)?2:+!!t.endsWith(`=`);return Math.max(0,Math.floor(t.length*3/4)-n)}function vA(e,t,n=aA){let r=Math.max(e,t);if(!Number.isFinite(r)||r<=0)return null;if(r<=n)return{width:Math.round(e),height:Math.round(t),scaled:!1};let i=n/r;return{width:Math.max(1,Math.round(e*i)),height:Math.max(1,Math.round(t*i)),scaled:!0}}function yA(e=[],t=[],n=4){let r=Math.max(0,n-e.length);return{attachments:[...e,...t.slice(0,r)],rejected:Math.max(0,t.length-r)}}var bA=32768,xA=e=>{let t=``;for(let n=0;n<e.length;n+=bA)t+=String.fromCharCode.apply(null,e.subarray(n,n+bA));return btoa(t)};async function SA(e,t){let n=new Uint8Array(await e.arrayBuffer());return`data:${t||e.type||`image/jpeg`};base64,${xA(n)}`}function CA(e,t){if(typeof OffscreenCanvas==`function`)return new OffscreenCanvas(e,t);throw Error(`this browser cannot resize images — OffscreenCanvas is unavailable`)}function wA(e){let t=e.indexOf(`,`),n=e.slice(5,e.indexOf(`;`)),r=atob(e.slice(t+1)),i=new Uint8Array(r.length);for(let e=0;e<r.length;e+=1)i[e]=r.charCodeAt(e);return new Blob([i],{type:n})}async function TA(e,{decode:t=globalThis.createImageBitmap,makeCanvas:n=CA,toBlob:r=wA,maxBytes:i=oA,maxDimension:a=aA,quality:o=sA}={}){if(_A(e)<=i)return e;if(typeof t!=`function`)throw Error(`this browser cannot decode images — createImageBitmap is unavailable`);let s=await t(r(e));try{let e=vA(s.width,s.height,a);if(!e)throw Error(`that image has no usable size`);let t=n(e.width,e.height),r=t.getContext(`2d`);if(!r)throw Error(`this browser cannot resize images — no 2D context`);return r.drawImage(s,0,0,e.width,e.height),await SA(await t.convertToBlob({type:`image/jpeg`,quality:o}),`image/jpeg`)}finally{s?.close?.()}}function EA(e){let t=String(e?.name??``).trim();return!t||t===`image.png`?`pasted-image.png`:t.slice(0,120)}async function DA(e,t={}){if(eA(e)){let t=await iA(e);return{dataUrl:await SA(t.blob,`image/jpeg`),name:t.name}}let{readDataUrl:n=Kk,...r}=t,i=mA(e)??`image/png`,a=await n(e);return{dataUrl:await TA(a.startsWith(`data:${i};`)?a:`data:${i};${a.slice(a.indexOf(`;`)+1)}`,r),name:EA(e)}}var OA=new Set([`aborted`,`capture_failed`,`generation_failed`,`unknown`]),kA=new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`]);function AA(){try{if(!globalThis.crypto?.getRandomValues)return null;let e=new Uint8Array(16);return globalThis.crypto.getRandomValues(e),[...e].map(e=>e.toString(16).padStart(2,`0`)).join(``)}catch{return null}}function jA(e,t,n){try{Promise.resolve(e(t,n)).catch(()=>{})}catch{}}function MA(e){try{return e()}catch{return NaN}}function NA(e,t,n=`unknown`){let r=t===`agent`?kA:OA;try{if(e?.name===`AbortError`)return`aborted`}catch{}return r.has(n)?n:`unknown`}function PA(e,{capture:t=Ak,now:n=()=>performance.now(),durationBucket:r=ek}={}){let i=AA(),a=!1,o=!1,s=MA(n),c=(e,n)=>{i&&jA(t,e,n)};c(`workflow:run_requested`,{surface:`workflow`,...GD.node_count_bucket.has(e.node_count_bucket)?{node_count_bucket:e.node_count_bucket}:{},run_id:i});let l=(e,t,o)=>{if(a||!i)return;a=!0;let l=NA(t,`workflow`,o),u=e===`failed`&&l===`aborted`?`cancelled`:e,d=`lt1s`;try{let e=r(MA(n)-s);GD.duration_bucket.has(e)&&(d=e)}catch{}c(`workflow:run_${u}`,{run_id:i,duration_bucket:d,...u===`succeeded`?{}:{failure_code:l}})};return{runId:i,succeed(){l(`succeeded`)},fail(e,t=`unknown`){l(`failed`,e,t)},apply(){o||!i||(o=!0,c(`workflow:result_applied`,{run_id:i}))}}}var FA=`follow the reference clip's framing and camera motion exactly`,IA=`clay previs, neutral look`,LA=`motion and blocking come from the reference; keep timing`;function RA(e){if(!Number.isFinite(e)||e<=0)return`normal`;let t=18/Math.tan(e*Math.PI/360);return t<=20?`wide`:t<=40?`normal`:`long`}function zA(e){return`${Number(e.toFixed(2))}s`}function BA(e){let t=[];return e?.dolly&&t.push(`smooth dolly move`),e?.crane&&t.push(`gentle crane move`),e?.rail&&t.push(`sliding rail move`),t.length>0?t.join(`; `):`locked-off camera, no move`}var VA=[`front`,`front right`,`right`,`back right`,`back`,`back left`,`left`,`front left`];function HA(e){if(!Number.isFinite(e))return``;let t=(e%360+360)%360;return VA[Math.round(t/45)%8]}function UA(e){return Number.isFinite(e)?e>=50?`high`:e<=10?`low`:`level`:``}function WA(e){return Number.isFinite(e)?e>=.8?`strong`:e>=.35?`moderate`:`dim`:`moderate`}function GA(e){return e?`${[UA(e.elevationDeg),HA(e.azimuthDeg)].filter(Boolean).join(` `)||`even`} key light, ${WA(e.intensity)}`:`no key light, ambient fill`}function KA(e,t={}){let n=t.target===`video`?`video`:`image`,r=t.referenceOwnsCamera!==!1,i=Math.max(0,(e.frameRange?.end??0)-(e.frameRange?.start??0)+1)/(e.fps||24),a=typeof e.intent==`string`?e.intent.trim():``,o=[`SHOT: ${e.shotTitle||`untitled shot`}, ${zA(i)}, ${e.aspect||``}`.trimEnd(),`LENS: ${e.focalMm}mm, ${RA(e.fovDeg)} shot`,r?`CAMERA: ${FA}`:`CAMERA: ${BA(e.cameraMove)}`,`LIGHT: ${GA(e.keyLight)}`,`CAST: ${(e.cast||[]).map(e=>e.name).join(`, `)||`none`}`,`LOOK: ${a||IA}`];return n===`video`&&o.push(`MOTION: ${LA}`),o.join(`
11
- `)}var qA=``;function JA(e){return`${qA}${e}`}async function YA(e,t,n){let r=await e(JA(t),{headers:{"content-type":`application/json`},...n});if(!r.ok){let e=null;try{e=await r.clone().json()}catch{}let n=typeof e?.error==`string`?e.error:e?.error?.message,i=Error(n||`${t} responded ${r.status}`);throw i.status=r.status,e?.error&&typeof e.error==`object`&&Object.assign(i,e.error),e?.preservation&&typeof e.preservation==`object`&&(i.preservation=e.preservation),i}return r.json()}function XA({prompt:e,imageDataUrl:t,referenceDataUrl:n,references:r,composition:i,quality:a=`auto`,size:o}){return{prompt:e,imageDataUrl:t,...n?{referenceDataUrl:n}:{},...Array.isArray(r)&&r.length?{references:r}:{},...i?{composition:i}:{},quality:a,...o?{size:o}:{}}}function ZA(e,{fetchImpl:t=globalThis.fetch?.bind(globalThis),signal:n}={}){return YA(t,`/agent/image`,{method:`POST`,body:JSON.stringify(XA(e)),signal:n})}var QA=`Use the first image (a clay blocking frame) as the layout: keep its composition and camera angle, and keep the pose but make it look natural. Render it as:`;function $A({meta:e,caption:t,imageDataUrl:n}){let r=typeof t==`string`?t.trim():``;return{prompt:`${QA}\n${KA(e,{target:`image`})}${r?`\n${r}`:``}`,imageDataUrl:n,quality:`auto`}}function ej(e){if(e?.code===`entitlement`)return B(`This account cannot generate images.`,`이 계정은 이미지를 생성할 수 없어요.`);if(e?.status===401||e?.code===`auth`)return B(`Sign in with ChatGPT in the Agent panel first.`,`먼저 Agent 패널에서 ChatGPT로 로그인하세요.`);let t=e?.message||B(`unknown error`,`알 수 없는 오류`);return B(`Stylize failed — ${t}`,`스타일화 실패 — ${t}`)}function tj(e,t){let n=typeof e==`string`?/^data:image\/png;base64,(.*)$/s.exec(e):null;if(!n)throw Error(B(`The image route did not return a PNG.`,`이미지 경로가 PNG를 돌려주지 않았어요.`));let r=atob(n[1]);if(r.length>t){let e=Math.round(t/1048576);throw Error(B(`The stylized image is larger than ${e} MB, so it was not added.`,`스타일화된 이미지가 ${e} MB보다 커서 추가하지 않았어요.`))}let i=new Uint8Array(r.length);for(let e=0;e<r.length;e+=1)i[e]=r.charCodeAt(e);return i}var nj=140,rj=(e,t=nj)=>{let n=String(e??``).replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t-1)}…`:n},ij=e=>{let t=String(e).replace(/([a-z])([A-Z])/g,`$1 $2`).split(/[._\s-]+/).filter(Boolean).join(` `).toLowerCase();return t?t[0].toUpperCase()+t.slice(1):`Editor action`},aj=e=>new Map((e?.actionIndex??[]).filter(e=>e?.id&&e.label).map(e=>[e.id,e.label]));function oj(e,t){let n=[...String(e??``).matchAll(/tools\.(\w+)\(\s*\{?\s*(?:action\s*:\s*["'`]([\w.]+)["'`])?/g)].map(([,e,n])=>n?t?.get(n)??ij(n):Xe[e]??ij(e)),r=[...new Set(n)];return r.length>3?`${r.slice(0,3).join(`, `)}…`:r.join(`, `)}function sj(e,t,n){let r=e===`run_action`&&typeof t?.action==`string`?t.action:null,i=r?t.args:t,a=e===`script`?/^\s*\/\/\s*(.+)/.exec(String(t?.code??``))?.[1]??oj(t?.code,n):i?.spec?.label??i?.caption??i?.label??(r?null:i?.visual&&i.visual!==`none`?i.visual.replace(`_`,` `):null);return{...r?{action:r,actionLabel:n?.get(r)??ij(r)}:{},...a?{subject:rj(a,80)}:{}}}function cj(e,t={}){return e.kind===`compose`||e.kind===`tool`?e.actionLabel?e.actionLabel:e.action?ij(e.action):e.name===`script`?B(`Script`,`스크립트`):Object.hasOwn(t,e.name)?t[e.name]:e.label||ij(e.name||`tool`):``}function lj(e,t){let n=[],r=e?.checks?.framing?.derivedSize;return r&&n.push(r),e?.geometry?.axisConsistent===!1&&n.push(B(`cameras cross the line`,`카메라가 축을 넘음`)),e?.verification?.status&&n.push(e.verification.status===`verified`?B(`motion checked`,`모션 확인`):B(`motion unverified`,`모션 미확인`)),e?.visualStatus===`attached`&&n.push(t?.visual===`contact_sheet`?B(`looked at a contact sheet`,`컨택트 시트 확인`):B(`looked at the frame`,`화면 확인`)),e?.stale&&n.push(B(`stale evidence`,`이전 상태 기준`)),n.join(` · `)}function uj(e){if(e.kind!==`tool`)return``;if(e.status===`failed`)return rj(String(e.error??e.failure?.message??B(`Failed`,`실패`)).replace(/^Error:\s*/,``));if(e.status===`cancelled`)return e.result?.status===`not_applied`?B(`not applied`,`적용 안 됨`):B(`result unknown`,`결과 불명`);let t=e.result;if(!t||typeof t!=`object`)return``;if(e.name===`script`){let e=Array.isArray(t.calls)?t.calls:[],n=e.filter(e=>e?.ok===!1),r=B(`${e.length} call${e.length===1?``:`s`}`,`호출 ${e.length}회`);return t.ok===!1?rj(`${r} · ${t.error?.message??B(`failed`,`실패`)}${t.rollback?B(` · its edits were rolled back`,` · 편집 되돌림`):``}`):rj(n.length?`${r} · ${B(`${n.length} refused`,`${n.length}회 거부`)}: ${n[0].code??n[0].message??``}`:r)}return e.name===`verify_result`?rj(lj(t,e.args)):typeof t.summary==`string`&&t.summary?rj(t.summary.replace(/\.$/,``)):t.status===`started`?B(`started`,`시작됨`):``}function dj(e){let t=e.progress;if(!t)return``;let n=t.label??(t.action?ij(t.action):ij(t.name??`call`));return B(`${n} (call ${t.index})`,`${n} (${t.index}번째 호출)`)}function fj(e){let t=String(e??``).split(/\n+/).map(e=>e.replace(/^[#*\s-]+|\*+$/g,``).trim()).filter(Boolean),n=t.at(-1)??``;return rj(n.length<24&&t.length>1?t.at(-2):n)}function pj(e,t,n,r){let i=e.at(-1);return i?.kind===`thinking`?[...e.slice(0,-1),{...i,text:i.text+t,updatedAt:n}]:[...e,{kind:`thinking`,id:r(),text:t,startedAt:n,updatedAt:n}]}var mj=(e,t)=>e.at(-1)?.kind===`thinking`&&!e.at(-1).endedAt?[...e.slice(0,-1),{...e.at(-1),endedAt:t}]:e;function hj(e,t,n,r,i){let a=mj(e,n),o=Number.isInteger(t.index)?t.index:0,s=a.findLastIndex(e=>e.kind===`compose`&&e.index===o),c={name:t.name,...t.action?{action:t.action,actionLabel:i?.get(t.action)??ij(t.action)}:{},...t.subject?{subject:rj(t.subject,80)}:{}};return s!==-1&&a[s].name===t.name?a.map((e,t)=>t===s?{...e,...c}:e):[...a,{kind:`compose`,id:r(),index:o,startedAt:n,...c}]}function gj(e,t){let n=mj(e,t.startedAt),r=n.findIndex(e=>e.kind===`compose`&&e.name===t.name);return r===-1?[...n,t]:n.map((e,n)=>n===r?{...t,subject:t.subject??e.subject}:e)}var _j=(e,t,n)=>[...e.filter(e=>e.kind!==`compose`).map(e=>e.kind===`tool`&&e.status===`running`?{...e,status:`cancelled`}:e),{kind:`turn-end`,id:n(),...t}],vj=new Set([`tool`,`thinking`,`compose`]);function yj(e,{streaming:t=!1}={}){let n=[];for(let t of e)(t.kind===`user`&&!t.steered||!n.length)&&n.push([]),n.at(-1).push(t);let r=[];return n.forEach((e,i)=>{let a=e.findLastIndex(e=>vj.has(e.kind)),o=e.find(e=>e.kind===`turn-end`)??null,s=i===n.length-1,c=null;e.forEach((e,n)=>{if(e.kind!==`turn-end`){if(!(vj.has(e.kind)||e.kind===`assistant`&&n<a&&c)){r.push({type:`item`,item:e});return}c||(c={type:`steps`,id:`steps:${e.id}`,steps:[],end:o,live:s&&t,last:s},r.push(c)),c.steps.push(e.kind===`assistant`?{...e,kind:`narration`}:e)}})}),r}function bj(e,t,n){let r=e.steps.filter(e=>e.kind===`tool`).length,i=r?` · ${B(`${r} step${r===1?``:`s`}`,`${r}단계`)}`:``;if(e.live){let r=e.steps[0]?.startedAt;return{tone:`busy`,text:`${B(`Working`,`작업 중`)}${i}${Number.isFinite(r)?` · ${n(t-r)}`:``}`}}let a=e.end,o=a&&Number.isFinite(a.durationMs)?` · ${n(a.durationMs)}`:``;return a?.status===`stopped`?{tone:`warn`,text:`${B(`Stopped`,`중지됨`)}${i}${o}`}:a?.status===`failed`?{tone:`alert`,text:`${B(`Failed`,`실패`)}${i}${o}`}:{tone:`ok`,text:`${B(`Done`,`완료`)}${i}${o}`}}function xj(e,t){let n=new Map([...t?.entityIndex??[],...t?.shots??[]].filter(e=>e?.id&&e.name).map(e=>[e.id,e.name])),r=[...new Set(e.map(e=>n.get(e)).filter(Boolean))],i=e.filter(e=>!n.has(e)).length;if(!r.length&&!i)return B(`Changed the scene`,`장면을 바꿈`);let a=r.slice(0,4).join(`, `),o=Math.max(0,r.length-4)+i;return B(`Changed ${a||`the scene`}${o>0?` and ${o} more`:``}`,`${a||`장면`}${o>0?` 외 ${o}개`:``} 변경`)}function Sj(e){return e.steps.some(e=>e.result?.authored===!0||(e.result?.calls??[]).some(e=>e?.revision&&e.revision.after!==e.revision.before))?B(`Stopped by you. What already ran stays in the scene; Cmd+Z undoes this turn.`,`직접 중지했어요. 이미 실행된 편집은 장면에 남아 있고, Cmd+Z로 이번 턴을 되돌릴 수 있어요.`):e.steps.some(e=>e.kind===`tool`&&e.status===`cancelled`)?B(`Stopped by you while a step was running; its result is unknown.`,`단계 실행 중에 직접 중지했어요. 그 단계의 결과는 알 수 없어요.`):B(`Stopped by you before anything changed in the scene.`,`장면이 바뀌기 전에 직접 중지했어요.`)}var Cj=`cozyclay.workflow.agentPanel.width`,wj=1100,Tj=`cozyclay.agent.session.studio`,Ej=[`signed-out`,`signing-in`,`no-entitlement`,`ready`,`streaming`,`rate-limited`,`error`];function Dj(e=globalThis.crypto){let t=e?.randomUUID?.();if(typeof t==`string`)return t;let n=new Uint8Array(16);e.getRandomValues(n),n[6]=n[6]&15|64,n[8]=n[8]&63|128;let r=[...n].map(e=>e.toString(16).padStart(2,`0`)).join(``);return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}var Oj={queued:`Queued`,generating:`Generating`,preparing:`Preparing`,verifying:`Verifying`,repairing:`Repairing`,committing:`Installing`,reconciling:`Reconciling`,installed:`Installed`,review_required:`Needs review`,failed:`Failed`,cancelled:`Stopped`,stale_target:`Target changed`,stale_environment:`Scene changed`},kj=new Set([`installed`,`failed`,`cancelled`,`stale_target`,`stale_environment`]),Aj=e=>kj.has(e),jj=e=>e===`installed`?`ok`:e===`review_required`?`warn`:Aj(e)?`alert`:`busy`,Mj=e=>Number.isFinite(e)?`${Math.round(e*100)}%`:``;function Nj(e,t=null){if(e?.status===`installed`){let{installed:t,verification:n}=e,r=n.status===`verified`?`verified over ${n.evaluatedFrames} frames`:`installed unverified`;return`Installed ${t.durationSeconds}s of motion on ${t.characterId} — ${r}`}return e?.status===`undone`?`Undid ${e.undoneReceiptId}`:e?.status===`noop`?`Nothing to change`:e?.status===`transient`?`Changed the view only`:t?xj(e?.affectedIds??[],t):`Applied to ${e?.affectedIds?.join(`, `)||`the scene`}`}function Pj(e){let t=Array.isArray(e?.efforts)?e.efforts:[];if(!t.length)return[];let n=e.defaultEffort&&t.includes(e.defaultEffort)?e.defaultEffort:t[0];return[n,...t.filter(e=>e!==n)]}var Fj=[`Block a two-shot conversation in this scene`,`Render this frame as a storyboard panel`,`Suggest a camera move for the current shot`],Ij=[B(`Block a two-shot`,`투샷 블로킹`),B(`Frame the selected character`,`선택한 캐릭터 구도 잡기`),B(`Light the set warmer`,`세트 조명 더 따뜻하게`)],Lj=`Image generation uses about 3-5x a normal turn`,Rj={describe_workflow:`Read canvas`,add_workflow_node:`Add node`,update_workflow_node:`Edit node`,remove_workflow_node:`Remove node`,connect_workflow_nodes:`Connect nodes`,disconnect_workflow_nodes:`Disconnect nodes`,run_workflow:`Run workflow`,set_workflow_node_output:`Set node output`,focus_workflow_node:`Focus node`,add_reference_node:`Add reference image`},zj={inspect_studio:B(`Read the scene`,`장면 읽기`),operate_studio:B(`Selection and view`,`선택과 뷰`),arrange_objects:B(`Arrange objects`,`오브젝트 배치`),arrange_characters:B(`Arrange characters`,`캐릭터 배치`),patch_elements:B(`Edit properties`,`속성 편집`),frame_shot:B(`Frame the shot`,`샷 구도 잡기`),generate_motion:B(`Generate motion`,`모션 생성`),verify_result:B(`Verify the result`,`결과 검증`),undo_edit:B(`Undo an edit`,`편집 되돌리기`),run_action:B(`Run an editor action`,`편집기 동작 실행`)},Bj=Object.freeze({workflow:Object.freeze({toolLabels:Rj,toolBadge:`Canvas`,suggestions:Fj,imageHint:Lj,imageEntitlement:!0,steer:!0,history:!0,persistWidth:!0,emptyTitle:`Direct the scene`,emptyHint:e=>`Ask for blocking, a camera move, or a rendered frame from \u201C${e}\u201D.`,composerPlaceholder:`Ask the agent to block, frame or render…`}),studio:Object.freeze({toolLabels:zj,toolBadge:B(`Scene`,`장면`),suggestions:Ij,imageHint:null,imageEntitlement:!1,steer:!1,history:!0,persistWidth:!1,emptyTitle:B(`Direct the scene`,`장면을 연출하세요`),emptyHint:e=>B(`Ask for blocking, a camera move, or a motion take in \u201C${e}\u201D.`,`\u201C${e}\u201D\uC5D0\uC11C \uBE14\uB85C\uD0B9, \uCE74\uBA54\uB77C \uC6C0\uC9C1\uC784, \uBAA8\uC158 \uD14C\uC774\uD06C\uB97C \uC694\uCCAD\uD558\uC138\uC694.`),composerPlaceholder:B(`Ask the agent to block, frame or animate…`,`블로킹·구도·모션을 요청하세요…`)})});function Vj(e){return Object.hasOwn(Bj,e)?Bj[e]:Bj.workflow}function Hj(e){let t=Number(e);return Number.isFinite(t)?Math.min(560,Math.max(300,Math.round(t))):360}function Uj(e=globalThis.localStorage){try{let t=e?.getItem(Cj);return t==null||t===``?360:Hj(t)}catch{return 360}}function Wj(e,t=globalThis.localStorage){try{t?.setItem(Cj,String(Hj(e)))}catch{}}var Gj=`cozyclay.agent.model`;function Kj(e=globalThis.localStorage){try{let t=e?.getItem(Gj);return typeof t==`string`&&t?t:null}catch{return null}}function qj(e,t=globalThis.localStorage){try{typeof e==`string`&&e&&t?.setItem(Gj,e)}catch{}}function Jj(e,t=Kj()){let n=Array.isArray(e)?e:[];return n.some(e=>e?.id===t)?t:n[0]?.id??``}function Yj(e,t){if(!e.length)return!0;let n=e.find(e=>e.models?.some(e=>e.key===t));return!n||n.signedIn}function Xj(e,t,n){return n&&t.some(e=>e.id===n)&&Yj(e,n)?n:Jj(t.filter(t=>Yj(e,t.id)))}function Zj(e,t){let n=e&&typeof e==`object`&&typeof t==`string`?e[t]:null;return n&&[`helper`,`vision`,`advisor`].every(e=>typeof n[e]==`string`&&n[e])?n:null}function Qj(e){let t=String(e??``);return t.slice(t.indexOf(`/`)+1)}function $j(e,t=Date.now()){if(!e)return null;let n=typeof e==`number`?e:Date.parse(e);if(!Number.isFinite(n))return null;let r=Math.max(0,n-t),i=Math.round(r/1e3),a=Math.floor(i/3600),o=Math.floor(i%3600/60),s=i%60;return a>0?`${a}h ${String(o).padStart(2,`0`)}m`:o>0?`${o}m ${String(s).padStart(2,`0`)}s`:`${s}s`}var eM={capture_blocking_frame:{verb:`Capture`,target:`blocking frame`},render_from_frame:{verb:`Render`,target:`from frame`},place_image_in_scene:{verb:`Place`,target:`image in scene`}};function tM(e){if(e?.label)return e.label;let t=eM[e?.name];if(t)return`${t.verb} ${t.target}`;let n=String(e?.name||`tool`).split(/[_\-\s]+/).filter(Boolean);if(!n.length)return`Run tool`;let r=n[0][0].toUpperCase()+n[0].slice(1);return n.length>1?`${r} ${n.slice(1).join(` `)}`:r}var nM={STEER_UNSUPPORTED:`This surface cannot steer a running turn.`,NO_ACTIVE_TURN:`That turn already ended — send it as a new message.`},rM=/^(TARGET_NOT_READY|CAPABILITY_MISSING|CONFIRMATION_REQUIRED):/;function iM(e){let t=Array.isArray(e?.issues)?e.issues:[],n=(Array.isArray(e?.fixes)?e.fixes:[]).filter(e=>typeof e?.action==`string`&&e.args&&typeof e.args==`object`),r=new Set(n.map(e=>e.issueIndex)),i=t.filter((e,t)=>(e?.severity===`blocker`||e?.severity===`concern`)&&!r.has(t)),a=e=>`- [${e.severity}] ${e.text}${e.evidence?` (${e.evidence})`:``}`;return n.length?[B(`Supervisor review — apply these fixes exactly, in order, in ONE script call, then verify_result; do not re-derive them:`,`감독 검토 — 아래 수정을 유추 없이 순서대로 script 1회로 실행하고 verify_result로 확인해 주세요:`),...n.map(e=>`- [${e.severity}] ${t[e.issueIndex]?.text??``} -> run_action ${JSON.stringify({action:e.action,args:e.args})}`),...i.length?[B(`Also check:`,`추가 확인:`),...i.map(a)]:[]].join(`
12
- `):i.length?[B(`Supervisor review — please address:`,`감독 검토 — 다음을 고쳐 주세요:`),...i.map(a)].join(`
13
- `):null}var aM={auth:`Your session expired. Sign in again to continue.`,entitlement:`This account cannot generate images.`,rate_limit:`You have hit the usage limit for this window.`,upstream:`The model service failed to answer.`,overloaded:`The model service is overloaded right now. Try again in a moment.`},oM=`Ready`,sM={auth:`session expired`,entitlement:`not on this plan`,rate_limit:`usage limit reached`,rate_limited:`usage limit reached`,overloaded:`service overloaded`,no_output:`no response`};function cM(e){if(!e)return`unknown error`;let t=sM[e.code];if(t)return t;let n=String(e.message??``).trim();return n?n.length>64?`${n.slice(0,63)}…`:n:String(e.code||`unknown error`)}function lM(e){let t=Number.isFinite(e)&&e>0?Math.floor(e/1e3):0;return t<60?`${t} s`:`${Math.floor(t/60)} m ${String(t%60).padStart(2,`0`)} s`}var uM=(e,t,n,r=``)=>({phase:e,kind:`live`,tone:`busy`,text:`${t} · ${lM(n)}`,ticking:!0,...r?{detail:r}:{}});function dM(e,{now:t=Date.now(),toolLabel:n=tM}={}){let r=e?.items??[],i=r.find(e=>e.kind===`image`&&e.apply?.status===`applying`);if(i)return uM(`editor`,`Waiting for the editor…`,t-(i.apply.startedAt??t));if(e?.streaming){let i=t-(e.turnStartedAt??t),a=r.findLast(e=>e.kind===`job`&&!Aj(e.state));if(a){let e=Mj(a.progress);return uM(`job`,`${Oj[a.state]||a.state} motion${e?` ${e}`:``}`,i)}let o=r.findLast(e=>e.kind===`tool`&&e.status===`running`);if(o)return uM(`tool`,`Running ${n(o)}…`,i,o.progress?dj(o):o.subject);let s=r.at(-1);return s?.kind===`compose`?uM(`compose`,`Preparing ${n(s)}…`,i,s.subject):s?.kind===`thinking`?uM(`thinking`,`Thinking…`,i,fj(s.text)):s?.kind===`assistant`?uM(`reply`,`Writing the reply…`,i):s?.kind===`user`?uM(`sending`,i<2e3?`Sending…`:`Waiting for the model…`,i):uM(`thinking`,`Thinking…`,i)}let a=e?.lastTurn;return a&&t-a.endedAt<6e3?a.status===`stopped`?{phase:`stopped`,kind:`terminal`,tone:`warn`,text:`Stopped`,ticking:!0}:a.status===`failed`?{phase:`failed`,kind:`terminal`,tone:`alert`,text:`Failed: ${cM(a.failure)}`,ticking:!0}:{phase:`done`,kind:`terminal`,tone:`ok`,text:`Done · ${lM(a.durationMs)}`,ticking:!0}:{phase:`idle`,kind:`idle`,tone:``,text:oM,ticking:!1}}function fM(e){let t=[],n=e.split(`
14
- `),r=n.pop()??``;for(let e of n){let n=e.trim();if(!n.startsWith(`data:`))continue;let r=n.slice(5).trim();if(r)try{t.push(JSON.parse(r))}catch{}}return{events:t,tail:r}}var pM=e=>typeof e==`string`&&/^[a-f0-9]{32}$/.test(e),mM=new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`]),hM=(e,t)=>e&&typeof e==`object`&&!Array.isArray(e)&&Object.keys(e).length===t.length&&t.every(t=>Object.hasOwn(e,t)),gM=(e,t)=>{try{return e()}catch{return t}},_M=e=>gM(()=>e?.status===401||e?.code===`auth`?`auth`:e?.status===429||e?.code===`rate_limit`?`rate_limited`:`upstream`,`upstream`),vM=new Set([`auth`,`entitlement`,`rate_limit`,`overloaded`,`upstream`]);async function yM(e){let t=Number.isFinite(e?.status)?e.status:null,n=null;try{let t=await e.clone().json();n=typeof t?.error==`string`?{message:t.error}:t?.error&&typeof t.error==`object`?t.error:null}catch{}let r=typeof n?.message==`string`?n.message.trim():``,i=r?t!==null&&r.startsWith(`${t} `)?r:`${t??`Upstream`} — ${r}`:`The turn was refused with HTTP ${t??`error`}.`;return{code:vM.has(n?.code)?n.code:t===429?`rate_limit`:t===401?`auth`:`upstream`,message:i,...t===null?{}:{status:t},...n?.resetAt?{resetAt:n.resetAt}:{}}}function bM({surface:e,capture:t,now:n,correlationId:r=null}){let i=gM(()=>{let e=new Uint8Array(16);return globalThis.crypto.getRandomValues(e),[...e].map(e=>e.toString(16).padStart(2,`0`)).join(``)},null),a=()=>gM(()=>{let e=n();return Number.isFinite(e)?e:NaN},NaN),o=r??i,s=a(),c=gM(()=>[`studio`,`workflow`].includes(e)?e:/^\/workflow(?:\/|$)/.test(globalThis.location?.pathname||``)?`workflow`:`studio`,`studio`),l=!1,u=!1,d=new Map,f=new Set,p=(e,n)=>{if(i)try{Promise.resolve(t(e,n)).catch(()=>{})}catch{}},m=(e,t)=>{if(!l){if(l=!0,e===`cancelled`)for(let[e,t]of d)f.has(e)||p(`agent:tool_executed`,{turn_id:i,tool_category:t.category,outcome:`cancelled`,duration_bucket:ek(a()-t.startedAt)});d.clear(),p(`agent:turn_${e}`,{turn_id:i,duration_bucket:ek(a()-s),...e===`succeeded`?{}:{failure_code:t}})}};return p(`agent:turn_requested`,{surface:c,turn_id:i}),{turnId:i,cancel:()=>m(`cancelled`,`aborted`),fail:e=>m(`failed`,mM.has(e)?e:`upstream`),frame(e){try{if(!i||l)return;if(e.type===`execution_tool_started`){if(!hM(e,[`type`,`turn_id`,`telemetry_id`,`tool_category`])||e.turn_id!==o||!pM(e.telemetry_id)||!HD.includes(e.tool_category))return;!d.has(e.telemetry_id)&&!f.has(e.telemetry_id)&&d.set(e.telemetry_id,{category:e.tool_category,startedAt:a()});return}let{event:t,props:n}=e;if(n?.turn_id!==o)return;if(t===`agent:tool_executed`){if(!hM(e,[`type`,`event`,`props`,`telemetry_id`])||!pM(e.telemetry_id)||!hM(n,[`turn_id`,`tool_category`,`outcome`,`duration_bucket`])||!HD.includes(n.tool_category)||![`succeeded`,`failed`,`cancelled`].includes(n.outcome)||!GD.duration_bucket.has(n.duration_bucket)||f.has(e.telemetry_id))return;f.add(e.telemetry_id),d.delete(e.telemetry_id),p(t,{turn_id:i,tool_category:n.tool_category,outcome:n.outcome,duration_bucket:n.duration_bucket});return}if(!hM(e,[`type`,`event`,`props`]))return;if(t===`agent:result_applied`){!u&&hM(n,[`turn_id`])&&(u=!0,p(t,{turn_id:i}));return}if(![`agent:turn_succeeded`,`agent:turn_failed`,`agent:turn_cancelled`].includes(t))return;let r=t.slice(11),s=Object.hasOwn(n,`failure_code`);if(!hM(n,[`turn_id`,`duration_bucket`,...s?[`failure_code`]:[]])||!GD.duration_bucket.has(n.duration_bucket)||s&&(r===`succeeded`||!mM.has(n.failure_code)))return;m(r,r===`cancelled`?`aborted`:n.failure_code||`unknown`)}catch{}}}}var xM=3;function SM(e){let t=/"message"\s*:\s*"([^"]{1,160})"/.exec(String(e||``))?.[1],n=/\b(401|403)\b/.exec(String(e||``))?.[1];return`The model provider refused the credentials${n||t?` (${[n,t].filter(Boolean).join(`: `)})`:``}.`}var CM=e=>!Number.isFinite(e?.status)||[404,502,503].includes(e.status);function wM({fetchImpl:e=globalThis.fetch?.bind(globalThis),surface:t,capture:n=Ak,now:r=()=>performance.now()}={}){let i=new Map,a=(t,n)=>YA(e,t,n);return{mock:!1,async status(){return a(`/oauth/status`)},async signIn(){return a(`/oauth/start`,{method:`POST`,body:`{}`})},async signOut(){return a(`/oauth/logout`,{method:`POST`,body:`{}`})},async models(){let e=await a(`/agent/models`),t=Array.isArray(e?.models)?e.models:[],n=Array.isArray(e?.providers)?e.providers.filter(e=>e?.id&&Array.isArray(e.models)):[],r=e?.roles?.byMain;return r&&typeof r==`object`&&!Array.isArray(r)?{providers:n,models:t,roles:{byMain:r}}:{providers:n,models:t}},async steer(e,t){return a(`/agent/turn/${encodeURIComponent(e)}/steer`,{method:`POST`,body:JSON.stringify(t)})},async providers(){let e=await a(`/agent/providers`);return Array.isArray(e?.providers)?e.providers:[]},async setProviderKey(e,t){return a(`/agent/providers/${encodeURIComponent(e)}`,{method:`PUT`,body:JSON.stringify({key:t})})},async removeProviderKey(e){return a(`/agent/providers/${encodeURIComponent(e)}`,{method:`DELETE`})},async listSessions(){let e=await a(`/agent/sessions?surface=${encodeURIComponent(t||`studio`)}`);return Array.isArray(e?.sessions)?e.sessions:[]},async loadSession(e){return a(`/agent/sessions/${encodeURIComponent(e)}`)},async stop(e){let t=typeof e==`string`||!e?{sessionId:e}:{surface:`studio`,sessionId:e.sessionId,turnId:e.turnId,...e.jobId?{jobId:e.jobId}:{}};return i.get(t.sessionId)?.cancel(),a(`/agent/stop`,{method:`POST`,body:JSON.stringify(t)})},async acceptJob({jobId:e,sessionId:t,turnId:n}){return a(`/agent/jobs/${encodeURIComponent(e)}/accept`,{method:`POST`,body:JSON.stringify({surface:`studio`,sessionId:t,turnId:n,explicitUnverifiedAcceptance:!0})})},async image(t,n){return ZA(t,{fetchImpl:e,signal:n})},async video(e,t){return a(`/agent/video`,{method:`POST`,body:JSON.stringify(e),signal:t})},async videoProviders(){return a(`/agent/video/providers`)},async supervisor(t,n){let r=await e(JA(`/agent/turn/${encodeURIComponent(t)}/supervisor`),{headers:{accept:`application/json`},credentials:`same-origin`,signal:n});if(r?.status!==200)return null;let i=await r.json();return i?.type===`supervisor`&&[`reviewed`,`unavailable`].includes(i.verdict)?i:null},async turn(a,o,s){let{sessionId:c,text:l,attachFrame:u,model:d,effort:f,attachments:p,supervisor:m,tasks:h}=a,g=Array.isArray(p)&&p.length?{attachments:p}:{},_=a.surface===`studio`,v=_?a.turnId:null,y=bM({surface:t,capture:n,now:r,correlationId:v});a.onTurnId?.(_?v:y.turnId),i.set(c,y);let b=()=>{s.reason===`agent-stop`&&y.cancel()};s?.addEventListener(`abort`,b,{once:!0}),s?.aborted&&b();let x=!1,S,C=0,w=!1,T=e=>{if(e?.type===`execution_telemetry`||e?.type===`execution_tool_started`){y.frame(e);return}if(_&&Number.isFinite(e?.eventSeq)){if(e.eventSeq<=C)return;C=e.eventSeq}e?.type===`error`&&(S=_M(e)),e?.type===`done`&&(w=!0),o(e)},E=async e=>{let t=e.body.getReader();x=!0;try{let e=new TextDecoder,n=``;for(;;){let{value:r,done:i}=await t.read();if(i)break;n+=e.decode(r,{stream:!0});let a=fM(n);n=a.tail;for(let e of a.events)T(e)}for(let e of fM(`${n}\n`).events)e?.type!==`execution_telemetry`&&e?.type!==`execution_tool_started`&&T(e)}finally{t.releaseLock()}},D=JSON.stringify(_?{surface:`studio`,sessionId:c,turnId:v,text:l,context:a.context,...d?{model:d}:{},...f?{effort:f}:{},...u===void 0?{}:{attachFrame:!!u},...typeof m==`boolean`?{supervisor:m}:{},...g}:{sessionId:c,text:l,attachFrame:u,model:d,...f?{effort:f}:{},...g,...y.turnId?{turn_id:y.turnId}:{}});try{let t=await e(JA(_&&h?`/agent/main`:`/agent/turn`),{method:`POST`,headers:{"content-type":`application/json`,accept:`text/event-stream`,..._&&h?{"x-cozyclay-tasks":`on`}:{}},body:D,signal:s});if(!t.ok||!t.body){y.fail(_M(t)),o({type:`error`,...await yM(t)}),o({type:`done`});return}let n=null;try{await E(t)}catch(e){n=e}for(let t=0;_&&v&&!w&&!s?.aborted&&t<xM;t+=1){let t;try{t=await e(JA(`/agent/turn/${encodeURIComponent(v)}/events?after=${C}`),{headers:{accept:`text/event-stream`},signal:s})}catch{break}if(!t?.ok||!t.body)break;n=null;try{await E(t)}catch(e){n=e}}if(n)throw n;S&&y.fail(S)}catch(e){throw!s?.aborted&&(!x||S)&&y.fail(S||_M(e)),e}finally{s?.removeEventListener(`abort`,b),i.get(c)===y&&i.delete(c)}}}}function TM(e=globalThis.location?.search||``){let t=new URLSearchParams(e);if(t.get(`agent`)!==`mock`)return null;let n=t.get(`state`);return{state:Ej.includes(n)?n:`ready`,speed:Number(t.get(`speed`))||1}}var EM={signedIn:!0,email:`director@cozyclay.org`,plan:`Plus`,accountId:`acct_mock_126`,expiresAt:null},DM=[{delay:40,event:{type:`text.delta`,text:`Framing a wide two-shot from the current blocking. `}},{delay:120,event:{type:`text.delta`,text:`Capturing the viewport first.`}},{delay:120,event:{type:`tool.start`,callId:`call-1`,name:`capture_blocking_frame`,label:`Capture blocking frame`,args:{shot:`current`}}},{delay:260,event:{type:`tool.done`,callId:`call-1`,ok:!0,elapsedMs:268,result:{width:1280,height:720}}},{delay:90,event:{type:`tool.start`,callId:`call-2`,name:`render_from_frame`,label:`Render from frame`,args:{style:`storyboard`,strength:.6}}},{delay:420,event:{type:`tool.done`,callId:`call-2`,ok:!0,elapsedMs:1412,result:{imageId:`img-1`}}},{delay:80,event:{type:`image`,imageId:`img-1`,dataUrl:`data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22512%22%20height%3D%22288%22%20viewBox%3D%220%200%20512%20288%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%232a2f52%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%235b3550%22%2F%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%22512%22%20height%3D%22288%22%20fill%3D%22url(%23g)%22%2F%3E%3Ccircle%20cx%3D%22150%22%20cy%3D%22150%22%20r%3D%2252%22%20fill%3D%22%23ef759d%22%20opacity%3D%220.85%22%2F%3E%3Crect%20x%3D%22250%22%20y%3D%22112%22%20width%3D%22180%22%20height%3D%22112%22%20rx%3D%2210%22%20fill%3D%22%238994ff%22%20opacity%3D%220.8%22%2F%3E%3Crect%20y%3D%22240%22%20width%3D%22512%22%20height%3D%2248%22%20fill%3D%22%23101116%22%20opacity%3D%220.55%22%2F%3E%3Ctext%20x%3D%2224%22%20y%3D%22272%22%20font-family%3D%22Inter%2Csans-serif%22%20font-size%3D%2218%22%20fill%3D%22%23edf0fb%22%3Emock%20render%20%C2%B7%20wide%20two-shot%3C%2Ftext%3E%3C%2Fsvg%3E`,width:512,height:288,prompt:`wide two-shot, storyboard ink`}},{delay:60,event:{type:`quota`,plan:`Plus`,primary:{usedPercent:46,windowMinutes:300,resetAt:null},credits:{has:!0}}},{delay:40,event:{type:`done`}}],OM={ok:!0,commandId:`cmd-mock-1`,receiptId:`receipt-mock-1`,host:{workspaceId:`tab-mock`,documentEpoch:`doc-mock`,sceneId:`scene-mock`,sceneEpoch:`scene-open-mock`},status:`applied`,authored:!0,revision:{before:41,after:42},affectedIds:[`char-a`],delta:[{id:`char-a`,after:{position:{x:-.8,y:0,z:.4}}}],checks:{coverage:`affected-targets`},undo:{historyEntryId:`history-mock-1`,entries:1,canUndoDirect:!0},warnings:[]},kM=[{delay:40,event:{type:`text.delta`,text:`Reading the scene before I move anyone. `}},{delay:120,event:{type:`tool.start`,callId:`studio-1`,name:`inspect_studio`,label:`inspect studio`,args:{scope:`selection`}}},{delay:220,event:{type:`tool.done`,callId:`studio-1`,ok:!0,elapsedMs:214,result:{entities:2}}},{delay:90,event:{type:`text.delta`,text:`Blocking the two-shot now.`}},{delay:120,event:{type:`tool.start`,callId:`studio-2`,name:`arrange_characters`,label:`arrange characters`,args:{ops:[{op:`update`,characterId:`char-a`,position:{world:{x:-.8,y:0,z:.4}}}]}}},{delay:320,event:{type:`tool.done`,callId:`studio-2`,ok:!0,elapsedMs:332,result:{ok:!0,receiptId:OM.receiptId}}},{delay:60,event:{type:`receipt`,receipt:OM}},{delay:40,event:{type:`done`}}],AM=[[`openai-codex`,`ChatGPT (OpenAI Codex)`],[`anthropic`,`Anthropic`],[`openai`,`OpenAI`],[`google`,`Google Gemini`],[`openrouter`,`OpenRouter`],[`cliproxy`,`CLIProxyAPI`]],jM=`google`,MM={"openai-codex":[{id:`gpt-6-astra`,label:`gpt-6-astra`,efforts:[`none`,`low`,`medium`,`high`,`xhigh`],defaultEffort:`medium`},{id:`gpt-5.1-codex`,label:`gpt-5.1-codex`,efforts:[`low`,`medium`,`high`],defaultEffort:`medium`}],anthropic:[{id:`claude-sonnet-4-5`,label:`Claude Sonnet 4.5`,efforts:[`none`,`low`,`medium`,`high`],defaultEffort:`medium`}],openai:[{id:`gpt-5.1`,label:`GPT-5.1`,efforts:[`none`,`low`,`medium`,`high`,`xhigh`],defaultEffort:`medium`}],google:[{id:`gemini-3-pro`,label:`Gemini 3 Pro`,efforts:[`none`,`low`,`medium`,`high`],defaultEffort:`medium`}],openrouter:[{id:`deepseek-v3`,label:`DeepSeek V3`,efforts:[`none`],defaultEffort:`none`}],cliproxy:[{id:`claude-sonnet-5`,label:`Claude Sonnet 5`,efforts:[`none`,`low`,`medium`,`high`],defaultEffort:`medium`}]},NM={id:`gpt-6-live-preview`,label:`gpt-6 live preview`,efforts:[`none`,`low`,`medium`,`high`],defaultEffort:`high`},PM=8,FM=`cozyclay.mock.agent.status-calls`,IM=`cozyclay.mock.agent.model-calls`,LM=e=>{try{globalThis.localStorage?.setItem(e,String(Number(globalThis.localStorage.getItem(e)||0)+1))}catch{}};function RM(e={state:`ready`}){let t=e?.state||`ready`,n=e?.surface===`studio`,r=e?.speed>0?e.speed:1,i=e=>new Promise(t=>setTimeout(t,Math.max(0,e/r))),a=new Set,o=t===`signed-out`?`out`:t===`signing-in`?`pending`:`in`,s=()=>AM.map(([e,t])=>{let n=e===`openai-codex`?o===`in`?`chatgpt`:null:e===jM?`env`:a.has(e)?`file`:null;return{id:e,label:t,authSource:n,signedIn:!!n}}),c=null,l=0;return{mock:!0,state:t,async status(){LM(FM);let e=s().filter(e=>e.id!==`openai-codex`&&e.signedIn).length;return o===`pending`?{signedIn:!1,pending:!0,email:null,plan:null,accountId:null,expiresAt:null,providersConfigured:a.size}:o===`out`?{signedIn:!1,email:null,plan:null,accountId:null,expiresAt:null,providersConfigured:a.size}:t===`no-entitlement`?{...EM,plan:`Free`,entitlements:{image:!1},providersConfigured:e}:{...EM,entitlements:{image:!0},providersConfigured:e}},async signIn(){return o=`in`,{ok:!0,authorizeUrl:`https://auth.example.invalid/mock`}},async signOut(){return o=`out`,{ok:!0}},async models(){LM(IM);let e=s().map(e=>{let t=MM[e.id]??[],n=e.id===`openai-codex`&&o===`in`?[...t,NM]:t;return{...e,models:n.map(t=>({...t,key:`${e.id}/${t.id}`,input:[`text`,`image`]}))}});return{providers:e,models:e.flatMap(e=>e.models.map(e=>({...e,id:e.key})))}},async providers(){return s()},async setProviderKey(e,t){if(e===`openai-codex`)throw Object.assign(Error(`Use ChatGPT sign-in for OpenAI Codex.`),{status:400});if(typeof t!=`string`||t.trim().length<PM)throw Object.assign(Error(`That key was refused: it is too short.`),{status:400});return a.add(e),{ok:!0}},async removeProviderKey(e){return a.delete(e),{ok:!0}},async stop(){return c=null,{ok:!0}},async steer(e,t){if(n)throw Object.assign(Error(`409 — Steering a Studio turn is not supported.`),{status:409,code:`STEER_UNSUPPORTED`});if(!c||e!==c)throw Object.assign(Error(`409 — This turn already ended.`),{status:409,code:`NO_ACTIVE_TURN`});try{globalThis.localStorage?.setItem(`cozyclay.mock.agent.last-steer`,JSON.stringify({turnId:e,text:t?.text??null,attachments:t?.attachments?.length??0}))}catch{}return{ok:!0,queued:!0}},async acceptJob(){return{ok:!0}},async listSessions(){if(!n)return[];let e=[];try{for(let t=0;t<globalThis.localStorage.length;t+=1){let n=globalThis.localStorage.key(t);if(!n?.startsWith(`cozyclay.mock.agent.session.`))continue;let r=JSON.parse(globalThis.localStorage.getItem(n));r?.meta&&e.push(r.meta)}}catch{}return e.sort((e,t)=>Date.parse(t.updatedAt||0)-Date.parse(e.updatedAt||0)).slice(0,50)},async loadSession(e){try{let t=JSON.parse(globalThis.localStorage.getItem(`cozyclay.mock.agent.session.${e}`));if(t?.transcript)return t}catch{}throw Error(`Mock session not found.`)},async applyImage({requestId:e}){return{ok:!0,receiptId:`mock-${e}`}},async turn(e,r,a){let o=`mock-turn-${++l}`;c=o,e?.onTurnId?.(o);try{globalThis.localStorage?.setItem(`cozyclay.mock.agent.last-turn`,JSON.stringify({turnId:o,model:e?.model??null,effort:e?.effort??null,text:e?.text??null}))}catch{}try{n&&e?.sessionId&&globalThis.localStorage?.setItem(`cozyclay.mock.agent.last-turn-session`,e.sessionId)}catch{}let s=[],u=n&&e?.sessionId?`cozyclay.mock.agent.session.${e.sessionId}`:null;if(u){try{s=JSON.parse(globalThis.localStorage.getItem(u))?.transcript||[]}catch{s=[]}s.push({kind:`user`,text:e.text})}let d=t=>{if(u){if(t.type===`text.delta`){let e=s.at(-1);e?.kind===`assistant`?e.text+=t.text:s.push({kind:`assistant`,text:t.text})}else if(t.type===`tool.start`)s.push({kind:`tool`,name:t.name,label:t.label,ok:!0,elapsedMs:null,callId:t.callId});else if(t.type===`tool.done`){let e=[...s].reverse().find(e=>e.kind===`tool`&&e.callId===t.callId);e&&Object.assign(e,{ok:t.ok,elapsedMs:t.elapsedMs})}else t.type===`receipt`&&s.push({kind:`receipt`,receiptId:t.receipt?.receiptId,summary:t.receipt?.status===`applied`?`Applied to the scene`:`Receipt`});try{globalThis.localStorage.setItem(u,JSON.stringify({sessionId:e.sessionId,transcript:s,meta:{sessionId:e.sessionId,surface:`studio`,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),sceneName:`Mock scene`,firstText:s.find(e=>e.kind===`user`)?.text||``}}))}catch{}}r(t)};if(t===`rate-limited`){d({type:`text.delta`,text:`Framing a wide two-shot from the current blocking.`}),d({type:`quota`,plan:`Plus`,primary:{usedPercent:100,windowMinutes:300,resetAt:new Date(Date.now()+252e4).toISOString()},credits:{has:!1}}),d({type:`error`,code:`rate_limit`,message:aM.rate_limit,resetAt:new Date(Date.now()+252e4).toISOString()}),d({type:`done`}),c=null;return}if(t===`error`){d({type:`text.delta`,text:n?`Reading the scene first.`:`Capturing the viewport first.`}),d(n?{type:`tool.start`,callId:`call-1`,name:`inspect_studio`,label:`inspect studio`,args:{scope:`selection`}}:{type:`tool.start`,callId:`call-1`,name:`capture_blocking_frame`,label:`Capture blocking frame`,args:{shot:`current`}}),d({type:`tool.done`,callId:`call-1`,ok:!1,elapsedMs:812,error:n?`The scene is not ready`:`Viewport is not ready`}),d({type:`error`,code:`upstream`,message:aM.upstream}),d({type:`done`}),c=null;return}for(let e of n?kM:DM){if(a?.aborted||(await i(e.delay),a?.aborted))break;d(e.event)}c=null,await i(240),a?.aborted&&d({type:`done`})}}}function zM(e={}){let t=e.mockConfig===void 0?TM():e.mockConfig;return t?RM({surface:e.surface,...t}):wM(e)}function BM(e){let t=e?.outcome;return t?.status===`already_applied`?null:t&&t.mutated===!1?{status:`not_applied`,code:t.code??`CANCELLED`,mutated:!1}:{status:`unknown`,code:t?.code??null,mutated:`unknown`}}function VM(e){return new Promise(t=>{let n=r=>{r.detail?.requestId===e.requestId&&(globalThis.removeEventListener(`cozyclay:agent-image-result`,n),t({ok:!!r.detail.ok,error:r.detail.error,receiptId:r.detail.receiptId}))};globalThis.addEventListener?.(`cozyclay:agent-image-result`,n),!(globalThis.dispatchEvent&&!globalThis.dispatchEvent(new CustomEvent(`cozyclay:agent-image`,{cancelable:!0,detail:e})))&&(globalThis.removeEventListener?.(`cozyclay:agent-image-result`,n),t({ok:!1,error:`No editor accepted the image. Open the scene that should receive it.`}))})}function HM({transport:e,surface:t=`workflow`,buildContext:n=null,requestImageAction:r=null,onAuthLost:i=null,onReceipt:a=null,newId:o=Dj,clock:s=()=>Date.now()}={}){let c=t===`studio`,l=new Set,u=new Set,d=new Set,f=null,p=null,m=null,h=new Set,g=new Map,_={sessionId:o(),turnId:null,draft:``,pendingAttachments:[],items:[],streaming:!1,quota:null,rateLimit:null,lastPrompt:``,turnStartedAt:null,lastTurn:null},v=e=>{_={..._,...e};for(let e of[...l])e(_)},y=e=>v({items:e(_.items)}),b=(e,t)=>y(n=>n.map(n=>e(n)?{...n,...t}:n)),x=e=>_.items.find(t=>t.kind===`job`&&t.jobId===e);function S(e){if(!e?.jobId||!$e.jobStates.includes(e.state))return;let t=typeof e.progress==`number`&&Number.isFinite(e.progress)?Math.min(1,Math.max(0,e.progress)):null;y(n=>{let r=n.find(t=>t.kind===`job`&&t.jobId===e.jobId),i={kind:`job`,id:r?.id??`job:${e.jobId}`,jobId:e.jobId,commandId:e.commandId??r?.commandId??null,state:e.state,phase:typeof e.phase==`string`?e.phase:r?.phase??null,progress:t??r?.progress??null,verification:r?.verification??null,receiptId:r?.receiptId??null,outcome:r?.outcome??null,acceptance:e.state===`review_required`?r?.acceptance??{status:`required`}:r?.acceptance??null};return r?n.map(e=>e===r?i:e):[...n,i]})}function C(e){let t;try{t=Nn(e)}catch(e){y(t=>[...t,{kind:`failure`,id:o(),failure:{code:e?.code||`INVALID_RECEIPT`,message:e?.message||`The host returned an unreadable receipt.`,preserved:{authoredState:`unknown`},recovery:{action:`inspect`}}}]);return}if(t.ok===!1){let e=`failure:${t.commandId}:${t.code}`;if(u.has(e))return;u.add(e),y(n=>[...n.map(e=>e.kind===`job`&&e.commandId===t.commandId&&!Aj(e.state)?{...e,state:`failed`,phase:t.phase,acceptance:null}:e),{kind:`failure`,id:e,failure:t}]);return}if(!u.has(t.receiptId)){u.add(t.receiptId),y(e=>[...e.map(e=>e.kind===`job`&&e.jobId===t.jobId?{...e,state:t.status===`installed`?`installed`:e.state,verification:t.verification??null,receiptId:t.receiptId,acceptance:t.explicitUnverifiedAcceptance?{status:`accepted`}:null}:e),{kind:`receipt`,id:`receipt:${t.receiptId}`,receiptId:t.receiptId,receipt:t,summary:Nj(t,c?gM(()=>n?.()??null,null):null)}]);try{a?.(t)}catch{}}}function w(t){if(typeof e.supervisor!=`function`)return;let n=new AbortController;h.add(n),Promise.resolve().then(()=>e.supervisor(t,n.signal)).then(e=>{!e||n.signal.aborted||y(n=>[...n,{...e,kind:`supervisor`,id:`supervisor:${t}`}])}).catch(()=>{}).finally(()=>h.delete(n))}let T=()=>{for(let e of h)e.abort();h.clear()};function E(e){if(p&&[`text.delta`,`tool.start`,`tool.done`,`image`,`job.state`,`job.progress`,`receipt`,`error`].includes(e?.type)&&(p.produced=!0),p&&(e?.type===`tool.done`&&(e.ok?e.result?.authored===!0:rM.test(String(e.error??``)))||e?.type===`receipt`&&e.receipt?.authored===!0)&&(p.reviewable=!0),e?.type===`text.delta`){y(t=>{let n=t[t.length-1];return n?.kind===`assistant`?[...t.slice(0,-1),{...n,text:n.text+e.text}]:[...t,{kind:`assistant`,id:o(),text:e.text}]});return}if(e?.type===`tool.start`){y(t=>gj(t,{kind:`tool`,id:e.callId||o(),callId:e.callId,name:e.name,label:e.label,args:e.args,status:`running`,startedAt:s(),...sj(e.name,e.args,g)}));return}if(e?.type===`thinking.delta`){y(t=>pj(t,String(e.text??``),s(),o));return}if(e?.type===`tool.compose`){y(t=>hj(t,e,s(),o,g));return}if(e?.type===`tool.progress`){b(t=>t.kind===`tool`&&t.callId===e.callId&&t.status===`running`,{progress:{index:e.index,name:e.name,label:g.get(e.action),action:e.action,status:e.status,summary:e.summary}});return}if(e?.type===`tool.done`){b(t=>t.kind===`tool`&&t.callId===e.callId,{status:e.ok?`done`:`failed`,elapsedMs:e.elapsedMs,result:e.result,error:e.error});let t=e.result;if(e.ok&&t&&typeof t==`object`&&t.ok===!0&&typeof t.receiptId==`string`&&Array.isArray(t.affectedIds))try{a?.(t)}catch{}return}if(e?.type===`image`){y(t=>[...t,{kind:`image`,id:e.imageId||o(),imageId:e.imageId,dataUrl:e.dataUrl,width:e.width,height:e.height,prompt:e.prompt,placed:!1,apply:null}]);return}if(e?.type===`job.state`||e?.type===`job.progress`){S(e);return}if(e?.type===`receipt`){C(e.receipt);return}if(e?.type===`quota`){v({quota:{plan:e.plan,usedPercent:e.primary?.usedPercent,windowMinutes:e.primary?.windowMinutes,resetAt:e.primary?.resetAt,credits:e.credits}});return}if(e?.type!==`error`)return;let t={code:e.code||`upstream`,message:e.code===`unauthorized`?SM(e.message):e.message||aM[e.code]||`The turn failed.`,...Number.isFinite(e.status)?{status:e.status}:{}};if(p&&(p.failure=t),e.code===`rate_limit`){v({rateLimit:{resetAt:e.resetAt||null,message:e.message||aM.rate_limit}});return}if(e.code===`auth`){i?.();return}y(e=>{let n=e.findLastIndex(e=>e.kind===`user`),r=e.findLastIndex((e,t)=>t>n&&e.kind===`tool`&&e.status===`failed`);return r===-1?[...e,{kind:`failure`,id:o(),failure:{...t,recovery:{action:t.code===`unauthorized`?`fix_key`:`retry`,retryAllowed:!0}}}]:e.map((e,n)=>n===r?{...e,failure:t}:e)})}function D(e,t,n){if(!e||d.has(e))return;d.add(e);let r=!!t?.ok,i={apply:{requestId:e,status:r?`settled`:`failed`,error:r?null:t?.error||`The editor did not apply the image.`,receiptId:t?.receiptId??null}};r&&(i.placed=n===`place`),b(t=>t.kind===`image`&&t.apply?.requestId===e,i)}async function O(e,t){let n=_.items.find(t=>t.kind===`image`&&t.id===e);if(!n||n.apply?.status===`applying`||(t===`place`?n.placed:!n.placed))return;let i=o();b(t=>t.kind===`image`&&t.id===e,{apply:{requestId:i,status:`applying`,error:null,receiptId:null,startedAt:s()}});let a={action:t,requestId:i,imageId:n.imageId,dataUrl:n.dataUrl,width:n.width,height:n.height,prompt:n.prompt};try{D(i,await(r??VM)(a),t)}catch(e){D(i,{ok:!1,error:String(e?.message||e)},t)}}let k=()=>{T(),u.clear(),d.clear(),v({sessionId:o(),turnId:null,items:[],pendingAttachments:[],rateLimit:null,lastPrompt:``,turnStartedAt:null,lastTurn:null})};return{getState:()=>_,subscribe(e){return l.add(e),()=>l.delete(e)},setDraft:e=>v({draft:String(e??``)}),note:e=>{String(e??``).trim()&&v({items:[..._.items,{kind:`assistant`,id:o(),text:String(e)}]})},addAttachments(e){let t=(Array.isArray(e)?e:[]).filter(e=>typeof e?.dataUrl==`string`&&e.dataUrl.startsWith(`data:image/`)).map(e=>({id:o(),dataUrl:e.dataUrl,...e.name?{name:String(e.name).slice(0,120)}:{}})),{attachments:n,rejected:r}=yA(_.pendingAttachments,t,4),i=n.length-_.pendingAttachments.length;return v({pendingAttachments:n}),{added:i,rejected:r}},removeAttachment:e=>v({pendingAttachments:_.pendingAttachments.filter(t=>t.id!==e)}),clearAttachments:()=>v({pendingAttachments:[]}),async send(t,r={}){let i=String(t??``).trim();if(!i||_.streaming)return;let a=o(),l=c?n?.()??null:null;if(g=aj(l),c&&!l){E({type:`error`,code:`upstream`,message:`The editor is not ready to describe the scene yet.`});return}let u=s(),d={produced:!1,failure:null,reviewable:!1};p=d;let h=(Array.isArray(r.attachments)?r.attachments:_.pendingAttachments).slice(0,4).map(({dataUrl:e,name:t})=>({dataUrl:e,...t?{name:t}:{}}));v({lastPrompt:i,rateLimit:null,turnId:a,streaming:!0,draft:``,pendingAttachments:[],turnStartedAt:u,lastTurn:null,items:[..._.items,{kind:`user`,id:o(),text:i,attachFrame:!!r.attachFrame,attachments:h}]}),f=new AbortController;let b=f.signal;try{await e.turn({onTurnId:e=>{m=e},...c?{surface:`studio`,turnId:a,context:l}:{},sessionId:_.sessionId,text:i,...h.length?{attachments:h}:{},attachFrame:!!r.attachFrame,model:r.model,effort:r.effort??void 0,...typeof r.supervisor==`boolean`?{supervisor:r.supervisor}:{},...r.tasks?{tasks:!0}:{}},E,b)}catch(e){b.aborted||E({type:`error`,code:`upstream`,message:String(e?.message||e)})}finally{if(f?.signal===b&&(f=null),p===d){m=null,!d.produced&&!d.failure&&!b.aborted&&(d.failure={code:`no_output`,message:`The turn ended without a response.`,recovery:{action:`retry`,retryAllowed:!0}},y(e=>[...e,{kind:`failure`,id:o(),failure:d.failure}]));let e=s();p=null;let t={status:b.aborted?`stopped`:d.failure?`failed`:`done`,endedAt:e,durationMs:e-u,failure:d.failure};v({streaming:!1,turnStartedAt:null,lastTurn:t,items:_j(_.items,t,o)}),c&&d.reviewable&&r.supervisor===!0&&!b.aborted&&w(a)}}},async steer(t,n={}){let r=String(t??``).trim();if(!r)return{ok:!1,code:`EMPTY`,message:``};if(!_.streaming||!m||typeof e.steer!=`function`)return{ok:!1,code:`NO_ACTIVE_TURN`,message:nM.NO_ACTIVE_TURN};let i=(Array.isArray(n.attachments)?n.attachments:_.pendingAttachments).slice(0,4).map(({dataUrl:e,name:t})=>({dataUrl:e,...t?{name:t}:{}}));try{await e.steer(m,{text:r,...i.length?{attachments:i}:{}})}catch(e){let t=typeof e?.code==`string`?e.code:`upstream`;return{ok:!1,code:t,message:nM[t]||String(e?.message||e)}}return v({draft:``,pendingAttachments:[],items:[..._.items,{kind:`user`,id:o(),text:r,steered:!0,attachments:i}]}),{ok:!0,code:null,message:``}},stop(){let t=[..._.items].reverse().find(e=>e.kind===`job`&&!Aj(e.state));f?.abort(`agent-stop`),f=null;let n=c?{sessionId:_.sessionId,turnId:_.turnId,...t?{jobId:t.jobId}:{}}:_.sessionId;if(Promise.resolve(e.stop?.(n)).then(e=>{if(!t)return;let n=BM(e);n&&(b(e=>e.kind===`job`&&e.jobId===t.jobId&&!Aj(e.state),{state:n.status===`not_applied`?`cancelled`:`reconciling`,phase:null,outcome:n,acceptance:null}),b(e=>e.kind===`tool`&&e.status===`running`,{status:`cancelled`,result:n,elapsedMs:null}))}).catch(()=>{}),!_.streaming){v({streaming:!1});return}let r=s();v({streaming:!1,turnStartedAt:null,lastTurn:{status:`stopped`,endedAt:r,durationMs:r-(_.turnStartedAt??r),failure:null}})},async acceptJob(t){let n=x(t);if(!(!n||n.acceptance?.status!==`required`)){b(e=>e.kind===`job`&&e.jobId===t,{acceptance:{status:`accepting`}});try{let n=await e.acceptJob?.({jobId:t,sessionId:_.sessionId,turnId:_.turnId});n?.receipt?C(n.receipt):b(e=>e.kind===`job`&&e.jobId===t,{acceptance:{status:`required`,error:`The host did not acknowledge the acceptance.`}})}catch(e){b(e=>e.kind===`job`&&e.jobId===t,{acceptance:{status:`required`,error:String(e?.message||e)}})}}},applyImage:e=>O(e,`place`),undoImage:e=>O(e,`remove`),acknowledgeImageAction:({requestId:e,ok:t,error:n,receiptId:r})=>{let i=_.items.find(t=>t.kind===`image`&&t.apply?.requestId===e);D(e,{ok:t,error:n,receiptId:r},i?.placed?`remove`:`place`)},clearRateLimit:()=>v({rateLimit:null}),clearContext:k,newSession:k,restore:(e,t=_.sessionId)=>{T(),u.clear(),d.clear();let n=new Set,r=(Array.isArray(e)?e:[]).flatMap(e=>{if(e?.kind===`user`||e?.kind===`assistant`){let t=Array.isArray(e.attachments)?e.attachments.filter(e=>typeof e?.dataUrl==`string`):[];return[{kind:e.kind,id:o(),text:String(e.text??``),...t.length?{attachments:t}:{}}]}return e?.kind===`tool`?[{kind:`tool`,id:o(),callId:o(),name:e.name||`tool`,label:e.label,ok:e.ok,elapsedMs:e.elapsedMs,status:e.ok===!1?`failed`:`done`}]:e?.kind===`receipt`?e.receiptId&&n.has(e.receiptId)?[]:(e.receiptId&&(n.add(e.receiptId),u.add(e.receiptId)),[{kind:`receipt`,id:`receipt:${e.receiptId||o()}`,receiptId:e.receiptId,summary:e.summary||`Receipt`,receipt:{status:`applied`,warnings:[],verification:{status:`verified`}}}]):e?.kind===`failure`?[{kind:`failure`,id:o(),failure:{code:e.code||`upstream`,message:String(e.message||`The turn failed.`),recovery:{action:`retry`,retryAllowed:!0}}}]:[]}),i=[...r].reverse().find(e=>e.kind===`user`)?.text||``;return v({sessionId:t,turnId:null,items:r,rateLimit:null,lastPrompt:i,turnStartedAt:null,lastTurn:null,streaming:!1}),r}}}var UM=`cozyclay.agent.tasks`;function WM(e=globalThis.localStorage){try{return e?.getItem(UM)===`on`}catch{return!1}}function GM(e,t=globalThis.localStorage){try{t?.setItem(UM,e?`on`:`off`)}catch{}}var KM={queued:B(`Queued`,`대기열`),waiting:B(`Waiting for scope`,`영역 대기`),starting:B(`Starting`,`시작 중`),running:B(`Running`,`작업 중`),paused:B(`Paused: Studio lost`,`일시정지: Studio 연결 끊김`),done:B(`Done`,`완료`),failed:B(`Failed`,`실패`),cancelled:B(`Cancelled`,`취소됨`)},qM=new Set([`queued`,`waiting`,`starting`,`running`,`paused`]),JM=()=>({order:[],tasks:{},after:0});function YM(e,t){if(!t||typeof t!=`object`)return e;let n=Number.isFinite(t.eventSeq)?Math.max(e.after,t.eventSeq):e.after,r=(t,r)=>{let i=e.tasks[t];if(!i&&!r.title)return{...e,after:n};let a={notes:[],...i,...r,taskId:t};return{...e,after:n,order:i?e.order:[...e.order,t],tasks:{...e.tasks,[t]:a}}},i=(t,i)=>e.tasks[t]?r(t,{notes:[...e.tasks[t].notes,i].slice(-4)}):{...e,after:n};if(t.type===`task.sceneChanged`)return i(t.taskId,B(`The scene changed during a reload: ${t.keys.join(`, `)}`,`새로고침 중에 장면이 바뀜: ${t.keys.join(`, `)}`));if(t.type===`task.userEdit`)return i(t.taskId,B(`You changed ${t.keys.join(`, `)}; the task reads it again`,`${t.keys.join(`, `)}을(를) 직접 바꿈: 작업이 다시 읽어요`));if(t.type===`task.undone`)return e.tasks[t.taskId]?r(t.taskId,{undone:!0}):e;if(typeof t.type==`string`&&t.type.startsWith(`task.`)&&t.taskId&&t.status){let{type:e,at:n,eventSeq:i,...a}=t;return r(t.taskId,{...a,...e===`task.started`||e===`task.resumed`?{progress:``}:{}})}return{...e,after:n}}function XM(e,t=[]){return t.reduce((e,t)=>e.tasks[t.taskId]?e:YM(e,{type:`task.seed`,...t}),e)}function ZM(e,t=e=>e.name){return e?.type===`tool.start`?t(e):e?.type===`error`?B(`Error: ${e.message??e.code}`,`오류: ${e.message??e.code}`):null}function QM(e){let t=/(?:waits for|held by) task \S+ \((.+)\)/.exec(String(e??``))?.[1];return t?B(`Starts after "${t}"`,`'${t}' 끝나면 시작`):/scope is held/.test(String(e??``))?B(`Starts when another task frees its part`,`다른 작업이 끝나면 시작`):e??``}function $M(e){return e.status===`running`?e.progress||B(`Working…`,`작업 중…`):e.status===`done`?e.undone?B(`Undone`,`되돌림`):String(e.summary?.reply??``).split(/(?<=[.!?。])\s/)[0]||KM.done:e.reason?QM(e.reason):KM[e.status]??e.status}var eN={timeline:B(`timeline`,`타임라인`),stage:B(`stage`,`무대`),scene:B(`scene`,`장면`),object:B(`object`,`오브젝트`),character:B(`character`,`캐릭터`),shot:B(`shot`,`샷`)},tN=e=>eN[String(e).split(`:`)[0]]??String(e);function nN(e){let t={failed:[],running:[],waiting:[],done:[]};for(let n of e.order){let r=e.tasks[n];t[r.status===`failed`||r.status===`paused`?`failed`:r.status===`running`||r.status===`starting`?`running`:qM.has(r.status)?`waiting`:`done`].push(r)}return t}var rN=e=>(e??[]).filter(e=>e.kind===`tool`&&e.name===`dispatch_task`).map(e=>e.result?.taskId??e.result?.duplicateOf).filter(Boolean);function iN(){let e={board:JM(),activity:null,client:null,undo:null,open:null},t=new Set;return{get:()=>e,set:n=>{e={...e,...n};for(let e of t)e()},subscribe:e=>(t.add(e),()=>t.delete(e))}}var aN=iN(),oN=e=>Number.isFinite(e?.cost)&&e.cost>0?`$${e.cost.toFixed(2)}`:``;function sN(e,t){let n=e=>(e??[]).filter(e=>e?.taskId===t).length;return{waiting:n(e?.waiting),running:n(e?.running)}}function cN(e,t){if(t?.type===`task.begun`||t?.type===`task.scope`)return{...e,[t.taskId]:t.scope??[]};if(t?.type===`task.finished`||t?.type===`task.cancelled`){let{[t.taskId]:n,...r}=e;return r}return e}function lN({fetchImpl:e=globalThis.fetch?.bind(globalThis),url:t=JA}={}){let n=async(n,r)=>{let i=await e(t(n),{credentials:`same-origin`,headers:{accept:`application/json`,"content-type":`application/json`},...r}),a=await i.json().catch(()=>({}));if(!i.ok)throw Object.assign(Error(a?.error?.message??`${i.status}`),{status:i.status,code:a?.error?.code});return a};async function r(n,r,i){let a=await e(t(n),{credentials:`same-origin`,headers:{accept:`text/event-stream`},signal:i});if(!a.ok||!a.body)throw Object.assign(Error(`${a.status}`),{status:a.status});let o=a.body.getReader(),s=new TextDecoder,c=``;try{for(;;){let{value:e,done:t}=await o.read();if(t)break;let n=fM(c+s.decode(e,{stream:!0}));c=n.tail;for(let e of n.events)r(e)}}finally{o.releaseLock()}}let i=e=>encodeURIComponent(e);return{board:e=>n(`/agent/main/${i(e)}/board`),events:(e,t,n,a)=>r(`/agent/main/${i(e)}/events?after=${t}`,n,a),frames:(e,t,n)=>r(`/agent/turn/${i(e)}/events?after=0`,t,n),cancel:e=>n(`/agent/task/${i(e)}/cancel`,{method:`POST`,body:`{}`}),steer:(e,t)=>n(`/agent/task/${i(e)}/steer`,{method:`POST`,body:JSON.stringify({text:t})})}}export{$A as $,Za as $n,Dn as $r,qw as $t,Mj as A,Es as An,Yn as Ar,Sk as At,VM as B,so as Bn,Qe as Br,tD as Bt,CM as C,Ob as Cn,rr as Cr,fk as Ct,wM as D,Gf as Dn,Jn as Dr,Fk as Dt,zM as E,Uf as En,Zn as Er,uk as Et,Yj as F,Io as Fn,Rn as Fr,Mk as Ft,iM as G,go as Gn,nt as Gr,HE as Gt,Qj as H,io as Hn,Ut as Hr,iD as Ht,Xj as I,Lo as In,zn as Ir,BD as It,uj as J,Ha as Jn,tt as Jr,zE as Jt,dj as K,xo as Kn,kn as Kr,UE as Kt,Vj as L,Oo as Ln,Je as Lr,zD as Lt,lM as M,qo as Mn,In as Mr,pk as Mt,Aj as N,Wo as Nn,Ln as Nr,Ak as Nt,dM as O,of as On,tr as Or,YO as Ot,jj as P,Bo as Pn,B as Pr,Wk as Pt,yj as Q,Wa as Qn,On as Qr,_T as Qt,Kj as R,ho as Rn,qe as Rr,ND as Rt,Tj as S,Qb as Sn,H as Sr,QO as St,HM as T,Hf as Tn,Xn as Tr,kk as Tt,qj as U,oo as Un,et as Ur,rD as Ut,Zj as V,ao as Vn,Ye as Vr,eD as Vt,Wj as W,no as Wn,En as Wr,qE as Wt,Sj as X,Ya as Xn,Mn as Xr,qT as Xt,bj as Y,Xa as Yn,Nn as Yr,GT as Yt,fj as Z,eo as Zn,An as Zr,vT as Zt,QM as _,c as _i,_x as _n,q as _r,UD as _t,oN as a,Ee as ai,Ox as an,za as ar,PA as at,aM as b,o as bi,Xb as bn,X as br,XO as bt,JM as c,ee as ci,Sx as cn,ji as cr,lA as ct,YM as d,l as di,jx as dn,Y as dr,DA as dt,_e as ei,$w as en,Ba as er,ZA as et,cN as f,u as fi,mx as fn,V as fr,hA as ft,$M as g,v as gi,Px as gn,_r as gr,qk as gt,GM as h,g as hi,xx as hn,W as hr,Gk as ht,sN as i,we as ii,Ax as in,$a as ir,KA as it,$j as j,Ts as jn,$n as jr,Pk as jt,Pj as k,Os as kn,nr as kr,jk as kt,ZM as l,te as li,Nx as ln,li as lr,uA as lt,XM as m,_ as mi,Mx as mn,ir as mr,Kk as mt,KM as n,Te as ni,bx as nn,Qa as nr,ej as nt,lN as o,b as oi,kx as on,Va as or,fA as ot,tN as p,h as pi,Dx as pn,J as pr,Jk as pt,cj as q,po as qn,Ft as qr,BE as qt,nN as r,Ce as ri,vx as rn,Ua as rr,tj as rt,rN as s,y as si,px as sn,Ja as sr,dA as st,qM as t,ae as ti,zx as tn,Ga as tr,YA as tt,WM as u,k as ui,Ex as un,wr as ur,gA as ut,aN as v,i as vi,hx as vn,K as vr,WD as vt,Hj as w,_g as wn,Bn as wr,yk as wt,Oj as x,n as xi,ex as xn,U as xr,ek as xt,wj as y,a as yi,gx as yn,gr as yr,Nk as yt,Uj as z,mo as zn,Lt as zr,nD as zt};