cozyclay 3.1.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/bin/agent/agent-routes.mjs +4 -4
  3. package/bin/agent/main-agent.mjs +21 -7
  4. package/bin/agent/main-prompt.mjs +7 -6
  5. package/bin/agent/script-tool.mjs +2 -1
  6. package/bin/agent/studio-prompt.mjs +1 -1
  7. package/bin/agent/studio-rebase.mjs +5 -4
  8. package/bin/agent/studio-task-routes.mjs +1 -1
  9. package/bin/agent/studio-tasks.mjs +116 -25
  10. package/bin/agent/studio-tools.mjs +3 -2
  11. package/bin/cozyclay.mjs +4 -2
  12. package/bin/live-endpoint.mjs +2 -0
  13. package/dist/app/index.html +6 -6
  14. package/dist/assets/TaskBoard-GR8xZm5c.js +1 -0
  15. package/dist/assets/{app-BlwOpest.css → app-Bhe0TpGz.css} +1 -1
  16. package/dist/assets/app-C4QTcDcb.js +5144 -0
  17. package/dist/assets/compile-worker-oy_P9HHh.js +6 -0
  18. package/dist/assets/motion3-compile-dgGhrvPK.js +1 -0
  19. package/dist/assets/scene-asset-sync-BEjjhNEo.css +1 -0
  20. package/dist/assets/scene-asset-sync-qoxcdrhj.js +13 -0
  21. package/dist/assets/task-board-BqReHzOi.js +15 -0
  22. package/dist/assets/workflow-C87p6E1E.js +179 -0
  23. package/dist/cozyclay-package.json +1 -1
  24. package/dist/index.html +1 -1
  25. package/dist/sitemap.xml +1 -1
  26. package/dist/workflow/index.html +4 -4
  27. package/mcp/README.md +1 -1
  28. package/mcp/live-hub.mjs +5 -3
  29. package/mcp/tool-handlers.mjs +5 -5
  30. package/package.json +1 -1
  31. package/src/App.jsx +42 -64
  32. package/src/bus-task-scopes.js +59 -11
  33. package/src/bus-task-targets.js +35 -9
  34. package/src/bus-tasks.js +23 -10
  35. package/src/command-bus.js +7 -4
  36. package/src/commands/ai.js +1 -1
  37. package/src/commands/export.js +1 -1
  38. package/src/commands/motion3.js +27 -7
  39. package/src/export-workspace.js +244 -0
  40. package/src/keyframe-pack.js +5 -1
  41. package/src/live-control.js +14 -7
  42. package/src/motion3/compile-job.js +15 -3
  43. package/src/motion3/compiler/channels.js +74 -24
  44. package/src/motion3/compiler/compile.js +2 -1
  45. package/src/motion3/compiler/idle.js +2 -0
  46. package/src/motion3/compiler/overlap.js +180 -0
  47. package/src/motion3/compiler/pose.js +6 -4
  48. package/src/motion3/compiler/validate-common.js +1 -0
  49. package/src/motion3/compiler/validate-parts.js +5 -1
  50. package/src/motion3/compiler/validate.js +30 -10
  51. package/src/motion3/correct.js +236 -0
  52. package/src/motion3/docs.js +8 -6
  53. package/src/motion3/face-lean.js +31 -0
  54. package/src/motion3/fix/index.js +5 -1
  55. package/src/motion3/fix/reach-body.js +172 -0
  56. package/src/motion3/hint-check.js +44 -0
  57. package/src/motion3/json-patch.js +120 -12
  58. package/src/motion3/lenient.js +46 -4
  59. package/src/motion3/object-keys.js +17 -5
  60. package/src/motion3/pipeline.js +46 -9
  61. package/src/motion3/qa/arm-checks.js +96 -0
  62. package/src/motion3/qa/asked.js +113 -0
  63. package/src/motion3/qa/goals.js +37 -8
  64. package/src/motion3/qa/hints-goal.js +6 -5
  65. package/src/motion3/qa/index.js +5 -2
  66. package/src/motion3/qa/key-checks.js +4 -3
  67. package/src/motion3/qa/motion-life.js +243 -0
  68. package/src/motion3/qa/spec-checks.js +15 -9
  69. package/src/motion3/qa/verdict.js +50 -0
  70. package/src/motion3/refs.js +38 -14
  71. package/src/motion3/repair-watch.js +132 -0
  72. package/src/motion3/repair.js +52 -19
  73. package/src/motion3/report.js +50 -9
  74. package/src/motion3/schema/topics.js +6 -4
  75. package/src/motion3/schema/types.js +1 -1
  76. package/src/motion3/skills/basic.js +15 -8
  77. package/src/motion3/skills/index.js +52 -18
  78. package/src/motion3/skills/info.js +1 -1
  79. package/src/motion3/skills/stance.js +6 -0
  80. package/src/motion3/skills/walk-fit.js +170 -0
  81. package/src/panels/PoseImagePanel.jsx +3 -2
  82. package/src/panels/SculptPanel.jsx +2 -2
  83. package/src/result-modal.jsx +3 -3
  84. package/src/shell/ExportFolderPreference.jsx +103 -0
  85. package/src/shell/PreferencesDialog.jsx +3 -166
  86. package/src/shell/StatusBar.jsx +1 -1
  87. package/src/shell/preference-controls.jsx +114 -0
  88. package/src/shell/preference-pages.jsx +72 -0
  89. package/src/shell/preferences.css +46 -0
  90. package/src/shot-prompt.js +29 -9
  91. package/src/studio-actions.js +2 -2
  92. package/src/studio-agent-motion.js +19 -9
  93. package/src/studio-agent-protocol.js +1 -1
  94. package/src/studio-app-binding.js +3 -2
  95. package/src/workflow/AgentPanel.jsx +2 -2
  96. package/src/workflow/CozySceneNode.jsx +1 -1
  97. package/src/workflow/WorkflowBuilder.jsx +2 -2
  98. package/src/workflow/keyframe-pack-request.js +3 -10
  99. package/src/workflow/task-board.css +1 -1
  100. package/src/workflow/task-board.js +7 -5
  101. package/tools/loc-baseline.json +1 -2
  102. package/tools/run-tests.mjs +5 -5
  103. package/dist/assets/TaskBoard-ngdqiu7u.js +0 -1
  104. package/dist/assets/app-DmR7jBkz.js +0 -5144
  105. package/dist/assets/compile-worker-D0pKioa0.js +0 -5
  106. package/dist/assets/motion3-compile-BB3_1-EB.js +0 -1
  107. package/dist/assets/scene-asset-sync-CBx7XRti.css +0 -1
  108. package/dist/assets/scene-asset-sync-Cgdtr1Yw.js +0 -13
  109. package/dist/assets/task-board-ErQvfoaz.js +0 -14
  110. package/dist/assets/workflow-zQM-EKW1.js +0 -179
@@ -0,0 +1,15 @@
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 A(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function te(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 ne(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,ne(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+A(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(ee,`$&/`)+`/`),ne(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+A(a,u),c+=ne(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+A(a,u++),c+=ne(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return ne(te(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 re(e,t,n){if(e==null)return e;var r=[],i=0;return ne(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function ie(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 ae=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)},oe={map:re,forEach:function(e,t,n){re(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return re(e,function(){t++}),t},toArray:function(e){return re(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=oe,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:ie}},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,ae)}catch(e){ae(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 A(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 te=(e,t)=>({type:`number`,minimum:e,maximum:t}),ne=([e,t])=>({type:`object`,properties:{x:te(e,t),y:te(e,t),z:te(e,t)},required:[],additionalProperties:!1}),re=Object.freeze({type:`object`,properties:{preset:{type:`string`,enum:[...w]},...Object.fromEntries(Object.entries(T).map(([e,[t,n]])=>[e,te(t,n)])),...Object.fromEntries(Object.entries(E).map(([e,t])=>[e,ne(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}),ie=`text`,ae=[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],oe=Object.freeze({resolution:1e3,ascent:1090,descent:333}),se=1.5,ce=1.25,le=.8,ue=.005,de={size:[.02,10],depth:[0,2]},fe=200,pe=8,me=[`left`,`center`,`right`],he=Object.freeze({value:`Text`,size:.3,depth:0,align:`center`}),ge={kind:ie,label:`Text`,group:`Text`,footprint:{width:1,depth:ue},height:.3,color:l},_e=Object.freeze({type:`object`,properties:{value:{type:`string`,minLength:1,maxLength:fe},size:{type:`number`,minimum:de.size[0],maximum:de.size[1]},depth:{type:`number`,minimum:de.depth[0],maximum:de.depth[1]},align:{type:`string`,enum:me}},required:[],additionalProperties:!1}),ve=([e,t],n,r)=>{let i=Number(n);return Number.isFinite(i)?Math.min(t,Math.max(e,i)):r};function ye(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,pe):[]).join(`
4
+ `)].slice(0,fe).join(``);return{value:n.trim()?n:he.value,size:ve(de.size,t.size,he.size),depth:ve(de.depth,t.depth,he.depth),align:me.includes(t.align)?t.align:he.align}}var be=e=>e>=4352&&e<=4607||e>=11904&&e<=42191||e>=44032&&e<=55215||e>=63744&&e<=64255||e>=65280&&e<=65519;function xe(e){let t=e.codePointAt(0);return t>=32&&t<=126?ae[t-32]/oe.resolution:be(t)?ce:le}function Se(e){return e.depth>0&&[...e.value].every(e=>e===`
5
+ `||e.codePointAt(0)>=32&&e.codePointAt(0)<=126)}function Ce(e){let{size:t,align:n}=e,r=e.value.split(`
6
+ `),i=r.map(e=>[...e].reduce((e,t)=>e+xe(t),0)*t),a=Math.max(...i,t*.2),o=oe.descent/oe.resolution*t;return{width:a,height:(r.length-1)*se*t+(oe.ascent+oe.descent)/oe.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)*se*t}))}}function we(e){if(e?.renderer!==`text`)return{};let t=ye(e.text),{width:n,height:r}=Ce(t),i=e=>Number(e.toFixed(4));return{text:t,footprint:{width:i(n),depth:i(Math.max(t.depth,ue))},height:i(r),supportY:i(r)}}function Te(e,t){if(e?.renderer!==`text`||t?.text===void 0||!t.text||typeof t.text!=`object`)return{};let n=we({renderer:ie,text:{...e.text,...t.text}});return JSON.stringify(n.text)===JSON.stringify(e.text)?{}:n}var Ee=24,De=40,Oe=e=>{let t=JSON.stringify(e)??String(e);return t.length>De?`${t.slice(0,37)}...`:t},ke=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}`,Ae=e=>e.length>Ee?`${e.slice(0,Ee).join(`, `)}, ... (${e.length} in all)`:e.join(`, `),je=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}`,Me=(e,t,n)=>`${e}: expected ${je(t)}, got ${Object.hasOwn(t,`const`)?Oe(n):ke(n)}.`,Ne=(e,t,n)=>{let r=Object.keys(t.properties);return`${e} has unknown field ${Oe(n)}; ${r.length?`allowed: ${Ae(r)}`:`it takes no fields`}.`},Pe=(e,t)=>`${e}: missing required field "${t}".`;function Fe(e,t,n){if(!Array.isArray(n))return Me(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 Ie=(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<=De?r:`one item`} appears twice.`};function Le(e,t,n){if(typeof n!=`string`)return Me(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}: ${Oe(n)} does not match ${t.pattern}.`}var Re=(e,t,n)=>`${e}: ${Oe(n)} is not one of: ${Ae(t.enum)}.`;function ze(e,t,n){return typeof n!=`number`||!Number.isFinite(n)?Me(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 Be=e=>e.oneOf??e.anyOf?(e.oneOf??e.anyOf).every(Be):e.type!==`object`&&e.type!==`array`,Ve=e=>[e.minimum,e.maximum].some(e=>e!==void 0)?` within [${[e.minimum??`-inf`,e.maximum??`inf`].join(`, `)}]`:``,He=e=>e.oneOf??e.anyOf?(e.oneOf??e.anyOf).flatMap(He):Object.hasOwn(e,`const`)?[JSON.stringify(e.const)]:e.enum?e.enum.map(e=>JSON.stringify(e)):e.type===`boolean`?[`true`,`false`]:[`${je(e)}${e.type===`number`||e.type===`integer`?Ve(e):``}`];function Ue(e,t,n){if(!t.every(({error:t})=>t.details?.path===e)||typeof n==`object`&&n&&!t.every(({branch:e})=>Be(e)))return null;let r=[...new Set(t.flatMap(({branch:e})=>He(e)))],i=r.length>Ee?[...r.slice(0,Ee),`... (${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?ke(n):Oe(n)}.`}var We=[`storyboard`,`animation`],Ge=[`stand`,`sit`,`lie`],Ke=65536,qe=Object.freeze({entities:24,entityIndex:400,shots:8,assets:48,recentReceipts:3,jobs:8}),Je=Object.freeze([`inspect_studio`,`run_action`,`verify_result`]);Object.freeze([`operate_studio`,`arrange_objects`,`arrange_characters`,`patch_elements`,`frame_shot`,`undo_edit`]);var Ye=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`}),Xe=Object.freeze(Object.keys(Ye)),Ze=Object.freeze([`character`,`object`,`shot`,`stage`]),Qe=tt({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`]}),$e=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}:{}}}},et=e=>new TextEncoder().encode(e).byteLength;function tt(e){if(e&&typeof e==`object`&&!Object.isFrozen(e)){for(let t of Object.values(e))tt(t);Object.freeze(e)}return e}var j=(e,t,n=`$`,r={})=>{throw new $e(e,t,{path:n,...r})},nt=e=>typeof e==`object`&&!!e&&!Array.isArray(e),rt=(e=120)=>({type:`string`,minLength:1,maxLength:e}),M=(e,t)=>({type:`number`,...e===void 0?{}:{minimum:e},...t===void 0?{}:{maximum:t}}),N=(e=0,t=2**53-1)=>({...M(e,t),type:`integer`}),P={type:`boolean`},F=e=>({const:e}),I=e=>({type:`string`,enum:e}),it=e=>({oneOf:[e,{type:`null`}]}),L=(e,t,n=0,r=!1)=>({type:`array`,items:e,minItems:n,maxItems:t,...r?{uniqueItems:r}:{}}),R=(e,t={})=>({type:`object`,properties:{...e,...t},required:Object.keys(e),additionalProperties:!1}),at=(...e)=>({oneOf:e}),ot={type:`object`,properties:{},required:[],additionalProperties:!0},z={...rt(),pattern:`^[A-Za-z0-9][A-Za-z0-9._:-]*$`},st={...rt(36),pattern:`^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`},ct=R({x:M(),y:M(),z:M()}),lt={type:`number`,exclusiveMinimum:0},ut=R({x:lt,y:lt,z:lt}),dt={...R({startFrame:N(),endFrameExclusive:N(1)}),"x-studio-range":!0},ft=(e=100,t=1)=>L(z,e,t,!0),pt=rt(120),mt={...rt(120),description:`Object id, or the name of a part created EARLIER in this ops list (create it first).`},ht={workspaceId:z,documentEpoch:z,sceneId:z,sceneEpoch:z},gt=R(ht),_t=R({surface:F(`studio`),...ht,workspaceHandle:it(z)}),vt=R({scene:N(),physics:N(),view:N()}),yt=it(R({kind:I(Qe.selectionKinds),id:z},{hierarchyId:z})),bt=R({mode:I(Qe.modes),frame:N(),playing:P,lookThrough:P,grid:P,autoColor:P}),xt=at(R({world:ct}),R({relativeTo:mt,basis:I(Qe.positionBases),side:I(Qe.positionSides),gapM:M(0),support:at(F(`floor`),R({objectId:mt}))}),R({between:L(mt,2,2,!0),fraction:M(0,1),support:F(`floor`)}),R({onObject:mt},{offsetXZ:R({x:M(),z:M()})})),St=at(R({yawDeg:M()}),R({towardId:mt}),R({sameAsId:mt}),R({awayFromId:mt})),Ct=at(R({intent:R({size:I(Qe.framingSizes),view:I(Qe.framingViews),level:I(Qe.framingLevels),side:I(Qe.framingSides)},{focalMm:lt})}),R({exact:R({position:ct,lookAt:ct,focalMm:lt})})),wt={...I([`parent`]),description:`"parent" reads position.world, rotationDeg and facing.yawDeg in the parent's local frame (its pivot and rotation, not its scale); omit for world space.`},Tt=at(R({op:F(`create`),source:R({kind:z}),position:xt},{name:pt,facing:St,scale:ut,rotationDeg:{...ct,description:`Euler XYZ degrees (x pitch, y yaw, z roll), as in update. Exclusive with facing. A pitched/rolled part rests its lowest corner on its support.`},parent:{...pt,description:`Group this new object under a parent: an existing object id, or the name of an object created earlier in this same ops list. Moving the parent then moves it too.`},space:wt}),R({op:F(`update`),id:z},{position:xt,facing:St,rotationDeg:ct,scale:ut,color:rt(32),name:pt,hidden:P,space:wt}),R({op:F(`remove`),id:z}),R({op:F(`group`),parentId:z,childIds:ft()}),R({op:F(`ungroup`),childIds:ft()})),Et=at(R({op:F(`create`),name:pt,position:xt},{facing:St,scale:lt}),R({op:F(`update`),characterId:z},{position:xt,facing:St,scale:lt,name:pt,hidden:P}),R({op:F(`remove`),characterId:z})),Dt={...rt(2097152),pattern:`^data:image/[A-Za-z0-9.+-]+[;,]`},Ot=R({frame:N(),framing:R({pos:ct,yaw:M(),pitch:M(),fovDeg:M(1,179)})},{id:z}),kt=at(M(0,1),R({t:M(0,1)},{bank:M(-90,90),pitch:M(-90,90)})),At=it(R({points:L(ct,64,2)},{speed:M(0,50),faceTravel:P,loop:P,extend:P,marks:L(kt,6)})),jt=R({},{type:I([`point`,`spot`]),color:{...rt(32),pattern:`^#[0-9a-fA-F]{6}$`},intensity:M(0,1e3),range:M(0,100),angle:M(1,89),softness:M(0,1),shadow:P,flicker:M(0,1),aim:it(ct)}),Mt=it(R({},{color:{...rt(32),pattern:`^#[0-9a-fA-F]{6}$`},intensity:M(0,20),halo:M(0,4)})),Nt=it(ot),Pt={"character.pose":it(z),"character.identityImage":it(Dt),"object.light":jt,"object.glow":Mt,"object.grasp":Nt,"object.effect":re,"object.text":_e,"object.parent":it(z),"object.path":At,"stage.environmentImage":it(Dt),"shot.cameraKeys":L(Ot,64),"shot.targetModel":it(z)};function Ft(e){if(Object.hasOwn(Pt,e.path))return Pt[e.path];if(e.type===`number`)return M(e.min,e.max);if(e.type===`boolean`)return P;if(e.type===`enum`)return I([...e.enum]);if(e.type===`id`)return z;if(e.type===`color`)return{...rt(32),pattern:`^#[0-9a-fA-F]{6}$`};if(e.type===`image`)return it(Dt);if(e.type===`vec3`){let{min:t,max:n}=e;return t&&typeof t==`object`&&n&&typeof n==`object`?R({x:M(t.x,n.x),y:M(t.y,n.y),z:M(t.z,n.z)}):ct}return e.type===`string`?rt(240):null}function It(e){return e.filter(o).map(({path:e,type:t,min:n,max:r,enum:i,note:a})=>({path:e,type:t,...n===void 0?{}:{min:n&&typeof n==`object`?{...n}:n},...r===void 0?{}:{max:r&&typeof r==`object`?{...r}:r},...i?{enum:[...i]}:{},...a?{note:a}:{}}))}var Lt=tt(It(i));function Rt(e){let t={};for(let n of Ze){let r={};for(let t of e){if(!o(t)||!t.path.startsWith(`${n}.`))continue;let e=Ft(t);e&&(r[t.path.slice(n.length+1)]=e)}t[n]={type:`object`,properties:r,required:[],additionalProperties:!1}}return t}var zt=tt(Rt(i)),Bt=tt(Object.fromEntries(Ze.map(e=>[e,Object.keys(zt[e].properties).map(t=>`${e}.${t}`)]))),Vt=at(R({target:R({kind:F(`character`),id:z}),set:zt.character}),R({target:R({kind:F(`object`),id:z}),set:zt.object}),R({target:R({kind:F(`shot`)},{id:z}),set:zt.shot}),R({target:R({kind:F(`stage`)}),set:zt.stage})),Ht={inspect_studio:R({scope:I(Qe.inspectionScopes)},{ids:ft(32),select:ft(32),query:pt,cursor:rt(512),limit:{...N(1,32),default:12}}),operate_studio:R({},{selection:yt,shotId:z,frame:N(),playing:P,mode:I(Qe.modes),view:R({},{lookThrough:P,grid:P,autoColor:P})}),arrange_objects:R({ops:{...L(Tt,100,1),description:`Applied in order, as one undo step. Each op sees the parts created by earlier ops, so build an assembly in one call: create the main part, then place the rest with position.onObject / relativeTo(+side,gapM) / between naming earlier parts (e.g. relativeTo "Hood"). Reference parts created in this call by name, never by id.`}},{collisionPolicy:{...I(Qe.collisionPolicies),default:`report`}}),arrange_characters:R({ops:L(Et,8,1)}),patch_elements:R({ops:L(Vt,32,1)}),frame_shot:R({subjectIds:ft(1),framing:Ct},{shotId:z,caption:{type:`string`,maxLength:500},keyAtFrame:N()}),verify_result:R({checks:{...L(I([`placement`,`framing`,`motion`,`lighting`]),4,1,!0),description:`lighting measures the shot frame rendered at the playhead: checks.lighting { meanLuma 0..1, clippedPct (a channel at full scale), crushedPct (pure black), subjects: [{ id, meanLuma, contrast (5th to 95th percentile luma spread, 0..1) }] inside each target character's projected box, look: { preset, envLight, ao } the stage look's environment light and occlusion strength }. motion also answers exportFraming (one per character with a take): what the camera the export renders shows of the take over sampledFrames: camera (shot where a shot covers the frame, studio = the Studio camera as it stands when none does; shotIds), character { screenFraction [min, max] of the frame height, inFrame [lowest share of its joints' screen box inside the frame, frame], behindCamera, cut { head, hand_l, hand_r, foot_l, foot_r } }, and every object the take names { id, name, inFrame, out, cut }; out, cut and behindCamera are spans [first, last] of sampled frames; { character: { id }, reason } when it cannot be measured`}},{receiptId:z,targets:ft(),range:at(F(`whole_clip`),dt),visual:{...I([`none`,`frame`,`contact_sheet`,`plan`,`trace`]),default:`none`},frames:{...at(I([`even`,`beats`]),L(N(),8,1,!0)),default:`even`,description:`contact_sheet frames: even spacing, beats (grab/release, beat starts, the worst QA frames, then even fill, answered in visualRefs[0].picks), or up to 8 timeline frames of your choice`},views:{...L(I([`front`,`side`,`three-quarter`,`top`]),2,1,!0),description:`contact_sheet from cameras of its own around the character instead of the shot camera (which stays as it is): a row per view, each held still over the frames and framed on focus, so small actions fill the tile; side and three-quarter look from the focus's side; a sheet always holds two views at least 60 degrees apart: if the asked ones look along nearly one line, side, front or top is added and named in visualRefs[0].addedView`},focus:{...at(rt(120),L(rt(120),3,1,!0)),description:`with views: what to frame, as refs (object:<id>, joint:<Bone>, prop:<prop>.<point>, landmark:mouth); default the whole character`},trail:{...at(rt(120),L(rt(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:{...P,description:`with views: each tile also shows the first target's poses around its frame as translucent ghosts (onion skin), earlier ones blue, later ones orange, carried props included, so spacing and arcs read in one tile; how many and how far apart is view.setGhosts (while it is off: 3 each side, every 4 frames), answered in visualRefs[0].ghosts`}}),undo_edit:R({receiptId:z}),run_action:R({action:z},{args:ot,confirmationToken:z})},Ut=tt(Ht),Wt=tt(Xe.map(e=>({name:e,slice:1,parameters:Ht[e]}))),Gt=R({min:ct,max:ct}),Kt=R({id:z,kind:I([`object`,`character`,`rig`]),token:z},{name:pt,detailsOmitted:P,position:ct,yawDeg:M(),rotationDeg:ct,scale:at(lt,ut),bounds:it(Gt),libraryKind:z,renderer:z,color:it(rt(32)),tint:it(rt(32)),modelId:it(rt(120)),assetId:z,parentId:it(z),attachment:it(R({characterId:z,bone:it(z)})),pathPointCount:N(0,64),pathMarks:L(at(M(0,1),R({t:M(0,1)},{bank:M(-90,90),pitch:M(-90,90)})),6),local:R({position:ct,rotationDeg:ct}),motion:R({takeId:it(z),frames:N(),ikKeyCount:N()},{poseId:it(z),keyIds:ft(8,0)}),capabilities:R({rigReady:P,ik:P,measuredFeet:P}),characterKind:I([`rig`,`proxy`]),posture:I(Ge)}),qt=R({id:z,kind:I([`object`,`character`,`rig`])},{name:pt,position:ct}),Jt=R({id:z},{label:pt,generation:F(`motion`),timeoutMs:N(1,3e5)}),Yt=R({id:z,name:pt,range:dt,keyCount:N()},{subjectIds:ft(24,0),kind:I([`clip`,`still`]),caption:rt(500)}),Xt=R({id:z,name:pt,range:dt,mode:I(Qe.shotModes)},{subjectIds:ft(24,0),kind:I([`clip`,`still`]),caption:rt(500)}),Zt=R({position:ct,lookAt:ct,focalMm:lt,sensorId:z,slate:pt}),Qt=I([`primitive`,`set-piece`,`image`,`mesh`]),$t=at(R({kind:z,name:pt,type:Qt}),R({id:z,name:pt,type:Qt})),en=R({id:z,characterId:z,state:I(Qe.jobStates)},{targetIds:ft(24,0),progress:it(M(0,1)),phase:pt}),tn=R({schema:F(`studio-context-v1`),host:_t,revision:vt,units:R({distance:F(`m`),angle:F(`deg`),up:F(`+Y`),yawZero:F(`+Z`),yawPositiveToward:F(`+X`),pivot:F(`base`),fps:F(24),rangeEnd:F(`exclusive`)}),scene:R({name:pt,aspect:rt(40),floorY:M(),frameCount:N(),objectCount:N(),characterCount:N()},{previsMode:I(We)}),selection:yt,activeCharacterId:it(z),view:bt,shot:it(Xt),camera:it(Zt),entities:L(Kt,24),entityPage:R({returned:N(0,24),total:N(),truncated:P,nextCursor:it(rt(512))}),shots:L(Yt,8),shotsTruncated:P,assets:L($t,qe.assets),recentReceipts:L(R({id:z,summary:pt,canUndoDirect:P}),3),jobs:L(en,8),capabilities:R({profile:F(`studio-slice-1`),tools:L(I(Xe),Xe.length,0,!0)},{rigReady:P,cameraReady:P,bridgeReady:P,storyboard:P})},{entityIndex:L(qt,qe.entityIndex),actionIndex:L(Jt,512)}),nn=R({...ht,targetId:z,token:z}),rn=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`,`ultra`],an=R({dataUrl:{...rt(6e6),pattern:`^data:image/(png|jpeg|webp);base64,`}},{name:rt(120)}),on=R({surface:F(`studio`),sessionId:st,turnId:st,text:rt(16e3),context:tn},{model:rt(120),effort:I(rn),attachFrame:P,attachments:L(an,4,1),supervisor:P}),sn=R({surface:F(`studio`),sessionId:st,turnId:st},{jobId:z}),cn=R({before:N(),after:N()}),ln=R({historyEntryId:z,entries:F(1),canUndoDirect:P}),un=R({characterId:z,beforeTakeId:it(z),takeId:z,targetToken:z,frameCount:N(1),fps:F(24),durationSeconds:lt,blocks:L(R({sourceBeat:N(0,7),startFrame:N(),endFrameExclusive:N(1)}),120,1),selectionChanged:F(!1)}),dn=R({id:z,status:I([`verified`,`unverified`]),profile:F(`studio-motion-v1`),range:dt,evaluatedFrames:N(),physicsRevision:N(),limitations:L(pt,12)},{surfaceMeasured:P,maxFloorPenetrationM:M(0),maxContactSlipM:M(0),maxContactFloatM:M(0),unsupportedFrames:N(),supportedCollisionFrames:N(),continuityRegressed:P,semanticStatus:I([`pending_image_review`,`passed`,`failed`,`unavailable`])}),fn=R({path:rt(120)},{number:M(),text:it(rt(512)),flag:P,vec:ct,count:N(),bytes:N()}),pn=R({},{position:ct,yawDeg:M(),rotationDeg:ct,scale:at(lt,ut),name:pt,color:rt(32),hidden:P,modelId:z,renderer:z,parentId:it(z),childIds:ft(100,0),childCount:N(0),bounds:it(Gt),removed:P,range:dt,camera:Zt,keyId:z,frame:N(),subjectIds:ft(24,0),selection:yt,activeCharacterId:it(z),shotId:it(z),view:bt,token:z,takeId:it(z),statureM:lt,patched:L(fn,32,1)}),mn=[`left`,`right`,`on-axis`],hn=R({coverage:pt},{relationSatisfied:P,overlapIds:ft(100,0),actualGapM:M(),requestedGapM:M(0),maximumFootprintOverlapM:M(0),basis:I(Qe.positionBases),clipped:P,occluded:P,behindCamera:P,screenFraction:M(0),derivedSize:I(Qe.framingSizes),support:pt,baseY:M(),facesTargetId:z,cameraSide:I(mn),axisConsistent:P,evaluatedFrames:N(1),sampledFrames:L(N(),64,1),sampledChecks:L(R({frame:N(),screenFraction:M(),clipped:P,behindCamera:P,occluded:P}),64,1),issueFrames:L(R({frame:N(),codes:L(pt,4,1),screenFraction:M()}),64,0)}),gn=R({subjects:L(R({id:z,position:ct,yawDeg:M()}),24),pairs:L(R({a:z,b:z,distanceM:M(0)}),24),shots:L(R({shotId:z,subjectIds:ft(2,0),camera:it(R({position:ct,lookAt:ct})),cameraSide:it(I(mn)),occluders:L(R({subjectId:z,byObjectId:z}),8)}),8),axisConsistent:it(P)}),_n=R({code:z},{id:z,message:pt,suggestedOutwardDeltaM:M(),count:N()}),vn={ok:F(!0),commandId:z,receiptId:z,host:gt,status:I(Qe.receiptStatuses),authored:P,revision:cn,affectedIds:ft(100,0),delta:L(R({id:z,after:pn}),8),checks:hn,undo:it(ln),warnings:L(_n,12)},yn={counts:R({created:N(),updated:N(),deleted:N()}),detailCursor:it(rt(512))},bn=L(R({index:N(),status:I(Qe.opStatuses)},{droppedPaths:L(rt(120),32,1)}),32,1),xn={...vn,authored:F(!0),undo:ln},Sn={action:z,summary:rt(240)},Cn={completed:R({...vn,status:F(`completed`),kind:I([`job`,`document`,`transaction`,`mutation`])},{...Sn,...yn,output:ot,jobId:z,txId:z,nextHost:gt,ops:bn}),started:R({...vn,status:F(`started`),kind:F(`job`),jobId:z,authored:F(!1),undo:F(null)},{...Sn}),applied:R({...xn,status:F(`applied`)},{mutated:F(!0),ops:bn,...yn,...Sn}),partial:R({...xn,status:F(`partial`),ops:bn},{mutated:F(!0),...yn}),noop:R({...vn,status:F(`noop`),authored:F(!1),mutated:F(!1),undo:F(null)},{ops:bn,...Sn}),transient:R({...vn,status:F(`transient`),authored:F(!1),view:cn,undo:F(null)},{mutated:P,...Sn}),installed:R({...xn,status:F(`installed`),jobId:z,artifactId:z,installed:un,verification:dn},{mutated:F(!0),explicitUnverifiedAcceptance:P,acceptance:F(`advisory-policy`),...yn}),undone:R({...xn,status:F(`undone`),undoneReceiptId:z,restoredTargets:L(nn,100,1)},{mutated:F(!0),...yn})},wn=at(...Object.values(Cn)),Tn=R({ok:F(!1),commandId:z,host:gt,code:I(s),phase:I([`admission`,`execution`,`prepare`,`verify`,`repair`,`commit`,`reconcile`,`undo`]),affectedIds:ft(100,0),expectedTargets:L(nn,24),currentTargets:L(nn,24),mutated:at(P,F(`unknown`)),preserved:R({authoredState:I([`unchanged`,`changed`,`unknown`])}),recovery:R({action:I([`none`,`inspect`,`retry`,`new_intent`,`reconcile`,`sign_in`])},{retryAllowed:P})},{message:rt(2e3),jobId:z,txId:z,candidates:L(R({id:z,kind:I([`object`,`character`,`rig`]),position:it(ct)}),5)}),En=tt({catalogue:Wt,variants:Qe,Vec3:ct,FrameRange:dt,PositionSpec:xt,FacingSpec:St,ObjectOp:Tt,CharacterOp:Et,Framing:Ct,Identity:gt,Host:_t,TargetGuard:nn,Entity:Kt,ShotSummary:Yt,StudioContextV1:tn,StudioTurn:on,StudioStop:sn,Receipt:wn,ReceiptVariants:Cn,Failure:Tn,GeometryFacts:gn});function Dn(e,t,n=`INVALID_ARGUMENT`,r=`$`){if(e.oneOf||e.anyOf){let i=[],a=[];for(let o of e.oneOf??e.anyOf)try{i.push(Dn(o,t,n,r))}catch(e){if(!(e instanceof $e))throw e;a.push({branch:o,error:e})}if(i.length===0&&a.length){let e=nt(t)&&nt(t.target)?t.target.kind:void 0,i=e!==void 0&&a.find(({branch:t})=>t.properties?.target?.properties?.kind?.const===e),o=!i&&Ue(r,a,t);throw o&&j(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&&j(n,`${r}: matches ${i.length} variants; send the fields of exactly one.`,r),i[0]}if(Object.hasOwn(e,`const`))return t!==e.const&&j(n,Me(r,e,t),r),t;if(e.type===`null`)return t!==null&&j(n,Me(r,e,t),r),null;if(e.type===`object`){nt(t)||j(n,Me(r,e,t),r);let i=e.additionalProperties===!0;for(let a of Object.keys(t))!Object.hasOwn(e.properties,a)&&!i&&j(n,Ne(r,e,a),r);let a={};if(i)for(let n of Object.keys(t))Object.hasOwn(e.properties,n)||(a[n]=structuredClone(t[n]));for(let[i,o]of Object.entries(e.properties))Object.hasOwn(t,i)?a[i]=Dn(o,t[i],n,`${r}.${i}`):e.required.includes(i)?j(n,Pe(r,i),`${r}.${i}`):Object.hasOwn(o,`default`)&&(a[i]=structuredClone(o.default));return e[`x-studio-range`]&&a.endFrameExclusive<=a.startFrame&&j(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)&&j(n,Fe(r,e,t),r);let i=t.map((t,i)=>Dn(e.items,t,n,`${r}[${i}]`));return e.uniqueItems&&new Set(i.map(e=>JSON.stringify(e))).size!==i.length&&j(n,Ie(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))&&j(n,Le(r,e,t),r),e.enum&&!e.enum.includes(t)&&j(n,Re(r,e,t),r),t;if(e.type===`boolean`)return typeof t!=`boolean`&&j(n,Me(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)&&j(n,ze(r,e,t),r),(e.minimum!==void 0&&t<e.minimum||e.maximum!==void 0&&t>e.maximum)&&j(n,`${r}: Expected a number within [${[e.minimum,e.maximum].filter(e=>e!==void 0).join(`, `)}], got ${t}.`,r),t;throw Error(`Unsupported internal Studio schema.`)}var On=e=>Dn(gt,e,`INVALID_IDENTITY`);function kn(e){return[...new Set([...[`object`,`character`,`rig`].includes(e.selection?.kind)?[e.selection.id]:[],...e.activeCharacterId?[e.activeCharacterId]:[],...e.shot?.subjectIds??[],...e.jobs.flatMap(e=>[e.characterId,...e.targetIds??[]])])]}function An(e){let t=et(JSON.stringify(e)??``);t>65536&&j(`CONTEXT_TOO_LARGE`,`Studio context exceeds ${Ke/1024} KiB.`,`$`,{bytes:t,maxBytes:Ke});let n=Dn(tn,e,`INVALID_CONTEXT`),r=new Set(n.entities.map(e=>e.id));r.size!==n.entities.length&&j(`INVALID_CONTEXT`,`Duplicate entity ID.`);for(let e of kn(n))r.has(e)||j(`TARGET_NOT_READY`,`Mandatory target is absent from context.`);n.activeCharacterId&&!n.entities.some(e=>e.id===n.activeCharacterId&&e.kind===`character`)&&j(`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)&&j(`INVALID_CONTEXT`,`Selection kind disagrees with the selected entity.`),n.selection?.kind===`scene`&&n.selection.id!==n.host.sceneId&&j(`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])&&j(`INVALID_CONTEXT`,`Inverted entity bounds.`),e.kind===`object`&&typeof e.scale==`number`&&j(`INVALID_CONTEXT`,`Objects use three-axis scale.`),e.kind!==`object`&&nt(e.scale)&&j(`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))&&j(`INVALID_CONTEXT`,`Entity pagination is inconsistent.`),n.entityIndex){let e=new Set(n.entityIndex.map(e=>e.id));e.size!==n.entityIndex.length&&j(`INVALID_CONTEXT`,`Duplicate entity index ID.`),(n.entityIndex.length>i.total||n.entities.some(t=>!e.has(t.id)))&&j(`INVALID_CONTEXT`,`Entity index must cover every detailed entity and no more than the total.`)}n.view.frame>=Math.max(1,n.scene.frameCount)&&j(`INVALID_CONTEXT`,`Playhead is outside the scene.`),new Set(n.shots.map(e=>e.id)).size!==n.shots.length&&j(`INVALID_CONTEXT`,`Duplicate shot ID.`);for(let e of[...n.shots,...n.shot?[n.shot]:[]])e.range.endFrameExclusive>n.scene.frameCount&&j(`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)&&j(`INVALID_CONTEXT`,`Current shot and range must survive projection.`),n}function jn(e){let t=new Set;for(let n of Array.isArray(e?.ops)?e.ops:[]){let e=nt(n)?n.target?.kind:void 0;if(Ze.includes(e)){t.add(e);for(let t of nt(n.set)?Object.keys(n.set):[])Object.hasOwn(zt[e].properties,t)||j(`INVALID_ARGUMENT`,`Unknown ${e} path "${e}.${t}". Valid ${e} paths: ${Bt[e].join(`, `)}.`)}}t.size>1&&j(`INVALID_ARGUMENT`,`One domain per patch: split character, object, shot and stage edits into separate commands.`)}function Mn(e){(!nt(e)||!Xe.includes(e.name))&&j(`UNKNOWN_TOOL`,`Unsupported Studio tool.`),e.name===`patch_elements`&&jn(e.args);let{args:t}=Dn(R({name:I(Xe),args:Ht[e.name]}),e);if(e.name===`inspect_studio`&&t.ids&&t.query!==void 0&&j(`INVALID_ARGUMENT`,`IDs and query are exclusive.`),e.name===`operate_studio`&&(!Object.keys(t).length||t.view&&!Object.keys(t.view).length)&&j(`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&&j(`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&&j(`INVALID_ARGUMENT`,`Update has no fields.`),e.facing&&e.rotationDeg&&j(`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)&&j(`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()&&j(`INVALID_ARGUMENT`,`Cannot group an object under itself.`);t.collisionPolicy===`avoid`&&!t.ops.some(e=>[`create`,`update`].includes(e.op)&&e.position?.relativeTo)&&j(`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)&&j(`INVALID_ARGUMENT`,`Camera position and aim cannot coincide.`),e.name===`patch_elements`)for(let e of t.ops)Object.keys(e.set).length||j(`INVALID_ARGUMENT`,`Patch has no fields.`);return e.name===`verify_result`&&(!!t.receiptId==!!t.targets&&j(`INVALID_ARGUMENT`,`Exactly one of receiptId or targets is required.`),t.checks.includes(`motion`)&&t.range===void 0&&(t.range=`whole_clip`,Object.defineProperty(t,"rangeWasDefaulted",{value:!0,enumerable:!1}))),{name:e.name,args:t}}function Nn(e){if(e?.ok===!1){let t=Dn(Tn,e,`INVALID_RECEIPT`);return et(JSON.stringify(t))>8192&&j(`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))&&j(`INVALID_RECEIPT`,`Failure must preserve uncertainty and actual state evidence.`),tt(t)}let t=Dn(wn,e,`INVALID_RECEIPT`);if(et(JSON.stringify(t))>8192&&j(`INVALID_RECEIPT`,`Receipt exceeds 8 KiB; use a detail cursor.`),t.delta.some(e=>!t.affectedIds.includes(e.id)||!Object.keys(e.after).length)&&j(`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)&&j(`INVALID_RECEIPT`,`Operation results must report every operation in order.`),t.ops.some(e=>e.status===`partial`!=!!e.droppedPaths?.length)&&j(`INVALID_RECEIPT`,`A partial operation must name the paths the domain dropped, and only a partial one may.`),t.status===`applied`&&e&&j(`INVALID_RECEIPT`,`Applied status cannot hide a dropped path.`),t.status===`partial`&&!e&&j(`INVALID_RECEIPT`,`Partial status requires at least one dropped path.`),t.status===`noop`&&t.ops.some(e=>e.status===`applied`)&&j(`INVALID_RECEIPT`,`A noop cannot report an applied operation.`)}if(t.status===`started`||t.status===`completed`?(t.revision.after<t.revision.before&&!t.nextHost&&j(`INVALID_RECEIPT`,`Completion revisions must not move backwards in one document.`),t.status===`started`&&(t.authored||t.undo||t.revision.before!==t.revision.after)&&j(`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)&&j(`INVALID_RECEIPT`,`A completed composite mutation needs retained undo and advancing revision evidence.`),t.undo&&(!t.authored||!t.affectedIds.length)&&j(`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)&&j(`INVALID_RECEIPT`,`Non-authored operations cannot create history or advance authored revision.`),t.status===`noop`&&(t.mutated!==!1||t.delta.length)&&j(`INVALID_RECEIPT`,`Noop must prove no mutation.`),t.status===`transient`&&(!t.view||t.view.after<t.view.before||!t.delta.length)&&j(`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)&&j(`INVALID_RECEIPT`,`Authored mutation requires one revision and one undo entry with actual readback.`),t.delta.length<t.affectedIds.length&&!t.detailCursor&&j(`INVALID_RECEIPT`,`Omitted batch readback requires a detail cursor.`)),t.status===`undone`&&(new Set(t.restoredTargets.map(e=>e.targetId)).size!==t.affectedIds.length||t.restoredTargets.some(e=>!t.affectedIds.includes(e.targetId)||Object.keys(ht).some(n=>e[n]!==t.host[n])))&&j(`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))&&j(`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)&&j(`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)&&j(`INVALID_RECEIPT`,`Installed schedule and verification coverage disagree.`),t.verification.status===`verified`&&t.verification.evaluatedFrames!==e&&j(`INVALID_RECEIPT`,`Verified motion requires whole-clip coverage.`),t.verification.status===`unverified`&&t.explicitUnverifiedAcceptance!==!0&&t.acceptance!==`advisory-policy`&&j(`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)&&j(`INVALID_RECEIPT`,`Installation evidence is exclusive to installed receipts.`);return tt(t)}var Pn=`cozyclay.locale`;function Fn(){try{let e=localStorage.getItem(Pn);return e===`ko`||e===`en`?e:null}catch{return null}}var In=Fn()??`en`,Ln=In===`ko`,Rn=Fn()!==null;function B(e,t){return Ln?t:e}function zn(e){if(e===`ko`||e===`en`){try{localStorage.setItem(Pn,e)}catch{}window.location.reload()}}var Bn=1.8,Vn=1.3,Hn=Object.freeze({super16:Object.freeze({id:`super16`,label:`Super 16`,widthMm:12.52,heightMm:7.41}),super35:Object.freeze({id:`super35`,label:`Super 35`,widthMm:24.89,heightMm:18.66}),fullFrame:Object.freeze({id:`fullFrame`,label:`Full Frame`,widthMm:36,heightMm:24}),"65mm":Object.freeze({id:`65mm`,label:`65mm`,widthMm:52.63,heightMm:23.01})}),Un=`fullFrame`,Wn=16/9,Gn=Object.freeze({"16:9":16/9,"2.39:1":2.39,"9:16":9/16,"1:1":1,"4:3":4/3,"12:7":12/7,"fal 480P":832/480});function Kn(e){return Gn[e]??1.7777777777777777}function qn(e=Un,t=Wn){let n=Hn[e]??Hn.fullFrame,r=Number.isFinite(t)&&t>0?t:Wn;return Math.min(n.heightMm,n.widthMm/r)}function Jn(e,t=Un,n=Wn){return qn(t,n)/(2*Math.tan(e/2))}function Yn(e,t=Un,n=Wn){return 2*Math.atan(qn(t,n)/(2*e))}var Xn=[14,18,24,28,35,50,85,100,135];function Zn(e,t=Un,n=Wn){let r=Jn(e,t,n);return Xn.reduce((e,t)=>Math.abs(t-r)<Math.abs(e-r)?t:e)}var Qn=[[2.8,`extreme close-up`,`ultra-realistic skin texture with visible pores and micro-detail, tack-sharp eyes, shallow depth of field`],[1.6,`close-up`,`ultra-realistic skin texture and fine facial detail, soft background blur, shallow depth of field`],[1.15,`medium close-up`,`natural skin and fabric texture, clear facial detail, shallow depth of field`],[.8,`medium shot`,`balanced detail on the subject and the surrounding space, moderate depth of field`],[.52,`medium-wide shot`,`the full figure with the environment clearly visible, deep focus`],[.3,`wide shot`,`full body in a richly detailed environment, deep focus`],[0,`extreme wide shot`,`a small figure within a vast, highly detailed environment, epic sense of scale, deep focus`]],$n=[[2.5,`overhead`,`a directly overhead bird's-eye view looking down at the subject`],[1.8,`high angle`,`a high angle looking down at the subject`],[1.5,`eye level`,`eye level`],[1.25,`chest level`,`chest level`],[.95,`hip level`,`a low hip-level angle`],[.45,`knee level`,`a low knee-level angle looking up at the subject`],[-1/0,`ground level`,`a dramatic ground-level angle looking up at the subject`]],er=(e,t)=>e.find(([e])=>t>=e)??e[e.length-1];function tr(e,t,n,r=Bn,i={}){let a=i.sensorId??`fullFrame`,o=i.aspectRatio??1.7777777777777777,s=e.x-t.x,c=e.z-t.z,l=e.y-Vn,u=Math.hypot(s,c),d=Math.max(Math.hypot(u,l),1e-6),f=r/(2*d*Math.tan(n/2)),[,p,m]=er(Qn,f),[,h,g]=er($n,e.y),_=Math.atan2(e.y-r*.94,Math.max(u,1e-6))*180/Math.PI,v=t.rot*Math.PI/180,y={x:Math.sin(v),z:Math.cos(v)},b={x:s/Math.max(u,1e-6),z:c/Math.max(u,1e-6)},x=y.x*b.x+y.z*b.z,S=y.x*b.z-y.z*b.x>=0?`right`:`left`,C=S===`right`?`R`:`L`,w,T;return x>.85?(w=`front`,T=`seen from the front, the face toward the camera`):x<-.85?(w=`back`,T=`seen from directly behind, the back of the head toward the camera`):x>.34?(w=`front ¾ ${C}`,T=`a three-quarter front view from the ${S}`):x<-.34?(w=`rear ¾ ${C}`,T=`a three-quarter rear view from the ${S}`):(w=`${S} profile`,T=`a ${S}-side profile view`),{sizeLabel:p,sizeContext:m,levelLabel:h,levelPhrase:g,viewShort:w,viewPhrase:T,focalMm:Zn(n,a,o),exactFocalMm:Jn(n,a,o),sensorId:Hn[a]?.id??`fullFrame`,usedSensorHeightMm:qn(a,o),distance:d,screenFraction:f,elevationDeg:_}}var nr=[{id:`nano_banana_pro`,label:`Nano Banana Pro`},{id:`nano_banana_2`,label:`Nano Banana 2`},{id:`gpt_image_2`,label:`GPT Image 2`},{id:`seedream_5`,label:`Seedream 5.0`},{id:`flux_2`,label:`Flux 2`,numericLens:!0,flavor:`fine film grain, high micro-detail`}],rr=`Custom…`,ir=[`Static / locked-off`,`Push-in (dolly in)`,`Pull-out (dolly out)`,`Pan left`,`Pan right`,`Tilt up`,`Tilt down`,`Tracking / follow`,`Orbit / arc`,`Crane up`,`Crane down`,`Handheld`,`Crash zoom in`,`Dolly-zoom (vertigo)`,`Whip pan`,`Aerial / drone`,rr];function ar({mode:e=`image`,model:t,shot:n,subject:r,subject2:i=null,posePhrase:a=``,pose2Phrase:o=``,environment:s,style:c,cameraMove:l=ir[0],customMove:u=``,hasCharSheet:d=!1,hasEnvSheet:f=!1}){let p=t?.numericLens?`${n.focalMm}mm lens at f/2.2`:`${n.focalMm}mm lens`,m=e===`video`?`Cinematic ${n.sizeLabel} at ${p}, ${n.levelPhrase}, ${n.viewPhrase}.`:`Photorealistic cinematic film still, ${n.sizeLabel} at ${p}, ${n.levelPhrase}, ${n.viewPhrase}.`,h=(e,t)=>t?`${e}, ${t}`:e,g;g=d?i?`Both subjects are the characters from the attached character sheet. Each one exactly matches their own body pose and placement shown in the blocking frame.`:`The subject is the character from the attached character sheet, exactly matching the body pose and placement shown in the blocking frame.`:i?`Two subjects. Subject 1: ${h(r,a)}. Subject 2: ${h(i,o)}. Each subject exactly matches their own body pose and placement shown in the blocking frame.`:`Subject: ${h(r,a)}, exactly matching the body pose and placement shown in the blocking frame.`;let _=f?`The setting is the location from the attached environment sheet.`:`Environment: ${s}.`,v=l===`Custom…`?u.trim()||`static, locked-off shot`:l.toLowerCase();return[m,g,_,`${c}, ${n.sizeContext}.`,e===`video`?`Camera move: ${v}.`:null,`Use the attached blocking frame ONLY as a camera and staging guide — it fixes the exact framing, this camera angle, the lens, and the subject placement. Its floor grid is a measuring aid that encodes distance and scale: read the subject's depth and size from it, but do NOT draw the grid itself. Replace the entire setting with the described environment and render real people; do NOT reproduce its grey mannequins, grey box set, measurement grid, or flat lighting.`,t?.flavor??null,e===`video`&&(t?.audio||t?.capabilities?.audio)?`Include natural ambient sound.`:null,`16:9.`].filter(Boolean).join(` `)}var or=.02,sr=(e,t,n)=>Math.min(n,Math.max(t,e)),cr=(e,t=0)=>typeof e==`number`&&Number.isFinite(e)?e:t;function lr(e){let t=0;for(let n=0;n<e.length-1;n+=1)t+=(e[n]+e[n+1])/2;return t}function ur(e,t){let n=sr(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 dr(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]=ur(e,r/(t-1));return n}function fr(e){let t=e.map(e=>Math.max(0,cr(e,0))),n=lr(t)/(t.length-1);return n<=1e-9?t.map(()=>1):t.map(e=>e/n)}function pr(e){return e.every(e=>Math.abs(e-1)<1e-6)}function mr(){return{cuts:[],envelopes:[Array(24).fill(1)]}}function hr(e){return!e||e.cuts.length===0&&e.envelopes.every(pr)}function gr(e){if(!e||typeof e!=`object`)return null;let t=Array.isArray(e.cuts)?e.cuts:[],n=[];for(let e of t){let t=cr(e?.t,NaN),r=cr(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=>cr(e,1)):[];i.push(fr(dr(t.length>=2?t:[1,1])))}return{cuts:n,envelopes:i}}function _r(e,t,n,r=.18){let i=e.length,a=Math.max(0,cr(n,0)),o=sr(cr(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 vr(e,t){let n=e.length,r=lr(e);if(r<=1e-9)return sr(t,0,1);let i=sr(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 yr(e,t){let n=sr(cr(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)*vr(e.envelopes[i],c)}function br(e,t,n){let r=Array(24);for(let i=0;i<24;i+=1)r[i]=ur(e,t+(n-t)*(i/23));return r}function xr(e,t){let n=e??mr(),r=cr(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=yr(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),fr(br(l,0,c)),fr(br(l,c,1)),...n.envelopes.slice(a+1)]}}function Sr(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=ur(u,o>1e-9?t/o:0);f[e]=s/Math.max(1e-9,o)*n}else{let n=ur(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),fr(f),...e.envelopes.slice(t+2)]}}var Cr=e=>{let t=Math.round(e*1e4)/1e4;return t===0?0:t},wr=e=>typeof e==`number`&&Number.isFinite(e),V=class extends Error{constructor(e,t){super(`${e}: ${t}`),this.path=e}};function Tr(e,t,n,r){if(e===void 0&&n)return[...n];if(!Array.isArray(e)||e.length!==3||!e.every(wr))throw new V(t,`must be three numbers [x, y, z], got ${JSON.stringify(e)}`);return e.forEach((e,n)=>r(e,`${t}[${n}]`)),e.map(Cr)}function Er(e,t,n,r,i){if(e===void 0)return n;if(!wr(e)||e<r||e>i)throw new V(t,`must be a number from ${r} to ${i}, got ${JSON.stringify(e)}`);return Cr(e)}function Dr(e,t,n,r,i){if(e===void 0&&n!==void 0)return n;if(!Number.isInteger(e)||e<r||e>i)throw new V(t,`must be a whole number from ${r} to ${i}, got ${JSON.stringify(e)}`);return e}var Or=(e,t)=>Dr(e,t,0,0,999999);function kr(e,t,n,r){if(e===void 0&&n!==void 0)return n;if(!r.includes(e))throw new V(t,`must be one of ${r.join(`, `)}; got ${JSON.stringify(e)}`);return e}var Ar=/^#?([0-9a-f]{3})$/i,jr=/^#?([0-9a-f]{6})$/i;function Mr(e,t){let n=typeof e==`string`?e.trim():``,r=Ar.exec(n);if(r)return`#${r[1].toLowerCase().replace(/./g,e=>e+e)}`;let i=jr.exec(n);if(i)return`#${i[1].toLowerCase()}`;throw new V(t,`colour must be #rgb or #rrggbb, got ${JSON.stringify(e)}`)}var Nr=48,Pr=6,Fr=8,Ir=6,Lr=Math.cos(Math.PI/6),Rr=(e,t,n)=>[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n],zr=(e,t)=>Math.hypot(t[0]-e[0],t[1]-e[1]);function Br(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 Vr(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=Br(e);return[t/(3*r),n/(3*r)]}function Hr(e){let t=e.filter((t,n)=>n===0||zr(t,e[n-1])>1e-9);for(;t.length>1&&zr(t[0],t.at(-1))<=1e-9;)t.pop();return t}function Ur({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?Ir: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 Wr(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(zr(a,o)),l=Math.sqrt(zr(i,a)),u=Math.sqrt(zr(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<Fr;e+=1){let t=e/Fr;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 Gr=(e,t)=>[Math.min(...e.map(e=>e[t])),Math.max(...e.map(e=>e[t]))];function Kr(e,t){let n=[0,1].map(n=>[Gr(e,n),Gr(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 qr(e){let t=Vr(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?Hr([Rr(e[n.i],e[(n.i+1)%e.length],n.t),...e.slice(n.i+1),...e.slice(0,n.i+1)]):e}function Jr(e,t){let n=e.length,r=[0,1].map(t=>Math.max(1e-9,Gr(e,t)[1]-Gr(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(Rr(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]))/(zr(u,r)*zr(r,d)),p=Math.round(c/a*t)%t;f<Lr&&!l.has(p)&&(l.add(p),o[p]=r),c+=i[s]}),o}function Yr(e,t){let n=e.points??Ur(e),r=Hr(e.points&&t?Kr(Wr(n),n):n);return Br(r)>0&&(r=r.slice().reverse()),Jr(qr(r),Nr)}function Xr(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 Zr(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 Qr(e){let[t,n,r]=e.size,i=e.sections.map(e=>e.y),a=e.sections.map(t=>Yr(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=>Xr(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<Pr;n+=1){let r=i[t]+(i[t+1]-i[t])*n/Pr;o.push({y:r,ring:a[t].map((n,o)=>[0,1].map(n=>Zr(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 $r=[2,12],ei=[3,24],ti=[4,48],ni=[6,40],ri=16,ii=.25,ai=.02,oi=2147483647;function si(e,t,n,r){if(!wr(e)||e<n||e>r)throw new V(t,`must be a number from ${n} to ${r}, got ${JSON.stringify(e)}`);return Cr(e)}function ci(e,t,n){if(e===void 0)return n;if(typeof e!=`boolean`)throw new V(t,`must be true or false`);return e}function li(e,t,[n,r],i){if(!Array.isArray(e)||e.length<n||e.length>r)throw new V(t,`must be ${n}-${r} ${i}, got ${Array.isArray(e)?e.length:JSON.stringify(e)}`);return e}function ui(e,t,n){if(!Array.isArray(e)||e.length!==n.length||!e.every(wr))throw new V(t,`must be [${n.join(`, `)}] fractions of size, got ${JSON.stringify(e)}`);return e.map((e,n)=>si(e,`${t}[${n}]`,-.5,.5))}var di=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]);function fi(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(di(i,a,o)*di(i,a,s)<0&&di(o,s,i)*di(o,s,a)<0)return[n,r]}return null}function pi(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new V(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 V(`${t}.${n}`,`unknown key (a section is { y, points } or { y, w, d, x, z, roundness })`);let i=si(e.y,`${t}.y`,0,1);if(n){let n=li(e.points,`${t}.points`,ei,`[x, z] points`).map((e,n)=>ui(e,`${t}.points[${n}]`,[`x`,`z`])),r=fi(n);if(r)throw new V(`${t}.points`,`edges ${r[0]} and ${r[1]} cross; list the outline in order around the section`);if(Math.abs(Br(n))<1e-6)throw new V(`${t}.points`,`the outline encloses no area`);return{y:i,points:n}}let a={y:i,w:si(e.w,`${t}.w`,.01,1),d:si(e.d,`${t}.d`,.01,1)};for(let[n,r]of[[`x`,`w`],[`z`,`d`]])if(a[n]=Er(e[n],`${t}.${n}`,0,-.5,.5),Math.abs(a[n])+a[r]/2>.5+1e-9)throw new V(`${t}.${n}`,`the section reaches past the part's side: |${n}| + ${r}/2 must be at most 0.5`);return a.roundness=Er(e.roundness,`${t}.roundness`,ii,0,1),a}function mi(e,t){let n=`${t}.sections`,r=li(e,n,$r,`sections`).map((e,t)=>pi(e,`${n}[${t}]`));if(r.forEach((e,t)=>{if(t>0&&e.y<=r[t-1].y)throw new V(`${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 V(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 hi(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 gi(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 _i(e,t){let n=gi(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)=>Cr((e-(c[t][0]+c[t][1])/2)/(c[t][1]-c[t][0]))))}var vi=e=>e.points??_i(e.seed,e.facetCount);function yi(e){return vi(e).map(t=>t.map((t,n)=>t*e.size[n]))}var bi=Object.freeze({loft:{keys:[`sections`,`smooth`],read(e,t,n){t.sections=mi(e.sections,n),t.smooth=ci(e.smooth,`${n}.smooth`,!0)},mirror(e){e.sections=e.sections.map(e=>e.points?{y:e.y,points:e.points.map(([e,t])=>[Cr(-e),t]).reverse()}:{...e,x:Cr(-e.x)})},samples(e){let{rings:t,at:n}=Qr(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 V(`${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 V(`${n}.facetCount`,`applies to a seeded rock; points already set the facets`);if(t.points=li(e.points,`${n}.points`,ti,`[x, y, z] points`).map((e,t)=>ui(e,`${n}.points[${t}]`,[`x`,`y`,`z`])),hi(t.points)<ai)throw new V(`${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>oi)throw new V(`${n}.seed`,`must be a whole number from 0 to ${oi}, got ${JSON.stringify(e.seed)}`);t.seed=e.seed;let i=r(`facetCount`)?e.facetCount:ri;if(!Number.isInteger(i)||i<ni[0]||i>ni[1])throw new V(`${n}.facetCount`,`must be a whole number from ${ni[0]} to ${ni[1]}, got ${JSON.stringify(e.facetCount)}`);t.facetCount=i}t.facets=ci(e.facets,`${n}.facets`,!0)},mirror(e){e.points=vi(e).map(([e,t,n])=>[Cr(-e),t,n]),delete e.seed,delete e.facetCount},samples:e=>[yi(e)]}}),xi=1e-9;function Si(e,t){return e===null?t:t===null?e:e*t<=0?0:2*e*t/(e+t)}function Ci(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)=>Si(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 wi(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 Ti=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]),Ei=(e,t,n)=>{let r=Ti(e,t,n);return Math.abs(r)<=xi?0:Math.sign(r)},Di=(e,t,n)=>Math.min(e[0],t[0])-xi<=n[0]&&n[0]<=Math.max(e[0],t[0])+xi&&Math.min(e[1],t[1])-xi<=n[1]&&n[1]<=Math.max(e[1],t[1])+xi;function Oi(e,t,n,r){let i=Ei(e,t,n),a=Ei(e,t,r),o=Ei(n,r,e),s=Ei(n,r,t);return i!==a&&o!==s||i===0&&Di(e,t,n)||a===0&&Di(e,t,r)||o===0&&Di(n,r,e)||s===0&&Di(n,r,t)}function ki(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=Ei(e,t,n)===0&&(t[0]-e[0])*(n[0]-e[0])+(t[1]-e[1])*(n[1]-e[1])>0}else s=Oi(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 Ai([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 ji(e){let t=e.map((e,t)=>t);wi(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 Ti(a,o,s)<=xi?!1:!t.some(t=>!r(i).includes(t)&&Ti(a,o,e[t])>=0&&Ti(o,s,e[t])>=0&&Ti(s,a,e[t])>=0)});i<0&&(i=0),n.push(r(i)),t.splice(i,1)}return n.push(t),n}var Mi=.005,Ni=24,Pi=e=>e.size.map(e=>e/2);function Fi(e,t,n){if(e===void 0)return n;if(typeof e!=`boolean`)throw new V(t,`must be true or false, got ${JSON.stringify(e)}`);return e}function Ii(e,t,n,[r,i],[a,o]){if(!Array.isArray(e)||e.length<r||e.length>i)throw new V(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(wr))throw new V(`${t}[${r}]`,`must be ${s} numbers ${n}, got ${JSON.stringify(e)}`);return e.forEach((e,n)=>{if(e<a||e>o)throw new V(`${t}[${r}][${n}]`,`must be from ${a} to ${o}, got ${e}`)}),e.map(Cr)})}function Li(e,t,n){let r=Ii(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 V(`${t}[${i}]`,i?`repeats the point before it`:`repeats the last point; the loop closes by itself`)}),r}function Ri(e,t){return(e.smooth?Ci(e.profile,t):e.profile).map(([t,n])=>[t,(n-.5)*e.size[1]])}function zi(e){let[t,,n]=Pi(e),r=Ri(e,Math.ceil(24/(e.profile.length-1))).map(([e,r])=>Array.from({length:Ni},(i,a)=>{let o=a/Ni*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 Bi={keys:[`profile`,`smooth`],read(e,t,n){let r=Ii(e.profile,`${n}.profile`,`[r, y]`,[3,32],[0,1]);if(r.forEach(([,e],t)=>{if(t&&e<r[t-1][1])throw new V(`${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 V(`${n}.profile`,`must climb: the last y must be above the first`);if(r.every(([e])=>e===0))throw new V(`${n}.profile`,`has every r at 0, so nothing would be drawn`);t.profile=r,t.smooth=Fi(e.smooth,`${n}.smooth`,!0)},samples:zi},Vi=e=>e.path.map(t=>t.map((t,n)=>t*(e.size[n]-e.thickness))),Hi=(e,t)=>Ci(Vi(e),t,e.closed);function Ui(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 Wi=[];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&&Wi.push([e/r,t/r,n/r])}function Gi(e){let t=Hi(e,4),n=Ui(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 Wi)i.push(t[r].map((t,i)=>t+e[i]*n[r]))}return i})}var Ki={keys:[`path`,`thickness`,`taper`,`closed`],read(e,t,n){t.path=Ii(e.path,`${n}.path`,`[x, y, z]`,[2,32],[-.5,.5]);let r=Math.min(...t.size);if(!wr(e.thickness)||e.thickness<Mi||e.thickness>r)throw new V(`${n}.thickness`,`must be the tube's diameter in metres, from ${Mi} to the part's smallest size (${Cr(r)} m), got ${JSON.stringify(e.thickness)}`);if(t.thickness=Cr(e.thickness),t.taper=Er(e.taper,`${n}.taper`,0,-1,1),t.closed=Fi(e.closed,`${n}.closed`,!1),t.closed&&t.taper)throw new V(`${n}.taper`,`a closed tube cannot taper: its two ends meet`);if(t.closed&&t.path.length<3)throw new V(`${n}.path`,`a closed tube needs at least 3 points`);let i=Vi(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 V(`${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])=>[Cr(-e),t,n])},samples:Gi};function qi(e){let[t,n,r]=e.size;return ji(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 Ji(e){return e.holes?e.holes.reduce((e,t)=>Math.abs(wi(t))>Math.abs(wi(e))?t:e).map(([t,n])=>[t*e.size[0],n*e.size[1],0]):null}var Yi=e=>e.map(([e,t])=>[Cr(-e),t]),Xi=Object.freeze({lathe:Bi,tube:Ki,extrude:{keys:[`outline`,`holes`,`roundness`],read(e,t,n){if(t.outline=Li(e.outline,`${n}.outline`,[3,64]),e.holes!==void 0&&(!Array.isArray(e.holes)||e.holes.length>4))throw new V(`${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)=>Li(e,`${n}.holes[${t}]`,[3,32])),i=[`${n}.outline`,...r.map((e,t)=>`${n}.holes[${t}]`)],a=ki([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 V(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(wi(e))<1e-5)throw new V(i[t],`encloses no area`)}),r.forEach((e,n)=>{if(!Ai(e[0],t.outline))throw new V(i[n+1],`must lie inside the outline`);if(r.some((t,r)=>r!==n&&Ai(e[0],t)))throw new V(i[n+1],`must not lie inside another hole`)}),r.length&&(t.holes=r),t.roundness=Er(e.roundness,`${n}.roundness`,.1,0,1)},mirror(e){e.outline=Yi(e.outline),e.holes&&=e.holes.map(Yi)},samples:qi,hole:Ji}}),Zi=Object.freeze([`blade`,`tuft`,`flower`,`leaf`,`pebble`,`twig`]),Qi=[`ground`,`shell`],$i=4e3;function ea(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 ta={keys:[`item`,`count`,`seed`,`spread`],read(e,t,n){t.item=kr(e.item,`${n}.item`,void 0,Zi),t.count=Dr(e.count,`${n}.count`,void 0,1,$i),t.seed=Or(e.seed,`${n}.seed`),t.spread=kr(e.spread,`${n}.spread`,`ground`,Qi)},samples:ea},na=.6,ra=e=>e.size.map(e=>e/2);function ia(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 aa(e){let[t,n,r]=ra(e),i=2+6*e.roundness,a=e.taper;return[ia((e,o)=>{let s=a>0?1-a*na*((e+1)/2):a<0?1+a*na*((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 oa(e){let[t,n,r]=ra(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 sa(e){let[t,n,r]=ra(e);return[ia((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 ca(e){let[t,n,r]=ra(e);return[ia((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 la(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 ua=Object.freeze({blob:{keys:[`roundness`,`taper`],read(e,t,n){t.roundness=Er(e.roundness,`${n}.roundness`,.5,0,1),t.taper=Er(e.taper,`${n}.taper`,0,-1,1)},samples:aa},box:{keys:[`roundness`],read(e,t,n){t.roundness=Er(e.roundness,`${n}.roundness`,.1,0,1)},samples:oa},cylinder:{keys:[`taper`],read(e,t,n){t.taper=Er(e.taper,`${n}.taper`,0,-1,1)},samples:sa},torus:{keys:[],read(e,t,n){if(t.size[2]>=Math.min(t.size[0],t.size[1]))throw new V(`${n}.size`,`a torus's tube (size[2]) must be thinner than its outer diameter`)},samples:ca,hole:la},frame:{keys:[`border`],read(e,t,n){let r=Math.min(t.size[0],t.size[1])/2,i=e.border===void 0?Cr(Math.min(t.size[0],t.size[1])*.15):e.border;if(!wr(i)||i<=0||i>=r)throw new V(`${n}.border`,`must be above 0 and below half the frame's smaller side (${Cr(r)} m), got ${JSON.stringify(e.border)}`);t.border=Cr(i)},samples:ca,hole:la},...Xi,...bi,scatter:ta}),da=Object.freeze(Object.keys(ua)),fa=Object.freeze([...new Set(Object.values(ua).flatMap(e=>e.keys))]),pa=[`subtract`,`intersect`],ma=Object.freeze({key:`op`,read(e,t,n){if(!pa.includes(e.op))throw new V(`${n}.op`,`must be "subtract" or "intersect", got ${JSON.stringify(e.op)}`);if(t.parent===void 0)throw new V(`${n}.op`,`a cutter needs a parent: the part it cuts`);t.op=e.op}});function ha(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 V(`parts[${n.id}].op`,`"${e.id}" is a scatter, which is drawn as instances and cannot be cut`);if(e?.op)throw new V(`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 ga=.35,_a={fallback:4,min:1,max:12},va=[`y`,`x`,`z`];function ya(e,t,n){if(!e||typeof e!=`object`||Array.isArray(e))throw new V(t,`must be an object { ${n.join(`, `)} }, got ${JSON.stringify(e)}`);for(let r of Object.keys(e))if(!n.includes(r))throw new V(`${t}.${r}`,`unknown key (allowed: ${n.join(`, `)})`);return e}var ba=[{key:`detail`,read(e,t,n){let r=`${n}.detail`;if(t.shape===`scatter`)throw new V(r,`does not apply to a scatter: its items are already small; lump the part under it instead`);let i=ya(e.detail,r,[`amount`,`scale`,`seed`]);if(i.amount===void 0)throw new V(`${r}.amount`,`is required: the bump height from 0 (smooth) to 1 (very lumpy)`);t.detail={amount:Er(i.amount,`${r}.amount`,0,0,1),scale:Er(i.scale,`${r}.scale`,_a.fallback,_a.min,_a.max),seed:Or(i.seed,`${r}.seed`)}}},{key:`gradient`,read(e,t,n){let r=`${n}.gradient`,i=ya(e.gradient,r,[`color`,`axis`,`from`,`to`]);if(i.color===void 0)throw new V(`${r}.color`,`is required: the #rrggbb colour the part blends into`);t.gradient={color:Mr(i.color,`${r}.color`),axis:kr(i.axis,`${r}.axis`,`y`,va),from:Er(i.from,`${r}.from`,0,0,1),to:Er(i.to,`${r}.to`,1,0,1)}}}],xa=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}}}),Sa=Object.freeze(Object.keys(xa)),Ca=Object.freeze({matte:.85,satin:.45,gloss:.12}),wa=Object.freeze(Object.keys(Ca));function Ta(e,t){let n=xa[t]?.color;return n&&(!e||e.toLowerCase()===`#c2c6c8`)?n:e??`#c2c6c8`}var Ea=new Set([`cube`,`sphere`,`capsule`,`cylinder`,`cone`,`plane`]),Da=[[`material`,Sa],[`finish`,wa]],Oa=e=>Ea.has(e)?Da.map(([e])=>e):[];function ka(e,t){return Ea.has(t)?Object.fromEntries(Da.filter(([t,n])=>n.includes(e?.[t])).map(([t])=>[t,e[t]])):{}}function Aa(e,t){if(!Ea.has(e?.renderer))return{};let n={};for(let[r,i]of Da){let a=t?.[r];a===void 0||a!==null&&!i.includes(a)||(a??void 0)!==e[r]&&(n[r]=a)}return n}var ja=(e,t)=>(n,r,i)=>{if(n[e]!==null){if(!t.includes(n[e]))throw new V(`${i}.${e}`,`must be one of ${t.join(`, `)}; got ${JSON.stringify(n[e])}`);r[e]=n[e]}},Ma=Object.freeze([{key:`material`,read:ja(`material`,Sa)},{key:`finish`,read:ja(`finish`,wa)},...ba,ma]),Na=1,Pa=Object.freeze({maxParts:48,minExtent:.005,maxExtent:20,maxOffset:20,maxDepth:8,maxScatterItems:12e3}),Fa=`#c2c6c8`,Ia=`.mirror`,La=.05,Ra=/^[a-z0-9][a-z0-9-]{0,39}$/,za=new Set([`id`,`shape`,`size`,`position`,`rotation`,`color`,`parent`,`mirror`,...fa,...Ma.map(e=>e.key)]),Ba=e=>{let t=((e+180)%360+360)%360-180;return t===-180?180:t},Va=(e,t)=>e===void 0?Fa:Mr(e,t);function Ha(e,t){let n=`parts[${t}]`;if(!e||typeof e!=`object`||Array.isArray(e))throw new V(n,`must be an object`);for(let t of Object.keys(e))if(!za.has(t))throw new V(`${n}.${t}`,`unknown key (allowed: ${[...za].join(`, `)})`);if(typeof e.id!=`string`||!Ra.test(e.id))throw new V(`${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(!da.includes(e.shape))throw new V(`${r}.shape`,`must be one of ${da.join(`, `)}; got ${JSON.stringify(e.shape)}`);let i=ua[e.shape];for(let t of fa)if(e[t]!==void 0&&!i.keys.includes(t))throw new V(`${r}.${t}`,`does not apply to a ${e.shape}`);let a=Tr(e.size,`${r}.size`,null,(e,t)=>{if(e<Pa.minExtent||e>Pa.maxExtent)throw new V(t,`extent must be ${Pa.minExtent}-${Pa.maxExtent} m, got ${e}`)}),o=Tr(e.position,`${r}.position`,[0,0,0],(e,t)=>{if(Math.abs(e)>Pa.maxOffset)throw new V(t,`must be within ±${Pa.maxOffset} m, got ${e}`)}),s=Tr(e.rotation,`${r}.rotation`,[0,0,0],()=>{}).map(e=>Cr(Ba(e)));if(e.parent!==void 0&&(typeof e.parent!=`string`||!e.parent))throw new V(`${r}.parent`,`must be another part's id`);if(e.mirror!==void 0&&typeof e.mirror!=`boolean`)throw new V(`${r}.mirror`,`must be true or false`);let c={id:e.id,shape:e.shape,size:a,position:o,rotation:s,color:Va(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 Ma)e[t.key]!==void 0&&t.read(e,c,r);return c}function Ua(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 V(`parts[${e.id}].parent`,`no part named "${e.parent}"`);if(i.has(a.id))throw new V(`parts[${e.id}].parent`,`parents form a cycle`);let o=r(a,new Set([...i,e.id]))+1;if(o>Pa.maxDepth)throw new V(`parts[${e.id}].parent`,`parent chain is deeper than ${Pa.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 V(`parts[${n.id}].mirror`,`"${e.id}" above it is already mirrored, which copies this part too`)}return n}function Wa(e){try{if(!e||typeof e!=`object`||Array.isArray(e))throw new V(`recipe`,`must be an object with a parts array`);for(let t of Object.keys(e))if(t!==`version`&&t!==`parts`)throw new V(`recipe.${t}`,`unknown key (allowed: version, parts)`);if(e.version!==void 0&&e.version!==Na)throw new V(`recipe.version`,`only version ${Na} is understood, got ${JSON.stringify(e.version)}`);if(!Array.isArray(e.parts)||e.parts.length===0)throw new V(`recipe.parts`,`must be a non-empty array`);let t=e.parts.map(Ha),n=new Set;for(let e of t){if(n.has(e.id))throw new V(`parts[${e.id}].id`,`is used twice`);n.add(e.id)}Ua(t),ha(t);let r={version:Na,parts:t},i=Za(r);if(i.length>Pa.maxParts)throw new V(`recipe.parts`,`expands to ${i.length} parts with mirrors; the limit is ${Pa.maxParts}`);let a=i.reduce((e,t)=>e+(t.shape===`scatter`?t.count:0),0);if(a>Pa.maxScatterItems)throw new V(`recipe.parts`,`scatter parts draw ${a} items with mirrors; the limit is ${Pa.maxScatterItems}`);return{ok:!0,recipe:r}}catch(e){if(e instanceof V)return{ok:!1,error:e.message,path:e.path};throw e}}function Ga(e,t){let n=Wa(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 Ma)l[e.key]===null&&delete u[e.key];if(`shape`in l)for(let e of fa)e in l||delete u[e];r[s]=u,i.add(o)}let a=Wa({version:Na,parts:r});return a.ok?{...a,changed:[...i]}:a}var Ka=Math.PI/180;function qa(e,t){let[n,r,i]=t.map(e=>e*Ka),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 Ja(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 Ya(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 Xa(e,t){let n={...e,id:`${e.id}${Ia}`,position:[Cr(-e.position[0]),e.position[1],e.position[2]],rotation:[e.rotation[0],Cr(-e.rotation[1]),Cr(-e.rotation[2])]};return delete n.mirror,ua[n.shape].mirror?.(n),t!==void 0&&(n.parent=t),n}function Za(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?Xa(e,a):a===void 0?{...e}:{...e,parent:a},c=Ja(t,qa(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=Xa(e,a),s=Ja(t,qa(o.position,o.rotation));r.push({...o,matrix:s});for(let t of n.get(e.id)??[])i(t,s,o.id,!0)}},a=qa([0,0,0],[0,0,0]);for(let e of n.get(``)??[])i(e,a,void 0,!1);return r}function Qa(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 $a(e){let t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let r of Za(e).filter(e=>!e.op))for(let e of Qa(r)){let i=Ya(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(Cr),max:n.map(Cr)}}function eo(e){let{min:t,max:n}=$a(e);return{footprint:{width:Cr(Math.max(Pa.minExtent,2*Math.max(Math.abs(t[0]),Math.abs(n[0])))),depth:Cr(Math.max(Pa.minExtent,2*Math.max(Math.abs(t[2]),Math.abs(n[2]))))},height:Cr(Math.max(La,n[1]))}}function to(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 H=(e,t)=>[e[0]+t[0],e[1]+t[1],e[2]+t[2]],U=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],W=(e,t)=>[e[0]*t,e[1]*t,e[2]*t],G=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],no=(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]],K=e=>Math.hypot(e[0],e[1],e[2]),ro=(e,t)=>K(U(e,t));function q(e){let t=K(e);return t>1e-12?[e[0]/t,e[1]/t,e[2]/t]:[0,0,0]}var io=(e,t,n)=>Math.min(n,Math.max(t,e)),ao=e=>e*Math.PI/180,oo=e=>e*180/Math.PI,so=()=>[[1,0,0],[0,1,0],[0,0,1]];function J(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 Y=(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]],X=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]]],co=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]];function lo(e){let t=ao(e),n=Math.cos(t),r=Math.sin(t);return[[1,0,0],[0,n,-r],[0,r,n]]}function Z(e){let t=ao(e),n=Math.cos(t),r=Math.sin(t);return[[n,0,r],[0,1,0],[-r,0,n]]}function uo(e){let t=ao(e),n=Math.cos(t),r=Math.sin(t);return[[n,-r,0],[r,n,0],[0,0,1]]}function fo(e,t){let[n,r,i]=q(e),a=ao(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 po(e,t){let n=q(e),r=U(t,W(n,G(t,n)));return K(r)<1e-9&&(r=U([0,1,0],W(n,n[1])),K(r)<1e-9&&(r=U([1,0,0],W(n,n[0])))),r=q(r),co(n,r,no(n,r))}var mo=(e,t,n,r)=>J(po(n,r),X(po(e,t)));function ho(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 go([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 _o=(e,t)=>oo(Math.acos(io(G(q(e),q(t)),-1,1))),vo=.01;function yo(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*vo)),c=t.map(e=>go(e.localQuat)),l=t.map(e=>e.worldPos.map(e=>e*vo)),u=t.map(e=>go(e.worldQuat)),d=e.landmarks,f=r.Head,p=e=>Y(X(u[f]),U(e.map(e=>e*vo),l[f])),m={mouth:p(d.mouth),headCentre:p(d.headEllipsoid.centre),headRadii:d.headEllipsoid.radii.map(e=>e*vo),sole:{ball:(d.sole?.ball??0)*vo,tip:(d.sole?.tip??0)*vo}};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 bo(e){return{P:e.restWorldPos.map(e=>e.slice()),R:e.restWorldRot.map(e=>e.map(e=>e.slice()))}}function xo(e,t,n,r,i){for(let a of e.subtree[n])t.P[a]=H(r,Y(i,U(t.P[a],r))),t.R[a]=J(i,t.R[a])}function So(e,t){return{quats:e.names.map((n,r)=>{let i=e.parent[r];return ho(i<0?t.R[r]:J(X(t.R[i]),t.R[r]))}),hips:t.P[e.index.Hips].slice()}}function Co(e,t,n){let r=[],i=[];for(let a of e.subtree[e.index.Hips]){let o=e.parent[a],s=go(t[a]);if(o<0){i[a]=s,r[a]=n.slice();continue}i[a]=J(i[o],s),r[a]=H(r[o],Y(i[o],e.restLocalPos[a]))}return{P:r,R:i}}var wo=(e,t,n)=>H(e.P[t],Y(e.R[t],n)),To=(e,t,n,r)=>Y(t.R[n],Y(X(e.restWorldRot[n]),r)),Eo=(e,t,n)=>Math.acos(io((n*n-e*e-t*t)/(2*e*t),-1,1))*180/Math.PI,Do=(e,t,n)=>Math.sqrt(e*e+t*t+2*e*t*Math.cos(n*Math.PI/180));function Oo(e,t,n,r=145,i=150){let a=Do(e,t,r);if(n>=a)return n;let o=a-Do(e,t,i);return n>a-2*o?n+(a-n)*(a-n)/(4*o):a-o}function ko(e,t,n,r,i,a=145,o=150){let s=Do(n,r,a),c=K(U(t,e));if(c>=s)return t;let l=Oo(n,r,c,a,o),u=W(i,Do(n,r,o)),d=H(e,u),f=U(t,d),p=K(f)>1e-9?q(f):W(i,-1),m=G(p,u);return H(d,W(p,-m+Math.sqrt(Math.max(0,m*m-G(u,u)+l*l))))}var Ao=(e,t)=>To(e,t,e.index.Spine2??e.index.Hips,[0,0,-1]),jo=(e,t)=>To(e,t,e.index.Hips,[0,1,0]),Mo=(e,t,n)=>Eo(e,t,Oo(e,t,Do(e,t,n)));function No(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 Eo(K(U(c,s)),K(U(l,c)),K(U(r,s)))}function Po(e,t,n){let r=e.index[`${n}Arm`],i=e.index[`${n}ForeArm`],a=U(t.P[i],t.P[r]),o=U(t.P[e.index[`${n}Hand`]],t.P[i]),s=Math.acos(io(G(q(a),q(o)),-1,1))*180/Math.PI,c=no(a,o);s>145&&K(c)>1e-12&&xo(e,t,i,t.P[i].slice(),fo(c,Mo(K(a),K(o),s)-s))}var Fo={elbow:[145,150,Ao],knee:[150,160,jo]};function Io(e,t,n,r,i,a,o,s,c=null){let l=t.P[n],u=t.P[r],d=t.P[i],f=K(U(u,l)),p=K(U(d,u)),m=Fo[c],h=m?ko(l,a,f,p,m[2](e,t),m[0],m[1]):a,g=h===a?0:K(U(h,a)),_=U(h,l),v=K(_),y=W(_,1/Math.max(v,1e-9)),b=io(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=q(U(o,W(y,G(o,y)))),w=H(l,H(W(y,x),W(C,S))),T=To(e,t,n,s);xo(e,t,n,l.slice(),mo(U(u,l),T,U(w,l),C));let E=To(e,t,r,s),D=H(l,W(y,b));return xo(e,t,r,t.P[r].slice(),mo(U(t.P[i],t.P[r]),E,U(D,t.P[r]),C)),g||v-b}function Lo(e,t,n,r,i,a=null){let o=e.index[`${n}Foot`],s=e.index[`${n}ToeBase`],c=U(e.restWorldPos[s],e.restWorldPos[o]),l=a?Y(a.R,Y(Z(r-a.yaw),Y(lo(i),c))):Y(Z(r),Y(lo(i),c)),u=a?Y(a.R,[0,1,0]):[0,1,0];xo(e,t,o,t.P[o].slice(),mo(U(t.P[s],t.P[o]),To(e,t,o,[0,1,0]),l,u));let d=e.index[`${n}Toe_End`];if(!a&&i>0&&d!==void 0){let n=U(t.P[d],t.P[s]),r=[n[0],0,n[2]];K(r)>1e-6&&xo(e,t,s,t.P[s].slice(),mo(n,[0,1,0],r,[0,1,0]))}}function Ro(e,t,n){let r=e.index[`${n}Hand`],i=e.index[`${n}HandMiddle1`],a=q(U(t.P[i],t.P[r])),o=U(t.P[e.index[`${n}HandIndex1`]],t.P[e.index[`${n}HandPinky1`]]);return o=q(U(o,W(a,G(o,a)))),{d:a,l:o,n:no(a,o)}}function zo(e,t,n,r){let i=e.index[`${n}Arm`],a=e.index[`${n}Hand`],o=fo(U(t.P[a],t.P[i]),r);xo(e,t,i,t.P[i].slice(),o),xo(e,t,a,t.P[a].slice(),X(o))}function Bo(e,t,n,r,i){if(!r&&!i)return;let a=e.index[`${n}Hand`],o=e.index[`${n}ForeArm`],s=q(U(t.P[a],t.P[o])),{l:c}=Ro(e,t,n),l=q(U(c,W(s,G(c,s))));xo(e,t,a,t.P[a].slice(),fo(l,io(i,-70,70))),xo(e,t,a,t.P[a].slice(),fo(s,io(r,-85,85)))}var Vo={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]}},Ho={spherical:{Index:9,Middle:2,Ring:-5,Pinky:-12}};function Uo(e,t,n){let r=Vo.relaxed;return r[t][n]+Object.entries(e??{}).reduce((e,[i,a])=>e+(a||0)*((Vo[i]?.[t]?.[n]??r[t][n])-r[t][n]),0)}var Wo=(e,t)=>Vo.fist[e][t];function Go(e,t,n,r){let i=n===`Left`?-1:1,a=(e,t)=>Uo(r,e,t);for(let i of[`Index`,`Middle`,`Ring`,`Pinky`]){let a=Object.entries(r??{}).reduce((e,[t,n])=>e+(n||0)*(Ho[t]?.[i]??0),0),o=e.index[`${n}Hand${i}1`];a&&o!==void 0&&xo(e,t,o,t.P[o].slice(),fo(Ro(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}=Ro(e,t,n),u=r===`Thumb`&&o===0?l:c;xo(e,t,s,t.P[s].slice(),fo(u,i*a(r,o)))}let o=[0,1,2,3].map(e=>Object.entries(r??{}).reduce((t,[n,r])=>t+(r||0)*(Ko[n]?.[e]??0),0));o.some(Boolean)&&qo(e,t,n,o)}var Ko={fist:[-70,-5,5,80],grip:[-30,-30,30,10],spherical:[-40,-20,20,10]};function qo(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}=Ro(e,t,n);xo(e,t,c(1),t.P[c(1)].slice(),fo(l,s*r)),xo(e,t,c(1),t.P[c(1)].slice(),fo(u,i));for(let[n,r]of[[2,a],[3,o]]){let i=q(no(q(U(t.P[c(n+1)],t.P[c(n)])),u));xo(e,t,c(n),t.P[c(n)].slice(),fo(i,s*r))}}var Jo=(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]],Yo=e=>[-e[0],-e[1],-e[2],e[3]],Xo=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3];function Zo(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 Qo(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 $o(e){let t=Math.hypot(e[0],e[1],e[2]);if(t<1e-12)return Zo([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 es=(e,t)=>Jo(Jo(e,[t[0],t[1],t[2],0]),Yo(e)).slice(0,3);function ts(e,t){let n=1+e[0]*t[0]+e[1]*t[1]+e[2]*t[2];if(n>1e-9)return Zo([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 ns=(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)]},rs=(e,t,n)=>Jo(e,$o(Qo(Jo(Yo(e),t)).map(e=>e*n))),is={"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)},as=new Map;function os(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 ss(e){return as.has(e)||as.set(e,os(is[e])),as.get(e)}function cs(){return Promise.all(Object.entries(is).map(async([e,t])=>{if(as.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();as.has(e)||as.set(e,r)}))}var ls=.1,us=new Map;function ds(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 fs(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 ps(e){if(!is[e.model])return null;if(us.has(e.model))return us.get(e.model);let t=ss(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:ds(r.data),centre:a,reach:K(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,fs(e,+t)]))};return us.set(e.model,i),i}function ms(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 ls;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 hs=new WeakMap;function gs(e,t){let n=hs.get(t);return n||(n=e.grids.map(e=>H(t.P[e.b],Y(t.R[e.b],e.centre))),hs.set(t,n)),n}function _s(e,t,n,r=null){let i=ls,a=-1,o=gs(e,t);return e.grids.forEach((s,c)=>{if(r?.has(s.b)||K(U(n,o[c]))-s.reach>i)return;let l=ms(e,s,Y(X(t.R[s.b]),U(n,t.P[s.b])));l<i&&(i=l,a=s.b)}),{d:i,bone:a}}function vs(e,t,n,r=null,i=.01){let a=[0,1,2].map(a=>{let o=[0,0,0];return o[a]=i,_s(e,t,H(n,o),r).d-_s(e,t,U(n,o),r).d}),o=K(a);return o>1e-9?W(a,1/o):null}var ys=e=>/^(Left|Right)Arm$/.test(e)?.5:/^(Left|Right)UpLeg$/.test(e)?.3:0,bs=(e,t)=>/Hand$/.test(e.names[t])?e.index[e.names[t].replace(/Hand$/,`HandMiddle1`)]:e.children[t][0];function xs(e,t,n,r){let i=e.radii[r],a=bs(t,r);if(!i||a===void 0)return[];let o=n.P[r],s=U(n.P[a],o),c=ys(t.names[r]);return i.filter(([e])=>e>=c).map(([e,t])=>({p:H(o,W(s,e)),r:t,t:e}))}var Ss=/^(Spine\d?|Neck|Head)$/,Cs=(e,t)=>e.children[t].find(t=>Ss.test(e.names[t]))??bs(e,t),ws=.25;function Ts(e,t,n,r,i,a=null){let o=_s(e,n,r,a);if(o.d>=i||o.bone<0)return r;let s=n.P[o.bone],c=Cs(t,o.bone),l=U(c===void 0?s:n.P[c],s),u=U(r,H(s,W(l,G(l,l)>1e-9?io(G(U(r,s),l)/G(l,l),0,1):0))),d=K(u)>1e-4?W(u,1/K(u)):vs(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=>_s(e,n,H(r,W(d,t)),f).d>=i,m=0,h=.02;for(;!p(h)&&h<ws;)m=h,h=Math.min(ws,h*2);for(let e=0;e<10;e++){let e=(m+h)/2;p(e)?h=e:m=e}return H(r,W(d,h))}var Es=.03;function Ds(e){let t=ps(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 Os(e,t,n,r,i,a){let o=0,s=ys(t.names[r]);for(let[t,c]of e.radii[r]??[]){if(t<s)continue;let{d:l,bone:u}=_s(e,n,H(i,W(U(a,i),t)),e.skip.get(r));u>=0&&(o=Math.max(o,c-l))}return o}function ks(e,t,n,r){let i={depth:0,p:null,into:-1};for(let a of xs(e,t,n,r)){let{d:t,bone:o}=_s(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 As={twist:[-85,85],flex:[-70,70],dev:[-35,20]},js={twist:[-50,50],flex:[-40,40],dev:[-25,15]},Ms=.5,Ns=[0,0,-1],Ps=72,Fs=.02,Is=400,Ls=.5,Rs=100/(180/Math.PI),zs=180/Math.PI,Bs=70,Vs=30,Hs=2;function Us(e,t=8,n=400){let r=0;for(let i of[`twist`,`flex`,`dev`]){let a=e[i],o=a>=0?js[i][1]:-js[i][0],s=a>=0?As[i][1]:-As[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 Ws(e,t){let n=q(U(t,e)),r=Math.acos(io(-n[1],-1,1))*zs;return Hs*(Math.max(0,r-Bs)/Vs)**2}function Gs(e,t,n,r){let i=ho(J(t,X(e)));i[3]<0&&(i=i.map(e=>-e));let a=2*Math.atan2(G([i[0],i[1],i[2]],n),i[3]),o=$o(W(n,a)),s=Qo(Jo(i,Yo(o))),c=Y(go(o),r),l=q(U(c,W(n,G(c,n)))),u=no(n,l);return{twist:a*zs,flex:G(s,l)*zs,dev:G(s,u)*zs,axF:l,axD:u}}function Ks(e,t=0){let n=0;for(let[r,[i,a]]of Object.entries(As)){let o=(e[r]-(i+a)/2)/((a-i)/2),s=Math.max(0,Math.abs(o)-1+t);n+=o*o+Is*s*s}return n}function qs(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=K(U(t.P[d],p)),h=K(U(t.P[f],t.P[d])),g=U(ko(p,i,m,h,Ao(e,t)),p),_=K(g),v=W(g,1/Math.max(_,1e-9)),y=io(_,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=>U(e,W(v,G(e,v))),C=q(K(S(a))>1e-6?S(a):no(v,Math.abs(v[1])<.9?[0,1,0]:[1,0,0])),w=no(v,C),T=H(p,W(v,y)),E=e.restWorldRot,D=Y(X(E[d]),U(e.restWorldPos[f],e.restWorldPos[d])),O=Y(X(E[d]),o),k=J(X(E[d]),E[f]),ee=Y(X(t.R[f]),Ro(e,t,n).l),A=e=>{let t=H(W(C,Math.cos(e)),W(w,Math.sin(e))),n=U(T,H(p,H(W(v,b),W(t,x)))),i=J(mo(D,O,n,t),k),a=Gs(i,r,q(n),Y(i,ee)),o=Math.abs(Math.atan2(Math.sin(e),Math.cos(e)))/Rs,l=H(p,H(W(v,b),W(t,x)));return{pv:t,need:a,elbow:l,cost:(c?Us(a)+Ws(p,l):Ks(a,s))+Ls*(1-Math.cos(e))+Is*Math.max(0,o-1)**2}},te=e=>K(S(e))>1e-6?Math.atan2(G(e,w),G(e,C)):0;return{at:A,angleOf:te,softmin:()=>{let e=Array.from({length:Ps},(e,t)=>A(2*Math.PI*t/Ps)),t=Math.min(...e.map(e=>e.cost)),n=e.reduce((e,n)=>H(e,W(n.pv,Math.exp(-(n.cost-t)/Fs))),[0,0,0]);return K(n)>.001?te(n):2*Math.PI*e.findIndex(e=>e.cost===t)/Ps},miss:Math.max(0,_-y)}}function Js(e,t,n,r,i,a,o,{toward:s,w:c=1,margin:l=0,comfort:u=!1}={}){let d=qs(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 Ys=3,Xs=1,Zs=.005,Qs=.15,$s=4,ec=(e,[t,n])=>Math.min(n,Math.max(t,e));function tc(e,t,n,r,i,a){let o=W(U(t.P[r],t.P[i]),1/K(U(t.P[r],t.P[i]))),s=J(t.R[i],J(X(e.restWorldRot[i]),e.restWorldRot[r])),{axF:c,axD:l,...u}=Gs(s,a,o,Y(J(s,X(t.R[r])),Ro(e,t,n).l)),d=Object.fromEntries(Object.entries(u).map(([e,t])=>[e,ec(t,As[e])])),f=J(J(fo(H(W(c,d.flex),W(l,d.dev)),Math.hypot(d.flex,d.dev)),fo(o,d.twist)),s);return xo(e,t,i,t.P[i].slice(),fo(o,Ms*d.twist)),xo(e,t,r,t.P[r].slice(),J(f,X(t.R[r]))),u}function nc(e,t,n){let r=e.index,i=r[`${n}Arm`],a=U(t.P[r[`${n}ForeArm`]],W(H(t.P[i],t.P[r[`${n}Hand`]]),.5));return K(a)>Zs?a:To(e,t,i,Ns)}function rc(e,t,n,r,i,a,o){let s=e.index[`${n}Hand`],c=J(X(t.R[s]),i.R),l=Y(X(t.R[s]),U(i.pos,t.P[s])),u=go(rs(ho(t.R[s]),ho(J(r.R,X(c))),a)),d=t.P[s].slice(),f=e=>U(r.pos,Y(e,l));return{goal:u,plane:nc(e,t,n),wristAt:o===`wrist`?()=>d:o===`palm`?f:e=>H(d,W(U(f(e),d),a))}}function ic(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}=rc(e,t,n,r.palm,r.measure(t),d,r.pin),h=Js(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<Ys;r++){let a=m(r?t.R[u]:f);_=No(e,t,n,a),g=Io(e,t,c,l,u,a,h.pole,i,`elbow`),v=tc(e,t,n,u,l,f)}a[`hold_${o}`]={w:d,miss:Math.max(0,g),...v,swivel:cc(t,c,l,u,p),..._>145?{fold:_}:{},...r.second?{second:r.second}:{}},a[`arm_miss_${o}`]*=1-d}function ac(e,t,n,r){let{goal:i,plane:a,wristAt:o}=rc(e,t,n,r.palm,r.measure(t),r.w);return qs(e,t,n,i,o(i),a,Ns,0,r.comfort)}function oc(e,t,n,r,i,{shoulder:a=!1}={}){let{goal:o,plane:s,wristAt:c}=rc(e,t,n,r,i,1),l=c(o),u=Js(e,t,n,o,l,s,Ns,{margin:Qs}),d=e.index,f=t.P[d[`${n}Arm`]],p=K(U(t.P[d[`${n}ForeArm`]],f)),m=K(U(t.P[d[`${n}Hand`]],t.P[d[`${n}ForeArm`]])),h=Math.max(0,Do(p,m,145)-K(U(l,f))),g=a?Js(e,t,n,o,l,s,Ns,{comfort:!0}):u;return(a?Us(g.need)+Ws(f,g.elbow)+sc(e,t,n,f,g.elbow,l):u.cost)+Xs*((u.miss*100)**2+(h*100)**2)}function sc(e,t,n,r,i,a){let o=ps(e),s=e.index;return o?$s*(Math.max(Os(o,e,t,s[`${n}Arm`],r,i),Os(o,e,t,s[`${n}ForeArm`],i,a))*100)**2:0}function cc(e,t,n,r,i){let a=q(U(e.P[r],e.P[t])),o=e=>U(e,W(a,G(e,a)));return _o(o(U(e.P[n],e.P[t])),o(i))}var lc=[[`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]]})],uc=(e,t,n=9)=>Array.from({length:n},(r,i)=>H(e,W(U(t,e),i/(n-1))));function dc(e,t){let n=Y(X(t.R),U(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 K([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 fc(e,t,n,r){let i=1/0,a=U(r,n),o=G(a,a);for(let r of uc(e,t)){let e=o<1e-12?0:io(G(U(r,n),a)/o,0,1);i=Math.min(i,K(U(r,H(n,W(a,e)))))}return i}function pc(e,t,n){let r=wo(t,e.index.Head,e.landmarks.headCentre),i=t.R[e.index.Head],a=Y(X(i),U(n,r)),o=e.landmarks.headRadii;return(1-K([a[0]/o[0],a[1]/o[1],a[2]/o[2]]))*Math.min(...o)}var mc=e=>Math.round(e.restWorldPos[e.index.LeftFoot][1]*1e3)/1e3,hc=(e,t,n,r)=>r?wo(t,n,Y(X(e.restWorldRot[n]),[0,-r,0])):t.P[n];function gc(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:wo(t,o,Y(X(e.restWorldRot[o]),U(l,i[o]))),ball:hc(e,t,s,a.ball),tip:hc(e,t,c,a.tip)}}function _c(e,t){let n=Y(X(t.R),U(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=K(i);return Y(t.R,a>1e-12?W(i,1/a):[0,1,0])}var vc=.05;function yc(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)<=vc*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 bc=(e,t)=>{let n=Y(X(e.R),U(t,e.pos));return n[1]-=e.half[1],n},xc=e=>H(e.pos,Y(e.R,[0,e.half[1],0]));function Sc(e,t){let n=yc(e);if(n.kind===`sphere`)return K(U(t,xc(e)))-n.r;if(n.kind===`cylinder`){let r=bc(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 dc(t,e)}function Cc(e,t){let n=yc(e);if(n.kind===`sphere`){let n=U(t,xc(e)),r=K(n);return r>1e-12?W(n,1/r):Y(e.R,[0,1,0])}if(n.kind===`cylinder`){let r=bc(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:H(W(s,Math.max(a,0)),W(c,Math.max(o,0)));let u=K(l);return Y(e.R,u>1e-12?W(l,1/u):s)}return _c(t,e)}function wc(e,t){return U(t,W(Cc(e,t),Sc(e,t)))}function Tc(e,t,n,r){let i=-1/0;for(let a of uc(t,n))i=Math.max(i,r-Sc(e,a));return i}var Ec=.022,Dc=.012,Oc=.04,kc=.15,Ac=12,jc=(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&&Mc(n,r));function Mc(e,t){let n=Object.entries(e?.objects??{}).filter(([e,n])=>e===t||n.ancestors?.includes(t));return n.length===1&&yc(n[0][1]).kind!==`box`}var Nc=new WeakMap;function Pc(e,t,n,r,i,a){Nc.has(n)||Nc.set(n,new Map);let o=Nc.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=Zh[c.hand],u=bo(e),d=xg(e,t,u,{prop:i.prop},!0),f=e=>Y(X(d.R),U(e,d.pos)),p=t=>f(u.P[e.index[`${l}${t}`]]),m=[[p(`Hand`),p(`HandMiddle1`),Ec],[p(`HandIndex1`),p(`HandPinky1`),Dc]],h=Fc(n,r),g=Object.entries(n.objects).filter(([e,t])=>e===r||t.ancestors?.includes(r)),_=[0,1,0],v=e=>{let t={pos:H(a.pos,W(_,e)),R:a.R},n=-1/0;for(let[,e]of g){let r={...e,...Sg(t,Cg(h,e))};for(let[e,t,i]of m)n=Math.max(n,Tc(r,e,t,i))}return n},y=v(0),b=c.hand===`l`?1:-1,x=y>-.002,S=0,C=x?kc:Oc,w=x?b:-b;if(x||v(w*C)>-.002)for(let e=0;e<Ac;e++){let e=(S+C)/2;v(w*e)>-.002===x?S=e:C=e}else S=0;let T={pos:H(a.pos,W(_,w*(x?C:S))),R:a.R};return o.set(s,T),T}function Fc(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 Ic(e,t){let n=Math.min(1,Math.max(0,(t-e)/4));return n*n*(3-2*n)}var Lc=(e,t,n)=>({pos:H(e.pos,W(U(t.pos,e.pos),n)),R:t.R}),Rc=[`schema`,`fps`,`frames`,`label`,`keys`,`anchors`,`props`,`fits`,`objects`,`generators`,`checks`,`fix`,`use`,`channels`,`detourRadius`,`search`,`goals`,`flow`,`idle`],zc=[`f`,`set`,`step`,`src`],Bc=[`skill`,`args`,`f0`],Vc={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`]},Hc=[`hand`,`origin`,`points`],Uc=[`side`,`anchor`,`effector`,`offset`,`orient`],Wc={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`]},Gc=[`at`,`onto`,`bounce`,`tumble`,`v`],Kc=[`f`,`pos`,`rot`,`aim`,`roll`,`lean`],qc=[`type`,`f0`,`steps`,`step`,`period`,`swing`,`halfWidth`,`lift`,`heading`,`turnDistance`,`pelvisHigh`,`pelvisLow`,`firstStep`,`armSwing`,`vary`],Jc=[`contacts`,`orient`,`below`,`clearance`,`appear`,`supports`,`allow`,`limits`,`mouthPoints`],Yc={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`]},Xc=[`name`,`near`,`above`,`moved`,`still`,`speed`,`tol`,`by`,`at`,`mode`,`after`,`before`],Zc=[`name`,`distance`,`position`,`frames`,`every`],Qc=[`joint`,`bone`,`prop`,`anchor`,`landmark`,`object`,`person`],$c=[`essentials`,`spec`,`skills`,`anchors`,`props`,`objects`,`checks`,`goals`,`probes`,`channels`,`refs`,`fix`,`examples`],el=e=>e.flatMap(e=>[`${e}_l`,`${e}_r`]),tl=new Set([`root`,...el([`foot`,`knee`,`hand`,`elbow`])]),nl=new Set(el([`knee`,`elbow`])),rl=new Set([`yaw`,`pitch`,`roll`,`spine_yaw`,`spine_pitch`,`spine_roll`,`head_yaw`,`head_pitch`,`head_roll`,`arm_rest`,`arm_hang`,...el([`fyaw`,`fpitch`,`armw`,`wtwist`,`wflex`,`aswing`,`abend`])]),il=new Set(el([`fingers`])),al=new Set([`arm_hang`]),ol=[`relaxed`,`fist`,`grip`,`cigarette`,`point`,`spherical`],sl=[`power`,`pinch`,`hook`,`palm`,`spherical`],cl={power:`grip`,pinch:`cigarette`,hook:`grip`,palm:`relaxed`,spherical:`spherical`},ll={power:[0,0,.02],hook:[0,0,.02],pinch:[.025,0,.01],palm:[-.045,0,.015],spherical:[-.015,0,.035]},ul=[[/^(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`]],dl=e=>ul.find(([t])=>t.test(e))??null,fl={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)`},pl={root:fl.root,yaw:`deg; ${fl.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:fl.foot,fyaw:fl.fyaw,fpitch:`toe-down pitch, degrees, + heel up`,knee:`knee pole, ${fl.pole}`,armw:`0 = FK arm, 1 = IK to hand_* / the anchors`,hand:fl.hand,elbow:`elbow pole, ${fl.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 }`},ml=e=>e.replace(/_[lr]$/,``),hl=[[[`frames`,`when`,`range`,`f`,`from`,`within`,`during`,`at`],[`when`,`frames`,`at`,`f`]],[[`max`,`maxDist`,`distance`,`tolerance`,`limit`],[`tol`,`min`]]];function gl(e,t){for(let[n,r]of hl){let i=n.includes(e)&&r.find(n=>t.includes(n)&&n!==e);if(i)return`; did you mean "${i}"?`}return yl(e,t,Math.max(2,Math.floor(e.length/3)))}var _l=e=>Array.isArray(e)&&e.length===3&&e.every(Number.isFinite),Q=e=>JSON.stringify(e)?.slice(0,60);function vl(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 yl(e,t,n=Math.max(3,Math.floor(e.length/3))){let r=null,i=1/0;for(let n of t){let t=vl(e,n);t<i&&(r=n,i=t)}return r&&i<=n?`; did you mean "${r}"?`:``}var bl={pelvis:`Hips`,hip:`Hips`,hips:`Hips`,root:`Hips`,chest:`Spine2`,upperchest:`Spine2`,torso:`Spine1`,belly:`Spine`,abdomen:`Spine`,neck:`Neck`,head:`Head`},xl={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`},Sl={l:`Left`,left:`Left`,r:`Right`,right:`Right`},Cl=e=>e.toLowerCase().replace(/[\s_.-]+/g,``);function wl(e,t){let n=t.toLowerCase();return e.names.find(e=>e.toLowerCase()===n)??null}function Tl(e,t){let n=Cl(t);if(bl[n])return wl(e,bl[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?wl(e,`${Sl[o]}${xl[Cl(s)]??Cl(s)}`):null}function El(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=wl(e,t)??wl(e,n)??Tl(e,n);return r?{bone:r,hint:``}:{bone:null,hint:yl(n,e.names)}}function Dl(e,t,n,r){return!t||t.index[r]!==void 0||(e(`${n} names unknown bone "${r}"${yl(String(r),t.names)}`),!1)}function Ol(e,t,n,r,{groups:i=!1}={}){let a=Object.keys(t?.objects??{});if(!a.length||a.includes(r))return!0;let o=_h(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`):t?.others?.[r]?e(`${n} names "${r}", a ${t.others[r].renderer??`record`} with no body (no size to stand on, hold or hit); name a scene body${yl(String(r),a)}`):e(`${n} names object "${r}", which is not in the scene${yl(String(r),[...new Set([...a,...a.flatMap(e=>t.objects[e].ancestors??[]),...Object.keys(t.others??{})])])}`),!1)}function kl(e,t,n,r,i){let[a,o]=String(i).split(/:(.*)/s);if(a===`joint`)return Dl(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 Al=new Set([`empty`,`plane`,`cutout`]);function jl(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 Ml=e=>({pos:[e.x??0,e.y??0,e.z??0],R:J(lo(e.rotX??0),J(Z(e.rot??0),uo(e.rotZ??0)))}),Nl=new WeakMap;function Pl(e){let t=e?.objects??{};if(Nl.has(t))return Nl.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 Nl.set(t,n),n}function Fl(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=to(i),a=jl(i,r);if(Al.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,...Ml(i),half:[e.width/2,e.height/2,e.depth/2],ancestors:a.map(e=>e.id),...a.length?{ancestorPoses:a.map(Ml)}:{},...i.glow?{glow:!0}:{},...i.grasp?{grasp:i.grasp}:{}}}return{objects:t,groups:Pl({objects:t}),others:n}}var Il={"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}}}},Ll=new Map;function Rl(e){return Il[e]?(Ll.has(e)||Ll.set(e,yo(Il[e])),Ll.get(e)):null}var zl=new WeakMap,Bl=e=>Math.round(e*1e5)/1e5;function Vl(e,t){let n=JSON.stringify(t),r=zl.get(e);if(r?.key===n)return r.value;let i=Rl(e.rig),a=e.bones.length,o=e.frameCount,s=i.names,c=s.length,l=s.map(t=>e.bones.indexOf(t)),u=Z(t.yaw),d=new Float64Array(o*c*3);for(let n=0;n<o;n++){let r=Co(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(H(t.position,Y(u,r.P[e])).map(Bl),(n*c+e)*3)}let f={rig:e.rig,frames:o,names:s,P:d};return zl.set(e,{key:n,value:f}),f}function Hl(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||!Rl(e.rig)||(r[i.id]={name:i.subject||i.name||i.id,...Vl(e,{position:[i.x??0,i.y??0,i.z??0],yaw:i.rot??0})})}return r}function Ul(e,t,n,r){let i=e?.people?.[t];if(!i)return null;let a=i.names.indexOf(El(Rl(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 Wl=e=>Object.entries(e?.people??{}).map(([e,t])=>`${e} (${t.name})`).join(`, `)||`none: no other character has an installed take`;function Gl(e,t){let n=new Map,r=(t,r)=>{let i=e?.people?.[t],a=i&&El(Rl(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 Kl=.045,ql=[[1,0,0],[0,1,0],[0,0,1]],Jl=(e,t)=>U(e,W(t,G(e,t)));function Yl(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]<Kl)?t:-1}var Xl=(e,t)=>e===`cylinder`&&!!t&&t[1]<Kl&&Math.min(t[0],t[2])>=Kl&&Math.abs(t[0]-t[2])<.1*t[0],Zl=(e,t)=>e?.objects?.[t]?.grasp??e?.others?.[t]?.grasp??null;function Ql(e,t){let n=[],r=(t,r)=>Object.entries(Zl(e,t)??{}).forEach(([e,i])=>n.push({...i,name:r+e,owner:t}));r(t,``);for(let i of _h(e,t)){i!==t&&r(i,`${i}.`);let{half:a,renderer:o}=e.objects[i],s=Yl(a);s>=0?n.push({name:i,owner:i,at:[0,a[1],0],axis:ql[s],radius:Math.min(...a.filter((e,t)=>t!==s))}):Xl(o,a)&&n.push({name:i,owner:i,at:[0,a[1],0],rim:a[0],normal:ql[1]})}return n}var $l=(e,t,n)=>Ql(e,t).find(e=>e.name===n);function eu(e,t){let n=e=>e?q(Y(t.R,e)):void 0;return{p:H(t.pos,Y(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 tu(e,t){let n=Jl(U(t,e.p),e.normal),r=K(n)>1e-6?q(n):q(Jl(Math.abs(e.normal[1])<.9?[0,1,0]:[1,0,0],e.normal));return{p:H(e.p,W(r,e.rim)),axis:q(no(e.normal,r))}}function nu(e,t){let n;for(let r of e){let e=Y(X(r.R),U(t,H(r.pos,Y(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:W([r.R[0][a],r.R[1][a],r.R[2][a]],e[a]<0?-1:1)})}return n?.n}function ru(e,t){let n=U(t,e.p);return e.rim?Math.hypot(G(n,e.normal),K(Jl(n,e.normal))-e.rim):K(e.axis?Jl(n,e.axis):n)}function iu(e,t,n,r,i=0){let a=e===`Right`,o=e=>a?e:W(e,-1);if(t.axis&&n!==`palm`&&!(t.from&&K(Jl(t.axis,t.from))<.001)){if(t.from){let e=o(t.from),n=q(Jl(t.axis,e)),i=n=>t.thumb?G(n,t.thumb):G(no(n,e),r),a=i(n)>=i(W(n,-1))?n:W(n,-1);return ou(no(a,e),a,e)}let e=au(r,t.axis),n=Y(Z(i),[a?1:-1,0,0]),s=Math.abs(e[1]),c=t.thumb??Jl(H(W([0,1,0],1-s),W(n,s)),e),l=q(Jl(t.axis,e)),u=G(l,c)>=0?l:W(l,-1);return ou(e,u,no(e,u))}let s=o(t.from??W(r,-1)),c=au(r,s);return ou(c,no(s,c),s)}function au(e,t){let n=Jl(e,t);return q(K(n)>.001?n:Jl(Math.abs(t[1])<.9?[0,1,0]:[1,0,0],t))}var ou=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]];function su(e,t){let n=Zh[t],r=e.restWorldPos,i=e.index;return K(U(r[i[`${n}ForeArm`]],r[i[`${n}Arm`]]))+K(U(r[i[`${n}Hand`]],r[i[`${n}ForeArm`]]))}var cu=new Set([`body`]);function lu(e,t,n,r,i,a){let o=e.spec.anchors?.[t];if(!o)throw Error(`MOTION_SPEC_INVALID: unknown anchor "${t}"`);let s=hu(e,o,t,n,r,i,a),c=cu.has(o.kind)&&e.keepOut;return c?Ts(c.body,e.sk,n,Ts(c.body,e.sk,n,s,Es,c.skip),Es,c.skip):s}var uu=[`r`,`l`],du={l:`left`,r:`right`};function fu(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]??Pl(e.scene)[t.object],l=e.objectPose&&s!==void 0?e.objectHand(t.object,s):null;if(o&&l&&uu.indexOf(l)>uu.indexOf(o))throw Error(`MOTION_SPEC_INVALID: anchor "${n}" is on "${t.object}", which the ${du[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():mu(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 pu=16;function mu(e,t,n,r,i){if((e.nest??0)>=pu)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 hu(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 H(a.root??r.P[c.Hips],Y(Z(a.yaw??0),t.p));case`bone`:return H(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=>H(H(e,W(U(n,e),t)),i);if(!t.reach)return a(t.t??.5);let o=r.P[c[`${Zh[t.reach]}Arm`]],l=.95*su(s,t.reach);for(let e=t.t??.45;e>=(t.tMin??.15);e-=.01)if(K(U(a(e),o))<=l)return a(e);return a(t.tMin??.15)}case`object`:{if(t.grasp&&t.local===void 0)return _u(e,n,r,i,a,o).p;let s=fu(e,t,n,{s:r,diag:i,c:a},o);return H(s.pos,Y(s.R,t.local??[0,0,0]))}case`landmark`:return wo(r,c.Head,s.landmarks[t.name]??(()=>{throw Error(`MOTION_SPEC_INVALID: unknown landmark "${t.name}"`)})());case`prop`:{let r=gu(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 H(r,t.offset??[0,0,0])}case`person`:{let r=Ul(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: ${Wl(e.scene)})`);return H(r,t.offset??[0,0,0])}default:throw Error(`MOTION_SPEC_INVALID: anchor "${n}" has unknown kind "${t.kind}"`)}}function gu(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(!hg(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=mu(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?H(c.pos,Y(c.R,Y(X(s.R),U(o,s.pos)))):null}function _u(e,t,n,r,i,a){let o=e.spec.anchors[t],s={s:n,diag:r,c:i},c=n=>fu(e,{...o,object:n},t,s,a),l=o.local&&(e=>H(e.pos,Y(e.R,o.local)))(c(o.object));if(e.sockets??=new Map,!e.sockets.has(t)){let r=Ql(e.scene,o.object),i=e.sk.index,s=l??n.P[i[a?`${Zh[a]}Arm`:`Hips`]],u=o.socket?$l(e.scene,o.object,o.socket):r.map(e=>({k:e,d:ru(eu(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?eu(u,c(u.owner)):{p:l??c(o.object).pos};if(u?.rim)d=vu(e,t,a,u,c(u.owner),d,l??n.P[e.sk.index[a?`${Zh[a]}Arm`:`Hips`]]);else if(l)d.p=l;else if(d.axis&&d.radius>0){let t=Math.abs(ll[o.grasp]?.[2]??0),r=d.radius-t,i=n.P[e.sk.index[`${Zh[a]??`Right`}Arm`]],s=U(i,d.p),c=U(s,W(d.axis,G(s,d.axis)));r>1e-4&&K(c)>1e-6&&(d.p=H(d.p,W(q(c),r)))}return!d.axis&&!d.from&&(d.from=nu(_h(e.scene,o.object).map(t=>({...c(t),half:e.scene.objects[t].half})),d.p)),d}function vu(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=tu(a,o),n=e=>Y(X(i.R),e);e.rims.set(s,{at:n(U(t.p,i.pos)),axis:n(t.axis)})}return eu(e.rims.get(s),i)}function yu(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=Ro(i,n,Zh[t]),s=W(o.origin.map(e=>n.P[i.index[e]]).reduce((e,t)=>H(e,t),[0,0,0]),1/o.origin.length),c={};for(let[t,[n,r,i]]of Object.entries(o.points??{}))c[t]=H(s,H(W(e.d,n),H(W(e.l,r),W(e.n,i))));c.origin=s,c.axes=e,(r.props??={})[a]=c}}var bu={joint:`joint:<Bone>`,bone:`bone:<Bone>`,prop:`prop:<prop>.<point>`,anchor:`anchor:<name>`,landmark:`landmark:mouth`,object:`object:<id>[.center|.top|.base|.rim]`,person:`person:<id>.<Bone>`};function xu(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|rim)$/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 Su(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=H(t.pos,Y(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 Cu(e){let t=(e??[]).map(e=>({o:H(e.pos,Y(e.R,[0,2*e.half[1],0])),n:[e.R[0][1],e.R[1][1],e.R[2][1]],r:Math.min(e.half[0],e.half[2])}));return t.length?t.reduce((e,t)=>t.o[1]>e.o[1]?t:e):null}function wu(e,t){let n=U(t,e.o),r=n[0]*e.n[0]+n[1]*e.n[1]+n[2]*e.n[2],i=U(n,e.n.map(e=>e*r)),a=K(i);return a>1e-6?H(e.o,i.map(t=>t*e.r/a)):e.o}function Tu(e,t,n){let r=e.frames?.[t-(e.f0??0)],i=xu(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}=El(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]?lu(e.ctx,i.name,a,{...o,frame:t},s):null;case`landmark`:return c.landmarks?.[i.name]?wo(a,c.index.Head,c.landmarks[i.name]):null;case`object`:{let n=Nh(e,i.name,t);return n?i.point===`rim`?Cu(n).o.slice():Su(n,i.point):null}case`person`:return Ul(e.ctx.scene,i.name,i.point,t);default:return null}}function Eu(e,t,n,r){let i=e=>{let t=xu(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=Tu(e,t,a[0]),r=Nh(e,a[1].name,t);return n&&r?Math.max(0,Math.min(...r.map(e=>dc(n,e)))):null}let o=[n,r].map(e=>{let t=xu(e);return t?.kind===`object`&&t.point===`rim`?t:null});if(o[0]||o[1]){let[i,a]=o[0]?[o[0],r]:[o[1],n],s=Tu(e,t,a),c=Cu(Nh(e,i.name,t));return s&&c?K(U(s,wu(c,s))):null}let s=Tu(e,t,n),c=Tu(e,t,r);return s&&c?K(U(s,c)):null}function Du(e,{sk:t,scene:n},r,i=Qc){if(typeof r!=`string`||!r)return[];let a=r.replace(/\.(center|top|base|rim)$/,``),[o,s]=r.split(`.`),c=t&&(i.includes(`joint`)||i.includes(`bone`))?El(t,r).bone:null;return[i.includes(`object`)&&(n?.objects?.[a]||_h(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)}function Ou(e,t,n,r){let i=Du(e,t,n,r);return i.length?`; did you mean ${i.map(e=>`"${e}"`).join(` or `)}?`:``}function ku(e,t,{sk:n,scene:r},i,a,o=Qc){let s=xu(a),c=`${i} "${a}"`;if(!s||!o.includes(s.kind))return t(`${c} must be ${o.map(e=>bu[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?El(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${yl(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=!!Ul(r,s.name,s.point,0);return e||t(`${c}: no person "${s.name}" with joint "${s.point}" (people with an installed take: ${Wl(r)})`),e}return Ol(t,r,c,s.name,{groups:!0})}var Au=[0,1,0];function ju(e,t,n=`up`,r){if(Array.isArray(n))return q(n);if(n===`face`){let{sk:n}=e.ctx;return q(To(n,e.frames[t-(e.f0??0)].s,n.index.Head,[0,0,1]))}let i=n===`up`?null:Tu(e,t,n),a=i?U(i,r):Au;return K(a)>1e-9?q(a):Au}function Mu(e,t,n){let r=e.f0??0,i=Math.max(r,Math.min(r+e.frames.length-1,n)),a=Tu(e,i,t.follow);if(!a)return null;let o=go(ts(Au,ju(e,i,t.aim,a)));return{pos:H(a,Y(o,t.offset??[0,0,0])),R:o}}var Nu={spine:1,chest:2.5,head:3.5,aswing:3,abend:5,wrist:9.5,hand:0},Pu=6,Fu=6,Iu=24,Lu=[1.5,3],Ru=.5,zu=.2,Bu=.15,Vu={frames:8,min:6,frac:.08,max:3},Hu=/^(aswing|abend|wflex)_[lr]$/,Uu=/^use\[\d+\] (?!standIdle$)|\bwalk(To)? (start|step \d+|end)$/,Wu=e=>Uu.test(e?.src??``);function Gu(e){let t=/^(spine|chest|head)_(yaw|pitch|roll)$|^(aswing|abend|wflex|wtwist)_[lr]$|^(hand|armw|elbow)_[lr]$/.exec(e);return t?t[1]??(t[4]?`hand`:t[3]===`wflex`||t[3]===`wtwist`?`wrist`:t[3]):null}function Ku(e){let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619);let n=Math.imul(t>>>0^t>>>0>>>15,t>>>0|1);return n^=n+Math.imul(n^n>>>7,n|61),((n^n>>>14)>>>0)/4294967296*2-1}function qu(e,t,n){let r=e.length;for(let e=1;e<r;e++)t[e]=Math.min(t[e],t[e-1]+n(e-1));for(let e=r-2;e>=0;e--)t[e]=Math.min(t[e],t[e+1]+n(e));return t.some(e=>e>0)?{max:Math.max(...t),at(n){if(n<=e[0])return t[0];if(n>=e[r-1])return t[r-1];let i=0;for(;n>e[i+1];)i++;return t[i]+(t[i+1]-t[i])*(n-e[i])/(e[i+1]-e[i])}}:null}function Ju(e,t,n,r,i=null){let a=Gu(e);if(!a||!Nu[a]||!(n>0)||t.length<2)return null;let o=t.map(e=>e.f),s=o.length;return qu(o,o.map((e,r)=>Wu(t[r])||Wu(t[r+1])||i&&[o[r-1],e,o[r+1]].some(e=>e!==void 0&&i[e]<2)?0:Nu[a]*Math.min(1,(r<s-1?o[r+1]-e:Iu)/Iu)*n),e=>(t[e].value===t[e+1].value?Ru:zu)*(o[e+1]-o[e]))}function Yu(e,t,n,r,i=null){let a=new Map,o=[],s=(e,t)=>JSON.stringify(e)===JSON.stringify(t);for(let t of e){for(let e of t)(!a.has(e.f)||Wu(e))&&a.set(e.f,e);for(let e=1;e<t.length;e++)s(t[e-1].value,t[e].value)||o.push([t[e-1].f,t[e].f,t.weight])}let c=[...a.values()].sort((e,t)=>e.f-t.f);if(!(n>0)||c.length<2)return null;let l=c.map(e=>e.f),u=l.length,d=l.map((e,a)=>{if(e===0||Wu(c[a])||Wu(c[a+1])||i&&[l[a-1],e,l[a+1]].some(e=>e!==void 0&&i[e]<2))return 0;let o=Ku(`${r}|${e}`),s=Math.min(a<u-1?l[a+1]-e:Iu,a>0?e-l[a-1]:Iu);return(o<0?`l`:`r`)!==t||s<Fu?0:Math.min(Lu[0]+(Lu[1]-Lu[0])*Math.abs(o),s/3)*Math.min(1,n)}),f=e=>o.filter(([t,n])=>t<l[e+1]&&n>l[e]),p=e=>l[e+1]-l[e];return qu(l,d,e=>(f(e).length?f(e).some(e=>e[2])?0:Bu:Ru)*p(e))}var Xu=e=>e<=0||e>=1?0:64*(e*(1-e))**3;function Zu(e,t,n,r,i,a=()=>!0){if(!Hu.test(e)||!(r>0))return null;let o=[],s=t.map(e=>e.f);for(let c=1;c<s.length;c++){let l=n[c]-n[c-1],u=s[c+1];if(Math.abs(l)<1||Wu(t[c])||Wu(t[c-1])||u!==void 0&&n[c+1]!==n[c])continue;let d=Math.min(Vu.frames,.5*(s[c]-s[c-1]),u===void 0?1/0:.5*(u-s[c])),f=Math.sign(l)*Math.min(Vu.max*(d/Vu.frames)**2,Vu.frac*Math.abs(l))*Math.min(1,r);/^abend/.test(e)&&n[c]+f<0&&(f=Math.min(0,-n[c])),d>=Vu.min&&Math.abs(f)>.001&&s[c]+.75*d<=i&&a(s[c]-d/4,s[c]+.75*d)&&o.push([s[c]-d/4,d,f])}return o.length?e=>{let t=0;for(let[n,r,i]of o)t+=i*Xu((e-n)/r);return t}:null}function Qu(e,t){let n=Array(t).fill(1/0);for(let r=0,i=-1/0;r<t;r++)e.some(e=>e[r]>.001)&&(i=r),n[r]=r-i;for(let r=t-1,i=1/0;r>=0;r--)e.some(e=>e[r]>.001)&&(i=r),n[r]=Math.min(n[r],i-r);return n}function $u(e){let t={l:[],r:[]},n=Math.round(e?.frames??0);for(let r of Object.values(e?.objects??{})){let i=e.props?.[r?.prop]?.hand;Number.isFinite(r?.grab)&&t[i]&&t[i].push([r.grab,Number.isFinite(r.release)?r.release:n])}for(let n of e?.goals??[]){let e=Array.isArray(n?.at)?n.at:null;if(e?.length&&[`near`,`above`,`still`].some(e=>n[e]!==void 0)&&/hand/i.test(JSON.stringify(n)))for(let n of[`l`,`r`])t[n].push([e[0],e[e.length-1]])}return t}function ed(e,t,n,r=Pu){let i=new Uint8Array(n);for(let[t,r]of e)for(let e=Math.max(0,Math.floor(t));e<=Math.min(n-1,Math.ceil(r));e++)i[e]=1;for(let e of t)for(let t=0;t<n;t++)e[t]>.001&&(i[t]=1);return Qu([i],n).map(e=>Math.max(0,e-r))}function td(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 nd(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 rd=/^(spine|chest|head)_(yaw|pitch|roll)$|^(aswing|abend)_[lr]$/,id={spine:0,head:2,arms:3},ad=/^(hand|armw|elbow|aswing|abend|wflex|wtwist)_[lr]$/,od=.15,sd=6,cd=e=>/^(spine|chest|head)_/.test(e)?[`l`,`r`]:/^(aswing|abend|wflex|wtwist)_([lr])$/.test(e)?[e.slice(-1)]:[],ld=e=>/^(spine|chest)_/.test(e)?`spine`:/^head_/.test(e)?`head`:/^(aswing|abend)_[lr]$/.test(e)?`arms`:null;function ud(e,t=``,n={l:[],r:[]}){if(e===!1)return{smooth:!1,lag:{spine:0,head:0,arms:0},overlap:0,seed:t,hands:n};let r=e??{},i=r.lag===!1?0:r.lag,a=typeof i==`number`?{spine:i,head:i,arms:i}:{...id,...i??{}},o=r.overlap===!1?0:typeof r.overlap==`number`?r.overlap:1;return{smooth:r.smooth!==!1,lag:a,overlap:o,seed:t,hands:n}}function dd(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(sd,od*(o-a));for(let c=0;c<12;c++){let c=0;for(let s=1;s<16;s++){let l=nd([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 fd=e=>Array.isArray(e)?`vec`:e&&typeof e==`object`?`map`:`num`;function pd(e,t,n=ud()){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),src:t.src});let i=n.overlap??0,a=[...r];if(i>0)for(let[e,t]of r)/^spine_/.test(e)&&a.push([e.replace(`spine`,`chest`),t]);let o=new Map,s=new Map,c={},l={};if(i>0){for(let[e,t]of a)/^w_.+_[lr]$/.test(e)&&o.set(e,p(e,t));for(let e of[`l`,`r`])c[e]=ed(n.hands?.[e]??[],[...o].filter(([t])=>t.endsWith(`_${e}`)).map(([,e])=>e.frames),t);for(let e of[`l`,`r`])l[e]=Yu([...r].filter(([t])=>ad.test(t)&&t.endsWith(`_${e}`)).map(([e,t])=>Object.assign([...t],{weight:/^armw_/.test(e)})),e,i,n.seed??``,c[e]);for(let[e,t]of a)/^armw_[lr]$/.test(e)&&o.set(e,p(e,t))}let u=e=>{let n=cd(e).filter(e=>o.has(`armw_${e}`)),r=n.join(``);return n.length?(s.has(r)||s.set(r,Qu(n.map(e=>o.get(`armw_${e}`).frames),t)),s.get(r)):null},d={},f={};for(let[e,t]of a){let n=o.get(e)??p(e,t,u(e));d[e]=n.frames,n.plain&&(f[e]=n.plain)}for(let[e,t]of Object.entries(f)){let n=cd(e).map(e=>d[`armw_${e}`]).filter(Boolean);n.length&&(d[e]=d[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 d;function p(e,r,a=null){let o=[...new Map(r.map(e=>[e.f,e])).values()],s=fd(o[0].value),c=s===`vec`?o[0].value.length:0,u=s===`num`?[o.map(e=>e.value)]:s===`vec`?Array.from({length:c},(e,t)=>o.map(e=>e.value[t])):[...new Set(o.flatMap(e=>Object.keys(e.value)))].map(e=>({name:e,y:o.map(t=>t.value[e]??0)})),d=o.map(e=>e.f),f=n.smooth&&rd.test(e),p=n.lag[ld(e)]??0,m=s===`num`?Ju(e,o,i,n.seed??``,a):null,h=ad.test(e)?l[e.slice(-1)]:null,g=p+(m?.max??0),_=e=>m?Math.min(m.at(e),a?Ru*a[Math.round(e)]:1/0):0,v=(e,n)=>Math.min(1,(t-1-e)/(2*n)),y=e=>h?e-h.at(e)*v(e,h.max):e,b=e=>y(e)-(g>0?(p+_(e))*v(e,g):0),x=(e,n)=>{if(!a)return!0;for(let r=Math.max(0,Math.floor(e));r<=Math.min(t-1,Math.ceil(n+g));r++)if(a[r]<2)return!1;return!0},S=(n,r=!0)=>{let a=f&&r?dd(d,n):td(d,n),c=r&&s===`num`?Zu(e,o,n,i,t-1,x):null;return e=>{let t=r?b(e):y(e);for(let e=1;e<o.length;e++)if(o[e].step&&t>=d[e-1]&&t<d[e])return n[e-1];return nd(d,n,a,t)+(c?c(t):0)}},C=Array(t);if(s===`num`){let e=S(u[0]);for(let n=0;n<t;n++)C[n]=e(n)}else if(s===`vec`){let e=u.map(S);for(let n=0;n<t;n++)C[n]=e.map(e=>e(n))}else{let e=u.map(({name:e,y:t})=>[e,S(t)]);for(let n=0;n<t;n++)C[n]=Object.fromEntries(e.map(([e,t])=>[e,t(n)]))}if(!(s===`num`&&(f||g>0)&&cd(e).length))return{frames:C};let w=S(u[0],!1);return{frames:C,plain:Array.from({length:t},(e,t)=>w(t))}}}var md=(e,t)=>Object.fromEntries(Object.entries(e).map(([e,n])=>[e,n[t]])),hd=24,gd=360/hd,_d=.2,vd=12,yd=8,bd=e=>Math.round(e*1e5)/1e5,xd=(e,t)=>2*Math.acos(Math.min(1,Math.abs(Xo(e,t)))),Sd=(e,t,n)=>e.lean>0&&e.aim&&n>0?H(e.pos,W(U(q(e.aim),es(t,[0,1,0])),n)):e.pos;function Cd(e,t){let n=q(no(e,Math.abs(e[1])<.9?[0,1,0]:[1,0,0])),r=no(e,n),i=[e];for(let a of[t/2,t])for(let t=0;t<yd;t++){let o=2*Math.PI*t/yd,s=Math.min(a,45)*Math.PI/180,c=H(W(n,Math.cos(o)),W(r,Math.sin(o)));i.push(q(H(W(e,Math.cos(s)),W(c,Math.sin(s)))))}return i}function wd(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+_d*xd(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 Td(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<vd;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 Ed(e,t,n){let r=e.map((e,r)=>{if(e.aim===void 0)return{fixed:Zo(e.rot)};let i=Zo(t(r)),a=e=>{let t=Jo(ts(q(es(i,[0,1,0])),e),i);return n=>Jo(ns(e,n),t)};if(e.lean>0&&n)return{leans:Cd(q(e.aim),e.lean).map(a),roll:e.roll};let o=a(q(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:hd},(e,t)=>t*gd-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:hd},(r,i)=>{let a=i*gd-180,o=e.rolled(a);return{q:o,cost:n(t,o),r:a}})),o=wd(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(Td(e=>{let r=i.rolled(e),a=[s[t-1],s[t+1]].filter(Boolean);return n(t,r)+a.reduce((e,t)=>e+_d*xd(t.q,r)**2,0)},s[t].r-gd/2,s[t].r+gd/2))).map(bd);l&&Xo(r,l)<0&&(r=r.map(e=>-e)),c.push(r),l=Zo(r)}return c}var Dd=.25,Od=.3;function kd(e,t,n){if(!(t>0&&t<=Od))return e;let r=!1,i=e.keys.map(e=>!e.aim||e.lean!==void 0||e.roll!==void 0||!(ro(H(e.pos,W(q(e.aim),t)),n(e.f))<Dd)?e:(r=!0,{...e,lean:45,leaned:!0}));return r?{...e,keys:i}:e}var Ad=1e3,jd=4,Md=.03,Nd=.6,Pd=.05,Fd=45,Id=2,Ld=.05,Rd=10,zd=400,Bd=16,Vd=4,Hd=Array.from({length:72},(e,t)=>2*Math.PI*t/72-Math.PI);function Ud(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 Wd(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<jd&&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+Md),s=e(r,t-Md);n[r][2]=Math.max(Pd,(a+s-2*i)/(Md*Md)),o[r]=-(a-s)/(2*Md)});let s=a.map((e,n)=>t(n,e)),c=a.map((e,n)=>W(U(t(n,e+Md),t(n,e-Md)),1/(2*Md)));for(let e=0;e+2<i;e++){let t=[1,-2,1],i=H(U(s[e],W(s[e+1],2)),s[e+2]),a=r?2*Ad*r[e]:2*Ad;for(let r=0;r<3;r++){o[e+r]-=a*t[r]*G(i,c[e+r]);for(let i=0;i<3;i++)n[e+r][i-r+2]+=a*t[r]*t[i]*G(c[e+r],c[e+i])}}let l=Ud(n,o);a.forEach((e,t)=>{a[t]=e+Math.max(-.6,Math.min(Nd,l[t]))})}return a}function Gd(e,t,n){let r=e.map((e,t)=>n(t,e)),i=e=>e>=0&&e+1<r.length?K(U(r[e+1],r[e])):0;return e.slice(1).map((e,t)=>t).filter(n=>i(n)>Ld&&i(n)>Id*Math.max(i(n-1),i(n+1))&&_o(t(n,e[n]),t(n+1,e[n+1]))>Fd)}function Kd(e,t,n,r){let i=r.length,a=Fd*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,G(s[e-1][t],s[e][r])))),o=c[t]+Rd*i*i+(i>a?zd*(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 qd(e,t,n,r,i=Hd){let a=Wd(e,t,n);if(!Gd(a,r,t).length)return a;let o=Kd(e,r,a.length,i),s=Wd(e,t,o),c=Gd(s,r,t);if(!c.length)return s;let l=Wd(e,t,o,new Float64Array(Math.max(0,s.length-2)).map((e,t)=>c.some(e=>e>=t-Vd&&e<=t+1+Vd)?Bd:1));return Gd(l,r,t).length?a:l}function Jd(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 Yd(e,t,n,r){let i=n.map(n=>{let{s:i,held:a}=r(n);return ac(e,i,t,a)}),a=qd((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 Xd=lc.filter(e=>e[0].startsWith(`torso`)),Zd=lc.find(e=>e[0]===`hand_l`)[3],Qd=.004;function $d(e,t,n){let r=U(n,t);return K(U(e,H(t,W(r,io(G(U(e,t),r)/Math.max(G(r,r),1e-12),0,1)))))}function ef(e){let t=[];for(let n of[-1,1])for(let r of[0,2])for(let i of[-1,1])t.push(H(e.pos,Y(e.R,[n*e.half[0],r*e.half[1],i*e.half[2]])));return t}function tf(e,t,n,r,i=()=>null){let a=e.index,o=Object.entries(t.ctx.spec.objects??{}).filter(([,e])=>vg(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,Qd]);for(let[t,i,o,s]of Xd){let c=new Map;for(let[e,t,n]of u)c.set(e,Math.max(c.get(e)??-1/0,s+n-$d(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*Zd-fc(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=ef(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=>dc(e,s)));c>n.object&&r(`OBJECT`,`${t} into ${a}`,e,c,n.object)}}}}var nf=[[/^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 rf(e,t){let n=e.names[t]??``,r=/^Left/.test(n)?`_l`:/^Right/.test(n)?`_r`:``,i=nf.find(([e])=>e.test(n));return i?`${i[1]}${r}`:n}var af=[`Arm`,`ForeArm`,`Hand`].flatMap(e=>[`Left${e}`,`Right${e}`]);function of(e,t,n,r,i){let a=ps(e);if(!a)return;let o=af.map(t=>e.index[t]);t.frames.forEach(({s:t},s)=>{for(let c of o){let o=ks(a,e,t,c);if(o.into<0)continue;let l=rf(e,c),u=rf(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 sf=.05,cf=new WeakMap;function lf(e){let t=cf.get(e);return t||(t=Object.values(e).filter(e=>e.half&&!e.ignore).map(e=>({RT:X(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:K(e.half)})),cf.set(e,t)),t}function uf(e,t){if(Math.hypot(t[0]-e.c[0],t[2]-e.c[2])>e.r)return null;let n=Y(e.RT,U(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 df(e,t,n){let r=0;for(let i of lf(e.objectsAt(t))){let e=uf(i,n);e!==null&&e<=n[1]+sf&&e>r&&(r=e)}return r}function ff(e,t,n){let r=gc(e.ctx.sk,e.frames[t].s,n);for(let n of[`heel`,`ball`,`tip`])r[n]=[r[n][0],r[n][1]-df(e,t,r[n]),r[n][2]];return r}var pf=[`Hips`,`Head`,`LeftHand`,`RightHand`,`LeftFoot`,`RightFoot`,`LeftLeg`,`RightLeg`,`LeftForeArm`,`RightForeArm`],mf=new Set([`Hips`,`Head`]),hf=[[`knee_l`,`LeftUpLeg`,`LeftLeg`,`LeftFoot`],[`knee_r`,`RightUpLeg`,`RightLeg`,`RightFoot`],[`elbow_l`,`LeftArm`,`LeftForeArm`,`LeftHand`],[`elbow_r`,`RightArm`,`RightForeArm`,`RightHand`]],gf=2,_f=.75,vf=.05,yf=e=>Math.round(e*100)/100;function bf(e,t){let n=t.frames,r=n.length;return pf.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]=K(U(i[e],i[e-1]));for(let e=2;e<r;e++)s[e]=U(U(i[e],i[e-1]),U(i[e-1],i[e-2])),o[e]=K(s[e]);return{j:t,core:mf.has(t),v:a,a:o,A:s}})}function xf({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=>G(t[r],t[n])/e[n]):[];return i.length?Math.max(r,Math.max(...i)+Math.min(0,...i)):r}var Sf=(e,t,n)=>e.a[t]>n&&e.a[t]>gf*xf(e,t);function Cf(e,t,n,r){for(let i of bf(e,t)){let e=i.core?n.accCore:n.accLimb;for(let t=2;t<i.a.length;t++)Sf(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 wf=[`hips`,`torso_lo`,`torso_hi`],Tf=.04;function Ef(e,t,n){let{P:r}=e.frames[t].s,i=e.ctx.sk.index;return lc.some(([e,t,n,a])=>wf.includes(e)&&Math.min(r[i[t]][1],r[i[n]][1])-a<Tf)?!0:n.some(n=>{let a=e.objectsAt(t)[n.object],o=lc.find(e=>e[0]===(n.part??`hips`));return a&&o&&Math.min(...uc(r[i[o[1]]],r[i[o[2]]]).map(e=>dc(e,a)))-o[3]<(n.tol??.04)})}function Df(e,t=[]){let n=e.ctx.sk.index,r=e.frames;return r.map(({s:i},a)=>{if(Ef(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=ff(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=W([`Hips`,`Spine1`,`Spine2`,`Head`].reduce((e,t)=>H(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 Of=.06;function kf(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]-df(e,t,n[r[i]])<Of))}function Af(e,t=[]){let n=e.frames.length,r=[],i=e.frames.map((n,r)=>!Ef(e,r,t)&&[`Left`,`Right`].every(t=>{let n=ff(e,r,t);return Math.min(n.heel[1],n.ball[1])>=.02})&&!kf(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 jf(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 Af(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<=_f))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:_f})}return s}var Mf=(e,t,[,n,r,i])=>_o(U(t.P[e.index[r]],t.P[e.index[n]]),U(t.P[e.index[i]],t.P[e.index[r]]));function Nf(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 bf(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]&&!Sf(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 hf.slice(0,2)){let a=Mf(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`)&&Df(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=W([`Hips`,`Spine1`,`Spine2`,`Head`].reduce((n,r)=>H(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 Pf(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(bf(e,t).map(({j:e,v:t,a:n})=>[e,{speed:a(t,i),accel:a(n,i*i)}]).filter(([,e])=>e.speed[0]>=vf)),s=Df(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=Af(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=[yf(e),t+r])});let d=c(e=>typeof e==`number`&&e<0),f=Object.fromEntries(hf.map(n=>{let i=[0,r];return t.frames.forEach(({s:t},a)=>{let o=Mf(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 Ff(e,t,n,r){let i=e=>Object.hasOwn(n??{},e),a=new Float64Array(t.frames.length);for(let n of bf(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)&&(Sf(n,e,r[c])&&(a[e]=Math.max(a[e],Math.sqrt(o[e]/Math.max(r[c],gf*xf(n,e))))),i(c)&&(a[e]=Math.max(a[e],Math.sqrt(o[e]/r[c]))))}return a}var If=[0,1,0],Lf=.7,Rf=.025,zf=new Map;function Bf(e,t){let n=`${e.model}:${t}`;if(zf.has(n))return zf.get(n);let r=ps(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/Rf)).join();c.has(u)||(c.add(u),i.push([n.b,l]))}}return zf.set(n,i),i}function Vf(e,t,n){let r=Bf(e,n);if(!r?.length){let r=gc(e,t,n),i=(e,t)=>W(H(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])=>H(t.P[e],Y(t.R[e],n)))}function Hf(e,t){let n={top:-1/0,side:-1/0,topAt:null,sideAt:null};for(let r of e){let e=-dc(r,t);if(e<=0)continue;let i=G(_c(r,t),If)>Lf?`top`:`side`;e>n[i]&&(n[i]=e,n[`${i}At`]=r)}return n}function Uf(e,t,n,r,i,a,o){for(let[s,c]of[[`Left`,`l`],[`Right`,`r`]]){let l=Vf(e,t,s),u=`foot_${c}`;for(let[e,t,s,c]of r){if(l.every(e=>ro(e,s)>c))continue;let r=Hf(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 Wf={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},Gf=20,Kf=.01,qf=(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 Jf(e,t,n={}){let r={...Wf,...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,H(t.pos,Y(t.R,[0,t.half[1],0])),K(t.half)]);for(let[e,t,o,l]of lc){let u=s.P[a[t]],f=s.P[a[o]],p=W(H(u,f),.5),m=l+ro(u,f)/2,h=null;for(let[t,a,o,s]of d){let d=qf(n.allow,e,t)??r.allow;if(m-(ro(p,o)-s)<=d)continue;h??=uc(u,f);let g=l-Math.min(...h.map(e=>dc(e,a)));g>d&&c(`COLLIDE`,`${e} x ${t}`,i,g,d)}}Uf(e,s,i,d,r,(e,t)=>qf(n.allow,e,t),c);for(let t of[`Left`,`Right`]){let n=gc(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(...uc(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=pc(e,s,n)+a;o>r.headAllow&&c(`FACE`,`${t} into head`,i,o,r.headAllow)}fc(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),fc(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=q(U(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=_o(U(n,t),U(r,n)),l=U(s.P[a[`${e}ToeBase`]],r);if(p){let e=q(U(r,n));l=U(l,W(e,G(l,e)))}else l[1]=0;let u=U(n,[(t[0]+r[0])/2,(t[1]+r[1])/2,(t[2]+r[2])/2]);o>3&&G(u,l)<-.002&&c(`KNEE`,`${e} knee bends backward`,i,o,0),o>160+Kf&&c(`KNEE`,`${e} knee folds ${o.toFixed(0)}deg`,i,o,160);let d=_o(U(s.P[a[`${e}ForeArm`]],s.P[a[`${e}Arm`]]),U(s.P[a[`${e}Hand`]],s.P[a[`${e}ForeArm`]]));d>150+Kf&&c(`ELBOW`,`${e} elbow folds ${d.toFixed(0)}deg`,i,d,150)}}let l=(e,t)=>qf(n.allow,e,t);tf(e,t,r,c,l),of(e,t,r,c,l);for(let e of[`Left`,`Right`]){let n=o.map((n,r)=>ff(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=ro(e.restWorldPos[t],e.restWorldPos[n]),i=Math.max(...o.map(e=>Math.abs(ro(e.s.P[t],e.s.P[n])-r)));i>.001&&c(`LENGTH`,`${e.names[n]}-${e.names[t]}`,0,i,.001)}return Cf(e,t,r,c),Yf(e,o,r,c),i}function Yf(e,t,n,r){let i=e.index,a=Math.sin(Gf*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=U(d[i[s]],d[i[o]]),p=U(d[i[c]],d[i[s]]),m=no(f,p);if(K(m)<a*K(f)*K(p))continue;let h=q(m),g=e?_o(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 Xf=36,Zf=.05,Qf=.3,$f=3,ep=10,tp=36,np=1,rp=100,ip=lc.filter(e=>e[0].startsWith(`torso`)),ap=Object.fromEntries(lc.map(e=>[e[0],e[3]])),op=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],sp=(e,t)=>[e[0][t],e[1][t],e[2][t]];function cp(e,t,n,r){let i=U(t,e),a=U(r,n),o=U(e,n),s=G(i,i),c=G(a,a),l=G(a,o);if(s<1e-12||c<1e-12)return K(o);let u=G(i,o),d=G(i,a),f=s*c-d*d,p=f>1e-12?io((d*l-u*c)/f,0,1):0,m=(d*p+l)/c;return m<0?(m=0,p=io(-u/s,0,1)):m>1&&(m=1,p=io((d-u)/s,0,1)),K(U(H(e,W(i,p)),H(n,W(a,m))))}function lp(e,t,n){let r=e.index,i=Ro(e,t,n);return{pos:W(H(t.P[r[`${n}HandIndex2`]],t.P[r[`${n}HandMiddle2`]]),.5),R:op(i.d,i.l,i.n)}}function up(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=lp(e,r,Zh.r).R,l=sp(c,0),u=q(no(a,U(l,W(a,G(l,a))))),d=e=>U(e,W(u,2*G(e,u))),f=op(d(l),d(sp(c,1)),W(d(sp(c,2)),-1)),p=lp(e,r,Zh.l),m=e.index,h=m.LeftHand,g=r.P[h],_=J(X(r.R[h]),p.R),v=Y(X(r.R[h]),U(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=>J(fo(a,e*180/Math.PI),f),x=e=>J(b(e),X(_)),S=e=>y===`wrist`?H(g,Y(x(e),v)):U(p.pos,Y(x(e),v)),C=e=>y===`wrist`?g:S(e),w=Y(X(r.R[h]),U(r.P[m.LeftHandMiddle3],g)),T=r.P[m.LeftArm],E=nc(e,r,Zh.l),D=t.fix===!1||t.fix?.self===!1?null:ps(e),O={uarm_l:m.LeftArm,farm_l:m.LeftForeArm,hand_l:m.LeftHand},k=(t,n,i)=>D?Os(D,e,r,O[i],t,n):Math.max(0,...ip.map(([,e,a,o])=>ap[i]+o-cp(t,n,r.P[m[e]],r.P[m[a]]))),ee=new Map,A=t=>{if(ee.has(t))return ee.get(t);let n=C(t),i=qs(e,r,Zh.l,x(t),n,E,Ns),a=e=>{let t=i.at(e);return{pv:t.pv,elbow:t.elbow,cost:t.cost+np*((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<tp;e++){let t=2*Math.PI*e/tp-Math.PI,n=a(t).cost;n<o.cost&&(o={th:t,cost:n})}let s=H(n,Y(x(t),w)),c=k(n,s,`hand_l`),l=Math.max(0,c-Wf.body),u=2*ap.hand_l-cp(n,s,r.P[m.RightHand],r.P[m.RightHandMiddle3]),d=Math.max(0,u-Wf.hands),f=np*((100*c)**2+(100*i.miss)**2)+(l>0?rp*(100*l)**2:0)+(d>0?rp*(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},te=e=>A(e).best.cost+Qf*(1-Math.cos(e));return{id:n,weight:s,pin:y,at:p.pos,rolled:b,arm:A,cost:te,point:S,softmin:()=>{let e=Array.from({length:Xf},(e,t)=>{let n=2*Math.PI*t/Xf-Math.PI;return[n,te(n)]}),t=Math.min(...e.map(e=>e[1])),n=e.reduce((e,[n,r])=>{let i=Math.exp(-(r-t)/Zf);return[e[0]+i*Math.cos(n),e[1]+i*Math.sin(n)]},[0,0]);return Math.atan2(n[1],n[0])},measure:t=>lp(e,t,Zh.l)}}var dp=(e,t)=>Math.exp(-Math.max(0,e.cost(t)-$f)/ep),fp=(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}),pp=.045,mp=4,hp=8,gp=[30,10],_p=2,vp=4,yp=2,bp=.1,xp=1.5,Sp=20,Cp=4,wp=8,Tp=400,Ep=[`the fingers' line`,`the palm normal`,`the knuckle line`],Dp=(e,t)=>[e[0][t],e[1][t],e[2][t]],Op=e=>{let t=X(e.R);return{pos:W(Y(t,e.pos),-1),R:t}},kp=e=>Math.round(e*100)/100;function Ap(e,t,n){let r=ho(e),i=ho(t);return Xo(r,i)<0&&(i=i.map(e=>-e)),go(rs(r,i,n))}function jp(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+wp*c*c+(s>o?Tp*((s-o)/o)**2:0)}function Mp(e,t,n,r,i){let{goal:a,plane:o,wristAt:s}=rc(e,t,n,r,i,1),c=s(a),l=qs(e,t,n,a,c,o,Ns),u=l.at(l.softmin()),d=e.index,f=t.P[d[`${n}Arm`]],p=K(U(t.P[d[`${n}ForeArm`]],f)),m=K(U(t.P[d[`${n}Hand`]],t.P[d[`${n}ForeArm`]])),h=Math.max(0,Do(p,m,145)-K(U(c,f))),g=ps(e),_=g?Math.max(Os(g,e,t,d[`${n}Arm`],f,u.elbow),Os(g,e,t,d[`${n}ForeArm`],u.elbow,c),Os(g,e,t,d[`${n}Hand`],c,r.pos)):0;return[`twist`,`flex`,`dev`].reduce((e,t)=>e+jp(u.need[t],js[t],As[t]),0)+Sp*((l.miss*100)**2+(h*100)**2)+Cp*(_*100)**2}function Np(e,t,n,r,i,a,o){if(r.aim===void 0)return o({pos:r.pos,R:go(r.rot)});let s=ho(Sg(i,a).R),c=q(r.aim),l=Jo(ts(q(es(s,[0,1,0])),c),s),u=e=>({pos:r.pos,R:go(Jo(ns(c,e),l))});if(r.roll!==void 0)return o(u(r.roll));let d=null;for(let r=0;r<mp;r++){let o=u(360/mp*r-180),s=oc(e,t,n,Sg(o,Op(a)),i);(!d||s<d.strain)&&(d={p:o,strain:s})}return o(d.p)}function Pp(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]<pp)}var Fp=(e,t)=>e.length<=t?e:Array.from({length:t},(n,r)=>e[Math.round(r*(e.length-1)/(t-1))]);function Ip(e,t){let n=Qo(ho(J(X(e),t)));return`today's grip turned ${Math.round(2*K(n)*180/Math.PI)} deg, mostly about ${Ep[[0,1,2].reduce((e,t)=>Math.abs(n[t])>Math.abs(n[e])?t:e,0)]}`}function Lp({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=Fp(f,hp),m=e=>Cg({pos:d.pos,R:e},i),h=(t,r,i)=>{let{s:a,now:o}=l(r);return Mp(e,a,n,Sg(i,Op(t)),o)},g=t=>Mp(e,u,n,Sg(i,Op(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+Np(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=cm(t,s,e=>ho(Sg(l(e).now,a).R),(t,r,i,o)=>{let{s,now:c}=l(t);return oc(e,s,n,Sg({pos:r,R:go(i)},Op(a)),c,o)},2*(i?.half?.[1]??0)),d=g(a),p=d;for(let e=o;e<=c;e+=vp){let t=h(a,e,dm(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<=xp)return{offset:y.A,name:`today`,cost:kp(y.cost),today:kp(y.cost)};let b={R:d.R,rough:_(d.R)};for(let e of gp)for(let t=0,n=!0;n&&t<_p;t++){n=!1;for(let t of[0,1,2])for(let r of[1,-1]){let i=J(fo(Dp(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:Ip(d.R,b.R),...v(b.R)},S=x.cost<y.cost-Math.max(yp,bp*y.cost)?x:y;return{offset:S.A,name:S.name,cost:kp(S.cost),today:kp(y.cost)}}var Rp=3,zp=12,Bp=.05,Vp=.3,Hp=180/Math.PI,Up=40,Wp=1,Gp=.3,Kp=[-40,-40/2,0,Up/2,Up];function qp(e){let t=Math.min(...e.map(e=>e[1])),n=e.map(([e,n])=>[e,Math.exp(-(n-t)/Gp)]);return n.reduce((e,[t,n])=>e+t*n,0)/n.reduce((e,[,t])=>e+t,0)}function Jp(e){let t=Array.from({length:zp},(t,n)=>{let r=2*Math.PI*n/zp-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)/Bp);return[e[0]+i*Math.cos(t),e[1]+i*Math.sin(t)]},[0,0]);return Math.atan2(r[1],r[0])}var Yp=({d:e,l:t,n})=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],Xp=(e,t)=>e.anchors?.[t]?.kind===`object`&&!!e.anchors[t].grasp,Zp=(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 Qp(e,t,n,r){let i=new Set(_h(t,n));return(e.fits??[]).some(a=>{if(a.side!==r||!Xp(e,a.anchor))return!1;let o=e.anchors[a.anchor].object;return o===n||i.has(o)||_h(t,o).some(e=>i.has(e))})}function $p(e,t,n){let{spec:r,scene:i}=e;if(!e.objectHand||!(r.fits??[]).some(e=>e.side===t&&Xp(r,e.anchor)))return null;for(let[a,o]of Object.entries(r.objects??{}))if(o?.prop&&e.objectHand(a,n)===t&&Qp(r,i,a,t))return{id:a,grab:e.carrySpan(o)[0],keyed:!!o.keys?.length};return null}function em(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??_u(e,s.fit.anchor,n,o,a,i),_=c(n),v=q(U(n.P[m],n.P[p])),y=l?.type??e.spec.anchors[s.fit.anchor].grasp,b=iu(r,g,y,v,a.yaw),x=(e=>({pos:c(e),R:Yp(Ro(t,e,r))}))(n),S=e=>{let i=rc(t,n,r,{pos:_,R:e},x,1,`palm`);return Js(t,n,r,i.goal,i.wristAt(i.goal),i.plane,Ns).cost},C=(e,t)=>[e[0][t],e[1][t],e[2][t]],w=e=>J(fo(C(b,1),e*Hp),b),{R:T,roll:E,tilt:D}=tm(e,s.fit.anchor,i,u,()=>{let e=g.axis&&!g.from&&y!==`palm`?Jp(e=>S(w(e))+Vp*(1-Math.cos(e))):0,t=w(e),n=e=>J(fo(C(t,2),e),t),r=g.axis&&y!==`palm`?qp(Kp.map(e=>[e,S(n(e))+Wp*(e/Up)**2])):0;return{R:n(r),roll:e,tilt:r}}),{goal:O,plane:k,wristAt:ee}=rc(t,n,r,{pos:_,R:T},x,s.w,`palm`),A=Js(t,n,r,O,ee(O),k,Ns,{w:s.w}),te={twist:0,flex:0,dev:0};for(let e=0;e<Rp;e++)Io(t,n,f,p,m,ee(e?n.R[m]:O),A.pole,Ns,`elbow`),te=tc(t,n,r,m,p,O);o[`grip_${i}`]={w:s.w,socket:!0,...te,roll:E*Hp,tilt:D},o[`socket_${i}`]={rel:J(X(h),n.R[m])}}function tm(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 nm(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`];tc(t,n,r,u,l,J(n.R[l],s))}var rm=12,im={m:.01,deg:5},am=e=>e*e*(3-2*e),om=(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)]},sm=e=>{let t=X(e.R);return{pos:W(Y(t,e.pos),-1),R:t}};function cm(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=Ed(a,e=>n(o[e]),r&&((e,t)=>r(o[e],Sd(a[e],t,i),t,a[e].lean?{shoulder:!0}:void 0))),l=a.map((e,t)=>Sd(e,Zo(c[t]),i).slice());for(let e of c){let t=Zo(e);s.push(s.length&&Xo(s[s.length-1],t)<0?t.map(e=>-e):t)}let u=a.length-1,d=e=>W(Qo(Jo(Yo(s[e]),s[e+1])),1/(o[e+1]-o[e])),f=(e,t)=>e===0||e===u?[0,0,0]:W(H(W(t(e),o[e]-o[e-1]),W(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=>W(U(l[e+1],l[e]),1/(o[e+1]-o[e])))),w:s.map((e,t)=>f(t,d)),rots:c}}var lm=new WeakMap;function um(e,t){lm.has(e)||lm.set(e,new Map);let n=lm.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:cm(a.entry?.(t)??e.ctx.spec.objects[t],e=>r?r(e):e,e=>ho(a.carryOn(t,s(e)).R),(e,n,r,i)=>a.strainOn(t,s(e),{pos:n,R:go(r)},i),2*(e.ctx.scene?.objects?.[t]?.half?.[1]??0))})}return n.get(t).curve}function dm({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:go(n[0])};if(a>=e[o-1])return{pos:t[o-1].slice(),R:go(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=H(H(W(t[s],f),W(r[s],c*p)),H(W(t[s+1],m),W(r[s+1],c*h))),_=Jo(Yo(n[s]),n[s+1]),v=H(H(W(Qo(_),m),W(i[s],c*p)),W(es(_,i[s+1]),c*h));return{pos:g,R:go(Jo(n[s],$o(v)))}}function fm(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?am(1-s/o):0}var pm=e=>Object.entries(e.objects??{}).filter(([,e])=>hg(e)&&e.keys?.length);function mm(e,t,n,r){let{sk:i,spec:a,scene:o}=e,s=pm(a);if(!s.length)return null;let c=new Set(s.map(([e])=>e).filter(e=>jc(a,a.objects[e],o,e)).map(e=>a.objects[e])),l=new WeakMap,u=e=>t.timeMap?Math.round(t.timeMap(e)):e,d=e=>{l.has(t)||l.set(t,new Map);let r=l.get(t);if(!r.has(e)){let t=2*(o?.objects?.[e]?.half?.[1]??0);r.set(e,kd(a.objects[e],t,e=>wo(n(u(e)).s,i.index.Head,i.landmarks.mouth)))}return r.get(e)},f=(e,t)=>xg(i,a,t,{prop:e.prop},c.has(e)),p=new WeakMap,m=new Set,h=(t,n)=>e.restingAt?.(t,n)??o?.objects?.[t]??Pl(o)[t],g=new WeakMap,_=e=>t.timeMap?Math.round(t.timeMap(e)):e,v=e=>{g.has(t)||g.set(t,new Map);let r=g.get(t),s=a.objects[e],c=a.props?.[s.prop]?.hand,l=om(t,s)[0],u=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])&&Pp(o,e)&&!(a.fits??[]).some(e=>e.side===c&&e.orient===!1)&&!Qp(a,o,e,c)&&![`wtwist`,`wflex`].some(e=>Math.abs(u[`${e}_${c}`]?.[l]??0)>.001)&&_(Math.min(...s.keys.map(e=>e.f)))<=l))return null;m.add(e);try{r.set(e,Lp({sk:i,o:d(e),side:Zh[c],grab:l,rest:h(e,l),plain:e=>n(e).s,palmOf:e=>f(s,e),map:_}))}finally{m.delete(e)}return r.get(e)},y=r=>{p.has(t.baked)||p.set(t.baked,new Map);let s=p.get(t.baked),l=a.objects[r];if(s.has(r))return s.get(r);let u=v(r);if(u&&u.name!==`today`){let e=c.has(l)?Pc(i,a,o,r,l,u.offset):u.offset;return s.set(r,e),s.set(`${r}|taken`,u.offset),e}let d=o?.objects?.[r]??Pl(o)[r],h=!o?.objects?.[r]&&!!d,g=l.at===void 0&&l.along===void 0&&(h||l.grab!==void 0);m.add(r);let _;try{_=g?n(om(t,l)[0]).s:bo(i)}finally{m.delete(r)}let y=Cg(f(l,_),g?e.restingAt?.(r,om(t,l)[0])??{pos:d.pos,R:d.R}:xg(i,a,_,l)),b=g&&c.has(l)?Pc(i,a,o,r,l,y):y;return s.set(r,b),s.set(`${r}|taken`,y),b},b=(e,n)=>{let r=y(e),i=p.get(t.baked)?.get(`${e}|taken`);return i&&i!==r&&n!==void 0?Lc(i,r,Ic(om(t,a.objects[e])[0],n)):r},x=(e,t)=>Sg(f(a.objects[e],t),y(e)),S=(e,t,n,r)=>{let o=a.objects[e];return oc(i,t,Zh[a.props[o.prop].hand],Sg(n,sm(y(e))),f(o,t),r)},C=(e,n,r)=>{let i=um(t,e),a=fm(i,om(t,n),r);return a>0?{w:a,palm:Sg(dm(i,r),sm(b(e,r))),measure:e=>f(n,e),comfort:d(e).keys.some(e=>e.lean>0)}:null},w=new WeakMap,T=(e,r)=>{w.has(t.baked)||w.set(t.baked,new Map);let o=w.get(t.baked),s=o.get(e);if(s&&s.map===t.timeMap)return s.plan;let[c,l]=om(t,r),u=[];for(let n=Math.max(0,c);n<=Math.min(t.frameCount-1,l);n++)fm(um(t,e),[c,l],n)>0&&u.push(n);let d=Yd(i,Zh[a.props[r.prop].hand],u,t=>({s:n(t).s,held:C(e,r,t)}));return o.set(e,{map:t.timeMap,plan:d}),d},E=!1,D=(e,t,n)=>{let r=x(e,t).R;return up(i,a,e,t,n,[r[0][1],r[1][1],r[2][1]])},O=new WeakMap,k=(e,n)=>{O.has(t.baked)||O.set(t.baked,new Map);let i=O.get(t.baked),a=i.get(e);if(a&&a.map===t.timeMap)return a.plan;let[o,s]=om(t,n),c=new Map;E=!0;let l=[],u=()=>{let e=Wd((e,t)=>l[e].grip.cost(t),(e,t)=>l[e].grip.point(t),l.map(e=>e.grip.softmin())),t=Jd(l.map((t,n)=>dp(t.grip,e[n]))),n=t=>l[t].grip.arm(e[t]),r=Wd((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=fm(um(t,e),[o,s],n)>0?r(n):null,a=i&&D(e,i.s,i.c);a?l.push({f:n,grip:a}):l.length&&u()}return l.length&&u(),E=!1,i.set(e,{map:t.timeMap,plan:c}),c},ee=(e,n,r)=>{let i=v(e);if(!i||i.name===`today`)return null;let a=um(t,e),o=a.t[0],s=a.t[a.t.length-1],[c,l]=om(t,n);if(r>=o&&r<=s)return null;let u=Sg(dm(a,r<o?o:s),sm(i.offset)),d=e=>f(n,e),p=T(e,n).get(Math.round(r<o?o:s));if(r<c||r>l){let e=am(Math.max(0,1-(r<c?c-r:r-l)/rm));return e>.001?{w:e,palm:u,measure:d,pole:p}:null}let m=C(e,n,r);return{w:1,palm:m?{pos:H(W(u.pos,1-m.w),W(m.palm.pos,m.w)),R:Ap(u.R,m.palm.R,m.w)}:u,measure:d,pole:p}},A=new WeakMap,te=(e,r,i)=>{A.has(t.baked)||A.set(t.baked,new Map);let a=A.get(t.baked),o=a.get(e);if(o&&o.map===t.timeMap)return o.off;m.add(e);let s;try{s=f(r,n(Math.max(om(t,r)[0],Math.round(um(t,e).t[0]))).s)}finally{m.delete(e)}let c=Cg(s,i).R,l=Math.acos(Math.min(1,Math.max(-1,(c[0][0]+c[1][1]+c[2][2]-1)/2)))*180/Math.PI,u=Math.hypot(...U(i.pos,s.pos))>im.m||l>im.deg;return a.set(e,{map:t.timeMap,off:u}),u},ne=(e,n,r)=>{let i=um(t,e),[a,o]=om(t,n),s=Math.max(a,Math.round(i.t[0]));if(!(r<s&&r>=s-rm)||s-a>=8||s>o)return null;let c=Sg(dm(i,s),sm(y(e)));if(!te(e,n,c))return null;let l=am(1-(s-r)/rm);return l>.001?{w:l,palm:c,measure:e=>f(n,e),pole:T(e,n).get(s)}:null},re=(e,n,r)=>{let i=um(t,e),a=i.t[i.t.length-1],o=om(t,n)[1];return r>o&&r-a<8?{curve:i,release:o,w:am(1-(r-a)/8)}:null},ie=(e,t,n)=>{let r=re(e,t,n);return r&&{w:r.w,palm:Sg(dm(r.curve,r.release),sm(y(e))),measure:e=>f(t,e),pole:T(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?ee(o,c,n)??ne(o,c,n)??ie(o,c,n):null;if(s)return s;let l=a.props?.[c.prop]?.hand===e?C(o,c,n):null;if(l)return{...l,pole:T(o,c).get(n)};let u=e===`l`&&r&&!E?re(o,c,n):null,d=e===`l`&&r&&!E?fm(um(t,o),om(t,c),n)||(u?.w??0):0,f=d>0?D(o,r,i):null,p=f&&k(o,c).get(u?u.release:n),m=p?.roll??f?.softmin();if(f)return fp(f,d,m,p?.gate??dp(f,m),p?.pole??f.arm(m).best.pole)}return null},attach:y,attachAt:b,attaching:e=>m.has(e),plainFrame:n,entry:d,carryOn:x,strainOn:S,span:e=>om(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=v(e);return n&&{id:e,hand:a.props[t.prop].hand,name:n.name,cost:n.cost,today:n.today}}).filter(Boolean)}}var hm=[0,0,0];function gm(e,t,n,r){return Array.isArray(e?.v)?e.v:e?.v===`hand`&&n?W(U(t.pos,n.pos),r):hm}var _m=e=>e.some(e=>e!==0),vm=(e,t,n)=>(t+Math.sqrt(t*t+2*n*Math.max(0,e)))/n,ym=(e,t,n)=>{let r=Math.min(t,n);return[e[0]*r,0,e[2]*r]};function bm(e,t,n,r,i=[]){let a=e(t),o=a.top+a.h,s=e=>({pos:H(t.pos,ym(n,vm(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 xm=.3,Sm=.5,Cm=15,wm=1,Tm=6*Math.PI,Em=3,Dm=[0,-1,0],Om=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],km=e=>e*180/Math.PI;function Am(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=H(r,W(H(e.pos,Y(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(H(e.pos,Y(e.R,[t*e.half[0],n*e.half[1],r*e.half[2]])))}return{com:W(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 jm=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]]),Mm=(e,t)=>H(e.pos,Y(e.R,t)),Nm=(e,t)=>Math.min(...jm(e).map(e=>Mm(t,e)[1])),Pm=(e,t,n)=>({pos:[t.pos[0],t.pos[1]+n-Nm(e,t),t.pos[2]],R:t.R}),Fm=(e,t,n)=>({pos:H(t,Y(n,U(e.pos,t))),R:J(n,e.R)}),Im=e=>Om.reduce((t,n,r)=>G(Y(e,n),Dm)>G(Y(e,Om[t]),Dm)?r:t,0),Lm=(e,t)=>{let n=t>>1;return Om[t][n]>0?e.hi[n]:e.lo[n]},Rm=(e,t)=>Math.abs(Lm(e,t)-e.com[t>>1]);function zm(e,t,n){let r=J(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(io((r[0][0]+r[1][1]+r[2][2]-1)/2,-1,1));if(i*n<wm)return[0,0,0];let a=q([r[2][1]-r[1][2],r[0][2]-r[2][0],r[1][0]-r[0][1]]),o=Math.min(Tm,i*n);return K(a)>0?W(a,o):[0,0,0]}function Bm(e,t,n,r,i,a=[0,0,0]){let o=K(n),s=Mm(t,e.com),c=!a.some(e=>e!==0),l=r=>{let i=o>0?J(fo(n,km(o*r)),t.R):t.R,l=c?[0,-.5*Gm*r*r,0]:[a[0]*r,a[1]*r-.5*Gm*r*r,a[2]*r];return{pos:U(H(s,l),Y(i,e.com)),R:i}},u=Math.max(0,Nm(e,t)-r);if(o===0)return{tl:c?Math.sqrt(2*u/Gm):vm(u,a[1],Gm),at:l};let d=1/(i*8),f=(c?Math.sqrt(2*(u+K(U(e.hi,e.lo)))/Gm):vm(u+K(U(e.hi,e.lo)),a[1],Gm))+d,p=0,m=d;for(;m<f&&Nm(e,l(m))>r;)p=m,m+=d;for(let t=0;t<24&&m-p>1e-7;t++){let t=(p+m)/2;Nm(e,l(t))>r?p=t:m=t}return{tl:m,at:l}}var Vm=(e,t)=>.12+.9*Math.sqrt(Math.max(e,1e-4)/Gm)*Math.sqrt(t/90);function Hm(e,t,n,r,i=[0,0,0]){let a=[],o=Pm(e,t,n),s=0,c=(t,r,i)=>{let c=Vm(Mm(o,e.com)[1]-n,i);a.push({from:o,pivot:t,axis:r,angle:i,time:c}),o=Pm(e,Fm(o,t,fo(r,i)),n),s+=c},l=Im(o.R),u=e=>km(Math.acos(io(G(Y(o.R,Om[e]),Dm),-1,1))),d=u(l);if(d>Sm){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>km(Math.atan2(Rm(e,t),Rm(e,l)))&&(l=t);let r=jm(e).map(e=>Mm(o,e)).filter(e=>e[1]<=n+1e-4),i=Y(o.R,Om[l]);c(W(r.reduce(H,[0,0,0]),1/r.length),q(no(i,Dm)),u(l))}let f=d>Sm||K(i)>0?r:0;for(let t=0;t<Em;t++){let t=Mm(o,e.com),r=t[1]-n,a=null;for(let n=0;n<6;n++){if(n>>1==l>>1)continue;let s=Y(o.R,Om[n]),c=Mm(o,Om[n].map((t,r)=>t?Lm(e,n):r===l>>1?Lm(e,l):e.com[r])),u=-G(U(t,c),s),d=Rm(e,n);if(!(u<0||d<r*.8))continue;let f=u<0||km(Math.atan2(u,r))<Cm?0:Math.hypot(r,u)-r,p=G(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=jm(e).map(e=>Mm(o,e)).filter(e=>e[1]<=n+1e-4&&G(U(e,a.edge),a.out)>=-1e-4);c(s.length?W(s.reduce(H,[0,0,0]),1/s.length):[a.edge[0],n,a.edge[2]],q(no(a.out,Dm)),90),l=a.j}return{steps:a,rest:o,time:s}}function Um(e,t){let n=t;for(let t of e.steps){if(n<t.time){let e=n/t.time;return Fm(t.from,t.pivot,fo(t.axis,t.angle*e*e))}n-=t.time}return e.rest}var Wm=(e,t)=>K(t)**2*((e.hi[0]-e.lo[0])**2+(e.hi[1]-e.lo[1])**2+(e.hi[2]-e.lo[2])**2)/(24*Gm),Gm=9.8,Km=.03,qm=.25,Jm=[`prop`,`follow`,`pivot`,`axis`,`channel`],Ym=e=>!!e&&typeof e==`object`&&!Array.isArray(e)&&Jm.every(t=>e[t]===void 0)&&(e.keys!==void 0||e.fall!==void 0),Xm=e=>e?.fall===void 0?[]:Array.isArray(e.fall)?e.fall:[e.fall],Zm=(e,t)=>e?.objects?.[t]??Pl(e)[t]??null,Qm=(e,t)=>Object.keys(e?.objects??{}).filter(n=>n===t||e.objects[n].ancestors?.includes(t));function $m(e){let t=[];for(let n of[-1,1])for(let r of[0,2])for(let i of[-1,1])t.push(H(e.pos,Y(e.R,[n*e.half[0],r*e.half[1],i*e.half[2]])));return t}var eh=e=>Math.max(...$m(e).map(e=>e[1])),th=(e,t)=>{let n=Y(X(e.R),U([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 nh(e,t){let n=new Set;for(let[r,i]of Object.entries(t?.objects??{}))[r,...i.ancestors??[]].some(t=>vg(e.objects?.[t]))&&n.add(r);return n}function rh(e,t,n){let r=Zm(e,t);return Qm(e,t).map(t=>({id:t,...Sg(n,Cg(r,e.objects[t])),half:e.objects[t].half}))}function ih(e,t,n,r,i=null){let a=rh(t,n,r),o=new Set(a.map(e=>e.id)),s=nh(e,t);if(!a.length)return{support:null,top:0,h:0};let c=Math.min(...a.flatMap(e=>$m(e).map(e=>e[1]))),l=a.flatMap($m).reduce((e,t)=>H(e,t),[0,0,0]).map(e=>e/(a.length*8)),u=(i?Qm(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=eh(n);th(n,l)&&r<=c+.005&&(!d||r>d.top)&&(d={support:e,top:r})}if(!d&&i)for(let e of u){let n=eh(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 ah=new WeakMap;function oh(e,t){ah.has(e)||ah.set(e,new Map);let n=ah.get(e);return n.has(t)||n.set(t,Am(rh(e,t,{pos:[0,0,0],R:so()}))),n.get(t)}function sh(e,t,n,r,i,a,o,s=null){let c=gm(a,r,s,o),l=_m(c),u=r=>ih(e,t,n,r,a.onto??null),d=l?bm(u,r,c,Gm,Object.values(t.objects).map(eh)):u(r),f=a.tumble===!1?null:oh(t,n);if(f){let e=s?zm(s.R,r.R,o):[0,0,0],t=Bm(f,r,e,d.top,o,c),n=Hm(f,t.at(t.tl),d.top,xm*d.h+Wm(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):Um(n,a-t.tl)},rest:n.rest}}let p=d.h,m=l?vm(p,c[1],Gm):Math.sqrt(2*p/Gm),h=ym(c,1/0,m),g=Math.min(.6,Math.max(0,a.bounce??qm)),_=Math.min(g*Gm*m,Math.sqrt(2*Gm*Km)),v=2*_/Gm,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*Gm*t*t:t<=m+v?-p+_*(t-m)-.5*Gm*(t-m)**2:-p,a=ym(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 ch(e,t,n=-1/0,r=1/0){let i=hg(e)?[]:[...e.keys??[]].sort((e,t)=>e.f-t.f),a=Xm(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 lh(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 dm(n.curve,t);a=dm(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 uh=new WeakMap;function dh(e,t,n,r,i){uh.has(e.scene)||uh.set(e.scene,new Map);let a=uh.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=Zm(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=ch(n,l,u,d);for(let e of f)e.run&&(e.curve=cm({keys:e.run},l,()=>ho(c.R),null));return a.set(o,{map:r,o:n,spec:e.spec,events:f}),f}var fh=(e,t)=>(n,r)=>sh(e.spec,e.scene,t,n,r.t,r,e.spec.fps??30);function ph(e,t,n){let r=Zm(e.scene,t),i=e.spec.objects?.[t];return!r||!i?null:lh(dh(e,t,i,e.timeMap,`all`),n,{pos:r.pos,R:r.R},fh(e,t))}function mh(e,t,n,r,i){let a=Zm(e.scene,t);return!a||!Xm(n).length?a&&{pos:a.pos,R:a.R}:lh(dh({...e,grab:i},t,n,e.timeMap,`before`),r,{pos:a.pos,R:a.R},fh(e,t))}function hh(e,t,n,r,i,a,o=null){let s=Xm(n).length?dh({...e,release:i},t,n,e.timeMap,`after`):[];return s.length?lh(s,r,a,(n,r)=>sh(e.spec,e.scene,t,n,r.t,r,e.spec.fps??30,r.t<=i+1?o:null),!1):null}function gh(e,t,n){let r=e.timeMap??(e=>e);return Xm(t).some(e=>r(e.at)>=n)}function _h(e,t){let n=e?.objects??{};return Object.keys(n).filter(e=>e===t||n[e].ancestors?.includes(t))}function vh(e,t){return hg(e)&&t>=(e.grab??0)&&(e.release===void 0||t<=e.release)}function yh(e,t){return e?.objects?.[t]??Pl(e)[t]??null}function bh(e,t,n){return[n,...t?.objects?.[n]?.ancestors??Pl(t)[n]?.ancestors??[]].find(t=>vg(e.objects?.[t]))??null}function xh(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 Sh=(e,t,n)=>n.at===void 0&&n.along===void 0&&(!e?.objects?.[t]&&!!Pl(e)[t]||n.grab!==void 0),Ch=new WeakMap,wh=new WeakMap,Th=new WeakMap,Eh=e=>({spec:e.ctx.spec,scene:e.ctx.scene,timeMap:e.timeMap});function Dh(e,t,n){let{spec:r,scene:i}=e.ctx,a=bh(r,i,t),o=r.objects?.[a];if(!hg(o))return null;let s=mh(Eh(e),a,o,n,xh(e,o)[0]);return s&&(a===t?s:Sg(s,Cg(yh(i,a),yh(i,t))))}function Oh(e,t){Th.has(e)||Th.set(e,new Map);let n=Th.get(e);if(n.has(t))return n.get(t);let{spec:r,scene:i}=e.ctx,a=r.objects?.[t],o=yh(i,t),s=_h(i,t),c=null;if(hg(a)&&a.release!==void 0&&o&&s.length){let n=xh(e,a)[1];if(n<e.frameCount-1&&!gh(Eh(e),a,n)){let l=jh(e,t,a,n),u=s.flatMap(e=>$m({...Sg(l,Cg(o,i.objects[e])),half:i.objects[e].half})),d=Math.min(...u.map(e=>e[1])),f=u.reduce((e,t)=>H(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:bh(r,i,a),u=r.objects?.[l];if(!l||l===t||hg(u)||gg(u))continue;let p={...Fh(e,a,n),half:o.half},m=eh(p);th(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 kh(e,t){let n=e.frames[t-(e.f0??0)];if(n)return n;Ch.has(e)||Ch.set(e,new Map);let r=Ch.get(e);return r.has(t)||r.set(t,Vb(e.ctx,md(e.baked,t),t)),r.get(t)}function Ah(e,t,n,r,i){let{sk:a,spec:o,scene:s}=e.ctx;if(!Sh(s,t,n))return xg(a,o,i,n);let c=jc(o,n,s,t);if(n.keys?.length&&e.ctx.hold){if(e.ctx.hold.attaching(t))return yh(s,t);let l=Sg(xg(a,o,i,{prop:n.prop},c),e.ctx.hold.attachAt(t,r)),u=xh(e,n)[0];return c?Lc(Dh(e,t,u)??yh(s,t),l,Ic(u,r)):l}let l=e=>xg(a,o,e,{prop:n.prop},c),u=xh(e,n)[0],d=Cg(l(u===r?i:kh(e,u).s),Dh(e,t,u)??yh(s,t));return c?Lc(Sg(l(i),d),Sg(l(i),Pc(a,o,s,t,n,d)),Ic(u,r)):Sg(l(i),d)}function jh(e,t,n,r){let i=kh(e,r);wh.has(i)||wh.set(i,new Map);let a=wh.get(i);return a.has(t)||a.set(t,Ah(e,t,n,r,i.s)),a.get(t)}function Mh(e,t,n,r=null){let{spec:i,scene:a}=e.ctx,o=vg(i.objects?.[t])?i.objects[t]:void 0,s=yh(a,t);if(gg(o))return Mu(r?{...e,f0:n,frames:[r]}:e,o,n);if(hg(o)&&(s||!Sh(a,t,o))){let[i,a]=xh(e,o),c=Math.max(i,Math.min(n,a));if(n<i&&s)return Dh(e,t,n);let l=n>a?hh(Eh(e),t,o,n,a,jh(e,t,o,a),a>0?jh(e,t,o,a-1):null):null;if(l)return l;let u=n>a?Oh(e,t):null;if(u){let r=jh(e,t,o,a);return Sg(Mh(e,u,n),Cg(Mh(e,u,a),r))}return r&&c===n?Ah(e,t,o,n,r.s):jh(e,t,o,c)}if(!s)return null;if(Ym(o))return ph(Eh(e),t,n);if(o&&a.objects[t])return e.ctx.objectsAt(n)[t];if(o){let r=_h(a,t)[0],i=e.ctx.objectsAt(n)[r];return Sg(i,Cg(a.objects[r],s))}return{pos:s.pos,R:s.R}}function Nh(e,t,n){let r=e.frames?.[n-(e.f0??0)],i=e.ctx.scene,a=_h(i,t);return!r||!a.length?null:a.map(t=>{let r=Fh(e,t,n);return{id:t,pos:r.pos,R:r.R,half:i.objects[t].half}})}function Ph(e,t,n){let{spec:r,scene:i,sk:a}=e.ctx,o=r.objects?.[bh(r,i,t)];if(hg(o)){let[t,i]=xh(e,o);return n>=t&&n<=i?r.props?.[o.prop]?.hand??null:null}if(!gg(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(El(a,c).bone??``);return l?l[1]===`Left`?`l`:`r`:null}function Fh(e,t,n,r=null){let{spec:i,scene:a}=e.ctx,o=yh(a,t),s=bh(i,a,t),c=i.objects?.[s];if(!o)return null;if(hg(c)||gg(c)||Ym(c)){let t=Mh(e,s,n,r);return t&&Sg(t,Cg(yh(a,s),o))}return s?a.objects[t]?e.ctx.objectsAt(n)[t]??o:s===t?Mh(e,t,n):Sg(Mh(e,s,n),Cg(yh(a,s),o)):{pos:o.pos,R:o.R}}var Ih=.009,Lh=8,Rh=70,zh=[`Index`,`Middle`,`Ring`,`Pinky`],Bh=.6,Vh=e=>{let t=Math.min(1,Math.max(0,(e-Bh)/.30000000000000004));return t*t*(3-2*t)};function Hh(e,t){let n=-1/0;for(let r=0;r+1<e.length;r++)for(let i of t)n=Math.max(n,Tc(i,e[r],e[r+1],Ih));return n}function Uh(e,t,n,r,i){if(r<=0||Hh(e,i)>=-.002)return 0;let a=r=>{let i=fo(n,r);return e.map(e=>H(t,Y(i,U(e,t))))};if(Hh(a(r),i)<-.002)return null;let o=0,s=r;for(let e=0;e<Lh;e++){let e=(o+s)/2;Hh(a(e),i)>=-.002?s=e:o=e}return s}function Wh(e,t,n,r,i){if(Hh(e,i)<-.002)return 0;let a=r=>{let i=fo(n,-r);return e.map(e=>H(t,Y(i,U(e,t))))};if(Hh(a(r),i)>=-.002)return Hh(a(r),i)<Hh(e,i)?r:0;let o=0,s=r;for(let e=0;e<Lh;e++){let e=(o+s)/2;Hh(a(e),i)<-.002?s=e:o=e}return s}function Gh(e,t,n,r,i,a,o,s,c=!0){let l=Uh(r.map(e=>t.P[e]),t.P[n],i,a,o),u=l??(c?a:0);return u>0&&xo(e,t,n,t.P[n].slice(),fo(i,u*s)),l!==null}function Kh(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 zh){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=W(Ro(e,t,n).l,c),h=[0,1,2].reduce((e,t)=>{let n=fo(m,-Uo(o,i,t));return e.map((r,i)=>i>t?H(e[t],Y(n,U(r,e[t]))):r)},p),g=Hh(p,r)>=-.002&&Hh(h,r)<Hh(p,r);for(let r=0;r<3;r++){let l=W(Ro(e,t,n).l,c),u=Uo(o,i,r),p=g?u:0;p>0&&xo(e,t,d[r],t.P[d[r]].slice(),fo(l,-p*a)),f=Gh(e,t,d[r],d.slice(r),l,Math.max(0,Wo(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}=Ro(e,t,n),i=!1;for(let n of[1,2]){let o=W(q(no(q(U(t.P[d[n+1]],t.P[d[n]])),r)),c),l=Wh(d.slice(n).map(e=>t.P[e]),t.P[d[n]],o,Rh,s);l>0&&xo(e,t,d[n],t.P[d[n]].slice(),fo(o,-l*a)),i=Gh(e,t,d[n],d.slice(n),o,Rh,s,a,!1)}i&&u.push(`Thumb`)}return{touched:u}}function qh(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=_h(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:Vh(s)*u,preset:t[`fingers_${r}`]})}return a??Jh(e,t,n,r,i)}function Jh(e,t,n,r,i){let{spec:a,scene:o}=e;for(let[s,c]of Object.entries(a.objects??{})){if(!jc(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=_h(o,s).map(t=>({...o.objects[t],...e.objectPose(t,n,{s:i})})),f=Object.entries(e.objectsAt(n)).filter(([e,t])=>!_h(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 Yh=(e,[t,n])=>Math.min(n,Math.max(t,e));function Xh(e,t,n){let r=e.index,i=r[`${n}Hand`],a=r[`${n}ForeArm`],o=e.restWorldRot,s=q(U(t.P[i],t.P[a])),c=J(t.R[a],J(X(o[a]),o[i])),{axF:l,axD:u,...d}=Gs(c,t.R[i],s,Y(J(c,X(t.R[i])),Ro(e,t,n).l)),f=Object.fromEntries(Object.entries(d).map(([e,t])=>[e,Yh(t,As[e])]));if(Object.keys(d).every(e=>Math.abs(d[e]-f[e])<1e-6))return null;let p=J(J(fo(H(W(l,f.flex),W(u,f.dev)),Math.hypot(f.flex,f.dev)),fo(s,f.twist)),c);return xo(e,t,i,t.P[i].slice(),J(p,X(t.R[i]))),{need:d,got:f}}var Zh={l:`Left`,r:`Right`},Qh=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)},$h=[0,0,1],eg=[`UpLeg`,`Leg`,`Foot`],tg=(e,t=[0,0,0])=>Array.isArray(e)||ArrayBuffer.isView(e)?[e[0],e[1],e[2]]:t,ng=(e,t=0)=>typeof e==`number`&&Number.isFinite(e)?e:t;function rg(e,t,n,r,i,a,o=n.length){for(let s of n){let n=e.index[s];xo(e,t,n,t.P[n].slice(),J(Z(r/o),J(lo(i/o),uo(a/o))))}}var ig=.99,ag=.9995;function og(e,t,n,r,i,a,o,s){let c=K(U(t.P[r],t.P[n]))+K(U(t.P[i],t.P[r])),l=U(a,t.P[n]),u=K(l),d=ig*c,f=.009500000000000064*c;if(u<=d||u-ag*c>.05)return a;let p=d+f*(1-Math.exp(-(u-d)/f));return o[`reach_over_${s}`]=Math.max(0,u-ag*c),H(t.P[n],W(l,p/u))}var sg=.095,cg=2,lg=new Map;function ug(e,t){let n=`${e.model}|${t}`;if(lg.has(n))return lg.get(n);let r=(90-t)*Math.min(1,Math.max(0,(t-45)/27)),i=Ds(e),a=n=>{let r=bo(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 xo(e,r,s,r.P[s].slice(),uo(o*t)),xo(e,r,c,r.P[c].slice(),uo(o*n)),[.5,.75,1].map(e=>H(r.P[c],W(U(r.P[l],r.P[c]),e))).concat([r.P[u]]).every(e=>_s(i.body,r,e,i.skip).d>=sg)})},o=r;if(i&&r>0){for(let e=0;e<=r;e+=.5)if(!a(e)){o=Math.max(0,e-cg);break}}return lg.set(n,o),o}var dg=60,fg=e=>e-360*Math.round(e/360);function pg(e,t,n){let r=fg(t),i=fg(n),a=(Math.max(Math.abs(r),Math.abs(i))-dg)/60;if(a<=0)return null;let o=a>=1?1:a*a*(3-2*a);return{yaw:e,R:J(Z(e),J(lo(r*o),uo(i*o)))}}function mg(e,t,n={}){let r=bo(e),i={},a=ng(t.arm_rest,72),o=ng(t.arm_hang)&&ng(t.arm_hang)*ug(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,ng(t[`armw_${s}`])+ng(t[`hangoff_${s}`]))));xo(e,r,c,r.P[c].slice(),uo(i*a)),u&&xo(e,r,l,r.P[l].slice(),uo(i*u))}for(let[n,i]of Object.entries(Zh)){let a=ng(t[`abend_${n}`]),o=ng(t[`aswing_${n}`]),s=e.index[`${i}ForeArm`],c=e.index[`${i}Arm`];a&&(xo(e,r,s,r.P[s].slice(),lo(-a)),Po(e,r,i)),o&&xo(e,r,c,r.P[c].slice(),lo(-o))}rg(e,r,[`Neck`,`Head`],ng(t.head_yaw),ng(t.head_pitch),ng(t.head_roll));let s=ng(t.spine_yaw),c=ng(t.spine_pitch),l=ng(t.spine_roll);rg(e,r,[`Spine`,`Spine1`],s,c,l,3),rg(e,r,[`Spine2`],ng(t.chest_yaw,s),ng(t.chest_pitch,c),ng(t.chest_roll,l),3);let u=e.index.Hips,d=ng(t.yaw);xo(e,r,u,r.P[u].slice(),J(Z(d),J(lo(ng(t.pitch)),uo(ng(t.roll)))));let f=U(tg(t.root,r.P[u]),r.P[u]);for(let e=0;e<r.P.length;e++)r.P[e]=H(r.P[e],f);let p=pg(d,ng(t.pitch),ng(t.roll)),m=p?.R??Z(d);for(let[n,a]of Object.entries(Zh)){if(!t[`foot_${n}`])continue;let o=tg(t[`foot_${n}`]);i[`leg_miss_${n}`]=Io(e,r,e.index[`${a}UpLeg`],e.index[`${a}Leg`],e.index[`${a}Foot`],o,Y(m,tg(t[`knee_${n}`],$h)),$h,`knee`);let s=No(e,r,a,o,eg);s>150&&(i[`leg_fold_${n}`]=s),Lo(e,r,a,ng(t[`fyaw_${n}`],d),ng(t[`fpitch_${n}`]),p)}for(let a of n.armOrder??[`r`,`l`]){let o=Zh[a],s=ng(t[`armw_${a}`]),c=e.index[`${o}Arm`],l=e.index[`${o}ForeArm`],u=e.index[`${o}Hand`],d=q(Y(m,tg(t[`elbow_${a}`],[0,-1,-.3])));if(i[`arm_miss_${a}`]=0,s>1e-4&&n.handTarget){let t=r.P[u].slice(),f=H(t,W(U(n.handTarget(a,r,i)??t,t),s));n.keepOut&&(f=n.keepOut(a,r,f));let p=n.push?.(a);p&&(f=H(f,p));let m=n.sag?.(a,r,f);m&&(f=H(f,m));let h=n.skinPush?.(a);h&&(f=H(f,W(h,Qh(s)))),n.softReach&&(f=og(e,r,c,l,u,f,i,a));let g=H(W(q(U(r.P[l],W(H(r.P[c],t),.5))),1-s),W(d,s));i[`arm_miss_${a}`]=Io(e,r,c,l,u,f,g,Ns,n.foldFree?null:`elbow`);let _=No(e,r,o,f);_>145&&!n.foldFree&&(i[`arm_fold_${a}`]=_)}Bo(e,r,o,ng(t[`wtwist_${a}`]),ng(t[`wflex_${a}`])),Go(e,r,o,t[`fingers_${a}`]);let f=n.hold?.(a,r);(!f||f.w<1)&&n.grip?.(a,r,i),f&&ic(e,r,o,f,Ns,i,a);let p=n.swivel?.(a);p&&(zo(e,r,o,p*Qh(s)),f||Xh(e,r,o));let h=n.heldShapes?.(a,r);h&&(i[`closed_${a}`]=Kh(e,r,o,h).touched),n.afterArm?.(a,r,i)}return{s:r,diag:i}}var hg=e=>typeof e?.prop==`string`,gg=e=>!hg(e)&&e?.follow!==void 0,_g=e=>!!e&&typeof e==`object`&&!Array.isArray(e)&&[`prop`,`follow`,`pivot`,`axis`,`channel`,`keys`,`fall`].every(t=>e[t]===void 0),vg=e=>!!e&&typeof e==`object`&&!_g(e);function yg(e,t,n,r){let i=t.props[r.prop];return W(i.origin.map(t=>n.P[e.index[t]]).reduce((e,t)=>H(e,t),[0,0,0]),1/i.origin.length)}function bg(e,t,n){let r=e.index[`${Zh[t.hand]}Hand`],i=e.restWorldPos,a=W(t.origin.map(t=>i[e.index[t]]).reduce((e,t)=>H(e,t),[0,0,0]),1/t.origin.length);return wo(n,r,Y(X(e.restWorldRot[r]),U(a,i[r])))}function xg(e,t,n,r,i=!1){let a=Ro(e,n,Zh[t.props[r.prop].hand]),o=i?bg(e,t.props[r.prop],n):yg(e,t,n,r),s=e=>H(W(a.d,e[0]),H(W(a.l,e[1]),W(a.n,e[2]))),c=q(s(r.along??[0,0,1])),l=U(a.d,W(c,G(a.d,c)));Math.hypot(...l)<1e-6&&(l=U(a.l,W(c,G(a.l,c)))),l=q(l);let u=no(l,c);return{pos:H(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 Sg=(e,t)=>({pos:H(e.pos,Y(e.R,t.pos)),R:J(e.R,t.R)}),Cg=(e,t)=>({pos:Y(X(e.R),U(t.pos,e.pos)),R:J(X(e.R),t.R)});function wg(e,t,n,r){let i=n[e.channel]?.[r]??0,a=fo(e.axis??[0,1,0],i);return{pos:H(e.pivot,Y(a,U(t.pos,e.pivot))),R:J(a,t.R??so()),angle:i}}var Tg=.06,Eg=.8,Dg=.045,Og=.3,kg=30,Ag=180/Math.PI,jg=2,Mg=[0,1,0],Ng=(e,t,n)=>[[e[0],t[0],n[0]],[e[1],t[1],n[1]],[e[2],t[2],n[2]]],Pg=(e,t)=>U(e,W(t,G(e,t)));function Fg(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 Ig(e,t,n,r,i){if(i.prop){let a=t.props?.[i.prop];if(!a)return null;let o=Ro(e,n,r),s=W(a.origin.map(t=>n.P[e.index[t]]).reduce(H,[0,0,0]),1/a.origin.length),[c,l,u]=i.point===`origin`?[0,0,0]:a.points?.[i.point]??[0,0,0];return H(s,H(W(o.d,c),H(W(o.l,l),W(o.n,u))))}let a=i.joints??[`${r}HandIndex2`,`${r}HandMiddle2`];return W(a.map(t=>n.P[e.index[t]]).reduce(H,[0,0,0]),1/a.length)}function Lg(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 Rg(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&&Vg(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 zg(e,t,n,r,i,a){let o=e.scene?.objects??{},s=i?.kind===`object`?_h(e.scene,i.object):Object.keys(o),c=null;for(let i of s){let s=o[i]?.half;if(!s)continue;let l=Rg(e,Lg(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=dc(r,d);(!c||f<c.d)&&(c={box:d,d:f,id:i})}let l=c&&Lg(e,c.id);return!c||l?.side===n&&Rg(e,l.key,n,t)===null?null:i?.kind===`object`||c.d<=Tg?{...c.box,id:c.id}:null}var Bg=[0,1,2];function Vg(e){let t=Bg.reduce((t,n)=>e[n]>e[t]?n:t,0);return Bg.filter(e=>e!==t).every(t=>e[t]<Dg)?t:-1}function Hg(e,t,n,r,i){let a=e===`Right`,o=Y(Z(r??0),[a?1:-1,0,0]),s=Math.abs(t[1]),c=Pg(H(W(Mg,1-s),W(o,s)),t),l=q(K(c)>.001?c:Pg(o,t)),u=i?Pg(i,t):null;if(!u||K(u)<=Og)return Ng(t,l,no(t,l));let d=e=>Math.acos(Math.max(-1,Math.min(1,G(e,n))))*Ag-(G(e,l)>0?kg:0),f=q(u),p=d(f)<=d(W(f,-1))?f:W(f,-1);return Ng(t,p,no(t,p))}function Ug(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(G(no(t,i),r),G(t,i))*Ag,[o,s]=js.twist,c=Math.min(s,Math.max(o,n+a))-n;if(Math.abs(c-a)<1e-6)return e;let l=Y(fo(r,c),t);return Ng(r,l,no(r,l))}function Wg(e,t,n,r,i,a,o,s){let c=Fg(e.spec,a,i),l=$p(e,i,o),u=c&&c.w>=.001&&Xp(e.spec,c.fit.anchor);if(l||u?Zp(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:nm(e,t,n,r,i,l);if(!c||c.w<.001)return;if(u)return em(e,t,n,r,i,a,s,c,n=>Ig(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&&Rg(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=H(lu(e,c.fit.anchor,n,s,a,i),c.fit.offset??[0,0,0]),m=zg(e,o,i,p,f,d),h=m&&Ig(t,e.spec,n,r,c.fit.effector??{});if(!h)return;let g=n=>({pos:Ig(t,e.spec,n,r,c.fit.effector??{}),R:(({d:e,l:t,n})=>Ng(e,t,n))(Ro(t,n,r))}),_=t.index,v=_[`${r}Arm`],y=_[`${r}ForeArm`],b=_[`${r}Hand`],x=Vg(m.half),S=x>=0?Y(m.R,Bg.map(e=>+(e===x))):null;if(S&&Math.abs(S[1])>Eg&&!Lg(e,m.id))return em(e,t,n,r,i,a,s,c,n=>Ig(t,e.spec,n,r,c.fit.effector??{}),{w:{p,axis:S},type:`power`},o);let C=Ro(t,n,r),w=q(Pg(C.l,C.d)),T=q(U(n.P[b],n.P[y])),E=J(n.R[y],J(X(t.restWorldRot[y]),t.restWorldRot[b])),D=Gs(E,n.R[b],T,Y(J(E,X(n.R[b])),C.l)).twist,{goal:O,plane:k,wristAt:ee}=rc(t,n,r,{pos:h,R:Ug(Hg(r,C.d,w,a.yaw,S),w,D)},g(n),c.w,`palm`),A={twist:0,flex:0,dev:0};for(let e=0;e<jg;e++)Io(t,n,v,y,b,ee(e?n.R[b]:O),k,Ns,`elbow`),A=tc(t,n,r,b,y,O);s[`grip_${i}`]={w:c.w,...A}}var Gg={period:3.8,deg:.8},Kg={yaw:.9,pitch:.6},qg={period:5.6,m:.012,list:1.4},Jg=.5,Yg=1e-4,Xg=2*Math.PI,Zg=e=>e*e*(3-2*e),Qg=(e,t)=>Array.isArray(e)?e.some((e,n)=>Math.abs(e-t[n])>Yg):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 $g(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*Xg})}function e_(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=>Qg(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(Jg*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=>Zg(Math.min(1,e/s)))}function t_(e,t,n,r){let i={},a=Math.max(1,Math.round(Jg*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-Zg(Math.min(1,e/a)))}return i}function n_(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=e_(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]=$g(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*Gg.deg*Math.sin(Xg*n/Gg.period+l),head_yaw:r*Kg.yaw*(.6*Math.sin(Xg*n/7.3+u)+.4*Math.sin(Xg*n/11.9+p)),head_pitch:r*Kg.pitch*Math.sin(Xg*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(Xg*n/qg.period+f),g=(e.yaw?.[t]??0)*Math.PI/180;o.root=[Math.cos(g)*qg.m*h,0,-Math.sin(g)*qg.m*h],o.roll=qg.list*h,o.spine_roll=-qg.list*h}return m}function r_(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;for(let t of[`chest_pitch`,`chest_roll`])e[t]!==void 0&&r[t.replace(`chest`,`spine`)]!==void 0&&(i[t]=e[t]+r[t.replace(`chest`,`spine`)]);return i}var i_=(e,t,n)=>Math.min(n,Math.max(t,e));function a_(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 o_={noise:.02,side:.03,first:.22,second:.08,last:.22,beforeLast:.08,turn:0},s_={noise:.025,side:.012,stride:.035,second:.05,beforeLast:.06,turn:.06},c_={noise:.1,first:.1,last:.25},l_=.1,u_=3,d_=60;function f_(e,{s0:t,turn:n,seed:r}){let i=e.steps,a=i_(e.vary??1,0,2),o=a_(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/d_)}),h=i>=4,g=s.map((e,t)=>{if(i<2)return 1;let n=(t===0||t===i-1?.5:1)*(o_.noise*e.time+o_.side*l(t))+o_.turn*m[t];return t===0&&(n+=o_.first*(1-m[0])),t===1&&h&&(n+=o_.second),t===i-1&&(n+=o_.last),t===i-2&&h&&(n+=o_.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+u_:1/0)}),S=f.map((e,t)=>t>0&&t<i-1),C=s.map((e,t)=>{if(!S[t])return 1;let n=s_.noise*(.7*e.length+.3*e.time)+s_.side*l(t)+s_.stride*d(t)-s_.turn*m[t];return t===1&&h&&(n-=s_.second),t===i-2&&h&&(n-=s_.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*(c_.noise*t.lift-(n===0?c_.first:0)-(n===i-1&&i>1?c_.last:0)))),arm:s.map(e=>1+a*l_*e.arm)}}var p_=18,m_=22,h_=7,g_=45,__=1,v_=.4,y_=50,b_=15,x_=13,S_={strike:4,load:4,mid:3,toeOff:5},C_={strike:2,load:14,mid:7,toeOff:48,pow:1.8},w_=[1,2.2],T_=e=>{let t=Math.min(1,Math.max(0,((e??w_[1])-w_[0])/(w_[1]-w_[0])));return t*t*(3-2*t)},E_=.004,D_=8,O_=.008,k_=.35,A_=.001,j_=.25,M_=[.25,.5],N_=.008,P_=e=>e*e*e*(e*(6*e-15)+10),F_=new WeakSet,I_=(e,t,n,r)=>H(e,Y(Z(t),Y(lo(n),Y(Z(-t),U(r,e)))));function L_(e,t,n){let r=e.index,i=e.restWorldPos,a=K(U(i[r.LeftLeg],i[r.LeftUpLeg])),o=K(U(i[r.LeftFoot],i[r.LeftLeg])),s=Math.min(1,Math.max(0,(x_-t)/4)),c=T_(n),l=(e,t)=>e+(t-e)*c,u=l(C_.strike,p_)+s*S_.strike,d=l(C_.load,m_)+s*S_.load,f=l(C_.mid,h_)+s*S_.mid,p=l(C_.toeOff,g_)+s*S_.toeOff;return{reach:e=>Math.sqrt(a*a+o*o+2*a*o*Math.cos(e*Math.PI/180)),hipOff:{l:U(i[r.LeftUpLeg],i[r.Hips]),r:U(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(C_.pow,__)}}var R_=(e,t,n)=>H(e.root[t],Y(Z(e.yaw?.[t]??0),Y(uo(e.roll?.[t]??0),n)));function z_(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}=L_(e,i,a),g=Math.max(2,Math.round(k_*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/v_;return e.strike&&n<1?(n<.5?f:m)+(p-(n<.5?f:m))*Math.sin(Math.PI*n):m},v=pd(t,r+1),y=l[c.Hips][1]-O_,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)/D_,(r-t)/D_),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=Y(Z(i),Y(uo(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-E_*Math.log(s.reduce((e,t)=>e+Math.exp(-(t-c)/E_),0)))-A_,f=Math.min(1,(e-n)/D_,(r-e)/D_),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=Y(Z(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(j_*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+M_[0]*r);n<=Math.floor(e.f+M_[1]*r);n++){let r=S[n];for(let t=e.f+1;t<n;t++){let i=P_((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=P_((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+N_*(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=V_(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 B_(e,t,{end:n,period:r,pace:i,ground:a}){let{reach:o,hipOff:s,trail:c}=L_(e,r,i),l=pd(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=R_(l,t,s[e]),u=o(c((t-r.heel)/Math.max(1,r.b-r.heel))),f=e=>K(U(n,I_(r.ball,r.yw,e,r.flat)))-u,p=d,m=y_;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*b_)));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=I_(r.ball,r.yw,f[o],r.flat),c=K(U(i,s))-a;c>0&&(s=H(s,W(U(i,s),c/K(U(i,s))))),t.push({f:n,set:{[`foot_${e}`]:s,[`fpitch_${e}`]:f[o],[`fyaw_${e}`]:r.yw},src:u.get(n)})})}}function V_(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 H_=3,U_=.35,W_=.2,G_=.03,K_=.04,q_=.025,J_=e=>e*180/Math.PI,Y_=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)};function X_(e,t,n,r,i){let a=U(t,e),o=Math.min(r+i-1e-6,Math.max(Math.abs(r-i)+1e-6,K(a))),s=W(a,1/K(a)),c=U(n,W(s,G(n,s)));c=W(c,1/(K(c)||1));let l=(r*r+o*o-i*i)/(2*r*o),u=U(t,H(e,H(W(s,r*l),W(c,r*Math.sqrt(Math.max(0,1-l*l))))));return J_(Math.atan2(-G(u,n),-u[1]))}function Z_(e,{end:t,ground:n,sk:r}){let i=pd(e,t+2),a=new Map(e.map(e=>[e.f,e.src])),o=r?.index,s=r?.restWorldPos,c=r&&K(U(s[o.LeftLeg],s[o.LeftUpLeg])),l=r&&K(U(s[o.LeftFoot],s[o.LeftLeg]));for(let u of[`l`,`r`]){let d=n[u],f=u===`l`?`Left`:`Right`,p=r&&U(s[o[`${f}UpLeg`]],s[o.Hips]),m=r&&U(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=>!F_.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=U(y(o.b),y(o.b-1)),x=U(y(s.a+1),y(s.a)),S=[0,1,2].map(e=>V_(_,_.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)=>X_(R_(i,e,p),t,Y(Z(C(e)),[0,0,1]),c,l)-H_,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(y_,T(t,n)+D*(1-Y_((t-o.b)/(U_*E)))+O*(1-Y_((s.a-t)/(W_*E)))),r=h+G_*Y_(Math.min(t-o.b,s.a-t)/3),a=e=>n[1]+Y(lo(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]+Y(lo(e),g)[1],d=Math.min(K_,Math.max(l(c),q_));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)};F_.add(c),e.push(c)}}}}var Q_=[6,4],$_=50,ev=1.1,tv=[18,3],nv=[6,3],rv=8,iv=4.5,av=5.5,ov=.015,sv=[.52,.64],cv=.3,lv=4,uv=6.4,dv=.8,fv=e=>io(.66-.18*e,.2,.48),pv=e=>io(.32-.11*e,0,.45),mv=e=>io(2.8-.45*e,1.2,3),hv=.92,gv=e=>io(4.7-1.1*e,1.8,4),_v=[.2,.6],vv=.9,yv=.18,bv=.35,xv=.18,Sv=.55,Cv=10,wv=.22,Tv=.03,Ev=50,Dv=e=>Y(Z(e),[0,0,1]),Ov=e=>Y(Z(e),[1,0,0]),kv=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)};function Av(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 jv(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=Av(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:U(l[c.LeftToeBase],l[c.LeftFoot]),r:U(l[c.RightToeBase],l[c.RightFoot])},p=[0,.005-u,-.045],m={l:-1/0,r:-1/0},h=K(U(l[c.LeftLeg],l[c.LeftUpLeg]))+K(U(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??io(uv*x,4,22);let S=fv(x),C=pv(x),w=mv(x),T=gv(x),E=io(vv*x,0,3),D=tv[0]+tv[1]*Math.min(x,2.5),O=nv[0]+nv[1]*Math.min(x,2.5),[k,ee]=b.heading??[s.yaw??0,s.yaw??0],A=e=>k+(ee-k)*kv(e/b.turnDistance),te=W(H(s.foot_l,s.foot_r),.5);te[1]=0;let ne=[te];for(let e=0;e<4e3;e++)ne.push(H(ne[e],W(Dv(A(e*.01)),.01)));let re=e=>ne[Math.max(0,Math.min(ne.length-1,Math.round(e/.01)))],ie=(e,t)=>{let n=H(re(e),W(Ov(A(e)),(t===`l`?1:-1)*b.halfWidth));return n[1]=u,n},ae={l:-.07,r:.07},oe={foot_l:s.foot_l,foot_r:s.foot_r,fyaw_l:s.fyaw_l??k,fyaw_r:s.fyaw_r??k},se=[`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`],ce=s.roll??0,le=s.spine_roll??0,ue=s.spine_pitch??0,de={l:[{a:e.f0,b:1/0,strike:!1}],r:[{a:e.f0,b:1/0,strike:!1}]};o(e.f0,Object.fromEntries(se.map(e=>[e,s[e]??oe[e]??(e===`yaw`?k:0)])));let fe=ae.r,pe=null,me=f_(b,{s0:fe,turn:(e,t)=>A(t)-A(e),seed:[e.f0,b.steps,b.step,b.period,b.swing,b.firstStep,k,ee,te[0].toFixed(3),te[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?fe:fe+me.inc[t],u=e.f0+16+me.lift[t],h=u+me.air[t],g=u+Math.floor(me.air[t]/2);if(t===0){let e=H(re(ae[a]),W(Ov(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=io(Math.abs(l-ae[n])/ev,.3,1.15),te=$_*(.55+.45*ee)*(c?.8:1),ne=oe[`foot_${n}`],se=oe[`fyaw_${n}`],he=H(ne,Y(Z(se),f[n])),ge=Math.max(u-Math.max(lv,Math.round((t===0?.35:cv)*b.period)),m[n]+1,e.f0+1);Object.assign(de[n].at(-1),{b:u,heel:ge,ball:he,yw:se,flat:ne});for(let e=ge;e<=u;e++){let t=te*((e-ge)/Math.max(1,u-ge))**1.8;o(e,{[`foot_${n}`]:I_(he,se,t,ne),[`fpitch_${n}`]:t,[`fyaw_${n}`]:se})}let _e=Math.max(1,Math.round(wv*me.air[t])),ve=ie((ae[n]+l)/2,n);ve[1]+=me.height[t];let ye=I_(he,se,Math.min(te,Ev),ne),be=H(ye,W(U(ve,ye),bv));be[1]=ye[1]+xv*ee*Math.min(1,(me.air[t]/Cv)**2)*(Sv+.44999999999999996*T_(x))*(me.height[t]/b.lift);let xe=W(Ov(A(ae[a])),n===`l`?1:-1),Se=oe[`foot_${a}`],Ce=e=>(e[0]-Se[0])*xe[0]+(e[2]-Se[2])*xe[2],we=Ce(ve)-Ce(be);we>0&&(be[0]+=xe[0]*we,be[2]+=xe[2]*we);let Te=u+Math.max(2,Math.round(yv*me.air[t]));!c&&Te<g-1&&o(Te,{[`foot_${n}`]:be,[`fpitch_${n}`]:.7*Math.min(te,Ev)}),o(g,{[`foot_${n}`]:ve,[`fyaw_${n}`]:A((ae[n]+l)/2),[`fpitch_${n}`]:0});let Ee=ae[a]+(sv[0]+(sv[1]-sv[0])*T_(x))*(l-ae[a]),De=pe?pe.s+(Ee-pe.s)*((g-pe.f)/(h-pe.f)):null,Oe=De===null?ae[a]+.03:De-ov*Math.abs(l-ae[n])/2,ke=t===0?.015:.032,Ae=H(re(Oe),W(Ov(A(Oe)),(a===`l`?1:-1)*ke));Ae[1]=d+b.pelvisHigh;let je=e.pelvisLow??(me.inc[t]>_?Math.min(b.pelvisLow,y(Math.hypot(me.inc[t]/2,v))):b.pelvisLow),Me=re(Ee).slice();Me[1]=d+(c?b.pelvisHigh:je),pe={f:h,s:Ee};let Ne=ie(l,n),Pe=A(l),Fe=H(Ne,Y(Z(Pe),p)),Ie=-(Q_[0]+(Q_[1]-Q_[0])*T_(x))*(c?.5:1),Le=Math.max(2,Math.round(.2*b.period)),Re=H(I_(Fe,Pe,Ie,Ne),W(Dv(Pe),-.12*Math.abs(l-ae[n])));Re[1]+=Tv,!c&&_e>1&&h-_e>g+1&&o(h-_e,{[`foot_${n}`]:Re,[`fpitch_${n}`]:.6*Ie});for(let e=0;e<=Le;e++){let t=Ie*(1-kv(e/Le));o(h+e,{[`foot_${n}`]:I_(Fe,Pe,t,Ne),[`fpitch_${n}`]:t,[`fyaw_${n}`]:Pe})}m[n]=h+Le,de[n].push({a:h,b:1/0,strike:!0}),oe[`foot_${n}`]=Ne,oe[`fyaw_${n}`]=Pe,ae[n]=l;let ze=(c?0:t<3?[0,.3,.7][t]:1)*me.arm[t],Be=n===`l`?1:-1,Ve=io(ee,.4,1.1),He=c?0:t===0?.5:1,Ue=iv*Ve*He*(a===`l`?1:-1),We=(h-g)/b.period,Ge=e=>{let t=[Math.cos(Math.PI*(e-We)),Math.cos(Math.PI*e)];return t.map(e=>e/Math.max(...t.map(Math.abs)))},Ke=Ge(-C).map(e=>-4.5*Ve*Be*ze*e),qe=Ge(S).map(e=>av*Ve*Be*ze*e),Je=Ge(hv).map(e=>-Math.sign(Ue)*w*Ve*He*e),Ye=Ge(We).map((e,t)=>t?dv*e:e),Xe=e=>({aswing_l:-.85*b.armSwing*Be*ze*e,aswing_r:b.armSwing*Be*ze*e,abend_l:ze*(D-Be*O*e),abend_r:ze*(D+Be*O*e)});o(g,{root:Ae,yaw:A(Oe)+Ke[0],roll:ce+Ue,spine_roll:le-Ue*1.26+Je[0],spine_yaw:qe[0]-Ke[0],...Xe(Ye[0]),wflex_l:rv*ze,wflex_r:rv*ze}),o(h,{root:Me,yaw:A(Ee)+Ke[1],roll:ce,spine_roll:le+Je[1],spine_yaw:qe[1]-Ke[1],...Xe(Ye[1]),head_yaw:0});let Ze=ue+E*He,Qe=T*Ve*He;o(Math.max(e.f0+1,h-Math.round(_v[1]*b.period)),{spine_pitch:Ze-.6*Qe}),o(Math.max(e.f0+1,h-Math.round(_v[0]*b.period)),{spine_pitch:Ze+Qe}),fe=l}let he=e.f0+16+b.steps*b.period+18,ge=Math.max(...a.map(e=>e.f));return e.pelvisHigh===void 0&&e.pelvisLow===void 0&&(Z_(a,{end:ge,ground:de}),z_(n,a,{f0:e.f0,end:ge,period:b.period,pace:x,ground:de,start:`${r} start`}),B_(n,a,{end:ge,period:b.period,pace:x,ground:de}),Z_(a,{end:ge,ground:de,sk:n})),i=`${r} end`,o(he,Av(a,he)),a}function Mv(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(jv(e,n,t,`generators[${r}] walk`))}),n}var Nv={yaw:.5,pitch:.2,roll:.7},Pv={yaw:4,pitch:6,roll:10},Fv=33,Iv=8,Lv=[`yaw`,`pitch`,`roll`];function Rv(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 zv=(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 Bv(e,t,n){let r=Rv(t);if(!r.length)return;let i=t=>e[t]??Array(n).fill(0);for(let a of Lv){let o=i(`spine_${a}`),s=i(a).map((e,t)=>e+o[t]),c=zv(s,Fv),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)/Iv,(o-t)/Iv),r=Math.max(-Pv[a],Math.min(Pv[a],s[t]-c[t]));l[t]-=Nv[a]*r*n*n*(3-2*n)}}l&&(e[`head_${a}`]=l)}}function Vv(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 Hv=e=>Math.round(e*1e4)/1e4,Uv=6;function Wv(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(Zh)){if(!(a[`leg_miss_${e}`]>5e-4)||!Array.isArray(o[`foot_${e}`]))continue;let l=.999*(K(U(i[r[`${c}Leg`]],i[r[`${c}UpLeg`]]))+K(U(i[r[`${c}Foot`]],i[r[`${c}Leg`]]))),u=U(o[`foot_${e}`],n.P[r[`${c}UpLeg`]]),d=u[1]*u[1]-G(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=Vv(s,Uv),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:Hv(Math.max(...s)),how:`hips lowered`}}function Gv(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:Hv(n),how:`wrist target clamped to reach`}:null}var Kv=.01,qv=.97,Jv=25,Yv=.08,Xv=.15,Zv=10,Qv=.002,$v=[.25,.5,.75,1],ey=e=>e*e*(3-2*e);function ty(e,t,n,r){if(!(t[`armw_${n}`]>=.5))return null;let i=null;for(let[e,r]of Object.entries(t)){let t=/^w_(.+)_([lr])$/.exec(e);t&&t[2]===n&&r>=.5&&(!i||r>i.w)&&(i={w:r,name:t[1]})}let a=i&&e.spec.anchors?.[i.name];return a&&(a.kind===`world`||a.kind===`object`&&!e.objectHand?.(a.object,r))?i.name:null}function ny(e,t,n,r){let{s:i}=e.frames[t-e.f0],a=e.ctx.sk.index,o=e.ctx.scene?.objects??{},s=Object.entries(e.objectsAt(t-e.f0)??{}).filter(([,e])=>e.half&&!e.ignore),c=e=>r!==void 0&&(e===r||o[e]?.ancestors?.includes(r)),l=0;for(let[e,t,r,o]of lc){if(a[t]===void 0||a[r]===void 0)continue;let u=uc(i.P[a[t]],i.P[a[r]],5);for(let[t,r]of s)e===`hand_${n}`&&c(t)||(l+=Math.max(0,o-Math.min(...u.map(e=>dc(e,r)))))}return l}function ry(e,t,n){let r=0;return Cf(e,{frames:t},n,(e,t,n,i,a)=>{r+=i-a}),r}function iy(e,t,n,r){if(r?.prop)return n.props?.[r.prop]?.[r.point]??null;let i=(r?.joints??[`RightHandIndex2`,`RightHandMiddle2`]).map(n=>t.P[e.index[n]]).filter(Boolean);return i.length?i.reduce((e,t)=>e.map((e,n)=>e+t[n]/i.length),[0,0,0]):null}function ay(e,t,n){let r=[];e.frames.forEach((i,a)=>{let o=e.f0+a;if(!(i.diag[`arm_miss_${t}`]>n)||i.diag[`arm_fold_${t}`]||!ty(e.ctx,i.c,t,o))return;let s=r.at(-1);s&&o-s[1]<=3?s[1]=o:r.push([o,o])});let i=r=>r>=e.f0&&r<e.f0+e.frames.length&&e.frames[r-e.f0].diag[`arm_miss_${t}`]>n&&!e.frames[r-e.f0].diag[`arm_fold_${t}`];for(let e of r)for(let t=0;t<Zv&&i(e[1]+1);t++)e[1]+=1;return r}function oy(e,t){let{ctx:n}=e,{sk:r}=n,i=r.index,a=e.frameCount,o=e.baked,s=n.spec.checks?.limits?.reach??.01,c=t=>e.frames[t-e.f0],l=e.f0,u=e.f0+e.frames.length-1,d=[],f={pitch:new Float64Array(a),move:new Float64Array(a)},p=[];for(let m of[`r`,`l`])for(let[h,g]of ay(e,m,s)){let s=e=>c(e).s.P[i[`${Zh[m]}Arm`]],_=e=>{let{s:t,diag:r,c:i}=c(e),a=ty(n,i,m,e);return a?lu(n,a,t,{...r,frame:e},i):null},v=e=>c(e).c[`armw_${m}`]>=.99&&c(e).c[`w_${ty(n,c(e).c,m,e)}_${m}`]>=.99,y=Array.from({length:g-h+1},(e,t)=>h+t),b=y.some(v)?y.filter(v):y,x=-1,S=null;for(let e of b){let t=_(e);t&&(!S||K(U(t,s(e)))>K(U(S,s(x))))&&(x=e,S=t)}if(!S)continue;let{s:C,diag:w,c:T}=c(x),E=m===`l`?`r`:`l`,D=(n.spec.fits??[]).find(e=>e.side===m&&e.anchor===ty(n,T,m,x)),O=D&&iy(r,C,w,D.effector),k=Math.max(O?K(U(O,S)):0,w[`arm_miss_${m}`]??0),ee=su(r,m)+(O?K(U(O,C.P[i[`${Zh[m]}Hand`]])):0),A=s(x),te=(T.yaw??0)*Math.PI/180,ne=[Math.sin(te),0,Math.cos(te)],re=[S[0]-A[0],0,S[2]-A[2]],ie=K(re)>.001?q(re):ne,ae=G(ie,ne)>.3&&S[1]<A[1]+.1?Jv:0,oe=Xv*Math.min(1,Math.max(0,(A[1]-S[1]-.2)/.4)),se=Math.max(0,1-Math.max(f.pitch[x]/Jv,f.move[x]/Yv));if(!se)continue;o.root||(o.root=Array.from({length:a},()=>r.restWorldPos[i.Hips].slice()),p.push(`root`)),o.spine_pitch||(o.spine_pitch=Array(a).fill(0),p.push(`spine_pitch`));let ce=o.root.map(e=>e.slice()),le=o.spine_pitch.slice(),ue=(e,t)=>{o.root[e]=[ce[e][0]+ie[0]*Yv*t,ce[e][1]-oe*t,ce[e][2]+ie[2]*Yv*t],o.spine_pitch[e]=le[e]+ae*t},de=(e,t)=>[`l`,`r`].every(n=>!((e[`leg_miss_${n}`]??0)>Math.max(t[`leg_miss_${n}`]??0,5e-4)+Qv)),fe=(e,t)=>!(c(x).c[`armw_${E}`]>.5)||(e[`arm_miss_${E}`]??0)<=(t[`arm_miss_${E}`]??0)+Qv,pe=n.spec.anchors[ty(n,T,m,x)]?.object,me=c(x),he=ny(e,x,m,pe),ge=n=>{ue(x,n),t.solve([x]);let{s:i,diag:a}=c(x),l=D&&iy(r,i,a,D.effector),u={t:n,miss:Math.max(l?K(U(l,S)):0,a[`arm_miss_${m}`]??0),ok:de(a,w)&&fe(a,w)&&ny(e,x,m,pe)<=he+Qv,bent:K(U(S,s(x)))<=qv*ee};return o.root[x]=ce[x],o.spine_pitch[x]=le[x],e.frames[x-e.f0]=me,u},_e=null,ve=0;for(let e of $v.map(e=>e*se)){let t=ge(e);if(!t.ok)break;if((!_e||t.miss<_e.miss)&&(_e=t),t.miss<=Kv&&t.bent){let t=ve,n=e;for(let e=0;e<4;e++){let e=ge((t+n)/2);e.ok&&e.miss<=Kv&&e.bent?(n=e.t,_e=e):t=e.t}break}ve=e}if(!_e||!(_e.miss<k-Kv))continue;let ye=(e,t)=>Math.min(1,Math.max(0,o[e]?.[t]??1)),be=ty(n,T,m,x),xe=[],Se=e=>ye(`armw_${m}`,e)*ye(`w_${be}_${m}`,e)*(e>=h&&e<=g?1:ey(1-(e<h?h-e:e-g)/11));for(let e=Math.max(l,h-Zv);e<=Math.min(u,g+Zv);e++)ue(e,_e.t*Se(e)),xe.push(e);let Ce=xe.map(e=>c(e)),we=xe.map(t=>ny(e,t,m,pe));t.solve(xe);let Te=e=>Ce[e-xe[0]],Ee=(e,t)=>{let n=_(t),i=D&&n&&iy(r,e.s,e.diag,D.effector);return Math.max(i?K(U(i,n)):0,e.diag[`arm_miss_${m}`]??0)},De=e=>y.reduce((t,n)=>t+(e(n).diag[`arm_miss_${m}`]??0),0),Oe=e=>Math.max(...b.map(t=>Ee(e(t),t))),ke=xe.map(t=>ny(e,t,m,pe)),Ae={...Wf,...n.spec.checks?.limits},je=Array.from({length:Math.min(u,xe.at(-1)+3)-Math.max(l,xe[0]-3)+1},(e,t)=>Math.max(l,xe[0]-3)+t),Me=ry(r,je.map(e=>c(e)),Ae)>ry(r,je.map(e=>e>=xe[0]&&e<=xe.at(-1)?Ce[e-xe[0]]:c(e)),Ae)+1e-4,Ne=xe.every((e,t)=>de(c(e).diag,Ce[t].diag)&&fe(c(e).diag,Ce[t].diag)&&ke[t]<=we[t]+Qv),Pe=Oe(Te),Fe=Oe(c);if(!Ne||Me||!(De(c)<De(Te)-1e-6)||!(Fe<Pe-Kv/2)){for(let e of xe)o.root[e]=ce[e],o.spine_pitch[e]=le[e];xe.forEach((t,n)=>{e.frames[t-e.f0]=Ce[n]});continue}for(let e of xe)f.pitch[e]+=ae*_e.t*Se(e),f.move[e]+=Yv*_e.t*Se(e);d.push({side:m,frames:[h,g],lean:Hv(ae*_e.t),shift:[Hv(ie[0]*Yv*_e.t),Hv(ie[2]*Yv*_e.t)],drop:Hv(oe*_e.t),miss:[Hv(Pe),Hv(Fe)]})}if(!d.length)for(let e of p)delete o[e];return d.length?{runs:d,how:`an out-of-reach hand on a pinned target: the body leaned (spine_pitch deg), shifted its hips (x, z m) and lowered them (m) toward it, eased in and out; the feet kept their targets`}:null}var sy=.01,cy=4,ly=.03,uy=.02;function dy(e,t){let n=e.frames.length,r=Wf.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)=>ff(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=U(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=H(u[c-1][t],p)),g(c)}if(m&&l>=sy)for(;c<n&&u[c][t][1]<ly;c++)g(c);if(l>2e-4&&(l<sy||m)){i++,o=Math.max(o,l),l>=sy&&a++;for(let[e,t]of h)f[e]=t;let e=Math.max(cy,Math.ceil(Math.hypot(p[0],p[2])/uy));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]=H(l[n],f[t]),s.add(n)}}return i?(t.solve([...s]),{plants:i,...a?{pivots:a}:{},frames:s.size,max:Hv(o),how:a?`planted heel/ball held in place; turning feet pivot on it`:`planted heel/ball held in place`}):null}var fy=6,py=4,my=1,hy=e=>e*e*(3-2*e);function gy(e,t){let n=e.frames.length,r=Wf.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)=>ff(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<=my){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(py,Math.ceil(Math.abs(o)/fy));for(let e=0;o&&e<s&&r+e<n&&!u(r+e);e++)f[r+e]=d[r+e]-o*(1-hy((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:Hv(a)}):null}var _y=.001,vy=.15,yy=2;function by(e,t){let{sk:n}=e.ctx,r=e.frames.length,i=new Set,a=0;for(let[t,o]of Object.entries(Zh)){let s=e.baked[`foot_${t}`],c=n.index[`${o}Foot`];if(!s)continue;let l=e.frames.map(({s:t},r)=>{let i=gc(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(vy,-a-_y)});if(!l.some(e=>e>0))continue;let u=Vv(l,yy);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:Hv(a),how:`soles lifted onto the floor`}):null}var xy=4,Sy=.002,Cy=3,wy={l:lc.filter(e=>e[0]===`hand_l`||e[0]===`farm_l`),r:lc.filter(e=>e[0]===`hand_r`||e[0]===`farm_r`)};function Ty(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 wy[t]){let t=qf(r,l,e)??Wf.allow,p=uc(s.P[o[u]],s.P[o[d]]),m=p.map(e=>dc(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=H(d??[0,0,0],W(_c(c[1],a),c[0]+Sy)))}if(d){if(!(l[`armw_${t}`]>1e-4)){i.skipped++;continue}c[a]=d}}return c}function Ey(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<Cy;c++){a.deep=0,a.skipped=0;let c=new Set;for(let t of[`l`,`r`]){let l=Ty(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-xy-1);t<=Math.min(i-1,e+xy+1);t++){let n=1-Math.abs(e-t)/5,r=W(l[e],n*n*(3-2*n));(!d[t]||K(r)>K(d[t]))&&(d[t]=r)}}for(let t=0;t<i;t++){if(!d[t])continue;let n=e.f0+t,r=H(u.get(n)??[0,0,0],d[t]);u.set(n,r),s=Math.max(s,K(r)),c.add(n)}}if(!c.size)break;t.solve([...c])}return!o.size&&!a.skipped?null:{frames:o.size,max:Hv(s),skipped:a.skipped,tooDeep:a.deep,how:`hand pushed out along the box normal`}}var Dy=1.1,Oy=.35,ky=3,Ay=e=>{let t=e.ctx.spec?.checks?.limits;return Ff(e.ctx.sk,e,t,{...Wf,...t})};function jy(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 My(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:Dy*i}}),i=e=>r.reduce((t,n)=>t+n.len*Math.max(n.need,e),0),a=Oy,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 Ny(e,t){let n=e.frames.length,r=[],i=0,a=1;for(let o=0;o<ky;o++){let o=Ay(e),s=[...new Set(e.keys.map(e=>e.f))].sort((e,t)=>e-t),c=jy(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=My(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=Ay(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 Py=Array.from({length:19},(e,t)=>-90+t*10),Fy=3,Iy=5,Ly=.003,Ry=.003,zy=.03,By=.08,Vy=.03,Hy=40,Uy=.05,Wy=4,Gy=2,Ky=.09,qy=400;function Jy(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 Yy=10,Xy={l:`Left`,r:`Right`};function Zy(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 Qy=Object.fromEntries(lc.map(e=>[e[0],e[3]]));function $y(e,t,n,r){let i=0;for(let a of e)i=Math.max(i,r-Math.min(...uc(t,n,5).map(e=>dc(e,a))));return i}function eb(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?H(l,Y(fo(U(u,l),i),U(n.P[c],l))):n.P[c],f=Math.max(Os(e,t,n,s,l,d),Os(e,t,n,c,d,u)),p=r===`Left`?`l`:`r`;return{depth:f,scene:a.length?Math.max($y(a,l,d,Qy[`uarm_${p}`]),$y(a,d,u,Qy[`farm_${p}`])):0,rise:Math.max(0,d[1]-(l[1]-Ky)),under:l[1]-d[1]}}var tb=(e,t)=>{let n=e.index,r=e.restWorldPos;return K(U(r[n[`${t}ForeArm`]],r[n[`${t}Arm`]]))+K(U(r[n[`${t}Hand`]],r[n[`${t}ForeArm`]]))};function nb(e,t,n){let{sk:r}=e.ctx,i=Xy[n],a=e.frames.length,o=e.ctx.swivel[n],s=e.frames.map(({s:a,c:s},c)=>{let l=Qh(s[`armw_${n}`]??0),u=(o.get(e.f0+c)??0)*l;if(!u&&eb(t,r,a,i,0).depth<=Ry)return null;let d=a.P[r.index[`${i}Arm`]],f=tb(r,i)+.15,p=Object.values(e.objectsAt(c)).filter(e=>e.half&&!e.ignore&&K(U(H(e.pos,Y(e.R,[0,e.half[1],0])),d))-K(e.half)<f),m=eb(t,r,a,i,-u,p).scene,h=Jy(e,c,i);return Py.map(e=>{let{depth:n,scene:o,rise:s,under:c}=eb(t,r,a,i,e*l-u,p),d=Math.max(0,n-Ry)*100,f=h===null?0:Math.max(0,h-c),g=Math.max(0,o-Math.max(m,Ry))*100;return Hy*(d*d+g*g)+Uy*(e/10)**2+Wy*(s*100)**2+qy*(f*100)**2})});if(s.every(e=>!e))return null;let c=Py.indexOf(0),l=Py.map((e,t)=>t===c?0:1/0),u=Py.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<Py.length;e++){if(Math.abs(Py[t]-Py[e])>Yy)continue;let r=n[e]+Gy*((Py[t]-Py[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]=Py[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 rb(e,t,n,r){let{sk:i}=e.ctx,a=Xy[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-Zy(e.ctx.spec,d,n);if(p<.05)continue;let m=null;for(let n of[o[`${a}Hand`],o[`${a}ForeArm`]]){let r=ks(t,i,s,n);if(r.into<0||l.includes(r.into))continue;let a=Math.min(Vy,qf(e.ctx.spec.checks?.allow,rf(i,n),rf(i,r.into))??0),o=r.depth-Math.max(a,Ry);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=K(e.ctx.skinPush[n].get(f)??[0,0,0]);if(h>=By){r.deep++;continue}let g=vs(t,s,m.p,new Set([...t.skip.get(m.b),...l]));g&&(c[u]=W(g,p*Math.min(zy,By-h,m.past+Ly)))}let u=Array(s).fill(null);return c.forEach((e,t)=>{if(e)for(let n=Math.max(0,t-Iy-1);n<=Math.min(s-1,t+Iy+1);n++){let r=1-Math.abs(t-n)/6,i=W(e,r*r*(3-2*r));(!u[n]||K(i)>K(u[n]))&&(u[n]=i)}}),u}function ib(e,t){let n=ps(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<Fy;r++){let r=new Set;for(let t of[`r`,`l`]){let i=nb(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`])rb(e,n,t,i).forEach((n,i)=>{if(!n)return;let a=e.f0+i,s=H(e.ctx.skinPush[t].get(a)??[0,0,0],n);e.ctx.skinPush[t].set(a,s),c=Math.max(c,K(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)=>H(e,W(a[Math.min(r-1,Math.max(0,o+t))],[1,4,6,4,1][n]/16)),[0,0,0]);K(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:Hv(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 ab=[`reach`,`slide`,`penetration`,`self`,`retime`,`stance`,`grasp`];function ob(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 sb=(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,cb=(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 lb(e,t,n,{whole:r=!0}={}){let i={},a=(e,t)=>{t&&(i[e]=t)};return t.retime&&r&&a(`retime`,Ny(e,n)),t.slide&&a(`ground`,by(e,n)),t.reach&&a(`reachLegs`,Wv(e,n)),t.reach&&a(`reachBody`,oy(e,n)),t.slide&&a(`slide`,sb(gy(e,n),dy(e,n))),t.reach&&i.slide?.pivots&&a(`reachLegs`,cb(i.reachLegs,Wv(e,n))),t.penetration>0&&a(`penetration`,Ey(e,n,t.penetration)),t.self&&a(`self`,ib(e,n)),t.reach&&a(`reachArms`,Gv(e)),i}var ub=.15,db=.12,fb=400,pb=.02,mb=60;function hb(e){let t=yc(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 gb(e,t,n){let r=e?.objects?.[n]?.mass;if(Number.isFinite(r))return r;let i=_h(t,n).map(e=>t.objects[e]);if(i.length===1&&yc(i[0]).kind===`sphere`&&2*yc(i[0]).r<db)return ub;let a=i.reduce((e,t)=>e+hb(t)*fb,0);return Math.min(mb,Math.max(pb,a))}var _b=10,vb=9.81,yb=2,bb=.06,xb=.006,Sb=25,Cb=.5,wb=`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`,Tb=e=>e?.fix!==!1&&e?.fix?.grasp!==!1,Eb=e=>{let t=Math.min(1,Math.max(0,e));return t*t*(3-2*t)},Db=e=>Object.entries(e.objects??{}).filter(([,t])=>hg(t)&&e.props?.[t.prop]).map(([t,n])=>[t,n,e.props[n.prop].hand]);function Ob(e,t,n,r,i,a){let{spec:o,scene:s,sk:c}=e;if(!Tb(o)||!(a>.001))return null;for(let[l,u,d]of Db(o)){if(d!==t||u.keys?.length)continue;let f=gb(o,s,l),[p,m]=e.carrySpan(u);if(n<p||n>m||f*vb*su(c,t)<yb)continue;let h=Eb((n-p)/4)*Eb((m-n)/4)*a,g=Math.min(bb,xb*f)*h;if(!(g>0))return null;let _=U(r.P[c.index[`${Zh[t]}Arm`]],i),v=K([_[0],0,_[2]])>1e-6?q([_[0],0,_[2]]):[0,0,0];return H([0,-g,0],W(v,g))}return null}var kb=(e,t,n,r)=>{let i=U(t.P[e.index[`${Zh[n]}Hand`]],t.P[e.index[`${Zh[n]}Arm`]]);return r*vb*Math.hypot(i[0],i[2])};function Ab(e,t,n){let{spec:r,scene:i}=t.ctx,a=t.f0??0;if(!Tb(r))return;let o=Db(r).map(([e,t,n])=>({id:e,o:t,k:n,mass:gb(r,i,e)}));o.length&&t.frames.forEach(({s:r},i)=>{let s=i+a;for(let i of o)Ph(t,i.id,s)===i.k&&n({...i,f:s,Nm:kb(e,r,i.k,i.mass)})})}function jb(e,t){let n={};Ab(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 Mb(e,t,n,r,i){let a=r===`r`?`l`:`r`,{spec:o,scene:s}=e.ctx,c=new Set([t,..._h(s,t)]);return Object.entries(o.anchors??{}).some(([t,r])=>(e.baked?.[`w_${t}_${a}`]?.[i]??0)>Cb&&(r.kind===`object`&&c.has(r.object)||r.kind===`prop`&&r.prop===n.prop))}function Nb(e,t){let n=[];return Ab(e,t,({id:e,o:r,k:i,f:a,Nm:o})=>{o>Sb&&!Mb(t,e,r,i,a)&&n.push({kind:`LOAD`,msg:`${Zh[i].toLowerCase()} holds ${e} at ${o.toFixed(0)} N m`,frame:a,value:Math.round(o*10)/10,limit:Sb})}),n}function Pb(e,t,n){let{sk:r,scene:i}=e.ctx,a=e.frames[n-(e.f0??0)]?.s,o=Fh(e,t,n),s=Fc(i,t),c=i.objects[_h(i,t)[0]]??i.objects[t];if(!a||!o||!c?.half)return null;let l=e=>Y(X(o.R),U(e,o.pos)),u=Y(X(s.R),U(H(c.pos,Y(c.R,[0,c.half[1],0])),s.pos)),d=l(W(H(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)=>K(U(t.p,f))<K(U(e.p,f))?t:e).p.map(e=>Math.round(e*1e3)/1e3)}var Fb={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]=xh(e.out,i),c=gb(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 ${Sb}); 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=Pb(e.out,r,Math.max(s,Math.min(t.worstFrame,xh(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-_b),args:{anchor:d,side:`l`,reach:Math.min(_b,s)||1,hold:Math.max(1,xh(e.out,i)[1]-s),release:1}}}]}}}},Ib=e=>e*e*(3-2*e),Lb=.02;function Rb(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=>vg(e.objects?.[t])),l=e.objects?.[a];c[r]=l?hg(l)||gg(l)?{...i,carried:a}:Ym(l)?{...i,...Sg(ph({spec:e,scene:t,timeMap:o},a,s),Cg(t.objects[a]??Pl(t)[a],i))}:{...i,...wg(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 zb(e,t,n,r){if(r.prop)return n.props?.[r.prop]?.[r.point];let i=r.joints??[`RightHandIndex2`,`RightHandMiddle2`];return W(i.map(n=>t.P[e.index[n]]).reduce((e,t)=>H(e,t),[0,0,0]),1/i.length)}function Bb(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,H(lu(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=W(t[`hand_${r}`]??s,1-l);for(let[e,t]of c)u=H(u,W(t,e));let d=Math.max(0,...c.map(([e])=>Ib(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=U(r,n),s=H(n,W(a,Math.min(1,Math.max(0,G(U(u,n),a)/G(a,a))))),c=e.spec.detourRadius??.25,l=U(u,s),f=K(l);if(f<c){let e=Y(fo([0,1,0],t.yaw??0),[0,0,1]),n=q(H(f>1e-6?W(l,1/f):e,W(e,.6)));u=H(u,W(U(H(s,W(n,c)),u),d))}}return u},keepOut:e.keepOut&&!r?(n,r,i)=>{let a=(1-Zy(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=Ts(e.keepOut.body,o,r,i,Es,e.keepOut.skip);if(t===i)break;i=H(i,W(U(t,i),a))}return i}:void 0,afterArm:(t,n,r)=>yu(e,t,n,r),grip:r?void 0:(r,i,a)=>Wg(e,o,i,Zh[r],r,t,n,a),sag:r?void 0:(r,i,a)=>Ob(e,r,n,i,a,(1-Zy(e.spec,t,r))*Math.min(1,Math.max(0,t[`armw_${r}`]??0))),heldShapes:r||!e.grasp?void 0:(r,i)=>qh(e,t,n,r,i)}}function Vb(e,t,n,r=!0){let i={...r_(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=Xp(e.spec,t.anchor),d=e.sk.index[`${Zh[t.side]}Arm`],f=e.sk.index[`${Zh[t.side]}Hand`];for(let i=0;i<6;i++){o[`fit_${t.anchor}_${t.side}`]=s;let{s:i,diag:a}=mg(e.sk,o,Bb(e,o,n,!0,r,t.side)),p=zb(e.sk,i,a,t.effector),m=H(lu(e,t.anchor,i,a,o,t.side),t.offset??[0,0,0]);if(!p)break;let h=U(m,p),g=K(h);u&&(!c||g<c.err)&&(c={err:g,hand:U(i.P[f],p)}),l={goal:m,shoulder:i.P[d]},s=H(s,h)}u&&c&&l&&K(U(H(l.goal,s),l.shoulder))>su(e.sk,t.side)+Lb&&(s=c.hand),i[`fit_${t.anchor}_${t.side}`]=s}let{s:a,diag:o}=mg(e.sk,i,Bb(e,i,n,!1,r));return o.frame=n,{s:a,diag:o,c:i}}function Hb(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=ob(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?Ds(t):null},l={ctx:c,fps:e.fps??30,frameCount:i,f0:o,frames:[]};c.objectPose=(e,t,n)=>Fh(l,e,t,n),c.objectHand=(e,t)=>Ph(l,e,t),c.restingAt=(e,t)=>Dh(l,e,t),c.carrySpan=e=>xh(l,e),c.solvedAt=e=>kh(l,e),c.weightAt=(e,t)=>l.baked?.[e]?.[t],c.frameCount=i;let u={rebake(r){l.keys=r,l.baked=pd(r,i,ud(e.flow,e.label??``,$u(e))),c.socketTurns=new Map,c.graspPlans=new Map,Bv(l.baked,r,i),c.idle=n_(l.baked,{spec:e,sk:t,frameCount:i}),c.busy=t_(l.baked,e,i,l.fps);let a=Rb(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]=Vb(c,md(l.baked,t),t))},all:()=>Array.from({length:s-o+1},(e,t)=>o+t)};return c.hold=mm(c,l,e=>Vb(c,md(l.baked,e),e,!1),e=>Vb(c,md(l.baked,e),e)),u.rebake(r.keys??Mv(e,t)),u.solve(u.all()),l.fixed=r.fixes===!1?{}:lb(l,a,u,{whole:!r.window}),c.hold&&l.timeMap&&u.solve(u.all()),l}var Ub=`{ f, pos: [x, y, z], rot: [x, y, z, w] } or { f, pos, aim: [x, y, z], roll? }`,Wb=`{ at, onto?, bounce?, tumble?, v? }`,Gb=e=>Array.isArray(e)&&e.length===4&&e.every(Number.isFinite)&&Math.abs(Math.hypot(...e)-1)<=.01,Kb=e=>_l(e)&&Math.hypot(...e)>1e-9;function qb(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)`),Gb(n.rot)||e(`${t}.rot must be a unit quaternion [x, y, z, w], got ${Q(n.rot)}${n.rot===void 0?`; or give aim [x, y, z], the world direction its +Y points`:``}`);return}Kb(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 ${Q(n.aim)}`),n.roll!==void 0&&!Number.isFinite(n.roll)&&e(`${t}.roll must be degrees about aim (a number), got ${Q(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 ${Q(n.lean)}`)}function Jb(e,t,n,r,i,a=!1){if(!Array.isArray(r.keys))return e(`${n}.keys must be an array of ${Ub}`);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 ${Ub}, got ${Q(r)}`);for(let e of Object.keys(r))Kc.includes(e)||t(`${o} has unknown field "${e}"${yl(e,Kc)}; a key is ${Ub}`);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 ${Q(r.f)}`),_l(r.pos)||e(`${o}.pos must be [x, y, z], the world position of the object's base (a group: its root), got ${Q(r.pos)}`),qb(e,o,r)})}function Yb(e,t,n,r,i){let a=/^object:(.+?)(?:\.(?:center|top|base))?$/s.exec(i)?.[1];if(a===void 0)return;let o=_h(n,a).flatMap(t=>[t,...n.objects[t].ancestors??[]].find(t=>vg(e.objects?.[t]))??[]).find(t=>gg(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 Xb(e,t,n,r,i){ku(e,t,n,`${r}.follow`,i.follow)&&Yb(e,t,n.scene,`${r}.follow`,i.follow),i.offset!==void 0&&!_l(i.offset)&&t(`${r}.offset must be [x, y, z], metres along the record's own axes after aim (+Y along aim), got ${Q(i.offset)}`);let a=i.aim;if(a!==void 0&&a!==`face`&&a!==`up`){if(Array.isArray(a)){Kb(a)||t(`${r}.aim must be a non-zero world direction [x, y, z], got ${Q(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 ${Q(a)}`);ku(e,t,n,`${r}.aim`,a)&&Yb(e,t,n.scene,`${r}.aim`,a)}}function Zb(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 ${Q(n)}`),!1)}function Qb(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 ${Wb} 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 ${Wb} (at: the frame it starts to fall), got ${Q(s)}`);for(let e of Object.keys(s))Gc.includes(e)||t(`${u} has unknown field "${e}"${yl(e,Gc)}; a fall is ${Wb}`);if(s.at===void 0)e(`${u}.at must be the whole frame it starts to fall`);else if(Zb(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&&Ol(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 ${Q(s.bounce)}`),s.v!==void 0&&!(o&&s.v===`hand`||_l(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 ${Q(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 ${Q(s.tumble)}`)})}var $b=(e,t)=>{let n=0;for(;n<e.length&&e[n]===t[n];)n+=1;return n};function ex(e){let t=String(e),n=sl.reduce((e,n)=>$b(n,t)>$b(e,t)?n:e);return $b(n,t)>=4?`; did you mean "${n}"?`:yl(t,sl)}function tx(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 ${Q(n.mass)}`)}function nx(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 rx(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?gg(s)?`follow`:Ym(s)?`free`:_g(s)?`switch`:`hinge`:`carry`,u=Wc[l];(l!==`switch`&&l!==`follow`||!r?.others?.[o])&&Ol(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}"${yl(e,u)}; fields: ${u.join(`, `)}`);if(tx(t,c,s),l===`follow`){Xb(e,t,{sk:n,scene:r},c,s),nx(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`),nx(t,c,s);continue}if(l===`free`){s.keys!==void 0&&Jb(t,a,c,s,i,!0),s.fall!==void 0&&Qb(t,a,c,s,{frames:i,scene:r,carry:!1}),nx(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&&!_l(s[e])&&t(`${c}.${e} must be [d, l, n] along the palm axes, got ${Q(s[e])}`);s.grasp!==void 0&&!sl.includes(s.grasp)&&t(`${c}.grasp must be one of ${sl.join(`, `)}${ex(s.grasp)}, got ${Q(s.grasp)}`),nx(t,c,s),Zb(t,`${c}.grab`,s.grab,i)&&Zb(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&&Jb(t,a,c,s,i),s.fall!==void 0&&Qb(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)`),_l(s?.pivot)||t(`${c}.pivot must be [x, y, z] (world hinge point), got ${Q(s?.pivot)}`),s?.axis!==void 0&&(!_l(s.axis)||Math.hypot(...s.axis)<1e-9)&&t(`${c}.axis must be a non-zero [x, y, z], got ${Q(s.axis)}`),(typeof s?.channel!=`string`||!s.channel)&&t(`${c}.channel must name the angle channel (degrees)`)}}var $=e=>{let t=Math.round(e*1e3)/1e3;return Object.is(t,-0)?0:t},ix=e=>`[${e.map(e=>{let t=$(e);return t>0?`+${t}`:`${t}`}).join(`, `)}]`,ax=[`near`,`above`,`moved`,`still`,`speed`],ox={near:.05,above:0,moved:.05,still:.01},sx=new Set([`near`,`still`]),cx=new Set([`moved`,`still`,`speed`]),lx=e=>ax.filter(t=>e?.[t]!==void 0),ux=(e,t)=>e.name??`goals[${t}]`,dx=(e,t)=>(sx.has(t)?e.tol:e.by)??ox[t],fx=(e,t)=>e.mode??(t===`speed`?`any`:`all`),px=e=>!e.startsWith(`object:`)||/\.(center|top|base|rim)$/.test(e)?e:`${e}.base`;function mx(e,t){let[,n,r]=/^object:(.+)\.(center|top|base|rim)$/s.exec(px(t))??[],i=_h(e,n).map(t=>e.objects[t]);if(!i.length)return null;if(r===`rim`)return Cu(i).o;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=H(e.pos,Y(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 hx=e=>e.moved??e.still,gx=(e,t,n=Array.isArray(t.at)?t.at[0]:t.at)=>hx(t).startsWith(`object:`)?mx(e.ctx.scene,hx(t)):Tu(e,n,hx(t));function _x(e,t,n){let r=Tu(e,n,t),i=e.fps??24;if(!r)return null;let a=Tu(e,n-1,t),o=Tu(e,n+1,t);if(a&&o)return K(U(o,a))*i/2;let s=a??o;return s?K(U(r,s))*i:null}var vx=`landmark:mouth`,yx=/^object:(.+)\.top$/s;function bx(e,t){let[n,r]=t.near,i=[n,r].map(e=>yx.exec(e)?.[1]),a=i[0]&&r===vx?0:i[1]&&n===vx?1:-1;if(a<0)return t.near;let o=_h(e,i[a]).map(t=>e.objects[t]).filter(e=>e?.half&&e.pos&&e.R);return(o.length?o.reduce((e,t)=>t.pos[1]+2*t.half[1]>e.pos[1]+2*e.half[1]?t:e):null)?.renderer===`cylinder`?t.near.map((e,t)=>t===a?`object:${i[a]}.rim`:e):t.near}function xx(e,t){let n=t.near.find(e=>yx.test(e));if(!n)return``;let r=yx.exec(n)[1];return bx(e,t)===t.near?` (${n} is the top-face centre of its world bounding box; object:${r}.rim is its opening, which tilts with it)`:` (measured at ${r}'s rim nearest the mouth, object:${r}.rim; its .top is its bounding box's top)`}function Sx(e,t,n,r,i){if(n===`near`){let[n,i]=bx(e.ctx.scene,t);return Eu(e,r,n,i)}if(n===`above`){let n=Tu(e,r,t.above[0]),i=Tu(e,r,t.above[1]);return n&&i?n[1]-i[1]:null}if(n===`speed`)return _x(e,t.speed,r);let a=i&&Tu(e,r,px(hx(t)));return a?K(U(a,i)):null}var Cx=(e,t,n)=>sx.has(e)?t-n:n-t,wx=e=>Math.max(1e-4,Math.round(e*1e4)/1e4);function Tx(e,t,n,r,i){let a=dx(t,n),o=(n===`moved`||n===`still`)&&!hx(t).startsWith(`object:`),s=n===`moved`||n===`still`?gx(e.out,t,r):null,c=[];for(let o=Math.max(r,e.f0);o<=Math.min(i,e.last);o++){let r=Sx(e.out,t,n,o,s);r!==null&&c.push({f:o,v:r,short:Cx(n,r,a)})}return{rows:c,from:o?r:void 0}}function Ex(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=lx(n)[0],i=r&&Dx(e,t),a;if(i&&!i.wait){let{rows:t}=Tx(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 Dx(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=Ex(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 Ox(e,t,n,r,i,a,o=``){let s=i?`f${n.f}, the best of f${i[0]}-f${i[1]}`:`f${n.f}`;return t===`near`?`${e}: ${$(n.v)} m at ${s} (needs <= ${r})${o}`:t===`above`?`${e}: ${$(n.v)} m above at ${s} (needs >= ${r})`:t===`speed`?`${e}: ${$(n.v)} m/s at ${s} (needs >= ${r})`:t===`still`?`${e}: ${$(n.v)} m from ${a===void 0?`its scene pose`:`f${a}`} at ${s} (needs <= ${r})`:`${e}: moved ${$(n.v)} m${a===void 0?``:` from f${a}`} at ${s} (needs >= ${r})`}function kx(e,t,n){let r=e.f0??0;return Dx({out:e,goals:t,names:new Map(t.map((e,t)=>[ux(e,t),t])),f0:r,last:r+(e.frames?.length??0)-1,events:new Map,visiting:new Set},n)}function Ax(e,t){let n=[],r=[],i=e.f0??0,a={out:e,goals:t,names:new Map(t.map((e,t)=>[ux(e,t),t])),f0:i,last:i+(e.frames?.length??0)-1,events:new Map,visiting:new Set};return t.forEach((t,o)=>{let s=lx(t)[0];if(!s)return;let c=ux(t,o),l=dx(t,s),u=Dx(a,o),d=Array.isArray(t.at)?t.at[0]:t.at;if(u.skip)return;if(u.wait){r.push({name:c,kind:s,ok:!1,value:null,at:null,need:l}),d>=i&&d<=a.last&&n.push({kind:`GOAL`,msg:`${c}: ${u.wait}`,frame:d-i,value:.01,limit:0});return}let{rows:f,from:p}=Tx(a,t,s,u.a,u.b);if(!f.length)return;s===`moved`&&p!==void 0&&(f=[f.reduce((e,t)=>t.v>e.v?t:e)]);let m=fx(t,s)===`any`,h=Array.isArray(t.at)?u.a!==u.b:!1,g=f.reduce((e,t)=>(m?t.short<e.short:t.short>e.short)?t:e),_=g.short<=0;if(r.push({name:c,kind:s,ok:_,value:$(g.v),at:g.f,need:l}),_)return;let v=s===`near`?xx(e.ctx.scene,t):``;for(let e of m?[g]:f.filter(e=>e.short>0))n.push({kind:`GOAL`,msg:Ox(c,s,e,l,m&&h?[u.a,u.b]:null,p,s===`near`?v:``),frame:e.f-i,value:wx(e.short),limit:0})}),{issues:n,results:r}}var jx=`{ name?, near | above | moved | still | speed, tol?, by?, at, mode?, after?, before? }`,Mx=new Set([`near`,`still`]),Nx=new Set([`above`,`moved`,`speed`]);function Px(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 Fx=e=>typeof e==`string`&&e!==``&&!/^[a-z]+:/.test(e),Ix=e=>[`moved`,`still`,`speed`].find(t=>Fx(e?.[t]));function Lx(e){return Array.isArray(e)&&e.some(Ix)?e.map(e=>{let t=Ix(e);return t?{...e,[t]:`object:${e[t]}`}:e}):e}function Rx(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 ${Q(n)}`);(o[0]<0||o[1]>r-1)&&e(`${t}.at = ${Q(n)} is outside 0..${r-1} (spec.frames ${r})${o[1]>r-1?i:``}`)}function zx(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 ${Q(o)}`);ku(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 ${Q(i.at)}`)}function Bx(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 ${jx}, got ${Q(r)}`);for(let e of Object.keys(r))Xc.includes(e)||c(`${o} has unknown field "${e}"${yl(e,Xc)} (fields: ${Xc.join(`, `)})`);r.name!==void 0&&(typeof r.name!=`string`||!r.name.trim()?t(`${o}.name must be a non-empty string, got ${Q(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=lx(r),u=l[0];if(l.length||t(`${o} needs one predicate: ${ax.join(`, `)}`),l.length>1&&t(`${o} names ${l.join(` and `)}; a goal takes exactly one of ${ax.join(`, `)} (split it into ${l.length} goals)`),l.length===1&&cx.has(u))zx(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)=>ku(e,t,s,`${o}.${u}[${r}]`,n)):t(`${o}.${u} must be [ref, ref] (two point refs), got ${Q(n)}`)}r.tol!==void 0&&(l.length===1&&!Mx.has(u)?t(`${o}.tol applies to near and still; ${Px(u,r.tol)}`):Number.isFinite(r.tol)&&r.tol>=0||t(`${o}.tol must be a number >= 0 (metres), got ${Q(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&&!Nx.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 ${Q(r.by)}`),r.mode!==void 0&&r.mode!==`all`&&r.mode!==`any`&&t(`${o}.mode must be "all" or "any", got ${Q(r.mode)}`),Rx(t,o,r.at,n.frames,n.past)}function Vx(e,t){let n=new Map(e.map((e,t)=>[e&&typeof e==`object`?ux(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 ${Q(e[i])}${typeof e[i]==`string`?yl(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=>`"${ux(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 Hx(e,t,n){if(e.goals===void 0)return;if(!Array.isArray(e.goals))return t(`spec.goals must be an array of goals ${jx}, got ${Q(e.goals)}`);let r=new Map;e.goals.forEach((i,a)=>Bx(e,t,n,i,a,r)),Vx(e.goals,t)}var Ux=new Set([`l`,`r`]),Wx=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function Gx(e,t,n,r){if(Wx(n))for(let i of Object.keys(n))r.includes(i)||e(`${t} has unknown field "${i}"${gl(i,r)} (fields: ${r.join(`, `)})`)}function Kx(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||!Vc[o.kind]){t(`${s}.kind must be one of ${Object.keys(Vc).join(`, `)}, got ${Q(o?.kind)}`);continue}Gx(i,`${s} (${o.kind})`,o,[`kind`,...Vc[o.kind]]);for(let e of[`p`,`offset`,`local`])o[e]!==void 0&&!_l(o[e])&&t(`${s}.${e} must be [x, y, z], got ${Q(o[e])}`);(o.kind===`world`||o.kind===`body`)&&o.p===void 0&&t(`${s} (${o.kind}) needs p: [x, y, z]${o.kind===`body`?`, ${fl.pole}`:``}`),o.kind===`bone`&&Dl(t,n,s,o.bone),o.kind===`segment`&&(Dl(t,n,`${s}.from`,o.from),Dl(t,n,`${s}.to`,o.to),o.reach!==void 0&&!Ux.has(o.reach)&&t(`${s}.reach must be "l" or "r"`)),o.kind===`object`&&Ol(t,r,s,o.object,{groups:!0})&&(o.grasp!==void 0&&!sl.includes(o.grasp)&&t(`${s}.grasp must be one of ${sl.join(`, `)}, got ${Q(o.grasp)}`),o.socket!==void 0&&r?.objects&&!$l(r,o.object,o.socket)&&t(`${s}.socket: "${o.object}" has no socket ${Q(o.socket)} (sockets: ${Ql(r,o.object).map(e=>e.name).join(`, `)||`none`})`),o.socket!==void 0&&o.grasp===void 0&&t(`${s}.socket needs grasp (${sl.join(`, `)}): the socket says how the hand takes it`)),o.kind===`person`&&!Ul(r,o.person,o.bone??``,0)&&t(`${s} (person) needs person: the id of another character with an installed take (people: ${Wl(r)}) and bone: one of its joints, got ${Q(o.person)} ${Q(o.bone)}`),o.kind===`landmark`&&o.name!==`mouth`&&t(`${s}: the only landmark is "mouth", got ${Q(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 qx(e,t,{sk:n,unknown:r=t}){for(let[i,a]of Object.entries(e.props??{})){let e=`props.${i}`;Gx(r,e,a,Hc),Ux.has(a?.hand)||t(`${e}.hand must be "l" or "r", got ${Q(a?.hand)}`),!Array.isArray(a?.origin)||!a.origin.length?t(`${e}.origin must list one or more bones`):a.origin.forEach(r=>Dl(t,n,`${e}.origin`,r));for(let[n,r]of Object.entries(a?.points??{}))_l(r)||t(`${e}.points.${n} must be [d, l, n] along the palm axes, got ${Q(r)}`)}(e.fits??[]).forEach((i,a)=>{let o=`fits[${a}]`;Gx(r,o,i,Uc),Ux.has(i?.side)||t(`${o}.side must be "l" or "r", got ${Q(i?.side)}`),e.anchors?.[i?.anchor]||t(`${o}.anchor "${i?.anchor}" is not in spec.anchors${yl(String(i?.anchor),Object.keys(e.anchors??{}))}`);let s=i?.effector;if(s?.prop!==void 0){let n=e.props?.[s.prop];n?s.point!==`origin`&&!n.points?.[s.point]&&t(`${o}.effector ${s.prop}.${s.point} is not a point of spec.props.${s.prop} (points: ${[...Object.keys(n.points??{}),`origin`].join(`, `)})`):t(`${o}.effector.prop "${s.prop}" is not in spec.props${yl(String(s.prop),Object.keys(e.props??{}))}`)}else Array.isArray(s?.joints)?s.joints.forEach(e=>Dl(t,n,`${o}.effector`,e)):t(`${o}.effector must be { prop, point } or { joints: [bone, ...] }`);i?.offset!==void 0&&!_l(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 ${Q(i.orient)}`)})}function Jx(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 ${Q(e?.type)}`);Gx(r,o,e,qc),(!Number.isInteger(e.f0)||e.f0<0||e.f0>n-1)&&t(`${o}.f0 must be an integer frame within 0..${n-1}, got ${Q(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 (${fl.yaw}), got ${Q(e.heading)}`);for(let n of qc.slice(2))n!==`heading`&&e[n]!==void 0&&!Number.isFinite(e[n])&&t(`${o}.${n} must be a finite number, got ${Q(e[n])}`);e.steps!==void 0&&!(Number.isInteger(e.steps)&&e.steps>=1)&&t(`${o}.steps must be an integer >= 1, got ${Q(e.steps)}`),e.turnDistance!==void 0&&!(e.turnDistance>0)&&t(`${o}.turnDistance must be > 0 m, got ${Q(e.turnDistance)}`)})}function Yx(e,t,{sk:n,scene:r,frames:i,unknown:a=t,past:o=``}){let s=e.checks??{};for(let e of Object.keys(s))Jc.includes(e)||a(`checks.${e} is not a check${yl(e,Jc)} (checks: ${Jc.join(`, `)})`);let c=(e,n=()=>{})=>{let r=s[e],i=`{ ${Yc[e].join(`, `)} }`;if(r!==void 0){if(!Array.isArray(r))return t(`checks.${e} must be an array of ${i}, got ${Q(r)}`);r.forEach((r,o)=>{if(!Wx(r))return t(`checks.${e}[${o}] must be ${i}, got ${Q(r)}`);Gx(a,`checks.${e}[${o}]`,r,Yc[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 ${Q(n)}${Array.isArray(n)&&n[1]>i-1?o:``}`))};c(`contacts`,(r,i)=>{kl(e,t,n,`checks.contacts[${i}].point`,r.point),kl(e,t,n,`checks.contacts[${i}].target`,r.target),l(`checks.contacts[${i}]`,r.when)}),c(`orient`,(r,i)=>{kl(e,t,n,`checks.orient[${i}].from`,r.from),kl(e,t,n,`checks.orient[${i}].to`,r.to),l(`checks.orient[${i}]`,r.when),r.along===`face`||r.along===`up`||_l(r.along)||t(`checks.orient[${i}].along must be "face", "up" or [x, y, z]`)}),c(`below`,(e,r)=>{Dl(t,n,`checks.below[${r}].joint`,e.joint),Dl(t,n,`checks.below[${r}].ref`,e.ref),l(`checks.below[${r}]`,e.when)}),c(`clearance`,(e,n)=>{Ol(t,r,`checks.clearance[${n}]`,e.object),l(`checks.clearance[${n}]`,e.frames)}),c(`appear`,(r,i)=>{Dl(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)=>Ol(t,r,`checks.supports[${n}]`,e.object)),c(`allow`);for(let e of Object.keys(s.limits??{}))e in Wf||a(`checks.limits.${e} is not a QA limit${yl(e,Object.keys(Wf))}`);let u=e.fix;if(u!==void 0&&u!==!1&&(typeof u!=`object`||!u))t(`spec.fix must be false or { ${ab.join(`, `)} }`);else for(let e of Object.keys(u||{}))ab.includes(e)||a(`spec.fix.${e} is not a fix${yl(e,ab)} (fixes: ${ab.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 ${Q(u.grasp)}`)}function Xx(e,t,n){Kx(e,t,n),qx(e,t,n),rx(e,t,n),Jx(e,t,n),Yx(e,t,n),Hx(e,t,n)}var Zx=12,Qx=60;function $x(e){let t=new Map;for(let n of e){let e=/\[(\d+)\]( \(f(\d+)\))?/.exec(n),r=e?`${n.slice(0,e.index)}[#]${e[2]?` (f#)`:``}${n.slice(e.index+e[0].length)}`:n;t.has(r)||t.set(r,{line:n,idx:[],fs:[]}),e&&(t.get(r).idx.push(e[1]),e[3]&&t.get(r).fs.push(`f${e[3]}`))}return[...t.entries()].map(([e,t])=>t.idx.length>1?e.replace(`[#]`,`[${t.idx.join(`,`)}]`).replace(` (f#)`,` (${t.fs.join(`, `)})`):t.line)}function eS(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 tS(e,t,n,r){if(tl.has(n)){if(!_l(r))return e(`${t} ${n} must be [x, y, z] (3 finite numbers), got ${Q(r)}`);if(nl.has(n)){let i=Math.hypot(...r);if(i<1e-6)return e(`${t} ${n} = ${Q(r)} has no direction; a pole is a ${fl.pole}`);n.startsWith(`knee`)&&r[2]<-.7*i&&e(`${t} ${n} = ${Q(r)} points backward; knees bend toward +z. A pole is a ${fl.pole}`)}n.startsWith(`foot`)&&r[1]<.04&&e(`${t} ${n} y = ${r[1]} puts the ankle into the floor; foot_* is the ${fl.foot}`);return}if(il.has(n)){if(!r||typeof r!=`object`||Array.isArray(r))return e(`${t} ${n} must be { preset: weight }, presets ${ol.join(`, `)}; got ${Q(r)}`);for(let[i,a]of Object.entries(r))ol.includes(i)?Number.isFinite(a)&&a>=0&&a<=1||e(`${t} ${n}.${i} must be a weight within 0..1, got ${Q(a)}`):e(`${t} ${n} preset "${i}" is unknown${yl(i,ol)} (presets: ${ol.join(`, `)})`);return}if(!Number.isFinite(r))return e(`${t} ${n} must be a finite number${n===`yaw`?` (degrees; ${fl.yaw})`:n.startsWith(`fyaw`)?` (${fl.fyaw})`:``}, got ${Q(r)}`);let i=dl(n);i&&(r<i[1]||r>i[2])&&e(`${t} ${n} = ${r} is outside ${i[1]}..${i[2]} (${i[3]})`)}var nS=e=>Array.isArray(e)?e:[],rS=e=>Array.isArray(e)?e[1]:e;function iS(e,t){let n=[...nS(e.keys).map(e=>e?.f),...nS(e.generators).map(e=>e?.f0)].filter(Number.isInteger),r=e.checks??{},i=[...[`contacts`,`orient`,`below`].flatMap(e=>nS(r[e]).map(e=>rS(e?.when))),...nS(r.clearance).map(e=>rS(e?.frames)),...nS(e.goals).map(e=>rS(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 aS(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=eS(e),s=[...tl,...rl,...il,...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))zc.includes(t)||r(`${l} has unknown field "${t}"${gl(t,zc)}; a key is { f, set, step? }`);if(!Number.isInteger(e.f))return t(`${l}.f must be an integer frame, got ${Q(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]}"${yl(n,s)}`):e||tl.has(n)||rl.has(n)||il.has(n)?tS(t,u,n,r):o.has(n)||n.endsWith(`_vis`)?Number.isFinite(r)||t(`${u} ${n} must be a finite number, got ${Q(r)}`):t(`${u} sets unknown channel "${n}"${yl(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 oS(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?, overlap? }, got ${Q(e)}`);for(let t of Object.keys(e))[`smooth`,`lag`,`overlap`].includes(t)||n(`spec.flow has unknown field "${t}" (fields: smooth, lag, overlap)`);e.smooth!==void 0&&typeof e.smooth!=`boolean`&&t(`spec.flow.smooth must be true or false, got ${Q(e.smooth)}`);let r=e.overlap;r!==void 0&&typeof r!=`boolean`&&!(Number.isFinite(r)&&r>=0&&r<=2)&&t(`spec.flow.overlap must be true, false or a scale 0..2, got ${Q(r)}`);let i=e=>Number.isFinite(e)&&e>=0&&e<=6,a=e.lag;if(!(a===void 0||a===!1||i(a))){if(!a||typeof a!=`object`||Array.isArray(a))return t(`spec.flow.lag must be false, 0..6 frames or { spine?, head?, arms? }, got ${Q(a)}`);for(let[e,r]of Object.entries(a))[`spine`,`head`,`arms`].includes(e)?i(r)||t(`spec.flow.lag.${e} must be 0..6 frames, got ${Q(r)}`):n(`spec.flow.lag has unknown field "${e}" (fields: spine, head, arms)`)}}function sS(e,{sk:t,scene:n,lenient:r=!1,problems:i=[]}={}){let a=[...i],o=e=>{a.length<Qx&&a.push(e)},s=r?()=>{}:o;if(!e||typeof e!=`object`)throw Error(`MOTION_SPEC_INVALID: spec must be an object`);e.schema!==`cozyclay.motion-spec.v1`&&o(`spec.schema must be "cozyclay.motion-spec.v1", got ${Q(e.schema)}`);for(let t of Object.keys(e))Rc.includes(t)||s(`spec.${t} is not a spec field${yl(t,Rc)} (fields: ${Rc.join(`, `)})`);e.fps!==void 0&&e.fps!==24&&o(`spec.fps must be 24, the timeline rate, got ${Q(e.fps)}`),oS(e.flow,o,s);let c=e.frames;(!Number.isInteger(c)||c<1||c>2e4)&&o(`spec.frames must be an integer 1..20000 or "auto", got ${Q(c)}`);let l=Number.isInteger(c)?iS(e,c):``;if(aS(e,o,Number.isInteger(c)?c:2e4,s,l),Xx(e,o,{sk:t,scene:n,frames:Number.isInteger(c)?c:2e4,lenient:r,unknown:s,past:l}),!a.length)return;let u=$x(a),d=u.length>Zx||a.length>=Qx;throw Error(`MOTION_SPEC_INVALID: ${u.slice(0,Zx).join(`
7
+ `)}${d?`\n(${u.length>Zx?`${u.length-Zx}`:`more`}${a.length>=Qx?`+`:``} more problems not listed)`:``}`)}function cS(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 lu(e.ctx,s,r,i,a);throw Error(`MOTION_SPEC_INVALID: check point "${n}"`)}function lS(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=>jc(a,a.objects[t],o,t)&&Ph(e,t,n)===i)??null:null}function uS(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 dS=(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 fS(e,t,n){return n===`up`?[0,1,0]:n===`face`?To(e.ctx.sk,e.frames[t].s,e.ctx.sk.index.Head,[0,0,1]):q(n)}function pS(e,t,n){let r=cS(e,t,n.point),i=cS(e,t,n.target);if(!r||!i)return null;let a=uS(e,n.target)??lS(e,n.point,t+(e.f0??0));return a?Eu(e,t,n.point,`object:${a}`)??K(U(r,i)):K(U(r,i))}function mS(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(dS(e,n,r.when)){let t=pS(e,n,r);t!==null&&t>(r.tol??.01)&&a(`CONTACT`,`${r.name}: ${(t*100).toFixed(1)} cm apart`,n,t,r.tol??.01)}for(let r of t.orient??[])if(dS(e,n,r.when)){let t=cS(e,n,r.from),i=cS(e,n,r.to);if(!t||!i)continue;let o=G(q(U(i,t)),fS(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(dS(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(dS(e,n,r.frames)){let t=e.objectsAt(n)[r.object],o=lc.find(e=>e[0]===r.part);if(!t||!o)continue;let{P:s}=e.frames[n].s,c=Math.min(...uc(s[i[o[1]]],s[i[o[2]]]).map(e=>dc(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=K(U(cS(e,t,`joint:${n.joint}`),cS(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 hS=/^(.+): [\d.]+ cm off its keys$/,gS={twist:`twist about the forearm`,flex:`flex`,dev:`deviation (+ toward the thumb)`};function _S(e,t){let n=e.objects[t]??Pl(e)[t];return _h(e,t).flatMap(t=>{let r=e.objects[t],i=Cg(n,r),[a,o,s]=r.half;return[-a,a].flatMap(e=>[0,2*o].flatMap(t=>[-s,s].map(n=>H(i.pos,Y(i.R,[e,t,n])))))})}function vS(e,t,n){let{scene:r}=e.ctx,i=e.f0??0;for(let[a]of pm(e.ctx.spec)){let o=um(e,a),s=_S(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=dm(o,r),l=Mh(e,a,r),u=Math.max(...s.map(e=>ro(H(c.pos,Y(c.R,e)),H(l.pos,Y(l.R,e)))));u>t.reach&&n(`REACH`,`${a}: ${(u*100).toFixed(1)} cm off its keys`,r-i,u,t.reach)}}}function yS(e,t){let n=hS.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(As).filter(([e,[t,n]])=>o[e]<t||o[e]>n).map(([e,[t,n]])=>`the wrist ${gS[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 bS=e=>Math.round(e*10)/10,xS=e=>Math.round(e*100)/100,SS=`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, lean = the lean a mouth key took by default (give lean 0 to hold aim exactly)`;function CS(e){let t=pm(e.ctx.spec);return t.length?Object.fromEntries(t.map(([t,n])=>{let r=um(e,t);return[t,[...(e.ctx.hold?.entry?.(t)??n).keys].sort((e,t)=>e.f-t.f).map((n,i)=>{let a=Mh(e,t,Math.round(r.t[i])),o=[a.R[0][1],a.R[1][1],a.R[2][1]],s=bS(_o(n.aim?q(n.aim):Y(go(r.q[i]),[0,1,0]),o));return{f:n.f,deg:s,cm:bS(ro(n.pos,a.pos)*100),...s>=1?{got:o.map(xS)}:{},...n.aim?{rot:r.rots[i]}:{},...n.leaned?{lean:n.lean}:{}}})]})):null}var wS=3,TS=.03,ES=e=>H(e.pos,Y(e.R,[0,e.half[1],0])),DS=(e,t)=>[e[0][t],e[1][t],e[2][t]];function OS(e,t,n=null){let r=U(ES(e),ES(t)),i=[0,1,2].map(t=>DS(e.R,t)),a=[0,1,2].map(e=>DS(t.R,e)),o=[...i,...a,...i.flatMap(e=>a.map(t=>no(e,t)))],s={depth:1/0,axis:[0,1,0]};for(let c of o){if(K(c)<1e-6)continue;let o=q(c),l=(e,t)=>t.reduce((t,n,r)=>t+Math.abs(G(n,o))*e.half[r],0),u=l(e,i)+l(t,a);if(u-Math.abs(G(r,o))<=0)return{depth:u-Math.abs(G(r,o)),axis:o};let d=G(n??r,o)<0?W(o,-1):o,f=u-G(r,d);f<s.depth&&(s={depth:f,axis:d})}return s}var kS=(e,t,n,r)=>{let i=n===`l`?`Left`:`Right`,a=W(H(t.P[e.index[`${i}HandIndex2`]],t.P[e.index[`${i}HandMiddle2`]]),.5);return r.some(e=>dc(a,e)<=0)},AS=(e,t,n)=>!t.visible||(e.baked?.[t.visible]?.[n]??0)>.5,jS=(e,t,n)=>_h(e.ctx.scene,t).map(t=>({...e.ctx.scene.objects[t],...Dh(e,t,n)}));function MS(e,t,n){let{sk:r,spec:i}=e.ctx,a=e.frames[n-(e.f0??0)];if(!a)return null;let o=yg(r,i,a.s,i.objects[t]);return Math.max(0,Math.min(...jS(e,t,n).map(e=>dc(o,e))))}function NS(e,t,n){let r=jS(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=W(r.map(ES).reduce((e,t)=>H(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=dc(o,r);e<=.02&&(!s||e<s[1])&&(s=[t,e])}return s?.[0]??null}function PS(e,t,n){let r=Object.entries(t.ctx.spec.objects??{}).filter(([,e])=>hg(e));if(!r.length)return[];let i=n.checks??{},a={...Wf,...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??qf(o,n,t),e),null)??a.allow;for(let[i,o]of r){let[r,s]=xh(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]&&AS(t,o,r-1)){let e=MS(t,i,r),n=[o.fall??[]].flat().some(e=>Array.isArray(e.v)&&e.at<r);n&&e>TS?u(`CATCH`,`${i} missed by ${(e*100).toFixed(1)} cm`,r-c,e,TS):!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:NS(t,i,r),h=e=>Math.abs(e-r)<=wS||o.release!==void 0&&Math.abs(e-s)<=wS;for(let n=0;n<t.frames.length;n++){let a=n+c,s=Nh(t,i,a);if(!s||!AS(t,o,a))continue;let f=s.map(e=>e.id),g=s.map(e=>[e,ES(e),K(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||kS(e,_,t.slice(-1),s))).map(([e])=>`hand_${e.slice(-1)}`);for(let[e,t,r,a]of lc){if(p.has(e)||v.includes(e))continue;let o=_.P[l[t]],s=_.P[l[r]],c=W(H(o,s),.5),m=a+ro(o,s)/2,h=d([e],[i,...f]),y=null,b=-1/0;for(let[e,t,n]of g)m-(ro(c,t)-n)<=h||(y??=uc(o,s),b=Math.max(b,a-Math.min(...y.map(t=>dc(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=ES(r),s=K(r.half),c=-1/0;for(let[e,n,i]of g)ro(n,o)<i+s+t&&(c=Math.max(c,OS(e,r).depth));c>t&&u(`COLLIDE`,`${i} x ${e}`,n,c,t)}}}return vS(t,a,u),s}var FS=.009,IS=.022,LS=.004,RS=.995,zS=.01,BS=120,VS=150,HS=-.3,US=[`Index`,`Middle`,`Ring`,`Pinky`],WS={l:`Left`,r:`Right`};function GS(e,t){let n=_h(e,t),r=n.length===1?yc(e.objects[n[0]]).kind:`box`;return r===`sphere`?`spherical`:r===`cylinder`?`power`:null}function KS(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(!hg(a)||!jc(i,a,n,t))continue;let o=i.props?.[a.prop]?.hand,[s,c]=xh(e,a);o&&r.push({id:t,k:o,grasp:a.grasp??GS(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)>=RS&&c(t)>=RS,rests:!0})}return r}var qS=(e,t,n)=>_h(e.ctx.scene,t).map(t=>({...e.ctx.scene.objects[t],...Fh(e,t,n)}));function JS(e,t,n){let r=WS[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:IS}];for(let e of[...US,`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:FS});return a}function YS(e,t){return e.map(e=>{let n={depth:-1/0};for(let r of t){let t=Tc(r,e.a,e.b,e.r);t>n.depth&&(n={depth:t,entry:r})}let r=W(H(e.a,e.b),.5),i=n.entry&&wc(n.entry,r);return{...e,depth:n.depth,at:i,normal:n.entry&&Cc(n.entry,r)}})}function XS(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=ZS(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 ZS(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 QS(e,t,n,r,i,a){let o=YS(JS(e,t,n.k),r),s=WS[n.k].toLowerCase();if(n.rests&&o[0].depth<-.03)return;for(let e of o)e.finger!==`palm`&&e.depth>LS&&i(`FINGER_PEN`,`${e.bone} into ${n.id}`,a,e.depth,LS);let c=e=>o.some(t=>t.finger===e&&t.tip&&t.depth>=-.008),l=US.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=W(r.reduce((e,t)=>H(e,H(t.pos,Y(t.R,[0,t.half[1],0]))),[0,0,0]),1/r.length),p=d.filter(e=>e.normal[1]<=HS).map(e=>e.at),m=d.filter(e=>e.finger===`Thumb`).map(e=>e.normal),h=d.filter(e=>US.includes(e.finger)).map(e=>e.normal),g=e=>e.length?q(e.reduce(H,[0,0,0])):null,_=g(m),v=g(h),y=_&&v&&Math.acos(Math.max(-1,Math.min(1,G(_,v))))*180/Math.PI>=BS,b=(e,t)=>Math.acos(Math.max(-1,Math.min(1,G(e,t))))*180/Math.PI,x=d.some((e,t)=>d.slice(t+1).some(t=>b(e.normal,t.normal)>=VS));!n.rests&&!y&&!x&&XS(f,p)>zS&&i(`SUPPORT`,`${n.id} not supported`,a,Math.min(1,XS(f,p)),zS)}function $S(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 KS(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=qS(t,n.id,a);o.length&&QS(e,t.frames[a-r].s,n,o,i,a-r)}return n}var eC=.5,tC=1,nC=90,rC={twist:1-Ms,flex:1,dev:1},iC=(e,t)=>t[e].map(t=>t*rC[e]),aC=`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 oC(e,t,n,r){let{diag:i}=e.frames[n],a=e.baked??{};if((i[`hold_${t}`]?.w??0)>eC||(i[`grip_${t}`]?.w??0)>eC)return!0;for(let n of e.ctx.spec.fits??[])if(n.side===t&&(a[`w_${n.anchor}_${t}`]?.[r]??0)>eC)return!0;return Object.keys(e.ctx.spec.objects??{}).some(n=>e.ctx.spec.objects[n]?.prop&&Ph(e,n,r)===t)}function sC(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(!oC(t,s,a,f))return;let p=W(U(n.P[c],n.P[l]),1/Math.max(1e-9,K(U(n.P[c],n.P[l])))),m=J(n.R[l],J(X(r[l]),r[c])),h=Gs(m,n.R[c],p,Y(J(m,X(n.R[c])),Ro(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]=iC(n,e);return h[n]<r+t||h[n]>i-t});g(js,-1)&&d.past++,g(As,tC)&&d.limit++;let _=U(n.P[l],n.P[u]),v=Math.round(Math.acos(Math.max(-1,Math.min(1,-_[1]/Math.max(1e-9,K(_)))))*180/Math.PI);(!d.elevation||v>d.elevation[0])&&(d.elevation=[v,f]),v>nC&&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 cC=.5,lC=.5,uC=[`flex`,`dev`,`twist`],dC={l:`Left`,r:`Right`},fC={flex:e=>e>=0?`flex`:`extension`,dev:e=>e>=0?`radial deviation`:`ulnar deviation`,twist:()=>`twist`};function pC(e){let t=null;for(let n of uC){let[r,i]=As[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 mC(e,t,n,r){let{s:i,diag:a}=t.frames[r],o=a[`hold_${n}`];if((o?.w??0)>lC)return o;let s=dC[n],c=e.index,l=c[`${s}Hand`],u=c[`${s}ForeArm`],d=e.restWorldRot,f=W(U(i.P[l],i.P[u]),1/Math.max(1e-9,K(U(i.P[l],i.P[u])))),p=J(i.R[u],J(X(d[u]),d[l]));return Gs(p,i.R[l],f,Y(J(p,X(i.R[l])),Ro(e,i,s).l))}function hC(e,t){let n=[],r=t.f0??0;for(let i of[`l`,`r`])t.frames.forEach((a,o)=>{if(!oC(t,i,o,o+r))return;let s=pC(mC(e,t,i,o));if(s.past<=cC)return;let c=Math.abs(s.edge);n.push({kind:`WRIST`,msg:`hand_${i} ${fC[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 gC(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)>lC&&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 _C={WRIST:gC},vC=2.2;function yC(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 lc.map(([e,t,n,i])=>[e,r(t),r(n),i])}function bC(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={...Wf,...n.limits}.allow;return t.frames.forEach(({s:e},t)=>{let c=t+o,l=lc.map(([t,n,r,i])=>[t,e.P[a[n]],e.P[a[r]],i]);for(let[o,u]of r){if(!lc.every(([,e,t])=>u.names.includes(e)&&u.names.includes(t)))continue;let r=yC(u,c),d=r.find(e=>e[0]===`hips`)[1];if(!(ro(e.P[a.Hips],d)>vC))for(let[e,a,c,u]of l){let l=Math.max(...r.map(([,e,t,n])=>u+n-fc(a,c,e,t))),d=qf(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 xC=105,SC=75,CC=.3,wC=.1,TC=4,EC=6,DC=2,OC=.5,kC=180/Math.PI,AC={l:`Left`,r:`Right`},jC={"over the head":0,high:1,wing:2};function MC(e,{s:t,diag:n,c:r},i){let a=(n[`hold_${i}`]?.w??0)>OC&&!n[`hold_${i}`].second;if(!a&&!((r[`armw_${i}`]??0)>OC))return null;let o=e.index,s=t.P[o[`${AC[i]}Arm`]],c=t.P[o[`${AC[i]}ForeArm`]],l=t.P[o[`${AC[i]}Hand`]],u=o.Spine2??o.Hips,d=To(e,t,u,[0,1,0]),f=W(To(e,t,u,[1,0,0]),i===`l`?1:-1),p=wo(t,o.Head,e.landmarks.headCentre);if(G(U(l,p),d)>e.landmarks.headRadii[1]+wC)return null;let m=U(c,s),h=Math.acos(io(-G(m,d)/K(m),-1,1))*kC,g=Math.atan2(G(m,f),-G(m,d))*kC;if(G(U(c,p),d)>0)return{kind:`over the head`,deg:h,held:a};if(h>xC)return{kind:`high`,deg:h,held:a};let _=U(l,t.P[o.Spine]),v=K(U(_,W(d,G(_,d))));return g>SC&&v<CC?{kind:`wing`,deg:g,held:a}:null}function NC(e,t,n,r,i){let a=e.ctx.spec,o=t=>e.timeMap?e.timeMap(t):t;for(let[s,c]of pm(a)){if(a.props?.[c.prop]?.hand!==t)continue;let l=(e.ctx.hold?.entry?.(s)??c).keys,u=l.map((e,t)=>[t,e]).filter(([,e])=>o(e.f)>=n&&o(e.f)<=r),d=l.reduce((e,t,n)=>Math.abs(o(t.f)-i)<Math.abs(o(l[e].f)-i)?n:e,0);return{id:s,picks:u.length?u:[[d,l[d]]]}}return null}var PC=e=>Math.round(e*100)/100,FC=(e,t)=>t.map(([t,n])=>`objects.${e}.keys[${t}] (f${n.f})`).join(`, `);function IC(e,t,n){let r=n.k,i=r===`l`?1:-1,a=n.held&&NC(t,r,n.first,n.last,n.worst);if(a){let r=a.picks.filter(([,e])=>e.aim&&!(e.lean>=45));if(r.length)return`give ${FC(a.id,r)} lean 45 (tips the aim to the hand's side, the elbow stays down)`;let i=t.frames[Math.max(0,Math.min(t.frames.length-1,Math.round(n.worst-(t.f0??0))))],o=a.picks[0][1].pos,s=U(i.s.P[e.index.Spine2??e.index.Hips],o),c=Math.hypot(s[0],s[2])||1;return`move ${FC(a.id,a.picks)} pos by [${PC(.05*s[0]/c)}, -0.08, ${PC(.05*s[2]/c)}] (lower, nearer the chest)`}return`key elbow_${r} [${(n.kind===`wing`?[PC(.1*i),-1,.2]:[PC(.3*i),-1,n.mouth?.35:-.2]).join(`, `)}] from f${n.first} to f${n.last} (down${n.kind===`wing`?` and in`:` and a little out`}${n.mouth?`, in front of the chest`:``})`}var LC={"over the head":`upper arm wraps over the head`,high:`elbow over the shoulder`,wing:`elbow flared out to the side`};function RC(e,t){let n=[],r=t.f0??0,i=t=>wo(t,e.index.Head,e.landmarks.mouth);for(let a of[`l`,`r`]){let o=null,s=()=>{o&&o.n>=TC&&n.push(o),o=null};t.frames.forEach((t,n)=>{let c=MC(e,t,a),l=n+r;if(o&&(l-o.last>EC||c&&c.held!==o.held)&&s(),!c)return;let u=K(U(t.s.P[e.index[`${AC[a]}Hand`]],i(t.s)))<.25;o??={k:a,kind:c.kind,held:c.held,first:l,worst:l,deg:c.deg,n:0,mouth:!1},o.last=l,o.n++,o.mouth||=u,(jC[c.kind]<jC[o.kind]||c.kind===o.kind&&c.deg>o.deg)&&Object.assign(o,{kind:c.kind,deg:c.deg,worst:l})}),s()}return n.sort((e,t)=>jC[e.kind]-jC[t.kind]||t.n-e.n),n.slice(0,DC).map(n=>`ARM arm_${n.k} ${LC[n.kind]} f${n.first}-f${n.last} (worst f${n.worst}, upper arm ${Math.round(n.deg)}deg ${n.kind===`wing`?`out`:`up`}): ${IC(e,t,n)}`)}var zC=(e,t)=>` (${e}the knee would fold ${Math.round(t)}deg; it bends to 150deg and stops at 160deg)`;function BC(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=U(i,s),d=Do(ro(s,c),ro(c,l),150)+.002,f=W(q(u),Math.max(0,d-K(u))),p=u[1]+Math.sqrt(Math.max(0,u[1]*u[1]-G(u,u)+d*d));return u[1]<0?{cause:e.cause(`root`,n),hint:`root: raise ${$(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 ${ix(f)} m out from the hip at f${n}${r}, or raise root ${$(p)} m`,fix:{channel:`foot_${t}`,f:n,delta:f}}}var VC=.003,HC=.25,UC=e=>/(^|_)l$|^Left/.test(e)?`l`:/(^|_)r$|^Right/.test(e)?`r`:null;function WC(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:Y(Z(-(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=fu(e.out.ctx,a,t,{...s,diag:{...s.diag,frame:n}},i);return{path:o(`local`),delta:Y(X(c.R),r)}}function GC(e,t,n,r,i=``){let a=/^prop_(.+)$/.exec(t),o=a?e.spec.props?.[a[1]]?.hand:UC(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?WC(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 ${ix(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 ${ix(u)} m at f${n}${i}`,fix:l}}var KC=e=>lc.find(t=>t[0]===e);function qC(e,t,n,r){let[,i,a]=KC(n),{s:o}=e.fr(t),s=uc(o.P[e.I[i]],o.P[e.I[a]]),c=s.map(e=>dc(e,r)),l=Math.min(...c);return{p:s[c.indexOf(l)],n:_c(s[c.indexOf(l)],r),d:l}}function JC(e,t,n,r,i){let a=t.worstFrame,o=e.out.objectsAt(e.rel(a))[r];if(!o||!KC(n))return null;let{n:s}=qC(e,a,n,o);return GC(e,n,a,W(s,i),` (out of ${r})`)}function YC(e,t,n,r){let i=t.worstFrame,a=e.out.objectsAt(e.rel(i))[r];if(!a)return null;let o=Vf(e.sk,e.fr(i).s,n.endsWith(`_l`)?`Left`:`Right`),s=Hf(o,a),c=t.worst-t.limit+VC;if(!(s.side>0))return s.topAt?GC(e,n,i,W(_c(s.topAt,a),c),` (out of ${r}'s top)`):null;let l=Math.max(...o.filter(e=>dc(e,a)<0).map(e=>2*a.half[1]-Y(X(a.R),U(e,a.pos))[1]))+VC,u=W(_c(s.sideAt,a),c);if(l>HC)return GC(e,n,i,u,` (out of ${r}'s side)`);let d=GC(e,n,i,Y(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 ${ix(u)} m out of that side`,d}function XC(e,t,n,r,i,a){return GC(e,n,t.worstFrame,W(q(r),i),` (away from the ${a})`)}function ZC(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 uc(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 QC={COLLIDE(e,t){let[,n,r]=/^(\S+) x (.+)$/.exec(t.subject)??[];if(/^foot_[lr]$/.test(n??``))return YC(e,t,n,r);let i=JC(e,t,n,r,t.worst-t.limit+VC);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=KC(n),a=e.out?.ctx?.scene?.people?.[r];if(!i||!a)return null;let o=t.worstFrame,{s}=e.fr(o),c=uc(s.P[e.I[i[1]]],s.P[e.I[i[2]]]),l=yC(a,o).map(([e,t,n,r])=>{let a=U(n,t),o=Math.max(G(a,a),1e-12);return c.map(n=>{let s=H(t,W(a,io(G(U(n,t),a)/o,0,1)));return{other:e,p:n,q:s,depth:i[3]+r-K(U(n,s))}}).reduce((e,t)=>t.depth>e.depth?t:e)}).reduce((e,t)=>t.depth>e.depth?t:e),u=GC(e,n,o,W(K(U(l.p,l.q))>1e-6?q(U(l.p,l.q)):q([l.p[0]-l.q[0]||1,0,l.p[2]-l.q[2]]),t.worst-t.limit+VC),` (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: ${$(t.worst+VC)} }]`}},CLEARANCE(e,t){let n=(e.spec.checks?.clearance??[]).find(e=>t.subject.startsWith(`${e.name}:`));return n&&JC(e,t,n.part,n.object,n.min-t.worst+VC)},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 BC(e,n,r,zC(`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 ${$(i[`fpitch_${n}`])} deg; + lifts the heel)`:``;return{cause:e.cause(`foot_${n}`,r),hint:`foot_${n}: raise ${$(t.worst+.001)} m at f${r} (foot_* is the ankle; it stands ${mc(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=wo(i,e.I.Head,e.sk.landmarks.headCentre);return XC(e,t,n,U(ZC(e,r,n).reduce((t,n)=>pc(e.sk,i,n)>pc(e.sk,i,t)?n:t),a),t.worst-t.limit+VC,`head`)},BODY(e,t){let[,n,r]=/^(\S+) into (\S+)$/.exec(t.subject)??[],i=KC(r),a=t.worstFrame,{s:o}=e.fr(a),s=/^(hand|farm|uarm)_([lr])$/.exec(n??``),c=s&&ps(e.sk);if(c){let i=e.I[`${s[2]===`l`?`Left`:`Right`}${{hand:`Hand`,farm:`ForeArm`,uarm:`Arm`}[s[1]]}`],l=ks(c,e.sk,o,i),u=l.p&&vs(c,o,l.p,c.skip.get(i));if(u){let i=GC(e,n,a,W(u,t.worst-t.limit+VC),` (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=U(u,l),f=e=>H(l,W(d,io(G(U(e,l),d)/G(d,d),0,1))),p=ZC(e,a,n).reduce((e,t)=>K(U(t,f(t)))<K(U(e,f(e)))?t:e);return XC(e,t,n,U(p,f(p)),t.worst-t.limit+VC,`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=q(U(i[a.LeftHand],i[a.RightHand])),o=(t.worst-t.limit+VC)/2,s=GC(e,`hand_l`,n,W(r,o));return{cause:s.cause,hint:`${s.hint}; and ${GC(e,`hand_r`,n,W(r,-o)).hint}`,fix:GC(e,`hand_l`,n,W(r,2*o)).fix}}let o=t.subject===`shins touch`,s=o?.1:.135,[c,l]=o?[`Leg`,`Foot`]:[`UpLeg`,`Leg`],u=fc(i[a[`Left${c}`]],i[a[`Left${l}`]],i[a[`Right${c}`]],i[a[`Right${l}`]]),d=U(i[a[`Left${l}`]],i[a[`Right${l}`]]);d[1]=0;let f=(s-u+VC)/2,p=q(d);return{cause:e.cause(`foot_l`,n),hint:`foot_l: move ${ix(W(p,f))} m and foot_r ${ix(W(p,-f))} m at f${n} (${o?`shins`:`thighs`} ${$(u)} m apart, need ${s}); or spread knee_l/knee_r`,fix:{channel:`foot_l`,f:n,delta:W(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 ${$(o)} deg (it reaches ${$(a(t.worstFrame))} at f${t.worstFrame}, ${$(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 ${mc(e.sk)} m above it), or declare checks.supports for the seat the hips rest on`};let o=W([`Hips`,`Spine1`,`Spine2`,`Head`].reduce((e,t)=>H(e,i[a[t]]),[0,0,0]),.25),s=[`Left`,`Right`].flatMap(t=>Object.values(gc(e.sk,r,t))),c=s.map(e=>e[0]),l=s.map(e=>e[2]),u=.07,d=[io(o[0],Math.min(...c)-u,Math.max(...c)+u),o[1],io(o[2],Math.min(...l)-u,Math.max(...l)+u)];return{cause:e.cause(`root`,n),hint:`root: move ${ix(U(d,o))} m at f${n} (centre of mass over the feet), or step a foot under it`,fix:{channel:`root`,f:n,delta:U(d,o)}}}},$C=.003,ew=.02,tw=.2;function nw(e,t,n,r,i=``){let a=t===`l`?`Left`:`Right`,{s:o}=e.fr(n),s=U(o.P[e.I[`${a}Hand`]],o.P[e.I[`${a}Arm`]]),c=Math.hypot(s[0],s[2])/Math.max(K(s),1e-9);if(c<.5)return null;let l=W(q([s[0],0,s[2]]),Math.min(tw,r/c));return{delta:l,hint:`body: move ${ix(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 rw=(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 iw(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>ew)||i&&o<=i.w||(i={ch:a,w:o});return i}function aw(e,t,n,r,i){let a=n.slice(-1),o=e.hand(a,r),s=o.anchor?iw(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)<=ew&&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 ${$(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 ow(e,t){let n=null;return(e.spec?.goals??[]).forEach((e,r)=>{let i=ux(e,r);t.subject.startsWith(`${i}:`)&&(!n||i.length>n.name.length)&&(n={goal:e,name:i,i:r})}),n}function sw(e,t,n){let r=[t,...e.out.ctx.scene?.objects?.[t]?.ancestors??[]].find(t=>vh(e.spec.objects?.[t],n));return r?e.spec.objects[r]:null}function cw(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=sw(e,i.replace(/\.(center|top|base|rim)$/,``),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=El(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 lw(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 uw(e,t,n,r,i,a){if(n===`moved`||n===`still`){let o=t[n],s=cw(e,o,r),c=gx(e.out,t,a),l=Tu(e.out,r,px(o)),u=l&&c&&K(U(l,c))>.001?q(U(l,c)):[0,1,0];return s?[s,W(u,n===`still`?-i:i)]:null}let[o,s]=n===`near`?bx(e.out.ctx.scene,t):t[n],c=cw(e,o,r),l=cw(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=Tu(e.out,r,o),h=Tu(e.out,r,s);return m&&h?[f,W(q(U(h,m)),p*i)]:null}var dw={GOAL(e,t){let n=e.spec&&ow(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=lx(i)[0],c=t.worst+$C,l=kx(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 ${$(t.worst)} ${u} ${s===`still`?`off`:`short`}; needs ${d} ${dx(i,s)})`;if(s===`speed`){let t=cw(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=uw(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|rim)$/,``);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|rim)$/,``);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=aw(e,i,m,r,f);if(t)return t;let n=rw(e,m.slice(-1),r)&&nw(e,m.slice(-1),r,c,f);if(n)return{cause:e.cause(`root`,r),hint:n.hint,fix:n.fix}}let g=GC(e,m,r,h,f),_=lw(e,m,r,h);return{cause:g.cause,hint:g.hint,..._?{fix:_}:{}}}},fw={Leg:[`UpLeg`,`Leg`,`Foot`,`knee`],ForeArm:[`Arm`,`ForeArm`,`Hand`,`elbow`]},pw=e=>e.startsWith(`Left`)?`l`:`r`,mw=e=>/^(w_|armw)/.test(e)?.5:/^(root|foot|hand)/.test(e)?1:/^(knee|elbow)/.test(e)?.2:.01;function hw(e,t,n){let r=pw(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)?ro(t,r):Math.abs(r-t))*mw(e)};return a.filter(e=>i[e]).sort((e,t)=>o(t)-o(e))}function gw(e,t,n){let r=t.subject.split(` `)[0],i=t.worstFrame,a=hw(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 _w(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 lu(e.out.ctx,i,t.s,t.diag,t.c)}function vw(e,t,n,r){let i=md(e.out.baked,t),a=r(e.fr(t)),o=null;for(let[s,c,l]of n){let n=r(Vb(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 yw=(e,t,n,r)=>e.fr(n).s.P[e.I[`${t===`l`?`Left`:`Right`}${fw[r][0]}`]],bw={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 BC(e,r,i,zC(`the ankle target is ${$(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=yw(e,r,i,`Leg`),c=U(o,s),l=ro(s,o)-t.worst,u=c[1]*c[1]-G(c,c)+l*l,d=[c[0],0,c[2]],f=u>=0?`or root down ${$(-c[1]-Math.sqrt(u)+.002)} m${t.worst<=.05?` (fix.reach does this when on)`:``}`:`or root ${ix(W(q(d),K(d)-l*.95))} m toward the foot (the foot is ${$(K(d))} m sideways of the hip: the root and foot keys disagree)`;return{cause:e.cause(`foot_${r}`,i),hint:`foot_${r}: move ${ix(W(q(U(s,o)),a))} m toward the hip at f${i}, ${f}`,fix:{channel:`foot_${r}`,f:i,delta:W(q(U(s,o)),a)}}}let o=r===`l`?`Left`:`Right`,{s,diag:c}=e.fr(i),l=q(U(s.P[e.I[`${o}Hand`]],s.P[e.I[`${o}Arm`]])),u=c[`arm_fold_${r}`];if(u){let n=GC(e,`hand_${r}`,i,W(l,a),` (the hand target is ${$(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 ${ix(W([-l[0],0,-l[2]],a))} m back from it`,fix:n.fix}}let d=GC(e,`hand_${r}`,i,W(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?ro(g,H(_w(e,e.fr(i),`anchor:${f}`),h.offset??[0,0,0]))+.01:a,v=m&&nw(e,r,i,Math.min(a,_));return v?{cause:d.cause,hint:`${v.hint} (out of reach by ${$(t.worst)} m), or ${d.hint}`,fix:v.fix}:{cause:d.cause,hint:`${d.hint} (out of reach by ${$(t.worst)} m), or bring root ${ix(W([l[0],0,l[2]],a))} m closer`,fix:d.fix}},KNEE(e,t){let n=pw(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=U(s[c[`${r}ToeBase`]],s[c[`${r}Foot`]]);t[1]=0;let a=H(q(Y(Z(-(o.yaw??0)),t)),[0,.3,0]);return{cause:e.cause(`knee_${n}`,i),hint:`knee_${n}: key ${ix(q(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:q(a)}}}if(/ folds /.test(t.subject))return BC(e,n,i,` (the knee folds ${$(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=ro(l,u),p=ro(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 ${ix(W(q(U(d,l)),h-ro(l,d)))} m away from the hip at f${i} (the knee folds ${$(t.worst)} deg, limit ${t.limit})`,fix:{channel:`foot_${n}`,f:i,delta:W(q(U(d,l)),h-ro(l,d))}}},ELBOW(e,t){let n=pw(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=W(q(U(l,s)),Do(ro(s,c),ro(c,l),145)-ro(s,l));return GC(e,`hand_${n}`,i,u,` (the elbow folds ${$(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=pw(n),[o,s,c,l]=fw[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 _o(U(r[u[`${n}${s}`]],r[u[`${n}${o}`]]),U(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&&K(v)<.5)return{cause:e.cause(_,i),hint:`${_}: the pole passes near zero (length ${$(K(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 ${$(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 ${ix(v)} there)`:``}`,fix:v&&{channel:_,f:i,value:v}}},SLIDE(e,t){let n=pw(t.subject),r=n===`l`?`Left`:`Right`,i=t.subject.includes(`heel`)?`heel`:`ball`,a=Math.max(0,t.first-1),o=t=>gc(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 ${$(l[a])} -> ${$(l[t.last])} deg over f${a}-f${t.last} and the ${i} slides ${$(s)} m; key fyaw_${n} ${$(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 ${ix(c)} at both ends)`:``}; the ${i} slides ${$(s)} m${s<.01?`; fix.slide locks this when on`:``}`,fix:c&&{channel:`foot_${n}`,f:t.last,value:c}}},SPEED:(e,t)=>gw(e,t,1),POP:(e,t)=>gw(e,t,.5),ACC:(e,t)=>gw(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 ${mc(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=cS(e.out,i,n.point),o=cS(e.out,i,n.target),s=U(o,a),c=/^prop:([^.]+)/.exec(n.point),l=c?e.spec.props?.[c[1]]?.hand:pw(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})`:GC(e,`hand_${l}`,r,s).cause,h=W(q([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=W(q([t[0]-o[0],0,t[2]-o[2]]),d+.01);return{cause:m,hint:`inside the forearm's reach by ${$(d)} m at f${r} (the elbow would fold ${Math.round(g)}deg; it stops at 150deg): bring root ${ix(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 ${$(d)} m at f${r}: bring root ${ix(h)} m toward ${f??`the target`}, or move the target`,fix:{channel:`root`,f:r,delta:h}};let _=GC(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:pw(n.from.slice(6)),o=n.minCos??.64,s=t=>n.along===`up`?[0,1,0]:n.along===`face`?To(e.sk,t.s,e.I.Head,[0,0,1]):q(n.along),c=t=>G(q(U(_w(e,t,n.to),_w(e,t,n.from))),s(t)),l=md(e.out.baked,r),u=l[`wtwist_${a}`]??0,d=l[`wflex_${a}`]??0,{best:f,base:p}=vw(e,r,[[`wtwist_${a}`,io(u+15,-85,85),15],[`wtwist_${a}`,io(u-15,-85,85),15],[`wflex_${a}`,io(d+15,-70,70),15],[`wflex_${a}`,io(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 ${$(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=io(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 ${$(g)} deg at f${r} (now ${$(m)}; cos ${$(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=pw(n.joint),a=`${/Leg/.test(n.joint)?`knee`:`elbow`}_${i}`,o=md(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=md(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(Vb(e.out.ctx,{...l,[a]:t},r)),turn:_o(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 ${ix(f.p)} (body frame: +y up, +z forward) at f${r} (${n.joint} ${$(u)} m below ${n.ref} -> ${$(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=K(U(cS(e.out,e.rel(t),`joint:${n.joint}`),cS(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} ${$(i.d)} m from ${n.anchor} there)`:`${n.joint} never gets within ${a} m of ${n.anchor} near f${r} (closest ${$(i.d)} m at f${i.q}): hold its weight w_${n.anchor}_${pw(n.joint)} at 1 around the switch`}}},xw=.003,Sw=24;function Cw(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 ww(e,t,n,r,i){let a=GC(e,`hand_${t}`,n,r,i),o=Cw(e,t,n,r);return o?{...a,fix:o}:a}function Tw(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,Pl(a)[i.object]?.ancestors,[i.object]].some(e=>e?.includes(r))}function Ew(e,t){let n=Y(X(e.R),U(t,e.pos)),r=[0,e.half[1],0];return H(e.pos,Y(e.R,n.map((t,n)=>io(t,r[n]-e.half[n],r[n]+e.half[n]))))}var Dw={REACH:(e,t)=>yS(e,t)??bw.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||!hg(i))return a;let o=null;for(let i=r-Sw;i<=r+Sw;i++){let a=MS(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=yg(s,c,e.fr(r).s,i),d=_h(l,n).map(e=>Ew(l.objects[e],u)).reduce((e,t)=>K(U(t,u))<K(U(e,u))?t:e),f=K(U(d,u)),p=W(U(d,u),f>1e-9?(f-t.limit/2)/f:0),m=ww(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=hg(i[r])?r:hg(i[n])?n:null;if(!a||!e.out)return QC.COLLIDE(e,t);let o=i[a],s=e.spec.props[o.prop].hand,[c,l]=xh(e.out,o),u=t.worst-t.limit+xw,d=t.worstFrame,f=d>=c&&d<=l,p=Math.min(d,l),m=Nh(e.out,a,d)??[];if(a===r){let t=lc.find(e=>e[0]===n),{s:r}=e.fr(d);if(!t||!m.length)return null;let i=uc(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)=>dc(t[1],t[0])<dc(e[1],e[0])?t:e),l=_c(c,o),p=/^(hand|farm|uarm)_([lr])$/.exec(n)?.[2];return f&&p&&p!==s&&Tw(e,p,d,a)?GC(e,`hand_${p}`,d,W(l,u),` (out of ${a})`):f?ww(e,s,d,W(l,-u),` (${a} off ${n})`):GC(e,n,d,W(l,u),` (out of ${a})`)}let h=e.out.objectsAt(e.rel(d))[r];if(!h||!m.length)return null;let g=Nh(e.out,a,Math.max(c,t.first-1))??m,_=m.map((e,t)=>OS(e,h,U(g[t].pos,h.pos))).reduce((e,t)=>t.depth>e.depth?t:e);return ww(e,s,p,W(_.axis,_.depth-t.limit+xw),f?` (${a} out of ${r})`:` (${a} is put down in ${r}; it stays where the hand lets go at f${l})`)}},Ow=.005,kw=e=>e.spec?.fix?.grasp===!1,Aw={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 jw(e,t,n){let{scene:r}=e.out.ctx,i=e.out.objectsAt?.(e.rel(n))??{};return _h(r,t).map(t=>({...r.objects[t],...e.out.ctx.objectPose?.(t,n)??i[t]??{}}))}var Mw={FINGER_GAP(e,t){if(kw(e))return Aw;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=W(H(s.P[e.I[`${a}Hand`]],s.P[e.I[`${a}HandMiddle1`]]),.5),l=jw(e,r,o);if(!l.length)return null;let u=l.reduce((e,t)=>Sc(t,c)<Sc(e,c)?t:e),d=Sc(u,c);return GC(e,`hand_${i}`,o,W(Cc(u,c),-Math.max(0,d-.03)),` (onto ${r}: the fingers reach it from nearer)`)},FINGER_PEN(e,t){if(kw(e))return Aw;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=jw(e,r,a);if(!s.length)return null;let c=s.reduce((e,t)=>Sc(t,o)<Sc(e,o)?t:e);return GC(e,`hand_${i}`,a,W(Cc(c,o),t.worst-t.limit+Ow),` (out of ${r})`)},SUPPORT(e,t){if(kw(e))return Aw;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[_h(e.out.ctx.scene,n)[0]],a=i?yc(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=Dh(e.out,n,t)?.pos;r&&(!a||K(U(r,i))<a.d)&&(a={f:t,d:K(U(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}}},Nw=[`add`,`remove`,`replace`,`move`,`test`],Pw=e=>{throw Error(`MOTION_SPEC_INVALID: ${e}`)},Fw=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Iw=e=>e.split(`/`).slice(1).map(e=>e.replaceAll(`~1`,`/`).replaceAll(`~0`,`~`)),Lw=e=>e.map(e=>`/${String(e).replaceAll(`~`,`~0`).replaceAll(`/`,`~1`)}`).join(``),Rw=/^@[A-Za-z_]\w*=[^&]*(&[A-Za-z_]\w*=[^&]*)*$/,zw=e=>Rw.test(e)?e.slice(1).split(`&`).map(e=>[e.slice(0,e.indexOf(`=`)),e.slice(e.indexOf(`=`)+1)]):null,Bw=(e,t)=>typeof e==`object`&&!!e&&t.every(([t,n])=>Object.hasOwn(e,t)&&String(e[t])===n),Vw=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Hw=e=>/^-?\d+(\.\d+)?$/.test(e)?Number(e):e,Uw=[`name`,`skill`,`anchor`,`f`,`f0`,`side`,`type`];function Ww(e,t,n){if(!Array.isArray(e)){let n=Object.keys(e);return n.length?`${t} has ${n.slice(0,8).join(`, `)}${n.length>8?`, ...`:``}`:`${t} is empty`}let r=n?.[0]??Uw.find(t=>e.some(e=>e&&typeof e==`object`&&Object.hasOwn(e,t)));if(!r)return`${t} has ${e.length} entries`;let i=[...new Set(e.filter(e=>e&&Object.hasOwn(e,r)).map(e=>e[r]))],a=Number(n?.[1]),o=i.every(e=>typeof e==`number`)?(Number.isFinite(a)?[...i].sort((e,t)=>Math.abs(e-a)-Math.abs(t-a)):i).slice(0,8).sort((e,t)=>e-t):i.slice(0,8);return`${t} has ${e.length} entries; by ${r}: /${t}/@${r}=<${r}>, ${r} ${o.join(`, `)}${i.length>o.length?`, ...`:``}`}function Gw(e,t,n,r,i,a){let o=zw(t),s=[];e.forEach((e,t)=>Bw(e,o)&&s.push(t));let c=o.length===1&&o[0][0]===`f`;if(s.length>1&&!c){let n=Uw.find(t=>!o.some(e=>e[0]===t)&&new Set(s.map(n=>e[n]?.[t])).size===s.length);Pw(`${r}: ${s.length} ${i} entries have ${t.slice(1)}${n?` (${n} ${s.map(t=>e[t][n]).join(`, `)}; add &${n}=<${n}>)`:` (indices ${s.join(`, `)})`}`)}if(s.length){let t=(t,n)=>{let r=e[t];for(let e of n){if(typeof r!=`object`||!r||!Object.hasOwn(r,e))return!1;r=r[e]}return!0};return String(s.findLast(e=>t(e,n))??s.findLast(e=>t(e,n.slice(0,-1)))??s.at(-1))}if(!a)return-1;let l=Object.fromEntries(o.map(([e,t])=>[e,Hw(t)]));return n.length>1&&(l[n[0]]={}),e.push(l),String(e.length-1)}function Kw(e,t,n,r,i){let a=e,o=[];for(let e=0;e<t.length;e++){let s=t[e];if(Array.isArray(a)&&zw(s)&&e<t.length-1){let c=e?o[e-1]:`the spec`,l=Gw(a,s,t.slice(e+1),n,c,!1);l===-1&&!r&&Pw(`${n}: ${Lw([...o,s])} matches nothing (${Ww(a,c,zw(s)[0])})`),s=l===-1?Gw(a,s,t.slice(e+1),n,c,!0):l,l===-1&&(o.created=!0,i?.push(`${n}: created ${Lw(o)}/${s} (${t[e].slice(1)})`))}o.push(s),e<t.length-1&&(a=typeof a==`object`&&a?a[Array.isArray(a)?Number(s):s]:void 0)}return o}function qw(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))&&Pw(`${n}: ${Lw(t.slice(0,e+1))} does not exist${r&&typeof r==`object`?` (${Ww(r,a)})`:``}`),r=r[Array.isArray(r)?Number(i):i]}return(typeof r!=`object`||!r)&&Pw(`${n}: ${Lw(t.slice(0,-1))} is not an object or array`),r}function Jw(e,t,n,r,i,a){let o=zw(t),s=e.flatMap((e,t)=>Bw(e,o)?[t]:[]);if(n===`add`)return s.length&&Pw(`${i}: ${a} already has an entry with ${t.slice(1)}; replace its fields or remove it first`),(typeof r!=`object`||!r||Array.isArray(r))&&Pw(`${i}: add through a selector takes an object value`),e.push({...structuredClone(r),...Object.fromEntries(o.map(([e,t])=>[e,Hw(t)]))}),null;if(s.length||Pw(`${i}: ${a} has no entry with ${t.slice(1)} (${Ww(e,a,o[0])})`),n===`remove`){for(let t of s.reverse())e.splice(t,1);return null}return Gw(e,t,[],i,a,!1)}function Yw(e,t,n,r){(!t||typeof t!=`object`||!Nw.includes(t.op))&&Pw(`patch[${n}]: op must be ${Nw.join(`, `)}, got ${JSON.stringify(t?.op)}`);let i=`patch[${n}] (${t.op} ${t.path})`;if((typeof t.path!=`string`||t.path!==``&&!t.path.startsWith(`/`))&&Pw(`${i}: path must be a JSON Pointer such as "/keys/0/f" or "/keys/@f=24/set/hand_l"`),t.op===`move`){(typeof t.from!=`string`||!t.from.startsWith(`/`))&&Pw(`${i}: move needs from, a JSON Pointer such as "/keys/@f=120"`);let a=Kw(e,Iw(t.from),i,!1),o=a.at(-1),s=qw(e,a,i),c=a.at(-2)??`the spec`,l;if(Array.isArray(s)&&zw(o)){let e=s.flatMap((e,t)=>Bw(e,zw(o))?[t]:[]);e.length||Pw(`${i}: ${c} has no entry with ${o.slice(1)} (${Ww(s,c,zw(o)[0])})`),l=e.map(e=>s[e]).reduce((e,t)=>Object.fromEntries([...new Set([...Object.keys(e),...Object.keys(t)])].map(n=>[n,Vw(e[n])&&Vw(t[n])?{...e[n],...t[n]}:Array.isArray(e[n])&&Array.isArray(t[n])&&n===`step`?[...new Set([...e[n],...t[n]])]:Object.hasOwn(t,n)?t[n]:e[n]])));for(let t of e.reverse())s.splice(t,1)}else Object.hasOwn(s,Array.isArray(s)?Number(o):o)||Pw(`${i}: ${t.from} does not exist (${Ww(s,c)})`),l=s[Array.isArray(s)?Number(o):o],Array.isArray(s)?s.splice(Number(o),1):delete s[o];return Yw(e,{op:`add`,path:t.path,value:l},n,r)}if(t.op!==`remove`&&!Object.hasOwn(t,`value`)&&Pw(`${i}: needs a value`),t.path===``){if(t.op===`replace`)return structuredClone(t.value);if(t.op===`test`)return Fw(e,t.value)||Pw(`${i}: the spec differs from the test value`),e;Pw(`${i}: ${t.op} needs a path below the spec`)}let a=t.op===`add`||t.op===`replace`&&!!r,o=Kw(e,Iw(t.path),i,a,r),s=qw(e,o,i),c=o[o.length-1],l=o.length>1?o[o.length-2]:`the spec`;if(Array.isArray(s)&&zw(c)){if(t.op===`replace`&&r&&!s.some(e=>Bw(e,zw(c))))return r.push(`${i}: nothing had ${c.slice(1)}; added`),Yw(e,{...t,op:`add`},n);if(c=Jw(s,c,t.op,t.value,i,l),c===null)return e}if(Array.isArray(s)){if(c===`-`)return t.op!==`add`&&Pw(`${i}: "-" (append) works with add only`),s.push(structuredClone(t.value)),e;let n=/^\d+$/.test(c)?Number(c):NaN,r=t.op===`add`?s.length:s.length-1;return n>=0&&n<=r||Pw(`${i}: ${t.path} does not exist (${Ww(s,l)})`),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):Fw(s[n],t.value)||Pw(`${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,c)?o.created||r.push(`${i}: ${t.path} did not exist (${Ww(s,l)}); added`):t.op!==`add`&&!Object.hasOwn(s,c)&&Pw(`${i}: ${t.path} does not exist (${Ww(s,l)})`),t.op===`remove`?delete s[c]:t.op===`test`?Fw(s[c],t.value)||Pw(`${i}: value is ${JSON.stringify(s[c])?.slice(0,60)}, not ${JSON.stringify(t.value)?.slice(0,60)}`):s[c]=structuredClone(t.value),e}function Xw(e,t,n){return Array.isArray(t)||Pw(`patch must be an array of { op, path, value }`),t.reduce((e,t,r)=>Yw(e,t,r,n),structuredClone(e))}var Zw=2,Qw=e=>Array.isArray(e)?e.map(Qw):typeof e==`number`?Math.round(e*1e4)/1e4:e,$w=e=>e.split(`/`).slice(1).map(e=>e.replaceAll(`~1`,`/`).replaceAll(`~0`,`~`)),eT=e=>e.map(e=>`/${String(e).replaceAll(`~`,`~0`).replaceAll(`/`,`~1`)}`).join(``),tT=e=>typeof e==`number`&&Number.isFinite(e);function nT(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 rT(e,t){if(tT(e)&&tT(t))return e+t;if(Array.isArray(e)&&Array.isArray(t)&&e.length===t.length&&e.every(tT)&&t.every(tT))return e.map((e,n)=>e+t[n])}function iT(e,t,n){let r=-1;return(e.keys??[]).forEach((i,a)=>{!i?.set||!Object.hasOwn(i.set,t)||!tT(i.f)||Math.abs(i.f-n)>Zw||(r<0||Math.abs(i.f-n)<Math.abs(e.keys[r].f-n))&&(r=a)}),r}function aT(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=Qw(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 oT(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:Qw(t)}:{op:`add`,path:`/use/${n}/args`,value:{[e]:Qw(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 sT(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:Qw([i[0]+n.delta[0],i[1],i[2]+n.delta[2]])}:null}).filter(Boolean)}function cT(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 aT(e,t,n,r);if(i?.[2]===`walkTo`)return oT(e,t,Number(i[1]),n);let a=r&&sT(e,t,n);return a?.length?a:null}function lT(e,t,n){let{channel:r,f:i}=n;if(typeof r!=`string`||!tT(i))return null;if(n.hold)return cT(e,t,n);let a=e=>n.value===void 0?rT(e,n.delta):n.value,o=iT(t,r,i);if(o>=0){let e=a(t.keys[o].set[r]);return e===void 0?null:[{op:`replace`,path:eT([`keys`,o,`set`,r]),value:Qw(e)}]}if(!e?.fr)return null;let{prev:s,next:c}=e.bracket(r,i),l=s&&i-s.f<=Zw?s:c&&c.f-i<=Zw?c:null,u=n.delta!==void 0&&aT(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]:Qw(d)}}}]}function uT(e,t){if(typeof t.path!=`string`||!t.path.startsWith(`/`))return null;let n=$w(t.path),r=nT(e,n),i=t.delta===void 0?t.value:r===void 0&&t.path.endsWith(`/offset`)?t.delta:rT(r,t.delta);return i===void 0?null:r===void 0?nT(e,n.slice(0,-1))===void 0?n.length===2&&n[0]===`fix`?[{op:`add`,path:eT([n[0]]),value:{[n[1]]:Qw(i)}}]:null:[{op:`add`,path:t.path,value:Qw(i)}]:[{op:`replace`,path:t.path,value:Qw(i)}]}function dT(e,t,n){let r=e.ops?e.ops(n):e.channel===void 0?e.path===void 0?null:uT(n,e):lT(t,n,e);if(!r)return null;try{return JSON.stringify(Xw(n,r))===JSON.stringify(n)?null:r}catch{return null}}function fT(e,{X:t,userSpec:n}={}){if(!n||typeof n!=`object`)return e;for(let r of e)if(r.fix)try{let e=dT(r.fix,t,n);e&&(r.patch=e)}catch{}return e}var pT={...QC,...bw,...Dw,...dw,..._C,...Fb,...Mw};function mT(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 hT(e,t,n){let r=mT(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 gT(e,t,n,r,{limit:i=16,userSpec:a}={}){if(!r.length)return r;let o=hT(e,t,n);for(let e of r.slice(0,i))try{let t=pT[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 fT(r,{X:o,userSpec:a})}var _T=new Set([`ORIENT`,`BELOW`,`CLEARANCE`]),vT=e=>Math.max(0,_T.has(e.kind)?e.limit-e.worst:e.worst-e.limit),yT=e=>e.count*(1+Math.min(3,vT(e)/Math.max(Math.abs(e.limit),.01))),bT=e=>Math.round(yT(e)*100)/100,xT=/(?<![\w\-.[])[-+]?\d+(\.\d+)?|\bf\d+\b/g,ST=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(xT,e=>e[0]===`f`?`f#`:`#`)}`};function CT(e){for(let t of e)t.excess=Math.round(vT(t)*1e4)/1e4,t.severity=bT(t);return e.sort((e,t)=>(t.kind===`GOAL`)-(e.kind===`GOAL`)||t.severity-e.severity||t.count-e.count)}function wT(e){let t=new Map;for(let n of e){let e=ST({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),(_T.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 CT([...t.values()])}function TT(e,t,n,r={}){let i=n.checks??{},a=Ax(t,n.goals??[]),o=[...Jf(e,t,{allow:i.allow,limits:i.limits,mouthPoints:i.mouthPoints}),...mS(t,i),...PS(e,t,n),...$S(e,t),...Nb(e,t),...jf(t,i),...Nf(e,t,i,{...Wf,...i.limits}),...hC(e,t),...bC(e,t,i),...a.issues];if(t.f0)for(let e of o)e.frame+=t.f0;let s=wT(o);r.explain!==!1&&gT(e,t,n,s,{userSpec:r.userSpec});let c=RC(e,t);return{ok:o.length===0,total:o.length,problems:s.length,...n.goals?{goals:a.results}:{},groups:s,...c.length?{warnings:c}:{}}}var ET=[`contacts`,`orient`,`below`,`clearance`,`appear`];function DT(e){let t=e?.checks;if(!t||typeof t!=`object`||!ET.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 ET)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 OT=(e,t)=>({...t,...e?{description:e}:{}}),kT=(e,t)=>OT(e,{type:`number`,...t}),AT=(e,t)=>OT(e,{type:`integer`,...t}),jT=(e,t)=>OT(e,{type:`string`,...t}),MT=(e,t)=>OT(e,{type:`boolean`,...t}),NT=(e,t)=>OT(t,{$ref:`#/$defs/${e}`}),PT=e=>OT(e,{enum:[`l`,`r`]}),FT=(e,t)=>OT(t,{type:`array`,prefixItems:[e,e],minItems:2,maxItems:2}),IT={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:`^(${Qc.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: ${lc.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`}]}},LT={f:AT(`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:jT(`written by the skills expander; leave it out`)},RT={skill:jT(`a skill name (topic skills)`),args:{type:`object`,description:`the skill's args (topic skills with name)`},f0:AT(`first frame`,{minimum:0})},zT={type:{const:`walk`},f0:AT(`first frame; needs a standing pose keyed before it`,{minimum:0}),steps:AT(`footsteps`,{minimum:1,default:8}),step:kT(`stride, m`,{default:.5}),period:AT(`frames per step`,{default:20}),swing:AT(`frames a foot is in the air`,{default:14}),halfWidth:kT(`feet half-width, m`,{default:.08}),lift:kT(`foot lift, m`,{default:.08}),heading:FT({type:`number`},`[h0, h1] degrees; ${fl.yaw}`),turnDistance:kT(`m walked while the heading turns h0 -> h1`,{default:.4}),pelvisHigh:kT(`hips offset over the stance foot, m`),pelvisLow:kT(`hips offset at double support, m`),firstStep:kT(`first stride, m`,{default:.4}),armSwing:kT(`degrees`,{default:14}),vary:kT(`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})},BT={schema:{const:`cozyclay.motion-spec.v1`},fps:{const:24},frames:{oneOf:[AT(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:jT(`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:kT(`m; a hand moving between targets arcs around the torso this far out`,{default:.25}),search:{type:`object`,properties:{budget:AT(`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`}},VT={p:NT(`vec3`,`world: a world point (m); body: root-relative, ${fl.pole}`),bone:jT(`bone name`),offset:NT(`vec3`,`world offset, m`),from:jT(`bone`),to:jT(`bone`),t:kT(`0 = from .. 1 = to`,{default:.5}),tMin:kT(`with reach: the lowest t to slide back to`,{default:.15}),reach:PT("slide toward `from` until this arm reaches"),object:jT(`scene object id`),local:NT(`vec3`,`point in the object's frame, m`),name:{const:`mouth`},prop:jT(`a prop held by the other hand`),point:jT(`a point of that prop, or origin`),person:jT(`a character id`),socket:jT(`a socket of the object`),grasp:{enum:sl,description:`the hand takes it by a socket`}},HT=e=>NT(`vec3`,`${e} [d, l, n] on the palm axes (d to the middle finger, l to the thumb side, n = d x l), m`),UT={world:[`p`],body:[`p`],bone:[`bone`],segment:[`from`,`to`],object:[`object`],landmark:[`name`],prop:[`prop`,`point`],person:[`person`,`bone`]},WT={hand:PT(),origin:{type:`array`,items:{type:`string`},minItems:1,description:`bones whose mean is the prop origin`},points:{type:`object`,additionalProperties:HT(`point:`),description:`name -> point`}},GT={side:PT(),anchor:jT(`an anchor name`),effector:{oneOf:[{type:`object`,properties:{prop:jT(),point:jT()},required:[`prop`,`point`]},{type:`object`,properties:{joints:{type:`array`,items:{type:`string`}}},required:[`joints`]}],description:`the hand point fitted onto the anchor`},offset:NT(`vec3`,`world offset, m`),orient:{type:`boolean`,description:`false: no grip turn`}},KT={f:AT(),pos:NT(`vec3`),rot:{type:`array`,items:{type:`number`},minItems:4,maxItems:4,description:`quat x, y, z, w`},aim:NT(`vec3`,`or rot: +Y dir`),roll:kT(`deg about aim`),lean:kT(`aim tilt`,{minimum:0,maximum:45})},qT={type:`object`,properties:{at:AT(),onto:jT(),bounce:kT(null,{default:.25,minimum:0,maximum:.6}),tumble:{type:`boolean`},v:{oneOf:[{$ref:`#/$defs/vec3`},{const:`hand`}],description:`m/s`}},required:[`at`],additionalProperties:!1},JT={description:`as carry; keys at any frame`},YT={keys:JT,fall:JT},XT={pivot:NT(`vec3`,`world hinge point`),axis:NT(`vec3`,`default +Y`),channel:jT(`angle channel, deg`),prop:jT(`spec.props name: it rides that hand`),at:NT(`vec3`,`palm offset [d, l, n]`),along:NT(`vec3`,`+Y on the palm, fixed`),visible:jT(`channel: shown > 0.5`),level:jT(`channel: strength 0..4`),grab:AT(`hand takes it`,{default:0}),release:AT(`let go (else end)`),keys:{type:`array`,items:{type:`object`,properties:Object.fromEntries(Kc.map(e=>[e,KT[e]])),required:[`f`,`pos`],additionalProperties:!1},description:`world pose at f; hand follows`},fall:{...qT,description:`or a list; topic objects`},grasp:{enum:sl},mass:kT(`kg`,{minimum:.01,maximum:60}),follow:NT(`ref`),offset:NT(`vec3`),aim:{oneOf:[{enum:[`face`,`up`]},{$ref:`#/$defs/vec3`},{$ref:`#/$defs/ref`}],default:`up`}},ZT={name:jT(`the QA group's name`),point:NT(`checkRef`),target:NT(`checkRef`),tol:kT(`m; default contacts 0.01, appear 0.035, supports 0.04`),when:NT(`when`),from:NT(`checkRef`),to:NT(`checkRef`),along:{oneOf:[{enum:[`face`,`up`]},{$ref:`#/$defs/vec3`}]},minCos:kT(`default 0.64`),joint:jT(`bone`),ref:jT(`bone`),min:kT(`m; below default 0.08`),part:NT(`part`),object:jT(`scene object id`),frames:NT(`frameSpan`),channel:jT(`a visibility channel`),anchor:jT(`an anchor name`),depth:kT(`allowed depth, m`)},QT={contacts:[`point`,`target`],orient:[`from`,`to`,`along`],below:[`joint`,`ref`],clearance:[`part`,`object`,`min`],appear:[`channel`,`joint`,`anchor`],supports:[`object`],allow:[`part`,`object`,`depth`]},$T={limits:{type:`object`,properties:Object.fromEntries(Object.entries(Wf).map(([e,t])=>[e,kT(null,{default:t})])),additionalProperties:!1},mouthPoints:{type:`array`,items:jT(`prop.point`),description:`prop points allowed at the mouth`}},eE={name:jT(),near:FT({$ref:`#/$defs/ref`},`distance <= tol`),above:FT({$ref:`#/$defs/ref`},`a.y - b.y >= by`),moved:jT("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:jT("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:jT("a point ref: its speed reaches `by` m/s (mode any by default)"),tol:kT(`m; near default 0.05, still 0.01`),by:kT(`above m, default 0; moved m, default 0.05; speed m/s, needed`),at:{oneOf:[AT(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:jT(`a goal's name: at starts after the first frame that goal holds`),before:jT(`a goal's name: at ends before the first frame that goal holds`)},tE={name:jT(`the key of the answer`),distance:FT({$ref:`#/$defs/ref`},`min/max/mean/first/last m`),position:NT(`ref`,`world points`),frames:NT(`frameSpan`,`absolute, default the whole take`),every:AT(`position: every n frames (<= 16 rows)`,{minimum:1})},nE={reach:MT(`wrist targets past reach go onto it softly; hips lower for near-miss ankles`,{default:!0}),slide:MT(`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:MT(`arms kept out of the body's skin (wrists, elbows)`,{default:!0}),retime:MT(`speed spikes borrow frames from the neighbouring keys`,{default:!1}),stance:MT(`a standIdle stance in a scene body slides out of it (observations.placed)`,{default:!0}),grasp:MT(`fingers close on what the hand holds; it rests in the hand`,{default:!0})},rE={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|.rim], a body or group; bare = its surface (distance)`,person:`person:<id>.<Bone>`},iE=e=>e.f0+16+(e.steps??8)*(e.period??20)+18,aE=e=>({type:`array`,items:{type:`number`},minItems:2,maxItems:2,description:e}),oE=e=>Object.fromEntries(e.map(e=>[e,jT(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)`)])),sE=Object.fromEntries(qc.filter(e=>e!==`type`&&e!==`f0`).map(e=>[e,zT[e]])),cE={standIdle:{args:{at:aE(`[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:kT(`degrees (yaw); default the keyed yaw`),until:AT(`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:aE(`[x, z] world m: the heading turns toward it and the steps cover the distance (given steps, the stride or the step count and cadence is fitted to it in a natural gait, or the walk is refused)`),...sE,heading:{oneOf:[kT(),zT.heading],description:`degrees: h1, or [h0, h1]`},arrive:AT(`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:jT(`not ending in _l/_r`),side:PT(`the hand`),reach:AT(`frames to reach`,{default:20}),hold:AT(`frames held`,{default:22}),release:AT(`frames to let go`,{default:12}),elbow:NT(`vec3`,`pole`),fingers:{enum:ol,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:{...oE([`car`,`seat`,`seatBack`,`wheel`]),offset:{...NT(`vec3`,`hips from the seat top, seat frame`),default:[0,.17,.02]},floor:kT(`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:{...oE([`car`,`seat`,`door`,`handle`]),side:PT(`driver door side, default l`),channel:jT(`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:kT(`back/front: m along the heading at landing (default back -0.25, front 0.4)`),side:PT(`cartwheel: toward the character's l (default) or r`),heading:kT(`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:AT(`hold to this frame; default the last frame; under f0+264 the beats are paced to fit`),kit:{type:`object`,properties:{cig:jT(`the cigarette kit's rootId (object.createKit)`),lighter:jT(`the lighter kit's rootId`),exhale:jT(`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:aE(`[x, z] the way the body is thrown`),from:jT(`or what hits it: object:<id> | person:<id> (thrown away from it)`),speed:kT(`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:jT(`the carried object's id (objects.<id>.prop on the hand's prop)`),side:PT(`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:jT(`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`}}}},lE={_l:`_r`,_r:`_l`},uE=/^(yaw|roll|spine_yaw|spine_roll|head_yaw|head_roll|fyaw_[lr]|wtwist_[lr]|wflex_[lr])$/,dE=/^(root|foot_[lr]|hand_[lr])$/,fE=/^(knee|elbow)_[lr]$/,pE=/^(yaw|fyaw_[lr])$/,mE=e=>e&&typeof e==`object`?structuredClone(e):e,hE=e=>e.replace(/_(l|r)$/,e=>lE[e]).replace(/^(Left|Right)/,e=>e===`Left`?`Right`:`Left`),gE=()=>({origin:[0,0,0],yaw:0,mirror:!1,negate:new Set,names:{}}),_E=(e,t)=>H(e.origin,Y(Z(e.yaw),e.mirror?[-t[0],t[1],t[2]]:t)),vE=(e,t)=>e.mirror?[-t[0],t[1],t[2]]:t.slice();function yE(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)?hE(t):t}function bE(e,t){let n={};for(let[r,i]of Object.entries(t)){let t=mE(i);dE.test(r)?t=_E(e,t):fE.test(r)?t=vE(e,t):typeof t==`number`&&(e.mirror&&(uE.test(r)||e.negate.has(r))&&(t=-t),pE.test(r)&&(t+=e.yaw)),n[yE(e,r)]=t}return n}function xE(e,t=0,n=gE()){let r=[],i=e=>yE(n,e);return{state:e,keys:r,frame:n,at(i,a){let o=bE(n,a);Object.assign(e,mE(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),mE(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 SE=(e,t)=>{throw Error(`MOTION_SPEC_INVALID: ${e}: ${t}`)};function CE(e,t,n){let r=e.scene?.objects?.[n];return r||SE(e.tag,`args.${t} "${n}" is not a scene object`),r}var wE=e=>Math.atan2(e[0][2],e[2][2])*180/Math.PI,TE=.01,EE=.12,DE=.8,OE=.01,kE=.15,AE=.62,jE=[`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]]),ME=[[0,-1],[1,0],[-1,0],[Math.SQRT1_2,-Math.SQRT1_2],[-Math.SQRT1_2,-Math.SQRT1_2]];function NE(e,t,n){let r=e.index,i=e.restWorldPos,a=i[r.Hips],o=Z(n),s=e=>H([t[0],0,t[1]],Y(o,[e[0]-a[0],e[1],e[2]-a[2]])),c=(e,t,n)=>[0,.25,.5,.75,1].map(r=>[H(e,U(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]-AE,t[2]]),.045)});return jE.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 PE=e=>Object.values(e?.objects??{}).filter(e=>e.half&&e.pos&&e.R&&e.pos[1]+2*e.half[1]*e.R[1][1]>EE);function FE(e,t,n,r){let i=1/0;for(let[a,o]of NE(e,n,r))for(let e of t)i=Math.min(i,dc(a,e)-o-TE);return i}function IE(e,t,n,r){let i=PE(t);if(!i.length||FE(e,i,n,r)>=0)return null;let a=Z(r);for(let t=OE;t<=.600000001;t+=OE)for(let[o,s]of ME){let c=Y(a,[o*t,0,s*t]),l=[n[0]+c[0],n[1]+c[2]];if(FE(e,i,l,r)>=0)return{at:l.map(e=>+e.toFixed(4)),moved:+t.toFixed(2)}}return null}function LE(e,t,n,r,i=new Set){let a=PE({objects:Object.fromEntries(Object.entries(t?.objects??{}).filter(([e])=>!i.has(e)))});return a.length?FE(e,a,n,r):1/0}function RE(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 H(n.pos,Y(n.R,t.local??[0,0,0]));let r=_h(e,t.object).map(t=>e.objects[t]).filter(e=>e?.half).map(e=>H(e.pos,Y(e.R,[0,e.half[1],0])));return r.reduce((e,t)=>H(e,t.map(e=>e/r.length)),[0,0,0])}function zE(e){let{sk:t,scene:n,use:r=[],index:i=-1}=e,a=r.slice(i+1).find(e=>e?.skill===`reachGrip`),o=RE(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=K(U(c[s[`${l}ForeArm`]],d))+K(U(c[s[`${l}Hand`]],c[s[`${l}ForeArm`]]))+K(U(c[s[`${l}HandMiddle2`]],c[s[`${l}Hand`]])),p=d[1]-o[1],m=Math.max(kE,Math.sqrt(Math.max(0,(DE*f)**2-p*p))),h=e.args.heading??e.state?.yaw??0,g=Z(h),_=PE(n),v=Y(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&&FE(t,_,x,h)<0;b+=OE){let e=Y(g,[0,0,-(b+OE)]);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)}}function BE(e){let t=Av(e,1/0);return[(t.foot_l[0]+t.foot_r[0])/2,(t.foot_l[2]+t.foot_r[2])/2]}var VE=e=>Math.round(e*100)/100,HE=e=>`[${e.map(VE).join(`, `)}]`,UE=[.3,.85],WE=[.18,.85],GE=[1,1.8],KE=.47,qE=[.7,1.4],JE=.1,YE=20,XE=.5,ZE=.12,QE=1.7,$E=Math.cos(Math.PI/3),eD=.65,tD=.05,nD=e=>{let t=e.restWorldPos,n=e.index;return K(U(t[n.LeftLeg],t[n.LeftUpLeg]))+K(U(t[n.LeftFoot],t[n.LeftLeg]))};function rD(e,t){let n=e.scene,r=new Set,i=e=>{let t=n?.objects?.[e]?.ancestors?.at(-1)??e;for(let e of _h(n,t))r.add(e)};for(let t of(e.use??[]).filter((t,n)=>n!==e.index&&t?.f0>=e.f0&&t?.skill===`sitInSeat`))for(let e of[t.args?.seat,t.args?.seatBack,t.args?.car].filter(e=>typeof e==`string`))i(e);for(let[i,a]of Object.entries(e.objects??{}))if(Number.isFinite(a?.grab)&&a.grab<=t&&!(a.release<e.f0))for(let e of _h(n,i))r.add(e);return r}function iD(e,t){let n=e.R,r=t[0]-e.pos[0],i=t[1]-e.pos[2],a=n[0][0]*r+n[2][0]*i,o=n[0][2]*r+n[2][2]*i,s=Math.max(-e.half[0],Math.min(e.half[0],a)),c=Math.max(-e.half[2],Math.min(e.half[2],o)),l=[e.pos[0]+n[0][0]*s+n[0][2]*c,e.pos[2]+n[2][0]*s+n[2][2]*c];return[Math.hypot(t[0]-l[0],t[1]-l[1]),l]}function aD(e,t,n,r,i,a,o){let s=[t[0]+n[0]*r,t[1]+n[1]*r],c=nD(e.sk),l=Object.entries(e.scene?.objects??{}).filter(([e,t])=>!i.has(e)&&t.half&&t.pos&&t.R&&t.pos[1]<QE&&t.pos[1]+2*t.half[1]*t.R[1][1]>ZE).map(([e,t])=>{let[n,r]=iD(t,s);return{id:e,o:t,dist:n,q:r,low:t.pos[1]+2*t.half[1]*t.R[1][1]<eD*c}}).filter(e=>e.dist<a&&(e.dist<1e-6||(e.q[0]-s[0])*n[0]+(e.q[1]-s[1])*n[1]>=$E*e.dist)).sort((e,t)=>e.dist-t.dist);if(!l.length)return null;let u=e=>[t[0]+n[0]*e,t[1]+n[1]*e],d=new Set(Object.keys(e.scene.objects).filter(e=>!l.some(t=>t.id===e&&!t.low))),f=t=>l.some(e=>e.low&&iD(e.o,u(t))[0]<a)||l.some(e=>!e.low)&&LE(e.sk,e.scene,u(t),o,d)<tD;if(!f(r))return null;let p=r;for(;p>0&&f(p);)p-=.01;return p>.1?{t:p,at:u(p),near:l[0].id,gap:iD(l[0].o,u(p))[0]}:null}var oD=(e,t)=>Math.min(e.fit.last??1/0,...(e.use??[]).filter((t,n)=>n!==e.index&&t?.f0>e.f0).map(e=>e.f0),...e.keys.filter(e=>e.f>t&&/^keys\[/.test(e.src??``)).map(e=>e.f),...(e.fit.busy??[]).filter(e=>e>t));function sD(e,t,n,r,i){let{args:a,tag:o,sk:s}=e,c=t.steps,l=Array.isArray(a.heading)?a.heading[1]:a.heading,u=l===void 0?0:Math.abs(((l-i)%360+540)%360-180);if(u>YE)return e.fit.refusals.push(`${o}: heading ${l} points ${Math.round(u)} deg away from to ${HE(a.to)} (it lies at heading ${Math.round(i)}), so the walk would not go there; with to the walk turns toward it by itself: leave heading out, or give heading without to to walk that way`),{gen:t};let d=t.period??20,f=t.swing??14,p=t.step??.5,m=t.firstStep??.4;if(a.steps===void 0||a.arrive!==void 0||!(c>=2)||![c,d,f,p,m].every(Number.isFinite))return{gen:t};let h=[Math.sin(i*Math.PI/180),Math.cos(i*Math.PI/180)],g=!e.fit.noStop?.has(e.index)&&aD(e,n,h,r,rD(e,e.f0+16+c*d+18),XE*nD(s),i),_=g&&cD(e,t,n,h,g.t,g);return _&&!_.refuse&&e.fit.stopped?.add(e.index),(!_||_.refuse)&&(_=cD(e,t,n,h,r,null)),_.refuse&&e.fit.refusals.push(_.refuse),{gen:_.gen,..._.adjust?{adjust:_.adjust}:{}}}function cD(e,t,n,r,i,a){let{args:o,tag:s,sk:c}=e,l=t.steps,u=t.period??20,d=t.swing??14,f=t.step??.5,p=t.firstStep??.4,m=a?`${HE(a.at)}, ${VE(a.gap)} m before ${a.near} (to ${HE(o.to)} is against it)`:`to ${HE(o.to)}`,h=t=>{let i=BE(jv(t,e.keys,c,s));return{end:i,along:(i[0]-n[0])*r[0]+(i[1]-n[1])*r[1]}},{end:g,along:_}=h(t);if(Math.abs(i-_)<=.1)return{gen:t};let v=e.fps??24,y=nD(c),b=KE*y,x=l*u,S=e=>(e>=3?UE:WE).map(e=>VE(e*y)),C=Math.ceil(v/GE[1]),w=Math.floor(v/GE[0]),T=e.fit.stretch===!0&&!(e.use??[]).some((t,n)=>n!==e.index&&t?.f0>e.f0)&&!e.keys.some(t=>t.f>e.f0&&/^keys\[/.test(t.src??``)),E=_-p-(l-2)*f,D=o.firstStep===void 0?p/f:0,O=(e,t)=>{let n=t??(T||e===l?u:Math.min(Math.max(w,u),Math.floor(x/e))),r=e>=3?`step`:`firstStep`,a=e>=3?(i-E-(D?0:p))/(D+e-2):i-E,o=e>=3&&D?D*a:p,[s,c]=S(e),d=a*n/v/b,f=(e,[t,n])=>e>=t&&e<=n;return{n:e,p:n,name:r,value:a,ratio:d,ok:f(a,[s,c])&&f(o,S(2))&&(n===u||f(n,[C,w]))}},k=O(l),ee=Math.min(60,Math.ceil(i/S(3)[0])+2),A=k.ok&&k.ratio>=qE[0]&&k.ratio<=qE[1]?k:null,te,ne,re=e=>Math.abs(Math.log(e.ratio))+JE*Math.abs(e.n-l),ie=e=>e.filter(e=>e.ok).sort((e,t)=>re(e)-re(t)||e.n-t.n)[0],ae=Array.from({length:ee-1},(e,t)=>t+2);if(A||=ie(ae.map(e=>O(e))),!A&&!T&&(te=oD(e,e.f0+16+x),A=ie(ae.filter(e=>e>l).map(t=>O(t,Math.min(u,Math.floor((te-e.f0-34)/t)))).filter(e=>e.p>=C&&e.n*e.p>x))),!A){let[e,n]=S(l),r=Math.min(n,Math.max(e,k.value)),a=r*u/v/b,o=l>=3&&D?D*r:p,s={...t,[k.name]:VE(r),...l>=3&&D?{firstStep:VE(o)}:{}},c=a>=qE[0]&&a<=qE[1]&&o>=S(2)[0]&&o<=S(2)[1]?i-h(s).along:1/0;Math.abs(c)<=.1&&({pick:A,short:ne}={pick:{...k,value:VE(r),ratio:a},short:c})}let[oe,se]=S(3),ce=`a natural gait (step ${oe}..${se} m, ${GE[0]}..${GE[1]} steps a second: period ${C}..${w} at ${v} fps`,le=`${VE(Math.abs(i-_))} m ${_<i?`short of`:`past`} ${a?`the point ${HE(a.at)} clear of ${a.near} before to ${HE(o.to)}`:`to ${HE(o.to)}`} (${VE(i)} m away)`;if(!A){let n=2+Math.ceil((i-E-p)/se-1e-9),r=e.f0+16+n*C+18;return{gen:t,refuse:`${s}: steps ${l} at period ${u} (${x} frames of stepping) walk ${VE(_)} m and end at ${HE(g)}, ${le}; ${_<i?`in ${ce}) that takes ${n} steps and ${n*C} frames of stepping or more (the walk would end at f${r} or later, not f${e.f0+16+x+18}): leave steps${o.step===void 0?``:` and step`} out (walkTo picks the count), or give steps: ${n} and room for the walk before what follows`:`no natural step count ends there: leave steps out (walkTo picks the count)`}`}}let ue=A.p===u?{}:{period:A.p,swing:Math.max(2,Math.min(A.p-1,Math.round(d*A.p/u)))},de=A.n>=3&&D>0,fe=e=>({[A.name]:VE(e),...de?{firstStep:VE(D*e)}:{}}),pe={...t,steps:A.n,...ue,...fe(A.value)},me=ne??i-h(pe).along;ne===void 0&&Math.abs(me)>.02&&(pe={...pe,...fe(A.value+me/(A.n>=3?D+A.n-2:1))});let he=pe[A.name],ge=A.name===`step`?f:p,_e=e.f0+16+x+18,ve=e.f0+16+A.n*A.p+18,ye=[A.n!==l&&`steps ${l} -> ${A.n}`,ue.period&&`period ${u} -> ${ue.period} (swing ${d} -> ${ue.swing})`,`${A.name} ${ge} -> ${he} m`,de&&pe.firstStep!==p&&`firstStep ${p} -> ${pe.firstStep} m`].filter(Boolean).join(`, `),be=ve===_e?``:`; it ends f${ve}, not f${_e} (${T?`nothing follows it`:ve>_e?`nothing uses f${_e+1}-f${ve}`:`the pose holds to f${_e}`})`,xe=`steps ${l} would need a ${k.name} of ${VE(k.value)} m at ${VE(v/u)} steps a second`,Se=ne===void 0?A.n===l&&!ue.period?` (at ${A.name} ${ge} they walk ${VE(_)} of ${VE(i)} m)`:` in ${ce}; ${xe})${be}`:` (${ce}; ${xe})`,Ce=ne===void 0?`end at ${m}`:`end ${VE(Math.abs(ne))} m ${ne>0?`short of`:`past`} ${m}, the ${ne>0?`longest`:`shortest`} natural step`,we={args:{...A.n===l?{}:{steps:A.n},...ue,[A.name]:he,...de&&pe.firstStep!==p?{firstStep:pe.firstStep}:{}},note:`${s}: ${ye}, so steps ${A.n} ${Ce}${Se}`};return{gen:pe,adjust:we}}var lD=.65,uD=.75,dD=.75,fD=.025,pD=.1,mD=.08,hD=.12,gD=.4,_D=.3,vD=[.15,.3,.45,.6,.7,.8,.9],yD=e=>e*e*e*(10-15*e+6*e*e),bD=.9,xD=.7,SD=(e,t)=>{let n=Math.min(1,Math.max(0,e));return n<xD?bD*yD((n/xD)**+t):bD+.09999999999999998*yD((n-xD)/.30000000000000004)},CD=e=>[...new Map(vD.map(t=>Math.round(t*e)).filter(t=>t>0&&t<e).map(t=>[t,[SD(t/e,lD),SD(t/e,uD)]])).entries()].map(([e,[t,n]])=>[e,t,n]),wD=180/Math.PI,TD=(e,t,n)=>Math.max(t,Math.min(n,e));function ED(e,t){let n=DD(e,t),r=e.sk.index;return!!n&&n[1]>=e.sk.restWorldPos[r.LeftLeg][1]+pD}function DD(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=>OD(e,t))?null:H(n.pos,Y(n.R,t.local??[0,n.half?.[1]??0,0]))}function OD(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 kD=new WeakMap;function AD(e){if(!kD.has(e)){let t=bo(e),n=e.index;Go(e,t,`Right`,{}),kD.set(e,K(U(t.P[n.RightHandThumb4],t.P[n.RightHandIndex4])))}return kD.get(e)}function jD(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&&dc(r,e)<=.01).sort((e,t)=>dc(r,e)-dc(r,t))[0]??null}function MD(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*mD,t[1],t[2]+a/o*mD];return Object.entries(e.scene?.objects??{}).some(([e,t])=>{if(!t.half||r.has(e)||r.has(t.parent))return!1;let n=U(s,[0,hD,0]);return dc(s,t)>0&&dc(n,t)<=0})}function ND(e,t,n){let r=jD(e,t),i=DD(e,t)??(r&&H(r.pos,Y(r.R,[0,r.half[1],0])));if(!r||!i||2*Math.min(...r.half)+fD>AD(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)&&MD(e,i,n.root,a))}function PD(e,t,n){let r=DD(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])*wD-(n.yaw??0)-(n.spine_yaw??0);for(;u>180;)u-=360;for(;u<-180;)u+=360;let d=Math.atan2(-c[1],l)*wD-(n.pitch??0)-(n.spine_pitch??0);return{head_yaw:TD(dD*u,-60,60),head_pitch:TD(dD*d,-30,50)}}var FD=(e,t,n)=>e.some(e=>e.f>=t&&e.f<=n&&(e.set?.head_yaw!==void 0||e.set?.head_pitch!==void 0)),ID=(e,t)=>ll[e]?ll[e].map((e,n)=>n===2&&t===`r`?-e:e):[0,0,0];function LD(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=zE(e);t||SE(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=IE(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=Z(s),f=e=>{let t=H(u,Y(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 RD(e){let{args:t,state:n}=e;(!n.foot_l||!n.foot_r||!n.root)&&SE(e.tag,`needs a standing pose keyed before f0 (use standIdle or another skill first)`);let r={type:`walk`,f0:e.f0,...t},i,a,o;delete r.to,delete r.arrive;let s=n.yaw??0,c=t.step??.5,l=t.firstStep??.4;if(t.to){a=[(n.foot_l[0]+n.foot_r[0])/2,(n.foot_l[2]+n.foot_r[2])/2];let u=t.to[0]-a[0],d=t.to[t.to.length-1]-a[1],f=Math.hypot(u,d);for(o=Math.atan2(u,d)*180/Math.PI;o-s>180;)o-=360;for(;o-s<-180;)o+=360;r.heading=t.heading??[s,o],r.steps=t.steps??Math.max(2,2+Math.round((f-l)/c)),typeof r.heading==`number`&&(r.heading=[s,r.heading]),e.fit&&f>.1&&({gen:r,adjust:i}=sD(e,r,a,f,o))}typeof r.heading==`number`&&(r.heading=[s,r.heading]);let u=jv(r,e.keys,e.sk,e.tag),d=iE(r),f=e.frames-1,p=t.to&&BE(u),m=p?Math.hypot(p[0]-t.to[0],p[1]-t.to[t.to.length-1]):0,h={...m>.1?{placed:{at:p.map(VE),heading:Math.round(r.heading?.[1]??s),why:`ends ${VE(m)} m from to ${HE(t.to)}`}}:{},...i?{adjust:i}:{}};return d>f&&Math.max(...u.filter(e=>e.f<d).map(e=>e.f))<=f?{keys:u.filter(e=>e.f<=f),end:f,cut:`settle cut at f${f} (hold to the end)`,...h}:{keys:u,end:d,...h}}function zD(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 BD=(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 VD(e){let{args:t,state:n}=e,r=t.side,i=t.anchor;r!==`l`&&r!==`r`&&SE(e.tag,`args.side must be "l" or "r", got ${JSON.stringify(r)}`),(typeof i!=`string`||/_[lr]$/.test(i))&&SE(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??cl[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=!FD(e.keys??[],e.f0,e.f0+v)&&PD(y,t.define??e.anchors?.[i],n),x=b?{head_yaw:n.head_yaw??0,head_pitch:n.head_pitch??0}:null,S=xE(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(ED(y,C))for(let[e,t,n]of CD(a))S.at(e,{[u]:E(w,1,t),[f]:E(T,1,n)});let D=Math.round(gD*a);D>0&&D<a&&ND(y,C,n)&&S.hold(D,d),b&&S.at(Math.max(1,Math.round(_D*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:ID(c,r)}},ee=zD(e.props,`${i}Grip`,r,k),A=t.define?{[i]:t.define}:{},te=t.define??e.anchors?.[i],ne=te?.kind===`object`?te.object:te?.kind===`person`?`person:${te.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:A,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:BD(e.scene,ne).map(e=>({part:`hand`,object:e,depth:.04}))}}}var HD=[.54,.4,-.075],UD=.4,WD=1.0427487182617188,GD=new Set([`l`,`r`]);function KD(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 qD(e,t,n){let r=CE(e,`seat`,t);Math.abs(r.pos[1]-UD)>.05&&SE(e.tag,`seat "${t}" stands at y ${r.pos[1]}; the car skills are tuned for a seat base at y ${UD} (a car on the ground)`);let i=gE();i.yaw=wE(r.R),i.mirror=n===`r`;let a=U(r.pos,Y(Z(i.yaw),i.mirror?[-HD[0],HD[1],HD[2]]:HD));return i.origin=[a[0],0,a[2]],i.names={lthigh:`rthigh`,rthigh:`lthigh`},i}var JD=[[`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})),YD=e=>({A:e.restWorldPos[e.index.LeftFoot][1],H:t=>t+(e.restWorldPos[e.index.Hips][1]-WD)});function XD(e){let{args:t,sk:n}=e,r=KD(t),i=CE(e,`seat`,r.seat),{A:a}=YD(n),o=wE(i.R),s=e=>Y(Z(o),e),c=t.offset??[0,.17,.02],l=t.floor??i.pos[1],u=H(H(i.pos,Y(i.R,[0,2*i.half[1],0])),s(c)),d=e=>{let t=H(u,s([e,0,.452]));return t[1]=l+a,t},f=e=>H(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 ZD(e){let t=e.args.side??`l`;GD.has(t)||SE(e.tag,`args.side must be "l" or "r", got ${JSON.stringify(t)}`);let n=KD(e.args,t),r=qD(e,n.seat,t),i=e.args.channel??`door`;for(let[t,r]of[[`door`,n.door],[`handle`,n.handle]])CE(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=xE(e.state,e.f0,r),s={};for(let[t,n]of Object.entries(a))e.state[yE(r,t)]===void 0&&(s[t]=n);Object.keys(s).length&&o.at(0,s),QD(o,i,YD(e.sk));let c=e.scene.objects[n.door],l=(r.mirror?-1:1)*c.half[0],u={pivot:H(c.pos,Y(c.R,[l,0,c.half[2]])),axis:[0,1,0],channel:i},d=e=>r.mirror?hE(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:vE(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},...JD]},end:e.f0+246}}function QD(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,UD+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,UD+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 $D=[`cig`,`lighter`,`exhale`],eO={follow:`landmark:mouth`,aim:`face`,visible:`exhale`},tO={cig:`cigarette`,lighter:`lighter`},nO=.7,rO=[-.05,.07,.1],iO=.88,aO=.2,oO=[.245,.08,.02],sO={l:[.13,-.035,.08],r:[-.13,-.035,.08]};function cO(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 lO(e,t,n){let r=t[n];return(typeof r!=`string`||!Pl(e.scene)[r])&&SE(e.tag,`args.kit.${n} ${JSON.stringify(r)} is not a group in the scene; object.createKit { kit: "${tO[n]}" } answers its rootId`),r}var uO={cig:.03,lighter:.045},dO=.07,fO=.04;function pO(e,t){let n=e.args.kit;if(n===void 0)return null;(!n||typeof n!=`object`||Array.isArray(n))&&SE(e.tag,`args.kit must be { cig, lighter, exhale? } (kit root ids), got ${JSON.stringify(n)}`);for(let t of Object.keys(n))$D.includes(t)||SE(e.tag,`args.kit has unknown field "${t}"; fields: ${$D.join(`, `)}`);let r=lO(e,n,`cig`),i=lO(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 cO(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 cO(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]||Pl(e.scene)[n.exhale]))&&SE(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]={...eO});let o=e=>t.squat?dO:e;return{objects:a,allow:[[`thigh_r`,r,o(uO.cig)],[`thigh_l`,i,o(uO.lighter)],[`hips`,r,o(uO.cig)],[`hips`,i,o(uO.lighter)],...t.squat?[[`shin`,r,dO],[`shin`,i,dO],[`hand_l`,`thigh_l`,fO],[`hand_r`,`thigh_r`,fO],[`hand`,`hips`,fO]]:[]].map(([e,t,n])=>({part:e,object:t,depth:n}))}}function mO(e){let{sk:t,state:n}=e,r=t.index,i=t.restWorldPos;if(!(n.root[1]<nO*i[r.Hips][1]))return null;let{s:a}=mg(t,n),o=n.yaw??0,s=a.P[r.RightArm],c=e=>Y(Z(-o),U(e,n.root)),l=K(U(i[r.RightForeArm],i[r.RightArm]))+K(U(i[r.RightHand],i[r.RightForeArm])),u=H(a.P[r.RightLeg],Y(Z(o),rO)),d=K(U(u,s)),f=c(d>iO*l?H(s,W(U(u,s),iO*l/d)):u),p=H(c(wo(a,r.Head,t.landmarks.mouth)),[0,0,aO]),m=Ds(t),h=(e,r)=>{let i=H(n.root,Y(Z(o),[r*oO[0],oO[1],oO[2]]));return c(m?Ts(m.body,t,a,i,Es,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 hO={TW_M:40,FX_M:0,TW_H:0,FX_H:10,TW_L:-80,FX_L:-50},gO=15,_O=20,vO=[[`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})),yO=[.4,-1,.6],bO=[-.4,-1,-.3],xO=[.9,-.6,.3],SO=[`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`],CO=264,wO=.75,TO=Math.ceil(CO*wO),EO=e=>(e/24).toFixed(1),DO={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 OO(e){let t=e.args.until??(e.auto?e.f0+CO:e.frames-1),n=t-e.f0;n<TO&&SE(e.tag,`needs frames f${e.f0}..f${e.f0+TO} at least: 199 frames, ${EO(199)} s at 24 fps, paced ${wO} (265 frames, ${EO(265)} s, at its own pace); it has f${e.f0}..f${t}, `+(e.args.until===void 0?`so set frames >= ${e.f0+TO+1} or frames: "auto"`:`so set args.until >= ${e.f0+TO}`)),Array.isArray(e.state.root)||SE(e.tag,`needs a pose keyed before f0 (root): standing or squatting`);let r=Object.fromEntries(Object.entries(DO).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?Y(lo(a),yO):yO,c=a?Y(lo(a),bO):bO,l=mO(e),u=e.self?l?_O:gO:hO.FX_M;l&&(e.state.w_mouthOut_r=0);let d=n<CO?n/CO:1,f=e=>Math.round(e*d),p=xE(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:hO.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:hO.TW_H,wflex_r:hO.FX_H,elbow_r:c,head_pitch:o(0)})};m.hold(0,...SO),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:hO.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:hO.TW_L,wflex_l:hO.FX_L,elbow_l:xO}),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,...SO,...l?[`w_mouthOut_r`]:[]);let x=!!l&&e.self,S=pO(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||sO.l},rpocket:{kind:`body`,p:e.self&&l?.rpocket||sO.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??[],...vO]}}}var kO=9.81/576,AO=10,jO=5,MO=6,NO=14,PO=50,FO=e=>Math.min(1,Math.max(0,e)),IO=e=>{let t=FO(e);return t*t*(3-2*t)},LO=(e,t,n)=>e+(t-e)*n,RO=(e,t,n)=>e.map((e,r)=>e+(t[r]-e)*n),zO=(e,t,n,r,i)=>IO((e-t)/(n-t))-IO((e-r)/(i-r)),BO={l:1,r:-1},VO=(e,t,n)=>J(Z(e),J(lo(t),uo(n))),HO=(e,t,n,r,i)=>Y(X(pg(e,t,n)?.R??Z(e)),Y(r,i));function UO(e,t,n,r,i,a){let o=pg(e.h,n,r);if(!o)return{fyaw:e.h,fpitch:a};let s=e.toe[t],c=Y(i,Y(lo(a),s)),l=Y(X(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 WO(e){let{sk:t,args:n,state:r}=e,i=t.index,a=t.restWorldPos;(!r.foot_l||!r.foot_r||!r.root)&&SE(e.tag,`needs a standing pose keyed before f0 (use standIdle or another skill first)`);let o=n.heading??r.yaw??0,s=Z(o),c=a[i.Hips],l=ro(a[i.LeftUpLeg],a[i.LeftLeg])+ro(a[i.LeftLeg],a[i.LeftFoot]),u=ro(a[i.LeftArm],a[i.LeftForeArm])+ro(a[i.LeftForeArm],a[i.LeftHand]);return{h:o,R:s,F:Y(s,[0,0,1]),L:Y(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:U(a[i.LeftUpLeg],c),r:U(a[i.RightUpLeg],c)},shoulder:{l:U(a[i.LeftArm],c),r:U(a[i.RightArm],c)},toe:{l:U(a[i.LeftToeBase],a[i.LeftFoot]),r:U(a[i.RightToeBase],a[i.RightFoot])}}}function GO(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/kO)+Math.sqrt(2*(o+.5-.05-s)/kO))),l=(s-o+kO*c*c/2)/c,u=l-kO*c,d=o-l*jO/2,f=s+u*MO/2,p=a/(jO/2+c+MO/2),m=e.f0,h=m+AO,g=h+jO,_=g+c,v=_+MO,y=v+NO,b=e=>H(t.feet[e],W(t.F,a)),x=e=>H(t.feet[e],Y(t.R,t.toe[e])),S=e=>{let n,r;if(e<=h)n=LO(t.root[1],d,IO((e-m)/AO)),r=0;else if(e<=g){let t=e-h;n=d+l/jO*t*t/2,r=p/jO*t*t/2}else if(e<=_){let t=e-g;n=o+l*t-kO*t*t/2,r=p*jO/2+p*t}else if(e<=v){let t=e-_;n=s+u*t-u/MO*t*t/2,r=p*jO/2+p*c+p*t-p/MO*t*t/2}else n=LO(f,t.y0,IO((e-v)/NO)),r=a;return H([t.root[0],n,t.root[2]],W(t.F,r))},C=e=>i*IO((e-g+2)/(c+5)),w=e=>VO(t.h,C(e),0),T=(e,t)=>Y(X(w(e)),U(t,S(e))),E={l:T(g,I_(x(`l`),t.h,PO,t.feet.l)),r:T(g,I_(x(`r`),t.h,PO,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=VO(t.h,n,0),i=S(e),a=(e-g)/c,o=e>g&&e<_?zO(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=PO*IO((e-h)/jO),l=I_(x(c),t.h,u,t.feet[c]);else if(e<_){let e=1-IO(a/.2),n=IO((a-.72)/.28),s=H(t.hipOff[c],RO([0,-t.leg*.97,0],[BO[c]*.02,-.24,.16],o));l=H(i,Y(r,H(H(W(E[c],e),W(D[c],n)),W(s,1-e-n)))),u=LO(LO(PO,30,IO(a/.2)),0,IO((a-.7)/.3))}else l=b(c),u=0;let d=e>g&&e<_?UO(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}`]:HO(t.h,n,0,r,[BO[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 KO(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=>H(t.hipOff[e],[BO[e]*.3,-t.leg*.93,0]),hand:e=>H(t.shoulder[e],[BO[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*IO((e-o)/34):i*360,h=(e,n,r,i)=>H(n,Y(VO(t.h,0,m(e)),d[r](i))),g=VO(t.h,0,0),_=U(t.feet[u],Y(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(RO(t.root,_,IO((e-a)/12)));continue}e===o+1&&(S=v.slice());let n=U(S,Y(VO(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=RO(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=U(S,Y(VO(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=H(n,W(y[i],a)),r+=a}return W(n,1/r)}),E=e=>e<=s?T[e-a]:H(T[s-a],[0,(t.y0-T[s-a][1])*IO((e-s)/14),0]),D=(e,t,n)=>{let r=U(e,t),i=Math.hypot(...r);return i>n?H(t,W(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 RO(i,a.p,IO((r-a.a+6)/6));if(r>a.b&&r<=a.b+10){let i=Y(X(VO(t.h,0,m(a.b))),U(a.p,E(a.b))),o=H(E(r),Y(VO(t.h,0,m(r)),RO(i,d[e](n),IO((r-a.b-1)/9))));return RO(a.p,o,IO((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]})),A=[];for(let e=a;e<=c+1;e++){let n=e===c+1?0:m(e),r=VO(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=IO((e-a-1)/8);d=H(RO(t.feet[c],v,n),[0,.07*Math.sin(Math.PI*n),0])}else if(e>s)d=ee[c];else{let n=IO((e-s+4)/4);d=D(RO(O(`foot`,c,e,h(e,i,`foot`,c)),ee[c],n),H(i,Y(r,t.hipOff[c])),t.leg*.995)}let f=e>o&&e<=s?UO(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}`]:HO(t.h,0,n,r,[BO[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),H(i,Y(r,t.shoulder[c])),t.arm*.995),[`elbow_${c}`]:HO(t.h,0,n,r,[BO[c]*.4,0,-1]),[`armw_${c}`]:e<=o?0:e<=s?IO((e-o)/6):1-IO((e-s)/8)})}u.arm_rest=e<=o?LO(72,-56,IO((e-a)/12)):e<=s?-56:LO(-56,72,IO((e-s)/14)),A.push({f:e,set:u})}return{keys:A,end:c+1}}function qO(e){let t=e.args.kind??`back`;[`back`,`front`,`cartwheel`].includes(t)||SE(e.tag,`kind must be "back", "front" or "cartwheel", got ${JSON.stringify(t)}`);let n=WO(e);return t===`cartwheel`?KO(e,n):GO(e,n,t)}var JO=9.81,YO=24,XO=.75,ZO={back:.16,front:.11},QO=.25,$O=.12,ek=.25,tk=e=>e-$O*(1-Math.exp(-e/$O)),nk=(e,t,n)=>t+n*Math.log1p(Math.exp((e-t)/n)),rk=3/YO,ik=.03,ak=.25,ok=e=>{let t=Math.min(1,Math.max(0,e));return t*t*t*(t*(6*t-15)+10)},sk=e=>(e+540)%360-180,ck=e=>e.map(e=>Math.round(e*1e3)/1e3),lk=e=>Math.round(e*10)/10;function uk(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 dk(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`?Ul(r,o,`Hips`,e.f0):null;s||SE(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))&&SE(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 fk(e){let{sk:t,args:n,state:r}=e,i=t.index,a=t.restWorldPos;r.root||SE(e.tag,`needs a pose keyed before f0 (standIdle, a walk, ...)`);let o=uk(e.keys,`root`,e.f0)??r.root.slice(),s={};for(let t of[`l`,`r`]){let n=uk(e.keys,`foot_${t}`,e.f0),r=uk(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]=dk(e,o),d=n.speed??4;Number.isFinite(d)&&d>0||SE(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=Y(Z(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=sk((m?h+180:h)-c),_=m?-90:90,v=m?ZO.back:ZO.front,y=o[1],b=e=>y+f*tk(e)-.5*JO*e*e,x=e=>f*(1-Math.exp(-e/$O))-JO*e,S=0,C=(f+Math.sqrt(f*f+2*JO*Math.max(0,y-v)))/JO+1;for(let e=0;e<60;e++){let e=(S+C)/2;b(e)+x(e)*rk/2>v-ik||x(e)>0?S=e:C=e}let w=S,T=Math.min(0,x(w)),E=b(w),D=w+rk,O=d/(XO*JO),k=D+O,ee=e=>e<w?b(e):e<D?E+T*(e-w)-T/(2*rk)*(e-w)**2:v-ik*(1-ok((e-D)/ak)),A=a[i.LeftFoot][1],te=a[i.Hips][1],ne=m?1:-1,re=.9*Math.hypot(...[0,1,2].map(e=>a[i.LeftFoot][e]-a[i.Hips][e])),ie=e.f0+Math.ceil((k+.6)*YO),ae=[];for(let t=e.f0;t<=ie;t++){let n=(t-e.f0)/YO,r=n<D,i=Math.min(Math.max(0,n-D),O),a=r?d*tk(n):d*tk(D)+d*i-.5*XO*JO*i*i,f=ee(n),p=[o[0]+l*a,f,o[2]+u*a],h=Math.max(.35,.9*D),v=c+g*ok(n/Math.max(QO,h)),y=_*ok(n/h),b=(e=>Y(Z(v),Y(lo(y),e))),x=ok(n/$O)*Math.exp(-n/.18)*Math.sin(2*Math.PI*n/.55),S=ok(n/.3)*Math.exp(-n/.45)*Math.sin(2*Math.PI*n/.6),C=ok((n-D)/.3),w=-(te-A)+.06*(1-C)+(m?.03:.01)*C,T=ok(n/ek),E=A+.01+(!m&&!r&&i<O?.04:0),k=(n,r,i)=>{let a=H(p,b([r,w,i])),o=p[1]-.05;m&&(a[1]=o-.05*Math.log1p(Math.exp((o-a[1])/.05))),a[1]=nk(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]),ie(a.map((e,t)=>l[t]+(e-l[t])*T))},ie=e=>{let t=e.map((e,t)=>e-p[t]),n=Math.hypot(...t),r=re-.02*Math.log1p(Math.exp((re-n)/.02));return n>1e-9?p.map((e,i)=>e+t[i]*(1+(r/n-1)*T)):e},oe=pg(0,y,0),se=oe?Y(oe.R,[0,1,0]):[0,1,0],ce=Math.atan2(se[2],se[1])*180/Math.PI,le=Y(lo(-ce),[0,-Math.sin(y*Math.PI/180),Math.max(.05,Math.cos(y*Math.PI/180))]),ue={root:ck(p),yaw:lk(v),pitch:lk(y),roll:0,foot_l:ck(k(`l`,.11,.04+.1*S*T-(m?.1:0)*C)),foot_r:ck(k(`r`,-.11,.04-.1*S*T-(m?.1:0)*C)),fyaw_l:lk(v),fyaw_r:lk(v),fpitch_l:lk(m?-50*C:-.5*ce),fpitch_r:lk(m?-50*C:-.5*ce),knee_l:ck([.05,le[1],le[2]]),knee_r:ck([-.05,le[1],le[2]]),spine_pitch:lk(ne*22*x*Math.min(1,d/4)),spine_yaw:0,spine_roll:lk(10*S*(1-C)),head_pitch:lk(ne*30*x*Math.min(1,d/4)+(m?-8:8)*C),head_roll:lk(12*C),arm_rest:lk(72-22*C),aswing_l:lk(ne*45*S+8*C),aswing_r:lk(-ne*35*S-8*C),abend_l:lk(25+30*S*S),abend_r:lk(30+25*S*S)};t===e.f0&&Object.assign(ue,{armw_l:0,armw_r:0,fingers_l:{relaxed:1},fingers_r:{relaxed:1}}),ae.push({f:t,set:ue})}return{keys:ae,end:ie}}var pk=20,mk=50,hk=10,gk=8,_k=10,vk=8,yk=.25,bk=.42,xk=.22,Sk=.09,Ck=.25,wk=e=>e.map(e=>Math.round(e*1e3)/1e3);function Tk(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 Ek(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`&&SE(a,`args.side must be "l" or "r", got ${JSON.stringify(s)}`),(!c?.prop||e.props?.[c.prop]?.hand!==s)&&SE(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)&&SE(a,`args.to must be [x, y, z] world m (where it lands)`);let l=(t.arc===`high`?mk:pk)*Math.PI/180,u=e.fps??24,d=s===`l`?`Left`:`Right`,f=r.restWorldPos,p=H(n.root??f[r.index.Hips],Y(Z(n.yaw??0),U(f[r.index[`${d}Arm`]],f[r.index.Hips]))),m=[t.to[0]-p[0],0,t.to[2]-p[2]],h=K(m);h<.5&&SE(a,`args.to is ${h.toFixed(2)} m from the shoulder; throw it at least 0.5 m`);let g=W(m,1/h),_=H(p,H(W(g,bk),[0,xk,0])),v=H(_,W(g,Sk)),y=t.to[1]+Tk(i,o),b=K([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||SE(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(Gm*b*b/S),w=H(W(g,C*Math.cos(l)),[0,C*Math.sin(l),0]),T=(w[1]+Math.sqrt(w[1]**2+2*Gm*Math.max(0,v[1]-y)))/Gm,E=e.f0+hk+gk,D=Math.min(e.frames-1,E+Math.ceil(T*u)+vk),O=W([g[2],0,-g[0]],s===`r`?-1:1),k=`hand_${s}`,ee=`armw_${s}`,A=H(p,H(H(W(g,-.12),W(O,Ck)),[0,-.05,0])),te=H(p,H(H(W(O,.32),W(g,.12)),[0,.08,0])),ne=H(_,W(w,.45/u)),re=H(p,H(W(g,.46),[0,-.1,0])),ie=H(p,H(H(W(g,.3),W(O,-.15)),[0,-.4,0])),ae=`fingers_${s}`,oe=cl[c.grasp]??`grip`,se={...n[ae],[oe]:1},ce={...n[ae],[oe]:0},le=[{f:e.f0,set:{[ee]:n[ee]??0,[ae]:se,...n[k]?{[k]:n[k]}:{}}},{f:E,set:{[ae]:se}},{f:E+3,set:{[ae]:ce}},{f:e.f0+hk,set:{[ee]:1,[k]:wk(A)}},{f:e.f0+hk+Math.round(gk/2),set:{[ee]:1,[k]:wk(te)}},{f:E-1,set:{[ee]:1,[k]:wk(U(_,W(w,1/u)))}},{f:E,set:{[ee]:1,[k]:wk(_)}},{f:E+1,set:{[ee]:1,[k]:wk(ne)}},{f:E+3,set:{[ee]:1,[k]:wk(re)}},{f:E+_k,set:{[ee]:1,[k]:wk(ie)}}],ue=`${o}Target`;return{keys:le,end:E+_k,anchors:{[ue]:{kind:`world`,p:wk([t.to[0],y,t.to[2]])}},fills:{[o]:{release:E,fall:{at:E,v:wk(w)}}},goals:[{name:`${o} lands at the target`,near:[`object:${o}`,`anchor:${ue}`],at:D,tol:yk}],throw:{release:E,speed:Math.round(C*100)/100,v:wk(w),flight:Math.round(T*100)/100}}}var Dk=[.35,.65],Ok=.15,kk=10,Ak=20,jk=2,Mk=6,Nk=8,Pk=1,Fk=e=>e.map(e=>Math.round(e*1e3)/1e3),Ik=(e,t,n)=>Math.min(n,Math.max(t,e));function Lk(e,t,n){let r=e.restWorldPos,i=t.root??r[e.index.Hips],a=Z(t.yaw??0);return{hips:i,shoulder:H(i,Y(a,U(r[e.index[`${n}Arm`]],r[e.index.Hips]))),head:H(i,Y(a,U(r[e.index.Head],r[e.index.Hips]))),fwd:Y(a,[0,0,1])}}function Rk(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`&&SE(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)||SE(a,`args.object "${o}" must fly: objects.${o}.fall { at, v: [vx, vy, vz] }`);let d=Lk(r,n,`Right`),f={spec:{objects:{[o]:{fall:c.fall}},fps:l},scene:i,timeMap:null},p=e=>ph(f,o,e)?.pos,m=null,h=null;for(let t=u.at+1;t<e.frames;t++){let e=p(t),n=K(U(e,d.shoulder)),r=G(U(e,d.hips),d.fwd),i=Math.max(0,Dk[0]-n,n-Dk[1],Ok-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||SE(a,`${o} never comes within reach of the right hand (in front of the chest, ${Dk[0]}-${Dk[1]} m from the shoulder): nearest at f${h.f}, [${Fk(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+kk+jk),_=m.p,v=W(U(p(m.f),p(m.f-1)),l),y=K(v),b=gb({objects:e.objects},i,o),x=Ik(.08+.02*b*y,.08,.15),S=q(v),C=e=>1-(1-e)**3,w=[_,...Array.from({length:Mk},(e,t)=>H(_,W(S,x*C((t+1)/Mk)))),H(_,W(S,x*.4))],T=Math.max(e.f0,g-jk-Ak),E=s===`both`||b>Pk,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=Y(Z(n.yaw??0),[1,0,0]),k={keys:[],end:g+Mk+Nk,props:{},anchors:{},fits:[],channels:[],fills:{[o]:{prop:`${o}Catch`,grab:g,grasp:`spherical`}},catch:{contact:g,point:Fk(_),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]:W(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]}},...CD(g-jk-T).map(([e,t,r])=>({f:T+e,set:{[d(0)]:t,[a]:(n[a]??0)+(1-(n[a]??0))*r}})),{f:g-jk,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<=Mk?g+n:g+Mk+Nk;return[{f:n<=Mk?r-1:g+Mk,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:Fk(H(w[n],i))},k.fits.push({side:e,anchor:t,effector:{prop:r,point:`fingers`}}),k.channels.push(d(n))})}return k}var zk={standIdle:LD,sitInSeat:XD,exitCar:ZD,walkTo:RD,reachGrip:VD,smokeCigarette:OO,flip:qO,hitReaction:fk,throwObject:Ek,catchObject:Rk},Bk=Object.keys(zk),Vk=e=>{throw Error(`MOTION_SPEC_INVALID: ${e}`)},Hk=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function Uk(e,t,n,r){for(let[i,a]of Object.entries(t??{}))e[i]&&!Hk(e[i],a)&&Vk(`${r} defines ${n}.${i} differently from an earlier skill; rename one or define it yourself in spec.${n}`),e[i]=a}function Wk(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=>Hk(t,e))||t.push(e)}}var Gk=e=>!!e&&typeof e==`object`&&!Array.isArray(e)&&(e.range??e.search)!==void 0,Kk=e=>e.description?` (${e.description})`:``;function qk(e,t,n){return!n||t===void 0||Gk(t)?null:n.enum&&!n.enum.includes(t)?`${e} must be one of ${n.enum.map(e=>JSON.stringify(e)).join(`, `)}${Kk(n)}, got ${Q(t)}${yl(String(t),n.enum.map(String))}`:(n.type===`number`||n.type===`integer`)&&!Number.isFinite(t)?`${e} must be a number${Kk(n)}, got ${Q(t)}`:n.type===`string`&&typeof t!=`string`?`${e} must be a string${Kk(n)}, got ${Q(t)}`:n.type===`boolean`&&typeof t!=`boolean`?`${e} must be true or false${Kk(n)}, got ${Q(t)}`:n.type===`array`&&n.items?.type===`number`&&!(Array.isArray(t)&&t.length>=(n.minItems??0)&&t.every(e=>Number.isFinite(e)||Gk(e)))?`${e} must be ${n.minItems===2?`[x, z]`:n.minItems===3?`[x, y, z]`:`an array of numbers`}${Kk(n)}, got ${Q(t)}`:null}function Jk(e,t=!1){if(!Array.isArray(e.use))return[`spec.use must be an array of { skill, args, f0 }`];let n=[];return e.use.forEach((r,i)=>{if(!r||typeof r!=`object`||Array.isArray(r))return n.push(`use[${i}] must be { skill, args, f0 }, got ${Q(r)}`);if(!zk[r.skill])return n.push(`use[${i}].skill "${r.skill}" is not a skill${yl(String(r.skill),Bk)} (skills: ${Bk.join(`, `)})`);if(!t)for(let e of Object.keys(r))Bc.includes(e)||n.push(`use[${i}] has unknown field "${e}"${gl(e,Bc)}; an entry is { skill, args, f0 }`);if(r.args!==void 0&&(!r.args||typeof r.args!=`object`||Array.isArray(r.args)))n.push(`use[${i}].args must be an object, got ${JSON.stringify(r.args)}`);else if(!t){let e=cE[r.skill],t=Object.keys(e.args);for(let[a,o]of Object.entries(r.args??{}))if(!t.includes(a))n.push(`use[${i}].args.${a} is not an arg of ${r.skill}${gl(a,t)} (args: ${t.join(`, `)})`);else{let t=qk(`use[${i}].args.${a}`,o,e.args[a]);t&&n.push(t)}for(let t of e.required??[])r.args?.[t]===void 0&&n.push(`use[${i}] ${r.skill} needs args.${t}${Kk(e.args[t])}`)}(!Number.isInteger(r.f0)||r.f0<0)&&n.push(`use[${i}].f0 must be an integer frame within 0..${e.frames-1}, got ${JSON.stringify(r.f0)}`)}),n}function Yk(e,{sk:t,scene:n,lenient:r=!1,auto:i=!1,fit:a}){if(!e.use?.length)return{spec:e,used:[]};let o=Jk(e,r);o.length&&Vk(o.join(`
8
+ `));let s=(e.keys??[]).map((e,t)=>({...e,src:`keys[${t}]`})),c={anchors:{},props:{},objects:{},fits:[],checks:{},channels:[],fills:{},goals:[]},l=[],u=[];e.use.forEach((r,o)=>{let d=`use[${o}] ${r.skill}`;r.f0>e.frames-1&&Vk(`use[${o}].f0 must be an integer frame within 0..${e.frames-1}, got ${JSON.stringify(r.f0)}`);let f=[...l,...s],p={sk:t,scene:n,frames:e.frames,fps:e.fps??24,auto:i,fit:a,props:{...c.props,...e.props},self:e.fix!==!1&&e.fix?.self!==!1,f0:r.f0,args:structuredClone(r.args??{}),tag:d,keys:f,use:e.use,index:o,place:ob(e.fix).stance,state:structuredClone(Av(f,r.f0)),anchors:{...c.anchors,...e.anchors},objects:{...c.objects,...e.objects}},m=zk[r.skill](p),h=Math.max(m.end??r.f0,...m.keys.map(e=>e.f));h>e.frames-1&&Vk(`${d} needs ${h-r.f0} frames from f${r.f0} (to f${h}), past the last frame f${e.frames-1}; set frames >= ${h+1} or frames: "auto"`),l.push(...m.keys.map(e=>({...e,src:e.src??d}))),Uk(c.anchors,m.anchors,`anchors`,d),Uk(c.props,m.props,`props`,d),Uk(c.objects,m.objects,`objects`,d);for(let e of m.fits??[])c.fits.some(t=>Hk(t,e))||c.fits.push(e);for(let e of m.channels??[])c.channels.includes(e)||c.channels.push(e);Wk(c.checks,m.checks);for(let[e,t]of Object.entries(m.fills??{}))c.fills[e]={...c.fills[e],...t};c.goals.push(...m.goals??[]),u.push({skill:r.skill,f0:r.f0,end:m.end,...m.paced?{paced:m.paced}:{},...m.cut?{cut:m.cut}:{},...m.placed?{placed:m.placed}:{},...m.adjust?{adjust:m.adjust}:{}})});let d={...e,keys:[...l,...s],anchors:{...c.anchors,...e.anchors},props:{...c.props,...e.props},objects:{...c.objects,...e.objects}},f=[...new Set([...c.channels,...Array.isArray(e.channels)?e.channels:[]])];f.length&&(d.channels=f);let p=e.fits??[];d.fits=[...c.fits.filter(e=>!p.some(t=>t.side===e.side&&t.anchor===e.anchor)),...p],Wk(c.checks,e.checks),d.checks=c.checks;for(let[e,t]of Object.entries(c.fills))d.objects[e]&&(d.objects[e]={...t,...d.objects[e]});return c.goals.length&&(d.goals=[...c.goals,...e.goals??[]]),delete d.use,{spec:d,used:u}}var Xk=new Set([`f`,`f0`,`steps`,`period`,`swing`,`until`,`reach`,`hold`,`release`]),Zk=e=>e&&typeof e==`object`&&!Array.isArray(e)&&(e.range??e.search)!==void 0&&Object.keys(e).every(e=>[`range`,`search`,`int`].includes(e)),Qk=e=>e.reduce((e,t)=>typeof t==`number`?`${e}[${t}]`:e?`${e}.${t}`:t,``);function $k(e){let t=[],n=(e,r)=>{if(Zk(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: ${Qk(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??Xk.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 eA=(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 tA(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 nA=e=>e.groups.reduce((e,t)=>e+yT(t),0);function rA(e,t,n,r,i){let a=n=>r(tA(e,t,n)),o=a(n),s=e=>JSON.stringify({...e,keys:void 0,generators:void 0}),c=e=>pd(Mv(e,i),e.frames,ud(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?eA(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 iA=[2,3,5,7,11,13,17,19,23,29],aA=(e,t)=>Array.from({length:t},(t,n)=>{let r=1,i=0,a=e,o=iA[n%iA.length];for(;a>0;)r/=o,i+=a%o*r,a=Math.floor(a/o);return i});function oA(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=>eA(e,(e.lo+e.hi)/2)),c=rA(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(tA(e,t,a));f=nA(TT(n,Hb({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)=>eA(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)=>aA(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]=eA(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:tA(e,t,d.values),search:{values:Object.fromEntries(t.map((e,t)=>[Qk(e.path),d.values[t]])),evals:u,cost:Math.round(d.cost*100)/100,window:c,ms:Math.round(performance.now()-a)}}}var sA=2e4;function cA(e){let t=structuredClone(e);for(let n of $k(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 lA(e,{sk:t,scene:n,lenient:r=!1}={}){if(e?.frames!==`auto`)return e;let{spec:i,used:a}=Yk({...cA(e),frames:sA},{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)?iE(e):null):[]];return{...e,frames:Math.max(0,...o.filter(Number.isFinite))+1}}var uA=new WeakSet;function dA(e){return uA.add(e),e}var fA=e=>Array.isArray(e)?`[${e.map(fA).join(`,`)}]`:e&&typeof e==`object`?`{${Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${JSON.stringify(t)}:${fA(e[t])}`).join(`,`)}}`:JSON.stringify(e)??`null`;function pA(e){let t=14695981039346656037n;for(let n of new TextEncoder().encode(fA(e)))t=BigInt.asUintN(64,(t^BigInt(n))*1099511628211n);return`spec-${t.toString(16).padStart(16,`0`).slice(0,12)}`}function mA(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=pA(e),i=t.get(n);return r(n,{...i,spec:structuredClone(e),framesAuto:uA.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 hA=12,gA=4,_A=3,vA=5e-4,yA=e=>Math.round(e*1e3)/1e3,bA=e=>Math.round(e*10)/10,xA=e=>e.map(yA);function SA(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,hA)}function CA(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?ff(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]<Wf.plantH&&Math.abs(e[t][1]-o[t][1])<vA&&Math.hypot(e[t][0]-o[t][0],e[t][2]-o[t][2])<=Wf.slide);r[t][n+i]=+!!s})}return r}function wA(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>=_A&&r.push([i,a-1]),i=null)}if(r.length<=gA)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 TA(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=vh(t,i-1),a=vh(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 EA(e,t,n,r){for(let[t,i]of Object.entries(e.objects??{}))if(e.props?.[i?.prop]?.hand===n&&vh(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 DA(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:xA(i.P[o.Hips]),yaw:bA(a.yaw??0),hand_l:xA(i.P[o.LeftHand]),hand_r:xA(i.P[o.RightHand]),on_l:EA(t,a,`l`,n),on_r:EA(t,a,`r`,n)}}function OA(e,{used:t,spec:n}){let r=SA(e,t??[],n);if(!r.length)return[];let i=CA(e),a=TA(e,n);return r.map(t=>({...t,end:DA(e,n,t.f[1]),planted:{l:wA(i.l,t.f),r:wA(i.r,t.f)},events:a.filter(e=>e.f>=t.f[0]&&e.f<=t.f[1])}))}var kA=e=>`[${e[0]},${e[1]}]`,AA=(e,t)=>{e&&!e.includes(t)&&e.push(t)};function jA(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 MA(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=jA(e.at,n);!i||i[0]===e.at[0]&&i[1]===e.at[1]||(AA(t,`goals[${r}]${e.name?` "${e.name}"`:``} at ${kA(e.at)} -> ${kA(i)}: the clip is 0..${n}`),e.at=i)})}var NA=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},PA=e=>e&&(e.rot!==void 0||e.aim!==void 0),FA=e=>e&&typeof e==`object`&&!Array.isArray(e)&&!PA(e)&&e.roll===void 0&&e.lean===void 0;function IA(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})=>FA(e));if(!a.length)return;let o=n?.objects?.[e]??Pl(n??{})[e],s=o?hg(t)?{aim:[o.R[0][1],o.R[1][1],o.R[2][1]].map(e=>Math.round(e*1e4)/1e4)}:{rot:ho(o.R)}:null,c=i.filter(e=>PA(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,NA(n.k)),l.push(t)):s&&(Object.assign(e,s),u.push(t))}l.length&&AA(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&&AA(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 LA(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),AA(n,`objects.${e}.keys[${r}].rot had length ${i.toFixed(3)}: normalized`))})}var RA=e=>e.map(e=>Math.round(e*1e3)/1e3);function zA(e,t){Array.isArray(e.keys)&&e.keys.forEach((n,r)=>{for(let i of[`knee_l`,`knee_r`]){let a=n?.set?.[i];if(!(Array.isArray(a)&&a.length===3&&a.every(Number.isFinite)))continue;let o=Math.hypot(...a);if(!(o>1e-6&&a[2]<-.7*o))continue;let s=Av(e.keys,n.f).yaw;if(!(Number.isFinite(s)&&Math.abs((s%360+540)%360-180)>=90))continue;let c=RA(Y(Z(-s),a));c[2]<.7*o||(n.set[i]=c,AA(t,`corrected: ${n.src?.startsWith(`keys[`)?n.src:`keys[${r}]`} (f${n.f}) ${i} [${RA(a)}] is a world direction at root yaw ${Math.round(s)}: body frame [${c}] (a pole is +z forward)`))}})}function BA(e,t,n){Array.isArray(e.goals)&&e.goals.forEach((r,i)=>{for(let a of[`near`,`above`])(Array.isArray(r?.[a])?r[a]:[]).forEach((o,s)=>{if(typeof o!=`string`||/^[a-z]+:/.test(o))return;let c=Du(e,t,o);c.length===1&&(r[a][s]=c[0],AA(n,`corrected: goals[${i}].${a}[${s}] "${o}" -> "${c[0]}"`))})})}function VA(e,t,n,r){if(!e||typeof e!=`object`)return e;MA(e,n),BA(e,{sk:r,scene:t},n),zA(e,n);for(let[r,i]of Object.entries(e.objects??{}))!i||typeof i!=`object`||!Array.isArray(i.keys)||!(hg(i)||Ym(i))||(IA(r,i,t,n),LA(r,i,n));return e}function HA(e,t,n,r){let i=Number.isInteger(e)?[e,e]:e,a=jA(i,t);return a&&(a[0]!==i[0]||a[1]!==i[1])&&AA(r,`${n}.frames ${kA(i)} -> ${kA(a)}: the take is 0..${t}`),a}function UA(e,t,n,r,i){if(Math.ceil(t/e)<=n)return e;let a=Math.ceil(t/n);return AA(i,`${r}.every ${e} -> ${a}: a position probe answers at most ${n} rows`),a}function WA(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 GA={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 KA(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=GA[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 qA=16,JA=16,YA=12,XA=`{ name, distance: [refA, refB] | position: ref, frames: [f0, f1], every }`,ZA=e=>Math.round(e*1e6)/1e6,QA=e=>Math.round(e*1e4)/1e4;function $A(e,t){let n=/^(joint|bone):(.+)$/s.exec(t);return n?`${n[1]}:${El(e,n[2]).bone??n[2]}`:t}function ej(e,t,n,r,i){let a=e.frames===void 0?[0,n]:HA(e.frames,n,t,i);return a||r(`${t}.frames must be [f0, f1], integer frames within 0..${n} with f0 <= f1, got ${Q(e.frames)}`),a}function tj(e,t,{spec:n,sk:r,scene:i,notes:a}){let o=[],s=e=>{o.length<YA&&o.push(e)},c=e.frameCount-1,l=[],u=new Map;if(Array.isArray(t)?t.length>qA?s(`probes has ${t.length} entries; at most ${qA} per compile`):t.forEach((e,t)=>{let o=`probes[${t}]`;if(!e||typeof e!=`object`||Array.isArray(e))return s(`${o} must be ${XA}`);for(let t of Object.keys(e))Zc.includes(t)||s(`${o} has unknown field "${t}"${yl(t,Zc)}; a probe is ${XA}`);let d=e.name??o;if(typeof d!=`string`||!d?s(`${o}.name must be a non-empty string, got ${Q(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 ${Q(e.distance)}`);if(f===`position`&&typeof e.position!=`string`)return s(`${o}.position must be a point ref, got ${Q(e.position)}`);let m=p.map((e,t)=>ku(n,s,{sk:r,scene:i},f===`distance`?`${o}.distance[${t}]`:`${o}.position`,e)).every(Boolean),h=ej(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 ${Q(e.every)}`);if(!m||!h)return;let g=h[1]-h[0]+1,_=e.every??(f===`position`?Math.ceil(g/JA):1),v=f===`position`?UA(_,g,JA,o,a):_;l.push({name:d,kind:f,refs:p.map(e=>$A(r,e)),range:h,every:v})}):s(`probes must be an array of ${XA}`),o.length)throw Error(`MOTION_SPEC_INVALID: ${o.join(`
9
+ `)}${o.length>=YA?`
10
+ (more problems not listed)`:``}`);return l}function nj([e,t],n){let r=[];for(let i=e;i<=t;i+=n)r.push(i);return r}function rj(e,t){let n=nj(t.range,t.every).map(n=>[n,Eu(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:ZA(r[1]),minAt:r[0],max:ZA(i[1]),maxAt:i[0],mean:ZA(a/n.length),first:ZA(n[0][1]),last:ZA(n[n.length-1][1])}}function ij(e,t){return{at:nj(t.range,t.every).map(n=>{let r=Tu(e,n,t.refs[0]);return{f:n,p:r?r.map(QA):null}})}}function aj(e,t,n){return Object.fromEntries(tj(e,t,n).map(t=>[t.name,t.kind===`distance`?rj(e,t):ij(e,t)]))}var oj=.3,sj=2,cj=[`Thumb4`,`Index4`,`Middle4`,`Ring4`,`Pinky4`],lj=e=>Math.round(e*1e3)/1e3,uj=`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 dj(e,t){let n=e.index,r={};for(let[i,a]of[[`Left`,`l`],[`Right`,`r`]]){let o=W(H(t.P[n[`${i}Hand`]],t.P[n[`${i}HandMiddle1`]]),.5);r[`hand_${a}`]=[o,...cj.map(e=>t.P[n[`${i}Hand${e}`]]).filter(Boolean)],r[`foot_${a}`]=Object.values(gc(e,t,i))}return r}var fj=(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 pj(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=>gg(r.objects?.[e]))||fj(e,a,t))continue;let s=Fh(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:Ph(e,a,t),box:c,c:H(c.pos,Y(c.R,[0,o.half[1],0])),r:K(o.half)})}return i}function mj(e,t,n){let r=W(e.reduce((e,t)=>H(e,t),[0,0,0]),1/e.length),i=Math.max(...e.map(e=>ro(e,r))),a=null;for(let o of t){if(n&&o.hand===n||ro(r,o.c)-o.r-i>(a?a[2]:oj))continue;let t=Math.min(...e.map(e=>dc(e,o.box)));t<=oj&&(!a||t<a[2])&&(a=[o.root,o.id,t])}return a}function hj(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,sj).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:[lj(r[0]),r[1],lj(r[2]),r[3]]}))}function gj(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=pj(t,a+n),s=dj(e,i);for(let e of Object.keys(r))r[e].push(mj(s[e],o,e.startsWith(`hand_`)?e.slice(-1):null))});let i=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,hj(t,n)]).filter(([,e])=>e.length));return Object.keys(i).length?i:null}var _j=[`Hips`,`Spine`,`Spine2`,`Head`,`LeftArm`,`RightArm`,`LeftForeArm`,`RightForeArm`,`LeftHand`,`RightHand`,`LeftUpLeg`,`RightUpLeg`,`LeftLeg`,`RightLeg`,`LeftFoot`,`RightFoot`],vj=.25,yj=3,bj=.2,xj=4,Sj=.6,Cj=3,wj=.15,Tj=4,Ej=.7,Dj=4,Oj=20,kj=.25,Aj=.005,jj=48,Mj=.9,Nj=15,Pj=1e-4,Fj=e=>Math.round(e*100)/100,Ij=`life (warnings, not QA): [share or s, worst f0, f1]; keys [gap cv, even channels, half-second share]; jerk [p95 m/s^3, joint, spikes]`,Lj=e=>{let t=[...e].sort((e,t)=>e-t);return t.length?t[Math.min(t.length-1,Math.floor(.95*t.length))]:0},Rj=e=>{let t=e.reduce((e,t)=>e+t,0)/e.length,n=e.reduce((e,n)=>e+(n-t)**2,0)/e.length;return t>0?Math.sqrt(n)/t:0};function zj(e,t){let n=e.length,r=e.reduce((e,t)=>e+t,0)/n,i=t.reduce((e,t)=>e+t,0)/n,a=0,o=0,s=0;for(let c=0;c<n;c++)a+=(e[c]-r)*(t[c]-i),o+=(e[c]-r)**2,s+=(t[c]-i)**2;return o>0&&s>0?a/Math.sqrt(o*s):0}function Bj(e,t){let n=e.index,r=t.length,i=180/Math.PI;return _j.map(a=>{let o=n[a],s=a===`Hips`?-1:e.parent[o],c=new Float64Array(r),l=new Float64Array(9),u=new Float64Array(9);for(let e=0;e<r;e++){let{R:n,P:r}=t[e].s,a=n[o],d=s<0?null:n[s];for(let e=0;e<3;e++)for(let t=0;t<3;t++)l[e*3+t]=d?d[0][e]*a[0][t]+d[1][e]*a[1][t]+d[2][e]*a[2][t]:a[e][t];if(e){let n=0;for(let e=0;e<9;e++)n+=l[e]*u[e];let a=Math.acos(Math.max(-1,Math.min(1,(n-1)/2)))*i,d=t[e-1].s.P[o];c[e]=s<0?Math.max(a,Math.hypot(r[o][0]-d[0],r[o][1]-d[1],r[o][2]-d[2])*100):a}[l,u]=[u,l]}return c})}function Vj(e,t){let n=[],r=-1,i=0;for(let a=1;a<t;a++)e.some(e=>e[a]>vj)?(r<0&&(r=a),i=0):r>=0&&++i>=yj&&(n.push([r,a-i]),r=-1,i=0);return r>=0&&n.push([r,t-1-i]),n.filter(([e,t])=>t-e>=3)}function Hj(e,t,n){let r=[[],[]];e.forEach((e,i)=>{let a=[...e].filter(e=>e>vj).sort((e,t)=>e-t),o=Math.max(vj,bj*(a[Math.floor(.9*a.length)]??0)),s=t=>e[t]>o;for(let e=1;e<n;e++)if(!t[e]){if(s(e)&&!s(e-1)){let t=1;for(;t<=yj&&e-t>=0&&!s(e-t);)t++;(t>yj||e-t<0)&&r[0].push([e,i])}if(!s(e)&&s(e-1)){let t=0;for(;t<yj&&e+t<n&&!s(e+t);)t++;t>=yj&&e+t<n&&r[1].push([e-1,i])}}});let i=0,a=0,o=null;for(let e of r){e.sort((e,t)=>e[0]-t[0]);for(let t=0;t<e.length;){let n=t+1;for(;n<e.length&&e[n][0]-e[n-1][0]<=Cj;)n++;let r=e.slice(t,n),s=new Set(r.map(e=>e[1])).size;if(t=n,s<xj)continue;let c=0,l=r[0][0];for(let e=0,t=0;t<r.length;t++){for(;r[t][0]-r[e][0]>2;)e++;let n=new Set(r.slice(e,t+1).map(e=>e[1])).size;n>c&&(c=n,l=r[e][0])}i++,c>=Math.max(xj,Math.ceil(Sj*s))&&a++,(!o||c/s>o.share||c/s===o.share&&c>o.k)&&(o={share:c/s,k:c,of:s,at:[l,l+2]})}}return{score:i?Fj(a/i):0,total:i,worst:o}}function Uj(e,t){let n=new Map,r=new Set;for(let t of e??[])if(Number.isFinite(t?.f)){r.add(t.f);for(let e of Object.keys(t.set??{}))(n.get(e)??n.set(e,new Set).get(e)).add(t.f)}let i=e=>{let t=[...e].sort((e,t)=>e-t);return t.slice(1).map((e,n)=>e-t[n])},a=[...n].filter(([,e])=>e.size>=Tj),o=a.filter(([,e])=>Rj(i(e))<wj).map(([e])=>e),s=[...r].filter(e=>e>0),c=Math.round(t/2);return{cv:r.size>=Tj?Fj(Rj(i(r))):null,grid:o,eligible:a.length,halfSec:s.length>=Tj?Fj(s.filter(e=>e%c===0).length/s.length):null}}function Wj(e,t,n,r){let i=r**3,a=[0,null],o=null,s=new Set;for(let r of _j){let c=t.map(t=>t.s.P[e.index[r]]),l=new Float64Array(t.length),u=[];for(let e=3;e<t.length;e++){let t=t=>c[e][t]-3*c[e-1][t]+3*c[e-2][t]-c[e-3][t];l[e]=Math.hypot(t(0),t(1),t(2))*i,n[e]&&u.push(l[e])}let d=Lj(u);d>a[0]&&(a=[Fj(d),r]);for(let e=3;e<t.length;e++){if(l[e]<=Math.max(Oj,Dj*d))continue;s.add(e);let t=l[e]/Math.max(d,1e-9);(!o||t>o.ratio)&&(o={ratio:t,f:e,j:r})}}return{p95:a,spikes:s.size,worst:o}}function Gj(e,t,n,r){let i=e.index,a=t.P,o=U(a[i.Spine2],a[i.Hips]),s=(e,t)=>Math.acos(Math.max(-1,Math.min(1,(e[0]*t[0]+e[1]*t[1]+e[2]*t[2])/Math.max(1e-9,K(e)*K(t)))))*180/Math.PI,[c,l,u]=r?[`${n}Arm`,`${n}ForeArm`,`${n}Hand`]:[`${n}UpLeg`,`${n}Leg`,`${n}Foot`],d=U(a[i[l]],a[i[c]]);return[s(d,U(a[i[u]],a[i[l]])),s(d,r?o:[-o[0],-o[1],-o[2]])]}function Kj(e,t,n){let r={};for(let[i,a]of[[`arms`,!0],[`legs`,!1]]){let o=t.map(({s:t})=>Gj(e,t,`Left`,a)),s=t.map(({s:t})=>Gj(e,t,`Right`,a)),c=0,l=0,u=null;for(let e=1;e+jj<=t.length;e+=jj/4){if(n.slice(e,e+jj).some(Boolean))continue;let t=[],r=[];for(let n=e;n<e+jj;n++)for(let e=0;e<2;e++)t.push(o[n][e]-o[n-1][e]),r.push(s[n][e]-s[n-1][e]);let i=e=>e.reduce((e,t)=>e+Math.abs(t),0);if(i(t)<Nj||i(r)<Nj)continue;let a=zj(t,r);c++,a>Mj&&l++,(!u||a>u.c)&&(u={c:a,at:[e,e+jj-1]})}r[i]={score:c?Fj(l/c):0,windows:c,worst:u}}return r}function qj(e,t,n,r){let i=new Uint8Array(t.length);for(let e of n.goals??[]){let n=Array.isArray(e?.at)?e.at:null;if(e?.still!==void 0&&n?.length)for(let e=Math.max(0,Math.round(n[0]));e<=Math.min(t.length-1,Math.round(n[n.length-1]));e++)i[e]=1}let a=null,o=0;for(let n=1,s=-1;n<=t.length;n++){if(n<t.length&&!i[n]&&e.names.every((e,r)=>K(U(t[n].s.P[r],t[n-1].s.P[r]))<Pj)){s<0&&(s=n);continue}s>=0&&n-s>=r&&(o+=n-s,(!a||n-s>a[1]-a[0]+1)&&(a=[s,n-1])),s=-1}return{frames:o,best:a}}function Jj(e,t,n){let r=t.frames,i=r.length,a=t.fps??24,o=t.f0??0,s=t.ctx.spec,c=e.index,l=[],u=Bj(e,r),d=Vj(u,i),f=new Uint8Array(i);for(let[e,t]of d)f.fill(1,e,t+1);let p=new Uint8Array(i),m=jj/2;for(let e=1;e<i;e++){let t=r[e].s.P[c.Hips],n=r[e-1].s.P[c.Hips];Math.hypot(t[0]-n[0],t[2]-n[2])*a>kj&&p.fill(1,Math.max(0,e-m),Math.min(i,e+m))}let h=p.slice();for(let e=1;e<i;e++)[`LeftFoot`,`RightFoot`].every(t=>K(U(r[e].s.P[c[t]],r[e-1].s.P[c[t]]))>Aj)&&h.fill(1,Math.max(0,e-m),Math.min(i,e+m));let g=Hj(u,p,i),_=Uj(n,a),v=Wj(e,r,f,a),y=Kj(e,r,h),b=qj(e,r,s,a),x=([e,t])=>`f${e+o}-${t+o}`;g.total>=2&&g.score>=.5&&l.push([g.score,`sync`,`${g.worst.k} of ${g.worst.of} parts start or stop together ${x(g.worst.at)}: lead with pelvis or a hand, spine/head/arms 2-4 frames later`]),(_.cv!==null&&_.cv<wj||_.eligible&&_.grid.length/_.eligible>=.5||(_.halfSec??0)>=Ej)&&l.push([.9,`keys`,`keys on a grid: key the extremes (contact, peak, turn), vary the gaps`]),v.worst&&v.worst.ratio>8&&l.push([.6,`jerk`,`${v.worst.j} jerks ${Math.round(v.worst.ratio)}x at f${v.worst.f+o}: a key snaps; ease or move it`]);for(let[e,t]of Object.entries(y))t.windows>=2&&t.score>=.4&&l.push([t.score,e,`${e} mirror ${x(t.worst.at)}: ${e===`legs`?`weight onto one foot, not straight down`:`offset one side 2-4 frames or pose it apart`}`]);b.best&&l.push([.7,`dead`,`dead still ${x(b.best)}${s.idle===!1?` (idle false)`:``}: let idle run or key a settle`]),l.sort((e,t)=>t[0]-e[0]);let S=(e,t)=>t?[e,t[0]+o,t[1]+o]:[e];return{sync:S(g.score,g.worst?.at),keys:[_.cv,_.grid.length,_.halfSec],jerk:[...v.p95,v.spikes],arms:S(y.arms.score,y.arms.worst?.at),legs:S(y.legs.score,y.legs.worst?.at),dead:S(Fj(b.frames/a),b.best),...l.length?{flags:l.map(e=>e[1]),warn:l[0][2]}:{}}}var Yj=9.7,Xj=.25,Zj=.75,Qj=.88,$j=.5,eM=22,tM=24,nM=Array.from({length:16},(e,t)=>9+t),rM=[`steps`,`period`,`step`,`swing`],iM=new Set([`POP`,`REACH`,`SLIDE`,`FLOAT`,`FLIP`,`KNEE`]),aM=new Map,oM=e=>Math.round(e*100)/100,sM=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)&&!rM.some(t=>e.args[t]!==void 0)&&Object.values(e.args).every(e=>!(e&&typeof e==`object`&&!Array.isArray(e))));function cM(e,t){if(t===2)return e>=Xj&&e<=Zj?{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>=Xj&&r<=Zj?{first:n,step:r}:null}function lM(e,t,n){let r=[];for(let i of nM)for(let a=2;a<=40;a++){let o=cM(e,a);if(!o)continue;let s=t+16+a*i+18,c=o.step*tM/i,l=Math.abs(Math.log(o.step*i/Yj)),u=Math.max(0,n-s)/Math.max(1,n-t);r.push({args:{steps:a,period:i,swing:Math.round(Qj*i),step:oM(o.step),firstStep:oM(o.first)},end:s,v:c,late:s>n,score:l+1.5*u+Math.max(0,$j-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 uM(e,t){let{steps:n,period:r}=e.args,i=Math.round(.8*r),a=n>2&&e.args.firstStep<.62?{firstStep:.62,step:oM((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>=Xj&&e.args.step<=Zj)}var dM=(e,t,n)=>e.groups.filter(e=>iM.has(e.kind)&&e.last>=t&&e.first<=n).reduce((e,t)=>e+t.count,0);function fM(e,{sk:t,scene:n,trial:r}){let i=[];for(let{i:a,u:o}of sM(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(aM.has(s)){i.push(aM.get(s));continue}let c=e.use.slice(0,a).filter(e=>e.f0<o.f0),l,u=[];try{let{spec:r,used:i}=Yk({...e,frames:2e4,use:c},{sk:t,scene:n,lenient:!0});l=Av(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}=lM(p,o.f0,o.args.arrive),g=t=>{let n=Math.max(t.end,...u)+1;return{schema:e.schema,fps:e.fps??tM,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=>uM(e,p))].slice(0,18);for(let e of[...x,...h.slice(0,eM-x.length)]){let t;try{t=dM(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`:``} (${oM(_.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 ${oM(p)} m (a step every ${nM[0]} frames, strides up to ${Zj} 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)`};aM.size>=64&&aM.delete(aM.keys().next().value),aM.set(s,O),i.push(O)}return i}function pM(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 mM=8,hM=6,gM=8,_M=.05,vM=5,yM=e=>`[${e.map($).join(`, `)}]`,bM=e=>`${Math.round(e*1e3)/10}`,xM=e=>(e%360+540)%360-180,SM={top:` (box top)`,base:` (box base)`,center:` (box centre)`,rim:` (opening)`};function CM(e,t){let n=/^object:.+?(?:\.(center|top|base|rim))?$/s.exec(e);return n?`${e}${n[1]?SM[n[1]]:t?` (surface)`:SM.center}`:e}function wM(e,t){let n=e.frames[t-(e.f0??0)];if(!n)return null;let{P:r}=n.s,i=e.ctx.sk.index,a=r[i.LeftFoot],o=r[i.RightFoot];return{at:[(a[0]+o[0])/2,(a[2]+o[2])/2],yaw:n.c?.yaw??0}}function TM(e,t,n,r,i){let a=e.frameCount-1,o=e=>Math.max(0,Math.min(a,Math.round(i(e)))),s=o(t.f0),c=o(t.end??t.f0),l=wM(e,c),u=r?.args??{};if(!l)return null;let d=u.side?` ${u.side}`:``,f=u.anchor?` ${u.anchor}`:``,p=`use[${n}] ${t.skill}${d}${f} f${s}-${c}: at ${yM(l.at)} yaw ${Math.round(xM(l.yaw))}`,m=Array.isArray(u.heading)?u.heading[u.heading.length-1]:u.heading;typeof m==`number`&&Math.abs(xM(l.yaw-m))>vM&&(p+=` (asked ${m})`);let h=Array.isArray(u.to)?[u.to[0],u.to[u.to.length-1]]:Array.isArray(u.at)&&!t.placed?u.at:null;if(h){let t=[l.at[0]-h[0],l.at[1]-h[1]],n=Math.hypot(...t);if(n>_M){let r=u.to&&wM(e,s),i=r&&Math.hypot(h[0]-r.at[0],h[1]-r.at[1])>1e-6?[h[0]-r.at[0],h[1]-r.at[1]].map((e,t,n)=>e/Math.hypot(...n)):null,a=i?t[0]*i[0]+t[1]*i[1]:null,o=i?Math.abs(t[0]*i[1]-t[1]*i[0]):null,c=i?`${$(Math.abs(a))} m ${a<0?`short`:`past`}${o>_M?`, ${$(o)} m aside`:``}`:`${$(n)} m off`;p+=`; ${u.to?`to`:`at`} ${yM(h)}: ${c}${u.to&&u.steps!==void 0?`, args.steps set the distance (to only aims)`:``}`}}return p}function EM(e,t){let n=e.f0??0,r=null,i=null,a=null,o=null;for(let s=0;s<e.frames.length;s++){if(!dS(e,s,t.when))continue;a??=s+n,o=s+n;let c=pS(e,s,t);c!==null&&((!r||c<r[0])&&(r=[c,s+n]),(!i||c>i[0])&&(i=[c,s+n]))}return a===null?`${t.name}: never on${typeof t.when==`string`?` (${t.when} never > 0.99)`:``}`:`${t.name} f${a}-${o}: gap ${r?`${bM(r[0])} cm f${r[1]} .. ${bM(i[0])} cm f${i[1]}`:`unknown`} (tol ${bM(t.tol??.01)})`}function DM(e,t,n,r){let i=lx(t)[0];if(!r||r.at===null||!(i===`near`||i===`above`||!r.ok&&(i===`moved`||i===`still`)))return null;let a=(i===`near`||i===`above`?t[i]:[px(t[i].includes(`:`)?t[i]:`object:${t[i]}`)]).map(t=>[t,Tu(e,r.at,t)]);if(a.some(([,e])=>!e))return null;let o=`goal ${ux(t,n)} f${r.at}: ${a.map(([e,t])=>`${CM(e,i===`near`)} ${yM(t)}`).join(`, `)}`;if(i===`near`&&Array.isArray(t.at)&&t.at[0]!==t.at[1]&&(t.mode??`all`)===`all`){let n=e.f0??0,i=null;for(let r=Math.max(t.at[0],n);r<=Math.min(t.at[1],n+e.frames.length-1);r++){let n=Eu(e,r,t.near[0],t.near[1]);n!==null&&(!i||n<i[0])&&(i=[n,r])}i&&i[1]!==r.at&&(o+=`; best ${$(i[0])} f${i[1]}`)}return o}function OM(e,{used:t=[],use:n=[],checks:r={},goals:i=[],results:a=[]}){let o=e.timeMap??(e=>e),s=new Map(a.map(e=>[e.name,e])),c=[...t.slice(0,mM).map((t,r)=>TM(e,t,r,n[r],o)),...(r.contacts??[]).slice(0,hM).map(t=>EM(e,t)),...i.map((t,n)=>DM(e,t,n,s.get(ux(t,n)))).filter(Boolean).slice(0,gM)].filter(Boolean);return c.length?c:null}var kM=e=>!!e&&typeof e==`object`&&!Array.isArray(e),AM=e=>String(e).toLowerCase().replace(/[\s_-]/g,``),jM=e=>String(e).replace(/[_-]?(left|Left|LEFT)$/,`_l`).replace(/[_-]?(right|Right|RIGHT)$/,`_r`).replace(/[_-]?L$/,`_l`).replace(/[_-]?R$/,`_r`),MM={arm_swing:`aswing`,armswing:`aswing`,elbow_bend:`abend`,arm_bend:`abend`,wrist_twist:`wtwist`,wrist_flex:`wflex`,foot_yaw:`fyaw`,foot_pitch:`fpitch`,arm_weight:`armw`,ik_weight:`armw`,hips:`root`,pelvis:`root`,finger:`fingers`,hand_pole:`elbow`,knee_pole:`knee`},NM={objectKey:{position:`pos`,rotation:`rot`,quat:`rot`,quaternion:`rot`,frame:`f`},anchor:{pos:`p`,position:`p`,point:`p`,id:`object`,joint:`bone`},use:{frame:`f0`,f:`f0`}};function PM(e,t,n={}){if(t.includes(e))return e;let r=n[e]??n[AM(e)];if(r&&t.includes(r))return r;let i=new Set(t.filter(t=>AM(t)===AM(e)||t===`${e}s`||`${t}s`===e));return i.size===1?[...i][0]:null}function FM(e,t,n,r,i){if(!kM(e))return e;let a=e;for(let o of Object.keys(e)){let e=t.includes(o)?null:PM(o,t,i);!e||e in a||(a=Object.fromEntries(Object.entries(a).map(([t,n])=>t===o?[e,n]:[t,n])),r.push(`corrected: ${n}.${o} -> ${n}.${e}`))}return a}var IM=(e,t)=>Array.isArray(e)?e.map(t):e,LM=e=>kM(e)&&(e.to!==void 0||e.arrive!==void 0||typeof e.heading==`number`||PM(String(e.type),[`walkTo`])===`walkTo`);function RM(e,t){if(!Array.isArray(e.generators)||!e.generators.some(LM))return e;let n=Array.isArray(e.use)?[...e.use]:[],r=[];e.generators.forEach((e,i)=>{if(!LM(e))return r.push(e);let{type:a,f0:o,...s}=e,c=n.findIndex(e=>kM(e)&&Number.isFinite(e.f0)&&e.f0>o),l=c<0?n.length:c;n.splice(l,0,{skill:`walkTo`,f0:o,args:s});let u=e.to===void 0?e.arrive===void 0?typeof e.heading==`number`?`a single heading`:`type "${a}"`:`arrive`:`to`;t.push(`corrected: generators[${i}] (a walk with ${u}) -> use[${l}] walkTo { ${Object.keys(s).join(`, `)} }: a generator walks by steps and [h0, h1]; walkTo is the walk that heads for a point`)});let{generators:i,...a}=e;return{...a,...r.length?{generators:r}:{},use:n}}function zM(e,t,n){if(!kM(e))return e;let r=e,i=Bk.includes(e.skill)?e.skill:PM(String(e.skill),Bk);i&&i!==e.skill&&(r={...r,skill:i},n.push(`corrected: use[${t}].skill "${e.skill}" -> "${i}"`));let a=cE[r.skill];if(!a)return r;let o=Object.keys(a.args);if(kM(r.args)||r.args===void 0){let e=r.args??{},i=FM(e,o,`use[${t}].args`,n);for(let[e,r]of Object.entries(i)){let o=a.args[e]?.enum,s=o&&typeof r==`string`&&!o.includes(r)?PM(r,o,{left:`l`,right:`r`}):null;s&&(i={...i,[e]:s},n.push(`corrected: use[${t}].args.${e} "${r}" -> "${s}"`))}if(i.f0!==void 0&&!o.includes(`f0`)&&r.f0===void 0){let{f0:e,...a}=i;i=a,r={...r,f0:e},n.push(`corrected: use[${t}].args.f0 -> use[${t}].f0`)}for(let e of Object.keys(r)){let a=Bc.includes(e)?null:PM(e,o);!a||a in i||(i={...i,[a]:r[e]},r=Object.fromEntries(Object.entries(r).filter(([t])=>t!==e)),n.push(`corrected: use[${t}].${e} -> use[${t}].args.${a}`))}if(kM(i.define)&&Vc[i.define.kind]){let e=FM(i.define,[`kind`,...Vc[i.define.kind]],`use[${t}].args.define`,n,NM.anchor);e!==i.define&&(i={...i,define:e})}i!==e&&(r={...r,args:i})}return FM(r,Bc,`use[${t}]`,n,NM.use)}var BM=e=>[...tl,...rl,...il,...eS(e)];function VM(e,t){let n=jM(e),r=/_[lr]$/.exec(n)?.[0]??``,i=r?n.slice(0,-2):n,a=MM[i]??MM[AM(i)];return a&&t.includes(a+r)?a+r:PM(n,t)}function HM(e,t,n,r){if(!kM(e)||!kM(e.set))return e;let i=e.set,a=e.step;for(let o of Object.keys(e.set)){if(n.includes(o)||o.endsWith(`_vis`)||o.startsWith(`w_`))continue;let s=VM(o,n);!s||s in i||(i=Object.fromEntries(Object.entries(i).map(([e,t])=>e===o?[s,t]:[e,t])),Array.isArray(a)&&(a=a.map(e=>e===o?s:e)),r.push(`corrected: keys[${t}] (f${e.f}) channel "${o}" -> "${s}"`))}for(let n of[`l`,`r`]){let a=i[`fingers_${n}`];if(!kM(a))continue;let o=FM(a,ol,`keys[${t}] (f${e.f}) fingers_${n}`,r);o!==a&&(i={...i,[`fingers_${n}`]:o})}return i===e.set?e:{...e,set:i,...a?{step:a}:{}}}function UM(e,t,n){if(!kM(t))return t;let r=Object.keys(t).filter(e=>[`free`,`carry`,`hinge`,`follow`,`switch`].includes(e)&&kM(t[e]));if(r.length!==1)return t;let{[r[0]]:i,...a}=t;return Object.keys(i).some(e=>e in a)?t:(n.push(`corrected: objects.${e}.${r[0]} { ${Object.keys(i).join(`, `)} } -> objects.${e} { ${Object.keys(i).join(`, `)} }: an entry's kind is read from its fields, not named`),{...a,...i})}function WM(e,t,n){let r=`objects.${e}`,i=UM(e,t,n);if(!kM(i))return i;let a=FM(i,[...new Set(Object.values(Wc).flat())],r,n);return Array.isArray(a.keys)&&(a={...a,keys:a.keys.map((e,t)=>FM(e,Kc,`${r}.keys[${t}]`,n,NM.objectKey))}),kM(a.fall)?a={...a,fall:FM(a.fall,Gc,`${r}.fall`,n)}:Array.isArray(a.fall)&&(a={...a,fall:a.fall.map((e,t)=>FM(e,Gc,`${r}.fall[${t}]`,n))}),a}var GM=(e,t,n)=>FM(e,Xc,`goals[${t}]`,n);function KM(e,t){return kM(e)?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,kM(n)&&Vc[n.kind]?FM(n,[`kind`,...Vc[n.kind]],`anchors.${e}`,t,NM.anchor):n])):e}function qM(e,t){return kM(e)?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,Yc[e]?IM(n,(n,r)=>FM(n,Yc[e],`checks.${e}[${r}]`,t)):n])):e}function JM(e,t=[]){if(!kM(e))return e;let n=t.length,r=FM(e,[...Rc,`probes`],`spec`,t);if(r=RM(r,t),Array.isArray(r.use)&&(r={...r,use:r.use.map((e,n)=>zM(e,n,t))}),r.anchors&&(r={...r,anchors:KM(r.anchors,t)}),Array.isArray(r.keys)){let e=BM(r);r={...r,keys:r.keys.map((n,r)=>HM(n,r,e,t))}}return kM(r.objects)&&(r={...r,objects:Object.fromEntries(Object.entries(r.objects).map(([e,n])=>[e,WM(e,n,t)]))}),Array.isArray(r.goals)&&(r={...r,goals:r.goals.map((e,n)=>GM(e,n,t))}),Array.isArray(r.fits)&&(r={...r,fits:r.fits.map((e,n)=>FM(e,Uc,`fits[${n}]`,t))}),r.checks&&(r={...r,checks:qM(r.checks,t)}),t.length>n?r:e}function YM(e,{sk:t,scene:n}={},r=[],i=[]){if(!kM(e)||!Array.isArray(e.use)||!e.use.some(e=>e?.skill===`walkTo`&&kM(e.args)&&e.args.to!==void 0))return e;let a=Object.values(kM(e.objects)?e.objects:{}).flatMap(e=>kM(e)?[e.grab,e.release,...Array.isArray(e.keys)?e.keys.map(e=>e?.f):[]]:[]).filter(Number.isFinite),o=r=>{let i={refusals:[],stretch:e.frames===`auto`,busy:a,last:Number.isFinite(e.frames)?e.frames-1:1/0,noStop:r,stopped:new Set};try{return{used:Yk({...e,frames:2e4},{sk:t,scene:n,fit:i,auto:!0}).used,fit:i}}catch{return null}},s=o(new Set);if(!s)return e;if(s.fit.stopped.size){let e=new Set(s.fit.stopped),t=o(e);if(t&&t.fit.refusals.length<s.fit.refusals.length){for(let n of[...s.fit.stopped].sort((e,t)=>e-t)){e.delete(n);let r=o(e);(!r||r.fit.refusals.length>t.fit.refusals.length)&&e.add(n)}s=o(e)??t}}let{used:c,fit:l}=s;if(i.push(...l.refusals),!c.some(e=>e.adjust))return e;for(let e of c)e.adjust&&r.push(`corrected: ${e.adjust.note}`);return{...e,use:e.use.map((e,t)=>c[t]?.adjust?{...e,args:{...e.args,...c[t].adjust.args}}:e)}}var XM=(e,t,n,r)=>YM(JM(e,n),t,n,r),ZM=e=>e?.groups??[],QM=e=>ZM(e).reduce((e,t)=>e+(t.severity??0),0),$M=e=>(e?.goals??[]).filter(e=>e.ok).map(e=>e.name),eN=e=>(e?.goals??[]).filter(e=>!e.ok).length,tN=.5,nN=e=>Math.round(e*100)/100;function rN(e){let t=new Map;for(let n of ZM(e))t.set(ST(n),(t.get(ST(n))??0)+(n.severity??0));return t}function iN(e,t){let n=rN(t),r=rN(e),i=0,a=0,o=[];for(let[e,t]of r){let r=n.get(e)??0;t>r+1e-9?(i+=t-r,o.push({key:e,severity:[nN(r),nN(t)]})):a+=r-t}for(let[e,t]of n)r.has(e)||(a+=t);o.sort((e,t)=>t.severity[1]-t.severity[0]-(e.severity[1]-e.severity[0]));let s=[nN(QM(t)),nN(QM(e))],c=[ZM(t).length,ZM(e).length],l=$M(t).filter(t=>!$M(e).includes(t)),u=QM(e)<QM(t)-1e-9?eN(e)>eN(t)||l.length?`goal ${l.length?`"${l[0]}" no longer holds`:`failures rose`}`:c[1]>c[0]?`problems ${c[0]} -> ${c[1]}`:i>tN*a+1e-9?`${o[0]?.key} got worse (${o[0]?.severity.join(` -> `)})`:``:`summed severity ${s[0]} -> ${s[1]}`;return{better:!u,why:u,sev:s,problems:c,worse:o.slice(0,3)}}var aN=(e,t)=>(ZM(e).length<ZM(t).length||ZM(e).length===ZM(t).length&&QM(e)<=QM(t)+1e-9)&&eN(e)<=eN(t)&&$M(t).every(t=>$M(e).includes(t)),oN=(e,t)=>ZM(e).filter(e=>ST(e)===t).reduce((e,t)=>e+(t.severity??0),0),sN=e=>Math.round(performance.now()-e);function cN(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 lN(e,t,n,r){let i=r(e),a=e.timeMap?cN(t,e.timeMap):t;if(!e.fixed?.retime)return{out:e,measured:a,qa:i};let o=n({...t,fix:{...t.fix,retime:!1}}),s=r(o);if(aN(i,s))return{out:e,measured:a,qa:i};let c=iN(i,s);return o.fixed={...o.fixed,retime:{...e.fixed.retime,kept:!1,how:`${e.fixed.retime.how}; not kept: QA was worse with it (summed severity ${c.sev[0]} -> ${c.sev[1]}, problems ${c.problems[0]} -> ${c.problems[1]}), so the take is compiled without it`}},{out:o,measured:t,qa:s}}function uN(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return{spec:e,probes:t};let n=Lx(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 dN(e,{sk:t,scene:n},r={}){let i=[],a=[];try{return fN(r.lenient?e:XM(e,{sk:t,scene:n},i,a),{sk:t,scene:n},r,i,a)}catch(e){throw a.length&&/^MOTION_SPEC_INVALID/.test(e.message)&&!e.message.includes(a[0])&&(e.message=e.message.replace(/^MOTION_SPEC_INVALID: /,`MOTION_SPEC_INVALID: ${a.join(`
11
+ `)}\n`)),i.length&&/^MOTION_SPEC_INVALID/.test(e.message)&&(e.message+=`\n(adjusted before these checks: ${i.join(`; `)})`),e}}function fN(e,{sk:t,scene:n},r,i,a){let{spec:o,probes:s}=uN(e,r.probes),c=performance.now(),l={sk:t,scene:n,lenient:r.lenient===!0,problems:a},u=r.checks&&DT({checks:r.checks}).checks,d=[],f=e=>{let{spec:r,used:a}=Yk(DT(pM(e,d)),l),o=VA(JSON.parse(JSON.stringify(u?{...r,checks:u}:r)),n,i,t);return sS(o,l),{full:o,used:a}};d=fM(o,{sk:t,scene:n,trial:e=>{let n=f(e).full;return TT(t,Hb({fps:24,...n},l),n,{explain:!1})}});let p=o?.frames===`auto`&&d.length?{...o,frames:lA(pM(o,d),l).frames}:lA(o,l),m=$k(p),h=p,g=null;m.length&&({spec:h,search:g}=oA(p,m,l,e=>f(e).full)),o?.frames===`auto`&&dA(h);let _=performance.now(),{full:v,used:y}=f(h),{out:b,measured:x,qa:S}=lN(Hb({fps:24,...v},l),v,e=>Hb({fps:24,...e},l),e=>TT(t,e,e.timeMap?cN(v,e.timeMap):v,{userSpec:h})),C=sN(_),w=performance.now(),T=Pf(t,b,x.checks),E=CS(b);E&&Object.assign(T,{units:`${T.units}; ${SS}`,held:E});let D=gj(t,b),O=sC(t,b);D&&Object.assign(T,{units:`${T.units}; ${uj}`,near:D}),O&&Object.assign(T,{units:`${T.units}; ${aC}`,wrist:O});let k=jb(t,b);k&&Object.assign(T,{units:`${T.units}; ${wb}`,load:k}),Object.assign(T,{units:`${T.units}; ${Ij}`,life:Jj(t,b,h?.keys)});let ee=y.filter(e=>e.paced).map(e=>`${e.skill} paced ${e.paced.toFixed(2)} to fit f${e.f0}..f${e.end}`);ee.length&&(T.paced=ee);let A=y.filter(e=>e.cut).map(e=>`${e.skill}: ${e.cut}`);A.length&&(T.cut=A);let te=y.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&&(T.placed=te),d.length&&(T.planned=d.map(e=>e.note));let ne=OM(b,{used:y,use:h?.use,checks:x.checks,goals:x.goals,results:S.goals});ne&&(T.asked=ne);let re=OA(b,{used:y,spec:v}),ie=s&&aj(b,s,{spec:v,sk:t,scene:n,notes:i});return{out:b,qa:S,observations:T,spec:h,expanded:v,used:y,fixed:b.fixed,search:g,timeline:re,...ie?{probes:ie}:{},...i.length?{notes:i}:{},ms:{compile:C,qa:sN(w),total:sN(c)}}}var pN=`cozyclay.take.v3`;function mN(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=Z(-(n.yaw??0));for(let r=0;r<i;r++){let i=t.frames[r].s,{quats:l,hips:u}=So(e,{P:i.P.map(e=>Y(c,U(e,n.position))),R:i.R.map(e=>J(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=hg(n),a=gg(n),o=r||a,s=!_g(n),c=s?new Float32Array(i*3):null,d=s?new Float32Array(i*4):null,f=o||!s||Ym(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?xh(t,n):[0,0],v=r&&Oh(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=Mh(t,e,r+u);i&&(c.set(i.pos,r*3),d.set(ho(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:pN,fps:t.fps,frameCount:i,rig:e.model,bones:e.names.slice(),rot:o,hips:s,objects:l,placement:n,...r}}function hN(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 gN=`modulepreload`,_N=function(e){return`/`+e},vN={},yN=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=_N(t,n),t=s(t),t in vN)return;vN[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`:gN,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)})},bN=Object.freeze([`keys`,`follow`,`rail`]),xN=Object.freeze({distance:3,height:1.6,response:.7,lead:.25,railStartMode:`head`,maxDollySpeed:4,pitchOffsetDeg:0,orbitOffsetDeg:0});function SN(e){return Array.isArray(e)?e.map(e=>({x:e.x,z:e.z})):null}function CN(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 wN(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 TN(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 EN(e,t){let n=t?TN(e.aim):null,r=t&&Number.isFinite(e.focalMm)&&e.focalMm>0?e.focalMm:null;return{...n?{aim:n}:{},...r?{focalMm:r}:{}}}function DN(e={}){let t=e&&typeof e==`object`?e:{},n=bN.includes(t.mode)?t.mode:`keys`,r={...xN,...t.followCam??{}},i=SN(t.cameraRail),a=CN(t.craneHeight)??(n===`rail`&&i?{points:[{t:0,height:r.height},{t:1,height:r.height}]}:null),o=gr(t.dollyTiming);return{mode:n,followCam:r,cameraRail:i,railFollow:wN(t.railFollow),craneHeight:a,dollyTiming:hr(o)?null:o,...EN(t,i)}}function ON(e){return DN(e)}function kN(e,t={}){let n=DN(e),r=t&&typeof t==`object`?t:{};return DN({...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 AN(e){let t=DN(e);return kN(t,{mode:t.mode===`rail`?`follow`:t.mode,cameraRail:null,railFollow:null,craneHeight:null})}var jN=[`begin`,`mark`,`rollback`,`finish`,`cancel`],MN=(e,t)=>Object.fromEntries(jN.map(n=>[`agent.turn.${n}`,e({turnId:t})]));function NN(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 $e(`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 PN=e=>e&&{point:e.session?.savepoint()??null,affectedIds:new Set(e.affectedIds),since:e.mark&&new Set(e.mark.since),mark:e.mark};function FN(e,t,n){return e&&t&&n?.ok&&n.authored&&(e.edits??=[]).push({...t,receiptId:n.receiptId,ids:n.affectedIds}),n}function IN(e,t,n,r,i){let a=e.edits??[],o=a.findIndex(e=>e.receiptId===t.receiptId);if(o<0)throw new $e(`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 $e(`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 LN=new Set([`timeline`,`scene`]),RN=Object.freeze([`placement`,`take`,`ik`,`props`]),zN=RegExp(`^(?:(?:object|character|shot):[A-Za-z0-9][A-Za-z0-9._:-]*|stage|timeline|scene)$`),BN=e=>typeof e==`string`&&e.length<=140&&zN.test(e),VN=/^character:(.+?)(?::(placement|take|ik|props))?$/s;function HN(e){let t=VN.exec(e);return t?{id:t[1],layer:t[2]??null}:null}var UN=(e,t=RN)=>t.map(t=>`character:${e}:${t}`),WN=e=>[...new Set(e.flatMap(e=>{let t=HN(e);return t&&!t.layer?UN(t.id):[e]}))];function GN(e,t){if(e===t)return!0;let n=HN(e),r=HN(t);return!!(n&&r&&n.id===r.id&&(!n.layer||!r.layer))}var KN=[`cast.replace`,`cast.setCustomPoses`,`cast.showExtras`,`cast.removePose`,`objects.replace`,`shot.replace`,`ai.prepareShot`],qN=[`shot.create`,`shot.createStill`,`shot.split`,`shot.duplicate`,`shot.remove`,`shot.reorder`,`shot.setRange`,`shot.setTimeline`],JN=[`object.add`,`object.createKit`,`asset.import`,`character.add`],YN=/^(character\.|characters?\b|cast\.(savePose|setLayer)$|ik\.|motion\.)/,XN={"character.move":[`placement`],"characters.arrange":[`placement`],"cast.setLayer":[`take`],"motion.set":[`take`],"motion.compile":[`take`,`ik`],"motion.clear":[`take`,`ik`],"motion.keyObject":[`take`,`ik`,`props`],"object.attach":[`props`],...Object.fromEntries([`addWaypoint`,`moveWaypoint`,`removeWaypoint`,`clearWaypoints`].map(e=>[`character.${e}`,[`take`]])),...Object.fromEntries([`cut`,`setSegmentSpeed`,`removeSegment`,`trim`,`resetTiming`].map(e=>[`motion.${e}`,[`take`,`ik`]])),...Object.fromEntries([`character.setIkKey`,`character.removeIkKey`,`character.clearIkKeys`,`ik.setKey`,`ik.removeKey`,`ik.clearKeys`,`ik.applyPose`,`motion.rangePin.apply`,`motion.rangePin.remove`].map(e=>[e,[`ik`]]))},ZN={layer:`take`,motionTake:`take`,waypoints:`take`,ikEdits:`ik`,ikKeys:`ik`,model:null},QN=e=>e.some(e=>ZN[e]===null)?RN:[...new Set(e.map(e=>ZN[e]??`placement`))],$N=e=>e.clearMotion?[`placement`,`take`,`ik`]:[`placement`];function eP(e,t){return XN[e]?XN[e]:e===`character.update`?QN(Object.keys(t.patch??{})):e===`character.set`?QN(Object.keys(t.set??{})):e===`character.setPose`||e===`cast.savePose`?$N(t):RN}function tP(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 nP=(e,t)=>e.flatMap(e=>e.op===`create`?[]:e.op===`group`?tP([e.parentId,...e.childIds],t):e.op===`ungroup`?tP(e.childIds,t):tP([e.id],t));function rP(e,t={},n={},r={}){if(r.kind===`document`||/^(scene|project)\./.test(e)||e===`load_scenes`||KN.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)||JN.includes(e))return[];if(e===`objects.batch`)return[...new Set(t.ops.flatMap(e=>rP(e.name,e.args,n)))];if(e===`objects.arrange`)return[...new Set(nP(t.ops,n))];if(e===`characters.arrange`)return t.ops.flatMap(t=>t.op===`create`?[]:UN(t.characterId,eP(e,t)));if((e===`character.set`||e===`motion.set`)&&t.ops)return[...new Set(t.ops.flatMap(t=>UN(t.id,eP(e,t))))];if(e.startsWith(`stage.`)||e===`shot.setLens`)return[`stage`];if(qN.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`?tP([t.parent,...t.children],n):e===`object.ungroup`?tP(t.children,n):e===`object.remove`?tP(t.ids,n):e===`object.attach`||e===`motion.keyObject`?[...UN(t.characterId,eP(e,t)),...tP([t.objectId],n)]:e.startsWith(`object.`)?tP([t.id??t.objectId],n):YN.test(e)&&(t.characterId??t.id)?UN(t.characterId??t.id,eP(e,t)):[`scene`]}function iP(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 aP(e,t,n){for(let r of n.values()){if(r.taskId===e)continue;let n=t.find(e=>LN.has(e)||[...r.keys].some(t=>LN.has(t)||GN(e,t)));if(n)return`${n} is held by task ${r.taskId}${r.title?` (${r.title})`:``}`}return null}var oP=(e,t)=>{throw new $e(e,t)},sP=[`begin`,`requestScope`,`mark`,`rollback`,`finish`,`cancel`,`undo`],cP=32,lP=e=>[...e].slice(0,6).join(`, `)+(e.length>6?` and ${e.length-6} more`:``);function uP({ports:e,emit:t}){let n=new Map,r=new Map,i=new Map,a=t=>{let n=HN(t);if(n?.layer)return e.readLayer?.(t)??e.readTarget?.(n.id)??`absent`;let[r,i]=t.split(/:(.*)/s);if(i!==void 0)return e.readTarget?.(i)??`absent`;let a=e.read();return r===`scene`?`r${a.revision}`:`${r}:${a.domainRevisions?.[r===`timeline`?`shot`:r]??0}`},o=t=>({key:t,value:e.snapshotTarget?e.snapshotTarget(t):oP(`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||oP(`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})=>HN(t)?.id??(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=>!BN(e));r!==void 0&&oP(`INVALID_ARGUMENT`,`"${r}" is not a scope key: object:<id>, character:<id> (or one layer: character:<id>:placement, :take, :ik, :props), shot:<id>, stage, timeline or scene.`);let i=WN(t),o=aP(e.taskId,i,n);o&&oP(`SCOPE_BUSY`,`${o}; wait for it, or ask for what is free.`);for(let t of i)e.keys.has(t)||(e.keys.add(t),e.tokens.set(t,a(t)))}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): ${lP(n.skipped)}.`}]),n.skipped=null,Nn({ok:!0,status:`completed`,kind:`transaction`,commandId:r.commandId,receiptId:crypto.randomUUID(),host:i.host,action:t,txId:n.taskId,authored:!!a,revision:{before:i.revision,after:l.revision},affectedIds:a&&!o.length?n.restored:o,delta:[],checks:{coverage:`task-scope`},warnings:c,undo:a?{historyEntryId:a,entries:1,canUndoDirect:!1}:null,output:{scope:[...n.keys],...s}})}let u=(e,t)=>{(e.origin!==`agent`||e.taskId!==t)&&oP(`CAPABILITY_MISSING`,`Only the owning task can control it.`)};return{get size(){return n.size},controls:(e,t)=>Object.fromEntries(sP.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.`)&&oP(`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)??oP(`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&&oP(`UNDO_CONFLICT`,`Changed since the task finished: ${lP(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&&oP(`TARGET_BUSY`,p),(n.has(i.taskId)||r.has(i.taskId))&&oP(`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)??oP(`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??oP(`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>cP;)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?rP(r.id,i,c,r):[];if(!e&&s.origin===`ui`){for(let e of n.values()){let n=l.filter(t=>[...e.keys].some(e=>GN(t,e)));n.length&&t?.({type:`task.userEdit`,taskId:e.taskId,keys:n})}return null}if(!e){let e=l.find(e=>aP(null,[e],n));return e&&oP(`SCOPE_BUSY`,`${aP(null,[e],n)}; this command waits for that task.`),null}let u=l.filter(t=>!e.keys.has(t));u.length&&oP(`SCOPE_DENIED`,`Outside this task's scope: ${lP(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));oP(`STALE_TARGET`,`${lP(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,fence:new Map(l.map(e=>[e,a(e)]))}},moved:e=>[...e.fence].filter(([e,t])=>a(e)!==t).map(([e])=>e),rebase(e){for(let t of e.fence.keys())e.fence.set(t,a(t))},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=iP(e,c);if(!(!t||[...s.keys].some(e=>GN(t,e)))){if(aP(s.taskId,[t],n)){l.push({code:`SCOPE_DENIED`,message:`${t} changed outside the task's scope.`});continue}for(let e of WN([t]))s.keys.add(e),u=!0,r.keys.includes(e)||(s.pre.set(e,{key:e,value:void 0}),r.values.push({key:e,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&&oP(`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&&oP(`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&&oP(`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 dP=(e,t)=>JSON.stringify(e)===JSON.stringify(t),fP=(e,t)=>{throw new $e(e,t)},pP=(e,t,n)=>e?.then?e.then(t,n):t(e),mP=e=>e.slice(-12).map(e=>({code:`STUDIO_TOAST`,message:[...e.message].slice(0,120).join(``)})),hP=0;function gP({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=uP({ports:t,emit:e=>f(e)});function d(n,r,i){if(i.origin===`ui`)return;if(n.exposure===`ui-only`&&fP(`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(dP(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||!dP(a.args,r)||!dP(a.host,t.read().host)||a.expires<(t.now??Date.now)())&&fP(`CONFIRMATION_REQUIRED`,n.confirmationReason??`This command needs user confirmation.`),o.delete(i.confirmationToken)}let f=e=>{for(let t of a)t(e);t.emit?.(e)},p=En.TargetGuard.properties.targetId,m=e=>({type:`object`,properties:e,required:Object.keys(e),additionalProperties:!1}),h={type:`object`,properties:{},required:[],additionalProperties:!0},g={...MN(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 $e(`CANCELLED`,`Transaction was cancelled.`)){r.delete(e.txId),_(e.timer),e.workTimer!==void 0&&_(e.workTimer),e.controller.abort(i),e.session.cancel({restore:dP(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)&&fP(`CAPABILITY_MISSING`,`Only the owning agent turn can control this transaction.`),n===`agent.turn.begin`)return(l||r.size||u.size)&&fP(`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&&fP(`STALE_TARGET`,`The agent turn is no longer open.`);let e=l;if(n===`agent.turn.mark`||n===`agent.turn.rollback`)return x(n,NN(n,e),o,c);if(n===`agent.turn.cancel`)return l=null,e.session?.cancel(),x(n,e,o,c);try{e.historyEntryId=e.session?.commit().historyEntryId}catch(t){throw e.session?.cancel(),t}finally{l=null}return x(n,e,o,e.before)}let f=n===`edit.undo`||n===`edit.redo`,p=f&&u.traversal(n,a,o,c,n===`edit.undo`?t.history?.(!1):null);if(p)return p;if(l&&!n.startsWith(`job.`)&&!(f&&!l.session)){if(n===`edit.undo`&&o.turnId===l.txId)return Nn(IN(l,a,o,c,()=>t.read()));fP(`TARGET_BUSY`,`Finish the agent turn before traversing history or opening another transaction.`)}if(f){let e=n===`edit.redo`,r=t.history?.(e),i=a.receiptId?t.receipt(a.receiptId):s.get(r)??(r?{receiptId:r,host:c.host,affectedIds:[c.host.sceneId],undo:{historyEntryId:r,entries:1,canUndoDirect:!0}}:null);if(!a.receiptId&&!i)return Nn({ok:!0,status:`noop`,action:n,commandId:o.commandId,receiptId:crypto.randomUUID(),host:c.host,authored:!1,mutated:!1,revision:{before:c.revision,after:c.revision},affectedIds:[],delta:[],checks:{coverage:`native-history-restoration`},undo:null,warnings:[]});(!i?.undo||!t.isRetained(i))&&fP(`UNDO_EXPIRED`,`The receipt no longer has a retained history entry.`),dP(i.host,c.host)||fP(`STALE_SCENE`,`The receipt belongs to another document.`),(e?r!==i.undo.historyEntryId:!t.canUndo(i))&&fP(`UNDO_CONFLICT`,`Another edit owns the history boundary.`),(e?t.redo:t.undo)();let l=t.read(),u=i.affectedIds,d=u.map(e=>({...c.host,targetId:e,token:t.readTarget?.(e)??`removed-${crypto.randomUUID()}`}));return Nn({ok:!0,status:e?`applied`:`undone`,commandId:o.commandId,receiptId:crypto.randomUUID(),host:c.host,authored:!0,revision:{before:c.revision,after:l.revision},affectedIds:u,delta:u.slice(0,8).map(e=>({id:e,after:{token:d.find(t=>t.targetId===e).token}})),checks:{coverage:`native-history-restoration`},undo:{...i.undo,canUndoDirect:e},warnings:[],...e?{action:n,mutated:!0}:{undoneReceiptId:i.receiptId,restoredTargets:d},...u.length>8?{detailCursor:o.commandId}:{}})}if(n.startsWith(`job.`)){let e=i.get(a.jobId);(!e||!dP(e.host,c.host))&&fP(`STALE_TARGET`,`Job is not in this document.`),n===`job.cancel`&&!e.outcome&&e.controller.abort(new $e(`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 $e(`TIMEOUT`,`Job is still running.`)),a.timeoutMs)})]):e.completion).then(t=>Nn({...t,commandId:o.commandId,...t.ok?{receiptId:crypto.randomUUID()}:{},jobId:e.id})).finally(()=>{r!==void 0&&_(r)})}let m;if(n===`run.begin`){r.size&&fP(`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`&&fP(`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||!dP(m.before.host,c.host))&&fP(`STALE_TARGET`,`Transaction is no longer open in this document.`),o.origin!==m.origin&&fP(`TARGET_BUSY`,`This transaction belongs to another origin.`),m.updating&&n!==`run.cancel`&&fP(`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&&fP(`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)||!dP(m.before.host,t.read().host))&&fP(`STALE_TARGET`,`Transaction is no longer current.`)}},d=e=>{l?.(),_(m.workTimer),m.updating=!1,u.check(),s.length&&t.read().revision===c.revision&&fP(`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 $e)&&s.length&&t.read().revision===c.revision&&(e=new $e(`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 $e(`TIMEOUT`,`${m.entry.id} exceeded its deadline.`)),m.entry.timeoutMs??3e4);let n=m.session.run(()=>e.invoke(m.entry,i.args,u));if(!n?.then)return d(n);let r=new Promise((e,t)=>m.controller.signal.addEventListener(`abort`,()=>t(m.controller.signal.reason),{once:!0}));return Promise.race([n,r]).then(d,f)}catch(e){return f(e)}}if(n===`run.cancel`&&v(m),n===`run.commit`){r.delete(m.txId),_(m.timer);try{m.historyEntryId=m.session.commit().historyEntryId}catch(e){throw m.session.cancel({restore:!1}),e}}}return x(n,m,o,n===`run.commit`?m.before:c)}function x(e,n,r,i){let a=t.read();return Nn({ok:!0,status:`completed`,kind:`transaction`,commandId:r.commandId,receiptId:crypto.randomUUID(),host:i.host,action:e,txId:n.txId,authored:!!n.historyEntryId,revision:{before:i.revision,after:a.revision},affectedIds:[...n.affectedIds],delta:[],checks:{coverage:`wire-transaction`},warnings:mP(n.toasts),undo:n.historyEntryId?{historyEntryId:n.historyEntryId,entries:1,canUndoDirect:!0}:null})}function S(e,n,r,i){let a=i??t.read().revision!==n.revision;return Nn({ok:!1,commandId:e.commandId,host:n.host,code:c(r),phase:a?`commit`:`admission`,affectedIds:[],expectedTargets:[],currentTargets:[],mutated:a,preserved:{authoredState:a?`changed`:`unchanged`},recovery:{action:`inspect`,retryAllowed:!1},message:[...String(r.message||r)].slice(0,2e3).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,...mP(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&&fP(`UNCERTAIN_APPLY`,`${e.id} changed the scene without one undoable entry.`);let d=e.kind===`job`||e.kind===`document`||e.kind===`mutation`&&l&&(s||c.revision>r.revision+1),f=d||l?i.affectedIds:e.kind===`transient`?[r.host.sceneId]:[];if(s&&l)for(let e of f)s.affectedIds.add(e),s.mark?.since.add(e);let p=a=>Nn({ok:!0,commandId:n.commandId,receiptId:crypto.randomUUID(),host:r.host,action:e.id,summary:i.summary,status:d?`completed`:e.kind===`transient`?`transient`:l?`applied`:`noop`,authored:l,...d?{kind:e.kind,...i.output===void 0?{}:{output:i.output},...dP(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&&!dP(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,A=new AbortController,te=()=>{E!==void 0&&_(E),D!==void 0&&_(D)},ne=[],re=()=>ne.length&&t.read().revision===m.revision?new $e(`TARGET_NOT_READY`,ne.at(-1).message):null,ie=e=>{if(O?.background){let t=O.completionCommandId??=crypto.randomUUID();h.begin(t),e=Nn({...e,commandId:t,jobId:O.id})}let n=h.record(e);n.undo?.canUndoDirect&&!a.startsWith(`edit.`)&&s.set(n.undo.historyEntryId,n);for(let[e,n]of s)t.isRetained?.(n)===!1&&s.delete(e);return t.remember?.(n),n},ae=e=>{te(),T?.(),T=null,e instanceof $e||(e=re()??e),p.origin===`ui`&&e.uiMessage&&t.showRefusal?.(e.uiMessage);let n=S(p,m,e,O?k:void 0),r=C?ie(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`&&!dP(On(p.host),m.host)&&fP(`STALE_SCENE`,`The live document changed.`),p.turnId&&!v&&a!==`agent.turn.begin`&&fP(`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 $e(`UNCERTAIN_APPLY`,`Command is still executing.`));C=!0;let{entry:c,args:l}=g[a]?{args:Dn(g[a],o)}:e.prepare(a,o);if(p.origin!==`ui`&&(!y&&!a.startsWith(`task.`)&&!c?.readOnly&&![`job.await`,`job.cancel`,`agent.turn.mark`,`agent.turn.rollback`,`agent.turn.finish`,`agent.turn.cancel`].includes(a)&&p.expectedRevision!==m.revision&&fP(`STALE_SCENE`,`Authored state changed; obtain fresh intent.`),!c?.readOnly&&m.busy&&!v&&!r.has(l.txId)&&!a.startsWith(`job.`)&&fP(`TARGET_BUSY`,`Finish the current editor gesture first.`)),g[a])return pP(b(a,l,p,m),ie,ae);r.size&&fP(`TARGET_BUSY`,`Finish or cancel the open command transaction first.`),v&&c.kind===`document`&&fP(`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=>ne.push(typeof e==`string`?{message:e}:e));let oe=c.domain??c.undoDomain,se=c.target?.(l,m)??l.characterId??l.shotId??l.objectId,ce=se?t.readTarget?.(se):null,le=oe?m.domainRevisions?.[oe]:null,ue=()=>{let e=t.read();ce=se?t.readTarget?.(se):null,le=oe?e.domainRevisions?.[oe]:null,_?.keys.length&&u.rebase(_)},de=new Set,fe={origin:p.origin,signal:A.signal,taskId:p.taskId??null,turnId:p.turnId??null,callId:typeof p.callId==`string`?p.callId:null,check(){A.signal.throwIfAborted();let e=t.read();dP(e.host,m.host)||fP(`STALE_TARGET`,`The open document or scene changed while the job was running.`),oe&&!y&&e.domainRevisions?.[oe]!==le&&fP(`STALE_TARGET`,`The ${oe} data changed while the job was running (revision ${le} to ${e.domainRevisions?.[oe]}); an edit landed between the request and its result.`);let n=_?.keys.length?u.moved(_):se&&t.readTarget?.(se)!==ce?[se]:[];n.length&&fP(`STALE_TARGET`,`${n.join(`, `)} changed while the job was running.`)},commit(e){fe.check(),oe||fP(`INVALID_ARGUMENT`,`A committing job must declare its domain.`);let t=x(oe,e,se??null);return t?.then&&fP(`INVALID_ARGUMENT`,`Job publication must be synchronous; prepare before commit.`),ee=t.historyEntryId,k||=!!ee,O&&ue(),t.result},run(t,n={}){O?fe.check():A.signal.throwIfAborted();let r=e.prepare(t,n);d(r.entry,r.args,p);let i=()=>e.invoke(r.entry,r.args,fe),a=r.entry.kind===`mutation`?x(r.entry.undoDomain,i,r.args.characterId??null,!0):{result:i()};return O&&ue(),pP(a,e=>pP(e.result,t=>{O&&(fe.check(),ue(),k||=!!e.historyEntryId);for(let e of t.affectedIds)de.add(e);return t}))}};c.kind===`job`&&(O={id:crypto.randomUUID(),host:m.host,controller:A,background:!1},i.set(O.id,O)),E=(t.setTimeout??setTimeout)(()=>{let e=new $e(`TIMEOUT`,`${c.id} exceeded its deadline.`);A.abort(e)},O&&c.background===!0?3e5:c.timeoutMs??3e4);let pe=()=>{let t=e.invoke(c,l,fe);if(!t?.then)return t;let n=new Promise((e,t)=>A.signal.addEventListener(`abort`,()=>t(A.signal.reason),{once:!0}));return Promise.race([t,n])},me=PN(v),he=c.kind===`mutation`?x(c.undoDomain,pe,l.characterId??null):{result:pe(),historyEntryId:null},ge=({result:e,historyEntryId:t})=>pP(e,e=>{te(),T?.(),T=null;let n=e?.output===void 0?re():null;if(n)throw n;return u.record(_,FN(v,me,ie(w(c,p,m,{...e,affectedIds:[...new Set([...e.affectedIds,...de])]},t??ee,ne,v))))}),_e=he?.then?he.then(ge):ge(he),ve=_e?.then?_e.catch(ae):_e;if(O){O.completion=Promise.resolve(ve).then(e=>(O.outcome=e,f({type:`job.completed`,jobId:O.id,receipt:e}),e));let e=()=>{O.background=!0;let e=t.read();return h.record(Nn({ok:!0,commandId:p.commandId,receiptId:crypto.randomUUID(),host:m.host,action:c.id,status:`started`,kind:`job`,jobId:O.id,authored:!1,revision:{before:e.revision,after:e.revision},affectedIds:[],delta:[],checks:{coverage:`studio-action:${c.id}`},warnings:[],undo:null}))};if(ve?.then&&p.wait===!1)return e();if(ve?.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(ve?.then){let e=(O?.completion??ve).finally(()=>n.delete(p.commandId));return n.set(p.commandId,e),e}return ve}catch(e){return ae(e)}}function E(...e){hP++;try{let t=T(...e);return t?.then?t.finally(()=>{hP--}):(hP--,t)}catch(e){throw hP--,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 $e(`CANCELLED`,`Studio closed.`));a.clear()}}}var _P=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 vP(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)&&vP(n,t.get(e)));let n=Object.keys(e);return n.length===Object.keys(t).length&&n.every(n=>Object.hasOwn(t,n)&&vP(e[n],t[n]))}var yP=e=>({bones:e?.bones??{},rootY:e?.rootY??0}),bP=(e=[])=>e.map(({frame:e,framing:t})=>({frame:e,framing:t})),xP=e=>({...e,camera:DN(e.camera),cameraKeys:bP(e.cameraKeys)});function SP(e,t,n){if(t===n)return null;if(e===`pose`)return vP(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`:vP(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&&!vP(yP(n.pose),yP(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 vP(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=DN(e.camera),i=DN(n.camera);if([`cameraRail`,`craneHeight`,`railFollow`,`dollyTiming`].some(e=>!vP(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&&!vP(t.framing,e.framing)}))return`camera_key_record`}return vP(t.map(xP),n.map(xP))?null:`shot_edit`}return null}function CP(e){let t=new Set;return(n,r,i,a)=>{if(![`craft`,`playground`].includes(n)||t.has(n))return!1;let o=SP(r,i,a);return o?(t.add(n),e(`${n}:first_edit`,{edit_kind:o,definition_version:1}),!0):!1}}var wP=Object.freeze([`read`,`camera`,`scene_write`,`prompt_authoring`,`frame_capture`,`motion_generate`,`motion_apply`,`project_io`,`other`]),TP=Object.freeze([`workflow_read`,`workflow_write`,`workflow_run`,`frame_capture`,`image_generate`,`scene_write`,`other`]),EP=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`]),DP=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`]}),OP=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([...wP,...TP]),outcome:new Set([`succeeded`,`failed`,`uncertain`,`cancelled`])}),kP=Object.freeze({source:new Set([`agent`,`manual`]),outcome:new Set([`ok`,`error`]),surface:new Set([`assets`,`agent`,`mcp`])}),AP=`cozyclay.analyticsOptOut`,jP=`cozyclay.internalQa`,MP=`cozyclay.analyticsActivation`,NP=`cozyclay.useCaseAsked`,PP=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`])}),FP=Object.freeze(Object.keys(PP).map(e=>`${e}_edit_bucket`)),IP=Object.freeze([`animation`,`film`,`game`,`ad_mv`,`personal`,`other`,`skip`]),LP=Object.freeze([`team`,`solo`,`skip`]),RP=new Set([`storyboard`,`animation`]),zP=Object.freeze([`latest`,`outdated`,`unknown`]),BP=Object.freeze([`https://cozyclay.org`,`https://www.cozyclay.org`]),VP=Object.freeze({"install:first_launch":[`heard_from`],"app:session_started":[],"app:session_ended":[`duration_bucket`,`action_count_bucket`,`scenes_touched`,...FP],"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`],...DP}),HP=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`]),UP=Object.freeze([`x`,`hn`,`reddit`,`github`,`friend`,`other`,`site`,`playground`]),WP=new Set(UP),GP=new Set([`prompt`,`text`,`url`,`path`,`file`]),KP=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`])}),qP=new Set([`unsupported_codec`,`encode_failed`,`render_failed`,`aborted`,`unknown`]),JP=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:qP}),YP=Object.freeze([`done`,`cancelled`,`failed`]),XP=10,ZP=864e5,QP=Object.freeze({workflow:new Set([`aborted`,`capture_failed`,`generation_failed`,`unknown`]),agent:new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`])}),$P=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`])}),eF=/^[A-Za-z0-9_.-]{1,80}\.(?:m?js|jsx|ts|tsx)$/,tF=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`])}),nF=null,rF=!1,iF=!1,aF=!1,oF=null,sF=!1,cF=!1,lF=0,uF=0,dF=0,fF=!1,pF=!1,mF=new Set,hF=new Map(Object.entries(PP).flatMap(([e,t])=>t.map(t=>[t,e]))),gF=1e3,_F=Object.fromEntries(Object.keys(PP).map(e=>[e,0])),vF=null,yF=-1/0,bF=10,xF=new Set,SF=!1,CF=!1,wF=new Set([`app:session_started`,`app:session_ended`,`install:first_launch`,`app:error`,`device:profile`]);function TF(){try{return globalThis.localStorage??null}catch{return null}}function EF(e){try{return TF()?.getItem(e)??null}catch{return null}}function DF(e,t){try{TF()?.setItem(e,t)}catch{}}function OF(e){return typeof e==`string`?e.trim().toLowerCase().replace(/[/.]+$/g,``):``}function kF(e){return e===void 0?[...BP]:e.split(`,`).map(OF).filter(Boolean)}function AF(e,t){let n=OF(e);return Array.isArray(t)&&t.some(e=>n===OF(e))}var jF=e=>typeof e==`boolean`?!0:typeof e==`number`?Number.isFinite(e):typeof e==`string`&&e.length<=32&&!/\s/.test(e);function MF(e,t){let n=VP[e]??[];if(!t||typeof t!=`object`||Array.isArray(t))return{};let r={};for(let i of n)if(!(GP.has(i)||!Object.hasOwn(t,i))&&!(e===`feature:used`&&(i!==`name`||!HP.has(t[i])))&&!(e===`install:first_launch`&&(i!==`heard_from`||!WP.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(!JP[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`&&!_P.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(!KP[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(!OP.surface.has(t[i])||e.startsWith(`workflow:`)&&t[i]!==`workflow`)continue}else if(i===`node_count_bucket`&&!OP.node_count_bucket.has(t[i]))continue;else if(i===`duration_bucket`&&!OP.duration_bucket.has(t[i]))continue;else if(i===`tool_category`){if(!(e.startsWith(`agent:`)?TP:wP).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`&&!QP[e.startsWith(`agent:`)?`agent`:`workflow`].has(t[i]))continue}if(e===`app:error`){if(i===`error_file`){typeof t[i]==`string`&&eF.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(!$P[i]?.has(t[i]))continue}if(!(e===`device:profile`&&!tF[i]?.has(t[i]))){if(e===`sculpt_run`){let e=t[i];i===`outcome`&&YP.includes(e)||i===`rounds`&&Number.isInteger(e)&&e>=0&&e<=XP?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<=ZP?r[i]=Math.round(e):i===`had_target`&&typeof e==`boolean`&&(r[i]=e);continue}i===`previs_mode`&&!RP.has(t[i])||(e.startsWith(`storyboard:`)||e.startsWith(`cast:`))&&!kP[i]?.has(t[i])||e===`survey:use_case`&&(i===`use_case`&&!IP.includes(t[i])||i===`team`&&!LP.includes(t[i]))||jF(t[i])&&(r[i]=t[i])}}}return r}Object.freeze([...HP]);function NF(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 PF(e){return!Number.isFinite(e)||e<6e4?`lt1m`:e<3e5?`1-5m`:e<9e5?`5-15m`:e<18e5?`15-30m`:`gte30m`}function FF(e){return!Number.isFinite(e)||e<0||e<36e5?`lt1h`:e<864e5?`1-24h`:e<6048e5?`1-7d`:e<2592e6?`7-30d`:`gte30d`}function IF(){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 LF(e){return!Number.isFinite(e)||e<1e3?`lt1s`:e<3e3?`1-3s`:e<1e4?`3-10s`:e<3e4?`10-30s`:`gte30s`}function RF(e){return!Number.isFinite(e)||e<=0?`unknown`:e<=4?`1-4`:e<=8?`5-8`:e<=16?`9-16`:`gte17`}function zF(e){return!Number.isFinite(e)||e<=0?`unknown`:e<4?`lt4`:e<8?`4-7`:`gte8`}function BF(e){return!Number.isFinite(e)||e<=0?`unknown`:e<20?`lt20`:e<40?`20-40`:e<55?`40-55`:`gte55`}function VF(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 HF=/((?:https?|chrome-extension|moz-extension|safari-extension|safari-web-extension):\/\/[^\s()]+?):(\d+):(\d+)/g;function UF(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 WF(e){try{let t=new URL(e).pathname.split(`/`).pop()??``;return eF.test(t)?t:null}catch{return null}}function GF(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`&&$P.error_type.has(t)?t:typeof DOMException<`u`&&e instanceof DOMException?`DOMException`:e instanceof Error?`other`:`non_error`}catch{return`other`}}function KF({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:GF(e),error_source:`unknown`},s=typeof t==`string`&&t?{url:t,line:n,col:r}:null;if(!s||UF(s.url,a)!==`app`){let t=``;try{t=typeof e?.stack==`string`?e.stack.slice(0,4e3):``}catch{t=``}let n=[...t.matchAll(HF)].map(e=>({url:e[1],line:Number(e[2]),col:Number(e[3])}));s=n.find(e=>UF(e.url,a)===`app`)??s??n[0]??null}if(!s||(o.error_source=UF(s.url,a),o.error_source!==`app`))return o;let c=WF(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 qF(e,t=Date.now()){let n=hF.get(e);if(!n)return!1;let r=n===vF&&t-yF<gF;return vF=n,yF=t,r||(_F[n]+=1),e===`pose_edit`&&hI(`pose_edit`),!r}function JF(){return Object.fromEntries(Object.entries(_F).map(([e,t])=>[`${e}_edit_bucket`,NF(t)]))}function YF(e,t=`unknown`){try{if(e?.name===`AbortError`)return`aborted`;if(qP.has(e?.exportFailureCode))return e.exportFailureCode}catch{}return qP.has(t)?t:`unknown`}function XF(e,t={}){let n=!1,r=null,i=NaN,a=()=>performance.now(),o=pI,s=()=>{try{return a()}catch{return NaN}},c=(e,t)=>{try{Promise.resolve(o(e,MF(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={...MF(`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:LF(s()-i)};e===`failed`&&(n.failure_code=YF(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 ZF=[`$current_url`,`$initial_current_url`,`$referrer`,`$initial_referrer`],QF=[`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 $F(e){return typeof e==`string`?e.split(`#`)[0].split(`?`)[0]:e}function eI(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 ZF)typeof e[t]==`string`&&(e[t]=$F(e[t]));for(let t of QF)delete e[t],delete e[`$initial_${t}`];for(let t of Object.keys(e))t.startsWith(`$session_entry_`)&&delete e[t]}return e}function tI(e){return e?.activationTracked!==!0}function nI(){return aF?!0:sI()?.distribution===`npm`?sI()?.telemetryEnabled!==!0:EF(AP)===`1`}function rI(){try{let e=TF();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 iI(e){if(sI()?.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 aI(e){let t=e===!0,n=sI()?.distribution===`npm`;aF=t;let r=await iI(!t);if(aF=!1,!r.ok)return nI();let i=!r.enabled;if(DF(AP,i?`1`:`0`),i&&rI(),n&&!i)return globalThis.location?.reload(),!1;if(!nF&&!i&&await fI(),!nF)return i;try{i?(iF=!1,nF.opt_out_capturing()):(nF.opt_in_capturing(),iF=rF)}catch{iF=!1}return i}function oI(){return{BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1,VITE_COZYCLAY_LIVE_PORT:`5184`}}function sI(){let e=globalThis.__COZYCLAY_RUNTIME__;return!e||typeof e!=`object`||Array.isArray(e)?null:e}function cI(e){try{let t=new URL(e);return t.protocol===`http:`&&[`127.0.0.1`,`localhost`].includes(t.hostname)}catch{return!1}}function lI({env:e=oI(),origin:t=globalThis.location?.origin??``,runtime:n=sI()}={}){return e.PROD?n?.distribution===`npm`?n.telemetryEnabled===!0?cI(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:WP.has(n.firstLaunchHeardFrom)?n.firstLaunchHeardFrom:null,installKind:[`npx`,`global`,`clone`].includes(n.installKind)?n.installKind:`npx`,originKind:`local`,internalQa:n.internalQa===!0,updateStatus:zP.includes(n.updateStatus)?n.updateStatus:`unknown`}:{kind:`disabled`,reason:`unapproved origin`}:{kind:`disabled`,reason:`opted out`}:e.VITE_POSTHOG_KEY?AF(t,kF(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:EF(jP)===`1`,updateStatus:null}:{kind:`disabled`,reason:`unapproved origin`}:{kind:`disabled`,reason:`no key`}:{kind:`disabled`,reason:`not production`}}function uI(e){return{distribution:e.distribution,...e.appVersion?{app_version:e.appVersion}:{},origin_kind:e.originKind,os:IF(),...e.installKind?{install_kind:e.installKind}:{},...e.updateStatus?{update_status:e.updateStatus}:{},internal_qa:e.internalQa}}function dI(e){let t=lI({env:e});return t.kind===`disabled`?t.reason:nI()?`opted out`:null}async function fI(){if(rF||oF)return oF;if(sI()?.distribution!==`npm`){let e=new URLSearchParams(globalThis.location?.search??``).getAll(`internal_qa`);e.length===1&&(e[0]===`1`||e[0]===`0`)&&DF(jP,e[0])}let e=oI(),t=dI(e);if(t){cF||=(console.info(`[analytics] disabled: `+t),!0);return}oF=(async()=>{try{let t=await yN(()=>import(`./module-MzlRiBjI.js`),[]);if(nI())return;let n=lI({env:e});if(n.kind===`disabled`)return;nF=t.default??t,nF.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:eI}),rF=!0,iF=!0;let r=uI(n);if(nF.register(r),globalThis.__cozyclayAnalytics={instance:nF},nF.capture(`$pageview`),lF=Date.now(),EI(n,r),yI(),TI(),n.distribution===`npm`&&(pI(`app:session_started`),n.firstLaunch)){let e=n.firstLaunchHeardFrom;pI(`install:first_launch`,e?{heard_from:e}:{})}}catch{console.info(`[analytics] initialization failed`)}})(),await oF}function pI(e,t={}){if(!(!rF||!iF||!nF))try{if(nI())return;let n=MF(e,t);wF.has(e)||(uF+=1,(e===`scene:created`||e===`scene:loaded`)&&(dF+=1)),nF.capture(e,n)}catch{}}function mI(e,{hadTarget:t=!1}={}){return YP.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 hI(e){return!rF||!iF||!nF||!HP.has(e)||mF.has(e)?!1:(mF.add(e),pI(`feature:used`,{name:e}),!0)}function gI(){try{return rF&&iF&&!!nF&&!nI()}catch{return!1}}function _I(){return gI()&&EF(NP)!==`1`}function vI(e,t){DF(NP,`1`),pI(`survey:use_case`,{use_case:IP.includes(e)?e:`skip`,team:LP.includes(t)?t:`skip`})}function yI(){if(SF||typeof window>`u`||typeof window.addEventListener!=`function`)return;SF=!0;let e=e=>{try{let t=KF(e),n=[t.error_kind,t.error_type,t.error_source,t.error_file,t.error_line,t.error_col].join(`|`);if(xF.has(n)||xF.size>=bF)return;xF.add(n),pI(`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 bI(){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 xI=8e3,SI=3e3,CI=6e4;function wI(){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>CI){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>=SI){e((a-1)*1e3/(r-o));return}t(s)};t(s)};setTimeout(i,xI)})}async function TI(){if(!(CF||globalThis.document===void 0||typeof globalThis.requestAnimationFrame!=`function`)){CF=!0;try{let{webgl:e,renderer:t}=bI(),n=VF(t),r=await wI();pI(`device:profile`,{...n,webgl:e,cpu_bucket:RF(globalThis.navigator?.hardwareConcurrency),memory_bucket:zF(globalThis.navigator?.deviceMemory),frame_rate_bucket:BF(r)})}catch{}}}function EI(e,t){if(pF||typeof window>`u`)return;pF=!0;let n=()=>{if(!(fF||!lF)){fF=!0;try{if(!iF||!nF||nI()||nF.has_opted_out_capturing())return;let n={api_key:e.apiKey,event:`app:session_ended`,properties:{...t,distinct_id:nF.get_distinct_id(),duration_bucket:PF(Date.now()-lF),action_count_bucket:NF(uF),scenes_touched:Math.min(20,dF),...JF()}},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 DI(e){if(!(!rF||!iF||sF)){if(!tI({activationTracked:EF(MP)===`1`})){sF=!0;return}sF=!0,DF(MP,`1`),pI(`activation:completed`,{activation_path:e})}}function OI(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 kI(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 AI(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 jI(e,t){return OI(t)?!e||typeof e.matches!=`function`||!(e.isContentEditable||e.matches(`[contenteditable=true]`)):!1}var MI=new Set([`mp4`,`m4v`,`mov`,`webm`,`ogv`,`mkv`]),NI=9,PI=3,FI=480,II=.85;function LI(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 MI.has(n)}function RI(e,t){return Array.from({length:t},(n,r)=>(r+.5)*e/t)}function zI(e){let t=Math.floor(e/60);return`${t}:${(e-t*60).toFixed(1).padStart(4,`0`)}`}function BI(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 VI(e,{doc:t=globalThis.document,frames:n=NI}={}){let r=URL.createObjectURL(e),i=t.createElement(`video`);i.muted=!0,i.playsInline=!0,i.preload=`auto`;try{let a=BI(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(FI,s),u=Math.round(l*c/s),d=t.createElement(`canvas`);d.width=l*PI,d.height=u*Math.ceil(n/PI);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 RI(o,n).entries()){let n=BI(i,`seeked`);i.currentTime=t,await n;let r=e%PI*l,a=Math.floor(e/PI)*u;f.drawImage(i,r,a,l,u);let o=`${e+1} · ${zI(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`,II)),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 HI=1600,UI=4194304,WI=.85,GI=Object.freeze([`image/png`,`image/jpeg`,`image/webp`]),KI=`Up to 4 images per message`,qI=`Attach a PNG, JPEG or WebP image, or a video`,JI=`That image or video could not be attached`,YI=[...GI,`video/*`].join(`,`),XI={png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,webp:`image/webp`};function ZI(e){let t=String(e?.type??``).toLowerCase();return GI.includes(t)?t:t?null:XI[String(e?.name??``).toLowerCase().match(/\.([a-z0-9]+)$/)?.[1]]??null}function QI(e){return Array.from(e?.types??[]).includes(`Files`)}function $I(e){let t=Array.from(e?.files??[]);if(!t.length){let n=OI(e);n&&t.push(n)}let n=[],r=0;for(let e of t)ZI(e)||LI(e)?n.push(e):String(e?.type??``).startsWith(`image/`)&&(r+=1);return{images:n,unsupported:r}}function eL(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 tL(e,t,n=HI){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 nL(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 rL=32768,iL=e=>{let t=``;for(let n=0;n<e.length;n+=rL)t+=String.fromCharCode.apply(null,e.subarray(n,n+rL));return btoa(t)};async function aL(e,t){let n=new Uint8Array(await e.arrayBuffer());return`data:${t||e.type||`image/jpeg`};base64,${iL(n)}`}function oL(e,t){if(typeof OffscreenCanvas==`function`)return new OffscreenCanvas(e,t);throw Error(`this browser cannot resize images — OffscreenCanvas is unavailable`)}function sL(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 cL(e,{decode:t=globalThis.createImageBitmap,makeCanvas:n=oL,toBlob:r=sL,maxBytes:i=UI,maxDimension:a=HI,quality:o=WI}={}){if(eL(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=tL(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 aL(await t.convertToBlob({type:`image/jpeg`,quality:o}),`image/jpeg`)}finally{s?.close?.()}}function lL(e){let t=String(e?.name??``).trim();return!t||t===`image.png`?`pasted-image.png`:t.slice(0,120)}async function uL(e,t={}){if(LI(e)){let t=await VI(e);return{dataUrl:await aL(t.blob,`image/jpeg`),name:t.name}}let{readDataUrl:n=kI,...r}=t,i=ZI(e)??`image/png`,a=await n(e);return{dataUrl:await cL(a.startsWith(`data:${i};`)?a:`data:${i};${a.slice(a.indexOf(`;`)+1)}`,r),name:lL(e)}}var dL=new Set([`aborted`,`capture_failed`,`generation_failed`,`unknown`]),fL=new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`]);function pL(){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 mL(e,t,n){try{Promise.resolve(e(t,n)).catch(()=>{})}catch{}}function hL(e){try{return e()}catch{return NaN}}function gL(e,t,n=`unknown`){let r=t===`agent`?fL:dL;try{if(e?.name===`AbortError`)return`aborted`}catch{}return r.has(n)?n:`unknown`}function _L(e,{capture:t=pI,now:n=()=>performance.now(),durationBucket:r=LF}={}){let i=pL(),a=!1,o=!1,s=hL(n),c=(e,n)=>{i&&mL(t,e,n)};c(`workflow:run_requested`,{surface:`workflow`,...OP.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=gL(t,`workflow`,o),u=e===`failed`&&l===`aborted`?`cancelled`:e,d=`lt1s`;try{let e=r(hL(n)-s);OP.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 vL=`follow the reference clip's framing and camera motion exactly`,yL=`clay previs, neutral look`,bL=`motion and blocking come from the reference; keep timing`;function xL(e){return!Number.isFinite(e)||e<=0?`normal`:e<35?`wide`:e<=50?`normal`:`long`}function SL(e,t={}){if(!Number.isFinite(e)||e<=0)return`normal`;let n=Jn(e*Math.PI/180,t.sensorId,t.aspectRatio);return xL(Math.round(n*10)/10)}function CL(e){return Number.isFinite(e.focalMm)&&e.focalMm>0?xL(e.focalMm):SL(e.fovDeg,{sensorId:e.sensorId,aspectRatio:Kn(e.aspect)})}function wL(e){return`${Number(e.toFixed(2))}s`}function TL(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 EL=[`front`,`front right`,`right`,`back right`,`back`,`back left`,`left`,`front left`];function DL(e){if(!Number.isFinite(e))return``;let t=(e%360+360)%360;return EL[Math.round(t/45)%8]}function OL(e){return Number.isFinite(e)?e>=50?`high`:e<=10?`low`:`level`:``}function kL(e){return Number.isFinite(e)?e>=.8?`strong`:e>=.35?`moderate`:`dim`:`moderate`}function AL(e){return e?`${[OL(e.elevationDeg),DL(e.azimuthDeg)].filter(Boolean).join(` `)||`even`} key light, ${kL(e.intensity)}`:`no key light, ambient fill`}function jL(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`}, ${wL(i)}, ${e.aspect||``}`.trimEnd(),`LENS: ${e.focalMm}mm, ${CL(e)} shot`,r?`CAMERA: ${vL}`:`CAMERA: ${TL(e.cameraMove)}`,`LIGHT: ${AL(e.keyLight)}`,`CAST: ${(e.cast||[]).map(e=>e.name).join(`, `)||`none`}`,`LOOK: ${a||yL}`];return n===`video`&&o.push(`MOTION: ${bL}`),o.join(`
12
+ `)}var ML=``;function NL(e){return`${ML}${e}`}async function PL(e,t,n){let r=await e(NL(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 FL({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 IL(e,{fetchImpl:t=globalThis.fetch?.bind(globalThis),signal:n}={}){return PL(t,`/agent/image`,{method:`POST`,body:JSON.stringify(FL(e)),signal:n})}var LL=`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 RL({meta:e,caption:t,imageDataUrl:n}){let r=typeof t==`string`?t.trim():``;return{prompt:`${LL}\n${jL(e,{target:`image`})}${r?`\n${r}`:``}`,imageDataUrl:n,quality:`auto`}}function zL(e){if(e?.code===`entitlement`)return B(`This account cannot generate images.`,`이 계정은 이미지를 생성할 수 없어요.`);if(e?.status===401||e?.code===`auth`)return B(`Sign in with ChatGPT in the Agent panel first.`,`먼저 Agent 패널에서 ChatGPT로 로그인하세요.`);let t=e?.message||B(`unknown error`,`알 수 없는 오류`);return B(`Stylize failed — ${t}`,`스타일화 실패 — ${t}`)}function BL(e,t){let n=typeof e==`string`?/^data:image\/png;base64,(.*)$/s.exec(e):null;if(!n)throw Error(B(`The image route did not return a PNG.`,`이미지 경로가 PNG를 돌려주지 않았어요.`));let r=atob(n[1]);if(r.length>t){let e=Math.round(t/1048576);throw Error(B(`The stylized image is larger than ${e} MB, so it was not added.`,`스타일화된 이미지가 ${e} MB보다 커서 추가하지 않았어요.`))}let i=new Uint8Array(r.length);for(let e=0;e<r.length;e+=1)i[e]=r.charCodeAt(e);return i}var VL=300,HL=Object.freeze([]),UL=new Map,WL=new Set,GL=new Set,KL=HL;function qL(){KL=Object.freeze([...UL].flatMap(([e,t])=>t.map(t=>({...t,key:`${e}/${t.key}`}))));for(let e of[...GL])try{e()}catch{}}function JL(e){if(e?.type===`sculpt.sketch`){let t=typeof e.callId==`string`&&e.callId?e.callId:`#${e.index}`;if(WL.has(t))return;let n=t!==`#${e.index}`&&UL.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)UL.set(t,r);else if(!UL.delete(t)&&!n)return;qL()}else e?.type===`tool.done`&&typeof e.callId==`string`?(WL.add(e.callId),UL.delete(e.callId)&&qL()):(e?.type===`done`||e?.type===`error`)&&YL()}function YL(){WL.clear(),UL.size&&(UL.clear(),qL())}function XL(e){return GL.add(e),()=>{GL.delete(e)}}var ZL=()=>KL;function QL(e){let t=[],n=new Set;for(let r of Array.isArray(e)?e.slice(0,VL):[]){if(!r||typeof r!=`object`||n.has(r.id))continue;let{parent:e,mirror:i,...a}=r,o=Wa({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 Za({version:1,parts:t})}var $L=140,eR=(e,t=$L)=>{let n=String(e??``).replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t-1)}…`:n},tR=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`},nR=e=>new Map((e?.actionIndex??[]).filter(e=>e?.id&&e.label).map(e=>[e.id,e.label]));function rR(e,t){let n=[...String(e??``).matchAll(/tools\.(\w+)\(\s*\{?\s*(?:action\s*:\s*["'`]([\w.]+)["'`])?/g)].map(([,e,n])=>n?t?.get(n)??tR(n):Ye[e]??tR(e)),r=[...new Set(n)];return r.length>3?`${r.slice(0,3).join(`, `)}…`:r.join(`, `)}function iR(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]??rR(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)??tR(r)}:{},...a?{subject:eR(a,80)}:{}}}function aR(e,t={}){return e.kind===`compose`||e.kind===`tool`?e.actionLabel?e.actionLabel:e.action?tR(e.action):e.name===`script`?B(`Script`,`스크립트`):Object.hasOwn(t,e.name)?t[e.name]:e.label||tR(e.name||`tool`):``}function oR(e,t){let n=[],r=e?.checks?.framing?.derivedSize;return r&&n.push(r),e?.geometry?.axisConsistent===!1&&n.push(B(`cameras cross the line`,`카메라가 축을 넘음`)),e?.verification?.status&&n.push(e.verification.status===`verified`?B(`motion checked`,`모션 확인`):B(`motion unverified`,`모션 미확인`)),e?.visualStatus===`attached`&&n.push(t?.visual===`contact_sheet`?B(`looked at a contact sheet`,`컨택트 시트 확인`):B(`looked at the frame`,`화면 확인`)),e?.stale&&n.push(B(`stale evidence`,`이전 상태 기준`)),n.join(` · `)}function sR(e){if(e.kind!==`tool`)return``;if(e.status===`failed`)return eR(String(e.error??e.failure?.message??B(`Failed`,`실패`)).replace(/^Error:\s*/,``));if(e.status===`cancelled`)return e.result?.status===`not_applied`?B(`not applied`,`적용 안 됨`):B(`result unknown`,`결과 불명`);let t=e.result;if(!t||typeof t!=`object`)return``;if(e.name===`script`){let e=Array.isArray(t.calls)?t.calls:[],n=e.filter(e=>e?.ok===!1),r=B(`${e.length} call${e.length===1?``:`s`}`,`호출 ${e.length}회`);return t.ok===!1?eR(`${r} · ${t.error?.message??B(`failed`,`실패`)}${t.rollback?B(` · its edits were rolled back`,` · 편집 되돌림`):``}`):eR(n.length?`${r} · ${B(`${n.length} refused`,`${n.length}회 거부`)}: ${n[0].code??n[0].message??``}`:r)}return e.name===`verify_result`?eR(oR(t,e.args)):typeof t.summary==`string`&&t.summary?eR(t.summary.replace(/\.$/,``)):t.status===`started`?B(`started`,`시작됨`):``}function cR(e){let t=e.progress;if(!t)return``;let n=t.label??(t.action?tR(t.action):tR(t.name??`call`));return B(`${n} (call ${t.index})`,`${n} (${t.index}번째 호출)`)}function lR(e){let t=String(e??``).split(/\n+/).map(e=>e.replace(/^[#*\s-]+|\*+$/g,``).trim()).filter(Boolean),n=t.at(-1)??``;return eR(n.length<24&&t.length>1?t.at(-2):n)}function uR(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 dR=(e,t)=>e.at(-1)?.kind===`thinking`&&!e.at(-1).endedAt?[...e.slice(0,-1),{...e.at(-1),endedAt:t}]:e;function fR(e,t,n,r,i){let a=dR(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)??tR(t.action)}:{},...t.subject?{subject:eR(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 pR(e,t){let n=dR(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 mR=(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}],hR=new Set([`tool`,`thinking`,`compose`]);function gR(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=>hR.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(!(hR.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 _R(e,t,n){let r=e.steps.filter(e=>e.kind===`tool`).length,i=r?` · ${B(`${r} step${r===1?``:`s`}`,`${r}단계`)}`:``;if(e.live){let r=e.steps[0]?.startedAt;return{tone:`busy`,text:`${B(`Working`,`작업 중`)}${i}${Number.isFinite(r)?` · ${n(t-r)}`:``}`}}let a=e.end,o=a&&Number.isFinite(a.durationMs)?` · ${n(a.durationMs)}`:``;return a?.status===`stopped`?{tone:`warn`,text:`${B(`Stopped`,`중지됨`)}${i}${o}`}:a?.status===`failed`?{tone:`alert`,text:`${B(`Failed`,`실패`)}${i}${o}`}:{tone:`ok`,text:`${B(`Done`,`완료`)}${i}${o}`}}function vR(e,t){let n=new Map([...t?.entityIndex??[],...t?.shots??[]].filter(e=>e?.id&&e.name).map(e=>[e.id,e.name])),r=[...new Set(e.map(e=>n.get(e)).filter(Boolean))],i=e.filter(e=>!n.has(e)).length;if(!r.length&&!i)return B(`Changed the scene`,`장면을 바꿈`);let a=r.slice(0,4).join(`, `),o=Math.max(0,r.length-4)+i;return B(`Changed ${a||`the scene`}${o>0?` and ${o} more`:``}`,`${a||`장면`}${o>0?` 외 ${o}개`:``} 변경`)}function yR(e){return e.steps.some(e=>e.result?.authored===!0||(e.result?.calls??[]).some(e=>e?.revision&&e.revision.after!==e.revision.before))?B(`Stopped by you. What already ran stays in the scene; Cmd+Z undoes this turn.`,`직접 중지했어요. 이미 실행된 편집은 장면에 남아 있고, Cmd+Z로 이번 턴을 되돌릴 수 있어요.`):e.steps.some(e=>e.kind===`tool`&&e.status===`cancelled`)?B(`Stopped by you while a step was running; its result is unknown.`,`단계 실행 중에 직접 중지했어요. 그 단계의 결과는 알 수 없어요.`):B(`Stopped by you before anything changed in the scene.`,`장면이 바뀌기 전에 직접 중지했어요.`)}var bR=new Set([`pending`,`active`,`done`]),xR=12,SR=80;function CR(e){if(!Array.isArray(e)||!e.length||e.length>xR)return null;let t=e.map(e=>({text:String(e?.text??``).replace(/\s+/g,` `).trim().slice(0,SR),status:e?.status}));return t.every(e=>e.text&&bR.has(e.status))?t:null}var wR=e=>e?.type===`plan.update`||e?.name===`plan`&&[`tool.compose`,`tool.start`,`tool.progress`].includes(e?.type);function TR(e,t,n){let r=t?.type===`plan.update`?CR(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 ER(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 DR=(e,t)=>e.map(e=>e.kind===`plan`&&!e.outcome?ER(e,t):e);function OR(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?CR(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),ER({...n,steps:r},i),...t.slice(a)]})}var kR=`cozyclay.workflow.agentPanel.width`,AR=1100,jR=`cozyclay.agent.session.studio`,MR=[`signed-out`,`signing-in`,`no-entitlement`,`ready`,`streaming`,`rate-limited`,`error`];function NR(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 PR={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`},FR=new Set([`installed`,`failed`,`cancelled`,`stale_target`,`stale_environment`]),IR=e=>FR.has(e),LR=e=>e===`installed`?`ok`:e===`review_required`?`warn`:IR(e)?`alert`:`busy`,RR=e=>Number.isFinite(e)?`${Math.round(e*100)}%`:``;function zR(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?vR(e?.affectedIds??[],t):`Applied to ${e?.affectedIds?.join(`, `)||`the scene`}`}function BR(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 VR=[`Block a two-shot conversation in this scene`,`Render this frame as a storyboard panel`,`Suggest a camera move for the current shot`],HR=[B(`Block a two-shot`,`투샷 블로킹`),B(`Frame the selected character`,`선택한 캐릭터 구도 잡기`),B(`Light the set warmer`,`세트 조명 더 따뜻하게`)],UR=`Image generation uses about 3-5x a normal turn`,WR={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`},GR={inspect_studio:B(`Read the scene`,`장면 읽기`),operate_studio:B(`Selection and view`,`선택과 뷰`),arrange_objects:B(`Arrange objects`,`오브젝트 배치`),arrange_characters:B(`Arrange characters`,`캐릭터 배치`),patch_elements:B(`Edit properties`,`속성 편집`),frame_shot:B(`Frame the shot`,`샷 구도 잡기`),generate_motion:B(`Generate motion`,`모션 생성`),verify_result:B(`Verify the result`,`결과 검증`),undo_edit:B(`Undo an edit`,`편집 되돌리기`),run_action:B(`Run an editor action`,`편집기 동작 실행`)},KR=Object.freeze({workflow:Object.freeze({toolLabels:WR,toolBadge:`Canvas`,suggestions:VR,imageHint:UR,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:GR,toolBadge:B(`Scene`,`장면`),suggestions:HR,imageHint:null,imageEntitlement:!1,steer:!1,history:!0,persistWidth:!1,emptyTitle:B(`Direct the scene`,`장면을 연출하세요`),emptyHint:e=>B(`Ask for blocking, a camera move, or a motion take in \u201C${e}\u201D.`,`\u201C${e}\u201D\uC5D0\uC11C \uBE14\uB85C\uD0B9, \uCE74\uBA54\uB77C \uC6C0\uC9C1\uC784, \uBAA8\uC158 \uD14C\uC774\uD06C\uB97C \uC694\uCCAD\uD558\uC138\uC694.`),composerPlaceholder:B(`Ask the agent to block, frame or animate…`,`블로킹·구도·모션을 요청하세요…`)})});function qR(e){return Object.hasOwn(KR,e)?KR[e]:KR.workflow}function JR(e){let t=Number(e);return Number.isFinite(t)?Math.min(560,Math.max(300,Math.round(t))):360}function YR(e=globalThis.localStorage){try{let t=e?.getItem(kR);return t==null||t===``?360:JR(t)}catch{return 360}}function XR(e,t=globalThis.localStorage){try{t?.setItem(kR,String(JR(e)))}catch{}}var ZR=`cozyclay.agent.model`;function QR(e=globalThis.localStorage){try{let t=e?.getItem(ZR);return typeof t==`string`&&t?t:null}catch{return null}}function $R(e,t=globalThis.localStorage){try{typeof e==`string`&&e&&t?.setItem(ZR,e)}catch{}}function ez(e,t=QR()){let n=Array.isArray(e)?e:[];return n.some(e=>e?.id===t)?t:n[0]?.id??``}function tz(e,t){if(!e.length)return!0;let n=e.find(e=>e.models?.some(e=>e.key===t));return!n||n.signedIn}function nz(e,t,n){return n&&t.some(e=>e.id===n)&&tz(e,n)?n:ez(t.filter(t=>tz(e,t.id)))}function rz(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 iz(e){let t=String(e??``);return t.slice(t.indexOf(`/`)+1)}function az(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 oz={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 sz(e){if(e?.label)return e.label;let t=oz[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 cz={STEER_UNSUPPORTED:`This surface cannot steer a running turn.`,NO_ACTIVE_TURN:`That turn already ended — send it as a new message.`},lz=/^(TARGET_NOT_READY|CAPABILITY_MISSING|CONFIRMATION_REQUIRED):/;function uz(e){let t=Array.isArray(e?.issues)?e.issues:[],n=(Array.isArray(e?.fixes)?e.fixes:[]).filter(e=>typeof e?.action==`string`&&e.args&&typeof e.args==`object`),r=new Set(n.map(e=>e.issueIndex)),i=t.filter((e,t)=>(e?.severity===`blocker`||e?.severity===`concern`)&&!r.has(t)),a=e=>`- [${e.severity}] ${e.text}${e.evidence?` (${e.evidence})`:``}`;return n.length?[B(`Supervisor review — apply these fixes exactly, in order, in ONE script call, then verify_result; do not re-derive them:`,`감독 검토 — 아래 수정을 유추 없이 순서대로 script 1회로 실행하고 verify_result로 확인해 주세요:`),...n.map(e=>`- [${e.severity}] ${t[e.issueIndex]?.text??``} -> run_action ${JSON.stringify({action:e.action,args:e.args})}`),...i.length?[B(`Also check:`,`추가 확인:`),...i.map(a)]:[]].join(`
13
+ `):i.length?[B(`Supervisor review — please address:`,`감독 검토 — 다음을 고쳐 주세요:`),...i.map(a)].join(`
14
+ `):null}var dz={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.`},fz=`Ready`,pz={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 mz(e){if(!e)return`unknown error`;let t=pz[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 hz(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 gz=(e,t,n,r=``)=>({phase:e,kind:`live`,tone:`busy`,text:`${t} · ${hz(n)}`,ticking:!0,...r?{detail:r}:{}});function _z(e,{now:t=Date.now(),toolLabel:n=sz}={}){let r=e?.items??[],i=r.find(e=>e.kind===`image`&&e.apply?.status===`applying`);if(i)return gz(`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`&&!IR(e.state));if(a){let e=RR(a.progress);return gz(`job`,`${PR[a.state]||a.state} motion${e?` ${e}`:``}`,i)}let o=r.findLast(e=>e.kind===`tool`&&e.status===`running`);if(o)return gz(`tool`,`Running ${n(o)}…`,i,o.progress?cR(o):o.subject);let s=r.at(-1);return s?.kind===`compose`?gz(`compose`,`Preparing ${n(s)}…`,i,s.subject):s?.kind===`thinking`?gz(`thinking`,`Thinking…`,i,lR(s.text)):s?.kind===`assistant`?gz(`reply`,`Writing the reply…`,i):s?.kind===`user`?gz(`sending`,i<2e3?`Sending…`:`Waiting for the model…`,i):gz(`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: ${mz(a.failure)}`,ticking:!0}:{phase:`done`,kind:`terminal`,tone:`ok`,text:`Done · ${hz(a.durationMs)}`,ticking:!0}:{phase:`idle`,kind:`idle`,tone:``,text:fz,ticking:!1}}function vz(e){let t=[],n=e.split(`
15
+ `),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 yz=e=>typeof e==`string`&&/^[a-f0-9]{32}$/.test(e),bz=new Set([`aborted`,`auth`,`rate_limited`,`tool_failed`,`upstream`,`unknown`]),xz=(e,t)=>e&&typeof e==`object`&&!Array.isArray(e)&&Object.keys(e).length===t.length&&t.every(t=>Object.hasOwn(e,t)),Sz=(e,t)=>{try{return e()}catch{return t}},Cz=e=>Sz(()=>e?.status===401||e?.code===`auth`?`auth`:e?.status===429||e?.code===`rate_limit`?`rate_limited`:`upstream`,`upstream`),wz=new Set([`auth`,`entitlement`,`rate_limit`,`overloaded`,`upstream`]);async function Tz(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:wz.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 Ez({surface:e,capture:t,now:n,correlationId:r=null}){let i=Sz(()=>{let e=new Uint8Array(16);return globalThis.crypto.getRandomValues(e),[...e].map(e=>e.toString(16).padStart(2,`0`)).join(``)},null),a=()=>Sz(()=>{let e=n();return Number.isFinite(e)?e:NaN},NaN),o=r??i,s=a(),c=Sz(()=>[`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:LF(a()-t.startedAt)});d.clear(),p(`agent:turn_${e}`,{turn_id:i,duration_bucket:LF(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`,bz.has(e)?e:`upstream`),frame(e){try{if(!i||l)return;if(e.type===`execution_tool_started`){if(!xz(e,[`type`,`turn_id`,`telemetry_id`,`tool_category`])||e.turn_id!==o||!yz(e.telemetry_id)||!TP.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(!xz(e,[`type`,`event`,`props`,`telemetry_id`])||!yz(e.telemetry_id)||!xz(n,[`turn_id`,`tool_category`,`outcome`,`duration_bucket`])||!TP.includes(n.tool_category)||![`succeeded`,`failed`,`cancelled`].includes(n.outcome)||!OP.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(!xz(e,[`type`,`event`,`props`]))return;if(t===`agent:result_applied`){!u&&xz(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(!xz(n,[`turn_id`,`duration_bucket`,...s?[`failure_code`]:[]])||!OP.duration_bucket.has(n.duration_bucket)||s&&(r===`succeeded`||!bz.has(n.failure_code)))return;m(r,r===`cancelled`?`aborted`:n.failure_code||`unknown`)}catch{}}}}var Dz=3;function Oz(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 kz=e=>!Number.isFinite(e?.status)||[404,502,503].includes(e.status);function Az({fetchImpl:e=globalThis.fetch?.bind(globalThis),surface:t,capture:n=pI,now:r=()=>performance.now()}={}){let i=new Map,a=(t,n)=>PL(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 IL(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(NL(`/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=Ez({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=Cz(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=vz(n);n=a.tail;for(let e of a.events)T(e)}for(let e of vz(`${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(NL(_&&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(Cz(t)),o({type:`error`,...await Tz(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<Dz;t+=1){let t;try{t=await e(NL(`/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||Cz(e)),e}finally{s?.removeEventListener(`abort`,b),i.get(c)===y&&i.delete(c)}}}}function jz(e=globalThis.location?.search||``){let t=new URLSearchParams(e);if(t.get(`agent`)!==`mock`)return null;let n=t.get(`state`);return{state:MR.includes(n)?n:`ready`,speed:Number(t.get(`speed`))||1}}var Mz={signedIn:!0,email:`director@cozyclay.org`,plan:`Plus`,accountId:`acct_mock_126`,expiresAt:null},Nz=[{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`}}],Pz={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:[]},Fz=[{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:Pz.receiptId}}},{delay:60,event:{type:`receipt`,receipt:Pz}},{delay:40,event:{type:`done`}}],Iz=[[`openai-codex`,`ChatGPT (OpenAI Codex)`],[`anthropic`,`Anthropic`],[`openai`,`OpenAI`],[`google`,`Google Gemini`],[`openrouter`,`OpenRouter`],[`cliproxy`,`CLIProxyAPI`]],Lz=`google`,Rz={"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`}]},zz={id:`gpt-6-live-preview`,label:`gpt-6 live preview`,efforts:[`none`,`low`,`medium`,`high`],defaultEffort:`high`},Bz=8,Vz=`cozyclay.mock.agent.status-calls`,Hz=`cozyclay.mock.agent.model-calls`,Uz=e=>{try{globalThis.localStorage?.setItem(e,String(Number(globalThis.localStorage.getItem(e)||0)+1))}catch{}};function Wz(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=()=>Iz.map(([e,t])=>{let n=e===`openai-codex`?o===`in`?`chatgpt`:null:e===Lz?`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(){Uz(Vz);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`?{...Mz,plan:`Free`,entitlements:{image:!1},providersConfigured:e}:{...Mz,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(){Uz(Hz);let e=s().map(e=>{let t=Rz[e.id]??[],n=e.id===`openai-codex`&&o===`in`?[...t,zz]: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<Bz)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:dz.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:dz.upstream}),d({type:`done`}),c=null;return}for(let e of n?Fz:Nz){if(a?.aborted||(await i(e.delay),a?.aborted))break;d(e.event)}c=null,await i(240),a?.aborted&&d({type:`done`})}}}function Gz(e={}){let t=e.mockConfig===void 0?jz():e.mockConfig;return t?Wz({surface:e.surface,...t}):Az(e)}function Kz(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 qz(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 Jz({transport:e,surface:t=`workflow`,buildContext:n=null,requestImageAction:r=null,onAuthLost:i=null,onReceipt:a=null,newId:o=NR,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||!Qe.jobStates.includes(e.state))return;let t=typeof e.progress==`number`&&Number.isFinite(e.progress)?Math.min(1,Math.max(0,e.progress)):null;y(n=>{let r=n.find(t=>t.kind===`job`&&t.jobId===e.jobId),i={kind:`job`,id:r?.id??`job:${e.jobId}`,jobId:e.jobId,commandId:e.commandId??r?.commandId??null,state:e.state,phase:typeof e.phase==`string`?e.phase:r?.phase??null,progress:t??r?.progress??null,verification:r?.verification??null,receiptId:r?.receiptId??null,outcome:r?.outcome??null,acceptance:e.state===`review_required`?r?.acceptance??{status:`required`}:r?.acceptance??null};return r?n.map(e=>e===r?i:e):[...n,i]})}function C(e){let t;try{t=Nn(e)}catch(e){y(t=>[...t,{kind:`failure`,id:o(),failure:{code:e?.code||`INVALID_RECEIPT`,message:e?.message||`The host returned an unreadable receipt.`,preserved:{authoredState:`unknown`},recovery:{action:`inspect`}}}]);return}if(t.ok===!1){let e=`failure:${t.commandId}:${t.code}`;if(u.has(e))return;u.add(e),y(n=>[...n.map(e=>e.kind===`job`&&e.commandId===t.commandId&&!IR(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:zR(t,c?Sz(()=>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:lz.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(wR(e)){y(t=>TR(t,e,o));return}if(e?.type===`tool.start`){y(t=>pR(t,{kind:`tool`,id:e.callId||o(),callId:e.callId,name:e.name,label:e.label,args:e.args,status:`running`,startedAt:s(),...iR(e.name,e.args,g)}));return}if(e?.type===`thinking.delta`){y(t=>uR(t,String(e.text??``),s(),o));return}if(e?.type===`tool.compose`){y(t=>fR(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`?Oz(e.message):e.message||dz[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||dz.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??qz)(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}=nL(_.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=nR(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=>{JL(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,YL(),!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:DR(mR(_.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:cz.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:cz[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`&&!IR(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=Kz(e);n&&(b(e=>e.kind===`job`&&e.jobId===t.jobId&&!IR(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=OR((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 Yz=`cozyclay.agent.tasks`;function Xz(e=globalThis.localStorage){try{return e?.getItem(Yz)===`on`}catch{return!1}}function Zz(e,t=globalThis.localStorage){try{t?.setItem(Yz,e?`on`:`off`)}catch{}}var Qz={queued:B(`Queued`,`대기열`),waiting:B(`Waiting for scope`,`영역 대기`),starting:B(`Starting`,`시작 중`),running:B(`Running`,`작업 중`),paused:B(`Paused: Studio lost`,`일시정지: Studio 연결 끊김`),review:B(`Being checked`,`확인 중`),done:B(`Done`,`완료`),failed:B(`Failed`,`실패`),cancelled:B(`Cancelled`,`취소됨`)},$z=new Set([`queued`,`waiting`,`starting`,`running`,`paused`]),eB=()=>({order:[],tasks:{},after:0});function tB(e,t){if(!t||typeof t!=`object`)return e;let n=Number.isFinite(t.eventSeq)?Math.max(e.after,t.eventSeq):e.after,r=(t,r)=>{let i=e.tasks[t];if(!i&&!r.title)return{...e,after:n};let a={notes:[],...i,...r,taskId:t};return{...e,after:n,order:i?e.order:[...e.order,t],tasks:{...e.tasks,[t]:a}}},i=(t,i)=>e.tasks[t]?r(t,{notes:[...e.tasks[t].notes,i].slice(-4)}):{...e,after:n};if(t.type===`task.sceneChanged`)return i(t.taskId,B(`The scene changed during a reload: ${t.keys.join(`, `)}`,`새로고침 중에 장면이 바뀜: ${t.keys.join(`, `)}`));if(t.type===`task.userEdit`)return i(t.taskId,B(`You changed ${t.keys.join(`, `)}; the task reads it again`,`${t.keys.join(`, `)}을(를) 직접 바꿈: 작업이 다시 읽어요`));if(t.type===`task.undone`)return e.tasks[t.taskId]?r(t.taskId,{undone:!0}):e;if(typeof t.type==`string`&&t.type.startsWith(`task.`)&&t.taskId&&t.status){let{type:e,at:n,eventSeq:i,...a}=t;return r(t.taskId,{...a,...e===`task.started`||e===`task.resumed`?{progress:``}:{}})}return{...e,after:n}}function nB(e,t=[]){return t.reduce((e,t)=>e.tasks[t.taskId]?e:tB(e,{type:`task.seed`,...t}),e)}function rB(e,t=e=>e.name){return e?.type===`tool.start`?t(e):e?.type===`error`?B(`Error: ${e.message??e.code}`,`오류: ${e.message??e.code}`):null}function iB(e){let t=/(?:waits for|held by) task \S+ \((.+)\)/.exec(String(e??``))?.[1];return t?B(`Starts after "${t}"`,`'${t}' 끝나면 시작`):/scope is held/.test(String(e??``))?B(`Starts when another task frees its part`,`다른 작업이 끝나면 시작`):e??``}function aB(e){return e.status===`running`?e.progress||B(`Working…`,`작업 중…`):e.status===`done`?e.undone?B(`Undone`,`되돌림`):String(e.summary?.reply??``).split(/(?<=[.!?。])\s/)[0]||Qz.done:e.reason?iB(e.reason):Qz[e.status]??e.status}var oB={timeline:B(`timeline`,`타임라인`),stage:B(`stage`,`무대`),scene:B(`scene`,`장면`),object:B(`object`,`오브젝트`),character:B(`character`,`캐릭터`),shot:B(`shot`,`샷`)},sB=e=>oB[String(e).split(`:`)[0]]??String(e);function cB(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`:$z.has(r.status)||r.status===`review`?`waiting`:`done`].push(r)}return t}var lB=e=>(e??[]).filter(e=>e.kind===`tool`&&[`dispatch_task`,`dispatch_plan`].includes(e.name)).flatMap(e=>e.name===`dispatch_plan`?e.result?.tasks??[]:[e.result]).map(e=>e?.taskId??e?.duplicateOf).filter(Boolean);function uB(){let e={board:eB(),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 dB=uB(),fB=e=>Number.isFinite(e?.cost)&&e.cost>0?`$${e.cost.toFixed(2)}`:``;function pB(e,t){let n=e=>(e??[]).filter(e=>e?.taskId===t).length;return{waiting:n(e?.waiting),running:n(e?.running)}}function mB(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 hB({fetchImpl:e=globalThis.fetch?.bind(globalThis),url:t=NL}={}){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=vz(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{YL as $,A as $i,tl as $n,or as $r,dN as $t,RR as A,Ze as Ai,ST as An,W as Ar,fI as At,qz as B,Mn as Bi,Tu as Bn,Ta as Br,hI as Bt,kz as C,Ln as Ci,tE as Cn,no as Cr,DP as Ct,Az as D,qe as Di,RT as Dn,q as Dr,FF as Dt,Gz as E,zn as Ei,BT as En,J as Er,LF as Et,tz as F,tt as Fi,gg as Fn,Wa as Fr,aI as Ft,uz as G,ie as Gi,Fl as Gn,na as Gr,ON as Gt,iz as H,On as Hi,Hl as Hn,Oa as Hr,SP as Ht,nz as I,kn as Ii,vg as In,Ga as Ir,_I as It,sR as J,Ce as Ji,fl as Jn,Hi as Jr,AN as Jt,cR as K,we as Ki,El as Kn,ua as Kr,DN as Kt,qR as L,Ft as Li,Nh as Ln,eo as Lr,XF as Lt,hz as M,Ut as Mi,Xw as Mn,to as Mr,vI as Mt,IR as N,$e as Ni,ab as Nn,Ia as Nr,MF as Nt,_z as O,Ke as Oi,zT as On,ho as Or,YF as Ot,LR as P,En as Pi,hg as Pn,Za as Pr,mI as Pt,gR as Q,ee as Qi,al as Qn,Qr,hN as Qt,QR as R,et as Ri,ku as Rn,Ca as Rr,pI as Rt,jR as S,In as Si,XT as Sn,Y as Sr,EP as St,Jz as T,Rn as Ti,rE as Tn,go as Tr,NF as Tt,$R as U,Dn as Ui,Rl as Un,Aa as Ur,gP as Ut,rz as V,An as Vi,Gl as Vn,ka as Vr,CP as Vt,XR as W,ge as Wi,Pl as Wn,ga as Wr,HN as Wt,yR as X,b as Xi,il as Xn,wi as Xr,yN as Xt,_R as Y,Te as Yi,ol as Yn,Ui as Yr,kN as Yt,lR as Z,y as Zi,rl as Zn,yi as Zr,mN as Zt,iB as _,tr as _i,GT as _n,As as _r,QI as _t,fB as a,g as aa,hr as ai,KA as an,Jc as ar,IL as at,dz as b,Kn as bi,eE as bn,X as br,OI as bt,eB as c,i as ca,rr as ci,Bk as cn,Xc as cr,BL as ct,tB as d,n as da,nr as di,UT as dn,Zc as dr,YI as dt,k as ea,gr as ei,uN as en,ml as er,JL as et,mB as f,Xn as fi,VT as fn,Hc as fr,JI as ft,aB as g,ar as gi,IT as gn,qc as gr,uL as gt,Zz as h,Bn as hi,QT as hn,Bc as hr,$I as ht,pB as i,_ as ia,Sr as ii,WA as in,Yc as ir,RL as it,az as j,Je as ji,bT as jn,U as jr,qF as jt,BR as k,Lt as ki,vT as kn,Z as kr,nI as kt,rB as l,a as la,Un as li,Yk as ln,zc as lr,jL as lt,nB as m,Gn as mi,ZT as mn,Rc as mr,qI as mt,Qz as n,u as na,mr as ni,oN as nn,dl as nr,QL as nt,hB as o,v as oa,yr as oi,mA as on,$c as or,PL as ot,sB as p,Hn as pi,$T as pn,Qc as pr,KI as pt,aR as q,Se as qi,pl as qn,Ri as qr,EN as qt,cB as r,h as ra,xr as ri,XM as rn,Vc as rr,XL as rt,lB as s,c as sa,ir as si,pA as sn,Uc as sr,zL as st,$z as t,l as ta,_r as ti,iN as tn,yl as tr,ZL as tt,Xz as u,o as ua,Vn as ui,cE as un,Wc as ur,_L as ut,dB as v,Yn as vi,nE as vn,cs as vr,jI as vt,JR as w,B as wi,WT as wn,G as wr,gI as wt,PR as x,qn as xi,LT as xn,H as xr,AI as xt,AR as y,Jn as yi,YT as yn,Co as yr,kI as yt,YR as z,Nn as zi,Eu as zn,xa as zr,DI as zt};