cozyclay 3.0.3 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +93 -0
- package/INSTALL_FOR_AGENTS.md +146 -0
- package/README.md +74 -192
- package/THIRD_PARTY_NOTICES.md +0 -21
- package/bin/agent/agent-routes.mjs +29 -62
- package/bin/agent/agent-runner.mjs +5 -3
- package/bin/agent/main-agent.mjs +70 -0
- package/bin/agent/main-prompt.mjs +17 -0
- package/bin/agent/plan-tool.mjs +114 -0
- package/bin/agent/script-tool.mjs +2 -0
- package/bin/agent/sculpt-sketch.mjs +190 -0
- package/bin/agent/session-store.mjs +4 -3
- package/bin/agent/sketch-code.mjs +151 -0
- package/bin/agent/sketch-sandbox.mjs +102 -0
- package/bin/agent/studio-prompt.mjs +1 -1
- package/bin/agent/studio-task-routes.mjs +185 -0
- package/bin/agent/studio-tasks.mjs +156 -0
- package/bin/agent/studio-tools.mjs +3 -2
- package/bin/agent/studio-turn-transaction.mjs +76 -0
- package/bin/agent/turn-frames.mjs +4 -0
- package/bin/cozyclay.mjs +5 -7
- package/dist/app/index.html +7 -6
- package/dist/assets/TaskBoard-ngdqiu7u.js +1 -0
- package/dist/assets/app-BlwOpest.css +1 -0
- package/dist/assets/app-DmR7jBkz.js +5144 -0
- package/dist/assets/compile-worker-D0pKioa0.js +5 -0
- package/dist/assets/landing-y3EqDgSZ.js +1 -0
- package/dist/assets/modulepreload-polyfill-P2Xu9kJm.js +1 -0
- package/dist/assets/motion3-compile-BB3_1-EB.js +1 -0
- package/dist/assets/scene-asset-sync-CBx7XRti.css +1 -0
- package/dist/assets/scene-asset-sync-Cgdtr1Yw.js +13 -0
- package/dist/assets/task-board-ErQvfoaz.js +14 -0
- package/dist/assets/workflow-zQM-EKW1.js +179 -0
- package/dist/assets/x-bot-tpose-body-BusyR3eg.json +1 -0
- package/dist/assets/y-bot-tpose-body-Dy1VKChZ.json +1 -0
- package/dist/cozyclay-package.json +1 -1
- package/dist/greybox-to-video/index.html +2 -3
- package/dist/index.html +7 -57
- package/dist/llms.txt +2 -1
- package/dist/previs-software/index.html +2 -2
- package/dist/privacy/index.html +3 -7
- package/dist/seedance-camera-control/index.html +2 -2
- package/dist/sitemap.xml +5 -5
- package/dist/sw.js +5 -1
- package/dist/thumbs/blank-stage-dark.webp +0 -0
- package/dist/thumbs/blank-stage-light.webp +0 -0
- package/dist/workflow/index.html +5 -4
- package/mcp/mesh-file.mjs +3 -1
- package/mcp/server.mjs +3 -0
- package/mcp/tool-handlers.mjs +2 -2
- package/package.json +5 -3
- package/src/App.jsx +51 -282
- package/src/analytics.js +3 -148
- package/src/app-stage.jsx +1 -1
- package/src/asset-pane.jsx +5 -10
- package/src/auto-flat.js +10 -0
- package/src/bus-tasks.js +11 -5
- package/src/command-bus.js +1 -1
- package/src/commands/elements.js +4 -3
- package/src/commands/motion3-compile.js +51 -27
- package/src/commands/motion3.js +3 -3
- package/src/commands/objects.js +1 -1
- package/src/commands/project.js +1 -1
- package/src/commands/shot.js +16 -4
- package/src/controls.jsx +0 -11
- package/src/cuts.js +11 -0
- package/src/domains/cast.js +3 -2
- package/src/domains/motion.js +3 -10
- package/src/domains/playback.js +32 -0
- package/src/domains/scenes.js +3 -22
- package/src/domains/shots.js +5 -5
- package/src/dualview.jsx +11 -15
- package/src/hierarchy-panel.css +18 -4
- package/src/hierarchy-panel.jsx +12 -11
- package/src/kits/held.js +3 -2
- package/src/light-blockers.js +2 -2
- package/src/main.jsx +5 -0
- package/src/material-look.js +189 -0
- package/src/material-presets.js +78 -0
- package/src/material-textures.js +157 -0
- package/src/motion/ground.js +5 -14
- package/src/motion/playback-frame-store.js +79 -0
- package/src/motion/playback-probe.js +16 -0
- package/src/motion/playback-subject.js +7 -0
- package/src/motion/timeline.css +43 -5
- package/src/motion/timeline.jsx +4 -3
- package/src/motion3/body.js +37 -5
- package/src/motion3/carried.js +11 -3
- package/src/motion3/compile-job.js +1 -1
- package/src/motion3/compiler/compile.js +7 -1
- package/src/motion3/compiler/finger-close.js +137 -0
- package/src/motion3/compiler/limbs.js +18 -3
- package/src/motion3/compiler/pose.js +6 -0
- package/src/motion3/compiler/validate-objects.js +17 -2
- package/src/motion3/compiler/validate-parts.js +2 -1
- package/src/motion3/compiler/vocab.js +4 -4
- package/src/motion3/describe.js +2 -2
- package/src/motion3/fix/index.js +5 -3
- package/src/motion3/flight.js +38 -0
- package/src/motion3/free-motion.js +10 -7
- package/src/motion3/load.js +125 -0
- package/src/motion3/mass.js +23 -0
- package/src/motion3/object-keys.js +11 -6
- package/src/motion3/object-pose.js +11 -3
- package/src/motion3/pipeline.js +3 -0
- package/src/motion3/qa/explain.js +3 -1
- package/src/motion3/qa/grasp-checks.js +123 -0
- package/src/motion3/qa/hints-grasp.js +71 -0
- package/src/motion3/qa/index.js +3 -1
- package/src/motion3/qa/object-checks.js +7 -2
- package/src/motion3/qa/patch.js +2 -1
- package/src/motion3/qa/spec-checks.js +10 -1
- package/src/motion3/schema/fields.js +3 -3
- package/src/motion3/schema/topics.js +9 -8
- package/src/motion3/schema/types.js +4 -1
- package/src/motion3/seat.js +84 -0
- package/src/motion3/settle.js +11 -6
- package/src/motion3/shapes.js +70 -0
- package/src/motion3/skills/catch.js +71 -0
- package/src/motion3/skills/index.js +10 -3
- package/src/motion3/skills/info.js +13 -0
- package/src/motion3/skills/throw.js +72 -0
- package/src/object-catalog.jsx +0 -4
- package/src/object-gizmo.jsx +2 -1
- package/src/object-look.js +9 -5
- package/src/object-path.js +1 -1
- package/src/panels/ProjectPanel.jsx +42 -21
- package/src/panels/details.css +15 -4
- package/src/popover.js +37 -0
- package/src/posestudio.jsx +15 -10
- package/src/primitive-look.js +38 -0
- package/src/project-browser-art.jsx +19 -0
- package/src/project-browser.css +74 -121
- package/src/project-browser.jsx +36 -60
- package/src/props.jsx +24 -35
- package/src/render-passes.js +7 -1
- package/src/retired-kinds.js +37 -0
- package/src/scene-objects.js +5 -9
- package/src/scenes.js +4 -5
- package/src/sculpt-colours.js +65 -0
- package/src/sculpt-compare.js +13 -50
- package/src/sculpt-csg.js +112 -0
- package/src/sculpt-curve.js +123 -0
- package/src/sculpt-cutters.js +43 -0
- package/src/sculpt-detail.js +207 -0
- package/src/sculpt-geometry-loft-convex.js +100 -0
- package/src/sculpt-geometry-shapes.js +250 -0
- package/src/sculpt-geometry.js +33 -15
- package/src/sculpt-loft-rings.js +225 -0
- package/src/sculpt-noise.js +65 -0
- package/src/sculpt-part-fields.js +27 -0
- package/src/sculpt-recipe-read.js +65 -0
- package/src/sculpt-recipe.js +33 -75
- package/src/sculpt-run.js +1 -1
- package/src/sculpt-scatter-items.js +183 -0
- package/src/sculpt-scatter-shape.js +57 -0
- package/src/sculpt-scatter.js +124 -0
- package/src/sculpt-shapes-curved.js +211 -0
- package/src/sculpt-shapes-loft-convex.js +218 -0
- package/src/sculpt-shapes.js +138 -0
- package/src/sculpt-sketch-state.js +76 -0
- package/src/sculpt-sketch.jsx +124 -0
- package/src/sculpt-surface-fields.js +65 -0
- package/src/settings-menu.jsx +1 -20
- package/src/shell/BottomDock.jsx +9 -9
- package/src/shell/MenuBar.jsx +1 -9
- package/src/shell/PreferencesDialog.jsx +3 -4
- package/src/shell/ViewportToolbar.jsx +3 -3
- package/src/shell/add-camera-shot.js +11 -0
- package/src/shell/glass-regions.css +3 -2
- package/src/shell/glass.css +0 -5
- package/src/shell/lens-scrub-math.js +51 -0
- package/src/shell/lens-scrub.css +73 -0
- package/src/shell/lens-scrub.jsx +98 -0
- package/src/shell/mode.css +6 -5
- package/src/shell/preferences.css +1 -32
- package/src/shell/shell.css +18 -1
- package/src/shell/studio-shell-context.js +5 -0
- package/src/shot-frame.js +26 -0
- package/src/stage-canvas-rigs.jsx +7 -8
- package/src/stage-characters.jsx +26 -0
- package/src/stage-gizmo.js +43 -0
- package/src/stage-labels-ko.js +0 -6
- package/src/stage-startup-defaults.js +3 -9
- package/src/starter-scenes.js +5 -11
- package/src/studio-agent-commands.js +2 -2
- package/src/studio-agent-protocol.js +2 -7
- package/src/studio-app-binding.js +1 -1
- package/src/studio-elements.js +6 -2
- package/src/styles/themes.css +13 -0
- package/src/styles.css +6 -674
- package/src/text/text-object.jsx +1 -1
- package/src/ui.jsx +8 -16
- package/src/use-embed-bridge.js +3 -6
- package/src/use-render-activity.js +3 -1
- package/src/view-ghosts.jsx +5 -3
- package/src/viewport-visible-rect.js +37 -0
- package/src/workflow/AgentPanel.jsx +79 -46
- package/src/workflow/AgentPlanCard.jsx +41 -0
- package/src/workflow/AgentProgressCard.jsx +1 -1
- package/src/workflow/TaskBoard.jsx +102 -0
- package/src/workflow/TaskInline.jsx +114 -0
- package/src/workflow/agent-client.js +25 -36
- package/src/workflow/agent-panel.css +14 -1
- package/src/workflow/agent-plan.css +93 -0
- package/src/workflow/agent-plan.js +59 -0
- package/src/workflow/attachment-image.js +10 -3
- package/src/workflow/attachment-video.js +91 -0
- package/src/workflow/task-board.css +98 -0
- package/src/workflow/task-board.js +169 -0
- package/tools/check-eslint.mjs +2 -1
- package/tools/check-knip.mjs +2 -1
- package/tools/dev/pages/greybox-to-video.html +2 -3
- package/tools/dev/pages/previs-software.html +2 -2
- package/tools/dev/pages/privacy.html +3 -7
- package/tools/dev/pages/seedance-camera-control.html +2 -2
- package/tools/dev-full.mjs +11 -2
- package/tools/eslint-baseline.json +6 -6
- package/tools/knip-baseline.json +0 -11
- package/tools/loc-baseline.json +30 -31
- package/tools/metrics-snapshot.mjs +43 -5
- package/tools/render-start-thumbs.mjs +175 -0
- package/tools/run-tests.mjs +10 -17
- package/tools/sitemap.mjs +1 -1
- package/dist/assets/analytics-BibyE5ar.js +0 -6
- package/dist/assets/app-DhRJ-PBz.js +0 -5088
- package/dist/assets/app-f-fkV5uP.css +0 -1
- package/dist/assets/compile-worker-DqiA4AaN.js +0 -5
- package/dist/assets/first-shot-handoff-Qx7SKl38.js +0 -1
- package/dist/assets/landing-DYg87MDY.js +0 -1
- package/dist/assets/scene-asset-sync-DBYQBR0T.js +0 -20
- package/dist/assets/scene-asset-sync-_S8NQl5B.css +0 -1
- package/dist/assets/workflow-BSA22Ofr.js +0 -179
- package/dist/scenes/city-block.cclayproject +0 -1
- package/src/burn-in.js +0 -91
- package/src/camera-tutorial.jsx +0 -520
- package/src/facing-marks.js +0 -88
- package/src/first-shot-handoff.js +0 -44
- package/src/panels/motion.css +0 -197
- package/src/set-pieces.jsx +0 -183
- package/src/tutorial-analytics.js +0 -86
- package/src/tutorial-walk.js +0 -17
- package/src/use-camera-tutorial.js +0 -50
- package/src/use-semantic-state.js +0 -12
- package/tools/metrics/archive-traffic.mjs +0 -138
- package/tools/perf/ik-camera-drag.mjs +0 -138
|
@@ -0,0 +1,14 @@
|
|
|
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.4 for a ghost or water; for a glass object use object.material glass`},{path:`object.material`,type:`enum`,sparse:!0,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,enum:[`clay`,`wood`,`straw`,`stone`,`brick`,`concrete`,`metal`,`glass`,`ceramic`,`plastic`,`rubber`,`fabric`,`paper`,`foliage`],note:`cube/sphere/capsule/cylinder/cone/plane only: surface preset with real texture and shine; color stays the tint and a grey (#c2c6c8) object takes the preset's own colour. clay is the default matte look; wood (planks, furniture), straw (thatch, hay, wicker), stone, brick (walls, chimneys), concrete (plaster, pavement), metal (reflects the stage), glass (clear, see-through; tint with color), ceramic (glazed), plastic, rubber (tyres), fabric (cloth, upholstery), paper, foliage (leaves, hedges)`},{path:`object.finish`,type:`enum`,sparse:!0,persisted:!0,undoDomain:`objects`,normalizer:`normalizeSceneObject`,enum:[`matte`,`satin`,`gloss`],note:`with object.material: overrides the preset's shine, e.g. metal + gloss = chrome, glass + matte = frosted, wood + gloss = varnished`},{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}),at=e=>({oneOf:[e,{type:`null`}]}),I=(e,t,n=0,r=!1)=>({type:`array`,items:e,minItems:n,maxItems:t,...r?{uniqueItems:r}:{}}),L=(e,t={})=>({type:`object`,properties:{...e,...t},required:Object.keys(e),additionalProperties:!1}),ot=(...e)=>({oneOf:e}),st={type:`object`,properties:{},required:[],additionalProperties:!0},R={...it(),pattern:`^[A-Za-z0-9][A-Za-z0-9._:-]*$`},ct={...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}$`},lt=L({x:j(),y:j(),z:j()}),ut={type:`number`,exclusiveMinimum:0},dt=L({x:ut,y:ut,z:ut}),ft={...L({startFrame:M(),endFrameExclusive:M(1)}),"x-studio-range":!0},pt=(e=100,t=1)=>I(R,e,t,!0),mt=it(120),ht={...it(120),description:`Object id, or the name of a part created EARLIER in this ops list (create it first).`},gt={workspaceId:R,documentEpoch:R,sceneId:R,sceneEpoch:R},_t=L(gt),vt=L({surface:P(`studio`),...gt,workspaceHandle:at(R)}),yt=L({scene:M(),physics:M(),view:M()}),bt=at(L({kind:F($e.selectionKinds),id:R},{hierarchyId:R})),xt=L({mode:F($e.modes),frame:M(),playing:N,lookThrough:N,grid:N,autoColor:N}),St=ot(L({world:lt}),L({relativeTo:ht,basis:F($e.positionBases),side:F($e.positionSides),gapM:j(0),support:ot(P(`floor`),L({objectId:ht}))}),L({between:I(ht,2,2,!0),fraction:j(0,1),support:P(`floor`)}),L({onObject:ht},{offsetXZ:L({x:j(),z:j()})})),Ct=ot(L({yawDeg:j()}),L({towardId:ht}),L({sameAsId:ht}),L({awayFromId:ht})),wt=ot(L({intent:L({size:F($e.framingSizes),view:F($e.framingViews),level:F($e.framingLevels),side:F($e.framingSides)},{focalMm:ut})}),L({exact:L({position:lt,lookAt:lt,focalMm:ut})})),Tt={...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.`},Et=ot(L({op:P(`create`),source:L({kind:R}),position:St},{name:mt,facing:Ct,scale:dt,rotationDeg:{...lt,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:{...mt,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:Tt}),L({op:P(`update`),id:R},{position:St,facing:Ct,rotationDeg:lt,scale:dt,color:it(32),name:mt,hidden:N,space:Tt}),L({op:P(`remove`),id:R}),L({op:P(`group`),parentId:R,childIds:pt()}),L({op:P(`ungroup`),childIds:pt()})),Dt=ot(L({op:P(`create`),name:mt,position:St},{facing:Ct,scale:ut}),L({op:P(`update`),characterId:R},{position:St,facing:Ct,scale:ut,name:mt,hidden:N}),L({op:P(`remove`),characterId:R})),Ot={...it(2097152),pattern:`^data:image/[A-Za-z0-9.+-]+[;,]`},kt=L({frame:M(),framing:L({pos:lt,yaw:j(),pitch:j(),fovDeg:j(1,179)})},{id:R}),At=ot(j(0,1),L({t:j(0,1)},{bank:j(-90,90),pitch:j(-90,90)})),jt=at(L({points:I(lt,64,2)},{speed:j(0,50),faceTravel:N,loop:N,extend:N,marks:I(At,6)})),Mt=L({},{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:at(lt)}),Nt=at(L({},{color:{...it(32),pattern:`^#[0-9a-fA-F]{6}$`},intensity:j(0,20),halo:j(0,4)})),Pt=at(st),Ft={"character.pose":at(R),"character.identityImage":at(Ot),"object.light":Mt,"object.glow":Nt,"object.grasp":Pt,"object.effect":ie,"object.text":ve,"object.parent":at(R),"object.path":jt,"stage.environmentImage":at(Ot),"shot.cameraKeys":I(kt,64),"shot.targetModel":at(R)};function It(e){if(Object.hasOwn(Ft,e.path))return Ft[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 R;if(e.type===`color`)return{...it(32),pattern:`^#[0-9a-fA-F]{6}$`};if(e.type===`image`)return at(Ot);if(e.type===`vec3`){let{min:t,max:n}=e;return t&&typeof t==`object`&&n&&typeof n==`object`?L({x:j(t.x,n.x),y:j(t.y,n.y),z:j(t.z,n.z)}):lt}return e.type===`string`?it(240):null}function Lt(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 Rt=nt(Lt(i));function zt(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=It(t);e&&(r[t.path.slice(n.length+1)]=e)}t[n]={type:`object`,properties:r,required:[],additionalProperties:!1}}return t}var Bt=nt(zt(i)),Vt=nt(Object.fromEntries(Qe.map(e=>[e,Object.keys(Bt[e].properties).map(t=>`${e}.${t}`)]))),Ht=ot(L({target:L({kind:P(`character`),id:R}),set:Bt.character}),L({target:L({kind:P(`object`),id:R}),set:Bt.object}),L({target:L({kind:P(`shot`)},{id:R}),set:Bt.shot}),L({target:L({kind:P(`stage`)}),set:Bt.stage})),Ut={inspect_studio:L({scope:F($e.inspectionScopes)},{ids:pt(32),select:pt(32),query:mt,cursor:it(512),limit:{...M(1,32),default:12}}),operate_studio:L({},{selection:bt,shotId:R,frame:M(),playing:N,mode:F($e.modes),view:L({},{lookThrough:N,grid:N,autoColor:N})}),arrange_objects:L({ops:{...I(Et,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:L({ops:I(Dt,8,1)}),patch_elements:L({ops:I(Ht,32,1)}),frame_shot:L({subjectIds:pt(1),framing:wt},{shotId:R,caption:{type:`string`,maxLength:500},keyAtFrame:M()}),verify_result:L({checks:{...I(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:R,targets:pt(),range:ot(P(`whole_clip`),ft),visual:{...F([`none`,`frame`,`contact_sheet`,`plan`,`trace`]),default:`none`},frames:{...ot(F([`even`,`beats`]),I(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:{...I(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:{...ot(it(120),I(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:{...ot(it(120),I(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:L({receiptId:R}),run_action:L({action:R},{args:st,confirmationToken:R})},Wt=nt(Ut),Gt=nt(Ze.map(e=>({name:e,slice:1,parameters:Ut[e]}))),Kt=L({min:lt,max:lt}),qt=L({id:R,kind:F([`object`,`character`,`rig`]),token:R},{name:mt,detailsOmitted:N,position:lt,yawDeg:j(),rotationDeg:lt,scale:ot(ut,dt),bounds:at(Kt),libraryKind:R,renderer:R,color:at(it(32)),tint:at(it(32)),modelId:at(it(120)),assetId:R,parentId:at(R),attachment:at(L({characterId:R,bone:at(R)})),pathPointCount:M(0,64),pathMarks:I(ot(j(0,1),L({t:j(0,1)},{bank:j(-90,90),pitch:j(-90,90)})),6),local:L({position:lt,rotationDeg:lt}),motion:L({takeId:at(R),frames:M(),ikKeyCount:M()},{poseId:at(R),keyIds:pt(8,0)}),capabilities:L({rigReady:N,ik:N,measuredFeet:N}),characterKind:F([`rig`,`proxy`]),posture:F(Ke)}),Jt=L({id:R,kind:F([`object`,`character`,`rig`])},{name:mt,position:lt}),Yt=L({id:R},{label:mt,generation:P(`motion`),timeoutMs:M(1,3e5)}),Xt=L({id:R,name:mt,range:ft,keyCount:M()},{subjectIds:pt(24,0),kind:F([`clip`,`still`]),caption:it(500)}),Zt=L({id:R,name:mt,range:ft,mode:F($e.shotModes)},{subjectIds:pt(24,0),kind:F([`clip`,`still`]),caption:it(500)}),Qt=L({position:lt,lookAt:lt,focalMm:ut,sensorId:R,slate:mt}),$t=F([`primitive`,`set-piece`,`image`,`mesh`]),en=ot(L({kind:R,name:mt,type:$t}),L({id:R,name:mt,type:$t})),tn=L({id:R,characterId:R,state:F($e.jobStates)},{targetIds:pt(24,0),progress:at(j(0,1)),phase:mt}),nn=L({schema:P(`studio-context-v1`),host:vt,revision:yt,units:L({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:L({name:mt,aspect:it(40),floorY:j(),frameCount:M(),objectCount:M(),characterCount:M()},{previsMode:F(Ge)}),selection:bt,activeCharacterId:at(R),view:xt,shot:at(Zt),camera:at(Qt),entities:I(qt,24),entityPage:L({returned:M(0,24),total:M(),truncated:N,nextCursor:at(it(512))}),shots:I(Xt,8),shotsTruncated:N,assets:I(en,Je.assets),recentReceipts:I(L({id:R,summary:mt,canUndoDirect:N}),3),jobs:I(tn,8),capabilities:L({profile:P(`studio-slice-1`),tools:I(F(Ze),Ze.length,0,!0)},{rigReady:N,cameraReady:N,bridgeReady:N,storyboard:N})},{entityIndex:I(Jt,Je.entityIndex),actionIndex:I(Yt,512)}),rn=L({...gt,targetId:R,token:R}),an=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`,`ultra`],on=L({dataUrl:{...it(6e6),pattern:`^data:image/(png|jpeg|webp);base64,`}},{name:it(120)}),sn=L({surface:P(`studio`),sessionId:ct,turnId:ct,text:it(16e3),context:nn},{model:it(120),effort:F(an),attachFrame:N,attachments:I(on,4,1),supervisor:N}),cn=L({surface:P(`studio`),sessionId:ct,turnId:ct},{jobId:R}),ln=L({before:M(),after:M()}),un=L({historyEntryId:R,entries:P(1),canUndoDirect:N}),dn=L({characterId:R,beforeTakeId:at(R),takeId:R,targetToken:R,frameCount:M(1),fps:P(24),durationSeconds:ut,blocks:I(L({sourceBeat:M(0,7),startFrame:M(),endFrameExclusive:M(1)}),120,1),selectionChanged:P(!1)}),fn=L({id:R,status:F([`verified`,`unverified`]),profile:P(`studio-motion-v1`),range:ft,evaluatedFrames:M(),physicsRevision:M(),limitations:I(mt,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`])}),pn=L({path:it(120)},{number:j(),text:at(it(512)),flag:N,vec:lt,count:M(),bytes:M()}),mn=L({},{position:lt,yawDeg:j(),rotationDeg:lt,scale:ot(ut,dt),name:mt,color:it(32),hidden:N,modelId:R,renderer:R,parentId:at(R),childIds:pt(100,0),childCount:M(0),bounds:at(Kt),removed:N,range:ft,camera:Qt,keyId:R,frame:M(),subjectIds:pt(24,0),selection:bt,activeCharacterId:at(R),shotId:at(R),view:xt,token:R,takeId:at(R),statureM:ut,patched:I(pn,32,1)}),hn=[`left`,`right`,`on-axis`],gn=L({coverage:mt},{relationSatisfied:N,overlapIds:pt(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:mt,baseY:j(),facesTargetId:R,cameraSide:F(hn),axisConsistent:N,evaluatedFrames:M(1),sampledFrames:I(M(),64,1),sampledChecks:I(L({frame:M(),screenFraction:j(),clipped:N,behindCamera:N,occluded:N}),64,1),issueFrames:I(L({frame:M(),codes:I(mt,4,1),screenFraction:j()}),64,0)}),_n=L({subjects:I(L({id:R,position:lt,yawDeg:j()}),24),pairs:I(L({a:R,b:R,distanceM:j(0)}),24),shots:I(L({shotId:R,subjectIds:pt(2,0),camera:at(L({position:lt,lookAt:lt})),cameraSide:at(F(hn)),occluders:I(L({subjectId:R,byObjectId:R}),8)}),8),axisConsistent:at(N)}),vn=L({code:R},{id:R,message:mt,suggestedOutwardDeltaM:j(),count:M()}),yn={ok:P(!0),commandId:R,receiptId:R,host:_t,status:F($e.receiptStatuses),authored:N,revision:ln,affectedIds:pt(100,0),delta:I(L({id:R,after:mn}),8),checks:gn,undo:at(un),warnings:I(vn,12)},bn={counts:L({created:M(),updated:M(),deleted:M()}),detailCursor:at(it(512))},xn=I(L({index:M(),status:F($e.opStatuses)},{droppedPaths:I(it(120),32,1)}),32,1),Sn={...yn,authored:P(!0),undo:un},Cn={action:R,summary:it(240)},wn={completed:L({...yn,status:P(`completed`),kind:F([`job`,`document`,`transaction`,`mutation`])},{...Cn,...bn,output:st,jobId:R,txId:R,nextHost:_t,ops:xn}),started:L({...yn,status:P(`started`),kind:P(`job`),jobId:R,authored:P(!1),undo:P(null)},{...Cn}),applied:L({...Sn,status:P(`applied`)},{mutated:P(!0),ops:xn,...bn,...Cn}),partial:L({...Sn,status:P(`partial`),ops:xn},{mutated:P(!0),...bn}),noop:L({...yn,status:P(`noop`),authored:P(!1),mutated:P(!1),undo:P(null)},{ops:xn,...Cn}),transient:L({...yn,status:P(`transient`),authored:P(!1),view:ln,undo:P(null)},{mutated:N,...Cn}),installed:L({...Sn,status:P(`installed`),jobId:R,artifactId:R,installed:dn,verification:fn},{mutated:P(!0),explicitUnverifiedAcceptance:N,acceptance:P(`advisory-policy`),...bn}),undone:L({...Sn,status:P(`undone`),undoneReceiptId:R,restoredTargets:I(rn,100,1)},{mutated:P(!0),...bn})},Tn=ot(...Object.values(wn)),En=L({ok:P(!1),commandId:R,host:_t,code:F(s),phase:F([`admission`,`execution`,`prepare`,`verify`,`repair`,`commit`,`reconcile`,`undo`]),affectedIds:pt(100,0),expectedTargets:I(rn,24),currentTargets:I(rn,24),mutated:ot(N,P(`unknown`)),preserved:L({authoredState:F([`unchanged`,`changed`,`unknown`])}),recovery:L({action:F([`none`,`inspect`,`retry`,`new_intent`,`reconcile`,`sign_in`])},{retryAllowed:N})},{message:it(500),jobId:R,txId:R,candidates:I(L({id:R,kind:F([`object`,`character`,`rig`]),position:at(lt)}),5)}),Dn=nt({catalogue:Gt,variants:$e,Vec3:lt,FrameRange:ft,PositionSpec:St,FacingSpec:Ct,ObjectOp:Et,CharacterOp:Dt,Framing:wt,Identity:_t,Host:vt,TargetGuard:rn,Entity:qt,ShotSummary:Xt,StudioContextV1:nn,StudioTurn:sn,StudioStop:cn,Receipt:Tn,ReceiptVariants:wn,Failure:En,GeometryFacts:_n});function On(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(On(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]=On(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)=>On(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 kn=e=>On(_t,e,`INVALID_IDENTITY`);function An(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 jn(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=On(nn,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 An(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 Mn(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(Bt[e].properties,t)||A(`INVALID_ARGUMENT`,`Unknown ${e} path "${e}.${t}". Valid ${e} paths: ${Vt[e].join(`, `)}.`)}}t.size>1&&A(`INVALID_ARGUMENT`,`One domain per patch: split character, object, shot and stage edits into separate commands.`)}function Nn(e){(!rt(e)||!Ze.includes(e.name))&&A(`UNKNOWN_TOOL`,`Unsupported Studio tool.`),e.name===`patch_elements`&&Mn(e.args);let{args:t}=On(L({name:F(Ze),args:Ut[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 Pn(e){if(e?.ok===!1){let t=On(En,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=On(Tn,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(gt).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 Fn=`cozyclay.locale`;function In(){try{let e=localStorage.getItem(Fn);return e===`ko`||e===`en`?e:null}catch{return null}}var Ln=In()??`en`,Rn=Ln===`ko`,zn=In()!==null;function z(e,t){return Rn?t:e}function Bn(e){if(e===`ko`||e===`en`){try{localStorage.setItem(Fn,e)}catch{}window.location.reload()}}var Vn=.02,Hn=(e,t,n)=>Math.min(n,Math.max(t,e)),Un=(e,t=0)=>typeof e==`number`&&Number.isFinite(e)?e:t;function Wn(e){let t=0;for(let n=0;n<e.length-1;n+=1)t+=(e[n]+e[n+1])/2;return t}function Gn(e,t){let n=Hn(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 Kn(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]=Gn(e,r/(t-1));return n}function qn(e){let t=e.map(e=>Math.max(0,Un(e,0))),n=Wn(t)/(t.length-1);return n<=1e-9?t.map(()=>1):t.map(e=>e/n)}function Jn(e){return e.every(e=>Math.abs(e-1)<1e-6)}function Yn(){return{cuts:[],envelopes:[Array(24).fill(1)]}}function Xn(e){return!e||e.cuts.length===0&&e.envelopes.every(Jn)}function Zn(e){if(!e||typeof e!=`object`)return null;let t=Array.isArray(e.cuts)?e.cuts:[],n=[];for(let e of t){let t=Un(e?.t,NaN),r=Un(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=>Un(e,1)):[];i.push(qn(Kn(t.length>=2?t:[1,1])))}return{cuts:n,envelopes:i}}function Qn(e,t,n,r=.18){let i=e.length,a=Math.max(0,Un(n,0)),o=Hn(Un(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 $n(e,t){let n=e.length,r=Wn(e);if(r<=1e-9)return Hn(t,0,1);let i=Hn(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 er(e,t){let n=Hn(Un(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)*$n(e.envelopes[i],c)}function tr(e,t,n){let r=Array(24);for(let i=0;i<24;i+=1)r[i]=Gn(e,t+(n-t)*(i/23));return r}function nr(e,t){let n=e??Yn(),r=Un(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=er(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),qn(tr(l,0,c)),qn(tr(l,c,1)),...n.envelopes.slice(a+1)]}}function rr(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=Gn(u,o>1e-9?t/o:0);f[e]=s/Math.max(1e-9,o)*n}else{let n=Gn(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),qn(f),...e.envelopes.slice(t+2)]}}var ir=e=>{let t=Math.round(e*1e4)/1e4;return t===0?0:t},ar=e=>typeof e==`number`&&Number.isFinite(e),B=class extends Error{constructor(e,t){super(`${e}: ${t}`),this.path=e}};function or(e,t,n,r){if(e===void 0&&n)return[...n];if(!Array.isArray(e)||e.length!==3||!e.every(ar))throw new B(t,`must be three numbers [x, y, z], got ${JSON.stringify(e)}`);return e.forEach((e,n)=>r(e,`${t}[${n}]`)),e.map(ir)}function sr(e,t,n,r,i){if(e===void 0)return n;if(!ar(e)||e<r||e>i)throw new B(t,`must be a number from ${r} to ${i}, got ${JSON.stringify(e)}`);return ir(e)}function cr(e,t,n,r,i){if(e===void 0&&n!==void 0)return n;if(!Number.isInteger(e)||e<r||e>i)throw new B(t,`must be a whole number from ${r} to ${i}, got ${JSON.stringify(e)}`);return e}var lr=(e,t)=>cr(e,t,0,0,999999);function ur(e,t,n,r){if(e===void 0&&n!==void 0)return n;if(!r.includes(e))throw new B(t,`must be one of ${r.join(`, `)}; got ${JSON.stringify(e)}`);return e}var dr=/^#?([0-9a-f]{3})$/i,fr=/^#?([0-9a-f]{6})$/i;function pr(e,t){let n=typeof e==`string`?e.trim():``,r=dr.exec(n);if(r)return`#${r[1].toLowerCase().replace(/./g,e=>e+e)}`;let i=fr.exec(n);if(i)return`#${i[1].toLowerCase()}`;throw new B(t,`colour must be #rgb or #rrggbb, got ${JSON.stringify(e)}`)}var mr=48,hr=6,gr=8,_r=6,vr=Math.cos(Math.PI/6),yr=(e,t,n)=>[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n],br=(e,t)=>Math.hypot(t[0]-e[0],t[1]-e[1]);function xr(e){let t=0;for(let n=0;n<e.length;n+=1){let r=e[n],i=e[(n+1)%e.length];t+=r[0]*i[1]-i[0]*r[1]}return t}function Sr(e){let t=0,n=0;for(let r=0;r<e.length;r+=1){let i=e[r],a=e[(r+1)%e.length],o=i[0]*a[1]-a[0]*i[1];t+=(i[0]+a[0])*o,n+=(i[1]+a[1])*o}let r=xr(e);return[t/(3*r),n/(3*r)]}function Cr(e){let t=e.filter((t,n)=>n===0||br(t,e[n-1])>1e-9);for(;t.length>1&&br(t[0],t.at(-1))<=1e-9;)t.pop();return t}function wr({w:e,d:t,x:n,z:r,roundness:i}){let a=e/2,o=t/2,s=i*Math.min(a,o),c=s>0?_r:0,l=[];for(let[e,t,i]of[[a-s,o-s,0],[s-a,o-s,1],[s-a,s-o,2],[a-s,s-o,3]])for(let a=0;a<=c;a+=1){let o=(i+(c?a/c:.5))*(Math.PI/2);l.push([n+e+s*Math.cos(o),r+t+s*Math.sin(o)])}return l}function Tr(e){let t=e.length,n=[];for(let r=0;r<t;r+=1){let i=e[(r-1+t)%t],a=e[r],o=e[(r+1)%t],s=e[(r+2)%t],c=Math.sqrt(br(a,o)),l=Math.sqrt(br(i,a)),u=Math.sqrt(br(o,s));c<1e-4&&(c=1),l<1e-4&&(l=c),u<1e-4&&(u=c);let d=e=>{let t=((a[e]-i[e])/l-(o[e]-i[e])/(l+c)+(o[e]-a[e])/c)*c,n=((o[e]-a[e])/c-(s[e]-a[e])/(c+u)+(s[e]-o[e])/u)*c;return[a[e],t,-3*a[e]+3*o[e]-2*t-n,2*a[e]-2*o[e]+t+n]},f=d(0),p=d(1);for(let e=0;e<gr;e+=1){let t=e/gr;n.push([f[0]+t*(f[1]+t*(f[2]+t*f[3])),p[0]+t*(p[1]+t*(p[2]+t*p[3]))])}}return n}var Er=(e,t)=>[Math.min(...e.map(e=>e[t])),Math.max(...e.map(e=>e[t]))];function Dr(e,t){let n=[0,1].map(n=>[Er(e,n),Er(t,n)]);return e.map(e=>e.map((e,t)=>{let[[r,i],[a,o]]=n[t];return i-r>1e-12?a+(e-r)*(o-a)/(i-r):e}))}function Or(e){let t=Sr(e)[0],n=null;for(let r=0;r<e.length;r+=1){let i=e[r],a=e[(r+1)%e.length];if((i[0]-t)*(a[0]-t)>0)continue;let o=i[0]===a[0]?0:(t-i[0])/(a[0]-i[0]),s=i[1]+(a[1]-i[1])*o;(!n||s>n.z)&&(n={i:r,t:o,z:s})}return n?Cr([yr(e[n.i],e[(n.i+1)%e.length],n.t),...e.slice(n.i+1),...e.slice(0,n.i+1)]):e}function kr(e,t){let n=e.length,r=[0,1].map(t=>Math.max(1e-9,Er(e,t)[1]-Er(e,t)[0])),i=e.map((t,i)=>Math.hypot((e[(i+1)%n][0]-t[0])/r[0],(e[(i+1)%n][1]-t[1])/r[1])),a=i.reduce((e,t)=>e+t,0),o=[],s=0,c=0;for(let r=0;r<t;r+=1){let l=r/t*a;for(;s<n-1&&c+i[s]<l;)c+=i[s++];o.push(yr(e[s],e[(s+1)%n],i[s]>0?Math.min(1,(l-c)/i[s]):0))}let l=new Set;return c=0,e.forEach((r,s)=>{let u=e[(s-1+n)%n],d=e[(s+1)%n],f=((r[0]-u[0])*(d[0]-r[0])+(r[1]-u[1])*(d[1]-r[1]))/(br(u,r)*br(r,d)),p=Math.round(c/a*t)%t;f<vr&&!l.has(p)&&(l.add(p),o[p]=r),c+=i[s]}),o}function Ar(e,t){let n=e.points??wr(e),r=Cr(e.points&&t?Dr(Tr(n),n):n);return xr(r)>0&&(r=r.slice().reverse()),kr(Or(r),mr)}function jr(e,t){let n=e.length,r=t.slice(1).map((n,r)=>(n-t[r])/(e[r+1]-e[r])),i=t.map((e,t)=>t===0?r[0]:t===n-1?r[n-2]:r[t-1]*r[t]<=0?0:(r[t-1]+r[t])/2);return r.forEach((e,t)=>{if(e===0){i[t]=0,i[t+1]=0;return}let n=i[t]/e,r=i[t+1]/e,a=n*n+r*r;a>9&&(i[t]=3*n*e/Math.sqrt(a),i[t+1]=3*r*e/Math.sqrt(a))}),i}function Mr(e,t,n,r,i,a,o){let s=t-e,c=(o-e)/s,l=c*c,u=l*c;return(2*u-3*l+1)*n+(u-2*l+c)*s*i+(-2*u+3*l)*r+(u-l)*s*a}function Nr(e){let[t,n,r]=e.size,i=e.sections.map(e=>e.y),a=e.sections.map(t=>Ar(t,e.smooth)),o=[],s=[];if(!e.smooth)a.forEach((e,t)=>{s.push(o.length),o.push({y:i[t],ring:e})});else{let e=a[0].map((e,t)=>[0,1].map(e=>jr(i,a.map(n=>n[t][e]))));for(let t=0;t<i.length&&(s.push(o.length),o.push({y:i[t],ring:a[t]}),t!==i.length-1);t+=1)for(let n=1;n<hr;n+=1){let r=i[t]+(i[t+1]-i[t])*n/hr;o.push({y:r,ring:a[t].map((n,o)=>[0,1].map(n=>Mr(i[t],i[t+1],a[t][o][n],a[t+1][o][n],e[o][n][t],e[o][n][t+1],r)))})}}return{rings:o.map(({y:e,ring:i})=>i.map(([i,a])=>[i*t,(e-.5)*n,a*r])),at:s}}var Pr=[2,12],Fr=[3,24],Ir=[4,48],Lr=[6,40],Rr=16,zr=.25,Br=.02,Vr=2147483647;function Hr(e,t,n,r){if(!ar(e)||e<n||e>r)throw new B(t,`must be a number from ${n} to ${r}, got ${JSON.stringify(e)}`);return ir(e)}function Ur(e,t,n){if(e===void 0)return n;if(typeof e!=`boolean`)throw new B(t,`must be true or false`);return e}function Wr(e,t,[n,r],i){if(!Array.isArray(e)||e.length<n||e.length>r)throw new B(t,`must be ${n}-${r} ${i}, got ${Array.isArray(e)?e.length:JSON.stringify(e)}`);return e}function Gr(e,t,n){if(!Array.isArray(e)||e.length!==n.length||!e.every(ar))throw new B(t,`must be [${n.join(`, `)}] fractions of size, got ${JSON.stringify(e)}`);return e.map((e,n)=>Hr(e,`${t}[${n}]`,-.5,.5))}var Kr=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]);function qr(e){let t=e.length;for(let n=0;n<t;n+=1)for(let r=n+2;r<t;r+=1){if(n===0&&r===t-1)continue;let[i,a,o,s]=[e[n],e[(n+1)%t],e[r],e[(r+1)%t]];if(Kr(i,a,o)*Kr(i,a,s)<0&&Kr(o,s,i)*Kr(o,s,a)<0)return[n,r]}return null}function Jr(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new B(t,`must be { y, points } or { y, w, d }`);let n=e.points!==void 0,r=n?[`y`,`points`]:[`y`,`w`,`d`,`x`,`z`,`roundness`];for(let n of Object.keys(e))if(!r.includes(n))throw new B(`${t}.${n}`,`unknown key (a section is { y, points } or { y, w, d, x, z, roundness })`);let i=Hr(e.y,`${t}.y`,0,1);if(n){let n=Wr(e.points,`${t}.points`,Fr,`[x, z] points`).map((e,n)=>Gr(e,`${t}.points[${n}]`,[`x`,`z`])),r=qr(n);if(r)throw new B(`${t}.points`,`edges ${r[0]} and ${r[1]} cross; list the outline in order around the section`);if(Math.abs(xr(n))<1e-6)throw new B(`${t}.points`,`the outline encloses no area`);return{y:i,points:n}}let a={y:i,w:Hr(e.w,`${t}.w`,.01,1),d:Hr(e.d,`${t}.d`,.01,1)};for(let[n,r]of[[`x`,`w`],[`z`,`d`]])if(a[n]=sr(e[n],`${t}.${n}`,0,-.5,.5),Math.abs(a[n])+a[r]/2>.5+1e-9)throw new B(`${t}.${n}`,`the section reaches past the part's side: |${n}| + ${r}/2 must be at most 0.5`);return a.roundness=sr(e.roundness,`${t}.roundness`,zr,0,1),a}function Yr(e,t){let n=`${t}.sections`,r=Wr(e,n,Pr,`sections`).map((e,t)=>Jr(e,`${n}[${t}]`));if(r.forEach((e,t)=>{if(t>0&&e.y<=r[t-1].y)throw new B(`${n}[${t}].y`,`must be above the section before it (sections run bottom to top)`)}),r[0].y!==0||r.at(-1).y!==1)throw new B(n,`the first section must sit at y 0 and the last at y 1 (size[1] is the loft's full height)`);return r}function Xr(e){let t=(e,t)=>e.map((e,n)=>e-t[n]),n=(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]],r=e=>Math.hypot(...e),i=t=>Math.max(...e.map(e=>e[t]))-Math.min(...e.map(e=>e[t])),a=[1,2].reduce((e,t)=>i(t)>i(e)?t:e,0),o=e.reduce((e,t)=>t[a]<e[a]?t:e),s=t(e.reduce((e,t)=>t[a]>e[a]?t:e),o),c=e=>r(n(s,t(e,o)))/(r(s)||1),l=e.reduce((e,t)=>c(t)>c(e)?t:e),u=n(s,t(l,o));return Math.min(r(s),c(l),Math.max(...e.map(e=>Math.abs(t(e,o).reduce((e,t,n)=>e+t*u[n],0))/(r(u)||1))))}function Zr(e){let t=e>>>0;return()=>{t=t+1831565813>>>0;let e=Math.imul(t^t>>>15,t|1);return e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}}function Qr(e,t){let n=Zr(e),r=Math.floor(t/2)+2,i=Math.acos(1-2*n()),a=2*Math.PI*n(),o=Math.PI*(3-Math.sqrt(5)),s=[];for(let e=0;e<r;e+=1){let t=Math.max(-1,Math.min(1,1-2*(e+.5)/r+(n()-.5)/r)),c=e*o+(n()-.5)*o*.5,l=Math.sqrt(1-t*t),u=.88+.12*n(),[d,f,p]=[Math.cos(c)*l,t,Math.sin(c)*l],[m,h]=[f*Math.cos(i)-p*Math.sin(i),f*Math.sin(i)+p*Math.cos(i)];s.push([(d*Math.cos(a)+h*Math.sin(a))*u,m*u,(h*Math.cos(a)-d*Math.sin(a))*u])}let c=[0,1,2].map(e=>[Math.min(...s.map(t=>t[e])),Math.max(...s.map(t=>t[e]))]);return s.map(e=>e.map((e,t)=>ir((e-(c[t][0]+c[t][1])/2)/(c[t][1]-c[t][0]))))}var $r=e=>e.points??Qr(e.seed,e.facetCount);function ei(e){return $r(e).map(t=>t.map((t,n)=>t*e.size[n]))}var ti=Object.freeze({loft:{keys:[`sections`,`smooth`],read(e,t,n){t.sections=Yr(e.sections,n),t.smooth=Ur(e.smooth,`${n}.smooth`,!0)},mirror(e){e.sections=e.sections.map(e=>e.points?{y:e.y,points:e.points.map(([e,t])=>[ir(-e),t]).reverse()}:{...e,x:ir(-e.x)})},samples(e){let{rings:t,at:n}=Nr(e);return n.slice(1).map((e,r)=>t.slice(n[r],e+1).flat())}},convex:{keys:[`points`,`seed`,`facetCount`,`facets`],read(e,t,n){let r=t=>e[t]!==void 0&&e[t]!==null;if(r(`points`)===r(`seed`))throw new B(`${n}.points`,`give either points: [[x, y, z]...] or seed (a random rock), not both`);if(r(`points`)){if(r(`facetCount`)&&e.seed!==null)throw new B(`${n}.facetCount`,`applies to a seeded rock; points already set the facets`);if(t.points=Wr(e.points,`${n}.points`,Ir,`[x, y, z] points`).map((e,t)=>Gr(e,`${n}.points[${t}]`,[`x`,`y`,`z`])),Xr(t.points)<Br)throw new B(`${n}.points`,`the points lie (nearly) on one line or plane; a hull needs depth in all three directions`)}else{if(!Number.isInteger(e.seed)||e.seed<0||e.seed>Vr)throw new B(`${n}.seed`,`must be a whole number from 0 to ${Vr}, got ${JSON.stringify(e.seed)}`);t.seed=e.seed;let i=r(`facetCount`)?e.facetCount:Rr;if(!Number.isInteger(i)||i<Lr[0]||i>Lr[1])throw new B(`${n}.facetCount`,`must be a whole number from ${Lr[0]} to ${Lr[1]}, got ${JSON.stringify(e.facetCount)}`);t.facetCount=i}t.facets=Ur(e.facets,`${n}.facets`,!0)},mirror(e){e.points=$r(e).map(([e,t,n])=>[ir(-e),t,n]),delete e.seed,delete e.facetCount},samples:e=>[ei(e)]}}),ni=1e-9;function ri(e,t){return e===null?t:t===null?e:e*t<=0?0:2*e*t/(e+t)}function ii(e,t,n=!1){let r=e.length,i=t=>e[n?(t+r)%r:t],a=e.map((e,t)=>e.map((e,a)=>ri(n||t>0?e-i(t-1)[a]:null,n||t<r-1?i(t+1)[a]-e:null))),o=[];for(let e=0;e<(n?r:r-1);e+=1){let n=i(e),s=i(e+1),c=a[e],l=a[(e+1)%r];for(let e=0;e<t;e+=1){let r=e/t,i=r*r,a=i*r,u=2*a-3*i+1,d=a-2*i+r,f=3*i-2*a,p=a-i;o.push(n.map((e,t)=>u*e+d*c[t]+f*s[t]+p*l[t]))}}return n||o.push([...e[r-1]]),o}function ai(e){let t=0;for(let n=0,r=e.length-1;n<e.length;r=n,n+=1)t+=e[r][0]*e[n][1]-e[n][0]*e[r][1];return t/2}var oi=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]),si=(e,t,n)=>{let r=oi(e,t,n);return Math.abs(r)<=ni?0:Math.sign(r)},ci=(e,t,n)=>Math.min(e[0],t[0])-ni<=n[0]&&n[0]<=Math.max(e[0],t[0])+ni&&Math.min(e[1],t[1])-ni<=n[1]&&n[1]<=Math.max(e[1],t[1])+ni;function li(e,t,n,r){let i=si(e,t,n),a=si(e,t,r),o=si(n,r,e),s=si(n,r,t);return i!==a&&o!==s||i===0&&ci(e,t,n)||a===0&&ci(e,t,r)||o===0&&ci(n,r,e)||s===0&&ci(n,r,t)}function ui(e){let t=e.flatMap((e,t)=>e.map((n,r)=>({loop:t,edge:r,n:e.length,a:n,b:e[(r+1)%e.length]})));for(let e=0;e<t.length;e+=1)for(let n=e+1;n<t.length;n+=1){let r=t[e],i=t[n],a=r.loop===i.loop&&(r.edge+1)%r.n===i.edge,o=r.loop===i.loop&&(i.edge+1)%i.n===r.edge,s;if(a||o){let[e,t,n]=a?[r.b,r.a,i.b]:[r.a,r.b,i.a];s=si(e,t,n)===0&&(t[0]-e[0])*(n[0]-e[0])+(t[1]-e[1])*(n[1]-e[1])>0}else s=li(r.a,r.b,i.a,i.b);if(s)return{a:{loop:r.loop,edge:r.edge},b:{loop:i.loop,edge:i.edge}}}return null}function di([e,t],n){let r=!1;for(let i=0,a=n.length-1;i<n.length;a=i,i+=1){let[o,s]=n[i],[c,l]=n[a];s>t!=l>t&&e<(c-o)*(t-s)/(l-s)+o&&(r=!r)}return r}function fi(e){let t=e.map((e,t)=>t);ai(e)<0&&t.reverse();let n=[];for(;t.length>3;){let r=e=>[t[(e+t.length-1)%t.length],t[e],t[(e+1)%t.length]],i=t.findIndex((n,i)=>{let[a,o,s]=r(i).map(t=>e[t]);return oi(a,o,s)<=ni?!1:!t.some(t=>!r(i).includes(t)&&oi(a,o,e[t])>=0&&oi(o,s,e[t])>=0&&oi(s,a,e[t])>=0)});i<0&&(i=0),n.push(r(i)),t.splice(i,1)}return n.push(t),n}var pi=.005,mi=24,hi=e=>e.size.map(e=>e/2);function gi(e,t,n){if(e===void 0)return n;if(typeof e!=`boolean`)throw new B(t,`must be true or false, got ${JSON.stringify(e)}`);return e}function _i(e,t,n,[r,i],[a,o]){if(!Array.isArray(e)||e.length<r||e.length>i)throw new B(t,`must be a list of ${r}-${i} points ${n}, got ${Array.isArray(e)?`${e.length} points`:JSON.stringify(e)}`);let s=n.split(`,`).length;return e.map((e,r)=>{if(!Array.isArray(e)||e.length!==s||!e.every(ar))throw new B(`${t}[${r}]`,`must be ${s} numbers ${n}, got ${JSON.stringify(e)}`);return e.forEach((e,n)=>{if(e<a||e>o)throw new B(`${t}[${r}][${n}]`,`must be from ${a} to ${o}, got ${e}`)}),e.map(ir)})}function vi(e,t,n){let r=_i(e,t,`[x, y]`,n,[-.5,.5]);return r.forEach(([e,n],i)=>{let[a,o]=r[(i+r.length-1)%r.length];if(e===a&&n===o)throw new B(`${t}[${i}]`,i?`repeats the point before it`:`repeats the last point; the loop closes by itself`)}),r}function yi(e,t){return(e.smooth?ii(e.profile,t):e.profile).map(([t,n])=>[t,(n-.5)*e.size[1]])}function bi(e){let[t,,n]=hi(e),r=yi(e,Math.ceil(24/(e.profile.length-1))).map(([e,r])=>Array.from({length:mi},(i,a)=>{let o=a/mi*2*Math.PI;return[e*t*Math.sin(o),r,e*n*Math.cos(o)]}));return r.slice(1).map((e,t)=>[...r[t],...e])}var xi={keys:[`profile`,`smooth`],read(e,t,n){let r=_i(e.profile,`${n}.profile`,`[r, y]`,[3,32],[0,1]);if(r.forEach(([,e],t)=>{if(t&&e<r[t-1][1])throw new B(`${n}.profile[${t}][1]`,`y must not go down the profile (${e} after ${r[t-1][1]}); list it from bottom (0) to top (1)`)}),r.at(-1)[1]===r[0][1])throw new B(`${n}.profile`,`must climb: the last y must be above the first`);if(r.every(([e])=>e===0))throw new B(`${n}.profile`,`has every r at 0, so nothing would be drawn`);t.profile=r,t.smooth=gi(e.smooth,`${n}.smooth`,!0)},samples:bi},Si=e=>e.path.map(t=>t.map((t,n)=>t*(e.size[n]-e.thickness))),Ci=(e,t)=>ii(Si(e),t,e.closed);function wi(e,t){let n=e.thickness/2;if(!e.taper)return t.map(()=>n);let r=[0];for(let e=1;e<t.length;e+=1)r.push(r[e-1]+Math.hypot(...t[e].map((n,r)=>n-t[e-1][r])));return r.map(t=>{let i=t/r.at(-1);return n*(1-Math.max(0,e.taper)*i-Math.max(0,-e.taper)*(1-i))})}var Ti=[];for(let e of[-1,0,1])for(let t of[-1,0,1])for(let n of[-1,0,1]){let r=Math.hypot(e,t,n);r&&Ti.push([e/r,t/r,n/r])}function Ei(e){let t=Ci(e,4),n=wi(e,t),r=e.closed?e.path.length:e.path.length-1;return Array.from({length:r},(e,r)=>{let i=[];for(let e=r*4;e<=(r+1)*4;e+=1){let r=e%t.length;for(let e of Ti)i.push(t[r].map((t,i)=>t+e[i]*n[r]))}return i})}var Di={keys:[`path`,`thickness`,`taper`,`closed`],read(e,t,n){t.path=_i(e.path,`${n}.path`,`[x, y, z]`,[2,32],[-.5,.5]);let r=Math.min(...t.size);if(!ar(e.thickness)||e.thickness<pi||e.thickness>r)throw new B(`${n}.thickness`,`must be the tube's diameter in metres, from ${pi} to the part's smallest size (${ir(r)} m), got ${JSON.stringify(e.thickness)}`);if(t.thickness=ir(e.thickness),t.taper=sr(e.taper,`${n}.taper`,0,-1,1),t.closed=gi(e.closed,`${n}.closed`,!1),t.closed&&t.taper)throw new B(`${n}.taper`,`a closed tube cannot taper: its two ends meet`);if(t.closed&&t.path.length<3)throw new B(`${n}.path`,`a closed tube needs at least 3 points`);let i=Si(t);i.forEach((e,r)=>{if(!r&&!t.closed)return;let a=i[(r+i.length-1)%i.length];if(Math.hypot(...e.map((e,t)=>e-a[t]))<1e-6)throw new B(`${n}.path[${r}]`,r?`sits on the point before it once fitted to the size`:`repeats the last point; a closed path joins its ends by itself`)})},mirror(e){e.path=e.path.map(([e,t,n])=>[ir(-e),t,n])},samples:Ei};function Oi(e){let[t,n,r]=e.size;return fi(e.outline).map(i=>i.flatMap(i=>{let[a,o]=e.outline[i];return[[a*t,o*n,r/2],[a*t,o*n,-r/2]]}))}function ki(e){return e.holes?e.holes.reduce((e,t)=>Math.abs(ai(t))>Math.abs(ai(e))?t:e).map(([t,n])=>[t*e.size[0],n*e.size[1],0]):null}var Ai=e=>e.map(([e,t])=>[ir(-e),t]),ji=Object.freeze({lathe:xi,tube:Di,extrude:{keys:[`outline`,`holes`,`roundness`],read(e,t,n){if(t.outline=vi(e.outline,`${n}.outline`,[3,64]),e.holes!==void 0&&(!Array.isArray(e.holes)||e.holes.length>4))throw new B(`${n}.holes`,`must be a list of at most 4 hole outlines, got ${JSON.stringify(e.holes).slice(0,60)}`);let r=(e.holes??[]).map((e,t)=>vi(e,`${n}.holes[${t}]`,[3,32])),i=[`${n}.outline`,...r.map((e,t)=>`${n}.holes[${t}]`)],a=ui([t.outline,...r]);if(a){let{a:e,b:t}=a,n=e.loop===t.loop?`another of its edges`:`${i[t.loop]} (edge ${t.edge})`;throw new B(i[e.loop],`edge ${e.edge} (point ${e.edge} to the next) touches or crosses ${n}; an outline must not cross itself or its holes`)}[t.outline,...r].forEach((e,t)=>{if(Math.abs(ai(e))<1e-5)throw new B(i[t],`encloses no area`)}),r.forEach((e,n)=>{if(!di(e[0],t.outline))throw new B(i[n+1],`must lie inside the outline`);if(r.some((t,r)=>r!==n&&di(e[0],t)))throw new B(i[n+1],`must not lie inside another hole`)}),r.length&&(t.holes=r),t.roundness=sr(e.roundness,`${n}.roundness`,.1,0,1)},mirror(e){e.outline=Ai(e.outline),e.holes&&=e.holes.map(Ai)},samples:Oi,hole:ki}}),Mi=Object.freeze([`blade`,`tuft`,`flower`,`leaf`,`pebble`,`twig`]),Ni=[`ground`,`shell`],Pi=4e3;function Fi(e){let[t,n,r]=e.size.map(e=>e/2),i=[];if(e.spread===`ground`){for(let e of[-t,t])for(let t of[-n,n])for(let n of[-r,r])i.push([e,t,n]);return[i]}for(let e=0;e<=16;e+=1){let a=e/16*Math.PI;for(let e=0;e<24;e+=1){let o=e/24*2*Math.PI;i.push([Math.sin(a)*Math.cos(o)*t,Math.cos(a)*n,Math.sin(a)*Math.sin(o)*r])}}return[i]}var Ii={keys:[`item`,`count`,`seed`,`spread`],read(e,t,n){t.item=ur(e.item,`${n}.item`,void 0,Mi),t.count=cr(e.count,`${n}.count`,void 0,1,Pi),t.seed=lr(e.seed,`${n}.seed`),t.spread=ur(e.spread,`${n}.spread`,`ground`,Ni)},samples:Fi},Li=.6,Ri=e=>e.size.map(e=>e/2);function zi(e){let t=[];for(let n=0;n<=16;n+=1){let r=-1+2*n/16;for(let n=0;n<24;n+=1)t.push(...e(r,n/24*2*Math.PI))}return t}function Bi(e){let[t,n,r]=Ri(e),i=2+6*e.roundness,a=e.taper;return[zi((e,o)=>{let s=a>0?1-a*Li*((e+1)/2):a<0?1+a*Li*((1-e)/2):1,c=Math.max(0,1-Math.abs(e)**i)**(1/i),l=Math.cos(o),u=Math.sin(o),d=(Math.abs(l)**i+Math.abs(u)**i)**(1/i);return[[l/d*t*c*s,e*n,u/d*r*c*s]]})]}function Vi(e){let[t,n,r]=Ri(e),i=[];for(let e of[-t,t])for(let t of[-n,n])for(let n of[-r,r])i.push([e,t,n]);return[i]}function Hi(e){let[t,n,r]=Ri(e);return[zi((i,a)=>{let o=1-Math.max(0,e.taper)*((i+1)/2)-Math.max(0,-e.taper)*((1-i)/2);return[[Math.cos(a)*t*o,i*n,Math.sin(a)*r*o]]})]}function Ui(e){let[t,n,r]=Ri(e);return[zi((i,a)=>{let o=[[Math.cos(a)*t,Math.sin(a)*n,i*r]];return e.shape===`frame`&&o.push([Math.sign(Math.cos(a))*t,Math.sign(Math.sin(a))*n,i*r]),o})]}function Wi(e){let t=e.shape===`frame`?e.border:e.size[2],n=e.size[0]/2-t,r=e.size[1]/2-t;if(n<=0||r<=0)return null;let i=-e.size[2]/2;return[[-n,-r,i],[n,-r,i],[n,r,i],[-n,r,i]]}var Gi=Object.freeze({blob:{keys:[`roundness`,`taper`],read(e,t,n){t.roundness=sr(e.roundness,`${n}.roundness`,.5,0,1),t.taper=sr(e.taper,`${n}.taper`,0,-1,1)},samples:Bi},box:{keys:[`roundness`],read(e,t,n){t.roundness=sr(e.roundness,`${n}.roundness`,.1,0,1)},samples:Vi},cylinder:{keys:[`taper`],read(e,t,n){t.taper=sr(e.taper,`${n}.taper`,0,-1,1)},samples:Hi},torus:{keys:[],read(e,t,n){if(t.size[2]>=Math.min(t.size[0],t.size[1]))throw new B(`${n}.size`,`a torus's tube (size[2]) must be thinner than its outer diameter`)},samples:Ui,hole:Wi},frame:{keys:[`border`],read(e,t,n){let r=Math.min(t.size[0],t.size[1])/2,i=e.border===void 0?ir(Math.min(t.size[0],t.size[1])*.15):e.border;if(!ar(i)||i<=0||i>=r)throw new B(`${n}.border`,`must be above 0 and below half the frame's smaller side (${ir(r)} m), got ${JSON.stringify(e.border)}`);t.border=ir(i)},samples:Ui,hole:Wi},...ji,...ti,scatter:Ii}),Ki=Object.freeze(Object.keys(Gi)),qi=Object.freeze([...new Set(Object.values(Gi).flatMap(e=>e.keys))]),Ji=[`subtract`,`intersect`],Yi=Object.freeze({key:`op`,read(e,t,n){if(!Ji.includes(e.op))throw new B(`${n}.op`,`must be "subtract" or "intersect", got ${JSON.stringify(e.op)}`);if(t.parent===void 0)throw new B(`${n}.op`,`a cutter needs a parent: the part it cuts`);t.op=e.op}});function Xi(e){let t=new Map(e.map(e=>[e.id,e]));for(let n of e){let e=t.get(n.parent);if(n.op&&e?.shape===`scatter`)throw new B(`parts[${n.id}].op`,`"${e.id}" is a scatter, which is drawn as instances and cannot be cut`);if(e?.op)throw new B(`parts[${n.id}].parent`,n.op?`"${e.id}" is a cutter, and a cutter only cuts drawn parts; give this one parent "${e.parent}" so both cut it`:`"${e.id}" is a cutter (op), which is not drawn and cannot carry parts; use parent "${e.parent}" instead`)}}var Zi=.35,Qi={fallback:4,min:1,max:12},$i=[`y`,`x`,`z`];function ea(e,t,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new B(t,`must be an object { ${n.join(`, `)} }, got ${JSON.stringify(e)}`);for(let r of Object.keys(e))if(!n.includes(r))throw new B(`${t}.${r}`,`unknown key (allowed: ${n.join(`, `)})`);return e}var ta=[{key:`detail`,read(e,t,n){let r=`${n}.detail`;if(t.shape===`scatter`)throw new B(r,`does not apply to a scatter: its items are already small; lump the part under it instead`);let i=ea(e.detail,r,[`amount`,`scale`,`seed`]);if(i.amount===void 0)throw new B(`${r}.amount`,`is required: the bump height from 0 (smooth) to 1 (very lumpy)`);t.detail={amount:sr(i.amount,`${r}.amount`,0,0,1),scale:sr(i.scale,`${r}.scale`,Qi.fallback,Qi.min,Qi.max),seed:lr(i.seed,`${r}.seed`)}}},{key:`gradient`,read(e,t,n){let r=`${n}.gradient`,i=ea(e.gradient,r,[`color`,`axis`,`from`,`to`]);if(i.color===void 0)throw new B(`${r}.color`,`is required: the #rrggbb colour the part blends into`);t.gradient={color:pr(i.color,`${r}.color`),axis:ur(i.axis,`${r}.axis`,`y`,$i),from:sr(i.from,`${r}.from`,0,0,1),to:sr(i.to,`${r}.to`,1,0,1)}}}],na=Object.freeze({clay:{roughness:.82},wood:{roughness:.68,color:`#9a6b3f`,pattern:`wood`,tile:.5,grain:`long`,contrast:.32,bump:.0015,roughVar:.1},straw:{roughness:.88,color:`#c8a85c`,pattern:`straw`,tile:.6,grain:`hang`,contrast:.5,bump:.02,roughVar:.08},stone:{roughness:.9,color:`#8d8a83`,pattern:`stone`,tile:1,contrast:.32,bump:.008,roughVar:.1},brick:{roughness:.88,color:`#a5503a`,pattern:`brick`,tile:.5,grain:`hang`,contrast:.22,bump:.008,roughVar:.08,mask:`#b9b3a8`},concrete:{roughness:.92,color:`#a7a49d`,pattern:`concrete`,tile:1.2,contrast:.2,bump:.0015,roughVar:.08},metal:{roughness:.32,metalness:1,color:`#c9ccd1`,env:1,pattern:`brushed`,tile:.4,contrast:.06,bump:1e-4,roughVar:.12},glass:{roughness:.04,color:`#f2f7f7`,env:1,physical:{transmission:1,ior:1.5}},ceramic:{roughness:.35,color:`#efece4`,env:.45,physical:{clearcoat:1,clearcoatRoughness:.06}},plastic:{roughness:.3,env:.35},rubber:{roughness:.92,color:`#2d2d2f`,pattern:`stipple`,tile:.15,contrast:.08,bump:3e-4,roughVar:.06},fabric:{roughness:.95,pattern:`weave`,tile:.12,contrast:.22,bump:8e-4,roughVar:.05,physical:{sheen:1,sheenRoughness:.6}},paper:{roughness:.88,color:`#ebe6da`,pattern:`paper`,tile:.25,contrast:.08,bump:2e-4},foliage:{roughness:.62,color:`#4f7d34`,pattern:`leaves`,tile:.6,contrast:.45,bump:.015,roughVar:.15,physical:{sheen:.8,sheenRoughness:.45}}}),ra=Object.freeze(Object.keys(na)),ia=Object.freeze({matte:.85,satin:.45,gloss:.12}),aa=Object.freeze(Object.keys(ia));function oa(e,t){let n=na[t]?.color;return n&&(!e||e.toLowerCase()===`#c2c6c8`)?n:e??`#c2c6c8`}var sa=new Set([`cube`,`sphere`,`capsule`,`cylinder`,`cone`,`plane`]),ca=[[`material`,ra],[`finish`,aa]],la=e=>sa.has(e)?ca.map(([e])=>e):[];function ua(e,t){return sa.has(t)?Object.fromEntries(ca.filter(([t,n])=>n.includes(e?.[t])).map(([t])=>[t,e[t]])):{}}function da(e,t){if(!sa.has(e?.renderer))return{};let n={};for(let[r,i]of ca){let a=t?.[r];a===void 0||a!==null&&!i.includes(a)||(a??void 0)!==e[r]&&(n[r]=a)}return n}var fa=(e,t)=>(n,r,i)=>{if(n[e]!==null){if(!t.includes(n[e]))throw new B(`${i}.${e}`,`must be one of ${t.join(`, `)}; got ${JSON.stringify(n[e])}`);r[e]=n[e]}},pa=Object.freeze([{key:`material`,read:fa(`material`,ra)},{key:`finish`,read:fa(`finish`,aa)},...ta,Yi]),ma=1,ha=Object.freeze({maxParts:48,minExtent:.005,maxExtent:20,maxOffset:20,maxDepth:8,maxScatterItems:12e3}),ga=`#c2c6c8`,_a=`.mirror`,va=.05,ya=/^[a-z0-9][a-z0-9-]{0,39}$/,ba=new Set([`id`,`shape`,`size`,`position`,`rotation`,`color`,`parent`,`mirror`,...qi,...pa.map(e=>e.key)]),xa=e=>{let t=((e+180)%360+360)%360-180;return t===-180?180:t},Sa=(e,t)=>e===void 0?ga:pr(e,t);function Ca(e,t){let n=`parts[${t}]`;if(!e||typeof e!=`object`||Array.isArray(e))throw new B(n,`must be an object`);for(let t of Object.keys(e))if(!ba.has(t))throw new B(`${n}.${t}`,`unknown key (allowed: ${[...ba].join(`, `)})`);if(typeof e.id!=`string`||!ya.test(e.id))throw new B(`${n}.id`,`must be 1-40 characters of a-z, 0-9 and -, starting with a letter or digit; got ${JSON.stringify(e.id)}`);let r=`parts[${e.id}]`;if(!Ki.includes(e.shape))throw new B(`${r}.shape`,`must be one of ${Ki.join(`, `)}; got ${JSON.stringify(e.shape)}`);let i=Gi[e.shape];for(let t of qi)if(e[t]!==void 0&&!i.keys.includes(t))throw new B(`${r}.${t}`,`does not apply to a ${e.shape}`);let a=or(e.size,`${r}.size`,null,(e,t)=>{if(e<ha.minExtent||e>ha.maxExtent)throw new B(t,`extent must be ${ha.minExtent}-${ha.maxExtent} m, got ${e}`)}),o=or(e.position,`${r}.position`,[0,0,0],(e,t)=>{if(Math.abs(e)>ha.maxOffset)throw new B(t,`must be within ±${ha.maxOffset} m, got ${e}`)}),s=or(e.rotation,`${r}.rotation`,[0,0,0],()=>{}).map(e=>ir(xa(e)));if(e.parent!==void 0&&(typeof e.parent!=`string`||!e.parent))throw new B(`${r}.parent`,`must be another part's id`);if(e.mirror!==void 0&&typeof e.mirror!=`boolean`)throw new B(`${r}.mirror`,`must be true or false`);let c={id:e.id,shape:e.shape,size:a,position:o,rotation:s,color:Sa(e.color,`${r}.color`)};e.parent!==void 0&&(c.parent=e.parent),e.mirror===!0&&(c.mirror=!0),i.read(e,c,r);for(let t of pa)e[t.key]!==void 0&&t.read(e,c,r);return c}function wa(e){let t=new Map(e.map(e=>[e.id,e])),n=new Map,r=(e,i)=>{if(n.has(e.id))return n.get(e.id);if(!e.parent)return n.set(e.id,0),0;let a=t.get(e.parent);if(!a)throw new B(`parts[${e.id}].parent`,`no part named "${e.parent}"`);if(i.has(a.id))throw new B(`parts[${e.id}].parent`,`parents form a cycle`);let o=r(a,new Set([...i,e.id]))+1;if(o>ha.maxDepth)throw new B(`parts[${e.id}].parent`,`parent chain is deeper than ${ha.maxDepth}`);return n.set(e.id,o),o};for(let t of e)r(t,new Set([t.id]));for(let n of e)if(n.mirror){for(let e=t.get(n.parent);e;e=t.get(e.parent))if(e.mirror)throw new B(`parts[${n.id}].mirror`,`"${e.id}" above it is already mirrored, which copies this part too`)}return n}function Ta(e){try{if(!e||typeof e!=`object`||Array.isArray(e))throw new B(`recipe`,`must be an object with a parts array`);for(let t of Object.keys(e))if(t!==`version`&&t!==`parts`)throw new B(`recipe.${t}`,`unknown key (allowed: version, parts)`);if(e.version!==void 0&&e.version!==ma)throw new B(`recipe.version`,`only version ${ma} is understood, got ${JSON.stringify(e.version)}`);if(!Array.isArray(e.parts)||e.parts.length===0)throw new B(`recipe.parts`,`must be a non-empty array`);let t=e.parts.map(Ca),n=new Set;for(let e of t){if(n.has(e.id))throw new B(`parts[${e.id}].id`,`is used twice`);n.add(e.id)}wa(t),Xi(t);let r={version:ma,parts:t},i=Ma(r);if(i.length>ha.maxParts)throw new B(`recipe.parts`,`expands to ${i.length} parts with mirrors; the limit is ${ha.maxParts}`);let a=i.reduce((e,t)=>e+(t.shape===`scatter`?t.count:0),0);if(a>ha.maxScatterItems)throw new B(`recipe.parts`,`scatter parts draw ${a} items with mirrors; the limit is ${ha.maxScatterItems}`);return{ok:!0,recipe:r}}catch(e){if(e instanceof B)return{ok:!1,error:e.message,path:e.path};throw e}}function Ea(e,t){let n=Ta(e);if(!n.ok)return n;if(!Array.isArray(t)||t.length===0)return{ok:!1,error:`edits: must be a non-empty array`,path:`edits`};let r=n.recipe.parts.map(e=>({...e})),i=new Set;for(let[e,n]of t.entries()){let t=`edits[${e}]`,a=n&&typeof n==`object`?[`set`,`add`,`remove`].filter(e=>e in n):[];if(a.length!==1)return{ok:!1,error:`${t}: must have exactly one of set, add, remove`,path:t};if(a[0]===`add`){r.push(n.add),i.add(n.add?.id);continue}let o=n[a[0]],s=r.findIndex(e=>e.id===o);if(s<0)return{ok:!1,error:`${t}.${a[0]}: no part named ${JSON.stringify(o)}`,path:`${t}.${a[0]}`};if(a[0]===`remove`){let e=new Set([o]);for(let t=!0;t;){t=!1;for(let n of r)n.parent&&e.has(n.parent)&&!e.has(n.id)&&(e.add(n.id),t=!0)}for(let t=r.length-1;t>=0;--t)e.has(r[t].id)&&r.splice(t,1);e.forEach(e=>i.add(e));continue}let{set:c,...l}=n;if(`id`in l)return{ok:!1,error:`${t}.id: rename by remove + add`,path:`${t}.id`};let u={...r[s],...l};l.parent===null&&delete u.parent,l.mirror===!1&&delete u.mirror;for(let e of pa)l[e.key]===null&&delete u[e.key];if(`shape`in l)for(let e of qi)e in l||delete u[e];r[s]=u,i.add(o)}let a=Ta({version:ma,parts:r});return a.ok?{...a,changed:[...i]}:a}var Da=Math.PI/180;function Oa(e,t){let[n,r,i]=t.map(e=>e*Da),a=Math.cos(n),o=Math.sin(n),s=Math.cos(r),c=Math.sin(r),l=Math.cos(i),u=Math.sin(i),d=a*l,f=a*u,p=o*l,m=o*u;return[s*l,f+p*c,m-d*c,0,-s*u,d-m*c,p+f*c,0,c,-o*s,a*s,0,e[0],e[1],e[2],1]}function ka(e,t){let n=Array(16);for(let r=0;r<4;r+=1)for(let i=0;i<4;i+=1){let a=0;for(let n=0;n<4;n+=1)a+=e[n*4+i]*t[r*4+n];n[r*4+i]=a}return n}function Aa(e,[t,n,r]){return[e[0]*t+e[4]*n+e[8]*r+e[12],e[1]*t+e[5]*n+e[9]*r+e[13],e[2]*t+e[6]*n+e[10]*r+e[14]]}function ja(e,t){let n={...e,id:`${e.id}${_a}`,position:[ir(-e.position[0]),e.position[1],e.position[2]],rotation:[e.rotation[0],ir(-e.rotation[1]),ir(-e.rotation[2])]};return delete n.mirror,Gi[n.shape].mirror?.(n),t!==void 0&&(n.parent=t),n}function Ma(e){let t=e.parts,n=new Map;for(let e of t){let t=e.parent??``;n.has(t)||n.set(t,[]),n.get(t).push(e)}let r=[],i=(e,t,a,o)=>{let s=o?ja(e,a):a===void 0?{...e}:{...e,parent:a},c=ka(t,Oa(s.position,s.rotation));r.push({...s,matrix:c});for(let t of n.get(e.id)??[])i(t,c,s.id,o);if(e.mirror&&!o){let o=ja(e,a),s=ka(t,Oa(o.position,o.rotation));r.push({...o,matrix:s});for(let t of n.get(e.id)??[])i(t,s,o.id,!0)}},a=Oa([0,0,0],[0,0,0]);for(let e of n.get(``)??[])i(e,a,void 0,!1);return r}function Na(e){let[t,n,r]=e.size.map(e=>e/2),i=[];for(let e of[-t,t])for(let t of[-n,n])for(let n of[-r,r])i.push([e,t,n]);return i}function Pa(e){let t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let r of Ma(e).filter(e=>!e.op))for(let e of Na(r)){let i=Aa(r.matrix,e);for(let e=0;e<3;e+=1)t[e]=Math.min(t[e],i[e]),n[e]=Math.max(n[e],i[e])}return{min:t.map(ir),max:n.map(ir)}}function Fa(e){let{min:t,max:n}=Pa(e);return{footprint:{width:ir(Math.max(ha.minExtent,2*Math.max(Math.abs(t[0]),Math.abs(n[0])))),depth:ir(Math.max(ha.minExtent,2*Math.max(Math.abs(t[2]),Math.abs(n[2]))))},height:ir(Math.max(va,n[1]))}}function Ia(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],La=(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]),Ra=(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 za=(e,t,n)=>Math.min(n,Math.max(t,e)),Ba=e=>e*Math.PI/180,Va=e=>e*180/Math.PI,Ha=()=>[[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]]],Ua=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]];function Wa(e){let t=Ba(e),n=Math.cos(t),r=Math.sin(t);return[[1,0,0],[0,n,-r],[0,r,n]]}function X(e){let t=Ba(e),n=Math.cos(t),r=Math.sin(t);return[[n,0,r],[0,1,0],[-r,0,n]]}function Ga(e){let t=Ba(e),n=Math.cos(t),r=Math.sin(t);return[[n,-r,0],[r,n,0],[0,0,1]]}function Ka(e,t){let[n,r,i]=K(e),a=Ba(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 qa(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),Ua(n,r,La(n,r))}var Ja=(e,t,n,r)=>q(qa(n,r),Y(qa(e,t)));function Ya(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 Xa([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 Za=(e,t)=>Va(Math.acos(za(W(K(e),K(t)),-1,1))),Qa=.01;function $a(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*Qa)),c=t.map(e=>Xa(e.localQuat)),l=t.map(e=>e.worldPos.map(e=>e*Qa)),u=t.map(e=>Xa(e.worldQuat)),d=e.landmarks,f=r.Head,p=e=>J(Y(u[f]),H(e.map(e=>e*Qa),l[f])),m={mouth:p(d.mouth),headCentre:p(d.headEllipsoid.centre),headRadii:d.headEllipsoid.radii.map(e=>e*Qa),sole:{ball:(d.sole?.ball??0)*Qa,tip:(d.sole?.tip??0)*Qa}};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 eo(e){return{P:e.restWorldPos.map(e=>e.slice()),R:e.restWorldRot.map(e=>e.map(e=>e.slice()))}}function to(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 no(e,t){return{quats:e.names.map((n,r)=>{let i=e.parent[r];return Ya(i<0?t.R[r]:q(Y(t.R[i]),t.R[r]))}),hips:t.P[e.index.Hips].slice()}}function ro(e,t,n){let r=[],i=[];for(let a of e.subtree[e.index.Hips]){let o=e.parent[a],s=Xa(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 io=(e,t,n)=>V(e.P[t],J(e.R[t],n)),ao=(e,t,n,r)=>J(t.R[n],J(Y(e.restWorldRot[n]),r)),oo=(e,t,n)=>Math.acos(za((n*n-e*e-t*t)/(2*e*t),-1,1))*180/Math.PI,so=(e,t,n)=>Math.sqrt(e*e+t*t+2*e*t*Math.cos(n*Math.PI/180));function co(e,t,n,r=145,i=150){let a=so(e,t,r);if(n>=a)return n;let o=a-so(e,t,i);return n>a-2*o?n+(a-n)*(a-n)/(4*o):a-o}function lo(e,t,n,r,i,a=145,o=150){let s=so(n,r,a),c=G(H(t,e));if(c>=s)return t;let l=co(n,r,c,a,o),u=U(i,so(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 uo=(e,t)=>ao(e,t,e.index.Spine2??e.index.Hips,[0,0,-1]),fo=(e,t)=>ao(e,t,e.index.Hips,[0,1,0]),po=(e,t,n)=>oo(e,t,co(e,t,so(e,t,n)));function mo(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 oo(G(H(c,s)),G(H(l,c)),G(H(r,s)))}function ho(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(za(W(K(a),K(o)),-1,1))*180/Math.PI,c=La(a,o);s>145&&G(c)>1e-12&&to(e,t,i,t.P[i].slice(),Ka(c,po(G(a),G(o),s)-s))}var go={elbow:[145,150,uo],knee:[150,160,fo]};function _o(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=go[c],h=m?lo(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=za(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=ao(e,t,n,s);to(e,t,n,l.slice(),Ja(H(u,l),T,H(w,l),C));let E=ao(e,t,r,s),D=V(l,U(y,b));return to(e,t,r,t.P[r].slice(),Ja(H(t.P[i],t.P[r]),E,H(D,t.P[r]),C)),g||v-b}function vo(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(Wa(i),c))):J(X(r),J(Wa(i),c)),u=a?J(a.R,[0,1,0]):[0,1,0];to(e,t,o,t.P[o].slice(),Ja(H(t.P[s],t.P[o]),ao(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&&to(e,t,s,t.P[s].slice(),Ja(n,[0,1,0],r,[0,1,0]))}}function yo(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:La(a,o)}}function bo(e,t,n,r){let i=e.index[`${n}Arm`],a=e.index[`${n}Hand`],o=Ka(H(t.P[a],t.P[i]),r);to(e,t,i,t.P[i].slice(),o),to(e,t,a,t.P[a].slice(),Y(o))}function xo(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}=yo(e,t,n),l=K(H(c,U(s,W(c,s))));to(e,t,a,t.P[a].slice(),Ka(l,za(i,-70,70))),to(e,t,a,t.P[a].slice(),Ka(s,za(r,-85,85)))}var So={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]}},Co={spherical:{Index:9,Middle:2,Ring:-5,Pinky:-12}};function wo(e,t,n){let r=So.relaxed;return r[t][n]+Object.entries(e??{}).reduce((e,[i,a])=>e+(a||0)*((So[i]?.[t]?.[n]??r[t][n])-r[t][n]),0)}var To=(e,t)=>So.fist[e][t];function Eo(e,t,n,r){let i=n===`Left`?-1:1,a=(e,t)=>wo(r,e,t);for(let i of[`Index`,`Middle`,`Ring`,`Pinky`]){let a=Object.entries(r??{}).reduce((e,[t,n])=>e+(n||0)*(Co[t]?.[i]??0),0),o=e.index[`${n}Hand${i}1`];a&&o!==void 0&&to(e,t,o,t.P[o].slice(),Ka(yo(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}=yo(e,t,n),u=r===`Thumb`&&o===0?l:c;to(e,t,s,t.P[s].slice(),Ka(u,i*a(r,o)))}let o=[0,1,2,3].map(e=>Object.entries(r??{}).reduce((t,[n,r])=>t+(r||0)*(Do[n]?.[e]??0),0));o.some(Boolean)&&Oo(e,t,n,o)}var Do={fist:[-70,-5,5,80],grip:[-30,-30,30,10],spherical:[-40,-20,20,10]};function Oo(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}=yo(e,t,n);to(e,t,c(1),t.P[c(1)].slice(),Ka(l,s*r)),to(e,t,c(1),t.P[c(1)].slice(),Ka(u,i));for(let[n,r]of[[2,a],[3,o]]){let i=K(La(K(H(t.P[c(n+1)],t.P[c(n)])),u));to(e,t,c(n),t.P[c(n)].slice(),Ka(i,s*r))}}var ko=(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]],Ao=e=>[-e[0],-e[1],-e[2],e[3]],jo=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3];function Mo(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 No(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 Po(e){let t=Math.hypot(e[0],e[1],e[2]);if(t<1e-12)return Mo([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 Fo=(e,t)=>ko(ko(e,[t[0],t[1],t[2],0]),Ao(e)).slice(0,3);function Io(e,t){let n=1+e[0]*t[0]+e[1]*t[1]+e[2]*t[2];if(n>1e-9)return Mo([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 Lo=(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)]},Ro=(e,t,n)=>ko(e,Po(No(ko(Ao(e),t)).map(e=>e*n))),zo={"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)},Bo=new Map;function Vo(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 Ho(e){return Bo.has(e)||Bo.set(e,Vo(zo[e])),Bo.get(e)}function Uo(){return Promise.all(Object.entries(zo).map(async([e,t])=>{if(Bo.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();Bo.has(e)||Bo.set(e,r)}))}var Wo=.1,Go=new Map;function Ko(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 qo(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 Jo(e){if(!zo[e.model])return null;if(Go.has(e.model))return Go.get(e.model);let t=Ho(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:Ko(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,qo(e,+t)]))};return Go.set(e.model,i),i}function Yo(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 Wo;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 Xo=new WeakMap;function Zo(e,t){let n=Xo.get(t);return n||(n=e.grids.map(e=>V(t.P[e.b],J(t.R[e.b],e.centre))),Xo.set(t,n)),n}function Qo(e,t,n,r=null){let i=Wo,a=-1,o=Zo(e,t);return e.grids.forEach((s,c)=>{if(r?.has(s.b)||G(H(n,o[c]))-s.reach>i)return;let l=Yo(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 $o(e,t,n,r=null,i=.01){let a=[0,1,2].map(a=>{let o=[0,0,0];return o[a]=i,Qo(e,t,V(n,o),r).d-Qo(e,t,H(n,o),r).d}),o=G(a);return o>1e-9?U(a,1/o):null}var es=e=>/^(Left|Right)Arm$/.test(e)?.5:/^(Left|Right)UpLeg$/.test(e)?.3:0,ts=(e,t)=>/Hand$/.test(e.names[t])?e.index[e.names[t].replace(/Hand$/,`HandMiddle1`)]:e.children[t][0];function ns(e,t,n,r){let i=e.radii[r],a=ts(t,r);if(!i||a===void 0)return[];let o=n.P[r],s=H(n.P[a],o),c=es(t.names[r]);return i.filter(([e])=>e>=c).map(([e,t])=>({p:V(o,U(s,e)),r:t,t:e}))}var rs=/^(Spine\d?|Neck|Head)$/,is=(e,t)=>e.children[t].find(t=>rs.test(e.names[t]))??ts(e,t),as=.25;function os(e,t,n,r,i,a=null){let o=Qo(e,n,r,a);if(o.d>=i||o.bone<0)return r;let s=n.P[o.bone],c=is(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?za(W(H(r,s),l)/W(l,l),0,1):0))),d=G(u)>1e-4?U(u,1/G(u)):$o(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=>Qo(e,n,V(r,U(d,t)),f).d>=i,m=0,h=.02;for(;!p(h)&&h<as;)m=h,h=Math.min(as,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 ss=.03;function cs(e){let t=Jo(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 ls(e,t,n,r,i,a){let o=0,s=es(t.names[r]);for(let[t,c]of e.radii[r]??[]){if(t<s)continue;let{d:l,bone:u}=Qo(e,n,V(i,U(H(a,i),t)),e.skip.get(r));u>=0&&(o=Math.max(o,c-l))}return o}function us(e,t,n,r){let i={depth:0,p:null,into:-1};for(let a of ns(e,t,n,r)){let{d:t,bone:o}=Qo(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 ds={twist:[-85,85],flex:[-70,70],dev:[-35,20]},fs={twist:[-50,50],flex:[-40,40],dev:[-25,15]},ps=.5,ms=[0,0,-1],hs=72,gs=.02,_s=400,vs=.5,ys=100/(180/Math.PI),bs=180/Math.PI,xs=70,Ss=30,Cs=2;function ws(e,t=8,n=400){let r=0;for(let i of[`twist`,`flex`,`dev`]){let a=e[i],o=a>=0?fs[i][1]:-fs[i][0],s=a>=0?ds[i][1]:-ds[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 Ts(e,t){let n=K(H(t,e)),r=Math.acos(za(-n[1],-1,1))*bs;return Cs*(Math.max(0,r-xs)/Ss)**2}function Es(e,t,n,r){let i=Ya(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=Po(U(n,a)),s=No(ko(i,Ao(o))),c=J(Xa(o),r),l=K(H(c,U(n,W(c,n)))),u=La(n,l);return{twist:a*bs,flex:W(s,l)*bs,dev:W(s,u)*bs,axF:l,axD:u}}function Ds(e,t=0){let n=0;for(let[r,[i,a]]of Object.entries(ds)){let o=(e[r]-(i+a)/2)/((a-i)/2),s=Math.max(0,Math.abs(o)-1+t);n+=o*o+_s*s*s}return n}function Os(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(lo(p,i,m,h,uo(e,t)),p),_=G(g),v=U(g,1/Math.max(_,1e-9)),y=za(_,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):La(v,Math.abs(v[1])<.9?[0,1,0]:[1,0,0])),w=La(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]),yo(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(Ja(D,O,n,t),k),a=Es(i,r,K(n),J(i,ee)),o=Math.abs(Math.atan2(Math.sin(e),Math.cos(e)))/ys,l=V(p,V(U(v,b),U(t,x)));return{pv:t,need:a,elbow:l,cost:(c?ws(a)+Ts(p,l):Ds(a,s))+vs*(1-Math.cos(e))+_s*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:hs},(e,t)=>te(2*Math.PI*t/hs)),t=Math.min(...e.map(e=>e.cost)),n=e.reduce((e,n)=>V(e,U(n.pv,Math.exp(-(n.cost-t)/gs))),[0,0,0]);return G(n)>.001?ne(n):2*Math.PI*e.findIndex(e=>e.cost===t)/hs},miss:Math.max(0,_-y)}}function ks(e,t,n,r,i,a,o,{toward:s,w:c=1,margin:l=0,comfort:u=!1}={}){let d=Os(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 As=3,js=1,Ms=.005,Ns=.15,Ps=4,Fs=(e,[t,n])=>Math.min(n,Math.max(t,e));function Is(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}=Es(s,a,o,J(q(s,Y(t.R[r])),yo(e,t,n).l)),d=Object.fromEntries(Object.entries(u).map(([e,t])=>[e,Fs(t,ds[e])])),f=q(q(Ka(V(U(c,d.flex),U(l,d.dev)),Math.hypot(d.flex,d.dev)),Ka(o,d.twist)),s);return to(e,t,i,t.P[i].slice(),Ka(o,ps*d.twist)),to(e,t,r,t.P[r].slice(),q(f,Y(t.R[r]))),u}function Ls(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)>Ms?a:ao(e,t,i,ms)}function Rs(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=Xa(Ro(Ya(t.R[s]),Ya(q(r.R,Y(c))),a)),d=t.P[s].slice(),f=e=>H(r.pos,J(e,l));return{goal:u,plane:Ls(e,t,n),wristAt:o===`wrist`?()=>d:o===`palm`?f:e=>V(d,U(H(f(e),d),a))}}function zs(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}=Rs(e,t,n,r.palm,r.measure(t),d,r.pin),h=ks(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<As;r++){let a=m(r?t.R[u]:f);_=mo(e,t,n,a),g=_o(e,t,c,l,u,a,h.pole,i,`elbow`),v=Is(e,t,n,u,l,f)}a[`hold_${o}`]={w:d,miss:Math.max(0,g),...v,swivel:Us(t,c,l,u,p),..._>145?{fold:_}:{},...r.second?{second:r.second}:{}},a[`arm_miss_${o}`]*=1-d}function Bs(e,t,n,r){let{goal:i,plane:a,wristAt:o}=Rs(e,t,n,r.palm,r.measure(t),r.w);return Os(e,t,n,i,o(i),a,ms,0,r.comfort)}function Vs(e,t,n,r,i,{shoulder:a=!1}={}){let{goal:o,plane:s,wristAt:c}=Rs(e,t,n,r,i,1),l=c(o),u=ks(e,t,n,o,l,s,ms,{margin:Ns}),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,so(p,m,145)-G(H(l,f))),g=a?ks(e,t,n,o,l,s,ms,{comfort:!0}):u;return(a?ws(g.need)+Ts(f,g.elbow)+Hs(e,t,n,f,g.elbow,l):u.cost)+js*((u.miss*100)**2+(h*100)**2)}function Hs(e,t,n,r,i,a){let o=Jo(e),s=e.index;return o?Ps*(Math.max(ls(o,e,t,s[`${n}Arm`],r,i),ls(o,e,t,s[`${n}ForeArm`],i,a))*100)**2:0}function Us(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 Za(o(H(e.P[n],e.P[t])),o(i))}var Ws=[[`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]]})],Gs=(e,t,n=9)=>Array.from({length:n},(r,i)=>V(e,U(H(t,e),i/(n-1))));function Ks(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 qs(e,t,n,r){let i=1/0,a=H(r,n),o=W(a,a);for(let r of Gs(e,t)){let e=o<1e-12?0:za(W(H(r,n),a)/o,0,1);i=Math.min(i,G(H(r,V(n,U(a,e)))))}return i}function Js(e,t,n){let r=io(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 Ys=e=>Math.round(e.restWorldPos[e.index.LeftFoot][1]*1e3)/1e3,Xs=(e,t,n,r)=>r?io(t,n,J(Y(e.restWorldRot[n]),[0,-r,0])):t.P[n];function Zs(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:io(t,o,J(Y(e.restWorldRot[o]),H(l,i[o]))),ball:Xs(e,t,s,a.ball),tip:Xs(e,t,c,a.tip)}}function Qs(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 $s=.05;function ec(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)<=$s*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 tc=(e,t)=>{let n=J(Y(e.R),H(t,e.pos));return n[1]-=e.half[1],n},nc=e=>V(e.pos,J(e.R,[0,e.half[1],0]));function rc(e,t){let n=ec(e);if(n.kind===`sphere`)return G(H(t,nc(e)))-n.r;if(n.kind===`cylinder`){let r=tc(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 Ks(t,e)}function ic(e,t){let n=ec(e);if(n.kind===`sphere`){let n=H(t,nc(e)),r=G(n);return r>1e-12?U(n,1/r):J(e.R,[0,1,0])}if(n.kind===`cylinder`){let r=tc(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 Qs(t,e)}function ac(e,t){return H(t,U(ic(e,t),rc(e,t)))}function oc(e,t,n,r){let i=-1/0;for(let a of Gs(t,n))i=Math.max(i,r-rc(e,a));return i}var sc=.022,cc=.012,lc=.04,uc=.15,dc=12,fc=(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&&pc(n,r));function pc(e,t){let n=Object.entries(e?.objects??{}).filter(([e,n])=>e===t||n.ancestors?.includes(t));return n.length===1&&ec(n[0][1]).kind!==`box`}var mc=new WeakMap;function hc(e,t,n,r,i,a){mc.has(n)||mc.set(n,new Map);let o=mc.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=rh[c.hand],u=eo(e),d=Dh(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`),sc],[p(`HandIndex1`),p(`HandPinky1`),cc]],h=gc(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,...Oh(t,kh(h,e))};for(let[e,t,i]of m)n=Math.max(n,oc(r,e,t,i))}return n},y=v(0),b=c.hand===`l`?1:-1,x=y>-.002,S=0,C=x?uc:lc,w=x?b:-b;if(x||v(w*C)>-.002)for(let e=0;e<dc;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 gc(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 _c(e,t){let n=Math.min(1,Math.max(0,(t-e)/4));return n*n*(3-2*n)}var vc=(e,t,n)=>({pos:V(e.pos,U(H(t.pos,e.pos),n)),R:t.R}),yc=[`schema`,`fps`,`frames`,`label`,`keys`,`anchors`,`props`,`fits`,`objects`,`generators`,`checks`,`fix`,`use`,`channels`,`detourRadius`,`search`,`goals`,`flow`,`idle`],bc=[`f`,`set`,`step`,`src`],xc=[`skill`,`args`,`f0`],Sc={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`]},Cc=[`hand`,`origin`,`points`],wc=[`side`,`anchor`,`effector`,`offset`,`orient`],Tc={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`]},Ec=[`at`,`onto`,`bounce`,`tumble`,`v`],Dc=[`f`,`pos`,`rot`,`aim`,`roll`,`lean`],Oc=[`type`,`f0`,`steps`,`step`,`period`,`swing`,`halfWidth`,`lift`,`heading`,`turnDistance`,`pelvisHigh`,`pelvisLow`,`firstStep`,`armSwing`,`vary`],kc=[`contacts`,`orient`,`below`,`clearance`,`appear`,`supports`,`allow`,`limits`,`mouthPoints`],Ac={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`]},jc=[`name`,`near`,`above`,`moved`,`still`,`speed`,`tol`,`by`,`at`,`mode`,`after`,`before`],Mc=[`name`,`distance`,`position`,`frames`,`every`],Nc=[`joint`,`bone`,`prop`,`anchor`,`landmark`,`object`,`person`],Pc=[`essentials`,`spec`,`skills`,`anchors`,`props`,`objects`,`checks`,`goals`,`probes`,`channels`,`refs`,`fix`,`examples`],Fc=e=>e.flatMap(e=>[`${e}_l`,`${e}_r`]),Ic=new Set([`root`,...Fc([`foot`,`knee`,`hand`,`elbow`])]),Lc=new Set(Fc([`knee`,`elbow`])),Rc=new Set([`yaw`,`pitch`,`roll`,`spine_yaw`,`spine_pitch`,`spine_roll`,`head_yaw`,`head_pitch`,`head_roll`,`arm_rest`,`arm_hang`,...Fc([`fyaw`,`fpitch`,`armw`,`wtwist`,`wflex`,`aswing`,`abend`])]),zc=new Set(Fc([`fingers`])),Bc=new Set([`arm_hang`]),Vc=[`relaxed`,`fist`,`grip`,`cigarette`,`point`,`spherical`],Hc=[`power`,`pinch`,`hook`,`palm`,`spherical`],Uc={power:`grip`,pinch:`cigarette`,hook:`grip`,palm:`relaxed`,spherical:`spherical`},Wc={power:[0,0,.02],hook:[0,0,.02],pinch:[.025,0,.01],palm:[-.045,0,.015],spherical:[-.015,0,.035]},Gc=[[/^(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`]],Kc=e=>Gc.find(([t])=>t.test(e))??null,qc={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)`},Jc={root:qc.root,yaw:`deg; ${qc.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:qc.foot,fyaw:qc.fyaw,fpitch:`toe-down pitch, degrees, + heel up`,knee:`knee pole, ${qc.pole}`,armw:`0 = FK arm, 1 = IK to hand_* / the anchors`,hand:qc.hand,elbow:`elbow pole, ${qc.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 }`},Yc=e=>e.replace(/_[lr]$/,``),Xc=[[[`frames`,`when`,`range`,`f`,`from`,`within`,`during`,`at`],[`when`,`frames`,`at`,`f`]],[[`max`,`maxDist`,`distance`,`tolerance`,`limit`],[`tol`,`min`]]];function Zc(e,t){for(let[n,r]of Xc){let i=n.includes(e)&&r.find(n=>t.includes(n)&&n!==e);if(i)return`; did you mean "${i}"?`}return el(e,t,Math.max(2,Math.floor(e.length/3)))}var Qc=e=>Array.isArray(e)&&e.length===3&&e.every(Number.isFinite),Z=e=>JSON.stringify(e)?.slice(0,60);function $c(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 el(e,t,n=Math.max(3,Math.floor(e.length/3))){let r=null,i=1/0;for(let n of t){let t=$c(e,n);t<i&&(r=n,i=t)}return r&&i<=n?`; did you mean "${r}"?`:``}var tl={pelvis:`Hips`,hip:`Hips`,hips:`Hips`,root:`Hips`,chest:`Spine2`,upperchest:`Spine2`,torso:`Spine1`,belly:`Spine`,abdomen:`Spine`,neck:`Neck`,head:`Head`},nl={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`},rl={l:`Left`,left:`Left`,r:`Right`,right:`Right`},il=e=>e.toLowerCase().replace(/[\s_.-]+/g,``);function al(e,t){let n=t.toLowerCase();return e.names.find(e=>e.toLowerCase()===n)??null}function ol(e,t){let n=il(t);if(tl[n])return al(e,tl[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?al(e,`${rl[o]}${nl[il(s)]??il(s)}`):null}function sl(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=al(e,t)??al(e,n)??ol(e,n);return r?{bone:r,hint:``}:{bone:null,hint:el(n,e.names)}}function cl(e,t,n,r){return!t||t.index[r]!==void 0||(e(`${n} names unknown bone "${r}"${el(String(r),t.names)}`),!1)}function ll(e,t,n,r,{groups:i=!1}={}){let a=Object.keys(t?.objects??{});if(!a.length||a.includes(r))return!0;let o=Cm(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${el(String(r),[...new Set([...a,...a.flatMap(e=>t.objects[e].ancestors??[]),...Object.keys(t.others??{})])])}`),!1)}function ul(e,t,n,r,i){let[a,o]=String(i).split(/:(.*)/s);if(a===`joint`)return cl(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 dl=new Set([`empty`,`plane`,`cutout`]);function fl(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 pl=e=>({pos:[e.x??0,e.y??0,e.z??0],R:q(Wa(e.rotX??0),q(X(e.rot??0),Ga(e.rotZ??0)))}),ml=new WeakMap;function hl(e){let t=e?.objects??{};if(ml.has(t))return ml.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 ml.set(t,n),n}function gl(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=Ia(i),a=fl(i,r);if(dl.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,...pl(i),half:[e.width/2,e.height/2,e.depth/2],ancestors:a.map(e=>e.id),...a.length?{ancestorPoses:a.map(pl)}:{},...i.glow?{glow:!0}:{},...i.grasp?{grasp:i.grasp}:{}}}return{objects:t,groups:hl({objects:t}),others:n}}var _l={"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}}}},vl=new Map;function yl(e){return _l[e]?(vl.has(e)||vl.set(e,$a(_l[e])),vl.get(e)):null}var bl=new WeakMap,xl=e=>Math.round(e*1e5)/1e5;function Sl(e,t){let n=JSON.stringify(t),r=bl.get(e);if(r?.key===n)return r.value;let i=yl(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=ro(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(xl),(n*c+e)*3)}let f={rig:e.rig,frames:o,names:s,P:d};return bl.set(e,{key:n,value:f}),f}function Cl(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||!yl(e.rig)||(r[i.id]={name:i.subject||i.name||i.id,...Sl(e,{position:[i.x??0,i.y??0,i.z??0],yaw:i.rot??0})})}return r}function wl(e,t,n,r){let i=e?.people?.[t];if(!i)return null;let a=i.names.indexOf(sl(yl(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 Tl=e=>Object.entries(e?.people??{}).map(([e,t])=>`${e} (${t.name})`).join(`, `)||`none: no other character has an installed take`;function El(e,t){let n=new Map,r=(t,r)=>{let i=e?.people?.[t],a=i&&sl(yl(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 Dl=.045,Ol=[[1,0,0],[0,1,0],[0,0,1]],kl=(e,t)=>H(e,U(t,W(e,t)));function Al(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]<Dl)?t:-1}var jl=(e,t)=>e===`cylinder`&&!!t&&t[1]<Dl&&Math.min(t[0],t[2])>=Dl&&Math.abs(t[0]-t[2])<.1*t[0],Ml=(e,t)=>e?.objects?.[t]?.grasp??e?.others?.[t]?.grasp??null;function Nl(e,t){let n=[],r=(t,r)=>Object.entries(Ml(e,t)??{}).forEach(([e,i])=>n.push({...i,name:r+e,owner:t}));r(t,``);for(let i of Cm(e,t)){i!==t&&r(i,`${i}.`);let{half:a,renderer:o}=e.objects[i],s=Al(a);s>=0?n.push({name:i,owner:i,at:[0,a[1],0],axis:Ol[s],radius:Math.min(...a.filter((e,t)=>t!==s))}):jl(o,a)&&n.push({name:i,owner:i,at:[0,a[1],0],rim:a[0],normal:Ol[1]})}return n}var Pl=(e,t,n)=>Nl(e,t).find(e=>e.name===n);function Fl(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 Il(e,t){let n=kl(H(t,e.p),e.normal),r=G(n)>1e-6?K(n):K(kl(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(La(e.normal,r))}}function Ll(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 Rl(e,t){let n=H(t,e.p);return e.rim?Math.hypot(W(n,e.normal),G(kl(n,e.normal))-e.rim):G(e.axis?kl(n,e.axis):n)}function zl(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(kl(t.axis,t.from))<.001)){if(t.from){let e=o(t.from),n=K(kl(t.axis,e)),i=n=>t.thumb?W(n,t.thumb):W(La(n,e),r),a=i(n)>=i(U(n,-1))?n:U(n,-1);return Vl(La(a,e),a,e)}let e=Bl(r,t.axis),n=J(X(i),[a?1:-1,0,0]),s=Math.abs(e[1]),c=t.thumb??kl(V(U([0,1,0],1-s),U(n,s)),e),l=K(kl(t.axis,e)),u=W(l,c)>=0?l:U(l,-1);return Vl(e,u,La(e,u))}let s=o(t.from??U(r,-1)),c=Bl(r,s);return Vl(c,La(s,c),s)}function Bl(e,t){let n=kl(e,t);return K(G(n)>.001?n:kl(Math.abs(t[1])<.9?[0,1,0]:[1,0,0],t))}var Vl=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]];function Hl(e,t){let n=rh[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 Ul=new Set([`body`]);function Wl(e,t,n,r,i,a){let o=e.spec.anchors?.[t];if(!o)throw Error(`MOTION_SPEC_INVALID: unknown anchor "${t}"`);let s=Xl(e,o,t,n,r,i,a),c=Ul.has(o.kind)&&e.keepOut;return c?os(c.body,e.sk,n,os(c.body,e.sk,n,s,ss,c.skip),ss,c.skip):s}var Gl=[`r`,`l`],Kl={l:`left`,r:`right`};function ql(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]??hl(e.scene)[t.object],l=e.objectPose&&s!==void 0?e.objectHand(t.object,s):null;if(o&&l&&Gl.indexOf(l)>Gl.indexOf(o))throw Error(`MOTION_SPEC_INVALID: anchor "${n}" is on "${t.object}", which the ${Kl[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():Yl(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 Jl=16;function Yl(e,t,n,r,i){if((e.nest??0)>=Jl)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 Xl(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[`${rh[t.reach]}Arm`]],l=.95*Hl(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 Ql(e,n,r,i,a,o).p;let s=ql(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 io(r,c.Head,s.landmarks[t.name]??(()=>{throw Error(`MOTION_SPEC_INVALID: unknown landmark "${t.name}"`)})());case`prop`:{let r=Zl(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=wl(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: ${Tl(e.scene)})`);return V(r,t.offset??[0,0,0])}default:throw Error(`MOTION_SPEC_INVALID: anchor "${n}" has unknown kind "${t.kind}"`)}}function Zl(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(!xh(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=Yl(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 Ql(e,t,n,r,i,a){let o=e.spec.anchors[t],s={s:n,diag:r,c:i},c=n=>ql(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=Nl(e.scene,o.object),i=e.sk.index,s=l??n.P[i[a?`${rh[a]}Arm`:`Hips`]],u=o.socket?Pl(e.scene,o.object,o.socket):r.map(e=>({k:e,d:Rl(Fl(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?Fl(u,c(u.owner)):{p:l??c(o.object).pos};if(u?.rim)d=$l(e,t,a,u,c(u.owner),d,l??n.P[e.sk.index[a?`${rh[a]}Arm`:`Hips`]]);else if(l)d.p=l;else if(d.axis&&d.radius>0){let t=Math.abs(Wc[o.grasp]?.[2]??0),r=d.radius-t,i=n.P[e.sk.index[`${rh[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=Ll(Cm(e.scene,o.object).map(t=>({...c(t),half:e.scene.objects[t].half})),d.p)),d}function $l(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=Il(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 Fl(e.rims.get(s),i)}function eu(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=yo(i,n,rh[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 tu={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 nu(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 ru(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 iu(e,t,n){let r=e.frames?.[t-(e.f0??0)],i=nu(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}=sl(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]?Wl(e.ctx,i.name,a,{...o,frame:t},s):null;case`landmark`:return c.landmarks?.[i.name]?io(a,c.index.Head,c.landmarks[i.name]):null;case`object`:{let n=zm(e,i.name,t);return n?ru(n,i.point):null}case`person`:return wl(e.ctx.scene,i.name,i.point,t);default:return null}}function au(e,t,n,r){let i=e=>{let t=nu(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=iu(e,t,a[0]),r=zm(e,a[1].name,t);return n&&r?Math.max(0,Math.min(...r.map(e=>Ks(n,e)))):null}let o=iu(e,t,n),s=iu(e,t,r);return o&&s?G(H(o,s)):null}function ou(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`))?sl(t,r).bone:null,l=[i.includes(`object`)&&(n?.objects?.[a]||Cm(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 su(e,t,{sk:n,scene:r},i,a,o=Nc){let s=nu(a),c=`${i} "${a}"`;if(!s||!o.includes(s.kind))return t(`${c} must be ${o.map(e=>tu[e]).join(`, `)}${s?``:ou(e,{sk:n,scene:r},a,o)}`),!1;if(s.kind===`joint`||s.kind===`bone`){let{bone:e,hint:r}=n?sl(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${el(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=!!wl(r,s.name,s.point,0);return e||t(`${c}: no person "${s.name}" with joint "${s.point}" (people with an installed take: ${Tl(r)})`),e}return ll(t,r,c,s.name,{groups:!0})}var cu=[0,1,0];function lu(e,t,n=`up`,r){if(Array.isArray(n))return K(n);if(n===`face`){let{sk:n}=e.ctx;return K(ao(n,e.frames[t-(e.f0??0)].s,n.index.Head,[0,0,1]))}let i=n===`up`?null:iu(e,t,n),a=i?H(i,r):cu;return G(a)>1e-9?K(a):cu}function uu(e,t,n){let r=e.f0??0,i=Math.max(r,Math.min(r+e.frames.length-1,n)),a=iu(e,i,t.follow);if(!a)return null;let o=Xa(Io(cu,lu(e,i,t.aim,a)));return{pos:V(a,J(o,t.offset??[0,0,0])),R:o}}function du(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 fu(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 pu=/^(spine|head)_(yaw|pitch|roll)$|^(aswing|abend)_[lr]$/,mu={spine:0,head:2,arms:3},hu=.15,gu=6,_u=e=>/^(spine|head)_/.test(e)?[`l`,`r`]:/^(aswing|abend)_([lr])$/.test(e)?[e.slice(-1)]:[],vu=e=>/^spine_/.test(e)?`spine`:/^head_/.test(e)?`head`:/^(aswing|abend)_[lr]$/.test(e)?`arms`:null;function yu(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}:{...mu,...n??{}};return{smooth:t.smooth!==!1,lag:r}}function bu(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(gu,hu*(o-a));for(let c=0;c<12;c++){let c=0;for(let s=1;s<16;s++){let l=fu([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 xu=e=>Array.isArray(e)?`vec`:e&&typeof e==`object`?`map`:`num`;function Su(e,t,n=yu()){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=xu(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&&pu.test(e),f=n.lag[vu(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?bu(u,e):du(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 fu(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)&&_u(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=_u(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 Cu=(e,t)=>Object.fromEntries(Object.entries(e).map(([e,n])=>[e,n[t]])),wu=24,Tu=360/wu,Eu=.2,Du=12,Ou=8,ku=e=>Math.round(e*1e5)/1e5,Au=(e,t)=>2*Math.acos(Math.min(1,Math.abs(jo(e,t)))),ju=(e,t,n)=>e.lean>0&&e.aim&&n>0?V(e.pos,U(H(K(e.aim),Fo(t,[0,1,0])),n)):e.pos;function Mu(e,t){let n=K(La(e,Math.abs(e[1])<.9?[0,1,0]:[1,0,0])),r=La(e,n),i=[e];for(let a of[t/2,t])for(let t=0;t<Ou;t++){let o=2*Math.PI*t/Ou,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 Nu(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+Eu*Au(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 Pu(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<Du;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 Fu(e,t,n){let r=e.map((e,r)=>{if(e.aim===void 0)return{fixed:Mo(e.rot)};let i=Mo(t(r)),a=e=>{let t=ko(Io(K(Fo(i,[0,1,0])),e),i);return n=>ko(Lo(e,n),t)};if(e.lean>0&&n)return{leans:Mu(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:wu},(e,t)=>t*Tu-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:wu},(r,i)=>{let a=i*Tu-180,o=e.rolled(a);return{q:o,cost:n(t,o),r:a}})),o=Nu(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(Pu(e=>{let r=i.rolled(e),a=[s[t-1],s[t+1]].filter(Boolean);return n(t,r)+a.reduce((e,t)=>e+Eu*Au(t.q,r)**2,0)},s[t].r-Tu/2,s[t].r+Tu/2))).map(ku);l&&jo(r,l)<0&&(r=r.map(e=>-e)),c.push(r),l=Mo(r)}return c}var Iu=1e3,Lu=4,Ru=.03,zu=.6,Bu=.05,Vu=45,Hu=2,Uu=.05,Wu=10,Gu=400,Ku=16,qu=4,Ju=Array.from({length:72},(e,t)=>2*Math.PI*t/72-Math.PI);function Yu(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 Xu(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<Lu&&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+Ru),s=e(r,t-Ru);n[r][2]=Math.max(Bu,(a+s-2*i)/(Ru*Ru)),o[r]=-(a-s)/(2*Ru)});let s=a.map((e,n)=>t(n,e)),c=a.map((e,n)=>U(H(t(n,e+Ru),t(n,e-Ru)),1/(2*Ru)));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*Iu*r[e]:2*Iu;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=Yu(n,o);a.forEach((e,t)=>{a[t]=e+Math.max(-.6,Math.min(zu,l[t]))})}return a}function Zu(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)>Uu&&i(n)>Hu*Math.max(i(n-1),i(n+1))&&Za(t(n,e[n]),t(n+1,e[n+1]))>Vu)}function Qu(e,t,n,r){let i=r.length,a=Vu*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]+Wu*i*i+(i>a?Gu*(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 $u(e,t,n,r,i=Ju){let a=Xu(e,t,n);if(!Zu(a,r,t).length)return a;let o=Qu(e,r,a.length,i),s=Xu(e,t,o),c=Zu(s,r,t);if(!c.length)return s;let l=Xu(e,t,o,new Float64Array(Math.max(0,s.length-2)).map((e,t)=>c.some(e=>e>=t-qu&&e<=t+1+qu)?Ku:1));return Zu(l,r,t).length?a:l}function ed(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 td(e,t,n,r){let i=n.map(n=>{let{s:i,held:a}=r(n);return Bs(e,i,t,a)}),a=$u((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 nd=Ws.filter(e=>e[0].startsWith(`torso`)),rd=Ws.find(e=>e[0]===`hand_l`)[3],id=.004;function ad(e,t,n){let r=H(n,t);return G(H(e,V(t,U(r,za(W(H(e,t),r)/Math.max(W(r,r),1e-12),0,1)))))}function od(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 sd(e,t,n,r,i=()=>null){let a=e.index,o=Object.entries(t.ctx.spec.objects??{}).filter(([,e])=>wh(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,id]);for(let[t,i,o,s]of nd){let c=new Map;for(let[e,t,n]of u)c.set(e,Math.max(c.get(e)??-1/0,s+n-ad(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*rd-qs(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=od(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=>Ks(e,s)));c>n.object&&r(`OBJECT`,`${t} into ${a}`,e,c,n.object)}}}}var cd=[[/^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 ld(e,t){let n=e.names[t]??``,r=/^Left/.test(n)?`_l`:/^Right/.test(n)?`_r`:``,i=cd.find(([e])=>e.test(n));return i?`${i[1]}${r}`:n}var ud=[`Arm`,`ForeArm`,`Hand`].flatMap(e=>[`Left${e}`,`Right${e}`]);function dd(e,t,n,r,i){let a=Jo(e);if(!a)return;let o=ud.map(t=>e.index[t]);t.frames.forEach(({s:t},s)=>{for(let c of o){let o=us(a,e,t,c);if(o.into<0)continue;let l=ld(e,c),u=ld(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 fd=.05,pd=new WeakMap;function md(e){let t=pd.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)})),pd.set(e,t)),t}function hd(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 gd(e,t,n){let r=0;for(let i of md(e.objectsAt(t))){let e=hd(i,n);e!==null&&e<=n[1]+fd&&e>r&&(r=e)}return r}function _d(e,t,n){let r=Zs(e.ctx.sk,e.frames[t].s,n);for(let n of[`heel`,`ball`,`tip`])r[n]=[r[n][0],r[n][1]-gd(e,t,r[n]),r[n][2]];return r}var vd=[`Hips`,`Head`,`LeftHand`,`RightHand`,`LeftFoot`,`RightFoot`,`LeftLeg`,`RightLeg`,`LeftForeArm`,`RightForeArm`],yd=new Set([`Hips`,`Head`]),bd=[[`knee_l`,`LeftUpLeg`,`LeftLeg`,`LeftFoot`],[`knee_r`,`RightUpLeg`,`RightLeg`,`RightFoot`],[`elbow_l`,`LeftArm`,`LeftForeArm`,`LeftHand`],[`elbow_r`,`RightArm`,`RightForeArm`,`RightHand`]],xd=2,Sd=.75,Cd=.05,wd=e=>Math.round(e*100)/100;function Td(e,t){let n=t.frames,r=n.length;return vd.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:yd.has(t),v:a,a:o,A:s}})}function Ed({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 Dd=(e,t,n)=>e.a[t]>n&&e.a[t]>xd*Ed(e,t);function Od(e,t,n,r){for(let i of Td(e,t)){let e=i.core?n.accCore:n.accLimb;for(let t=2;t<i.a.length;t++)Dd(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 kd=[`hips`,`torso_lo`,`torso_hi`],Ad=.04;function jd(e,t,n){let{P:r}=e.frames[t].s,i=e.ctx.sk.index;return Ws.some(([e,t,n,a])=>kd.includes(e)&&Math.min(r[i[t]][1],r[i[n]][1])-a<Ad)?!0:n.some(n=>{let a=e.objectsAt(t)[n.object],o=Ws.find(e=>e[0]===(n.part??`hips`));return a&&o&&Math.min(...Gs(r[i[o[1]]],r[i[o[2]]]).map(e=>Ks(e,a)))-o[3]<(n.tol??.04)})}function Md(e,t=[]){let n=e.ctx.sk.index,r=e.frames;return r.map(({s:i},a)=>{if(jd(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=_d(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 Nd=.06;function Pd(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]-gd(e,t,n[r[i]])<Nd))}function Fd(e,t=[]){let n=e.frames.length,r=[],i=e.frames.map((n,r)=>!jd(e,r,t)&&[`Left`,`Right`].every(t=>{let n=_d(e,r,t);return Math.min(n.heel[1],n.ball[1])>=.02})&&!Pd(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 Id(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 Fd(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<=Sd))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:Sd})}return s}var Ld=(e,t,[,n,r,i])=>Za(H(t.P[e.index[r]],t.P[e.index[n]]),H(t.P[e.index[i]],t.P[e.index[r]]));function Rd(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 Td(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]&&!Dd(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 bd.slice(0,2)){let a=Ld(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`)&&Md(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 zd(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(Td(e,t).map(({j:e,v:t,a:n})=>[e,{speed:a(t,i),accel:a(n,i*i)}]).filter(([,e])=>e.speed[0]>=Cd)),s=Md(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=Fd(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=[wd(e),t+r])});let d=c(e=>typeof e==`number`&&e<0),f=Object.fromEntries(bd.map(n=>{let i=[0,r];return t.frames.forEach(({s:t},a)=>{let o=Ld(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 Bd(e,t,n,r){let i=e=>Object.hasOwn(n??{},e),a=new Float64Array(t.frames.length);for(let n of Td(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)&&(Dd(n,e,r[c])&&(a[e]=Math.max(a[e],Math.sqrt(o[e]/Math.max(r[c],xd*Ed(n,e))))),i(c)&&(a[e]=Math.max(a[e],Math.sqrt(o[e]/r[c]))))}return a}var Vd=[0,1,0],Hd=.7,Ud=.025,Wd=new Map;function Gd(e,t){let n=`${e.model}:${t}`;if(Wd.has(n))return Wd.get(n);let r=Jo(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/Ud)).join();c.has(u)||(c.add(u),i.push([n.b,l]))}}return Wd.set(n,i),i}function Kd(e,t,n){let r=Gd(e,n);if(!r?.length){let r=Zs(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 qd(e,t){let n={top:-1/0,side:-1/0,topAt:null,sideAt:null};for(let r of e){let e=-Ks(r,t);if(e<=0)continue;let i=W(Qs(r,t),Vd)>Hd?`top`:`side`;e>n[i]&&(n[i]=e,n[`${i}At`]=r)}return n}function Jd(e,t,n,r,i,a,o){for(let[s,c]of[[`Left`,`l`],[`Right`,`r`]]){let l=Kd(e,t,s),u=`foot_${c}`;for(let[e,t,s,c]of r){if(l.every(e=>Ra(e,s)>c))continue;let r=qd(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 Yd={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},Xd=20,Zd=.01,Qd=(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 $d(e,t,n={}){let r={...Yd,...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 Ws){let u=s.P[a[t]],f=s.P[a[o]],p=U(V(u,f),.5),m=l+Ra(u,f)/2,h=null;for(let[t,a,o,s]of d){let d=Qd(n.allow,e,t)??r.allow;if(m-(Ra(p,o)-s)<=d)continue;h??=Gs(u,f);let g=l-Math.min(...h.map(e=>Ks(e,a)));g>d&&c(`COLLIDE`,`${e} x ${t}`,i,g,d)}}Jd(e,s,i,d,r,(e,t)=>Qd(n.allow,e,t),c);for(let t of[`Left`,`Right`]){let n=Zs(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(...Gs(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=Js(e,s,n)+a;o>r.headAllow&&c(`FACE`,`${t} into head`,i,o,r.headAllow)}qs(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),qs(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=Za(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+Zd&&c(`KNEE`,`${e} knee folds ${o.toFixed(0)}deg`,i,o,160);let d=Za(H(s.P[a[`${e}ForeArm`]],s.P[a[`${e}Arm`]]),H(s.P[a[`${e}Hand`]],s.P[a[`${e}ForeArm`]]));d>150+Zd&&c(`ELBOW`,`${e} elbow folds ${d.toFixed(0)}deg`,i,d,150)}}let l=(e,t)=>Qd(n.allow,e,t);sd(e,t,r,c,l),dd(e,t,r,c,l);for(let e of[`Left`,`Right`]){let n=o.map((n,r)=>_d(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=Ra(e.restWorldPos[t],e.restWorldPos[n]),i=Math.max(...o.map(e=>Math.abs(Ra(e.s.P[t],e.s.P[n])-r)));i>.001&&c(`LENGTH`,`${e.names[n]}-${e.names[t]}`,0,i,.001)}return Od(e,t,r,c),ef(e,o,r,c),i}function ef(e,t,n,r){let i=e.index,a=Math.sin(Xd*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=La(f,p);if(G(m)<a*G(f)*G(p))continue;let h=K(m),g=e?Za(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 tf=36,nf=.05,rf=.3,af=3,of=10,sf=36,cf=1,lf=100,uf=Ws.filter(e=>e[0].startsWith(`torso`)),df=Object.fromEntries(Ws.map(e=>[e[0],e[3]])),ff=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],pf=(e,t)=>[e[0][t],e[1][t],e[2][t]];function mf(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?za((d*l-u*c)/f,0,1):0,m=(d*p+l)/c;return m<0?(m=0,p=za(-u/s,0,1)):m>1&&(m=1,p=za((d-u)/s,0,1)),G(H(V(e,U(i,p)),V(n,U(a,m))))}function hf(e,t,n){let r=e.index,i=yo(e,t,n);return{pos:U(V(t.P[r[`${n}HandIndex2`]],t.P[r[`${n}HandMiddle2`]]),.5),R:ff(i.d,i.l,i.n)}}function gf(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=hf(e,r,rh.r).R,l=pf(c,0),u=K(La(a,H(l,U(a,W(l,a))))),d=e=>H(e,U(u,2*W(e,u))),f=ff(d(l),d(pf(c,1)),U(d(pf(c,2)),-1)),p=hf(e,r,rh.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(Ka(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=Ls(e,r,rh.l),D=t.fix===!1||t.fix?.self===!1?null:Jo(e),O={uarm_l:m.LeftArm,farm_l:m.LeftForeArm,hand_l:m.LeftHand},k=(t,n,i)=>D?ls(D,e,r,O[i],t,n):Math.max(0,...uf.map(([,e,a,o])=>df[i]+o-mf(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=Os(e,r,rh.l,x(t),n,E,ms),a=e=>{let t=i.at(e);return{pv:t.pv,elbow:t.elbow,cost:t.cost+cf*((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<sf;e++){let t=2*Math.PI*e/sf-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-Yd.body),u=2*df.hand_l-mf(n,s,r.P[m.RightHand],r.P[m.RightHandMiddle3]),d=Math.max(0,u-Yd.hands),f=cf*((100*c)**2+(100*i.miss)**2)+(l>0?lf*(100*l)**2:0)+(d>0?lf*(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+rf*(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:tf},(e,t)=>{let n=2*Math.PI*t/tf-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)/nf);return[e[0]+i*Math.cos(n),e[1]+i*Math.sin(n)]},[0,0]);return Math.atan2(n[1],n[0])},measure:t=>hf(e,t,rh.l)}}var _f=(e,t)=>Math.exp(-Math.max(0,e.cost(t)-af)/of),vf=(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}),yf=.045,bf=4,xf=8,Sf=[30,10],Cf=2,wf=4,Tf=2,Ef=.1,Df=1.5,Of=20,kf=4,Af=8,jf=400,Mf=[`the fingers' line`,`the palm normal`,`the knuckle line`],Nf=(e,t)=>[e[0][t],e[1][t],e[2][t]],Pf=e=>{let t=Y(e.R);return{pos:U(J(t,e.pos),-1),R:t}},Ff=e=>Math.round(e*100)/100;function If(e,t,n){let r=Ya(e),i=Ya(t);return jo(r,i)<0&&(i=i.map(e=>-e)),Xa(Ro(r,i,n))}function Lf(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+Af*c*c+(s>o?jf*((s-o)/o)**2:0)}function Rf(e,t,n,r,i){let{goal:a,plane:o,wristAt:s}=Rs(e,t,n,r,i,1),c=s(a),l=Os(e,t,n,a,c,o,ms),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,so(p,m,145)-G(H(c,f))),g=Jo(e),_=g?Math.max(ls(g,e,t,d[`${n}Arm`],f,u.elbow),ls(g,e,t,d[`${n}ForeArm`],u.elbow,c),ls(g,e,t,d[`${n}Hand`],c,r.pos)):0;return[`twist`,`flex`,`dev`].reduce((e,t)=>e+Lf(u.need[t],fs[t],ds[t]),0)+Of*((l.miss*100)**2+(h*100)**2)+kf*(_*100)**2}function zf(e,t,n,r,i,a,o){if(r.aim===void 0)return o({pos:r.pos,R:Xa(r.rot)});let s=Ya(Oh(i,a).R),c=K(r.aim),l=ko(Io(K(Fo(s,[0,1,0])),c),s),u=e=>({pos:r.pos,R:Xa(ko(Lo(c,e),l))});if(r.roll!==void 0)return o(u(r.roll));let d=null;for(let r=0;r<bf;r++){let o=u(360/bf*r-180),s=Vs(e,t,n,Oh(o,Pf(a)),i);(!d||s<d.strain)&&(d={p:o,strain:s})}return o(d.p)}function Bf(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]<yf)}var Vf=(e,t)=>e.length<=t?e:Array.from({length:t},(n,r)=>e[Math.round(r*(e.length-1)/(t-1))]);function Hf(e,t){let n=No(Ya(q(Y(e),t)));return`today's grip turned ${Math.round(2*G(n)*180/Math.PI)} deg, mostly about ${Mf[[0,1,2].reduce((e,t)=>Math.abs(n[t])>Math.abs(n[e])?t:e,0)]}`}function Uf({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=Vf(f,xf),m=e=>kh({pos:d.pos,R:e},i),h=(t,r,i)=>{let{s:a,now:o}=l(r);return Rf(e,a,n,Oh(i,Pf(t)),o)},g=t=>Rf(e,u,n,Oh(i,Pf(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+zf(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=mp(t,s,e=>Ya(Oh(l(e).now,a).R),(t,r,i,o)=>{let{s,now:c}=l(t);return Vs(e,s,n,Oh({pos:r,R:Xa(i)},Pf(a)),c,o)},2*(i?.half?.[1]??0)),d=g(a),p=d;for(let e=o;e<=c;e+=wf){let t=h(a,e,_p(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<=Df)return{offset:y.A,name:`today`,cost:Ff(y.cost),today:Ff(y.cost)};let b={R:d.R,rough:_(d.R)};for(let e of Sf)for(let t=0,n=!0;n&&t<Cf;t++){n=!1;for(let t of[0,1,2])for(let r of[1,-1]){let i=q(Ka(Nf(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:Hf(d.R,b.R),...v(b.R)},S=x.cost<y.cost-Math.max(Tf,Ef*y.cost)?x:y;return{offset:S.A,name:S.name,cost:Ff(S.cost),today:Ff(y.cost)}}var Wf=3,Gf=12,Kf=.05,qf=.3,Jf=180/Math.PI,Yf=40,Xf=1,Zf=.3,Qf=[-40,-40/2,0,Yf/2,Yf];function $f(e){let t=Math.min(...e.map(e=>e[1])),n=e.map(([e,n])=>[e,Math.exp(-(n-t)/Zf)]);return n.reduce((e,[t,n])=>e+t*n,0)/n.reduce((e,[,t])=>e+t,0)}function ep(e){let t=Array.from({length:Gf},(t,n)=>{let r=2*Math.PI*n/Gf-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)/Kf);return[e[0]+i*Math.cos(t),e[1]+i*Math.sin(t)]},[0,0]);return Math.atan2(r[1],r[0])}var tp=({d:e,l:t,n})=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],np=(e,t)=>e.anchors?.[t]?.kind===`object`&&!!e.anchors[t].grasp,rp=(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 ip(e,t,n,r){let i=new Set(Cm(t,n));return(e.fits??[]).some(a=>{if(a.side!==r||!np(e,a.anchor))return!1;let o=e.anchors[a.anchor].object;return o===n||i.has(o)||Cm(t,o).some(e=>i.has(e))})}function ap(e,t,n){let{spec:r,scene:i}=e;if(!e.objectHand||!(r.fits??[]).some(e=>e.side===t&&np(r,e.anchor)))return null;for(let[a,o]of Object.entries(r.objects??{}))if(o?.prop&&e.objectHand(a,n)===t&&ip(r,i,a,t))return{id:a,grab:e.carrySpan(o)[0],keyed:!!o.keys?.length};return null}function op(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??Ql(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=zl(r,g,y,v,a.yaw),x=(e=>({pos:c(e),R:tp(yo(t,e,r))}))(n),S=e=>{let i=Rs(t,n,r,{pos:_,R:e},x,1,`palm`);return ks(t,n,r,i.goal,i.wristAt(i.goal),i.plane,ms).cost},C=(e,t)=>[e[0][t],e[1][t],e[2][t]],w=e=>q(Ka(C(b,1),e*Jf),b),{R:T,roll:E,tilt:D}=sp(e,s.fit.anchor,i,u,()=>{let e=g.axis&&!g.from&&y!==`palm`?ep(e=>S(w(e))+qf*(1-Math.cos(e))):0,t=w(e),n=e=>q(Ka(C(t,2),e),t),r=g.axis&&y!==`palm`?$f(Qf.map(e=>[e,S(n(e))+Xf*(e/Yf)**2])):0;return{R:n(r),roll:e,tilt:r}}),{goal:O,plane:k,wristAt:ee}=Rs(t,n,r,{pos:_,R:T},x,s.w,`palm`),te=ks(t,n,r,O,ee(O),k,ms,{w:s.w}),ne={twist:0,flex:0,dev:0};for(let e=0;e<Wf;e++)_o(t,n,f,p,m,ee(e?n.R[m]:O),te.pole,ms,`elbow`),ne=Is(t,n,r,m,p,O);o[`grip_${i}`]={w:s.w,socket:!0,...ne,roll:E*Jf,tilt:D},o[`socket_${i}`]={rel:q(Y(h),n.R[m])}}function sp(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 cp(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`];Is(t,n,r,u,l,q(n.R[l],s))}var lp=12,up={m:.01,deg:5},dp=e=>e*e*(3-2*e),fp=(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)]},pp=e=>{let t=Y(e.R);return{pos:U(J(t,e.pos),-1),R:t}};function mp(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=Fu(a,e=>n(o[e]),r&&((e,t)=>r(o[e],ju(a[e],t,i),t,a[e].lean?{shoulder:!0}:void 0))),l=a.map((e,t)=>ju(e,Mo(c[t]),i).slice());for(let e of c){let t=Mo(e);s.push(s.length&&jo(s[s.length-1],t)<0?t.map(e=>-e):t)}let u=a.length-1,d=e=>U(No(ko(Ao(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 hp=new WeakMap;function gp(e,t){hp.has(e)||hp.set(e,new Map);let n=hp.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:mp(e.ctx.spec.objects[t],e=>r?r(e):e,e=>Ya(a.carryOn(t,s(e)).R),(e,n,r,i)=>a.strainOn(t,s(e),{pos:n,R:Xa(r)},i),2*(e.ctx.scene?.objects?.[t]?.half?.[1]??0))})}return n.get(t).curve}function _p({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:Xa(n[0])};if(a>=e[o-1])return{pos:t[o-1].slice(),R:Xa(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))),_=ko(Ao(n[s]),n[s+1]),v=V(V(U(No(_),m),U(i[s],c*p)),U(Fo(_,i[s+1]),c*h));return{pos:g,R:Xa(ko(n[s],Po(v)))}}function vp(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?dp(1-s/o):0}var yp=e=>Object.entries(e.objects??{}).filter(([,e])=>xh(e)&&e.keys?.length);function bp(e,t,n,r){let{sk:i,spec:a,scene:o}=e,s=yp(a);if(!s.length)return null;let c=new Set(s.map(([e])=>e).filter(e=>fc(a,a.objects[e],o,e)).map(e=>a.objects[e])),l=(e,t)=>Dh(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]??hl(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=fp(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])&&Bf(o,e)&&!(a.fits??[]).some(e=>e.side===c&&e.orient===!1)&&!ip(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,Uf({sk:i,o:s,side:rh[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)?hc(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]??hl(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(fp(t,f)[0]).s:eo(i)}finally{d.delete(r)}let y=kh(l(f,v),_?e.restingAt?.(r,fp(t,f)[0])??{pos:m.pos,R:m.R}:Dh(i,a,v,f)),b=_&&c.has(f)?hc(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?vc(i,r,_c(fp(t,a.objects[e])[0],n)):r},v=(e,t)=>Oh(l(a.objects[e],t),g(e)),y=(e,t,n,r)=>{let o=a.objects[e];return Vs(i,t,rh[a.props[o.prop].hand],Oh(n,pp(g(e))),l(o,t),r)},b=(e,n,r)=>{let i=gp(t,e),a=vp(i,fp(t,n),r);return a>0?{w:a,palm:Oh(_p(i,r),pp(_(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]=fp(t,r),u=[];for(let n=Math.max(0,c);n<=Math.min(t.frameCount-1,l);n++)vp(gp(t,e),[c,l],n)>0&&u.push(n);let d=td(i,rh[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 gf(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]=fp(t,n),c=new Map;C=!0;let l=[],u=()=>{let e=Xu((e,t)=>l[e].grip.cost(t),(e,t)=>l[e].grip.point(t),l.map(e=>e.grip.softmin())),t=ed(l.map((t,n)=>_f(t.grip,e[n]))),n=t=>l[t].grip.arm(e[t]),r=Xu((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=vp(gp(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=gp(t,e),o=a.t[0],s=a.t[a.t.length-1],[c,u]=fp(t,n);if(r>=o&&r<=s)return null;let d=Oh(_p(a,r<o?o:s),pp(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=dp(Math.max(0,1-(r<c?c-r:r-u)/lp));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:If(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(fp(t,r)[0],Math.round(gp(t,e).t[0]))).s)}finally{d.delete(e)}let c=kh(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))>up.m||u>up.deg;return a.set(e,{map:t.timeMap,off:f}),f},ee=(e,n,r)=>{let i=gp(t,e),[a,o]=fp(t,n),s=Math.max(a,Math.round(i.t[0]));if(!(r<s&&r>=s-lp)||s-a>=8||s>o)return null;let c=Oh(_p(i,s),pp(g(e)));if(!k(e,n,c))return null;let u=dp(1-(s-r)/lp);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=gp(t,e),a=i.t[i.t.length-1],o=fp(t,n)[1];return r>o&&r-a<8?{curve:i,release:o,w:dp(1-(r-a)/8)}:null},ne=(e,t,n)=>{let r=te(e,t,n);return r&&{w:r.w,palm:Oh(_p(r.curve,r.release),pp(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?vp(gp(t,o),fp(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 vf(f,d,m,p?.gate??_f(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=>fp(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 xp=[0,0,0];function Sp(e,t,n,r){return Array.isArray(e?.v)?e.v:e?.v===`hand`&&n?U(H(t.pos,n.pos),r):xp}var Cp=e=>e.some(e=>e!==0),wp=(e,t,n)=>(t+Math.sqrt(t*t+2*n*Math.max(0,e)))/n,Tp=(e,t,n)=>{let r=Math.min(t,n);return[e[0]*r,0,e[2]*r]};function Ep(e,t,n,r,i=[]){let a=e(t),o=a.top+a.h,s=e=>({pos:V(t.pos,Tp(n,wp(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 Dp=.3,Op=.5,kp=15,Ap=1,jp=6*Math.PI,Mp=3,Np=[0,-1,0],Pp=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],Fp=e=>e*180/Math.PI;function Ip(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 Lp=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]]),Rp=(e,t)=>V(e.pos,J(e.R,t)),zp=(e,t)=>Math.min(...Lp(e).map(e=>Rp(t,e)[1])),Bp=(e,t,n)=>({pos:[t.pos[0],t.pos[1]+n-zp(e,t),t.pos[2]],R:t.R}),Vp=(e,t,n)=>({pos:V(t,J(n,H(e.pos,t))),R:q(n,e.R)}),Hp=e=>Pp.reduce((t,n,r)=>W(J(e,n),Np)>W(J(e,Pp[t]),Np)?r:t,0),Up=(e,t)=>{let n=t>>1;return Pp[t][n]>0?e.hi[n]:e.lo[n]},Wp=(e,t)=>Math.abs(Up(e,t)-e.com[t>>1]);function Gp(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(za((r[0][0]+r[1][1]+r[2][2]-1)/2,-1,1));if(i*n<Ap)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(jp,i*n);return G(a)>0?U(a,o):[0,0,0]}function Kp(e,t,n,r,i,a=[0,0,0]){let o=G(n),s=Rp(t,e.com),c=!a.some(e=>e!==0),l=r=>{let i=o>0?q(Ka(n,Fp(o*r)),t.R):t.R,l=c?[0,-.5*Zp*r*r,0]:[a[0]*r,a[1]*r-.5*Zp*r*r,a[2]*r];return{pos:H(V(s,l),J(i,e.com)),R:i}},u=Math.max(0,zp(e,t)-r);if(o===0)return{tl:c?Math.sqrt(2*u/Zp):wp(u,a[1],Zp),at:l};let d=1/(i*8),f=(c?Math.sqrt(2*(u+G(H(e.hi,e.lo)))/Zp):wp(u+G(H(e.hi,e.lo)),a[1],Zp))+d,p=0,m=d;for(;m<f&&zp(e,l(m))>r;)p=m,m+=d;for(let t=0;t<24&&m-p>1e-7;t++){let t=(p+m)/2;zp(e,l(t))>r?p=t:m=t}return{tl:m,at:l}}var qp=(e,t)=>.12+.9*Math.sqrt(Math.max(e,1e-4)/Zp)*Math.sqrt(t/90);function Jp(e,t,n,r,i=[0,0,0]){let a=[],o=Bp(e,t,n),s=0,c=(t,r,i)=>{let c=qp(Rp(o,e.com)[1]-n,i);a.push({from:o,pivot:t,axis:r,angle:i,time:c}),o=Bp(e,Vp(o,t,Ka(r,i)),n),s+=c},l=Hp(o.R),u=e=>Fp(Math.acos(za(W(J(o.R,Pp[e]),Np),-1,1))),d=u(l);if(d>Op){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>Fp(Math.atan2(Wp(e,t),Wp(e,l)))&&(l=t);let r=Lp(e).map(e=>Rp(o,e)).filter(e=>e[1]<=n+1e-4),i=J(o.R,Pp[l]);c(U(r.reduce(V,[0,0,0]),1/r.length),K(La(i,Np)),u(l))}let f=d>Op||G(i)>0?r:0;for(let t=0;t<Mp;t++){let t=Rp(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,Pp[n]),c=Rp(o,Pp[n].map((t,r)=>t?Up(e,n):r===l>>1?Up(e,l):e.com[r])),u=-W(H(t,c),s),d=Wp(e,n);if(!(u<0||d<r*.8))continue;let f=u<0||Fp(Math.atan2(u,r))<kp?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=Lp(e).map(e=>Rp(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(La(a.out,Np)),90),l=a.j}return{steps:a,rest:o,time:s}}function Yp(e,t){let n=t;for(let t of e.steps){if(n<t.time){let e=n/t.time;return Vp(t.from,t.pivot,Ka(t.axis,t.angle*e*e))}n-=t.time}return e.rest}var Xp=(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*Zp),Zp=9.8,Qp=.03,$p=.25,em=[`prop`,`follow`,`pivot`,`axis`,`channel`],tm=e=>!!e&&typeof e==`object`&&!Array.isArray(e)&&em.every(t=>e[t]===void 0)&&(e.keys!==void 0||e.fall!==void 0),nm=e=>e?.fall===void 0?[]:Array.isArray(e.fall)?e.fall:[e.fall],rm=(e,t)=>e?.objects?.[t]??hl(e)[t]??null,im=(e,t)=>Object.keys(e?.objects??{}).filter(n=>n===t||e.objects[n].ancestors?.includes(t));function am(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 om=e=>Math.max(...am(e).map(e=>e[1])),sm=(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 cm(e,t){let n=new Set;for(let[r,i]of Object.entries(t?.objects??{}))[r,...i.ancestors??[]].some(t=>wh(e.objects?.[t]))&&n.add(r);return n}function lm(e,t,n){let r=rm(e,t);return im(e,t).map(t=>({id:t,...Oh(n,kh(r,e.objects[t])),half:e.objects[t].half}))}function um(e,t,n,r,i=null){let a=lm(t,n,r),o=new Set(a.map(e=>e.id)),s=cm(e,t);if(!a.length)return{support:null,top:0,h:0};let c=Math.min(...a.flatMap(e=>am(e).map(e=>e[1]))),l=a.flatMap(am).reduce((e,t)=>V(e,t),[0,0,0]).map(e=>e/(a.length*8)),u=(i?im(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=om(n);sm(n,l)&&r<=c+.005&&(!d||r>d.top)&&(d={support:e,top:r})}if(!d&&i)for(let e of u){let n=om(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 dm=new WeakMap;function fm(e,t){dm.has(e)||dm.set(e,new Map);let n=dm.get(e);return n.has(t)||n.set(t,Ip(lm(e,t,{pos:[0,0,0],R:Ha()}))),n.get(t)}function pm(e,t,n,r,i,a,o,s=null){let c=Sp(a,r,s,o),l=Cp(c),u=r=>um(e,t,n,r,a.onto??null),d=l?Ep(u,r,c,Zp,Object.values(t.objects).map(om)):u(r),f=a.tumble===!1?null:fm(t,n);if(f){let e=s?Gp(s.R,r.R,o):[0,0,0],t=Kp(f,r,e,d.top,o,c),n=Jp(f,t.at(t.tl),d.top,Dp*d.h+Xp(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):Yp(n,a-t.tl)},rest:n.rest}}let p=d.h,m=l?wp(p,c[1],Zp):Math.sqrt(2*p/Zp),h=Tp(c,1/0,m),g=Math.min(.6,Math.max(0,a.bounce??$p)),_=Math.min(g*Zp*m,Math.sqrt(2*Zp*Qp)),v=2*_/Zp,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*Zp*t*t:t<=m+v?-p+_*(t-m)-.5*Zp*(t-m)**2:-p,a=Tp(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 mm(e,t,n=-1/0,r=1/0){let i=xh(e)?[]:[...e.keys??[]].sort((e,t)=>e.f-t.f),a=nm(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 hm(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 _p(n.curve,t);a=_p(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 gm=new WeakMap;function _m(e,t,n,r,i){gm.has(e.scene)||gm.set(e.scene,new Map);let a=gm.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=rm(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=mm(n,l,u,d);for(let e of f)e.run&&(e.curve=mp({keys:e.run},l,()=>Ya(c.R),null));return a.set(o,{map:r,o:n,spec:e.spec,events:f}),f}var vm=(e,t)=>(n,r)=>pm(e.spec,e.scene,t,n,r.t,r,e.spec.fps??30);function ym(e,t,n){let r=rm(e.scene,t),i=e.spec.objects?.[t];return!r||!i?null:hm(_m(e,t,i,e.timeMap,`all`),n,{pos:r.pos,R:r.R},vm(e,t))}function bm(e,t,n,r,i){let a=rm(e.scene,t);return!a||!nm(n).length?a&&{pos:a.pos,R:a.R}:hm(_m({...e,grab:i},t,n,e.timeMap,`before`),r,{pos:a.pos,R:a.R},vm(e,t))}function xm(e,t,n,r,i,a,o=null){let s=nm(n).length?_m({...e,release:i},t,n,e.timeMap,`after`):[];return s.length?hm(s,r,a,(n,r)=>pm(e.spec,e.scene,t,n,r.t,r,e.spec.fps??30,r.t<=i+1?o:null),!1):null}function Sm(e,t,n){let r=e.timeMap??(e=>e);return nm(t).some(e=>r(e.at)>=n)}function Cm(e,t){let n=e?.objects??{};return Object.keys(n).filter(e=>e===t||n[e].ancestors?.includes(t))}function wm(e,t){return xh(e)&&t>=(e.grab??0)&&(e.release===void 0||t<=e.release)}function Tm(e,t){return e?.objects?.[t]??hl(e)[t]??null}function Em(e,t,n){return[n,...t?.objects?.[n]?.ancestors??hl(t)[n]?.ancestors??[]].find(t=>wh(e.objects?.[t]))??null}function Dm(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 Om=(e,t,n)=>n.at===void 0&&n.along===void 0&&(!e?.objects?.[t]&&!!hl(e)[t]||n.grab!==void 0),km=new WeakMap,Am=new WeakMap,jm=new WeakMap,Mm=e=>({spec:e.ctx.spec,scene:e.ctx.scene,timeMap:e.timeMap});function Nm(e,t,n){let{spec:r,scene:i}=e.ctx,a=Em(r,i,t),o=r.objects?.[a];if(!xh(o))return null;let s=bm(Mm(e),a,o,n,Dm(e,o)[0]);return s&&(a===t?s:Oh(s,kh(Tm(i,a),Tm(i,t))))}function Pm(e,t){jm.has(e)||jm.set(e,new Map);let n=jm.get(e);if(n.has(t))return n.get(t);let{spec:r,scene:i}=e.ctx,a=r.objects?.[t],o=Tm(i,t),s=Cm(i,t),c=null;if(xh(a)&&a.release!==void 0&&o&&s.length){let n=Dm(e,a)[1];if(n<e.frameCount-1&&!Sm(Mm(e),a,n)){let l=Lm(e,t,a,n),u=s.flatMap(e=>am({...Oh(l,kh(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:Em(r,i,a),u=r.objects?.[l];if(!l||l===t||xh(u)||Sh(u))continue;let p={...Vm(e,a,n),half:o.half},m=om(p);sm(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 Fm(e,t){let n=e.frames[t-(e.f0??0)];if(n)return n;km.has(e)||km.set(e,new Map);let r=km.get(e);return r.has(t)||r.set(t,My(e.ctx,Cu(e.baked,t),t)),r.get(t)}function Im(e,t,n,r,i){let{sk:a,spec:o,scene:s}=e.ctx;if(!Om(s,t,n))return Dh(a,o,i,n);let c=fc(o,n,s,t);if(n.keys?.length&&e.ctx.hold){if(e.ctx.hold.attaching(t))return Tm(s,t);let l=Oh(Dh(a,o,i,{prop:n.prop},c),e.ctx.hold.attachAt(t,r)),u=Dm(e,n)[0];return c?vc(Nm(e,t,u)??Tm(s,t),l,_c(u,r)):l}let l=e=>Dh(a,o,e,{prop:n.prop},c),u=Dm(e,n)[0],d=kh(l(u===r?i:Fm(e,u).s),Nm(e,t,u)??Tm(s,t));return c?vc(Oh(l(i),d),Oh(l(i),hc(a,o,s,t,n,d)),_c(u,r)):Oh(l(i),d)}function Lm(e,t,n,r){let i=Fm(e,r);Am.has(i)||Am.set(i,new Map);let a=Am.get(i);return a.has(t)||a.set(t,Im(e,t,n,r,i.s)),a.get(t)}function Rm(e,t,n,r=null){let{spec:i,scene:a}=e.ctx,o=wh(i.objects?.[t])?i.objects[t]:void 0,s=Tm(a,t);if(Sh(o))return uu(r?{...e,f0:n,frames:[r]}:e,o,n);if(xh(o)&&(s||!Om(a,t,o))){let[i,a]=Dm(e,o),c=Math.max(i,Math.min(n,a));if(n<i&&s)return Nm(e,t,n);let l=n>a?xm(Mm(e),t,o,n,a,Lm(e,t,o,a),a>0?Lm(e,t,o,a-1):null):null;if(l)return l;let u=n>a?Pm(e,t):null;if(u){let r=Lm(e,t,o,a);return Oh(Rm(e,u,n),kh(Rm(e,u,a),r))}return r&&c===n?Im(e,t,o,n,r.s):Lm(e,t,o,c)}if(!s)return null;if(tm(o))return ym(Mm(e),t,n);if(o&&a.objects[t])return e.ctx.objectsAt(n)[t];if(o){let r=Cm(a,t)[0],i=e.ctx.objectsAt(n)[r];return Oh(i,kh(a.objects[r],s))}return{pos:s.pos,R:s.R}}function zm(e,t,n){let r=e.frames?.[n-(e.f0??0)],i=e.ctx.scene,a=Cm(i,t);return!r||!a.length?null:a.map(t=>{let r=Vm(e,t,n);return{id:t,pos:r.pos,R:r.R,half:i.objects[t].half}})}function Bm(e,t,n){let{spec:r,scene:i,sk:a}=e.ctx,o=r.objects?.[Em(r,i,t)];if(xh(o)){let[t,i]=Dm(e,o);return n>=t&&n<=i?r.props?.[o.prop]?.hand??null:null}if(!Sh(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(sl(a,c).bone??``);return l?l[1]===`Left`?`l`:`r`:null}function Vm(e,t,n,r=null){let{spec:i,scene:a}=e.ctx,o=Tm(a,t),s=Em(i,a,t),c=i.objects?.[s];if(!o)return null;if(xh(c)||Sh(c)||tm(c)){let t=Rm(e,s,n,r);return t&&Oh(t,kh(Tm(a,s),o))}return s?a.objects[t]?e.ctx.objectsAt(n)[t]??o:s===t?Rm(e,t,n):Oh(Rm(e,s,n),kh(Tm(a,s),o)):{pos:o.pos,R:o.R}}var Hm=.009,Um=8,Wm=70,Gm=[`Index`,`Middle`,`Ring`,`Pinky`],Km=.6,qm=e=>{let t=Math.min(1,Math.max(0,(e-Km)/.30000000000000004));return t*t*(3-2*t)};function Jm(e,t){let n=-1/0;for(let r=0;r+1<e.length;r++)for(let i of t)n=Math.max(n,oc(i,e[r],e[r+1],Hm));return n}function Ym(e,t,n,r,i){if(r<=0||Jm(e,i)>=-.002)return 0;let a=r=>{let i=Ka(n,r);return e.map(e=>V(t,J(i,H(e,t))))};if(Jm(a(r),i)<-.002)return null;let o=0,s=r;for(let e=0;e<Um;e++){let e=(o+s)/2;Jm(a(e),i)>=-.002?s=e:o=e}return s}function Xm(e,t,n,r,i){if(Jm(e,i)<-.002)return 0;let a=r=>{let i=Ka(n,-r);return e.map(e=>V(t,J(i,H(e,t))))};if(Jm(a(r),i)>=-.002)return Jm(a(r),i)<Jm(e,i)?r:0;let o=0,s=r;for(let e=0;e<Um;e++){let e=(o+s)/2;Jm(a(e),i)<-.002?s=e:o=e}return s}function Zm(e,t,n,r,i,a,o,s,c=!0){let l=Ym(r.map(e=>t.P[e]),t.P[n],i,a,o),u=l??(c?a:0);return u>0&&to(e,t,n,t.P[n].slice(),Ka(i,u*s)),l!==null}function Qm(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 Gm){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(yo(e,t,n).l,c),h=[0,1,2].reduce((e,t)=>{let n=Ka(m,-wo(o,i,t));return e.map((r,i)=>i>t?V(e[t],J(n,H(r,e[t]))):r)},p),g=Jm(p,r)>=-.002&&Jm(h,r)<Jm(p,r);for(let r=0;r<3;r++){let l=U(yo(e,t,n).l,c),u=wo(o,i,r),p=g?u:0;p>0&&to(e,t,d[r],t.P[d[r]].slice(),Ka(l,-p*a)),f=Zm(e,t,d[r],d.slice(r),l,Math.max(0,To(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}=yo(e,t,n),i=!1;for(let n of[1,2]){let o=U(K(La(K(H(t.P[d[n+1]],t.P[d[n]])),r)),c),l=Xm(d.slice(n).map(e=>t.P[e]),t.P[d[n]],o,Wm,s);l>0&&to(e,t,d[n],t.P[d[n]].slice(),Ka(o,-l*a)),i=Zm(e,t,d[n],d.slice(n),o,Wm,s,a,!1)}i&&u.push(`Thumb`)}return{touched:u}}function $m(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=Cm(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:qm(s)*u,preset:t[`fingers_${r}`]})}return a??eh(e,t,n,r,i)}function eh(e,t,n,r,i){let{spec:a,scene:o}=e;for(let[s,c]of Object.entries(a.objects??{})){if(!fc(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=Cm(o,s).map(t=>({...o.objects[t],...e.objectPose(t,n,{s:i})})),f=Object.entries(e.objectsAt(n)).filter(([e,t])=>!Cm(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 th=(e,[t,n])=>Math.min(n,Math.max(t,e));function nh(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}=Es(c,t.R[i],s,J(q(c,Y(t.R[i])),yo(e,t,n).l)),f=Object.fromEntries(Object.entries(d).map(([e,t])=>[e,th(t,ds[e])]));if(Object.keys(d).every(e=>Math.abs(d[e]-f[e])<1e-6))return null;let p=q(q(Ka(V(U(l,f.flex),U(u,f.dev)),Math.hypot(f.flex,f.dev)),Ka(s,f.twist)),c);return to(e,t,i,t.P[i].slice(),q(p,Y(t.R[i]))),{need:d,got:f}}var rh={l:`Left`,r:`Right`},ih=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)},ah=[0,0,1],oh=[`UpLeg`,`Leg`,`Foot`],sh=(e,t=[0,0,0])=>Array.isArray(e)||ArrayBuffer.isView(e)?[e[0],e[1],e[2]]:t,ch=(e,t=0)=>typeof e==`number`&&Number.isFinite(e)?e:t;function lh(e,t,n,r,i,a){let o=n.length;for(let s of n){let n=e.index[s];to(e,t,n,t.P[n].slice(),q(X(r/o),q(Wa(i/o),Ga(a/o))))}}var uh=.99,dh=.9995;function fh(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=uh*c,f=.009500000000000064*c;if(u<=d||u-dh*c>.05)return a;let p=d+f*(1-Math.exp(-(u-d)/f));return o[`reach_over_${s}`]=Math.max(0,u-dh*c),V(t.P[n],U(l,p/u))}var ph=.095,mh=2,hh=new Map;function gh(e,t){let n=`${e.model}|${t}`;if(hh.has(n))return hh.get(n);let r=(90-t)*Math.min(1,Math.max(0,(t-45)/27)),i=cs(e),a=n=>{let r=eo(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 to(e,r,s,r.P[s].slice(),Ga(o*t)),to(e,r,c,r.P[c].slice(),Ga(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=>Qo(i.body,r,e,i.skip).d>=ph)})},o=r;if(i&&r>0){for(let e=0;e<=r;e+=.5)if(!a(e)){o=Math.max(0,e-mh);break}}return hh.set(n,o),o}var _h=60,vh=e=>e-360*Math.round(e/360);function yh(e,t,n){let r=vh(t),i=vh(n),a=(Math.max(Math.abs(r),Math.abs(i))-_h)/60;if(a<=0)return null;let o=a>=1?1:a*a*(3-2*a);return{yaw:e,R:q(X(e),q(Wa(r*o),Ga(i*o)))}}function bh(e,t,n={}){let r=eo(e),i={},a=ch(t.arm_rest,72),o=ch(t.arm_hang)&&ch(t.arm_hang)*gh(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,ch(t[`armw_${s}`])+ch(t[`hangoff_${s}`]))));to(e,r,c,r.P[c].slice(),Ga(i*a)),u&&to(e,r,l,r.P[l].slice(),Ga(i*u))}for(let[n,i]of Object.entries(rh)){let a=ch(t[`abend_${n}`]),o=ch(t[`aswing_${n}`]),s=e.index[`${i}ForeArm`],c=e.index[`${i}Arm`];a&&(to(e,r,s,r.P[s].slice(),Wa(-a)),ho(e,r,i)),o&&to(e,r,c,r.P[c].slice(),Wa(-o))}lh(e,r,[`Neck`,`Head`],ch(t.head_yaw),ch(t.head_pitch),ch(t.head_roll)),lh(e,r,[`Spine`,`Spine1`,`Spine2`],ch(t.spine_yaw),ch(t.spine_pitch),ch(t.spine_roll));let s=e.index.Hips,c=ch(t.yaw);to(e,r,s,r.P[s].slice(),q(X(c),q(Wa(ch(t.pitch)),Ga(ch(t.roll)))));let l=H(sh(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=yh(c,ch(t.pitch),ch(t.roll)),d=u?.R??X(c);for(let[n,a]of Object.entries(rh)){if(!t[`foot_${n}`])continue;let o=sh(t[`foot_${n}`]);i[`leg_miss_${n}`]=_o(e,r,e.index[`${a}UpLeg`],e.index[`${a}Leg`],e.index[`${a}Foot`],o,J(d,sh(t[`knee_${n}`],ah)),ah,`knee`);let s=mo(e,r,a,o,oh);s>150&&(i[`leg_fold_${n}`]=s),vo(e,r,a,ch(t[`fyaw_${n}`],c),ch(t[`fpitch_${n}`]),u)}for(let a of n.armOrder??[`r`,`l`]){let o=rh[a],s=ch(t[`armw_${a}`]),c=e.index[`${o}Arm`],l=e.index[`${o}ForeArm`],u=e.index[`${o}Hand`],f=K(J(d,sh(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,ih(s)))),n.softReach&&(d=fh(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}`]=_o(e,r,c,l,u,d,g,ms,n.foldFree?null:`elbow`);let _=mo(e,r,o,d);_>145&&!n.foldFree&&(i[`arm_fold_${a}`]=_)}xo(e,r,o,ch(t[`wtwist_${a}`]),ch(t[`wflex_${a}`])),Eo(e,r,o,t[`fingers_${a}`]);let p=n.hold?.(a,r);(!p||p.w<1)&&n.grip?.(a,r,i),p&&zs(e,r,o,p,ms,i,a);let m=n.swivel?.(a);m&&(bo(e,r,o,m*ih(s)),p||nh(e,r,o));let h=n.heldShapes?.(a,r);h&&(i[`closed_${a}`]=Qm(e,r,o,h).touched),n.afterArm?.(a,r,i)}return{s:r,diag:i}}var xh=e=>typeof e?.prop==`string`,Sh=e=>!xh(e)&&e?.follow!==void 0,Ch=e=>!!e&&typeof e==`object`&&!Array.isArray(e)&&[`prop`,`follow`,`pivot`,`axis`,`channel`,`keys`,`fall`].every(t=>e[t]===void 0),wh=e=>!!e&&typeof e==`object`&&!Ch(e);function Th(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 Eh(e,t,n){let r=e.index[`${rh[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 io(n,r,J(Y(e.restWorldRot[r]),H(a,i[r])))}function Dh(e,t,n,r,i=!1){let a=yo(e,n,rh[t.props[r.prop].hand]),o=i?Eh(e,t.props[r.prop],n):Th(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=La(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 Oh=(e,t)=>({pos:V(e.pos,J(e.R,t.pos)),R:q(e.R,t.R)}),kh=(e,t)=>({pos:J(Y(e.R),H(t.pos,e.pos)),R:q(Y(e.R),t.R)});function Ah(e,t,n,r){let i=n[e.channel]?.[r]??0,a=Ka(e.axis??[0,1,0],i);return{pos:V(e.pivot,J(a,H(t.pos,e.pivot))),R:q(a,t.R??Ha()),angle:i}}var jh=.06,Mh=.8,Nh=.045,Ph=.3,Fh=30,Ih=180/Math.PI,Lh=2,Rh=[0,1,0],zh=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],Bh=(e,t)=>H(e,U(t,W(e,t)));function Vh(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 Hh(e,t,n,r,i){if(i.prop){let a=t.props?.[i.prop];if(!a)return null;let o=yo(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 Uh(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 Wh(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&&qh(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 Gh(e,t,n,r,i,a){let o=e.scene?.objects??{},s=i?.kind===`object`?Cm(e.scene,i.object):Object.keys(o),c=null;for(let i of s){let s=o[i]?.half;if(!s)continue;let l=Wh(e,Uh(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=Ks(r,d);(!c||f<c.d)&&(c={box:d,d:f,id:i})}let l=c&&Uh(e,c.id);return!c||l?.side===n&&Wh(e,l.key,n,t)===null?null:i?.kind===`object`||c.d<=jh?{...c.box,id:c.id}:null}var Kh=[0,1,2];function qh(e){let t=Kh.reduce((t,n)=>e[n]>e[t]?n:t,0);return Kh.filter(e=>e!==t).every(t=>e[t]<Nh)?t:-1}function Jh(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=Bh(V(U(Rh,1-s),U(o,s)),t),l=K(G(c)>.001?c:Bh(o,t)),u=i?Bh(i,t):null;if(!u||G(u)<=Ph)return zh(t,l,La(t,l));let d=e=>Math.acos(Math.max(-1,Math.min(1,W(e,n))))*Ih-(W(e,l)>0?Fh:0),f=K(u),p=d(f)<=d(U(f,-1))?f:U(f,-1);return zh(t,p,La(t,p))}function Yh(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(La(t,i),r),W(t,i))*Ih,[o,s]=fs.twist,c=Math.min(s,Math.max(o,n+a))-n;if(Math.abs(c-a)<1e-6)return e;let l=J(Ka(r,c),t);return zh(r,l,La(r,l))}function Xh(e,t,n,r,i,a,o,s){let c=Vh(e.spec,a,i),l=ap(e,i,o),u=c&&c.w>=.001&&np(e.spec,c.fit.anchor);if(l||u?rp(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:cp(e,t,n,r,i,l);if(!c||c.w<.001)return;if(u)return op(e,t,n,r,i,a,s,c,n=>Hh(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&&Wh(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(Wl(e,c.fit.anchor,n,s,a,i),c.fit.offset??[0,0,0]),m=Gh(e,o,i,p,f,d),h=m&&Hh(t,e.spec,n,r,c.fit.effector??{});if(!h)return;let g=n=>({pos:Hh(t,e.spec,n,r,c.fit.effector??{}),R:(({d:e,l:t,n})=>zh(e,t,n))(yo(t,n,r))}),_=t.index,v=_[`${r}Arm`],y=_[`${r}ForeArm`],b=_[`${r}Hand`],x=qh(m.half),S=x>=0?J(m.R,Kh.map(e=>+(e===x))):null;if(S&&Math.abs(S[1])>Mh&&!Uh(e,m.id))return op(e,t,n,r,i,a,s,c,n=>Hh(t,e.spec,n,r,c.fit.effector??{}),{w:{p,axis:S},type:`power`},o);let C=yo(t,n,r),w=K(Bh(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=Es(E,n.R[b],T,J(q(E,Y(n.R[b])),C.l)).twist,{goal:O,plane:k,wristAt:ee}=Rs(t,n,r,{pos:h,R:Yh(Jh(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<Lh;e++)_o(t,n,v,y,b,ee(e?n.R[b]:O),k,ms,`elbow`),te=Is(t,n,r,b,y,O);s[`grip_${i}`]={w:c.w,...te}}var Zh={period:3.8,deg:.8},Qh={yaw:.9,pitch:.6},$h={period:5.6,m:.012,list:1.4},eg=.5,tg=1e-4,ng=2*Math.PI,rg=e=>e*e*(3-2*e),ig=(e,t)=>Array.isArray(e)?e.some((e,n)=>Math.abs(e-t[n])>tg):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 ag(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*ng})}function og(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=>ig(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(eg*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=>rg(Math.min(1,e/s)))}function sg(e,t,n,r){let i={},a=Math.max(1,Math.round(eg*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-rg(Math.min(1,e/a)))}return i}function cg(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=og(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]=ag(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*Zh.deg*Math.sin(ng*n/Zh.period+l),head_yaw:r*Qh.yaw*(.6*Math.sin(ng*n/7.3+u)+.4*Math.sin(ng*n/11.9+p)),head_pitch:r*Qh.pitch*Math.sin(ng*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(ng*n/$h.period+f),g=(e.yaw?.[t]??0)*Math.PI/180;o.root=[Math.cos(g)*$h.m*h,0,-Math.sin(g)*$h.m*h],o.roll=$h.list*h,o.spine_roll=-$h.list*h}return m}function lg(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 ug=(e,t,n)=>Math.min(n,Math.max(t,e));function dg(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 fg={noise:.02,side:.03,first:.22,second:.08,last:.22,beforeLast:.08,turn:0},pg={noise:.025,side:.012,stride:.035,second:.05,beforeLast:.06,turn:.06},mg={noise:.1,first:.1,last:.25},hg=.1,gg=3,_g=60;function vg(e,{s0:t,turn:n,seed:r}){let i=e.steps,a=ug(e.vary??1,0,2),o=dg(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/_g)}),h=i>=4,g=s.map((e,t)=>{if(i<2)return 1;let n=(t===0||t===i-1?.5:1)*(fg.noise*e.time+fg.side*l(t))+fg.turn*m[t];return t===0&&(n+=fg.first*(1-m[0])),t===1&&h&&(n+=fg.second),t===i-1&&(n+=fg.last),t===i-2&&h&&(n+=fg.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+gg:1/0)}),S=f.map((e,t)=>t>0&&t<i-1),C=s.map((e,t)=>{if(!S[t])return 1;let n=pg.noise*(.7*e.length+.3*e.time)+pg.side*l(t)+pg.stride*d(t)-pg.turn*m[t];return t===1&&h&&(n-=pg.second),t===i-2&&h&&(n-=pg.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*(mg.noise*t.lift-(n===0?mg.first:0)-(n===i-1&&i>1?mg.last:0)))),arm:s.map(e=>1+a*hg*e.arm)}}var yg=18,bg=22,xg=7,Sg=45,Cg=1,wg=.4,Tg=50,Eg=15,Dg=13,Og={strike:4,load:4,mid:3,toeOff:5},kg={strike:2,load:14,mid:7,toeOff:48,pow:1.8},Ag=[1,2.2],jg=e=>{let t=Math.min(1,Math.max(0,((e??Ag[1])-Ag[0])/(Ag[1]-Ag[0])));return t*t*(3-2*t)},Mg=.004,Ng=8,Pg=.008,Fg=.35,Ig=.001,Lg=.25,Rg=[.25,.5],zg=.008,Bg=e=>e*e*e*(e*(6*e-15)+10),Vg=new WeakSet,Hg=(e,t,n,r)=>V(e,J(X(t),J(Wa(n),J(X(-t),H(r,e)))));function Ug(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,(Dg-t)/4)),c=jg(n),l=(e,t)=>e+(t-e)*c,u=l(kg.strike,yg)+s*Og.strike,d=l(kg.load,bg)+s*Og.load,f=l(kg.mid,xg)+s*Og.mid,p=l(kg.toeOff,Sg)+s*Og.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(kg.pow,Cg)}}var Wg=(e,t,n)=>V(e.root[t],J(X(e.yaw?.[t]??0),J(Ga(e.roll?.[t]??0),n)));function Gg(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}=Ug(e,i,a),g=Math.max(2,Math.round(Fg*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/wg;return e.strike&&n<1?(n<.5?f:m)+(p-(n<.5?f:m))*Math.sin(Math.PI*n):m},v=Su(t,r+1),y=l[c.Hips][1]-Pg,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)/Ng,(r-t)/Ng),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(Ga(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-Mg*Math.log(s.reduce((e,t)=>e+Math.exp(-(t-c)/Mg),0)))-Ig,f=Math.min(1,(e-n)/Ng,(r-e)/Ng),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(Lg*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+Rg[0]*r);n<=Math.floor(e.f+Rg[1]*r);n++){let r=S[n];for(let t=e.f+1;t<n;t++){let i=Bg((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=Bg((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+zg*(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=qg(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 Kg(e,t,{end:n,period:r,pace:i,ground:a}){let{reach:o,hipOff:s,trail:c}=Ug(e,r,i),l=Su(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=Wg(l,t,s[e]),u=o(c((t-r.heel)/Math.max(1,r.b-r.heel))),f=e=>G(H(n,Hg(r.ball,r.yw,e,r.flat)))-u,p=d,m=Tg;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*Eg)));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=Hg(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 qg(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 Jg=3,Yg=.35,Xg=.2,Zg=.03,Qg=.04,$g=.025,e_=e=>e*180/Math.PI,t_=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)};function n_(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 e_(Math.atan2(-W(u,n),-u[1]))}function r_(e,{end:t,ground:n,sk:r}){let i=Su(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=>!Vg.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=>qg(_,_.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)=>n_(Wg(i,e,p),t,J(X(C(e)),[0,0,1]),c,l)-Jg,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(Tg,T(t,n)+D*(1-t_((t-o.b)/(Yg*E)))+O*(1-t_((s.a-t)/(Xg*E)))),r=h+Zg*t_(Math.min(t-o.b,s.a-t)/3),a=e=>n[1]+J(Wa(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(Wa(e),g)[1],d=Math.min(Qg,Math.max(l(c),$g));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)};Vg.add(c),e.push(c)}}}}var i_=[6,4],a_=50,o_=1.1,s_=[18,3],c_=[6,3],l_=8,u_=4.5,d_=5.5,f_=.015,p_=[.52,.64],m_=.3,h_=4,g_=6.4,__=.8,v_=e=>za(.66-.18*e,.2,.48),y_=e=>za(.32-.11*e,0,.45),b_=e=>za(2.8-.45*e,1.2,3),x_=.92,S_=e=>za(4.7-1.1*e,1.8,4),C_=[.2,.6],w_=.9,T_=.18,E_=.35,D_=.18,O_=.55,k_=10,A_=.22,j_=.03,M_=50,N_=e=>J(X(e),[0,0,1]),P_=e=>J(X(e),[1,0,0]),F_=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)};function I_(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 L_(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=I_(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??za(g_*x,4,22);let S=v_(x),C=y_(x),w=b_(x),T=S_(x),E=za(w_*x,0,3),D=s_[0]+s_[1]*Math.min(x,2.5),O=c_[0]+c_[1]*Math.min(x,2.5),[k,ee]=b.heading??[s.yaw??0,s.yaw??0],te=e=>k+(ee-k)*F_(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(N_(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(P_(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=vg(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(P_(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=za(Math.abs(l-oe[n])/o_,.3,1.15),ne=a_*(.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(h_,Math.round((t===0?.35:m_)*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}`]:Hg(ge,ce,t,re),[`fpitch_${n}`]:t,[`fyaw_${n}`]:ce})}let ve=Math.max(1,Math.round(A_*he.air[t])),ye=ae((oe[n]+l)/2,n);ye[1]+=he.height[t];let be=Hg(ge,ce,Math.min(ne,M_),re),xe=V(be,U(H(ye,be),E_));xe[1]=be[1]+D_*ee*Math.min(1,(he.air[t]/k_)**2)*(O_+.44999999999999996*jg(x))*(he.height[t]/b.lift);let Se=U(P_(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(T_*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]+(p_[0]+(p_[1]-p_[0])*jg(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-f_*Math.abs(l-oe[n])/2,Ae=t===0?.015:.032,je=V(ie(ke),U(P_(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=-(i_[0]+(i_[1]-i_[0])*jg(x))*(c?.5:1),Re=Math.max(2,Math.round(.2*b.period)),ze=V(Hg(Ie,Fe,Le,Pe),U(N_(Fe),-.12*Math.abs(l-oe[n])));ze[1]+=j_,!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-F_(e/Re));o(h+e,{[`foot_${n}`]:Hg(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=za(ee,.4,1.1),Ue=c?0:t===0?.5:1,We=u_*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=>d_*He*Ve*Be*e),Ye=Ke(x_).map(e=>-Math.sign(We)*w*He*Ue*e),Xe=Ke(Ge).map((e,t)=>t?__*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:l_*Be,wflex_r:l_*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(C_[1]*b.period)),{spine_pitch:Qe-.6*$e}),o(Math.max(e.f0+1,h-Math.round(C_[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&&(r_(a,{end:_e,ground:fe}),Gg(n,a,{f0:e.f0,end:_e,period:b.period,pace:x,ground:fe,start:`${r} start`}),Kg(n,a,{end:_e,period:b.period,pace:x,ground:fe}),r_(a,{end:_e,ground:fe,sk:n})),i=`${r} end`,o(ge,I_(a,ge)),a}function R_(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(L_(e,n,t,`generators[${r}] walk`))}),n}var z_={yaw:.5,pitch:.2,roll:.7},B_={yaw:4,pitch:6,roll:10},V_=33,H_=8,U_=[`yaw`,`pitch`,`roll`];function W_(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 G_=(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 K_(e,t,n){let r=W_(t);if(!r.length)return;let i=t=>e[t]??Array(n).fill(0);for(let a of U_){let o=i(`spine_${a}`),s=i(a).map((e,t)=>e+o[t]),c=G_(s,V_),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)/H_,(o-t)/H_),r=Math.max(-B_[a],Math.min(B_[a],s[t]-c[t]));l[t]-=z_[a]*r*n*n*(3-2*n)}}l&&(e[`head_${a}`]=l)}}function q_(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 J_=e=>Math.round(e*1e4)/1e4,Y_=6;function X_(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(rh)){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=q_(s,Y_),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:J_(Math.max(...s)),how:`hips lowered`}}function Z_(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:J_(n),how:`wrist target clamped to reach`}:null}var Q_=.01,$_=4,ev=.03,tv=.02;function nv(e,t){let n=e.frames.length,r=Yd.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)=>_d(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>=Q_)for(;c<n&&u[c][t][1]<ev;c++)g(c);if(l>2e-4&&(l<Q_||m)){i++,o=Math.max(o,l),l>=Q_&&a++;for(let[e,t]of h)f[e]=t;let e=Math.max($_,Math.ceil(Math.hypot(p[0],p[2])/tv));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:J_(o),how:a?`planted heel/ball held in place; turning feet pivot on it`:`planted heel/ball held in place`}):null}var rv=6,iv=4,av=1,ov=e=>e*e*(3-2*e);function sv(e,t){let n=e.frames.length,r=Yd.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)=>_d(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<=av){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(iv,Math.ceil(Math.abs(o)/rv));for(let e=0;o&&e<s&&r+e<n&&!u(r+e);e++)f[r+e]=d[r+e]-o*(1-ov((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:J_(a)}):null}var cv=.001,lv=.15,uv=2;function dv(e,t){let{sk:n}=e.ctx,r=e.frames.length,i=new Set,a=0;for(let[t,o]of Object.entries(rh)){let s=e.baked[`foot_${t}`],c=n.index[`${o}Foot`];if(!s)continue;let l=e.frames.map(({s:t},r)=>{let i=Zs(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(lv,-a-cv)});if(!l.some(e=>e>0))continue;let u=q_(l,uv);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:J_(a),how:`soles lifted onto the floor`}):null}var fv=4,pv=.002,mv=3,hv={l:Ws.filter(e=>e[0]===`hand_l`||e[0]===`farm_l`),r:Ws.filter(e=>e[0]===`hand_r`||e[0]===`farm_r`)};function gv(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 hv[t]){let t=Qd(r,l,e)??Yd.allow,p=Gs(s.P[o[u]],s.P[o[d]]),m=p.map(e=>Ks(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(Qs(c[1],a),c[0]+pv)))}if(d){if(!(l[`armw_${t}`]>1e-4)){i.skipped++;continue}c[a]=d}}return c}function _v(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<mv;c++){a.deep=0,a.skipped=0;let c=new Set;for(let t of[`l`,`r`]){let l=gv(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-fv-1);t<=Math.min(i-1,e+fv+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:J_(s),skipped:a.skipped,tooDeep:a.deep,how:`hand pushed out along the box normal`}}var vv=1.1,yv=.35,bv=3,xv=e=>{let t=e.ctx.spec?.checks?.limits;return Bd(e.ctx.sk,e,t,{...Yd,...t})};function Sv(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 Cv(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:vv*i}}),i=e=>r.reduce((t,n)=>t+n.len*Math.max(n.need,e),0),a=yv,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 wv(e,t){let n=e.frames.length,r=[],i=0,a=1;for(let o=0;o<bv;o++){let o=xv(e),s=[...new Set(e.keys.map(e=>e.f))].sort((e,t)=>e-t),c=Sv(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=Cv(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=xv(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 Tv=Array.from({length:19},(e,t)=>-90+t*10),Ev=3,Dv=5,Ov=.003,kv=.003,Av=.03,jv=.08,Mv=.03,Nv=40,Pv=.05,Fv=4,Iv=2,Lv=.09,Rv=400;function zv(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 Bv=10,Vv={l:`Left`,r:`Right`};function Hv(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 Uv=Object.fromEntries(Ws.map(e=>[e[0],e[3]]));function Wv(e,t,n,r){let i=0;for(let a of e)i=Math.max(i,r-Math.min(...Gs(t,n,5).map(e=>Ks(e,a))));return i}function Gv(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(Ka(H(u,l),i),H(n.P[c],l))):n.P[c],f=Math.max(ls(e,t,n,s,l,d),ls(e,t,n,c,d,u)),p=r===`Left`?`l`:`r`;return{depth:f,scene:a.length?Math.max(Wv(a,l,d,Uv[`uarm_${p}`]),Wv(a,d,u,Uv[`farm_${p}`])):0,rise:Math.max(0,d[1]-(l[1]-Lv)),under:l[1]-d[1]}}var Kv=(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 qv(e,t,n){let{sk:r}=e.ctx,i=Vv[n],a=e.frames.length,o=e.ctx.swivel[n],s=e.frames.map(({s:a,c:s},c)=>{let l=ih(s[`armw_${n}`]??0),u=(o.get(e.f0+c)??0)*l;if(!u&&Gv(t,r,a,i,0).depth<=kv)return null;let d=a.P[r.index[`${i}Arm`]],f=Kv(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=Gv(t,r,a,i,-u,p).scene,h=zv(e,c,i);return Tv.map(e=>{let{depth:n,scene:o,rise:s,under:c}=Gv(t,r,a,i,e*l-u,p),d=Math.max(0,n-kv)*100,f=h===null?0:Math.max(0,h-c),g=Math.max(0,o-Math.max(m,kv))*100;return Nv*(d*d+g*g)+Pv*(e/10)**2+Fv*(s*100)**2+Rv*(f*100)**2})});if(s.every(e=>!e))return null;let c=Tv.indexOf(0),l=Tv.map((e,t)=>t===c?0:1/0),u=Tv.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<Tv.length;e++){if(Math.abs(Tv[t]-Tv[e])>Bv)continue;let r=n[e]+Iv*((Tv[t]-Tv[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]=Tv[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 Jv(e,t,n,r){let{sk:i}=e.ctx,a=Vv[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-Hv(e.ctx.spec,d,n);if(p<.05)continue;let m=null;for(let n of[o[`${a}Hand`],o[`${a}ForeArm`]]){let r=us(t,i,s,n);if(r.into<0||l.includes(r.into))continue;let a=Math.min(Mv,Qd(e.ctx.spec.checks?.allow,ld(i,n),ld(i,r.into))??0),o=r.depth-Math.max(a,kv);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>=jv){r.deep++;continue}let g=$o(t,s,m.p,new Set([...t.skip.get(m.b),...l]));g&&(c[u]=U(g,p*Math.min(Av,jv-h,m.past+Ov)))}let u=Array(s).fill(null);return c.forEach((e,t)=>{if(e)for(let n=Math.max(0,t-Dv-1);n<=Math.min(s-1,t+Dv+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 Yv(e,t){let n=Jo(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<Ev;r++){let r=new Set;for(let t of[`r`,`l`]){let i=qv(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`])Jv(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:J_(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 Xv=[`reach`,`slide`,`penetration`,`self`,`retime`,`stance`,`grasp`];function Zv(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 Qv=(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,$v=(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 ey(e,t,n,{whole:r=!0}={}){let i={},a=(e,t)=>{t&&(i[e]=t)};return t.retime&&r&&a(`retime`,wv(e,n)),t.slide&&a(`ground`,dv(e,n)),t.reach&&a(`reachLegs`,X_(e,n)),t.slide&&a(`slide`,Qv(sv(e,n),nv(e,n))),t.reach&&i.slide?.pivots&&a(`reachLegs`,$v(i.reachLegs,X_(e,n))),t.penetration>0&&a(`penetration`,_v(e,n,t.penetration)),t.self&&a(`self`,Yv(e,n)),t.reach&&a(`reachArms`,Z_(e)),i}var ty=.15,ny=.12,ry=400,iy=.02,ay=60;function oy(e){let t=ec(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 sy(e,t,n){let r=e?.objects?.[n]?.mass;if(Number.isFinite(r))return r;let i=Cm(t,n).map(e=>t.objects[e]);if(i.length===1&&ec(i[0]).kind===`sphere`&&2*ec(i[0]).r<ny)return ty;let a=i.reduce((e,t)=>e+oy(t)*ry,0);return Math.min(ay,Math.max(iy,a))}var cy=10,ly=9.81,uy=2,dy=.06,fy=.006,py=25,my=.5,hy=`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`,gy=e=>e?.fix!==!1&&e?.fix?.grasp!==!1,_y=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)},vy=e=>Object.entries(e.objects??{}).filter(([,t])=>xh(t)&&e.props?.[t.prop]).map(([t,n])=>[t,n,e.props[n.prop].hand]);function yy(e,t,n,r,i,a){let{spec:o,scene:s,sk:c}=e;if(!gy(o)||!(a>.001))return null;for(let[l,u,d]of vy(o)){if(d!==t||u.keys?.length)continue;let f=sy(o,s,l),[p,m]=e.carrySpan(u);if(n<p||n>m||f*ly*Hl(c,t)<uy)continue;let h=_y((n-p)/4)*_y((m-n)/4)*a,g=Math.min(dy,fy*f)*h;if(!(g>0))return null;let _=H(r.P[c.index[`${rh[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 by=(e,t,n,r)=>{let i=H(t.P[e.index[`${rh[n]}Hand`]],t.P[e.index[`${rh[n]}Arm`]]);return r*ly*Math.hypot(i[0],i[2])};function xy(e,t,n){let{spec:r,scene:i}=t.ctx,a=t.f0??0;if(!gy(r))return;let o=vy(r).map(([e,t,n])=>({id:e,o:t,k:n,mass:sy(r,i,e)}));o.length&&t.frames.forEach(({s:r},i)=>{let s=i+a;for(let i of o)Bm(t,i.id,s)===i.k&&n({...i,f:s,Nm:by(e,r,i.k,i.mass)})})}function Sy(e,t){let n={};xy(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 Cy(e,t,n,r,i){let a=r===`r`?`l`:`r`,{spec:o,scene:s}=e.ctx,c=new Set([t,...Cm(s,t)]);return Object.entries(o.anchors??{}).some(([t,r])=>(e.baked?.[`w_${t}_${a}`]?.[i]??0)>my&&(r.kind===`object`&&c.has(r.object)||r.kind===`prop`&&r.prop===n.prop))}function wy(e,t){let n=[];return xy(e,t,({id:e,o:r,k:i,f:a,Nm:o})=>{o>py&&!Cy(t,e,r,i,a)&&n.push({kind:`LOAD`,msg:`${rh[i].toLowerCase()} holds ${e} at ${o.toFixed(0)} N m`,frame:a,value:Math.round(o*10)/10,limit:py})}),n}function Ty(e,t,n){let{sk:r,scene:i}=e.ctx,a=e.frames[n-(e.f0??0)]?.s,o=Vm(e,t,n),s=gc(i,t),c=i.objects[Cm(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 Ey={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]=Dm(e.out,i),c=sy(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 ${py}); 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=Ty(e.out,r,Math.max(s,Math.min(t.worstFrame,Dm(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-cy),args:{anchor:d,side:`l`,reach:Math.min(cy,s)||1,hold:Math.max(1,Dm(e.out,i)[1]-s),release:1}}}]}}}},Dy=e=>e*e*(3-2*e),Oy=.02;function ky(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=>wh(e.objects?.[t])),l=e.objects?.[a];c[r]=l?xh(l)||Sh(l)?{...i,carried:a}:tm(l)?{...i,...Oh(ym({spec:e,scene:t,timeMap:o},a,s),kh(t.objects[a]??hl(t)[a],i))}:{...i,...Ah(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 Ay(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 jy(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(Wl(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])=>Dy(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(Ka([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-Hv(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=os(e.keepOut.body,o,r,i,ss,e.keepOut.skip);if(t===i)break;i=V(i,U(H(t,i),a))}return i}:void 0,afterArm:(t,n,r)=>eu(e,t,n,r),grip:r?void 0:(r,i,a)=>Xh(e,o,i,rh[r],r,t,n,a),sag:r?void 0:(r,i,a)=>yy(e,r,n,i,a,(1-Hv(e.spec,t,r))*Math.min(1,Math.max(0,t[`armw_${r}`]??0))),heldShapes:r||!e.grasp?void 0:(r,i)=>$m(e,t,n,r,i)}}function My(e,t,n,r=!0){let i={...lg(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=np(e.spec,t.anchor),d=e.sk.index[`${rh[t.side]}Arm`],f=e.sk.index[`${rh[t.side]}Hand`];for(let i=0;i<6;i++){o[`fit_${t.anchor}_${t.side}`]=s;let{s:i,diag:a}=bh(e.sk,o,jy(e,o,n,!0,r,t.side)),p=Ay(e.sk,i,a,t.effector),m=V(Wl(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))>Hl(e.sk,t.side)+Oy&&(s=c.hand),i[`fit_${t.anchor}_${t.side}`]=s}let{s:a,diag:o}=bh(e.sk,i,jy(e,i,n,!1,r));return o.frame=n,{s:a,diag:o,c:i}}function Ny(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=Zv(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?cs(t):null},l={ctx:c,fps:e.fps??30,frameCount:i,f0:o,frames:[]};c.objectPose=(e,t,n)=>Vm(l,e,t,n),c.objectHand=(e,t)=>Bm(l,e,t),c.restingAt=(e,t)=>Nm(l,e,t),c.carrySpan=e=>Dm(l,e),c.solvedAt=e=>Fm(l,e),c.weightAt=(e,t)=>l.baked?.[e]?.[t],c.frameCount=i;let u={rebake(r){l.keys=r,l.baked=Su(r,i,yu(e.flow)),c.socketTurns=new Map,c.graspPlans=new Map,K_(l.baked,r,i),c.idle=cg(l.baked,{spec:e,sk:t,frameCount:i}),c.busy=sg(l.baked,e,i,l.fps);let a=ky(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]=My(c,Cu(l.baked,t),t))},all:()=>Array.from({length:s-o+1},(e,t)=>o+t)};return c.hold=bp(c,l,e=>My(c,Cu(l.baked,e),e,!1),e=>My(c,Cu(l.baked,e),e)),u.rebake(r.keys??R_(e,t)),u.solve(u.all()),l.fixed=r.fixes===!1?{}:ey(l,a,u,{whole:!r.window}),c.hold&&l.timeMap&&u.solve(u.all()),l}var Py=`{ f, pos: [x, y, z], rot: [x, y, z, w] } or { f, pos, aim: [x, y, z], roll? }`,Fy=`{ at, onto?, bounce?, tumble?, v? }`,Iy=e=>Array.isArray(e)&&e.length===4&&e.every(Number.isFinite)&&Math.abs(Math.hypot(...e)-1)<=.01,Ly=e=>Qc(e)&&Math.hypot(...e)>1e-9;function Ry(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)`),Iy(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}Ly(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 zy(e,t,n,r,i,a=!1){if(!Array.isArray(r.keys))return e(`${n}.keys must be an array of ${Py}`);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 ${Py}, got ${Z(r)}`);for(let e of Object.keys(r))Dc.includes(e)||t(`${o} has unknown field "${e}"${el(e,Dc)}; a key is ${Py}`);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)}`),Qc(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)}`),Ry(e,o,r)})}function By(e,t,n,r,i){let a=/^object:(.+?)(?:\.(?:center|top|base))?$/s.exec(i)?.[1];if(a===void 0)return;let o=Cm(n,a).flatMap(t=>[t,...n.objects[t].ancestors??[]].find(t=>wh(e.objects?.[t]))??[]).find(t=>Sh(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 Vy(e,t,n,r,i){su(e,t,n,`${r}.follow`,i.follow)&&By(e,t,n.scene,`${r}.follow`,i.follow),i.offset!==void 0&&!Qc(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)){Ly(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)}`);su(e,t,n,`${r}.aim`,a)&&By(e,t,n.scene,`${r}.aim`,a)}}function Hy(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 Uy(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 ${Fy} 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 ${Fy} (at: the frame it starts to fall), got ${Z(s)}`);for(let e of Object.keys(s))Ec.includes(e)||t(`${u} has unknown field "${e}"${el(e,Ec)}; a fall is ${Fy}`);if(s.at===void 0)e(`${u}.at must be the whole frame it starts to fall`);else if(Hy(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&&ll(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`||Qc(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 Wy=(e,t)=>{let n=0;for(;n<e.length&&e[n]===t[n];)n+=1;return n};function Gy(e){let t=String(e),n=Hc.reduce((e,n)=>Wy(n,t)>Wy(e,t)?n:e);return Wy(n,t)>=4?`; did you mean "${n}"?`:el(t,Hc)}function Ky(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 qy(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 Jy(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?Sh(s)?`follow`:tm(s)?`free`:Ch(s)?`switch`:`hinge`:`carry`,u=Tc[l];(l!==`switch`&&l!==`follow`||!r?.others?.[o])&&ll(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}"${el(e,u)}; fields: ${u.join(`, `)}`);if(Ky(t,c,s),l===`follow`){Vy(e,t,{sk:n,scene:r},c,s),qy(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`),qy(t,c,s);continue}if(l===`free`){s.keys!==void 0&&zy(t,a,c,s,i,!0),s.fall!==void 0&&Uy(t,a,c,s,{frames:i,scene:r,carry:!1}),qy(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&&!Qc(s[e])&&t(`${c}.${e} must be [d, l, n] along the palm axes, got ${Z(s[e])}`);s.grasp!==void 0&&!Hc.includes(s.grasp)&&t(`${c}.grasp must be one of ${Hc.join(`, `)}${Gy(s.grasp)}, got ${Z(s.grasp)}`),qy(t,c,s),Hy(t,`${c}.grab`,s.grab,i)&&Hy(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&&zy(t,a,c,s,i),s.fall!==void 0&&Uy(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)`),Qc(s?.pivot)||t(`${c}.pivot must be [x, y, z] (world hinge point), got ${Z(s?.pivot)}`),s?.axis!==void 0&&(!Qc(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},Yy=e=>`[${e.map(e=>{let t=Q(e);return t>0?`+${t}`:`${t}`}).join(`, `)}]`,Xy=[`near`,`above`,`moved`,`still`,`speed`],Zy={near:.05,above:0,moved:.05,still:.01},Qy=new Set([`near`,`still`]),$y=new Set([`moved`,`still`,`speed`]),eb=e=>Xy.filter(t=>e?.[t]!==void 0),tb=(e,t)=>e.name??`goals[${t}]`,nb=(e,t)=>(Qy.has(t)?e.tol:e.by)??Zy[t],rb=(e,t)=>e.mode??(t===`speed`?`any`:`all`),ib=e=>!e.startsWith(`object:`)||/\.(center|top|base)$/.test(e)?e:`${e}.base`;function ab(e,t){let[,n,r]=/^object:(.+)\.(center|top|base)$/s.exec(ib(t))??[],i=Cm(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 ob=e=>e.moved??e.still,sb=(e,t,n=Array.isArray(t.at)?t.at[0]:t.at)=>ob(t).startsWith(`object:`)?ab(e.ctx.scene,ob(t)):iu(e,n,ob(t));function cb(e,t,n){let r=iu(e,n,t),i=e.fps??24;if(!r)return null;let a=iu(e,n-1,t),o=iu(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 lb(e,t,n,r,i){if(n===`near`)return au(e,r,t.near[0],t.near[1]);if(n===`above`){let n=iu(e,r,t.above[0]),i=iu(e,r,t.above[1]);return n&&i?n[1]-i[1]:null}if(n===`speed`)return cb(e,t.speed,r);let a=i&&iu(e,r,ib(ob(t)));return a?G(H(a,i)):null}var ub=(e,t,n)=>Qy.has(e)?t-n:n-t,db=e=>Math.max(1e-4,Math.round(e*1e4)/1e4);function fb(e,t,n,r,i){let a=nb(t,n),o=(n===`moved`||n===`still`)&&!ob(t).startsWith(`object:`),s=n===`moved`||n===`still`?sb(e.out,t,r):null,c=[];for(let o=Math.max(r,e.f0);o<=Math.min(i,e.last);o++){let r=lb(e.out,t,n,o,s);r!==null&&c.push({f:o,v:r,short:ub(n,r,a)})}return{rows:c,from:o?r:void 0}}function pb(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=eb(n)[0],i=r&&mb(e,t),a;if(i&&!i.wait){let{rows:t}=fb(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 mb(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=pb(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 hb(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 gb(e,t,n){let r=e.f0??0;return mb({out:e,goals:t,names:new Map(t.map((e,t)=>[tb(e,t),t])),f0:r,last:r+(e.frames?.length??0)-1,events:new Map,visiting:new Set},n)}function _b(e,t){let n=[],r=[],i=e.f0??0,a={out:e,goals:t,names:new Map(t.map((e,t)=>[tb(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=eb(e)[0];if(!o)return;let s=tb(e,t),c=nb(e,o),l=mb(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}=fb(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=rb(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:hb(s,o,e,c,p&&m?[l.a,l.b]:null,f),frame:e.f-i,value:db(e.short),limit:0})}),{issues:n,results:r}}var vb=`{ name?, near | above | moved | still | speed, tol?, by?, at, mode?, after?, before? }`,yb=new Set([`near`,`still`]),bb=new Set([`above`,`moved`,`speed`]);function xb(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 Sb=e=>typeof e==`string`&&e!==``&&!/^[a-z]+:/.test(e),Cb=e=>[`moved`,`still`,`speed`].find(t=>Sb(e?.[t]));function wb(e){return Array.isArray(e)&&e.some(Cb)?e.map(e=>{let t=Cb(e);return t?{...e,[t]:`object:${e[t]}`}:e}):e}function Tb(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 Eb(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)}`);su(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 Db(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 ${vb}, got ${Z(r)}`);for(let e of Object.keys(r))jc.includes(e)||c(`${o} has unknown field "${e}"${el(e,jc)} (fields: ${jc.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=eb(r),u=l[0];if(l.length||t(`${o} needs one predicate: ${Xy.join(`, `)}`),l.length>1&&t(`${o} names ${l.join(` and `)}; a goal takes exactly one of ${Xy.join(`, `)} (split it into ${l.length} goals)`),l.length===1&&$y.has(u))Eb(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)=>su(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&&!yb.has(u)?t(`${o}.tol applies to near and still; ${xb(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&&!bb.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)}`),Tb(t,o,r.at,n.frames,n.past)}function Ob(e,t){let n=new Map(e.map((e,t)=>[e&&typeof e==`object`?tb(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`?el(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=>`"${tb(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 kb(e,t,n){if(e.goals===void 0)return;if(!Array.isArray(e.goals))return t(`spec.goals must be an array of goals ${vb}, got ${Z(e.goals)}`);let r=new Map;e.goals.forEach((i,a)=>Db(e,t,n,i,a,r)),Ob(e.goals,t)}var Ab=new Set([`l`,`r`]),jb=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function Mb(e,t,n,r){if(jb(n))for(let i of Object.keys(n))r.includes(i)||e(`${t} has unknown field "${i}"${Zc(i,r)} (fields: ${r.join(`, `)})`)}function Nb(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||!Sc[o.kind]){t(`${s}.kind must be one of ${Object.keys(Sc).join(`, `)}, got ${Z(o?.kind)}`);continue}Mb(i,`${s} (${o.kind})`,o,[`kind`,...Sc[o.kind]]);for(let e of[`p`,`offset`,`local`])o[e]!==void 0&&!Qc(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`?`, ${qc.pole}`:``}`),o.kind===`bone`&&cl(t,n,s,o.bone),o.kind===`segment`&&(cl(t,n,`${s}.from`,o.from),cl(t,n,`${s}.to`,o.to),o.reach!==void 0&&!Ab.has(o.reach)&&t(`${s}.reach must be "l" or "r"`)),o.kind===`object`&&ll(t,r,s,o.object,{groups:!0})&&(o.grasp!==void 0&&!Hc.includes(o.grasp)&&t(`${s}.grasp must be one of ${Hc.join(`, `)}, got ${Z(o.grasp)}`),o.socket!==void 0&&r?.objects&&!Pl(r,o.object,o.socket)&&t(`${s}.socket: "${o.object}" has no socket ${Z(o.socket)} (sockets: ${Nl(r,o.object).map(e=>e.name).join(`, `)||`none`})`),o.socket!==void 0&&o.grasp===void 0&&t(`${s}.socket needs grasp (${Hc.join(`, `)}): the socket says how the hand takes it`)),o.kind===`person`&&!wl(r,o.person,o.bone??``,0)&&t(`${s} (person) needs person: the id of another character with an installed take (people: ${Tl(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 Pb(e,t,{sk:n,unknown:r=t}){for(let[i,a]of Object.entries(e.props??{})){let e=`props.${i}`;Mb(r,e,a,Cc),Ab.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=>cl(t,n,`${e}.origin`,r));for(let[n,r]of Object.entries(a?.points??{}))Qc(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}]`;Mb(r,o,i,wc),Ab.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${el(String(i?.anchor),Object.keys(e.anchors??{}))}`);let s=i?.effector;s?.prop===void 0?Array.isArray(s?.joints)?s.joints.forEach(e=>cl(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&&!Qc(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 Fb(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)}`);Mb(r,o,e,Oc),(!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 (${qc.yaw}), got ${Z(e.heading)}`);for(let n of Oc.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 Ib(e,t,{sk:n,scene:r,frames:i,unknown:a=t,past:o=``}){let s=e.checks??{};for(let e of Object.keys(s))kc.includes(e)||a(`checks.${e} is not a check${el(e,kc)} (checks: ${kc.join(`, `)})`);let c=(e,n=()=>{})=>{let r=s[e],i=`{ ${Ac[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(!jb(r))return t(`checks.${e}[${o}] must be ${i}, got ${Z(r)}`);Mb(a,`checks.${e}[${o}]`,r,Ac[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)=>{ul(e,t,n,`checks.contacts[${i}].point`,r.point),ul(e,t,n,`checks.contacts[${i}].target`,r.target),l(`checks.contacts[${i}]`,r.when)}),c(`orient`,(r,i)=>{ul(e,t,n,`checks.orient[${i}].from`,r.from),ul(e,t,n,`checks.orient[${i}].to`,r.to),l(`checks.orient[${i}]`,r.when),r.along===`face`||r.along===`up`||Qc(r.along)||t(`checks.orient[${i}].along must be "face", "up" or [x, y, z]`)}),c(`below`,(e,r)=>{cl(t,n,`checks.below[${r}].joint`,e.joint),cl(t,n,`checks.below[${r}].ref`,e.ref),l(`checks.below[${r}]`,e.when)}),c(`clearance`,(e,n)=>{ll(t,r,`checks.clearance[${n}]`,e.object),l(`checks.clearance[${n}]`,e.frames)}),c(`appear`,(r,i)=>{cl(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)=>ll(t,r,`checks.supports[${n}]`,e.object)),c(`allow`);for(let e of Object.keys(s.limits??{}))e in Yd||a(`checks.limits.${e} is not a QA limit${el(e,Object.keys(Yd))}`);let u=e.fix;if(u!==void 0&&u!==!1&&(typeof u!=`object`||!u))t(`spec.fix must be false or { ${Xv.join(`, `)} }`);else for(let e of Object.keys(u||{}))Xv.includes(e)||a(`spec.fix.${e} is not a fix${el(e,Xv)} (fixes: ${Xv.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 Lb(e,t,n){Nb(e,t,n),Pb(e,t,n),Jy(e,t,n),Fb(e,t,n),Ib(e,t,n),kb(e,t,n)}var Rb=12;function zb(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 Bb(e,t,n,r){if(Ic.has(n)){if(!Qc(r))return e(`${t} ${n} must be [x, y, z] (3 finite numbers), got ${Z(r)}`);if(Lc.has(n)){let i=Math.hypot(...r);if(i<1e-6)return e(`${t} ${n} = ${Z(r)} has no direction; a pole is a ${qc.pole}`);n.startsWith(`knee`)&&r[2]<-.7*i&&e(`${t} ${n} = ${Z(r)} points backward; knees bend toward +z. A pole is a ${qc.pole}`)}n.startsWith(`foot`)&&r[1]<.04&&e(`${t} ${n} y = ${r[1]} puts the ankle into the floor; foot_* is the ${qc.foot}`);return}if(zc.has(n)){if(!r||typeof r!=`object`||Array.isArray(r))return e(`${t} ${n} must be { preset: weight }, presets ${Vc.join(`, `)}; got ${Z(r)}`);for(let[i,a]of Object.entries(r))Vc.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${el(i,Vc)} (presets: ${Vc.join(`, `)})`);return}if(!Number.isFinite(r))return e(`${t} ${n} must be a finite number${n===`yaw`?` (degrees; ${qc.yaw})`:n.startsWith(`fyaw`)?` (${qc.fyaw})`:``}, got ${Z(r)}`);let i=Kc(n);i&&(r<i[1]||r>i[2])&&e(`${t} ${n} = ${r} is outside ${i[1]}..${i[2]} (${i[3]})`)}var Vb=e=>Array.isArray(e)?e:[],Hb=e=>Array.isArray(e)?e[1]:e;function Ub(e,t){let n=[...Vb(e.keys).map(e=>e?.f),...Vb(e.generators).map(e=>e?.f0)].filter(Number.isInteger),r=e.checks??{},i=[...[`contacts`,`orient`,`below`].flatMap(e=>Vb(r[e]).map(e=>Hb(e?.when))),...Vb(r.clearance).map(e=>Hb(e?.frames)),...Vb(e.goals).map(e=>Hb(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 Wb(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=zb(e),s=[...Ic,...Rc,...zc,...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))bc.includes(t)||r(`${l} has unknown field "${t}"${Zc(t,bc)}; 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]}"${el(n,s)}`):e||Ic.has(n)||Rc.has(n)||zc.has(n)?Bb(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}"${el(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 Gb(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 Kb(e,{sk:t,scene:n,lenient:r=!1}={}){let i=[],a=e=>{i.length<Rb&&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))yc.includes(t)||o(`spec.${t} is not a spec field${el(t,yc)} (fields: ${yc.join(`, `)})`);e.fps!==void 0&&e.fps!==24&&a(`spec.fps must be 24, the timeline rate, got ${Z(e.fps)}`),Gb(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)?Ub(e,s):``;if(Wb(e,a,Number.isInteger(s)?s:2e4,o,c),Lb(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>=Rb?`
|
|
8
|
+
(more problems not listed)`:``}`)}function qb(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 Wl(e.ctx,s,r,i,a);throw Error(`MOTION_SPEC_INVALID: check point "${n}"`)}function Jb(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=>fc(a,a.objects[t],o,t)&&Bm(e,t,n)===i)??null:null}function Yb(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 Xb=(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 Zb(e,t,n){return n===`up`?[0,1,0]:n===`face`?ao(e.ctx.sk,e.frames[t].s,e.ctx.sk.index.Head,[0,0,1]):K(n)}function Qb(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(Xb(e,n,r.when)){let t=qb(e,n,r.point),i=qb(e,n,r.target);if(!t||!i)continue;let o=Yb(e,r.target)??Jb(e,r.point,n+(e.f0??0)),s=o?au(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(Xb(e,n,r.when)){let t=qb(e,n,r.from),i=qb(e,n,r.to);if(!t||!i)continue;let o=W(K(H(i,t)),Zb(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(Xb(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(Xb(e,n,r.frames)){let t=e.objectsAt(n)[r.object],o=Ws.find(e=>e[0]===r.part);if(!t||!o)continue;let{P:s}=e.frames[n].s,c=Math.min(...Gs(s[i[o[1]]],s[i[o[2]]]).map(e=>Ks(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(qb(e,t,`joint:${n.joint}`),qb(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 $b=/^(.+): [\d.]+ cm off its keys$/,ex={twist:`twist about the forearm`,flex:`flex`,dev:`deviation (+ toward the thumb)`};function tx(e,t){let n=e.objects[t]??hl(e)[t];return Cm(e,t).flatMap(t=>{let r=e.objects[t],i=kh(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 nx(e,t,n){let{scene:r}=e.ctx,i=e.f0??0;for(let[a]of yp(e.ctx.spec)){let o=gp(e,a),s=tx(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=_p(o,r),l=Rm(e,a,r),u=Math.max(...s.map(e=>Ra(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 rx(e,t){let n=$b.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(ds).filter(([e,[t,n]])=>o[e]<t||o[e]>n).map(([e,[t,n]])=>`the wrist ${ex[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 ix=e=>Math.round(e*10)/10,ax=e=>Math.round(e*100)/100,ox=`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 sx(e){let t=yp(e.ctx.spec);return t.length?Object.fromEntries(t.map(([t,n])=>{let r=gp(e,t);return[t,[...n.keys].sort((e,t)=>e.f-t.f).map((n,i)=>{let a=Rm(e,t,Math.round(r.t[i])),o=[a.R[0][1],a.R[1][1],a.R[2][1]],s=ix(Za(n.aim?K(n.aim):J(Xa(r.q[i]),[0,1,0]),o));return{f:n.f,deg:s,cm:ix(Ra(n.pos,a.pos)*100),...s>=1?{got:o.map(ax)}:{},...n.aim?{rot:r.rots[i]}:{}}})]})):null}var cx=3,lx=.03,ux=e=>V(e.pos,J(e.R,[0,e.half[1],0])),dx=(e,t)=>[e[0][t],e[1][t],e[2][t]];function fx(e,t,n=null){let r=H(ux(e),ux(t)),i=[0,1,2].map(t=>dx(e.R,t)),a=[0,1,2].map(e=>dx(t.R,e)),o=[...i,...a,...i.flatMap(e=>a.map(t=>La(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 px=(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=>Ks(a,e)<=0)},mx=(e,t,n)=>!t.visible||(e.baked?.[t.visible]?.[n]??0)>.5,hx=(e,t,n)=>Cm(e.ctx.scene,t).map(t=>({...e.ctx.scene.objects[t],...Nm(e,t,n)}));function gx(e,t,n){let{sk:r,spec:i}=e.ctx,a=e.frames[n-(e.f0??0)];if(!a)return null;let o=Th(r,i,a.s,i.objects[t]);return Math.max(0,Math.min(...hx(e,t,n).map(e=>Ks(o,e))))}function _x(e,t,n){let r=hx(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(ux).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=Ks(o,r);e<=.02&&(!s||e<s[1])&&(s=[t,e])}return s?.[0]??null}function vx(e,t,n){let r=Object.entries(t.ctx.spec.objects??{}).filter(([,e])=>xh(e));if(!r.length)return[];let i=n.checks??{},a={...Yd,...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??Qd(o,n,t),e),null)??a.allow;for(let[i,o]of r){let[r,s]=Dm(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]&&mx(t,o,r-1)){let e=gx(t,i,r),n=[o.fall??[]].flat().some(e=>Array.isArray(e.v)&&e.at<r);n&&e>lx?u(`CATCH`,`${i} missed by ${(e*100).toFixed(1)} cm`,r-c,e,lx):!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:_x(t,i,r),h=e=>Math.abs(e-r)<=cx||o.release!==void 0&&Math.abs(e-s)<=cx;for(let n=0;n<t.frames.length;n++){let a=n+c,s=zm(t,i,a);if(!s||!mx(t,o,a))continue;let f=s.map(e=>e.id),g=s.map(e=>[e,ux(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||px(e,_,t.slice(-1),s))).map(([e])=>`hand_${e.slice(-1)}`);for(let[e,t,r,a]of Ws){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+Ra(o,s)/2,h=d([e],[i,...f]),y=null,b=-1/0;for(let[e,t,n]of g)m-(Ra(c,t)-n)<=h||(y??=Gs(o,s),b=Math.max(b,a-Math.min(...y.map(t=>Ks(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=ux(r),s=G(r.half),c=-1/0;for(let[e,n,i]of g)Ra(n,o)<i+s+t&&(c=Math.max(c,fx(e,r).depth));c>t&&u(`COLLIDE`,`${i} x ${e}`,n,c,t)}}}return nx(t,a,u),s}var yx=.009,bx=.022,xx=.004,Sx=.995,Cx=.01,wx=120,Tx=150,Ex=-.3,Dx=[`Index`,`Middle`,`Ring`,`Pinky`],Ox={l:`Left`,r:`Right`};function kx(e,t){let n=Cm(e,t),r=n.length===1?ec(e.objects[n[0]]).kind:`box`;return r===`sphere`?`spherical`:r===`cylinder`?`power`:null}function Ax(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(!xh(a)||!fc(i,a,n,t))continue;let o=i.props?.[a.prop]?.hand,[s,c]=Dm(e,a);o&&r.push({id:t,k:o,grasp:a.grasp??kx(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)>=Sx&&c(t)>=Sx,rests:!0})}return r}var jx=(e,t,n)=>Cm(e.ctx.scene,t).map(t=>({...e.ctx.scene.objects[t],...Vm(e,t,n)}));function Mx(e,t,n){let r=Ox[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:bx}];for(let e of[...Dx,`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:yx});return a}function Nx(e,t){return e.map(e=>{let n={depth:-1/0};for(let r of t){let t=oc(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&&ac(n.entry,r);return{...e,depth:n.depth,at:i,normal:n.entry&&ic(n.entry,r)}})}function Px(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=Fx(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 Fx(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 Ix(e,t,n,r,i,a){let o=Nx(Mx(e,t,n.k),r),s=Ox[n.k].toLowerCase();if(n.rests&&o[0].depth<-.03)return;for(let e of o)e.finger!==`palm`&&e.depth>xx&&i(`FINGER_PEN`,`${e.bone} into ${n.id}`,a,e.depth,xx);let c=e=>o.some(t=>t.finger===e&&t.tip&&t.depth>=-.008),l=Dx.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]<=Ex).map(e=>e.at),m=d.filter(e=>e.finger===`Thumb`).map(e=>e.normal),h=d.filter(e=>Dx.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>=wx,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)>=Tx));!n.rests&&!y&&!x&&Px(f,p)>Cx&&i(`SUPPORT`,`${n.id} not supported`,a,Math.min(1,Px(f,p)),Cx)}function Lx(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 Ax(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=jx(t,n.id,a);o.length&&Ix(e,t.frames[a-r].s,n,o,i,a-r)}return n}var Rx=.5,zx=1,Bx=90,Vx={twist:1-ps,flex:1,dev:1},Hx=(e,t)=>t[e].map(t=>t*Vx[e]),Ux=`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 Wx(e,t,n,r){let{diag:i}=e.frames[n],a=e.baked??{};if((i[`hold_${t}`]?.w??0)>Rx||(i[`grip_${t}`]?.w??0)>Rx)return!0;for(let n of e.ctx.spec.fits??[])if(n.side===t&&(a[`w_${n.anchor}_${t}`]?.[r]??0)>Rx)return!0;return Object.keys(e.ctx.spec.objects??{}).some(n=>e.ctx.spec.objects[n]?.prop&&Bm(e,n,r)===t)}function Gx(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(!Wx(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=Es(m,n.R[c],p,J(q(m,Y(n.R[c])),yo(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]=Hx(n,e);return h[n]<r+t||h[n]>i-t});g(fs,-1)&&d.past++,g(ds,zx)&&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>Bx&&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 Kx=.5,qx=.5,Jx=[`flex`,`dev`,`twist`],Yx={l:`Left`,r:`Right`},Xx={flex:e=>e>=0?`flex`:`extension`,dev:e=>e>=0?`radial deviation`:`ulnar deviation`,twist:()=>`twist`};function Zx(e){let t=null;for(let n of Jx){let[r,i]=ds[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 Qx(e,t,n,r){let{s:i,diag:a}=t.frames[r],o=a[`hold_${n}`];if((o?.w??0)>qx)return o;let s=Yx[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 Es(p,i.R[l],f,J(q(p,Y(i.R[l])),yo(e,i,s).l))}function $x(e,t){let n=[],r=t.f0??0;for(let i of[`l`,`r`])t.frames.forEach((a,o)=>{if(!Wx(t,i,o,o+r))return;let s=Zx(Qx(e,t,i,o));if(s.past<=Kx)return;let c=Math.abs(s.edge);n.push({kind:`WRIST`,msg:`hand_${i} ${Xx[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 eS(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)>qx&&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 tS={WRIST:eS},nS=2.2;function rS(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 Ws.map(([e,t,n,i])=>[e,r(t),r(n),i])}function iS(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={...Yd,...n.limits}.allow;return t.frames.forEach(({s:e},t)=>{let c=t+o,l=Ws.map(([t,n,r,i])=>[t,e.P[a[n]],e.P[a[r]],i]);for(let[o,u]of r){if(!Ws.every(([,e,t])=>u.names.includes(e)&&u.names.includes(t)))continue;let r=rS(u,c),d=r.find(e=>e[0]===`hips`)[1];if(!(Ra(e.P[a.Hips],d)>nS))for(let[e,a,c,u]of l){let l=Math.max(...r.map(([,e,t,n])=>u+n-qs(a,c,e,t))),d=Qd(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 aS=(e,t)=>` (${e}the knee would fold ${Math.round(t)}deg; it bends to 150deg and stops at 160deg)`;function oS(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=so(Ra(s,c),Ra(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 ${Yy(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 sS=.003,cS=.25,lS=e=>/(^|_)l$|^Left/.test(e)?`l`:/(^|_)r$|^Right/.test(e)?`r`:null;function uS(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=ql(e.out.ctx,a,t,{...s,diag:{...s.diag,frame:n}},i);return{path:o(`local`),delta:J(Y(c.R),r)}}function dS(e,t,n,r,i=``){let a=/^prop_(.+)$/.exec(t),o=a?e.spec.props?.[a[1]]?.hand:lS(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?uS(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 ${Yy(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 ${Yy(u)} m at f${n}${i}`,fix:l}}var fS=e=>Ws.find(t=>t[0]===e);function pS(e,t,n,r){let[,i,a]=fS(n),{s:o}=e.fr(t),s=Gs(o.P[e.I[i]],o.P[e.I[a]]),c=s.map(e=>Ks(e,r)),l=Math.min(...c);return{p:s[c.indexOf(l)],n:Qs(s[c.indexOf(l)],r),d:l}}function mS(e,t,n,r,i){let a=t.worstFrame,o=e.out.objectsAt(e.rel(a))[r];if(!o||!fS(n))return null;let{n:s}=pS(e,a,n,o);return dS(e,n,a,U(s,i),` (out of ${r})`)}function hS(e,t,n,r){let i=t.worstFrame,a=e.out.objectsAt(e.rel(i))[r];if(!a)return null;let o=Kd(e.sk,e.fr(i).s,n.endsWith(`_l`)?`Left`:`Right`),s=qd(o,a),c=t.worst-t.limit+sS;if(!(s.side>0))return s.topAt?dS(e,n,i,U(Qs(s.topAt,a),c),` (out of ${r}'s top)`):null;let l=Math.max(...o.filter(e=>Ks(e,a)<0).map(e=>2*a.half[1]-J(Y(a.R),H(e,a.pos))[1]))+sS,u=U(Qs(s.sideAt,a),c);if(l>cS)return dS(e,n,i,u,` (out of ${r}'s side)`);let d=dS(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 ${Yy(u)} m out of that side`,d}function gS(e,t,n,r,i,a){return dS(e,n,t.worstFrame,U(K(r),i),` (away from the ${a})`)}function _S(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 Gs(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 vS={COLLIDE(e,t){let[,n,r]=/^(\S+) x (.+)$/.exec(t.subject)??[];if(/^foot_[lr]$/.test(n??``))return hS(e,t,n,r);let i=mS(e,t,n,r,t.worst-t.limit+sS);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=fS(n),a=e.out?.ctx?.scene?.people?.[r];if(!i||!a)return null;let o=t.worstFrame,{s}=e.fr(o),c=Gs(s.P[e.I[i[1]]],s.P[e.I[i[2]]]),l=rS(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,za(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=dS(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+sS),` (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+sS)} }]`}},CLEARANCE(e,t){let n=(e.spec.checks?.clearance??[]).find(e=>t.subject.startsWith(`${e.name}:`));return n&&mS(e,t,n.part,n.object,n.min-t.worst+sS)},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 oS(e,n,r,aS(`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 ${Ys(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=io(i,e.I.Head,e.sk.landmarks.headCentre);return gS(e,t,n,H(_S(e,r,n).reduce((t,n)=>Js(e.sk,i,n)>Js(e.sk,i,t)?n:t),a),t.worst-t.limit+sS,`head`)},BODY(e,t){let[,n,r]=/^(\S+) into (\S+)$/.exec(t.subject)??[],i=fS(r),a=t.worstFrame,{s:o}=e.fr(a),s=/^(hand|farm|uarm)_([lr])$/.exec(n??``),c=s&&Jo(e.sk);if(c){let i=e.I[`${s[2]===`l`?`Left`:`Right`}${{hand:`Hand`,farm:`ForeArm`,uarm:`Arm`}[s[1]]}`],l=us(c,e.sk,o,i),u=l.p&&$o(c,o,l.p,c.skip.get(i));if(u){let i=dS(e,n,a,U(u,t.worst-t.limit+sS),` (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,za(W(H(e,l),d)/W(d,d),0,1))),p=_S(e,a,n).reduce((e,t)=>G(H(t,f(t)))<G(H(e,f(e)))?t:e);return gS(e,t,n,H(p,f(p)),t.worst-t.limit+sS,`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+sS)/2,s=dS(e,`hand_l`,n,U(r,o));return{cause:s.cause,hint:`${s.hint}; and ${dS(e,`hand_r`,n,U(r,-o)).hint}`,fix:dS(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=qs(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+sS)/2,p=K(d);return{cause:e.cause(`foot_l`,n),hint:`foot_l: move ${Yy(U(p,f))} m and foot_r ${Yy(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 ${Ys(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(Zs(e.sk,r,t))),c=s.map(e=>e[0]),l=s.map(e=>e[2]),u=.07,d=[za(o[0],Math.min(...c)-u,Math.max(...c)+u),o[1],za(o[2],Math.min(...l)-u,Math.max(...l)+u)];return{cause:e.cause(`root`,n),hint:`root: move ${Yy(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)}}}},yS=.003,bS=.02,xS=.2;function SS(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(xS,r/c));return{delta:l,hint:`body: move ${Yy(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 CS=(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 wS(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>bS)||i&&o<=i.w||(i={ch:a,w:o});return i}function TS(e,t,n,r,i){let a=n.slice(-1),o=e.hand(a,r),s=o.anchor?wS(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)<=bS&&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 ES(e,t){let n=null;return(e.spec?.goals??[]).forEach((e,r)=>{let i=tb(e,r);t.subject.startsWith(`${i}:`)&&(!n||i.length>n.name.length)&&(n={goal:e,name:i,i:r})}),n}function DS(e,t,n){let r=[t,...e.out.ctx.scene?.objects?.[t]?.ancestors??[]].find(t=>wm(e.spec.objects?.[t],n));return r?e.spec.objects[r]:null}function OS(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=DS(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=sl(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 kS(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 AS(e,t,n,r,i,a){if(n===`moved`||n===`still`){let o=t[n],s=OS(e,o,r),c=sb(e.out,t,a),l=iu(e.out,r,ib(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=OS(e,o,r),l=OS(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=iu(e.out,r,o),h=iu(e.out,r,s);return m&&h?[f,U(K(H(h,m)),p*i)]:null}var jS={GOAL(e,t){let n=e.spec&&ES(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=eb(i)[0],c=t.worst+yS,l=gb(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} ${nb(i,s)})`;if(s===`speed`){let t=OS(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=AS(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=TS(e,i,m,r,f);if(t)return t;let n=CS(e,m.slice(-1),r)&&SS(e,m.slice(-1),r,c,f);if(n)return{cause:e.cause(`root`,r),hint:n.hint,fix:n.fix}}let g=dS(e,m,r,h,f),_=kS(e,m,r,h);return{cause:g.cause,hint:g.hint,..._?{fix:_}:{}}}},MS={Leg:[`UpLeg`,`Leg`,`Foot`,`knee`],ForeArm:[`Arm`,`ForeArm`,`Hand`,`elbow`]},NS=e=>e.startsWith(`Left`)?`l`:`r`,PS=e=>/^(w_|armw)/.test(e)?.5:/^(root|foot|hand)/.test(e)?1:/^(knee|elbow)/.test(e)?.2:.01;function FS(e,t,n){let r=NS(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)?Ra(t,r):Math.abs(r-t))*PS(e)};return a.filter(e=>i[e]).sort((e,t)=>o(t)-o(e))}function IS(e,t,n){let r=t.subject.split(` `)[0],i=t.worstFrame,a=FS(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 LS(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 Wl(e.out.ctx,i,t.s,t.diag,t.c)}function RS(e,t,n,r){let i=Cu(e.out.baked,t),a=r(e.fr(t)),o=null;for(let[s,c,l]of n){let n=r(My(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 zS=(e,t,n,r)=>e.fr(n).s.P[e.I[`${t===`l`?`Left`:`Right`}${MS[r][0]}`]],BS={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 oS(e,r,i,aS(`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=zS(e,r,i,`Leg`),c=H(o,s),l=Ra(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 ${Yy(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 ${Yy(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=dS(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 ${Yy(U([-l[0],0,-l[2]],a))} m back from it`,fix:n.fix}}let d=dS(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?Ra(g,V(LS(e,e.fr(i),`anchor:${f}`),h.offset??[0,0,0]))+.01:a,v=m&&SS(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 ${Yy(U([l[0],0,l[2]],a))} m closer`,fix:d.fix}},KNEE(e,t){let n=NS(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 ${Yy(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 oS(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=Ra(l,u),p=Ra(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 ${Yy(U(K(H(d,l)),h-Ra(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-Ra(l,d))}}},ELBOW(e,t){let n=NS(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)),so(Ra(s,c),Ra(c,l),145)-Ra(s,l));return dS(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=NS(n),[o,s,c,l]=MS[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 Za(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 ${Yy(v)} there)`:``}`,fix:v&&{channel:_,f:i,value:v}}},SLIDE(e,t){let n=NS(t.subject),r=n===`l`?`Left`:`Right`,i=t.subject.includes(`heel`)?`heel`:`ball`,a=Math.max(0,t.first-1),o=t=>Zs(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 ${Yy(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)=>IS(e,t,1),POP:(e,t)=>IS(e,t,.5),ACC:(e,t)=>IS(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 ${Ys(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=qb(e.out,i,n.point),o=qb(e.out,i,n.target),s=H(o,a),c=/^prop:([^.]+)/.exec(n.point),l=c?e.spec.props?.[c[1]]?.hand:NS(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})`:dS(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 ${Yy(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 ${Yy(h)} m toward ${f??`the target`}, or move the target`,fix:{channel:`root`,f:r,delta:h}};let _=dS(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:NS(n.from.slice(6)),o=n.minCos??.64,s=t=>n.along===`up`?[0,1,0]:n.along===`face`?ao(e.sk,t.s,e.I.Head,[0,0,1]):K(n.along),c=t=>W(K(H(LS(e,t,n.to),LS(e,t,n.from))),s(t)),l=Cu(e.out.baked,r),u=l[`wtwist_${a}`]??0,d=l[`wflex_${a}`]??0,{best:f,base:p}=RS(e,r,[[`wtwist_${a}`,za(u+15,-85,85),15],[`wtwist_${a}`,za(u-15,-85,85),15],[`wflex_${a}`,za(d+15,-70,70),15],[`wflex_${a}`,za(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=za(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=NS(n.joint),a=`${/Leg/.test(n.joint)?`knee`:`elbow`}_${i}`,o=Cu(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=Cu(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(My(e.out.ctx,{...l,[a]:t},r)),turn:Za(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 ${Yy(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(qb(e.out,e.rel(t),`joint:${n.joint}`),qb(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}_${NS(n.joint)} at 1 around the switch`}}},VS=.003,HS=24;function US(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 WS(e,t,n,r,i){let a=dS(e,`hand_${t}`,n,r,i),o=US(e,t,n,r);return o?{...a,fix:o}:a}function GS(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,hl(a)[i.object]?.ancestors,[i.object]].some(e=>e?.includes(r))}function KS(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)=>za(t,r[n]-e.half[n],r[n]+e.half[n]))))}var qS={REACH:(e,t)=>rx(e,t)??BS.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||!xh(i))return a;let o=null;for(let i=r-HS;i<=r+HS;i++){let a=gx(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=Th(s,c,e.fr(r).s,i),d=Cm(l,n).map(e=>KS(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=WS(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=xh(i[r])?r:xh(i[n])?n:null;if(!a||!e.out)return vS.COLLIDE(e,t);let o=i[a],s=e.spec.props[o.prop].hand,[c,l]=Dm(e.out,o),u=t.worst-t.limit+VS,d=t.worstFrame,f=d>=c&&d<=l,p=Math.min(d,l),m=zm(e.out,a,d)??[];if(a===r){let t=Ws.find(e=>e[0]===n),{s:r}=e.fr(d);if(!t||!m.length)return null;let i=Gs(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)=>Ks(t[1],t[0])<Ks(e[1],e[0])?t:e),l=Qs(c,o),p=/^(hand|farm|uarm)_([lr])$/.exec(n)?.[2];return f&&p&&p!==s&&GS(e,p,d,a)?dS(e,`hand_${p}`,d,U(l,u),` (out of ${a})`):f?WS(e,s,d,U(l,-u),` (${a} off ${n})`):dS(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=zm(e.out,a,Math.max(c,t.first-1))??m,_=m.map((e,t)=>fx(e,h,H(g[t].pos,h.pos))).reduce((e,t)=>t.depth>e.depth?t:e);return WS(e,s,p,U(_.axis,_.depth-t.limit+VS),f?` (${a} out of ${r})`:` (${a} is put down in ${r}; it stays where the hand lets go at f${l})`)}},JS=.005,YS=e=>e.spec?.fix?.grasp===!1,XS={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 ZS(e,t,n){let{scene:r}=e.out.ctx,i=e.out.objectsAt?.(e.rel(n))??{};return Cm(r,t).map(t=>({...r.objects[t],...e.out.ctx.objectPose?.(t,n)??i[t]??{}}))}var QS={FINGER_GAP(e,t){if(YS(e))return XS;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=ZS(e,r,o);if(!l.length)return null;let u=l.reduce((e,t)=>rc(t,c)<rc(e,c)?t:e),d=rc(u,c);return dS(e,`hand_${i}`,o,U(ic(u,c),-Math.max(0,d-.03)),` (onto ${r}: the fingers reach it from nearer)`)},FINGER_PEN(e,t){if(YS(e))return XS;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=ZS(e,r,a);if(!s.length)return null;let c=s.reduce((e,t)=>rc(t,o)<rc(e,o)?t:e);return dS(e,`hand_${i}`,a,U(ic(c,o),t.worst-t.limit+JS),` (out of ${r})`)},SUPPORT(e,t){if(YS(e))return XS;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[Cm(e.out.ctx.scene,n)[0]],a=i?ec(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=Nm(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}}},$S=[`add`,`remove`,`replace`,`test`],eC=e=>{throw Error(`MOTION_SPEC_INVALID: ${e}`)},tC=(e,t)=>JSON.stringify(e)===JSON.stringify(t),nC=e=>e.split(`/`).slice(1).map(e=>e.replaceAll(`~1`,`/`).replaceAll(`~0`,`~`)),rC=e=>e.map(e=>`/${String(e).replaceAll(`~`,`~0`).replaceAll(`/`,`~1`)}`).join(``);function iC(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 aC(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))&&eC(`${n}: ${rC(t.slice(0,e+1))} does not exist${r&&typeof r==`object`?` (${iC(r,a)})`:``}`),r=r[Array.isArray(r)?Number(i):i]}return(typeof r!=`object`||!r)&&eC(`${n}: ${rC(t.slice(0,-1))} is not an object or array`),r}function oC(e,t,n,r){(!t||typeof t!=`object`||!$S.includes(t.op))&&eC(`patch[${n}]: op must be ${$S.join(`, `)}, got ${JSON.stringify(t?.op)}`);let i=`patch[${n}] (${t.op} ${t.path})`;if((typeof t.path!=`string`||t.path!==``&&!t.path.startsWith(`/`))&&eC(`${i}: path must be a JSON Pointer such as "/keys/0/f"`),t.op!==`remove`&&!Object.hasOwn(t,`value`)&&eC(`${i}: needs a value`),t.path===``){if(t.op===`replace`)return structuredClone(t.value);if(t.op===`test`)return tC(e,t.value)||eC(`${i}: the spec differs from the test value`),e;eC(`${i}: ${t.op} needs a path below the spec`)}let a=nC(t.path),o=a[a.length-1],s=aC(e,a,i),c=a.length>1?a[a.length-2]:`the spec`;if(Array.isArray(s)){if(o===`-`)return t.op!==`add`&&eC(`${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||eC(`${i}: ${t.path} does not exist (${iC(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):tC(s[n],t.value)||eC(`${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 (${iC(s,c)}); added`):t.op!==`add`&&!Object.hasOwn(s,o)&&eC(`${i}: ${t.path} does not exist (${iC(s,c)})`),t.op===`remove`?delete s[o]:t.op===`test`?tC(s[o],t.value)||eC(`${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 sC(e,t,n){return Array.isArray(t)||eC(`patch must be an array of { op, path, value }`),t.reduce((e,t,r)=>oC(e,t,r,n),structuredClone(e))}var cC=2,lC=e=>Array.isArray(e)?e.map(lC):typeof e==`number`?Math.round(e*1e4)/1e4:e,uC=e=>e.split(`/`).slice(1).map(e=>e.replaceAll(`~1`,`/`).replaceAll(`~0`,`~`)),dC=e=>e.map(e=>`/${String(e).replaceAll(`~`,`~0`).replaceAll(`/`,`~1`)}`).join(``),fC=e=>typeof e==`number`&&Number.isFinite(e);function pC(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 mC(e,t){if(fC(e)&&fC(t))return e+t;if(Array.isArray(e)&&Array.isArray(t)&&e.length===t.length&&e.every(fC)&&t.every(fC))return e.map((e,n)=>e+t[n])}function hC(e,t,n){let r=-1;return(e.keys??[]).forEach((i,a)=>{!i?.set||!Object.hasOwn(i.set,t)||!fC(i.f)||Math.abs(i.f-n)>cC||(r<0||Math.abs(i.f-n)<Math.abs(e.keys[r].f-n))&&(r=a)}),r}function gC(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=lC(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 _C(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:lC(t)}:{op:`add`,path:`/use/${n}/args`,value:{[e]:lC(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 vC(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:lC([i[0]+n.delta[0],i[1],i[2]+n.delta[2]])}:null}).filter(Boolean)}function yC(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 gC(e,t,n,r);if(i?.[2]===`walkTo`)return _C(e,t,Number(i[1]),n);let a=r&&vC(e,t,n);return a?.length?a:null}function bC(e,t,n){let{channel:r,f:i}=n;if(typeof r!=`string`||!fC(i))return null;if(n.hold)return yC(e,t,n);let a=e=>n.value===void 0?mC(e,n.delta):n.value,o=hC(t,r,i);if(o>=0){let e=a(t.keys[o].set[r]);return e===void 0?null:[{op:`replace`,path:dC([`keys`,o,`set`,r]),value:lC(e)}]}if(!e?.fr)return null;let{prev:s,next:c}=e.bracket(r,i),l=s&&i-s.f<=cC?s:c&&c.f-i<=cC?c:null,u=n.delta!==void 0&&gC(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]:lC(d)}}}]}function xC(e,t){if(typeof t.path!=`string`||!t.path.startsWith(`/`))return null;let n=uC(t.path),r=pC(e,n),i=t.delta===void 0?t.value:r===void 0&&t.path.endsWith(`/offset`)?t.delta:mC(r,t.delta);return i===void 0?null:r===void 0?pC(e,n.slice(0,-1))===void 0?n.length===2&&n[0]===`fix`?[{op:`add`,path:dC([n[0]]),value:{[n[1]]:lC(i)}}]:null:[{op:`add`,path:t.path,value:lC(i)}]:[{op:`replace`,path:t.path,value:lC(i)}]}function SC(e,t,n){let r=e.ops?e.ops(n):e.channel===void 0?e.path===void 0?null:xC(n,e):bC(t,n,e);if(!r)return null;try{return JSON.stringify(sC(n,r))===JSON.stringify(n)?null:r}catch{return null}}function CC(e,{X:t,userSpec:n}={}){if(!n||typeof n!=`object`)return e;for(let r of e)if(r.fix)try{let e=SC(r.fix,t,n);e&&(r.patch=e)}catch{}return e}var wC={...vS,...BS,...qS,...jS,...tS,...Ey,...QS};function TC(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 EC(e,t,n){let r=TC(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 DC(e,t,n,r,{limit:i=16,userSpec:a}={}){if(!r.length)return r;let o=EC(e,t,n);for(let e of r.slice(0,i))try{let t=wC[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 CC(r,{X:o,userSpec:a})}var OC=new Set([`ORIENT`,`BELOW`,`CLEARANCE`]),kC=e=>Math.max(0,OC.has(e.kind)?e.limit-e.worst:e.worst-e.limit),AC=e=>e.count*(1+Math.min(3,kC(e)/Math.max(Math.abs(e.limit),.01))),jC=e=>Math.round(AC(e)*100)/100,MC=/(?<![\w\-.[])[-+]?\d+(\.\d+)?|\bf\d+\b/g,NC=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(MC,e=>e[0]===`f`?`f#`:`#`)}`};function PC(e){for(let t of e)t.excess=Math.round(kC(t)*1e4)/1e4,t.severity=jC(t);return e.sort((e,t)=>(t.kind===`GOAL`)-(e.kind===`GOAL`)||t.severity-e.severity||t.count-e.count)}function FC(e){let t=new Map;for(let n of e){let e=NC({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),(OC.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 PC([...t.values()])}function IC(e,t,n,r={}){let i=n.checks??{},a=_b(t,n.goals??[]),o=[...$d(e,t,{allow:i.allow,limits:i.limits,mouthPoints:i.mouthPoints}),...Qb(t,i),...vx(e,t,n),...Lx(e,t),...wy(e,t),...Id(t,i),...Rd(e,t,i,{...Yd,...i.limits}),...$x(e,t),...iS(e,t,i),...a.issues];if(t.f0)for(let e of o)e.frame+=t.f0;let s=FC(o);return r.explain!==!1&&DC(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 LC=[`contacts`,`orient`,`below`,`clearance`,`appear`];function RC(e){let t=e?.checks;if(!t||typeof t!=`object`||!LC.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 LC)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 zC=(e,t)=>({...t,...e?{description:e}:{}}),BC=(e,t)=>zC(e,{type:`number`,...t}),VC=(e,t)=>zC(e,{type:`integer`,...t}),$=(e,t)=>zC(e,{type:`string`,...t}),HC=(e,t)=>zC(e,{type:`boolean`,...t}),UC=(e,t)=>zC(t,{$ref:`#/$defs/${e}`}),WC=e=>zC(e,{enum:[`l`,`r`]}),GC=(e,t)=>zC(t,{type:`array`,prefixItems:[e,e],minItems:2,maxItems:2}),KC={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:`^(${Nc.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: ${Ws.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`}]}},qC={f:VC(`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`)},JC={skill:$(`a skill name (topic skills)`),args:{type:`object`,description:`the skill's args (topic skills with name)`},f0:VC(`first frame`,{minimum:0})},YC={type:{const:`walk`},f0:VC(`first frame; needs a standing pose keyed before it`,{minimum:0}),steps:VC(`footsteps`,{minimum:1,default:8}),step:BC(`stride, m`,{default:.5}),period:VC(`frames per step`,{default:20}),swing:VC(`frames a foot is in the air`,{default:14}),halfWidth:BC(`feet half-width, m`,{default:.08}),lift:BC(`foot lift, m`,{default:.08}),heading:GC({type:`number`},`[h0, h1] degrees; ${qc.yaw}`),turnDistance:BC(`m walked while the heading turns h0 -> h1`,{default:.4}),pelvisHigh:BC(`hips offset over the stance foot, m`),pelvisLow:BC(`hips offset at double support, m`),firstStep:BC(`first stride, m`,{default:.4}),armSwing:BC(`degrees`,{default:14}),vary:BC(`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})},XC={schema:{const:`cozyclay.motion-spec.v1`},fps:{const:24},frames:{oneOf:[VC(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:BC(`m; a hand moving between targets arcs around the torso this far out`,{default:.25}),search:{type:`object`,properties:{budget:VC(`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`}},ZC={p:UC(`vec3`,`world: a world point (m); body: root-relative, ${qc.pole}`),bone:$(`bone name`),offset:UC(`vec3`,`world offset, m`),from:$(`bone`),to:$(`bone`),t:BC(`0 = from .. 1 = to`,{default:.5}),tMin:BC(`with reach: the lowest t to slide back to`,{default:.15}),reach:WC("slide toward `from` until this arm reaches"),object:$(`scene object id`),local:UC(`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:Hc,description:`the hand takes it by a socket`}},QC=e=>UC(`vec3`,`${e} [d, l, n] on the palm axes (d to the middle finger, l to the thumb side, n = d x l), m`),$C={world:[`p`],body:[`p`],bone:[`bone`],segment:[`from`,`to`],object:[`object`],landmark:[`name`],prop:[`prop`,`point`],person:[`person`,`bone`]},ew={hand:WC(),origin:{type:`array`,items:{type:`string`},minItems:1,description:`bones whose mean is the prop origin`},points:{type:`object`,additionalProperties:QC(`point:`),description:`name -> point`}},tw={side:WC(),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:UC(`vec3`,`world offset, m`),orient:{type:`boolean`,description:`false: no grip turn`}},nw={f:VC(),pos:UC(`vec3`),rot:{type:`array`,items:{type:`number`},minItems:4,maxItems:4,description:`quat x, y, z, w`},aim:UC(`vec3`,`or rot: +Y dir`),roll:BC(`deg about aim`),lean:BC(`aim tilt`,{minimum:0,maximum:45})},rw={type:`object`,properties:{at:VC(),onto:$(),bounce:BC(null,{default:.25,minimum:0,maximum:.6}),tumble:{type:`boolean`},v:{oneOf:[{$ref:`#/$defs/vec3`},{const:`hand`}],description:`m/s`}},required:[`at`],additionalProperties:!1},iw={description:`as carry; keys at any frame`},aw={keys:iw,fall:iw},ow={pivot:UC(`vec3`,`world hinge point`),axis:UC(`vec3`,`default +Y`),channel:$(`angle channel, deg`),prop:$(`spec.props name: it rides that hand`),at:UC(`vec3`,`palm offset [d, l, n]`),along:UC(`vec3`,`+Y on the palm, fixed`),visible:$(`channel: shown > 0.5`),level:$(`channel: strength 0..4`),grab:VC(`hand takes it`,{default:0}),release:VC(`let go (else end)`),keys:{type:`array`,items:{type:`object`,properties:Object.fromEntries(Dc.map(e=>[e,nw[e]])),required:[`f`,`pos`],additionalProperties:!1},description:`world pose at f; hand follows`},fall:{...rw,description:`or a list; topic objects`},grasp:{enum:Hc},mass:BC(`kg`,{minimum:.01,maximum:60}),follow:UC(`ref`),offset:UC(`vec3`),aim:{oneOf:[{enum:[`face`,`up`]},{$ref:`#/$defs/vec3`},{$ref:`#/$defs/ref`}],default:`up`}},sw={name:$(`the QA group's name`),point:UC(`checkRef`),target:UC(`checkRef`),tol:BC(`m; default contacts 0.01, appear 0.035, supports 0.04`),when:UC(`when`),from:UC(`checkRef`),to:UC(`checkRef`),along:{oneOf:[{enum:[`face`,`up`]},{$ref:`#/$defs/vec3`}]},minCos:BC(`default 0.64`),joint:$(`bone`),ref:$(`bone`),min:BC(`m; below default 0.08`),part:UC(`part`),object:$(`scene object id`),frames:UC(`frameSpan`),channel:$(`a visibility channel`),anchor:$(`an anchor name`),depth:BC(`allowed depth, m`)},cw={contacts:[`point`,`target`],orient:[`from`,`to`,`along`],below:[`joint`,`ref`],clearance:[`part`,`object`,`min`],appear:[`channel`,`joint`,`anchor`],supports:[`object`],allow:[`part`,`object`,`depth`]},lw={limits:{type:`object`,properties:Object.fromEntries(Object.entries(Yd).map(([e,t])=>[e,BC(null,{default:t})])),additionalProperties:!1},mouthPoints:{type:`array`,items:$(`prop.point`),description:`prop points allowed at the mouth`}},uw={name:$(),near:GC({$ref:`#/$defs/ref`},`distance <= tol`),above:GC({$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:BC(`m; near default 0.05, still 0.01`),by:BC(`above m, default 0; moved m, default 0.05; speed m/s, needed`),at:{oneOf:[VC(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`)},dw={name:$(`the key of the answer`),distance:GC({$ref:`#/$defs/ref`},`min/max/mean/first/last m`),position:UC(`ref`,`world points`),frames:UC(`frameSpan`,`absolute, default the whole take`),every:VC(`position: every n frames (<= 16 rows)`,{minimum:1})},fw={reach:HC(`wrist targets past reach go onto it softly; hips lower for near-miss ankles`,{default:!0}),slide:HC(`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:HC(`arms kept out of the body's skin (wrists, elbows)`,{default:!0}),retime:HC(`speed spikes borrow frames from the neighbouring keys`,{default:!1}),stance:HC(`a standIdle stance in a scene body slides out of it (observations.placed)`,{default:!0}),grasp:HC(`fingers close on what the hand holds; it rests in the hand`,{default:!0})},pw={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>`},mw=e=>e.f0+16+(e.steps??8)*(e.period??20)+18,hw=e=>({type:`array`,items:{type:`number`},minItems:2,maxItems:2,description:e}),gw=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)`)])),_w=Object.fromEntries(Oc.filter(e=>e!==`type`&&e!==`f0`).map(e=>[e,YC[e]])),vw={standIdle:{args:{at:hw(`[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:BC(`degrees (yaw); default the keyed yaw`),until:VC(`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:hw(`[x, z] world m: the heading turns toward it and the steps cover the distance`),..._w,heading:{oneOf:[BC(),YC.heading],description:`degrees: h1, or [h0, h1]`},arrive:VC(`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:WC(`the hand`),reach:VC(`frames to reach`,{default:20}),hold:VC(`frames held`,{default:22}),release:VC(`frames to let go`,{default:12}),elbow:UC(`vec3`,`pole`),fingers:{enum:Vc,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:{...gw([`car`,`seat`,`seatBack`,`wheel`]),offset:{...UC(`vec3`,`hips from the seat top, seat frame`),default:[0,.17,.02]},floor:BC(`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:{...gw([`car`,`seat`,`door`,`handle`]),side:WC(`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:BC(`back/front: m along the heading at landing (default back -0.25, front 0.4)`),side:WC(`cartwheel: toward the character's l (default) or r`),heading:BC(`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:VC(`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:hw(`[x, z] the way the body is thrown`),from:$(`or what hits it: object:<id> | person:<id> (thrown away from it)`),speed:BC(`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:WC(`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`}}}},yw={_l:`_r`,_r:`_l`},bw=/^(yaw|roll|spine_yaw|spine_roll|head_yaw|head_roll|fyaw_[lr]|wtwist_[lr]|wflex_[lr])$/,xw=/^(root|foot_[lr]|hand_[lr])$/,Sw=/^(knee|elbow)_[lr]$/,Cw=/^(yaw|fyaw_[lr])$/,ww=e=>e&&typeof e==`object`?structuredClone(e):e,Tw=e=>e.replace(/_(l|r)$/,e=>yw[e]).replace(/^(Left|Right)/,e=>e===`Left`?`Right`:`Left`),Ew=()=>({origin:[0,0,0],yaw:0,mirror:!1,negate:new Set,names:{}}),Dw=(e,t)=>V(e.origin,J(X(e.yaw),e.mirror?[-t[0],t[1],t[2]]:t)),Ow=(e,t)=>e.mirror?[-t[0],t[1],t[2]]:t.slice();function kw(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)?Tw(t):t}function Aw(e,t){let n={};for(let[r,i]of Object.entries(t)){let t=ww(i);xw.test(r)?t=Dw(e,t):Sw.test(r)?t=Ow(e,t):typeof t==`number`&&(e.mirror&&(bw.test(r)||e.negate.has(r))&&(t=-t),Cw.test(r)&&(t+=e.yaw)),n[kw(e,r)]=t}return n}function jw(e,t=0,n=Ew()){let r=[],i=e=>kw(n,e);return{state:e,keys:r,frame:n,at(i,a){let o=Aw(n,a);Object.assign(e,ww(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),ww(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 Mw=(e,t)=>{throw Error(`MOTION_SPEC_INVALID: ${e}: ${t}`)};function Nw(e,t,n){let r=e.scene?.objects?.[n];return r||Mw(e.tag,`args.${t} "${n}" is not a scene object`),r}var Pw=e=>Math.atan2(e[0][2],e[2][2])*180/Math.PI,Fw=.01,Iw=.12,Lw=.8,Rw=.01,zw=.15,Bw=.62,Vw=[`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]]),Hw=[[0,-1],[1,0],[-1,0],[Math.SQRT1_2,-Math.SQRT1_2],[-Math.SQRT1_2,-Math.SQRT1_2]];function Uw(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]-Bw,t[2]]),.045)});return Vw.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 Ww=e=>Object.values(e?.objects??{}).filter(e=>e.half&&e.pos&&e.R&&e.pos[1]+2*e.half[1]*e.R[1][1]>Iw);function Gw(e,t,n,r){let i=1/0;for(let[a,o]of Uw(e,n,r))for(let e of t)i=Math.min(i,Ks(a,e)-o-Fw);return i}function Kw(e,t,n,r){let i=Ww(t);if(!i.length||Gw(e,i,n,r)>=0)return null;let a=X(r);for(let t=Rw;t<=.600000001;t+=Rw)for(let[o,s]of Hw){let c=J(a,[o*t,0,s*t]),l=[n[0]+c[0],n[1]+c[2]];if(Gw(e,i,l,r)>=0)return{at:l.map(e=>+e.toFixed(4)),moved:+t.toFixed(2)}}return null}function qw(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=Cm(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 Jw(e){let{sk:t,scene:n,use:r=[],index:i=-1}=e,a=r.slice(i+1).find(e=>e?.skill===`reachGrip`),o=qw(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(zw,Math.sqrt(Math.max(0,(Lw*f)**2-p*p))),h=e.args.heading??e.state?.yaw??0,g=X(h),_=Ww(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&&Gw(t,_,x,h)<0;b+=Rw){let e=J(g,[0,0,-(b+Rw)]);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 Yw=.65,Xw=.75,Zw=.75,Qw=.025,$w=.1,eT=.08,tT=.12,nT=.4,rT=.3,iT=[.15,.3,.45,.6,.7,.8,.9],aT=e=>e*e*e*(10-15*e+6*e*e),oT=.9,sT=.7,cT=(e,t)=>{let n=Math.min(1,Math.max(0,e));return n<sT?oT*aT((n/sT)**+t):oT+.09999999999999998*aT((n-sT)/.30000000000000004)},lT=e=>[...new Map(iT.map(t=>Math.round(t*e)).filter(t=>t>0&&t<e).map(t=>[t,[cT(t/e,Yw),cT(t/e,Xw)]])).entries()].map(([e,[t,n]])=>[e,t,n]),uT=180/Math.PI,dT=(e,t,n)=>Math.max(t,Math.min(n,e));function fT(e,t){let n=pT(e,t),r=e.sk.index;return!!n&&n[1]>=e.sk.restWorldPos[r.LeftLeg][1]+$w}function pT(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=>mT(e,t))?null:V(n.pos,J(n.R,t.local??[0,n.half?.[1]??0,0]))}function mT(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 hT=new WeakMap;function gT(e){if(!hT.has(e)){let t=eo(e),n=e.index;Eo(e,t,`Right`,{}),hT.set(e,G(H(t.P[n.RightHandThumb4],t.P[n.RightHandIndex4])))}return hT.get(e)}function _T(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&&Ks(r,e)<=.01).sort((e,t)=>Ks(r,e)-Ks(r,t))[0]??null}function vT(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*eT,t[1],t[2]+a/o*eT];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,tT,0]);return Ks(s,t)>0&&Ks(n,t)<=0})}function yT(e,t,n){let r=_T(e,t),i=pT(e,t)??(r&&V(r.pos,J(r.R,[0,r.half[1],0])));if(!r||!i||2*Math.min(...r.half)+Qw>gT(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)&&vT(e,i,n.root,a))}function bT(e,t,n){let r=pT(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])*uT-(n.yaw??0)-(n.spine_yaw??0);for(;u>180;)u-=360;for(;u<-180;)u+=360;let d=Math.atan2(-c[1],l)*uT-(n.pitch??0)-(n.spine_pitch??0);return{head_yaw:dT(Zw*u,-60,60),head_pitch:dT(Zw*d,-30,50)}}var xT=(e,t,n)=>e.some(e=>e.f>=t&&e.f<=n&&(e.set?.head_yaw!==void 0||e.set?.head_pitch!==void 0)),ST=(e,t)=>Wc[e]?Wc[e].map((e,n)=>n===2&&t===`r`?-e:e):[0,0,0];function CT(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=Jw(e);t||Mw(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=Kw(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 wT(e){let{args:t,state:n}=e;(!n.foot_l||!n.foot_r||!n.root)&&Mw(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=L_(r,e.keys,e.sk,e.tag),c=mw(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 TT(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 ET=(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 DT(e){let{args:t,state:n}=e,r=t.side,i=t.anchor;r!==`l`&&r!==`r`&&Mw(e.tag,`args.side must be "l" or "r", got ${JSON.stringify(r)}`),(typeof i!=`string`||/_[lr]$/.test(i))&&Mw(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??Uc[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=!xT(e.keys??[],e.f0,e.f0+v)&&bT(y,t.define??e.anchors?.[i],n),x=b?{head_yaw:n.head_yaw??0,head_pitch:n.head_pitch??0}:null,S=jw(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(fT(y,C))for(let[e,t,n]of lT(a))S.at(e,{[u]:E(w,1,t),[f]:E(T,1,n)});let D=Math.round(nT*a);D>0&&D<a&&yT(y,C,n)&&S.hold(D,d),b&&S.at(Math.max(1,Math.round(rT*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:ST(c,r)}},ee=TT(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:ET(e.scene,re).map(e=>({part:`hand`,object:e,depth:.04}))}}}var OT=[.54,.4,-.075],kT=.4,AT=1.0427487182617188,jT=new Set([`l`,`r`]);function MT(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 NT(e,t,n){let r=Nw(e,`seat`,t);Math.abs(r.pos[1]-kT)>.05&&Mw(e.tag,`seat "${t}" stands at y ${r.pos[1]}; the car skills are tuned for a seat base at y ${kT} (a car on the ground)`);let i=Ew();i.yaw=Pw(r.R),i.mirror=n===`r`;let a=H(r.pos,J(X(i.yaw),i.mirror?[-OT[0],OT[1],OT[2]]:OT));return i.origin=[a[0],0,a[2]],i.names={lthigh:`rthigh`,rthigh:`lthigh`},i}var PT=[[`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})),FT=e=>({A:e.restWorldPos[e.index.LeftFoot][1],H:t=>t+(e.restWorldPos[e.index.Hips][1]-AT)});function IT(e){let{args:t,sk:n}=e,r=MT(t),i=Nw(e,`seat`,r.seat),{A:a}=FT(n),o=Pw(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 LT(e){let t=e.args.side??`l`;jT.has(t)||Mw(e.tag,`args.side must be "l" or "r", got ${JSON.stringify(t)}`);let n=MT(e.args,t),r=NT(e,n.seat,t),i=e.args.channel??`door`;for(let[t,r]of[[`door`,n.door],[`handle`,n.handle]])Nw(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=jw(e.state,e.f0,r),s={};for(let[t,n]of Object.entries(a))e.state[kw(r,t)]===void 0&&(s[t]=n);Object.keys(s).length&&o.at(0,s),RT(o,i,FT(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?Tw(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:Ow(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},...PT]},end:e.f0+246}}function RT(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,kT+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,kT+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 zT=[`cig`,`lighter`,`exhale`],BT={follow:`landmark:mouth`,aim:`face`,visible:`exhale`},VT={cig:`cigarette`,lighter:`lighter`},HT=.7,UT=[-.05,.07,.1],WT=.88,GT=.2,KT=[.245,.08,.02],qT={l:[.13,-.035,.08],r:[-.13,-.035,.08]};function JT(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 YT(e,t,n){let r=t[n];return(typeof r!=`string`||!hl(e.scene)[r])&&Mw(e.tag,`args.kit.${n} ${JSON.stringify(r)} is not a group in the scene; object.createKit { kit: "${VT[n]}" } answers its rootId`),r}var XT={cig:.03,lighter:.045},ZT=.07,QT=.04;function $T(e,t){let n=e.args.kit;if(n===void 0)return null;(!n||typeof n!=`object`||Array.isArray(n))&&Mw(e.tag,`args.kit must be { cig, lighter, exhale? } (kit root ids), got ${JSON.stringify(n)}`);for(let t of Object.keys(n))zT.includes(t)||Mw(e.tag,`args.kit has unknown field "${t}"; fields: ${zT.join(`, `)}`);let r=YT(e,n,`cig`),i=YT(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 JT(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 JT(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]||hl(e.scene)[n.exhale]))&&Mw(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]={...BT});let o=e=>t.squat?ZT:e;return{objects:a,allow:[[`thigh_r`,r,o(XT.cig)],[`thigh_l`,i,o(XT.lighter)],[`hips`,r,o(XT.cig)],[`hips`,i,o(XT.lighter)],...t.squat?[[`shin`,r,ZT],[`shin`,i,ZT],[`hand_l`,`thigh_l`,QT],[`hand_r`,`thigh_r`,QT],[`hand`,`hips`,QT]]:[]].map(([e,t,n])=>({part:e,object:t,depth:n}))}}function eE(e){let{sk:t,state:n}=e,r=t.index,i=t.restWorldPos;if(!(n.root[1]<HT*i[r.Hips][1]))return null;let{s:a}=bh(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),UT)),d=G(H(u,s)),f=c(d>WT*l?V(s,U(H(u,s),WT*l/d)):u),p=V(c(io(a,r.Head,t.landmarks.mouth)),[0,0,GT]),m=cs(t),h=(e,r)=>{let i=V(n.root,J(X(o),[r*KT[0],KT[1],KT[2]]));return c(m?os(m.body,t,a,i,ss,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 tE={TW_M:40,FX_M:0,TW_H:0,FX_H:10,TW_L:-80,FX_L:-50},nE=15,rE=20,iE=[[`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})),aE=[.4,-1,.6],oE=[-.4,-1,-.3],sE=[.9,-.6,.3],cE=[`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`],lE=264,uE=.75,dE=Math.ceil(lE*uE),fE=e=>(e/24).toFixed(1),pE={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 mE(e){let t=e.args.until??(e.auto?e.f0+lE:e.frames-1),n=t-e.f0;n<dE&&Mw(e.tag,`needs frames f${e.f0}..f${e.f0+dE} at least: 199 frames, ${fE(199)} s at 24 fps, paced ${uE} (265 frames, ${fE(265)} s, at its own pace); it has f${e.f0}..f${t}, `+(e.args.until===void 0?`so set frames >= ${e.f0+dE+1} or frames: "auto"`:`so set args.until >= ${e.f0+dE}`)),Array.isArray(e.state.root)||Mw(e.tag,`needs a pose keyed before f0 (root): standing or squatting`);let r=Object.fromEntries(Object.entries(pE).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(Wa(a),aE):aE,c=a?J(Wa(a),oE):oE,l=eE(e),u=e.self?l?rE:nE:tE.FX_M;l&&(e.state.w_mouthOut_r=0);let d=n<lE?n/lE:1,f=e=>Math.round(e*d),p=jw(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:tE.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:tE.TW_H,wflex_r:tE.FX_H,elbow_r:c,head_pitch:o(0)})};m.hold(0,...cE),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:tE.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:tE.TW_L,wflex_l:tE.FX_L,elbow_l:sE}),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,...cE,...l?[`w_mouthOut_r`]:[]);let x=!!l&&e.self,S=$T(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||qT.l},rpocket:{kind:`body`,p:e.self&&l?.rpocket||qT.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??[],...iE]}}}var hE=9.81/576,gE=10,_E=5,vE=6,yE=14,bE=50,xE=e=>Math.min(1,Math.max(0,e)),SE=e=>{let t=xE(e);return t*t*(3-2*t)},CE=(e,t,n)=>e+(t-e)*n,wE=(e,t,n)=>e.map((e,r)=>e+(t[r]-e)*n),TE=(e,t,n,r,i)=>SE((e-t)/(n-t))-SE((e-r)/(i-r)),EE={l:1,r:-1},DE=(e,t,n)=>q(X(e),q(Wa(t),Ga(n))),OE=(e,t,n,r,i)=>J(Y(yh(e,t,n)?.R??X(e)),J(r,i));function kE(e,t,n,r,i,a){let o=yh(e.h,n,r);if(!o)return{fyaw:e.h,fpitch:a};let s=e.toe[t],c=J(i,J(Wa(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 AE(e){let{sk:t,args:n,state:r}=e,i=t.index,a=t.restWorldPos;(!r.foot_l||!r.foot_r||!r.root)&&Mw(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=Ra(a[i.LeftUpLeg],a[i.LeftLeg])+Ra(a[i.LeftLeg],a[i.LeftFoot]),u=Ra(a[i.LeftArm],a[i.LeftForeArm])+Ra(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 jE(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/hE)+Math.sqrt(2*(o+.5-.05-s)/hE))),l=(s-o+hE*c*c/2)/c,u=l-hE*c,d=o-l*_E/2,f=s+u*vE/2,p=a/(_E/2+c+vE/2),m=e.f0,h=m+gE,g=h+_E,_=g+c,v=_+vE,y=v+yE,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=CE(t.root[1],d,SE((e-m)/gE)),r=0;else if(e<=g){let t=e-h;n=d+l/_E*t*t/2,r=p/_E*t*t/2}else if(e<=_){let t=e-g;n=o+l*t-hE*t*t/2,r=p*_E/2+p*t}else if(e<=v){let t=e-_;n=s+u*t-u/vE*t*t/2,r=p*_E/2+p*c+p*t-p/vE*t*t/2}else n=CE(f,t.y0,SE((e-v)/yE)),r=a;return V([t.root[0],n,t.root[2]],U(t.F,r))},C=e=>i*SE((e-g+2)/(c+5)),w=e=>DE(t.h,C(e),0),T=(e,t)=>J(Y(w(e)),H(t,S(e))),E={l:T(g,Hg(x(`l`),t.h,bE,t.feet.l)),r:T(g,Hg(x(`r`),t.h,bE,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=DE(t.h,n,0),i=S(e),a=(e-g)/c,o=e>g&&e<_?TE(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=bE*SE((e-h)/_E),l=Hg(x(c),t.h,u,t.feet[c]);else if(e<_){let e=1-SE(a/.2),n=SE((a-.72)/.28),s=V(t.hipOff[c],wE([0,-t.leg*.97,0],[EE[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=CE(CE(bE,30,SE(a/.2)),0,SE((a-.7)/.3))}else l=b(c),u=0;let d=e>g&&e<_?kE(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}`]:OE(t.h,n,0,r,[EE[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 ME(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],[EE[e]*.3,-t.leg*.93,0]),hand:e=>V(t.shoulder[e],[EE[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*SE((e-o)/34):i*360,h=(e,n,r,i)=>V(n,J(DE(t.h,0,m(e)),d[r](i))),g=DE(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(wE(t.root,_,SE((e-a)/12)));continue}e===o+1&&(S=v.slice());let n=H(S,J(DE(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=wE(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(DE(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])*SE((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 wE(i,a.p,SE((r-a.a+6)/6));if(r>a.b&&r<=a.b+10){let i=J(Y(DE(t.h,0,m(a.b))),H(a.p,E(a.b))),o=V(E(r),J(DE(t.h,0,m(r)),wE(i,d[e](n),SE((r-a.b-1)/9))));return wE(a.p,o,SE((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=DE(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=SE((e-a-1)/8);d=V(wE(t.feet[c],v,n),[0,.07*Math.sin(Math.PI*n),0])}else if(e>s)d=ee[c];else{let n=SE((e-s+4)/4);d=D(wE(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?kE(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}`]:OE(t.h,0,n,r,[EE[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}`]:OE(t.h,0,n,r,[EE[c]*.4,0,-1]),[`armw_${c}`]:e<=o?0:e<=s?SE((e-o)/6):1-SE((e-s)/8)})}u.arm_rest=e<=o?CE(72,-56,SE((e-a)/12)):e<=s?-56:CE(-56,72,SE((e-s)/14)),te.push({f:e,set:u})}return{keys:te,end:c+1}}function NE(e){let t=e.args.kind??`back`;[`back`,`front`,`cartwheel`].includes(t)||Mw(e.tag,`kind must be "back", "front" or "cartwheel", got ${JSON.stringify(t)}`);let n=AE(e);return t===`cartwheel`?ME(e,n):jE(e,n,t)}var PE=9.81,FE=24,IE=.75,LE={back:.16,front:.11},RE=.25,zE=.12,BE=.25,VE=e=>e-zE*(1-Math.exp(-e/zE)),HE=(e,t,n)=>t+n*Math.log1p(Math.exp((e-t)/n)),UE=3/FE,WE=.03,GE=.25,KE=e=>{let t=Math.min(1,Math.max(0,e));return t*t*t*(t*(6*t-15)+10)},qE=e=>(e+540)%360-180,JE=e=>e.map(e=>Math.round(e*1e3)/1e3),YE=e=>Math.round(e*10)/10;function XE(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 ZE(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`?wl(r,o,`Hips`,e.f0):null;s||Mw(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))&&Mw(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 QE(e){let{sk:t,args:n,state:r}=e,i=t.index,a=t.restWorldPos;r.root||Mw(e.tag,`needs a pose keyed before f0 (standIdle, a walk, ...)`);let o=XE(e.keys,`root`,e.f0)??r.root.slice(),s={};for(let t of[`l`,`r`]){let n=XE(e.keys,`foot_${t}`,e.f0),r=XE(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]=ZE(e,o),d=n.speed??4;Number.isFinite(d)&&d>0||Mw(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=qE((m?h+180:h)-c),_=m?-90:90,v=m?LE.back:LE.front,y=o[1],b=e=>y+f*VE(e)-.5*PE*e*e,x=e=>f*(1-Math.exp(-e/zE))-PE*e,S=0,C=(f+Math.sqrt(f*f+2*PE*Math.max(0,y-v)))/PE+1;for(let e=0;e<60;e++){let e=(S+C)/2;b(e)+x(e)*UE/2>v-WE||x(e)>0?S=e:C=e}let w=S,T=Math.min(0,x(w)),E=b(w),D=w+UE,O=d/(IE*PE),k=D+O,ee=e=>e<w?b(e):e<D?E+T*(e-w)-T/(2*UE)*(e-w)**2:v-WE*(1-KE((e-D)/GE)),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)*FE),oe=[];for(let t=e.f0;t<=ae;t++){let n=(t-e.f0)/FE,r=n<D,i=Math.min(Math.max(0,n-D),O),a=r?d*VE(n):d*VE(D)+d*i-.5*IE*PE*i*i,f=ee(n),p=[o[0]+l*a,f,o[2]+u*a],h=Math.max(.35,.9*D),v=c+g*KE(n/Math.max(RE,h)),y=_*KE(n/h),b=(e=>J(X(v),J(Wa(y),e))),x=KE(n/zE)*Math.exp(-n/.18)*Math.sin(2*Math.PI*n/.55),S=KE(n/.3)*Math.exp(-n/.45)*Math.sin(2*Math.PI*n/.6),C=KE((n-D)/.3),w=-(ne-te)+.06*(1-C)+(m?.03:.01)*C,T=KE(n/BE),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]=HE(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=yh(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(Wa(-le),[0,-Math.sin(y*Math.PI/180),Math.max(.05,Math.cos(y*Math.PI/180))]),de={root:JE(p),yaw:YE(v),pitch:YE(y),roll:0,foot_l:JE(k(`l`,.11,.04+.1*S*T-(m?.1:0)*C)),foot_r:JE(k(`r`,-.11,.04-.1*S*T-(m?.1:0)*C)),fyaw_l:YE(v),fyaw_r:YE(v),fpitch_l:YE(m?-50*C:-.5*le),fpitch_r:YE(m?-50*C:-.5*le),knee_l:JE([.05,ue[1],ue[2]]),knee_r:JE([-.05,ue[1],ue[2]]),spine_pitch:YE(re*22*x*Math.min(1,d/4)),spine_yaw:0,spine_roll:YE(10*S*(1-C)),head_pitch:YE(re*30*x*Math.min(1,d/4)+(m?-8:8)*C),head_roll:YE(12*C),arm_rest:YE(72-22*C),aswing_l:YE(re*45*S+8*C),aswing_r:YE(-re*35*S-8*C),abend_l:YE(25+30*S*S),abend_r:YE(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 $E=20,eD=50,tD=10,nD=8,rD=10,iD=8,aD=.25,oD=.42,sD=.22,cD=.09,lD=.25,uD=e=>e.map(e=>Math.round(e*1e3)/1e3);function dD(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 fD(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`&&Mw(a,`args.side must be "l" or "r", got ${JSON.stringify(s)}`),(!c?.prop||e.props?.[c.prop]?.hand!==s)&&Mw(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)&&Mw(a,`args.to must be [x, y, z] world m (where it lands)`);let l=(t.arc===`high`?eD:$E)*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&&Mw(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,oD),[0,sD,0])),v=V(_,U(g,cD)),y=t.to[1]+dD(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||Mw(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(Zp*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*Zp*Math.max(0,v[1]-y)))/Zp,E=e.f0+tD+nD,D=Math.min(e.frames-1,E+Math.ceil(T*u)+iD),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,lD)),[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=Uc[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+tD,set:{[ee]:1,[k]:uD(te)}},{f:e.f0+tD+Math.round(nD/2),set:{[ee]:1,[k]:uD(ne)}},{f:E-1,set:{[ee]:1,[k]:uD(H(_,U(w,1/u)))}},{f:E,set:{[ee]:1,[k]:uD(_)}},{f:E+1,set:{[ee]:1,[k]:uD(re)}},{f:E+3,set:{[ee]:1,[k]:uD(ie)}},{f:E+rD,set:{[ee]:1,[k]:uD(ae)}}],de=`${o}Target`;return{keys:ue,end:E+rD,anchors:{[de]:{kind:`world`,p:uD([t.to[0],y,t.to[2]])}},fills:{[o]:{release:E,fall:{at:E,v:uD(w)}}},goals:[{name:`${o} lands at the target`,near:[`object:${o}`,`anchor:${de}`],at:D,tol:aD}],throw:{release:E,speed:Math.round(C*100)/100,v:uD(w),flight:Math.round(T*100)/100}}}var pD=[.35,.65],mD=.15,hD=10,gD=20,_D=2,vD=6,yD=8,bD=1,xD=e=>e.map(e=>Math.round(e*1e3)/1e3),SD=(e,t,n)=>Math.min(n,Math.max(t,e));function CD(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 wD(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`&&Mw(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)||Mw(a,`args.object "${o}" must fly: objects.${o}.fall { at, v: [vx, vy, vz] }`);let d=CD(r,n,`Right`),f={spec:{objects:{[o]:{fall:c.fall}},fps:l},scene:i,timeMap:null},p=e=>ym(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,pD[0]-n,n-pD[1],mD-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||Mw(a,`${o} never comes within reach of the right hand (in front of the chest, ${pD[0]}-${pD[1]} m from the shoulder): nearest at f${h.f}, [${xD(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+hD+_D),_=m.p,v=U(H(p(m.f),p(m.f-1)),l),y=G(v),b=sy({objects:e.objects},i,o),x=SD(.08+.02*b*y,.08,.15),S=K(v),C=e=>1-(1-e)**3,w=[_,...Array.from({length:vD},(e,t)=>V(_,U(S,x*C((t+1)/vD)))),V(_,U(S,x*.4))],T=Math.max(e.f0,g-_D-gD),E=s===`both`||b>bD,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+vD+yD,props:{},anchors:{},fits:[],channels:[],fills:{[o]:{prop:`${o}Catch`,grab:g,grasp:`spherical`}},catch:{contact:g,point:xD(_),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]}},...lT(g-_D-T).map(([e,t,r])=>({f:T+e,set:{[d(0)]:t,[a]:(n[a]??0)+(1-(n[a]??0))*r}})),{f:g-_D,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<=vD?g+n:g+vD+yD;return[{f:n<=vD?r-1:g+vD,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:xD(V(w[n],i))},k.fits.push({side:e,anchor:t,effector:{prop:r,point:`fingers`}}),k.channels.push(d(n))})}return k}var TD={standIdle:CT,sitInSeat:IT,exitCar:LT,walkTo:wT,reachGrip:DT,smokeCigarette:mE,flip:NE,hitReaction:QE,throwObject:fD,catchObject:wD},ED=Object.keys(TD),DD=e=>{throw Error(`MOTION_SPEC_INVALID: ${e}`)},OD=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function kD(e,t,n,r){for(let[i,a]of Object.entries(t??{}))e[i]&&!OD(e[i],a)&&DD(`${r} defines ${n}.${i} differently from an earlier skill; rename one or define it yourself in spec.${n}`),e[i]=a}function AD(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=>OD(t,e))||t.push(e)}}function jD(e,t,n){e.args!==void 0&&(!e.args||typeof e.args!=`object`||Array.isArray(e.args))&&DD(`use[${t}].args must be an object, got ${JSON.stringify(e.args)}`);let r=Object.keys(vw[e.skill].args);if(!n)for(let n of Object.keys(e.args??{}))r.includes(n)||DD(`use[${t}].args.${n} is not an arg of ${e.skill}${Zc(n,r)} (args: ${r.join(`, `)})`)}function MD(e,{sk:t,scene:n,lenient:r=!1,auto:i=!1}){if(!e.use?.length)return{spec:e,used:[]};Array.isArray(e.use)||DD(`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}`;TD[l?.skill]||DD(`use[${u}].skill "${l?.skill}" is not a skill${el(String(l?.skill),ED)} (skills: ${ED.join(`, `)})`);for(let e of Object.keys(l))!xc.includes(e)&&!r&&DD(`use[${u}] has unknown field "${e}"${Zc(e,xc)}; an entry is { skill, args, f0 }`);jD(l,u,r),(!Number.isInteger(l.f0)||l.f0<0||l.f0>e.frames-1)&&DD(`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:Zv(e.fix).stance,state:structuredClone(I_(f,l.f0)),anchors:{...o.anchors,...e.anchors},objects:{...o.objects,...e.objects}},m=TD[l.skill](p),h=Math.max(m.end??l.f0,...m.keys.map(e=>e.f));h>e.frames-1&&DD(`${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}))),kD(o.anchors,m.anchors,`anchors`,d),kD(o.props,m.props,`props`,d),kD(o.objects,m.objects,`objects`,d);for(let e of m.fits??[])o.fits.some(t=>OD(t,e))||o.fits.push(e);for(let e of m.channels??[])o.channels.includes(e)||o.channels.push(e);AD(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],AD(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 ND=new Set([`f`,`f0`,`steps`,`period`,`swing`,`until`,`reach`,`hold`,`release`]),PD=e=>e&&typeof e==`object`&&!Array.isArray(e)&&(e.range??e.search)!==void 0&&Object.keys(e).every(e=>[`range`,`search`,`int`].includes(e)),FD=e=>e.reduce((e,t)=>typeof t==`number`?`${e}[${t}]`:e?`${e}.${t}`:t,``);function ID(e){let t=[],n=(e,r)=>{if(PD(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: ${FD(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??ND.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 LD=(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 RD(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 zD=e=>e.groups.reduce((e,t)=>e+AC(t),0);function BD(e,t,n,r,i){let a=n=>r(RD(e,t,n)),o=a(n),s=e=>JSON.stringify({...e,keys:void 0,generators:void 0}),c=e=>Su(R_(e,i),e.frames,yu(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?LD(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 VD=[2,3,5,7,11,13,17,19,23,29],HD=(e,t)=>Array.from({length:t},(t,n)=>{let r=1,i=0,a=e,o=VD[n%VD.length];for(;a>0;)r/=o,i+=a%o*r,a=Math.floor(a/o);return i});function UD(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=>LD(e,(e.lo+e.hi)/2)),c=BD(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(RD(e,t,a));f=zD(IC(n,Ny({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)=>LD(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)=>HD(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]=LD(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:RD(e,t,d.values),search:{values:Object.fromEntries(t.map((e,t)=>[FD(e.path),d.values[t]])),evals:u,cost:Math.round(d.cost*100)/100,window:c,ms:Math.round(performance.now()-a)}}}var WD=2e4;function GD(e){let t=structuredClone(e);for(let n of ID(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 KD(e,{sk:t,scene:n,lenient:r=!1}={}){if(e?.frames!==`auto`)return e;let{spec:i,used:a}=MD({...GD(e),frames:WD},{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)?mw(e):null):[]];return{...e,frames:Math.max(0,...o.filter(Number.isFinite))+1}}var qD=new WeakSet;function JD(e){return qD.add(e),e}var YD=e=>Array.isArray(e)?`[${e.map(YD).join(`,`)}]`:e&&typeof e==`object`?`{${Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${JSON.stringify(t)}:${YD(e[t])}`).join(`,`)}}`:JSON.stringify(e)??`null`;function XD(e){let t=14695981039346656037n;for(let n of new TextEncoder().encode(YD(e)))t=BigInt.asUintN(64,(t^BigInt(n))*1099511628211n);return`spec-${t.toString(16).padStart(16,`0`).slice(0,12)}`}function ZD(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=XD(e),i=t.get(n);return r(n,{...i,spec:structuredClone(e),framesAuto:qD.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 QD=12,$D=4,eO=3,tO=5e-4,nO=e=>Math.round(e*1e3)/1e3,rO=e=>Math.round(e*10)/10,iO=e=>e.map(nO);function aO(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,QD)}function oO(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?_d(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]<Yd.plantH&&Math.abs(e[t][1]-o[t][1])<tO&&Math.hypot(e[t][0]-o[t][0],e[t][2]-o[t][2])<=Yd.slide);r[t][n+i]=+!!s})}return r}function sO(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>=eO&&r.push([i,a-1]),i=null)}if(r.length<=$D)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 cO(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=wm(t,i-1),a=wm(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 lO(e,t,n,r){for(let[t,i]of Object.entries(e.objects??{}))if(e.props?.[i?.prop]?.hand===n&&wm(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 uO(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:iO(i.P[o.Hips]),yaw:rO(a.yaw??0),hand_l:iO(i.P[o.LeftHand]),hand_r:iO(i.P[o.RightHand]),on_l:lO(t,a,`l`,n),on_r:lO(t,a,`r`,n)}}function dO(e,{used:t,spec:n}){let r=aO(e,t??[],n);if(!r.length)return[];let i=oO(e),a=cO(e,n);return r.map(t=>({...t,end:uO(e,n,t.f[1]),planted:{l:sO(i.l,t.f),r:sO(i.r,t.f)},events:a.filter(e=>e.f>=t.f[0]&&e.f<=t.f[1])}))}var fO=e=>`[${e[0]},${e[1]}]`,pO=(e,t)=>{e&&!e.includes(t)&&e.push(t)};function mO(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 hO(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=mO(e.at,n);!i||i[0]===e.at[0]&&i[1]===e.at[1]||(pO(t,`goals[${r}]${e.name?` "${e.name}"`:``} at ${fO(e.at)} -> ${fO(i)}: the clip is 0..${n}`),e.at=i)})}var gO=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},_O=e=>e&&(e.rot!==void 0||e.aim!==void 0),vO=e=>e&&typeof e==`object`&&!Array.isArray(e)&&!_O(e)&&e.roll===void 0&&e.lean===void 0;function yO(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})=>vO(e));if(!a.length)return;let o=n?.objects?.[e]??hl(n??{})[e],s=o?xh(t)?{aim:[o.R[0][1],o.R[1][1],o.R[2][1]].map(e=>Math.round(e*1e4)/1e4)}:{rot:Ya(o.R)}:null,c=i.filter(e=>_O(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,gO(n.k)),l.push(t)):s&&(Object.assign(e,s),u.push(t))}l.length&&pO(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&&pO(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 bO(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),pO(n,`objects.${e}.keys[${r}].rot had length ${i.toFixed(3)}: normalized`))})}function xO(e,t,n){if(!e||typeof e!=`object`)return e;hO(e,n);for(let[r,i]of Object.entries(e.objects??{}))!i||typeof i!=`object`||!Array.isArray(i.keys)||!(xh(i)||tm(i))||(yO(r,i,t,n),bO(r,i,n));return e}function SO(e,t,n,r){let i=Number.isInteger(e)?[e,e]:e,a=mO(i,t);return a&&(a[0]!==i[0]||a[1]!==i[1])&&pO(r,`${n}.frames ${fO(i)} -> ${fO(a)}: the take is 0..${t}`),a}function CO(e,t,n,r,i){if(Math.ceil(t/e)<=n)return e;let a=Math.ceil(t/n);return pO(i,`${r}.every ${e} -> ${a}: a position probe answers at most ${n} rows`),a}function wO(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 TO={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 EO(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=TO[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 DO=16,OO=16,kO=12,AO=`{ name, distance: [refA, refB] | position: ref, frames: [f0, f1], every }`,jO=e=>Math.round(e*1e6)/1e6,MO=e=>Math.round(e*1e4)/1e4;function NO(e,t){let n=/^(joint|bone):(.+)$/s.exec(t);return n?`${n[1]}:${sl(e,n[2]).bone??n[2]}`:t}function PO(e,t,n,r,i){let a=e.frames===void 0?[0,n]:SO(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 FO(e,t,{spec:n,sk:r,scene:i,notes:a}){let o=[],s=e=>{o.length<kO&&o.push(e)},c=e.frameCount-1,l=[],u=new Map;if(Array.isArray(t)?t.length>DO?s(`probes has ${t.length} entries; at most ${DO} per compile`):t.forEach((e,t)=>{let o=`probes[${t}]`;if(!e||typeof e!=`object`||Array.isArray(e))return s(`${o} must be ${AO}`);for(let t of Object.keys(e))Mc.includes(t)||s(`${o} has unknown field "${t}"${el(t,Mc)}; a probe is ${AO}`);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)=>su(n,s,{sk:r,scene:i},f===`distance`?`${o}.distance[${t}]`:`${o}.position`,e)).every(Boolean),h=PO(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/OO):1),v=f===`position`?CO(_,g,OO,o,a):_;l.push({name:d,kind:f,refs:p.map(e=>NO(r,e)),range:h,every:v})}):s(`probes must be an array of ${AO}`),o.length)throw Error(`MOTION_SPEC_INVALID: ${o.join(`
|
|
9
|
+
`)}${o.length>=kO?`
|
|
10
|
+
(more problems not listed)`:``}`);return l}function IO([e,t],n){let r=[];for(let i=e;i<=t;i+=n)r.push(i);return r}function LO(e,t){let n=IO(t.range,t.every).map(n=>[n,au(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:jO(r[1]),minAt:r[0],max:jO(i[1]),maxAt:i[0],mean:jO(a/n.length),first:jO(n[0][1]),last:jO(n[n.length-1][1])}}function RO(e,t){return{at:IO(t.range,t.every).map(n=>{let r=iu(e,n,t.refs[0]);return{f:n,p:r?r.map(MO):null}})}}function zO(e,t,n){return Object.fromEntries(FO(e,t,n).map(t=>[t.name,t.kind===`distance`?LO(e,t):RO(e,t)]))}var BO=.3,VO=2,HO=[`Thumb4`,`Index4`,`Middle4`,`Ring4`,`Pinky4`],UO=e=>Math.round(e*1e3)/1e3,WO=`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 GO(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,...HO.map(e=>t.P[n[`${i}Hand${e}`]]).filter(Boolean)],r[`foot_${a}`]=Object.values(Zs(e,t,i))}return r}var KO=(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 qO(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=>Sh(r.objects?.[e]))||KO(e,a,t))continue;let s=Vm(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:Bm(e,a,t),box:c,c:V(c.pos,J(c.R,[0,o.half[1],0])),r:G(o.half)})}return i}function JO(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=>Ra(e,r))),a=null;for(let o of t){if(n&&o.hand===n||Ra(r,o.c)-o.r-i>(a?a[2]:BO))continue;let t=Math.min(...e.map(e=>Ks(e,o.box)));t<=BO&&(!a||t<a[2])&&(a=[o.root,o.id,t])}return a}function YO(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,VO).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:[UO(r[0]),r[1],UO(r[2]),r[3]]}))}function XO(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=qO(t,a+n),s=GO(e,i);for(let e of Object.keys(r))r[e].push(JO(s[e],o,e.startsWith(`hand_`)?e.slice(-1):null))});let i=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,YO(t,n)]).filter(([,e])=>e.length));return Object.keys(i).length?i:null}var ZO=9.7,QO=.25,$O=.75,ek=.88,tk=.5,nk=22,rk=24,ik=Array.from({length:16},(e,t)=>9+t),ak=[`steps`,`period`,`step`,`swing`],ok=new Set([`POP`,`REACH`,`SLIDE`,`FLOAT`,`FLIP`,`KNEE`]),sk=new Map,ck=e=>Math.round(e*100)/100,lk=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)&&!ak.some(t=>e.args[t]!==void 0)&&Object.values(e.args).every(e=>!(e&&typeof e==`object`&&!Array.isArray(e))));function uk(e,t){if(t===2)return e>=QO&&e<=$O?{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>=QO&&r<=$O?{first:n,step:r}:null}function dk(e,t,n){let r=[];for(let i of ik)for(let a=2;a<=40;a++){let o=uk(e,a);if(!o)continue;let s=t+16+a*i+18,c=o.step*rk/i,l=Math.abs(Math.log(o.step*i/ZO)),u=Math.max(0,n-s)/Math.max(1,n-t);r.push({args:{steps:a,period:i,swing:Math.round(ek*i),step:ck(o.step),firstStep:ck(o.first)},end:s,v:c,late:s>n,score:l+1.5*u+Math.max(0,tk-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 fk(e,t){let{steps:n,period:r}=e.args,i=Math.round(.8*r),a=n>2&&e.args.firstStep<.62?{firstStep:.62,step:ck((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>=QO&&e.args.step<=$O)}var pk=(e,t,n)=>e.groups.filter(e=>ok.has(e.kind)&&e.last>=t&&e.first<=n).reduce((e,t)=>e+t.count,0);function mk(e,{sk:t,scene:n,trial:r}){let i=[];for(let{i:a,u:o}of lk(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(sk.has(s)){i.push(sk.get(s));continue}let c=e.use.slice(0,a).filter(e=>e.f0<o.f0),l,u=[];try{let{spec:r,used:i}=MD({...e,frames:2e4,use:c},{sk:t,scene:n,lenient:!0});l=I_(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}=dk(p,o.f0,o.args.arrive),g=t=>{let n=Math.max(t.end,...u)+1;return{schema:e.schema,fps:e.fps??rk,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=>fk(e,p))].slice(0,18);for(let e of[...x,...h.slice(0,nk-x.length)]){let t;try{t=pk(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`:``} (${ck(_.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 ${ck(p)} m (a step every ${ik[0]} frames, strides up to ${$O} 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)`};sk.size>=64&&sk.delete(sk.keys().next().value),sk.set(s,O),i.push(O)}return i}function hk(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 gk=e=>Math.round(performance.now()-e);function _k(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 vk(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return{spec:e,probes:t};let n=wb(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 yk(e,{sk:t,scene:n},r={}){let{spec:i,probes:a}=vk(e,r.probes),o=performance.now(),s={sk:t,scene:n,lenient:r.lenient===!0},c=[],l=r.checks&&RC({checks:r.checks}).checks,u=[],d=e=>{let{spec:t,used:r}=MD(RC(hk(e,u)),s),i=xO(JSON.parse(JSON.stringify(l?{...t,checks:l}:t)),n,c);return Kb(i,s),{full:i,used:r}};u=mk(i,{sk:t,scene:n,trial:e=>{let n=d(e).full;return IC(t,Ny({fps:24,...n},s),n,{explain:!1})}});let f=i?.frames===`auto`&&u.length?{...i,frames:KD(hk(i,u),s).frames}:KD(i,s),p=ID(f),m=f,h=null;p.length&&({spec:m,search:h}=UD(f,p,s,e=>d(e).full)),i?.frames===`auto`&&JD(m);let g=performance.now(),{full:_,used:v}=d(m),y=Ny({fps:24,..._},s),b=gk(g),x=performance.now(),S=y.timeMap?_k(_,y.timeMap):_,C=IC(t,y,S,{userSpec:m}),w=zd(t,y,S.checks),T=sx(y);T&&Object.assign(w,{units:`${w.units}; ${ox}`,held:T});let E=XO(t,y),D=Gx(t,y);E&&Object.assign(w,{units:`${w.units}; ${WO}`,near:E}),D&&Object.assign(w,{units:`${w.units}; ${Ux}`,wrist:D});let O=Sy(t,y);O&&Object.assign(w,{units:`${w.units}; ${hy}`,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=dO(y,{used:v,spec:_}),re=a&&zO(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:gk(x),total:gk(o)}}}var bk=`cozyclay.take.v3`;function xk(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}=no(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=xh(n),a=Sh(n),o=r||a,s=!Ch(n),c=s?new Float32Array(i*3):null,d=s?new Float32Array(i*4):null,f=o||!s||tm(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?Dm(t,n):[0,0],v=r&&Pm(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=Rm(t,e,r+u);i&&(c.set(i.pos,r*3),d.set(Ya(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:bk,fps:t.fps,frameCount:i,rig:e.model,bones:e.names.slice(),rot:o,hips:s,objects:l,placement:n,...r}}function Sk(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 Ck=`modulepreload`,wk=function(e){return`/`+e},Tk={},Ek=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=wk(t,n),t=s(t),t in Tk)return;Tk[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`:Ck,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)})},Dk=Object.freeze([`keys`,`follow`,`rail`]),Ok=Object.freeze({distance:3,height:1.6,response:.7,lead:.25,railStartMode:`head`,maxDollySpeed:4,pitchOffsetDeg:0,orbitOffsetDeg:0});function kk(e){return Array.isArray(e)?e.map(e=>({x:e.x,z:e.z})):null}function Ak(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 jk(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 Mk(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 Nk(e,t){let n=t?Mk(e.aim):null,r=t&&Number.isFinite(e.focalMm)&&e.focalMm>0?e.focalMm:null;return{...n?{aim:n}:{},...r?{focalMm:r}:{}}}function Pk(e={}){let t=e&&typeof e==`object`?e:{},n=Dk.includes(t.mode)?t.mode:`keys`,r={...Ok,...t.followCam??{}},i=kk(t.cameraRail),a=Ak(t.craneHeight)??(n===`rail`&&i?{points:[{t:0,height:r.height},{t:1,height:r.height}]}:null),o=Zn(t.dollyTiming);return{mode:n,followCam:r,cameraRail:i,railFollow:jk(t.railFollow),craneHeight:a,dollyTiming:Xn(o)?null:o,...Nk(t,i)}}function Fk(e){return Pk(e)}function Ik(e,t={}){let n=Pk(e),r=t&&typeof t==`object`?t:{};return Pk({...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 Lk(e){let t=Pk(e);return Ik(t,{mode:t.mode===`rail`?`follow`:t.mode,cameraRail:null,railFollow:null,craneHeight:null})}var Rk=[`begin`,`mark`,`rollback`,`finish`,`cancel`],zk=(e,t)=>Object.fromEntries(Rk.map(n=>[`agent.turn.${n}`,e({turnId:t})]));function Bk(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 Vk=e=>e&&{point:e.session?.savepoint()??null,affectedIds:new Set(e.affectedIds),since:e.mark&&new Set(e.mark.since),mark:e.mark};function Hk(e,t,n){return e&&t&&n?.ok&&n.authored&&(e.edits??=[]).push({...t,receiptId:n.receiptId,ids:n.affectedIds}),n}function Uk(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 Wk=new Set([`timeline`,`scene`]),Gk=/^(?:(?:object|character|shot):[A-Za-z0-9][A-Za-z0-9._:-]*|stage|timeline|scene)$/,Kk=e=>typeof e==`string`&&e.length<=140&&Gk.test(e),qk=[`cast.replace`,`cast.setCustomPoses`,`cast.showExtras`,`cast.removePose`,`objects.replace`,`shot.replace`,`ai.prepareShot`],Jk=[`shot.create`,`shot.createStill`,`shot.split`,`shot.duplicate`,`shot.remove`,`shot.reorder`,`shot.setRange`,`shot.setTimeline`],Yk=[`object.add`,`object.createKit`,`asset.import`,`character.add`],Xk=/^(character\.|characters?\b|cast\.(savePose|setLayer)$|ik\.|motion\.)/;function Zk(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 Qk=(e,t)=>e.flatMap(e=>e.op===`create`?[]:e.op===`group`?Zk([e.parentId,...e.childIds],t):e.op===`ungroup`?Zk(e.childIds,t):Zk([e.id],t));function $k(e,t={},n={},r={}){if(r.kind===`document`||/^(scene|project)\./.test(e)||e===`load_scenes`||qk.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)||Yk.includes(e))return[];if(e===`objects.batch`)return[...new Set(t.ops.flatMap(e=>$k(e.name,e.args,n)))];if(e===`objects.arrange`)return[...new Set(Qk(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(Jk.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`?Zk([t.parent,...t.children],n):e===`object.ungroup`?Zk(t.children,n):e===`object.remove`?Zk(t.ids,n):e===`object.attach`||e===`motion.keyObject`?[`character:${t.characterId}`,...Zk([t.objectId],n)]:e.startsWith(`object.`)?Zk([t.id??t.objectId],n):Xk.test(e)&&(t.characterId??t.id)?[`character:${t.characterId??t.id}`]:[`scene`]}function eA(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 tA(e,t,n){for(let r of n.values()){if(r.taskId===e)continue;let n=t.find(e=>r.keys.has(e)||Wk.has(e)||[...r.keys].some(e=>Wk.has(e)));if(n)return`${n} is held by task ${r.taskId}${r.title?` (${r.title})`:``}`}return null}var nA=(e,t)=>{throw new et(e,t)},rA=[`begin`,`requestScope`,`mark`,`rollback`,`finish`,`cancel`,`undo`],iA=32,aA=e=>[...e].slice(0,6).join(`, `)+(e.length>6?` and ${e.length-6} more`:``);function oA({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):nA(`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||nA(`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=>!Kk(e));r!==void 0&&nA(`INVALID_ARGUMENT`,`"${r}" is not a scope key: object:<id>, character:<id>, shot:<id>, stage, timeline or scene.`);let i=tA(e.taskId,t,n);i&&nA(`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): ${aA(n.skipped)}.`}]),n.skipped=null,Pn({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)&&nA(`CAPABILITY_MISSING`,`Only the owning task can control it.`)};return{get size(){return n.size},controls:(e,t)=>Object.fromEntries(rA.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.`)&&nA(`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)??nA(`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&&nA(`UNDO_CONFLICT`,`Changed since the task finished: ${aA(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&&nA(`TARGET_BUSY`,p),(n.has(i.taskId)||r.has(i.taskId))&&nA(`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)??nA(`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??nA(`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>iA;)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?$k(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=>tA(null,[e],n));return e&&nA(`SCOPE_BUSY`,`${tA(null,[e],n)}; this command waits for that task.`),null}let u=l.filter(t=>!e.keys.has(t));u.length&&nA(`SCOPE_DENIED`,`Outside this task's scope: ${aA(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));nA(`STALE_TARGET`,`${aA(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=eA(e,c);!t||s.keys.has(t)||(tA(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&&nA(`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&&nA(`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&&nA(`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 sA=(e,t)=>JSON.stringify(e)===JSON.stringify(t),cA=(e,t)=>{throw new et(e,t)},lA=(e,t,n)=>e?.then?e.then(t,n):t(e),uA=e=>e.slice(-12).map(e=>({code:`STUDIO_TOAST`,message:[...e.message].slice(0,120).join(``)})),dA=0;function fA({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=oA({ports:t,emit:e=>f(e)});function d(n,r,i){if(i.origin===`ui`)return;if(n.exposure===`ui-only`&&cA(`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(sA(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||!sA(a.args,r)||!sA(a.host,t.read().host)||a.expires<(t.now??Date.now)())&&cA(`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=Dn.TargetGuard.properties.targetId,m=e=>({type:`object`,properties:e,required:Object.keys(e),additionalProperties:!1}),h={type:`object`,properties:{},required:[],additionalProperties:!0},g={...zk(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:sA(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)&&cA(`CAPABILITY_MISSING`,`Only the owning agent turn can control this transaction.`),n===`agent.turn.begin`)return(l||r.size||u.size)&&cA(`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&&cA(`STALE_TARGET`,`The agent turn is no longer open.`);let e=l;if(n===`agent.turn.mark`||n===`agent.turn.rollback`)return x(n,Bk(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 Pn(Uk(l,a,o,c,()=>t.read()));cA(`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 Pn({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))&&cA(`UNDO_EXPIRED`,`The receipt no longer has a retained history entry.`),sA(i.host,c.host)||cA(`STALE_SCENE`,`The receipt belongs to another document.`),(e?r!==i.undo.historyEntryId:!t.canUndo(i))&&cA(`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 Pn({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||!sA(e.host,c.host))&&cA(`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=>Pn({...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&&cA(`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`&&cA(`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||!sA(m.before.host,c.host))&&cA(`STALE_TARGET`,`Transaction is no longer open in this document.`),o.origin!==m.origin&&cA(`TARGET_BUSY`,`This transaction belongs to another origin.`),m.updating&&n!==`run.cancel`&&cA(`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&&cA(`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)||!sA(m.before.host,t.read().host))&&cA(`STALE_TARGET`,`Transaction is no longer current.`)}},d=e=>{l?.(),_(m.workTimer),m.updating=!1,u.check(),s.length&&t.read().revision===c.revision&&cA(`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 Pn({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:uA(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 Pn({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,...uA(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&&cA(`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=>Pn({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},...sA(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&&!sA(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=Pn({...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`&&!sA(kn(p.host),m.host)&&cA(`STALE_SCENE`,`The live document changed.`),p.turnId&&!v&&a!==`agent.turn.begin`&&cA(`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:On(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&&cA(`STALE_SCENE`,`Authored state changed; obtain fresh intent.`),!c?.readOnly&&m.busy&&!v&&!r.has(l.txId)&&!a.startsWith(`job.`)&&cA(`TARGET_BUSY`,`Finish the current editor gesture first.`)),g[a])return lA(b(a,l,p,m),ae,oe);r.size&&cA(`TARGET_BUSY`,`Finish or cancel the open command transaction first.`),v&&c.kind===`document`&&cA(`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();sA(e.host,m.host)||cA(`STALE_TARGET`,`The open document or scene changed while the job was running.`),se&&!y&&e.domainRevisions?.[se]!==ue&&cA(`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&&cA(`STALE_TARGET`,`${ce} changed while the job was running.`)},commit(e){pe.check(),se||cA(`INVALID_ARGUMENT`,`A committing job must declare its domain.`);let t=x(se,e,ce??null);return t?.then&&cA(`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(),lA(a,e=>lA(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=Vk(v),ge=c.kind===`mutation`?x(c.undoDomain,me,l.characterId??null):{result:me(),historyEntryId:null},_e=({result:e,historyEntryId:t})=>lA(e,e=>{ne(),T?.(),T=null;let n=e?.output===void 0?ie():null;if(n)throw n;return u.record(_,Hk(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(Pn({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){dA++;try{let t=T(...e);return t?.then?t.finally(()=>{dA--}):(dA--,t)}catch(e){throw dA--,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 pA=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 mA(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)&&mA(n,t.get(e)));let n=Object.keys(e);return n.length===Object.keys(t).length&&n.every(n=>Object.hasOwn(t,n)&&mA(e[n],t[n]))}var hA=e=>({bones:e?.bones??{},rootY:e?.rootY??0}),gA=(e=[])=>e.map(({frame:e,framing:t})=>({frame:e,framing:t})),_A=e=>({...e,camera:Pk(e.camera),cameraKeys:gA(e.cameraKeys)});function vA(e,t,n){if(t===n)return null;if(e===`pose`)return mA(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`:mA(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&&!mA(hA(n.pose),hA(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 mA(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=Pk(e.camera),i=Pk(n.camera);if([`cameraRail`,`craneHeight`,`railFollow`,`dollyTiming`].some(e=>!mA(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&&!mA(t.framing,e.framing)}))return`camera_key_record`}return mA(t.map(_A),n.map(_A))?null:`shot_edit`}return null}function yA(e){let t=new Set;return(n,r,i,a)=>{if(![`craft`,`playground`].includes(n)||t.has(n))return!1;let o=vA(r,i,a);return o?(t.add(n),e(`${n}:first_edit`,{edit_kind:o,definition_version:1}),!0):!1}}var bA=Object.freeze([`read`,`camera`,`scene_write`,`prompt_authoring`,`frame_capture`,`motion_generate`,`motion_apply`,`project_io`,`other`]),xA=Object.freeze([`workflow_read`,`workflow_write`,`workflow_run`,`frame_capture`,`image_generate`,`scene_write`,`other`]),SA=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`]),CA=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`]}),wA=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([...bA,...xA]),outcome:new Set([`succeeded`,`failed`,`uncertain`,`cancelled`])}),TA=Object.freeze({source:new Set([`agent`,`manual`]),outcome:new Set([`ok`,`error`]),surface:new Set([`assets`,`agent`,`mcp`])}),EA=`cozyclay.analyticsOptOut`,DA=`cozyclay.internalQa`,OA=`cozyclay.analyticsActivation`,kA=`cozyclay.useCaseAsked`,AA=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`])}),jA=Object.freeze(Object.keys(AA).map(e=>`${e}_edit_bucket`)),MA=Object.freeze([`animation`,`film`,`game`,`ad_mv`,`personal`,`other`,`skip`]),NA=Object.freeze([`team`,`solo`,`skip`]),PA=new Set([`storyboard`,`animation`]),FA=Object.freeze([`latest`,`outdated`,`unknown`]),IA=Object.freeze([`https://cozyclay.org`,`https://www.cozyclay.org`]),LA=Object.freeze({"install:first_launch":[`heard_from`],"app:session_started":[],"app:session_ended":[`duration_bucket`,`action_count_bucket`,`scenes_touched`,...jA],"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`],...CA}),RA=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`]),zA=Object.freeze([`x`,`hn`,`reddit`,`github`,`friend`,`other`,`site`,`playground`]),BA=new Set(zA),VA=new Set([`prompt`,`text`,`url`,`path`,`file`]),HA=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`])}),UA=new Set([`unsupported_codec`,`encode_failed`,`render_failed`,`aborted`,`unknown`]),WA=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:UA}),GA=Object.freeze([`done`,`cancelled`,`failed`]),KA=10,qA=864e5,JA=Object.freeze({workflow:new Set([`aborted`,`capture_failed`,`generation_failed`,`unknown`]),agent:new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`])}),YA=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`])}),XA=/^[A-Za-z0-9_.-]{1,80}\.(?:m?js|jsx|ts|tsx)$/,ZA=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`])}),QA=null,$A=!1,ej=!1,tj=!1,nj=null,rj=!1,ij=!1,aj=0,oj=0,sj=0,cj=!1,lj=!1,uj=new Set,dj=new Map(Object.entries(AA).flatMap(([e,t])=>t.map(t=>[t,e]))),fj=1e3,pj=Object.fromEntries(Object.keys(AA).map(e=>[e,0])),mj=null,hj=-1/0,gj=10,_j=new Set,vj=!1,yj=!1,bj=new Set([`app:session_started`,`app:session_ended`,`install:first_launch`,`app:error`,`device:profile`]);function xj(){try{return globalThis.localStorage??null}catch{return null}}function Sj(e){try{return xj()?.getItem(e)??null}catch{return null}}function Cj(e,t){try{xj()?.setItem(e,t)}catch{}}function wj(e){return typeof e==`string`?e.trim().toLowerCase().replace(/[/.]+$/g,``):``}function Tj(e){return e===void 0?[...IA]:e.split(`,`).map(wj).filter(Boolean)}function Ej(e,t){let n=wj(e);return Array.isArray(t)&&t.some(e=>n===wj(e))}var Dj=e=>typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e.length<=32&&!/\s/.test(e);function Oj(e,t){let n=LA[e]??[];if(!t||typeof t!=`object`||Array.isArray(t))return{};let r={};for(let i of n)if(!(VA.has(i)||!Object.hasOwn(t,i))&&!(e===`feature:used`&&(i!==`name`||!RA.has(t[i])))&&!(e===`install:first_launch`&&(i!==`heard_from`||!BA.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(!WA[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`&&!pA.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(!HA[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(!wA.surface.has(t[i])||e.startsWith(`workflow:`)&&t[i]!==`workflow`)continue}else if(i===`node_count_bucket`&&!wA.node_count_bucket.has(t[i]))continue;else if(i===`duration_bucket`&&!wA.duration_bucket.has(t[i]))continue;else if(i===`tool_category`){if(!(e.startsWith(`agent:`)?xA:bA).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`&&!JA[e.startsWith(`agent:`)?`agent`:`workflow`].has(t[i]))continue}if(e===`app:error`){if(i===`error_file`){typeof t[i]==`string`&&XA.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(!YA[i]?.has(t[i]))continue}if(!(e===`device:profile`&&!ZA[i]?.has(t[i]))){if(e===`sculpt_run`){let e=t[i];i===`outcome`&&GA.includes(e)||i===`rounds`&&Number.isInteger(e)&&e>=0&&e<=KA?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<=qA?r[i]=Math.round(e):i===`had_target`&&typeof e==`boolean`&&(r[i]=e);continue}i===`previs_mode`&&!PA.has(t[i])||(e.startsWith(`storyboard:`)||e.startsWith(`cast:`))&&!TA[i]?.has(t[i])||e===`survey:use_case`&&(i===`use_case`&&!MA.includes(t[i])||i===`team`&&!NA.includes(t[i]))||Dj(t[i])&&(r[i]=t[i])}}}return r}Object.freeze([...RA]);function kj(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 Aj(e){return!Number.isFinite(e)||e<6e4?`lt1m`:e<3e5?`1-5m`:e<9e5?`5-15m`:e<18e5?`15-30m`:`gte30m`}function jj(e){return!Number.isFinite(e)||e<0||e<36e5?`lt1h`:e<864e5?`1-24h`:e<6048e5?`1-7d`:e<2592e6?`7-30d`:`gte30d`}function Mj(){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 Nj(e){return!Number.isFinite(e)||e<1e3?`lt1s`:e<3e3?`1-3s`:e<1e4?`3-10s`:e<3e4?`10-30s`:`gte30s`}function Pj(e){return!Number.isFinite(e)||e<=0?`unknown`:e<=4?`1-4`:e<=8?`5-8`:e<=16?`9-16`:`gte17`}function Fj(e){return!Number.isFinite(e)||e<=0?`unknown`:e<4?`lt4`:e<8?`4-7`:`gte8`}function Ij(e){return!Number.isFinite(e)||e<=0?`unknown`:e<20?`lt20`:e<40?`20-40`:e<55?`40-55`:`gte55`}function Lj(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 Rj=/((?:https?|chrome-extension|moz-extension|safari-extension|safari-web-extension):\/\/[^\s()]+?):(\d+):(\d+)/g;function zj(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 Bj(e){try{let t=new URL(e).pathname.split(`/`).pop()??``;return XA.test(t)?t:null}catch{return null}}function Vj(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`&&YA.error_type.has(t)?t:typeof DOMException<`u`&&e instanceof DOMException?`DOMException`:e instanceof Error?`other`:`non_error`}catch{return`other`}}function Hj({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:Vj(e),error_source:`unknown`},s=typeof t==`string`&&t?{url:t,line:n,col:r}:null;if(!s||zj(s.url,a)!==`app`){let t=``;try{t=typeof e?.stack==`string`?e.stack.slice(0,4e3):``}catch{t=``}let n=[...t.matchAll(Rj)].map(e=>({url:e[1],line:Number(e[2]),col:Number(e[3])}));s=n.find(e=>zj(e.url,a)===`app`)??s??n[0]??null}if(!s||(o.error_source=zj(s.url,a),o.error_source!==`app`))return o;let c=Bj(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 Uj(e,t=Date.now()){let n=dj.get(e);if(!n)return!1;let r=n===mj&&t-hj<fj;return mj=n,hj=t,r||(pj[n]+=1),e===`pose_edit`&&dM(`pose_edit`),!r}function Wj(){return Object.fromEntries(Object.entries(pj).map(([e,t])=>[`${e}_edit_bucket`,kj(t)]))}function Gj(e,t=`unknown`){try{if(e?.name===`AbortError`)return`aborted`;if(UA.has(e?.exportFailureCode))return e.exportFailureCode}catch{}return UA.has(t)?t:`unknown`}function Kj(e,t={}){let n=!1,r=null,i=NaN,a=()=>performance.now(),o=lM,s=()=>{try{return a()}catch{return NaN}},c=(e,t)=>{try{Promise.resolve(o(e,Oj(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={...Oj(`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:Nj(s()-i)};e===`failed`&&(n.failure_code=Gj(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 qj=[`$current_url`,`$initial_current_url`,`$referrer`,`$initial_referrer`],Jj=[`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 Yj(e){return typeof e==`string`?e.split(`#`)[0].split(`?`)[0]:e}function Xj(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 qj)typeof e[t]==`string`&&(e[t]=Yj(e[t]));for(let t of Jj)delete e[t],delete e[`$initial_${t}`];for(let t of Object.keys(e))t.startsWith(`$session_entry_`)&&delete e[t]}return e}function Zj(e){return e?.activationTracked!==!0}function Qj(){return tj?!0:rM()?.distribution===`npm`?rM()?.telemetryEnabled!==!0:Sj(EA)===`1`}function $j(){try{let e=xj();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 eM(e){if(rM()?.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 tM(e){let t=e===!0,n=rM()?.distribution===`npm`;tj=t;let r=await eM(!t);if(tj=!1,!r.ok)return Qj();let i=!r.enabled;if(Cj(EA,i?`1`:`0`),i&&$j(),n&&!i)return globalThis.location?.reload(),!1;if(!QA&&!i&&await cM(),!QA)return i;try{i?(ej=!1,QA.opt_out_capturing()):(QA.opt_in_capturing(),ej=$A)}catch{ej=!1}return i}function nM(){return{BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1,VITE_COZYCLAY_LIVE_PORT:`5184`}}function rM(){let e=globalThis.__COZYCLAY_RUNTIME__;return!e||typeof e!=`object`||Array.isArray(e)?null:e}function iM(e){try{let t=new URL(e);return t.protocol===`http:`&&[`127.0.0.1`,`localhost`].includes(t.hostname)}catch{return!1}}function aM({env:e=nM(),origin:t=globalThis.location?.origin??``,runtime:n=rM()}={}){return e.PROD?n?.distribution===`npm`?n.telemetryEnabled===!0?iM(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:BA.has(n.firstLaunchHeardFrom)?n.firstLaunchHeardFrom:null,installKind:[`npx`,`global`,`clone`].includes(n.installKind)?n.installKind:`npx`,originKind:`local`,internalQa:n.internalQa===!0,updateStatus:FA.includes(n.updateStatus)?n.updateStatus:`unknown`}:{kind:`disabled`,reason:`unapproved origin`}:{kind:`disabled`,reason:`opted out`}:e.VITE_POSTHOG_KEY?Ej(t,Tj(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:Sj(DA)===`1`,updateStatus:null}:{kind:`disabled`,reason:`unapproved origin`}:{kind:`disabled`,reason:`no key`}:{kind:`disabled`,reason:`not production`}}function oM(e){return{distribution:e.distribution,...e.appVersion?{app_version:e.appVersion}:{},origin_kind:e.originKind,os:Mj(),...e.installKind?{install_kind:e.installKind}:{},...e.updateStatus?{update_status:e.updateStatus}:{},internal_qa:e.internalQa}}function sM(e){let t=aM({env:e});return t.kind===`disabled`?t.reason:Qj()?`opted out`:null}async function cM(){if($A||nj)return nj;if(rM()?.distribution!==`npm`){let e=new URLSearchParams(globalThis.location?.search??``).getAll(`internal_qa`);e.length===1&&(e[0]===`1`||e[0]===`0`)&&Cj(DA,e[0])}let e=nM(),t=sM(e);if(t){ij||=(console.info(`[analytics] disabled: `+t),!0);return}nj=(async()=>{try{let t=await Ek(()=>import(`./module-MzlRiBjI.js`),[]);if(Qj())return;let n=aM({env:e});if(n.kind===`disabled`)return;QA=t.default??t,QA.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:Xj}),$A=!0,ej=!0;let r=oM(n);if(QA.register(r),globalThis.__cozyclayAnalytics={instance:QA},QA.capture(`$pageview`),aj=Date.now(),SM(n,r),hM(),xM(),n.distribution===`npm`&&(lM(`app:session_started`),n.firstLaunch)){let e=n.firstLaunchHeardFrom;lM(`install:first_launch`,e?{heard_from:e}:{})}}catch{console.info(`[analytics] initialization failed`)}})(),await nj}function lM(e,t={}){if(!(!$A||!ej||!QA))try{if(Qj())return;let n=Oj(e,t);bj.has(e)||(oj+=1,(e===`scene:created`||e===`scene:loaded`)&&(sj+=1)),QA.capture(e,n)}catch{}}function uM(e,{hadTarget:t=!1}={}){return GA.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 dM(e){return!$A||!ej||!QA||!RA.has(e)||uj.has(e)?!1:(uj.add(e),lM(`feature:used`,{name:e}),!0)}function fM(){try{return $A&&ej&&!!QA&&!Qj()}catch{return!1}}function pM(){return fM()&&Sj(kA)!==`1`}function mM(e,t){Cj(kA,`1`),lM(`survey:use_case`,{use_case:MA.includes(e)?e:`skip`,team:NA.includes(t)?t:`skip`})}function hM(){if(vj||typeof window>`u`||typeof window.addEventListener!=`function`)return;vj=!0;let e=e=>{try{let t=Hj(e),n=[t.error_kind,t.error_type,t.error_source,t.error_file,t.error_line,t.error_col].join(`|`);if(_j.has(n)||_j.size>=gj)return;_j.add(n),lM(`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 gM(){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 _M=8e3,vM=3e3,yM=6e4;function bM(){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>yM){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>=vM){e((a-1)*1e3/(r-o));return}t(s)};t(s)};setTimeout(i,_M)})}async function xM(){if(!(yj||globalThis.document===void 0||typeof globalThis.requestAnimationFrame!=`function`)){yj=!0;try{let{webgl:e,renderer:t}=gM(),n=Lj(t),r=await bM();lM(`device:profile`,{...n,webgl:e,cpu_bucket:Pj(globalThis.navigator?.hardwareConcurrency),memory_bucket:Fj(globalThis.navigator?.deviceMemory),frame_rate_bucket:Ij(r)})}catch{}}}function SM(e,t){if(lj||typeof window>`u`)return;lj=!0;let n=()=>{if(!(cj||!aj)){cj=!0;try{if(!ej||!QA||Qj()||QA.has_opted_out_capturing())return;let n={api_key:e.apiKey,event:`app:session_ended`,properties:{...t,distinct_id:QA.get_distinct_id(),duration_bucket:Aj(Date.now()-aj),action_count_bucket:kj(oj),scenes_touched:Math.min(20,sj),...Wj()}},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 CM(e){if(!(!$A||!ej||rj)){if(!Zj({activationTracked:Sj(OA)===`1`})){rj=!0;return}rj=!0,Cj(OA,`1`),lM(`activation:completed`,{activation_path:e})}}function wM(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 TM(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 EM(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 DM(e,t){return wM(t)?!e||typeof e.matches!=`function`||!(e.isContentEditable||e.matches(`[contenteditable=true]`)):!1}var OM=new Set([`mp4`,`m4v`,`mov`,`webm`,`ogv`,`mkv`]),kM=9,AM=3,jM=480,MM=.85;function NM(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 OM.has(n)}function PM(e,t){return Array.from({length:t},(n,r)=>(r+.5)*e/t)}function FM(e){let t=Math.floor(e/60);return`${t}:${(e-t*60).toFixed(1).padStart(4,`0`)}`}function IM(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 LM(e,{doc:t=globalThis.document,frames:n=kM}={}){let r=URL.createObjectURL(e),i=t.createElement(`video`);i.muted=!0,i.playsInline=!0,i.preload=`auto`;try{let a=IM(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(jM,s),u=Math.round(l*c/s),d=t.createElement(`canvas`);d.width=l*AM,d.height=u*Math.ceil(n/AM);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 PM(o,n).entries()){let n=IM(i,`seeked`);i.currentTime=t,await n;let r=e%AM*l,a=Math.floor(e/AM)*u;f.drawImage(i,r,a,l,u);let o=`${e+1} · ${FM(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`,MM)),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 RM=1600,zM=4194304,BM=.85,VM=Object.freeze([`image/png`,`image/jpeg`,`image/webp`]),HM=`Up to 4 images per message`,UM=`Attach a PNG, JPEG or WebP image, or a video`,WM=`That image or video could not be attached`,GM=[...VM,`video/*`].join(`,`),KM={png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,webp:`image/webp`};function qM(e){let t=String(e?.type??``).toLowerCase();return VM.includes(t)?t:t?null:KM[String(e?.name??``).toLowerCase().match(/\.([a-z0-9]+)$/)?.[1]]??null}function JM(e){return Array.from(e?.types??[]).includes(`Files`)}function YM(e){let t=Array.from(e?.files??[]);if(!t.length){let n=wM(e);n&&t.push(n)}let n=[],r=0;for(let e of t)qM(e)||NM(e)?n.push(e):String(e?.type??``).startsWith(`image/`)&&(r+=1);return{images:n,unsupported:r}}function XM(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 ZM(e,t,n=RM){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 QM(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 $M=32768,eN=e=>{let t=``;for(let n=0;n<e.length;n+=$M)t+=String.fromCharCode.apply(null,e.subarray(n,n+$M));return btoa(t)};async function tN(e,t){let n=new Uint8Array(await e.arrayBuffer());return`data:${t||e.type||`image/jpeg`};base64,${eN(n)}`}function nN(e,t){if(typeof OffscreenCanvas==`function`)return new OffscreenCanvas(e,t);throw Error(`this browser cannot resize images — OffscreenCanvas is unavailable`)}function rN(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 iN(e,{decode:t=globalThis.createImageBitmap,makeCanvas:n=nN,toBlob:r=rN,maxBytes:i=zM,maxDimension:a=RM,quality:o=BM}={}){if(XM(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=ZM(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 tN(await t.convertToBlob({type:`image/jpeg`,quality:o}),`image/jpeg`)}finally{s?.close?.()}}function aN(e){let t=String(e?.name??``).trim();return!t||t===`image.png`?`pasted-image.png`:t.slice(0,120)}async function oN(e,t={}){if(NM(e)){let t=await LM(e);return{dataUrl:await tN(t.blob,`image/jpeg`),name:t.name}}let{readDataUrl:n=TM,...r}=t,i=qM(e)??`image/png`,a=await n(e);return{dataUrl:await iN(a.startsWith(`data:${i};`)?a:`data:${i};${a.slice(a.indexOf(`;`)+1)}`,r),name:aN(e)}}var sN=new Set([`aborted`,`capture_failed`,`generation_failed`,`unknown`]),cN=new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`]);function lN(){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 uN(e,t,n){try{Promise.resolve(e(t,n)).catch(()=>{})}catch{}}function dN(e){try{return e()}catch{return NaN}}function fN(e,t,n=`unknown`){let r=t===`agent`?cN:sN;try{if(e?.name===`AbortError`)return`aborted`}catch{}return r.has(n)?n:`unknown`}function pN(e,{capture:t=lM,now:n=()=>performance.now(),durationBucket:r=Nj}={}){let i=lN(),a=!1,o=!1,s=dN(n),c=(e,n)=>{i&&uN(t,e,n)};c(`workflow:run_requested`,{surface:`workflow`,...wA.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=fN(t,`workflow`,o),u=e===`failed`&&l===`aborted`?`cancelled`:e,d=`lt1s`;try{let e=r(dN(n)-s);wA.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 mN=`follow the reference clip's framing and camera motion exactly`,hN=`clay previs, neutral look`,gN=`motion and blocking come from the reference; keep timing`;function _N(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 vN(e){return`${Number(e.toFixed(2))}s`}function yN(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 bN=[`front`,`front right`,`right`,`back right`,`back`,`back left`,`left`,`front left`];function xN(e){if(!Number.isFinite(e))return``;let t=(e%360+360)%360;return bN[Math.round(t/45)%8]}function SN(e){return Number.isFinite(e)?e>=50?`high`:e<=10?`low`:`level`:``}function CN(e){return Number.isFinite(e)?e>=.8?`strong`:e>=.35?`moderate`:`dim`:`moderate`}function wN(e){return e?`${[SN(e.elevationDeg),xN(e.azimuthDeg)].filter(Boolean).join(` `)||`even`} key light, ${CN(e.intensity)}`:`no key light, ambient fill`}function TN(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`}, ${vN(i)}, ${e.aspect||``}`.trimEnd(),`LENS: ${e.focalMm}mm, ${_N(e.fovDeg)} shot`,r?`CAMERA: ${mN}`:`CAMERA: ${yN(e.cameraMove)}`,`LIGHT: ${wN(e.keyLight)}`,`CAST: ${(e.cast||[]).map(e=>e.name).join(`, `)||`none`}`,`LOOK: ${a||hN}`];return n===`video`&&o.push(`MOTION: ${gN}`),o.join(`
|
|
11
|
+
`)}var EN=``;function DN(e){return`${EN}${e}`}async function ON(e,t,n){let r=await e(DN(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 kN({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 AN(e,{fetchImpl:t=globalThis.fetch?.bind(globalThis),signal:n}={}){return ON(t,`/agent/image`,{method:`POST`,body:JSON.stringify(kN(e)),signal:n})}var jN=`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 MN({meta:e,caption:t,imageDataUrl:n}){let r=typeof t==`string`?t.trim():``;return{prompt:`${jN}\n${TN(e,{target:`image`})}${r?`\n${r}`:``}`,imageDataUrl:n,quality:`auto`}}function NN(e){if(e?.code===`entitlement`)return z(`This account cannot generate images.`,`이 계정은 이미지를 생성할 수 없어요.`);if(e?.status===401||e?.code===`auth`)return z(`Sign in with ChatGPT in the Agent panel first.`,`먼저 Agent 패널에서 ChatGPT로 로그인하세요.`);let t=e?.message||z(`unknown error`,`알 수 없는 오류`);return z(`Stylize failed — ${t}`,`스타일화 실패 — ${t}`)}function PN(e,t){let n=typeof e==`string`?/^data:image\/png;base64,(.*)$/s.exec(e):null;if(!n)throw Error(z(`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(z(`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 FN=300,IN=Object.freeze([]),LN=new Map,RN=new Set,zN=new Set,BN=IN;function VN(){BN=Object.freeze([...LN].flatMap(([e,t])=>t.map(t=>({...t,key:`${e}/${t.key}`}))));for(let e of[...zN])try{e()}catch{}}function HN(e){if(e?.type===`sculpt.sketch`){let t=typeof e.callId==`string`&&e.callId?e.callId:`#${e.index}`;if(RN.has(t))return;let n=t!==`#${e.index}`&&LN.delete(`#${e.index}`),r=(Array.isArray(e.groups)?e.groups:[]).filter(e=>e&&typeof e.key==`string`&&Array.isArray(e.parts)&&e.parts.length);if(r.length)LN.set(t,r);else if(!LN.delete(t)&&!n)return;VN()}else e?.type===`tool.done`&&typeof e.callId==`string`?(RN.add(e.callId),LN.delete(e.callId)&&VN()):(e?.type===`done`||e?.type===`error`)&&UN()}function UN(){RN.clear(),LN.size&&(LN.clear(),VN())}function WN(e){return zN.add(e),()=>{zN.delete(e)}}var GN=()=>BN;function KN(e){let t=[],n=new Set;for(let r of Array.isArray(e)?e.slice(0,FN):[]){if(!r||typeof r!=`object`||n.has(r.id))continue;let{parent:e,mirror:i,...a}=r,o=Ta({version:1,parts:[a]});!o.ok||o.recipe.parts[0].op||(n.add(r.id),t.push({...o.recipe.parts[0],...typeof e==`string`&&e?{parent:e}:{},...i===!0?{mirror:!0}:{}}))}return Ma({version:1,parts:t})}var qN=140,JN=(e,t=qN)=>{let n=String(e??``).replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t-1)}…`:n},YN=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`},XN=e=>new Map((e?.actionIndex??[]).filter(e=>e?.id&&e.label).map(e=>[e.id,e.label]));function ZN(e,t){let n=[...String(e??``).matchAll(/tools\.(\w+)\(\s*\{?\s*(?:action\s*:\s*["'`]([\w.]+)["'`])?/g)].map(([,e,n])=>n?t?.get(n)??YN(n):Xe[e]??YN(e)),r=[...new Set(n)];return r.length>3?`${r.slice(0,3).join(`, `)}…`:r.join(`, `)}function QN(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]??ZN(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)??YN(r)}:{},...a?{subject:JN(a,80)}:{}}}function $N(e,t={}){return e.kind===`compose`||e.kind===`tool`?e.actionLabel?e.actionLabel:e.action?YN(e.action):e.name===`script`?z(`Script`,`스크립트`):Object.hasOwn(t,e.name)?t[e.name]:e.label||YN(e.name||`tool`):``}function eP(e,t){let n=[],r=e?.checks?.framing?.derivedSize;return r&&n.push(r),e?.geometry?.axisConsistent===!1&&n.push(z(`cameras cross the line`,`카메라가 축을 넘음`)),e?.verification?.status&&n.push(e.verification.status===`verified`?z(`motion checked`,`모션 확인`):z(`motion unverified`,`모션 미확인`)),e?.visualStatus===`attached`&&n.push(t?.visual===`contact_sheet`?z(`looked at a contact sheet`,`컨택트 시트 확인`):z(`looked at the frame`,`화면 확인`)),e?.stale&&n.push(z(`stale evidence`,`이전 상태 기준`)),n.join(` · `)}function tP(e){if(e.kind!==`tool`)return``;if(e.status===`failed`)return JN(String(e.error??e.failure?.message??z(`Failed`,`실패`)).replace(/^Error:\s*/,``));if(e.status===`cancelled`)return e.result?.status===`not_applied`?z(`not applied`,`적용 안 됨`):z(`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=z(`${e.length} call${e.length===1?``:`s`}`,`호출 ${e.length}회`);return t.ok===!1?JN(`${r} · ${t.error?.message??z(`failed`,`실패`)}${t.rollback?z(` · its edits were rolled back`,` · 편집 되돌림`):``}`):JN(n.length?`${r} · ${z(`${n.length} refused`,`${n.length}회 거부`)}: ${n[0].code??n[0].message??``}`:r)}return e.name===`verify_result`?JN(eP(t,e.args)):typeof t.summary==`string`&&t.summary?JN(t.summary.replace(/\.$/,``)):t.status===`started`?z(`started`,`시작됨`):``}function nP(e){let t=e.progress;if(!t)return``;let n=t.label??(t.action?YN(t.action):YN(t.name??`call`));return z(`${n} (call ${t.index})`,`${n} (${t.index}번째 호출)`)}function rP(e){let t=String(e??``).split(/\n+/).map(e=>e.replace(/^[#*\s-]+|\*+$/g,``).trim()).filter(Boolean),n=t.at(-1)??``;return JN(n.length<24&&t.length>1?t.at(-2):n)}function iP(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 aP=(e,t)=>e.at(-1)?.kind===`thinking`&&!e.at(-1).endedAt?[...e.slice(0,-1),{...e.at(-1),endedAt:t}]:e;function oP(e,t,n,r,i){let a=aP(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)??YN(t.action)}:{},...t.subject?{subject:JN(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 sP(e,t){let n=aP(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 cP=(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}],lP=new Set([`tool`,`thinking`,`compose`]);function uP(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=>lP.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(!(lP.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 dP(e,t,n){let r=e.steps.filter(e=>e.kind===`tool`).length,i=r?` · ${z(`${r} step${r===1?``:`s`}`,`${r}단계`)}`:``;if(e.live){let r=e.steps[0]?.startedAt;return{tone:`busy`,text:`${z(`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:`${z(`Stopped`,`중지됨`)}${i}${o}`}:a?.status===`failed`?{tone:`alert`,text:`${z(`Failed`,`실패`)}${i}${o}`}:{tone:`ok`,text:`${z(`Done`,`완료`)}${i}${o}`}}function fP(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 z(`Changed the scene`,`장면을 바꿈`);let a=r.slice(0,4).join(`, `),o=Math.max(0,r.length-4)+i;return z(`Changed ${a||`the scene`}${o>0?` and ${o} more`:``}`,`${a||`장면`}${o>0?` 외 ${o}개`:``} 변경`)}function pP(e){return e.steps.some(e=>e.result?.authored===!0||(e.result?.calls??[]).some(e=>e?.revision&&e.revision.after!==e.revision.before))?z(`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`)?z(`Stopped by you while a step was running; its result is unknown.`,`단계 실행 중에 직접 중지했어요. 그 단계의 결과는 알 수 없어요.`):z(`Stopped by you before anything changed in the scene.`,`장면이 바뀌기 전에 직접 중지했어요.`)}var mP=new Set([`pending`,`active`,`done`]),hP=12,gP=80;function _P(e){if(!Array.isArray(e)||!e.length||e.length>hP)return null;let t=e.map(e=>({text:String(e?.text??``).replace(/\s+/g,` `).trim().slice(0,gP),status:e?.status}));return t.every(e=>e.text&&mP.has(e.status))?t:null}var vP=e=>e?.type===`plan.update`||e?.name===`plan`&&[`tool.compose`,`tool.start`,`tool.progress`].includes(e?.type);function yP(e,t,n){let r=t?.type===`plan.update`?_P(t.steps):null;if(!r)return e;let i=e.findLastIndex(e=>e.kind===`user`&&!e.steered),a=e.findIndex((e,t)=>t>i&&e.kind===`plan`);return a===-1?[...e.slice(0,i+1),{kind:`plan`,id:n(),steps:r},...e.slice(i+1)]:e.map((e,t)=>t===a?{...e,steps:r}:e)}function bP(e,t){let n=t===`done`||t===`stopped`?t:`failed`;return{...e,outcome:n,steps:e.steps.map(e=>e.status===`active`?{...e,status:n===`done`?`done`:`unfinished`}:e)}}var xP=(e,t)=>e.map(e=>e.kind===`plan`&&!e.outcome?bP(e,t):e);function SP(e){let t=[];for(let n of e)(n.kind!==`tool`||n.name!==`plan`)&&((n.kind===`user`||!t.length)&&t.push([]),t.at(-1).push(n));return t.flatMap(e=>{let t=e.filter(e=>e.kind!==`plan`),n=e.findLast(e=>e.kind===`plan`),r=n?_P(n.steps):null;if(!r)return t;let i=t.some(e=>e.kind===`failure`)?`failed`:t.at(-1)?.kind===`assistant`?`done`:`stopped`,a=+(t[0]?.kind===`user`);return[...t.slice(0,a),bP({...n,steps:r},i),...t.slice(a)]})}var CP=`cozyclay.workflow.agentPanel.width`,wP=1100,TP=`cozyclay.agent.session.studio`,EP=[`signed-out`,`signing-in`,`no-entitlement`,`ready`,`streaming`,`rate-limited`,`error`];function DP(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 OP={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`},kP=new Set([`installed`,`failed`,`cancelled`,`stale_target`,`stale_environment`]),AP=e=>kP.has(e),jP=e=>e===`installed`?`ok`:e===`review_required`?`warn`:AP(e)?`alert`:`busy`,MP=e=>Number.isFinite(e)?`${Math.round(e*100)}%`:``;function NP(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?fP(e?.affectedIds??[],t):`Applied to ${e?.affectedIds?.join(`, `)||`the scene`}`}function PP(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 FP=[`Block a two-shot conversation in this scene`,`Render this frame as a storyboard panel`,`Suggest a camera move for the current shot`],IP=[z(`Block a two-shot`,`투샷 블로킹`),z(`Frame the selected character`,`선택한 캐릭터 구도 잡기`),z(`Light the set warmer`,`세트 조명 더 따뜻하게`)],LP=`Image generation uses about 3-5x a normal turn`,RP={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`},zP={inspect_studio:z(`Read the scene`,`장면 읽기`),operate_studio:z(`Selection and view`,`선택과 뷰`),arrange_objects:z(`Arrange objects`,`오브젝트 배치`),arrange_characters:z(`Arrange characters`,`캐릭터 배치`),patch_elements:z(`Edit properties`,`속성 편집`),frame_shot:z(`Frame the shot`,`샷 구도 잡기`),generate_motion:z(`Generate motion`,`모션 생성`),verify_result:z(`Verify the result`,`결과 검증`),undo_edit:z(`Undo an edit`,`편집 되돌리기`),run_action:z(`Run an editor action`,`편집기 동작 실행`)},BP=Object.freeze({workflow:Object.freeze({toolLabels:RP,toolBadge:`Canvas`,suggestions:FP,imageHint:LP,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:zP,toolBadge:z(`Scene`,`장면`),suggestions:IP,imageHint:null,imageEntitlement:!1,steer:!1,history:!0,persistWidth:!1,emptyTitle:z(`Direct the scene`,`장면을 연출하세요`),emptyHint:e=>z(`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:z(`Ask the agent to block, frame or animate…`,`블로킹·구도·모션을 요청하세요…`)})});function VP(e){return Object.hasOwn(BP,e)?BP[e]:BP.workflow}function HP(e){let t=Number(e);return Number.isFinite(t)?Math.min(560,Math.max(300,Math.round(t))):360}function UP(e=globalThis.localStorage){try{let t=e?.getItem(CP);return t==null||t===``?360:HP(t)}catch{return 360}}function WP(e,t=globalThis.localStorage){try{t?.setItem(CP,String(HP(e)))}catch{}}var GP=`cozyclay.agent.model`;function KP(e=globalThis.localStorage){try{let t=e?.getItem(GP);return typeof t==`string`&&t?t:null}catch{return null}}function qP(e,t=globalThis.localStorage){try{typeof e==`string`&&e&&t?.setItem(GP,e)}catch{}}function JP(e,t=KP()){let n=Array.isArray(e)?e:[];return n.some(e=>e?.id===t)?t:n[0]?.id??``}function YP(e,t){if(!e.length)return!0;let n=e.find(e=>e.models?.some(e=>e.key===t));return!n||n.signedIn}function XP(e,t,n){return n&&t.some(e=>e.id===n)&&YP(e,n)?n:JP(t.filter(t=>YP(e,t.id)))}function ZP(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 QP(e){let t=String(e??``);return t.slice(t.indexOf(`/`)+1)}function $P(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 eF={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 tF(e){if(e?.label)return e.label;let t=eF[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 nF={STEER_UNSUPPORTED:`This surface cannot steer a running turn.`,NO_ACTIVE_TURN:`That turn already ended — send it as a new message.`},rF=/^(TARGET_NOT_READY|CAPABILITY_MISSING|CONFIRMATION_REQUIRED):/;function iF(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?[z(`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?[z(`Also check:`,`추가 확인:`),...i.map(a)]:[]].join(`
|
|
12
|
+
`):i.length?[z(`Supervisor review — please address:`,`감독 검토 — 다음을 고쳐 주세요:`),...i.map(a)].join(`
|
|
13
|
+
`):null}var aF={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.`},oF=`Ready`,sF={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 cF(e){if(!e)return`unknown error`;let t=sF[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 lF(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 uF=(e,t,n,r=``)=>({phase:e,kind:`live`,tone:`busy`,text:`${t} · ${lF(n)}`,ticking:!0,...r?{detail:r}:{}});function dF(e,{now:t=Date.now(),toolLabel:n=tF}={}){let r=e?.items??[],i=r.find(e=>e.kind===`image`&&e.apply?.status===`applying`);if(i)return uF(`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`&&!AP(e.state));if(a){let e=MP(a.progress);return uF(`job`,`${OP[a.state]||a.state} motion${e?` ${e}`:``}`,i)}let o=r.findLast(e=>e.kind===`tool`&&e.status===`running`);if(o)return uF(`tool`,`Running ${n(o)}…`,i,o.progress?nP(o):o.subject);let s=r.at(-1);return s?.kind===`compose`?uF(`compose`,`Preparing ${n(s)}…`,i,s.subject):s?.kind===`thinking`?uF(`thinking`,`Thinking…`,i,rP(s.text)):s?.kind===`assistant`?uF(`reply`,`Writing the reply…`,i):s?.kind===`user`?uF(`sending`,i<2e3?`Sending…`:`Waiting for the model…`,i):uF(`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: ${cF(a.failure)}`,ticking:!0}:{phase:`done`,kind:`terminal`,tone:`ok`,text:`Done · ${lF(a.durationMs)}`,ticking:!0}:{phase:`idle`,kind:`idle`,tone:``,text:oF,ticking:!1}}function fF(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 pF=e=>typeof e==`string`&&/^[a-f0-9]{32}$/.test(e),mF=new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`]),hF=(e,t)=>e&&typeof e==`object`&&!Array.isArray(e)&&Object.keys(e).length===t.length&&t.every(t=>Object.hasOwn(e,t)),gF=(e,t)=>{try{return e()}catch{return t}},_F=e=>gF(()=>e?.status===401||e?.code===`auth`?`auth`:e?.status===429||e?.code===`rate_limit`?`rate_limited`:`upstream`,`upstream`),vF=new Set([`auth`,`entitlement`,`rate_limit`,`overloaded`,`upstream`]);async function yF(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:vF.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 bF({surface:e,capture:t,now:n,correlationId:r=null}){let i=gF(()=>{let e=new Uint8Array(16);return globalThis.crypto.getRandomValues(e),[...e].map(e=>e.toString(16).padStart(2,`0`)).join(``)},null),a=()=>gF(()=>{let e=n();return Number.isFinite(e)?e:NaN},NaN),o=r??i,s=a(),c=gF(()=>[`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:Nj(a()-t.startedAt)});d.clear(),p(`agent:turn_${e}`,{turn_id:i,duration_bucket:Nj(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`,mF.has(e)?e:`upstream`),frame(e){try{if(!i||l)return;if(e.type===`execution_tool_started`){if(!hF(e,[`type`,`turn_id`,`telemetry_id`,`tool_category`])||e.turn_id!==o||!pF(e.telemetry_id)||!xA.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(!hF(e,[`type`,`event`,`props`,`telemetry_id`])||!pF(e.telemetry_id)||!hF(n,[`turn_id`,`tool_category`,`outcome`,`duration_bucket`])||!xA.includes(n.tool_category)||![`succeeded`,`failed`,`cancelled`].includes(n.outcome)||!wA.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(!hF(e,[`type`,`event`,`props`]))return;if(t===`agent:result_applied`){!u&&hF(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(!hF(n,[`turn_id`,`duration_bucket`,...s?[`failure_code`]:[]])||!wA.duration_bucket.has(n.duration_bucket)||s&&(r===`succeeded`||!mF.has(n.failure_code)))return;m(r,r===`cancelled`?`aborted`:n.failure_code||`unknown`)}catch{}}}}var xF=3;function SF(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 CF=e=>!Number.isFinite(e?.status)||[404,502,503].includes(e.status);function wF({fetchImpl:e=globalThis.fetch?.bind(globalThis),surface:t,capture:n=lM,now:r=()=>performance.now()}={}){let i=new Map,a=(t,n)=>ON(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 AN(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(DN(`/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=bF({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=_F(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=fF(n);n=a.tail;for(let e of a.events)T(e)}for(let e of fF(`${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(DN(_&&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(_F(t)),o({type:`error`,...await yF(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<xF;t+=1){let t;try{t=await e(DN(`/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||_F(e)),e}finally{s?.removeEventListener(`abort`,b),i.get(c)===y&&i.delete(c)}}}}function TF(e=globalThis.location?.search||``){let t=new URLSearchParams(e);if(t.get(`agent`)!==`mock`)return null;let n=t.get(`state`);return{state:EP.includes(n)?n:`ready`,speed:Number(t.get(`speed`))||1}}var EF={signedIn:!0,email:`director@cozyclay.org`,plan:`Plus`,accountId:`acct_mock_126`,expiresAt:null},DF=[{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`}}],OF={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:[]},kF=[{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:OF.receiptId}}},{delay:60,event:{type:`receipt`,receipt:OF}},{delay:40,event:{type:`done`}}],AF=[[`openai-codex`,`ChatGPT (OpenAI Codex)`],[`anthropic`,`Anthropic`],[`openai`,`OpenAI`],[`google`,`Google Gemini`],[`openrouter`,`OpenRouter`],[`cliproxy`,`CLIProxyAPI`]],jF=`google`,MF={"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`}]},NF={id:`gpt-6-live-preview`,label:`gpt-6 live preview`,efforts:[`none`,`low`,`medium`,`high`],defaultEffort:`high`},PF=8,FF=`cozyclay.mock.agent.status-calls`,IF=`cozyclay.mock.agent.model-calls`,LF=e=>{try{globalThis.localStorage?.setItem(e,String(Number(globalThis.localStorage.getItem(e)||0)+1))}catch{}};function RF(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=()=>AF.map(([e,t])=>{let n=e===`openai-codex`?o===`in`?`chatgpt`:null:e===jF?`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(){LF(FF);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`?{...EF,plan:`Free`,entitlements:{image:!1},providersConfigured:e}:{...EF,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(){LF(IF);let e=s().map(e=>{let t=MF[e.id]??[],n=e.id===`openai-codex`&&o===`in`?[...t,NF]: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<PF)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:aF.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:aF.upstream}),d({type:`done`}),c=null;return}for(let e of n?kF:DF){if(a?.aborted||(await i(e.delay),a?.aborted))break;d(e.event)}c=null,await i(240),a?.aborted&&d({type:`done`})}}}function zF(e={}){let t=e.mockConfig===void 0?TF():e.mockConfig;return t?RF({surface:e.surface,...t}):wF(e)}function BF(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 VF(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 HF({transport:e,surface:t=`workflow`,buildContext:n=null,requestImageAction:r=null,onAuthLost:i=null,onReceipt:a=null,newId:o=DP,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=Pn(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&&!AP(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:NP(t,c?gF(()=>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:rF.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(vP(e)){y(t=>yP(t,e,o));return}if(e?.type===`tool.start`){y(t=>sP(t,{kind:`tool`,id:e.callId||o(),callId:e.callId,name:e.name,label:e.label,args:e.args,status:`running`,startedAt:s(),...QN(e.name,e.args,g)}));return}if(e?.type===`thinking.delta`){y(t=>iP(t,String(e.text??``),s(),o));return}if(e?.type===`tool.compose`){y(t=>oP(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`?SF(e.message):e.message||aF[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||aF.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??VF)(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}=QM(_.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=XN(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=>{HN(e),E(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,UN(),!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:xP(cP(_.items,t,o),t.status)}),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:nF.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:nF[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`&&!AP(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=BF(e);n&&(b(e=>e.kind===`job`&&e.jobId===t.jobId&&!AP(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=SP((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}}}]:e?.kind===`plan`?[{kind:`plan`,id:o(),steps:e.steps}]:[]})),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 UF=`cozyclay.agent.tasks`;function WF(e=globalThis.localStorage){try{return e?.getItem(UF)===`on`}catch{return!1}}function GF(e,t=globalThis.localStorage){try{t?.setItem(UF,e?`on`:`off`)}catch{}}var KF={queued:z(`Queued`,`대기열`),waiting:z(`Waiting for scope`,`영역 대기`),starting:z(`Starting`,`시작 중`),running:z(`Running`,`작업 중`),paused:z(`Paused: Studio lost`,`일시정지: Studio 연결 끊김`),done:z(`Done`,`완료`),failed:z(`Failed`,`실패`),cancelled:z(`Cancelled`,`취소됨`)},qF=new Set([`queued`,`waiting`,`starting`,`running`,`paused`]),JF=()=>({order:[],tasks:{},after:0});function YF(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,z(`The scene changed during a reload: ${t.keys.join(`, `)}`,`새로고침 중에 장면이 바뀜: ${t.keys.join(`, `)}`));if(t.type===`task.userEdit`)return i(t.taskId,z(`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 XF(e,t=[]){return t.reduce((e,t)=>e.tasks[t.taskId]?e:YF(e,{type:`task.seed`,...t}),e)}function ZF(e,t=e=>e.name){return e?.type===`tool.start`?t(e):e?.type===`error`?z(`Error: ${e.message??e.code}`,`오류: ${e.message??e.code}`):null}function QF(e){let t=/(?:waits for|held by) task \S+ \((.+)\)/.exec(String(e??``))?.[1];return t?z(`Starts after "${t}"`,`'${t}' 끝나면 시작`):/scope is held/.test(String(e??``))?z(`Starts when another task frees its part`,`다른 작업이 끝나면 시작`):e??``}function $F(e){return e.status===`running`?e.progress||z(`Working…`,`작업 중…`):e.status===`done`?e.undone?z(`Undone`,`되돌림`):String(e.summary?.reply??``).split(/(?<=[.!?。])\s/)[0]||KF.done:e.reason?QF(e.reason):KF[e.status]??e.status}var eI={timeline:z(`timeline`,`타임라인`),stage:z(`stage`,`무대`),scene:z(`scene`,`장면`),object:z(`object`,`오브젝트`),character:z(`character`,`캐릭터`),shot:z(`shot`,`샷`)},tI=e=>eI[String(e).split(`:`)[0]]??String(e);function nI(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`:qF.has(r.status)?`waiting`:`done`].push(r)}return t}var rI=e=>(e??[]).filter(e=>e.kind===`tool`&&e.name===`dispatch_task`).map(e=>e.result?.taskId??e.result?.duplicateOf).filter(Boolean);function iI(){let e={board:JF(),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 aI=iI(),oI=e=>Number.isFinite(e?.cost)&&e.cost>0?`$${e.cost.toFixed(2)}`:``;function sI(e,t){let n=e=>(e??[]).filter(e=>e?.taskId===t).length;return{waiting:n(e?.waiting),running:n(e?.running)}}function cI(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 lI({fetchImpl:e=globalThis.fetch?.bind(globalThis),url:t=DN}={}){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=fF(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{UN as $,Sc as $n,nr as $r,vk as $t,MP as A,Ee as Ai,xh as An,Ma as Ar,cM as At,VF as B,g as Bi,hl as Bn,Zi as Br,dM as Bt,CF as C,kn as Ci,JC as Cn,K as Cr,CA as Ct,wF as D,Te as Di,jC as Dn,H as Dr,jj as Dt,zF as E,ae as Ei,NC as En,U as Er,Nj as Et,YP as F,k as Fi,au as Fn,na as Fr,tM as Ft,iF as G,o as Gi,Vc as Gn,wi as Gr,Pk as Gt,QP as H,c as Hi,sl as Hn,Gi as Hr,vA as Ht,XP as I,l as Ii,iu as In,oa as Ir,pM as It,tP as J,Bc as Jn,Nr as Jr,Ik as Jt,nP as K,n as Ki,zc as Kn,ai as Kr,Nk as Kt,VP as L,u as Li,El as Ln,ua as Lr,Kj as Lt,lF as M,y as Mi,wh as Mn,Ea as Mr,mM as Mt,AP as N,ee as Ni,zm as Nn,Fa as Nr,Oj as Nt,dF as O,Ce as Oi,sC as On,Ia as Or,Gj as Ot,jP as P,te as Pi,su as Pn,ia as Pr,uM as Pt,uP as Q,Kc as Qn,Yn as Qr,yk as Qt,KP as R,h as Ri,Cl as Rn,la as Rr,lM as Rt,TP as S,jn as Si,XC as Sn,q as Sr,SA as St,HF as T,_e as Ti,kC as Tn,X as Tr,kj as Tt,qP as U,i as Ui,Jc as Un,yi as Ur,fA as Ut,ZP as V,v as Vi,gl as Vn,Li as Vr,yA as Vt,WP as W,a as Wi,qc as Wn,Ci as Wr,Fk as Wt,pP as X,Yc as Xn,Zn as Xr,xk as Xt,dP as Y,Ic as Yn,Vn as Yr,Ek as Yt,rP as Z,el as Zn,Qn as Zr,Sk as Zt,QF as _,An as _i,qC as _n,V as _r,JM as _t,oI as a,z as ai,MD as an,bc as ar,AN as at,aF as b,Pn as bi,ew as bn,W as br,wM as bt,JF as c,Je as ci,ZC as cn,Cc as cr,PN as ct,YF as d,Qe as di,cw as dn,xc as dr,GM as dt,rr as ei,wO as en,Ac as er,HN as et,cI as f,Ye as fi,KC as fn,Oc as fr,WM as ft,$F as g,nt as gi,uw as gn,Y as gr,oN as gt,GF as h,Dn as hi,aw as hn,ro as hr,YM as ht,sI as i,Rn as ii,ED as in,jc as ir,MN as it,$P as j,b as ji,Sh as jn,Ta as jr,Uj as jt,PP as k,we as ki,Xv as kn,_a as kr,Qj as kt,ZF as l,qe as li,lw as ln,Nc as lr,TN as lt,XF as m,et as mi,fw as mn,Uo as mr,UM as mt,KF as n,er as ni,ZD as nn,Pc as nr,KN as nt,lI as o,zn as oi,vw as on,Tc as or,ON as ot,tI as p,Wt as pi,tw as pn,ds as pr,HM as pt,$N as q,Rc as qn,ei as qr,Lk as qt,nI as r,Ln as ri,XD as rn,wc as rr,WN as rt,rI as s,Bn as si,$C as sn,Mc as sr,NN as st,qF as t,Xn as ti,EO as tn,kc as tr,GN as tt,WF as u,Rt as ui,sw as un,yc as ur,pN as ut,aI as v,It as vi,ow as vn,J as vr,DM as vt,HP as w,On as wi,YC as wn,Ya as wr,fM as wt,OP as x,Nn as xi,pw as xn,Xa as xr,EM as xt,wP as y,tt as yi,dw as yn,La as yr,TM as yt,UP as z,_ as zi,yl as zn,da as zr,CM as zt};
|