@weppy/roblox-mcp 2.13.0 → 2.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dashboard/dist/assets/{AssetsPage-CV9wxK10.js → AssetsPage-D2V0I3vJ.js} +1 -1
  3. package/dashboard/dist/assets/{ChangelogDetailPage-gpaNW7UJ.js → ChangelogDetailPage-Blm2KD_v.js} +1 -1
  4. package/dashboard/dist/assets/{ChangelogPage-DKIsatBF.js → ChangelogPage-3W6oNyob.js} +1 -1
  5. package/dashboard/dist/assets/{ConfirmModal-reOnA0XQ.js → ConfirmModal-D0J2TdvP.js} +1 -1
  6. package/dashboard/dist/assets/{ConnectionPage-oMLfhLWb.js → ConnectionPage-BRMJY695.js} +1 -1
  7. package/dashboard/dist/assets/{ControlsPage-Y8OiNJre.js → ControlsPage-Bsvd6IMH.js} +1 -1
  8. package/dashboard/dist/assets/{CurrentPlaceScope-7RO-JoyN.js → CurrentPlaceScope-Cf6Ul4of.js} +1 -1
  9. package/dashboard/dist/assets/{GameChangeDetail-D07BEk9j.js → GameChangeDetail-WiUFqrAr.js} +1 -1
  10. package/dashboard/dist/assets/{InfoLabel-mGrfFfvs.js → InfoLabel-DUnzLQMx.js} +1 -1
  11. package/dashboard/dist/assets/{OverviewPage-BRwPqjqA.js → OverviewPage-CN7-ORIn.js} +1 -1
  12. package/dashboard/dist/assets/{PageHeader-CKFvQ2T_.js → PageHeader-Bp67sdNa.js} +1 -1
  13. package/dashboard/dist/assets/{PlaytestPage-C00WHKjP.js → PlaytestPage-BkXd5qVL.js} +1 -1
  14. package/dashboard/dist/assets/{SettingsPage-Camuqp3Q.js → SettingsPage-DcuPwNrv.js} +1 -1
  15. package/dashboard/dist/assets/{StatusBadge-BuYWRuwX.js → StatusBadge-Dww3HZdU.js} +1 -1
  16. package/dashboard/dist/assets/{SyncPage-pGT5Kghx.js → SyncPage-BPoKRe2z.js} +1 -1
  17. package/dashboard/dist/assets/{Tabs-Bzvy3UJR.js → Tabs-COiFxn38.js} +1 -1
  18. package/dashboard/dist/assets/{ToolsPage-B31Hx606.js → ToolsPage-B3j9RnJM.js} +1 -1
  19. package/dashboard/dist/assets/{TooltipText-Vj0LEsyy.js → TooltipText-dbQ6BSkp.js} +1 -1
  20. package/dashboard/dist/assets/{UiPrimitive-tKQal2XA.js → UiPrimitive-iWZdGr_k.js} +1 -1
  21. package/dashboard/dist/assets/{UiStudioPage-Dtp8HLCl.js → UiStudioPage-BJDqOz5h.js} +1 -1
  22. package/dashboard/dist/assets/{WhatsNewPage-BGcnIkzC.js → WhatsNewPage-CQaXn8pK.js} +1 -1
  23. package/dashboard/dist/assets/{copy-DHQ0v8nJ.js → copy-BkVzYP8s.js} +1 -1
  24. package/dashboard/dist/assets/{index-CahJTtjv.js → index-O8KXvp28.js} +70 -182
  25. package/dashboard/dist/assets/{sample-requests-C1hU0rd2.js → sample-requests-CnK8aw_2.js} +1 -1
  26. package/dashboard/dist/assets/{useLiveUptime-CcseIxAd.js → useLiveUptime-dbgoJqzy.js} +1 -1
  27. package/dashboard/dist/assets/{useSettings-CZEc0yGK.js → useSettings-q3UtZNG2.js} +1 -1
  28. package/dashboard/dist/index.html +1 -1
  29. package/dist/index.js +1 -1
  30. package/package.json +1 -1
  31. package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-BRwPqjqA.js","assets/InfoLabel-mGrfFfvs.js","assets/PageHeader-CKFvQ2T_.js","assets/UiPrimitive-tKQal2XA.js","assets/UiPrimitive-BMSNRGwI.css","assets/PageHeader-CV_rjuG8.css","assets/StatusBadge-BuYWRuwX.js","assets/StatusBadge-C2zYt5iE.css","assets/TooltipText-Vj0LEsyy.js","assets/GameChangeDetail-D07BEk9j.js","assets/GameChangeDetail-C1XtdYwk.css","assets/useLiveUptime-CcseIxAd.js","assets/OverviewPage-Dsfl-NRT.css","assets/ConnectionPage-oMLfhLWb.js","assets/ConfirmModal-reOnA0XQ.js","assets/ConfirmModal.module-DJksQHBd.js","assets/ConfirmModal-uqFW3py_.css","assets/copy-DHQ0v8nJ.js","assets/ConnectionPage-Ca5WLCm3.css","assets/SyncPage-pGT5Kghx.js","assets/CurrentPlaceScope-7RO-JoyN.js","assets/CurrentPlaceScope-D-0g0WrM.css","assets/SyncPage-BnVXEQel.css","assets/AssetsPage-CV9wxK10.js","assets/AssetsPage-BVUpssWN.css","assets/ChangelogPage-DKIsatBF.js","assets/Tabs-Bzvy3UJR.js","assets/Tabs-CIszXeoU.css","assets/ChangelogPage-DsP0fTsc.css","assets/PlaytestPage-C00WHKjP.js","assets/PlaytestPage-CVEtQ4dU.css","assets/UiStudioPage-Dtp8HLCl.js","assets/sample-requests-C1hU0rd2.js","assets/sample-requests-DmUwqmFE.css","assets/UiStudioPage-LH2dcLkr.css","assets/ToolsPage-B31Hx606.js","assets/ToolsPage-CAaH9fIQ.css","assets/ControlsPage-Y8OiNJre.js","assets/useSettings-CZEc0yGK.js","assets/useSettings-BNH9ENDy.css","assets/WhatsNewPage-BGcnIkzC.js","assets/WhatsNewPage-wF04BABp.css","assets/ChangelogDetailPage-gpaNW7UJ.js","assets/ChangelogDetailPage-vGgnpq1q.css","assets/SettingsPage-Camuqp3Q.js","assets/SettingsPage-BR71s-WH.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-CN7-ORIn.js","assets/InfoLabel-DUnzLQMx.js","assets/PageHeader-Bp67sdNa.js","assets/UiPrimitive-iWZdGr_k.js","assets/UiPrimitive-BMSNRGwI.css","assets/PageHeader-CV_rjuG8.css","assets/StatusBadge-Dww3HZdU.js","assets/StatusBadge-C2zYt5iE.css","assets/TooltipText-dbQ6BSkp.js","assets/GameChangeDetail-WiUFqrAr.js","assets/GameChangeDetail-C1XtdYwk.css","assets/useLiveUptime-dbgoJqzy.js","assets/OverviewPage-Dsfl-NRT.css","assets/ConnectionPage-BRMJY695.js","assets/ConfirmModal-D0J2TdvP.js","assets/ConfirmModal.module-DJksQHBd.js","assets/ConfirmModal-uqFW3py_.css","assets/copy-BkVzYP8s.js","assets/ConnectionPage-Ca5WLCm3.css","assets/SyncPage-BPoKRe2z.js","assets/CurrentPlaceScope-Cf6Ul4of.js","assets/CurrentPlaceScope-D-0g0WrM.css","assets/SyncPage-BnVXEQel.css","assets/AssetsPage-D2V0I3vJ.js","assets/AssetsPage-BVUpssWN.css","assets/ChangelogPage-3W6oNyob.js","assets/Tabs-COiFxn38.js","assets/Tabs-CIszXeoU.css","assets/ChangelogPage-DsP0fTsc.css","assets/PlaytestPage-BkXd5qVL.js","assets/PlaytestPage-CVEtQ4dU.css","assets/UiStudioPage-BJDqOz5h.js","assets/sample-requests-CnK8aw_2.js","assets/sample-requests-DmUwqmFE.css","assets/UiStudioPage-LH2dcLkr.css","assets/ToolsPage-B3j9RnJM.js","assets/ToolsPage-CAaH9fIQ.css","assets/ControlsPage-Bsvd6IMH.js","assets/useSettings-q3UtZNG2.js","assets/useSettings-BNH9ENDy.css","assets/WhatsNewPage-CQaXn8pK.js","assets/WhatsNewPage-wF04BABp.css","assets/ChangelogDetailPage-Blm2KD_v.js","assets/ChangelogDetailPage-vGgnpq1q.css","assets/SettingsPage-DcuPwNrv.js","assets/SettingsPage-BR71s-WH.css"])))=>i.map(i=>d[i]);
2
2
  var Th=Object.defineProperty;var Lh=(i,n,r)=>n in i?Th(i,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):i[n]=r;var Io=(i,n,r)=>Lh(i,typeof n!="symbol"?n+"":n,r);function mp(i,n){for(var r=0;r<n.length;r++){const d=n[r];if(typeof d!="string"&&!Array.isArray(d)){for(const u in d)if(u!=="default"&&!(u in i)){const p=Object.getOwnPropertyDescriptor(d,u);p&&Object.defineProperty(i,u,p.get?p:{enumerable:!0,get:()=>d[u]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))d(u);new MutationObserver(u=>{for(const p of u)if(p.type==="childList")for(const g of p.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&d(g)}).observe(document,{childList:!0,subtree:!0});function r(u){const p={};return u.integrity&&(p.integrity=u.integrity),u.referrerPolicy&&(p.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?p.credentials="include":u.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function d(u){if(u.ep)return;u.ep=!0;const p=r(u);fetch(u.href,p)}})();function yp(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var bl={exports:{}},es={},Pl={exports:{}},Re={};/**
3
3
  * @license React
4
4
  * react.production.min.js
@@ -7,7 +7,7 @@ var Th=Object.defineProperty;var Lh=(i,n,r)=>n in i?Th(i,n,{enumerable:!0,config
7
7
  *
8
8
  * This source code is licensed under the MIT license found in the
9
9
  * LICENSE file in the root directory of this source tree.
10
- */var wc;function zh(){if(wc)return Re;wc=1;var i=Symbol.for("react.element"),n=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),g=Symbol.for("react.context"),y=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),C=Symbol.for("react.lazy"),P=Symbol.iterator;function D(w){return w===null||typeof w!="object"?null:(w=P&&w[P]||w["@@iterator"],typeof w=="function"?w:null)}var L={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},B=Object.assign,U={};function N(w,z,ye){this.props=w,this.context=z,this.refs=U,this.updater=ye||L}N.prototype.isReactComponent={},N.prototype.setState=function(w,z){if(typeof w!="object"&&typeof w!="function"&&w!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,w,z,"setState")},N.prototype.forceUpdate=function(w){this.updater.enqueueForceUpdate(this,w,"forceUpdate")};function le(){}le.prototype=N.prototype;function W(w,z,ye){this.props=w,this.context=z,this.refs=U,this.updater=ye||L}var oe=W.prototype=new le;oe.constructor=W,B(oe,N.prototype),oe.isPureReactComponent=!0;var V=Array.isArray,pe=Object.prototype.hasOwnProperty,De={current:null},j={key:!0,ref:!0,__self:!0,__source:!0};function $(w,z,ye){var K,ae={},ue=null,Pe=null;if(z!=null)for(K in z.ref!==void 0&&(Pe=z.ref),z.key!==void 0&&(ue=""+z.key),z)pe.call(z,K)&&!j.hasOwnProperty(K)&&(ae[K]=z[K]);var xe=arguments.length-2;if(xe===1)ae.children=ye;else if(1<xe){for(var Le=Array(xe),gt=0;gt<xe;gt++)Le[gt]=arguments[gt+2];ae.children=Le}if(w&&w.defaultProps)for(K in xe=w.defaultProps,xe)ae[K]===void 0&&(ae[K]=xe[K]);return{$$typeof:i,type:w,key:ue,ref:Pe,props:ae,_owner:De.current}}function Se(w,z){return{$$typeof:i,type:w.type,key:z,ref:w.ref,props:w.props,_owner:w._owner}}function ce(w){return typeof w=="object"&&w!==null&&w.$$typeof===i}function Te(w){var z={"=":"=0",":":"=2"};return"$"+w.replace(/[=:]/g,function(ye){return z[ye]})}var we=/\/+/g;function ke(w,z){return typeof w=="object"&&w!==null&&w.key!=null?Te(""+w.key):z.toString(36)}function He(w,z,ye,K,ae){var ue=typeof w;(ue==="undefined"||ue==="boolean")&&(w=null);var Pe=!1;if(w===null)Pe=!0;else switch(ue){case"string":case"number":Pe=!0;break;case"object":switch(w.$$typeof){case i:case n:Pe=!0}}if(Pe)return Pe=w,ae=ae(Pe),w=K===""?"."+ke(Pe,0):K,V(ae)?(ye="",w!=null&&(ye=w.replace(we,"$&/")+"/"),He(ae,z,ye,"",function(gt){return gt})):ae!=null&&(ce(ae)&&(ae=Se(ae,ye+(!ae.key||Pe&&Pe.key===ae.key?"":(""+ae.key).replace(we,"$&/")+"/")+w)),z.push(ae)),1;if(Pe=0,K=K===""?".":K+":",V(w))for(var xe=0;xe<w.length;xe++){ue=w[xe];var Le=K+ke(ue,xe);Pe+=He(ue,z,ye,Le,ae)}else if(Le=D(w),typeof Le=="function")for(w=Le.call(w),xe=0;!(ue=w.next()).done;)ue=ue.value,Le=K+ke(ue,xe++),Pe+=He(ue,z,ye,Le,ae);else if(ue==="object")throw z=String(w),Error("Objects are not valid as a React child (found: "+(z==="[object Object]"?"object with keys {"+Object.keys(w).join(", ")+"}":z)+"). If you meant to render a collection of children, use an array instead.");return Pe}function et(w,z,ye){if(w==null)return w;var K=[],ae=0;return He(w,K,"","",function(ue){return z.call(ye,ue,ae++)}),K}function ot(w){if(w._status===-1){var z=w._result;z=z(),z.then(function(ye){(w._status===0||w._status===-1)&&(w._status=1,w._result=ye)},function(ye){(w._status===0||w._status===-1)&&(w._status=2,w._result=ye)}),w._status===-1&&(w._status=0,w._result=z)}if(w._status===1)return w._result.default;throw w._result}var _e={current:null},O={transition:null},de={ReactCurrentDispatcher:_e,ReactCurrentBatchConfig:O,ReactCurrentOwner:De};function G(){throw Error("act(...) is not supported in production builds of React.")}return Re.Children={map:et,forEach:function(w,z,ye){et(w,function(){z.apply(this,arguments)},ye)},count:function(w){var z=0;return et(w,function(){z++}),z},toArray:function(w){return et(w,function(z){return z})||[]},only:function(w){if(!ce(w))throw Error("React.Children.only expected to receive a single React element child.");return w}},Re.Component=N,Re.Fragment=r,Re.Profiler=u,Re.PureComponent=W,Re.StrictMode=d,Re.Suspense=h,Re.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=de,Re.act=G,Re.cloneElement=function(w,z,ye){if(w==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+w+".");var K=B({},w.props),ae=w.key,ue=w.ref,Pe=w._owner;if(z!=null){if(z.ref!==void 0&&(ue=z.ref,Pe=De.current),z.key!==void 0&&(ae=""+z.key),w.type&&w.type.defaultProps)var xe=w.type.defaultProps;for(Le in z)pe.call(z,Le)&&!j.hasOwnProperty(Le)&&(K[Le]=z[Le]===void 0&&xe!==void 0?xe[Le]:z[Le])}var Le=arguments.length-2;if(Le===1)K.children=ye;else if(1<Le){xe=Array(Le);for(var gt=0;gt<Le;gt++)xe[gt]=arguments[gt+2];K.children=xe}return{$$typeof:i,type:w.type,key:ae,ref:ue,props:K,_owner:Pe}},Re.createContext=function(w){return w={$$typeof:g,_currentValue:w,_currentValue2:w,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},w.Provider={$$typeof:p,_context:w},w.Consumer=w},Re.createElement=$,Re.createFactory=function(w){var z=$.bind(null,w);return z.type=w,z},Re.createRef=function(){return{current:null}},Re.forwardRef=function(w){return{$$typeof:y,render:w}},Re.isValidElement=ce,Re.lazy=function(w){return{$$typeof:C,_payload:{_status:-1,_result:w},_init:ot}},Re.memo=function(w,z){return{$$typeof:v,type:w,compare:z===void 0?null:z}},Re.startTransition=function(w){var z=O.transition;O.transition={};try{w()}finally{O.transition=z}},Re.unstable_act=G,Re.useCallback=function(w,z){return _e.current.useCallback(w,z)},Re.useContext=function(w){return _e.current.useContext(w)},Re.useDebugValue=function(){},Re.useDeferredValue=function(w){return _e.current.useDeferredValue(w)},Re.useEffect=function(w,z){return _e.current.useEffect(w,z)},Re.useId=function(){return _e.current.useId()},Re.useImperativeHandle=function(w,z,ye){return _e.current.useImperativeHandle(w,z,ye)},Re.useInsertionEffect=function(w,z){return _e.current.useInsertionEffect(w,z)},Re.useLayoutEffect=function(w,z){return _e.current.useLayoutEffect(w,z)},Re.useMemo=function(w,z){return _e.current.useMemo(w,z)},Re.useReducer=function(w,z,ye){return _e.current.useReducer(w,z,ye)},Re.useRef=function(w){return _e.current.useRef(w)},Re.useState=function(w){return _e.current.useState(w)},Re.useSyncExternalStore=function(w,z,ye){return _e.current.useSyncExternalStore(w,z,ye)},Re.useTransition=function(){return _e.current.useTransition()},Re.version="18.3.1",Re}var kc;function Fl(){return kc||(kc=1,Pl.exports=zh()),Pl.exports}/**
10
+ */var Cc;function zh(){if(Cc)return Re;Cc=1;var i=Symbol.for("react.element"),n=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),g=Symbol.for("react.context"),y=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),w=Symbol.for("react.lazy"),P=Symbol.iterator;function D(C){return C===null||typeof C!="object"?null:(C=P&&C[P]||C["@@iterator"],typeof C=="function"?C:null)}var L={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},B=Object.assign,U={};function _(C,z,ye){this.props=C,this.context=z,this.refs=U,this.updater=ye||L}_.prototype.isReactComponent={},_.prototype.setState=function(C,z){if(typeof C!="object"&&typeof C!="function"&&C!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,C,z,"setState")},_.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function le(){}le.prototype=_.prototype;function W(C,z,ye){this.props=C,this.context=z,this.refs=U,this.updater=ye||L}var oe=W.prototype=new le;oe.constructor=W,B(oe,_.prototype),oe.isPureReactComponent=!0;var V=Array.isArray,pe=Object.prototype.hasOwnProperty,De={current:null},j={key:!0,ref:!0,__self:!0,__source:!0};function X(C,z,ye){var K,ae={},ue=null,Pe=null;if(z!=null)for(K in z.ref!==void 0&&(Pe=z.ref),z.key!==void 0&&(ue=""+z.key),z)pe.call(z,K)&&!j.hasOwnProperty(K)&&(ae[K]=z[K]);var xe=arguments.length-2;if(xe===1)ae.children=ye;else if(1<xe){for(var Le=Array(xe),gt=0;gt<xe;gt++)Le[gt]=arguments[gt+2];ae.children=Le}if(C&&C.defaultProps)for(K in xe=C.defaultProps,xe)ae[K]===void 0&&(ae[K]=xe[K]);return{$$typeof:i,type:C,key:ue,ref:Pe,props:ae,_owner:De.current}}function Se(C,z){return{$$typeof:i,type:C.type,key:z,ref:C.ref,props:C.props,_owner:C._owner}}function ce(C){return typeof C=="object"&&C!==null&&C.$$typeof===i}function Te(C){var z={"=":"=0",":":"=2"};return"$"+C.replace(/[=:]/g,function(ye){return z[ye]})}var Ce=/\/+/g;function ke(C,z){return typeof C=="object"&&C!==null&&C.key!=null?Te(""+C.key):z.toString(36)}function Me(C,z,ye,K,ae){var ue=typeof C;(ue==="undefined"||ue==="boolean")&&(C=null);var Pe=!1;if(C===null)Pe=!0;else switch(ue){case"string":case"number":Pe=!0;break;case"object":switch(C.$$typeof){case i:case n:Pe=!0}}if(Pe)return Pe=C,ae=ae(Pe),C=K===""?"."+ke(Pe,0):K,V(ae)?(ye="",C!=null&&(ye=C.replace(Ce,"$&/")+"/"),Me(ae,z,ye,"",function(gt){return gt})):ae!=null&&(ce(ae)&&(ae=Se(ae,ye+(!ae.key||Pe&&Pe.key===ae.key?"":(""+ae.key).replace(Ce,"$&/")+"/")+C)),z.push(ae)),1;if(Pe=0,K=K===""?".":K+":",V(C))for(var xe=0;xe<C.length;xe++){ue=C[xe];var Le=K+ke(ue,xe);Pe+=Me(ue,z,ye,Le,ae)}else if(Le=D(C),typeof Le=="function")for(C=Le.call(C),xe=0;!(ue=C.next()).done;)ue=ue.value,Le=K+ke(ue,xe++),Pe+=Me(ue,z,ye,Le,ae);else if(ue==="object")throw z=String(C),Error("Objects are not valid as a React child (found: "+(z==="[object Object]"?"object with keys {"+Object.keys(C).join(", ")+"}":z)+"). If you meant to render a collection of children, use an array instead.");return Pe}function et(C,z,ye){if(C==null)return C;var K=[],ae=0;return Me(C,K,"","",function(ue){return z.call(ye,ue,ae++)}),K}function ot(C){if(C._status===-1){var z=C._result;z=z(),z.then(function(ye){(C._status===0||C._status===-1)&&(C._status=1,C._result=ye)},function(ye){(C._status===0||C._status===-1)&&(C._status=2,C._result=ye)}),C._status===-1&&(C._status=0,C._result=z)}if(C._status===1)return C._result.default;throw C._result}var Ne={current:null},O={transition:null},de={ReactCurrentDispatcher:Ne,ReactCurrentBatchConfig:O,ReactCurrentOwner:De};function G(){throw Error("act(...) is not supported in production builds of React.")}return Re.Children={map:et,forEach:function(C,z,ye){et(C,function(){z.apply(this,arguments)},ye)},count:function(C){var z=0;return et(C,function(){z++}),z},toArray:function(C){return et(C,function(z){return z})||[]},only:function(C){if(!ce(C))throw Error("React.Children.only expected to receive a single React element child.");return C}},Re.Component=_,Re.Fragment=r,Re.Profiler=u,Re.PureComponent=W,Re.StrictMode=d,Re.Suspense=h,Re.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=de,Re.act=G,Re.cloneElement=function(C,z,ye){if(C==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+C+".");var K=B({},C.props),ae=C.key,ue=C.ref,Pe=C._owner;if(z!=null){if(z.ref!==void 0&&(ue=z.ref,Pe=De.current),z.key!==void 0&&(ae=""+z.key),C.type&&C.type.defaultProps)var xe=C.type.defaultProps;for(Le in z)pe.call(z,Le)&&!j.hasOwnProperty(Le)&&(K[Le]=z[Le]===void 0&&xe!==void 0?xe[Le]:z[Le])}var Le=arguments.length-2;if(Le===1)K.children=ye;else if(1<Le){xe=Array(Le);for(var gt=0;gt<Le;gt++)xe[gt]=arguments[gt+2];K.children=xe}return{$$typeof:i,type:C.type,key:ae,ref:ue,props:K,_owner:Pe}},Re.createContext=function(C){return C={$$typeof:g,_currentValue:C,_currentValue2:C,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},C.Provider={$$typeof:p,_context:C},C.Consumer=C},Re.createElement=X,Re.createFactory=function(C){var z=X.bind(null,C);return z.type=C,z},Re.createRef=function(){return{current:null}},Re.forwardRef=function(C){return{$$typeof:y,render:C}},Re.isValidElement=ce,Re.lazy=function(C){return{$$typeof:w,_payload:{_status:-1,_result:C},_init:ot}},Re.memo=function(C,z){return{$$typeof:v,type:C,compare:z===void 0?null:z}},Re.startTransition=function(C){var z=O.transition;O.transition={};try{C()}finally{O.transition=z}},Re.unstable_act=G,Re.useCallback=function(C,z){return Ne.current.useCallback(C,z)},Re.useContext=function(C){return Ne.current.useContext(C)},Re.useDebugValue=function(){},Re.useDeferredValue=function(C){return Ne.current.useDeferredValue(C)},Re.useEffect=function(C,z){return Ne.current.useEffect(C,z)},Re.useId=function(){return Ne.current.useId()},Re.useImperativeHandle=function(C,z,ye){return Ne.current.useImperativeHandle(C,z,ye)},Re.useInsertionEffect=function(C,z){return Ne.current.useInsertionEffect(C,z)},Re.useLayoutEffect=function(C,z){return Ne.current.useLayoutEffect(C,z)},Re.useMemo=function(C,z){return Ne.current.useMemo(C,z)},Re.useReducer=function(C,z,ye){return Ne.current.useReducer(C,z,ye)},Re.useRef=function(C){return Ne.current.useRef(C)},Re.useState=function(C){return Ne.current.useState(C)},Re.useSyncExternalStore=function(C,z,ye){return Ne.current.useSyncExternalStore(C,z,ye)},Re.useTransition=function(){return Ne.current.useTransition()},Re.version="18.3.1",Re}var kc;function Fl(){return kc||(kc=1,Pl.exports=zh()),Pl.exports}/**
11
11
  * @license React
12
12
  * react-jsx-runtime.production.min.js
13
13
  *
@@ -15,7 +15,7 @@ var Th=Object.defineProperty;var Lh=(i,n,r)=>n in i?Th(i,n,{enumerable:!0,config
15
15
  *
16
16
  * This source code is licensed under the MIT license found in the
17
17
  * LICENSE file in the root directory of this source tree.
18
- */var xc;function Uh(){if(xc)return es;xc=1;var i=Fl(),n=Symbol.for("react.element"),r=Symbol.for("react.fragment"),d=Object.prototype.hasOwnProperty,u=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function g(y,h,v){var C,P={},D=null,L=null;v!==void 0&&(D=""+v),h.key!==void 0&&(D=""+h.key),h.ref!==void 0&&(L=h.ref);for(C in h)d.call(h,C)&&!p.hasOwnProperty(C)&&(P[C]=h[C]);if(y&&y.defaultProps)for(C in h=y.defaultProps,h)P[C]===void 0&&(P[C]=h[C]);return{$$typeof:n,type:y,key:D,ref:L,props:P,_owner:u.current}}return es.Fragment=r,es.jsx=g,es.jsxs=g,es}var Rc;function Mh(){return Rc||(Rc=1,bl.exports=Uh()),bl.exports}var x=Mh(),wn={},Cl={exports:{}},It={},wl={exports:{}},kl={};/**
18
+ */var xc;function Uh(){if(xc)return es;xc=1;var i=Fl(),n=Symbol.for("react.element"),r=Symbol.for("react.fragment"),d=Object.prototype.hasOwnProperty,u=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function g(y,h,v){var w,P={},D=null,L=null;v!==void 0&&(D=""+v),h.key!==void 0&&(D=""+h.key),h.ref!==void 0&&(L=h.ref);for(w in h)d.call(h,w)&&!p.hasOwnProperty(w)&&(P[w]=h[w]);if(y&&y.defaultProps)for(w in h=y.defaultProps,h)P[w]===void 0&&(P[w]=h[w]);return{$$typeof:n,type:y,key:D,ref:L,props:P,_owner:u.current}}return es.Fragment=r,es.jsx=g,es.jsxs=g,es}var Rc;function Hh(){return Rc||(Rc=1,bl.exports=Uh()),bl.exports}var x=Hh(),Cn={},wl={exports:{}},It={},Cl={exports:{}},kl={};/**
19
19
  * @license React
20
20
  * scheduler.production.min.js
21
21
  *
@@ -23,7 +23,7 @@ var Th=Object.defineProperty;var Lh=(i,n,r)=>n in i?Th(i,n,{enumerable:!0,config
23
23
  *
24
24
  * This source code is licensed under the MIT license found in the
25
25
  * LICENSE file in the root directory of this source tree.
26
- */var Ac;function Hh(){return Ac||(Ac=1,(function(i){function n(O,de){var G=O.length;O.push(de);e:for(;0<G;){var w=G-1>>>1,z=O[w];if(0<u(z,de))O[w]=de,O[G]=z,G=w;else break e}}function r(O){return O.length===0?null:O[0]}function d(O){if(O.length===0)return null;var de=O[0],G=O.pop();if(G!==de){O[0]=G;e:for(var w=0,z=O.length,ye=z>>>1;w<ye;){var K=2*(w+1)-1,ae=O[K],ue=K+1,Pe=O[ue];if(0>u(ae,G))ue<z&&0>u(Pe,ae)?(O[w]=Pe,O[ue]=G,w=ue):(O[w]=ae,O[K]=G,w=K);else if(ue<z&&0>u(Pe,G))O[w]=Pe,O[ue]=G,w=ue;else break e}}return de}function u(O,de){var G=O.sortIndex-de.sortIndex;return G!==0?G:O.id-de.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;i.unstable_now=function(){return p.now()}}else{var g=Date,y=g.now();i.unstable_now=function(){return g.now()-y}}var h=[],v=[],C=1,P=null,D=3,L=!1,B=!1,U=!1,N=typeof setTimeout=="function"?setTimeout:null,le=typeof clearTimeout=="function"?clearTimeout:null,W=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function oe(O){for(var de=r(v);de!==null;){if(de.callback===null)d(v);else if(de.startTime<=O)d(v),de.sortIndex=de.expirationTime,n(h,de);else break;de=r(v)}}function V(O){if(U=!1,oe(O),!B)if(r(h)!==null)B=!0,ot(pe);else{var de=r(v);de!==null&&_e(V,de.startTime-O)}}function pe(O,de){B=!1,U&&(U=!1,le($),$=-1),L=!0;var G=D;try{for(oe(de),P=r(h);P!==null&&(!(P.expirationTime>de)||O&&!Te());){var w=P.callback;if(typeof w=="function"){P.callback=null,D=P.priorityLevel;var z=w(P.expirationTime<=de);de=i.unstable_now(),typeof z=="function"?P.callback=z:P===r(h)&&d(h),oe(de)}else d(h);P=r(h)}if(P!==null)var ye=!0;else{var K=r(v);K!==null&&_e(V,K.startTime-de),ye=!1}return ye}finally{P=null,D=G,L=!1}}var De=!1,j=null,$=-1,Se=5,ce=-1;function Te(){return!(i.unstable_now()-ce<Se)}function we(){if(j!==null){var O=i.unstable_now();ce=O;var de=!0;try{de=j(!0,O)}finally{de?ke():(De=!1,j=null)}}else De=!1}var ke;if(typeof W=="function")ke=function(){W(we)};else if(typeof MessageChannel<"u"){var He=new MessageChannel,et=He.port2;He.port1.onmessage=we,ke=function(){et.postMessage(null)}}else ke=function(){N(we,0)};function ot(O){j=O,De||(De=!0,ke())}function _e(O,de){$=N(function(){O(i.unstable_now())},de)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(O){O.callback=null},i.unstable_continueExecution=function(){B||L||(B=!0,ot(pe))},i.unstable_forceFrameRate=function(O){0>O||125<O?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):Se=0<O?Math.floor(1e3/O):5},i.unstable_getCurrentPriorityLevel=function(){return D},i.unstable_getFirstCallbackNode=function(){return r(h)},i.unstable_next=function(O){switch(D){case 1:case 2:case 3:var de=3;break;default:de=D}var G=D;D=de;try{return O()}finally{D=G}},i.unstable_pauseExecution=function(){},i.unstable_requestPaint=function(){},i.unstable_runWithPriority=function(O,de){switch(O){case 1:case 2:case 3:case 4:case 5:break;default:O=3}var G=D;D=O;try{return de()}finally{D=G}},i.unstable_scheduleCallback=function(O,de,G){var w=i.unstable_now();switch(typeof G=="object"&&G!==null?(G=G.delay,G=typeof G=="number"&&0<G?w+G:w):G=w,O){case 1:var z=-1;break;case 2:z=250;break;case 5:z=1073741823;break;case 4:z=1e4;break;default:z=5e3}return z=G+z,O={id:C++,callback:de,priorityLevel:O,startTime:G,expirationTime:z,sortIndex:-1},G>w?(O.sortIndex=G,n(v,O),r(h)===null&&O===r(v)&&(U?(le($),$=-1):U=!0,_e(V,G-w))):(O.sortIndex=z,n(h,O),B||L||(B=!0,ot(pe))),O},i.unstable_shouldYield=Te,i.unstable_wrapCallback=function(O){var de=D;return function(){var G=D;D=de;try{return O.apply(this,arguments)}finally{D=G}}}})(kl)),kl}var Ic;function _h(){return Ic||(Ic=1,wl.exports=Hh()),wl.exports}/**
26
+ */var Ac;function Mh(){return Ac||(Ac=1,(function(i){function n(O,de){var G=O.length;O.push(de);e:for(;0<G;){var C=G-1>>>1,z=O[C];if(0<u(z,de))O[C]=de,O[G]=z,G=C;else break e}}function r(O){return O.length===0?null:O[0]}function d(O){if(O.length===0)return null;var de=O[0],G=O.pop();if(G!==de){O[0]=G;e:for(var C=0,z=O.length,ye=z>>>1;C<ye;){var K=2*(C+1)-1,ae=O[K],ue=K+1,Pe=O[ue];if(0>u(ae,G))ue<z&&0>u(Pe,ae)?(O[C]=Pe,O[ue]=G,C=ue):(O[C]=ae,O[K]=G,C=K);else if(ue<z&&0>u(Pe,G))O[C]=Pe,O[ue]=G,C=ue;else break e}}return de}function u(O,de){var G=O.sortIndex-de.sortIndex;return G!==0?G:O.id-de.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;i.unstable_now=function(){return p.now()}}else{var g=Date,y=g.now();i.unstable_now=function(){return g.now()-y}}var h=[],v=[],w=1,P=null,D=3,L=!1,B=!1,U=!1,_=typeof setTimeout=="function"?setTimeout:null,le=typeof clearTimeout=="function"?clearTimeout:null,W=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function oe(O){for(var de=r(v);de!==null;){if(de.callback===null)d(v);else if(de.startTime<=O)d(v),de.sortIndex=de.expirationTime,n(h,de);else break;de=r(v)}}function V(O){if(U=!1,oe(O),!B)if(r(h)!==null)B=!0,ot(pe);else{var de=r(v);de!==null&&Ne(V,de.startTime-O)}}function pe(O,de){B=!1,U&&(U=!1,le(X),X=-1),L=!0;var G=D;try{for(oe(de),P=r(h);P!==null&&(!(P.expirationTime>de)||O&&!Te());){var C=P.callback;if(typeof C=="function"){P.callback=null,D=P.priorityLevel;var z=C(P.expirationTime<=de);de=i.unstable_now(),typeof z=="function"?P.callback=z:P===r(h)&&d(h),oe(de)}else d(h);P=r(h)}if(P!==null)var ye=!0;else{var K=r(v);K!==null&&Ne(V,K.startTime-de),ye=!1}return ye}finally{P=null,D=G,L=!1}}var De=!1,j=null,X=-1,Se=5,ce=-1;function Te(){return!(i.unstable_now()-ce<Se)}function Ce(){if(j!==null){var O=i.unstable_now();ce=O;var de=!0;try{de=j(!0,O)}finally{de?ke():(De=!1,j=null)}}else De=!1}var ke;if(typeof W=="function")ke=function(){W(Ce)};else if(typeof MessageChannel<"u"){var Me=new MessageChannel,et=Me.port2;Me.port1.onmessage=Ce,ke=function(){et.postMessage(null)}}else ke=function(){_(Ce,0)};function ot(O){j=O,De||(De=!0,ke())}function Ne(O,de){X=_(function(){O(i.unstable_now())},de)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(O){O.callback=null},i.unstable_continueExecution=function(){B||L||(B=!0,ot(pe))},i.unstable_forceFrameRate=function(O){0>O||125<O?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):Se=0<O?Math.floor(1e3/O):5},i.unstable_getCurrentPriorityLevel=function(){return D},i.unstable_getFirstCallbackNode=function(){return r(h)},i.unstable_next=function(O){switch(D){case 1:case 2:case 3:var de=3;break;default:de=D}var G=D;D=de;try{return O()}finally{D=G}},i.unstable_pauseExecution=function(){},i.unstable_requestPaint=function(){},i.unstable_runWithPriority=function(O,de){switch(O){case 1:case 2:case 3:case 4:case 5:break;default:O=3}var G=D;D=O;try{return de()}finally{D=G}},i.unstable_scheduleCallback=function(O,de,G){var C=i.unstable_now();switch(typeof G=="object"&&G!==null?(G=G.delay,G=typeof G=="number"&&0<G?C+G:C):G=C,O){case 1:var z=-1;break;case 2:z=250;break;case 5:z=1073741823;break;case 4:z=1e4;break;default:z=5e3}return z=G+z,O={id:w++,callback:de,priorityLevel:O,startTime:G,expirationTime:z,sortIndex:-1},G>C?(O.sortIndex=G,n(v,O),r(h)===null&&O===r(v)&&(U?(le(X),X=-1):U=!0,Ne(V,G-C))):(O.sortIndex=z,n(h,O),B||L||(B=!0,ot(pe))),O},i.unstable_shouldYield=Te,i.unstable_wrapCallback=function(O){var de=D;return function(){var G=D;D=de;try{return O.apply(this,arguments)}finally{D=G}}}})(kl)),kl}var Ic;function Nh(){return Ic||(Ic=1,Cl.exports=Mh()),Cl.exports}/**
27
27
  * @license React
28
28
  * react-dom.production.min.js
29
29
  *
@@ -31,14 +31,14 @@ var Th=Object.defineProperty;var Lh=(i,n,r)=>n in i?Th(i,n,{enumerable:!0,config
31
31
  *
32
32
  * This source code is licensed under the MIT license found in the
33
33
  * LICENSE file in the root directory of this source tree.
34
- */var Dc;function Nh(){if(Dc)return It;Dc=1;var i=Fl(),n=_h();function r(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,o=1;o<arguments.length;o++)t+="&args[]="+encodeURIComponent(arguments[o]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var d=new Set,u={};function p(e,t){g(e,t),g(e+"Capture",t)}function g(e,t){for(u[e]=t,e=0;e<t.length;e++)d.add(t[e])}var y=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),h=Object.prototype.hasOwnProperty,v=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,C={},P={};function D(e){return h.call(P,e)?!0:h.call(C,e)?!1:v.test(e)?P[e]=!0:(C[e]=!0,!1)}function L(e,t,o,a){if(o!==null&&o.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return a?!1:o!==null?!o.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function B(e,t,o,a){if(t===null||typeof t>"u"||L(e,t,o,a))return!0;if(a)return!1;if(o!==null)switch(o.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function U(e,t,o,a,s,l,c){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=a,this.attributeNamespace=s,this.mustUseProperty=o,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=c}var N={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){N[e]=new U(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];N[t]=new U(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){N[e]=new U(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){N[e]=new U(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){N[e]=new U(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){N[e]=new U(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){N[e]=new U(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){N[e]=new U(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){N[e]=new U(e,5,!1,e.toLowerCase(),null,!1,!1)});var le=/[\-:]([a-z])/g;function W(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(le,W);N[t]=new U(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(le,W);N[t]=new U(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(le,W);N[t]=new U(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){N[e]=new U(e,1,!1,e.toLowerCase(),null,!1,!1)}),N.xlinkHref=new U("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){N[e]=new U(e,1,!1,e.toLowerCase(),null,!0,!0)});function oe(e,t,o,a){var s=N.hasOwnProperty(t)?N[t]:null;(s!==null?s.type!==0:a||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(B(t,o,s,a)&&(o=null),a||s===null?D(t)&&(o===null?e.removeAttribute(t):e.setAttribute(t,""+o)):s.mustUseProperty?e[s.propertyName]=o===null?s.type===3?!1:"":o:(t=s.attributeName,a=s.attributeNamespace,o===null?e.removeAttribute(t):(s=s.type,o=s===3||s===4&&o===!0?"":""+o,a?e.setAttributeNS(a,t,o):e.setAttribute(t,o))))}var V=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,pe=Symbol.for("react.element"),De=Symbol.for("react.portal"),j=Symbol.for("react.fragment"),$=Symbol.for("react.strict_mode"),Se=Symbol.for("react.profiler"),ce=Symbol.for("react.provider"),Te=Symbol.for("react.context"),we=Symbol.for("react.forward_ref"),ke=Symbol.for("react.suspense"),He=Symbol.for("react.suspense_list"),et=Symbol.for("react.memo"),ot=Symbol.for("react.lazy"),_e=Symbol.for("react.offscreen"),O=Symbol.iterator;function de(e){return e===null||typeof e!="object"?null:(e=O&&e[O]||e["@@iterator"],typeof e=="function"?e:null)}var G=Object.assign,w;function z(e){if(w===void 0)try{throw Error()}catch(o){var t=o.stack.trim().match(/\n( *(at )?)/);w=t&&t[1]||""}return`
35
- `+w+e}var ye=!1;function K(e,t){if(!e||ye)return"";ye=!0;var o=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(E){var a=E}Reflect.construct(e,[],t)}else{try{t.call()}catch(E){a=E}e.call(t.prototype)}else{try{throw Error()}catch(E){a=E}e()}}catch(E){if(E&&a&&typeof E.stack=="string"){for(var s=E.stack.split(`
34
+ */var Dc;function _h(){if(Dc)return It;Dc=1;var i=Fl(),n=Nh();function r(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,o=1;o<arguments.length;o++)t+="&args[]="+encodeURIComponent(arguments[o]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var d=new Set,u={};function p(e,t){g(e,t),g(e+"Capture",t)}function g(e,t){for(u[e]=t,e=0;e<t.length;e++)d.add(t[e])}var y=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),h=Object.prototype.hasOwnProperty,v=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,w={},P={};function D(e){return h.call(P,e)?!0:h.call(w,e)?!1:v.test(e)?P[e]=!0:(w[e]=!0,!1)}function L(e,t,o,a){if(o!==null&&o.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return a?!1:o!==null?!o.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function B(e,t,o,a){if(t===null||typeof t>"u"||L(e,t,o,a))return!0;if(a)return!1;if(o!==null)switch(o.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function U(e,t,o,a,s,l,c){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=a,this.attributeNamespace=s,this.mustUseProperty=o,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=c}var _={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){_[e]=new U(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];_[t]=new U(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){_[e]=new U(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){_[e]=new U(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){_[e]=new U(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){_[e]=new U(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){_[e]=new U(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){_[e]=new U(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){_[e]=new U(e,5,!1,e.toLowerCase(),null,!1,!1)});var le=/[\-:]([a-z])/g;function W(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(le,W);_[t]=new U(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(le,W);_[t]=new U(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(le,W);_[t]=new U(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){_[e]=new U(e,1,!1,e.toLowerCase(),null,!1,!1)}),_.xlinkHref=new U("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){_[e]=new U(e,1,!1,e.toLowerCase(),null,!0,!0)});function oe(e,t,o,a){var s=_.hasOwnProperty(t)?_[t]:null;(s!==null?s.type!==0:a||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(B(t,o,s,a)&&(o=null),a||s===null?D(t)&&(o===null?e.removeAttribute(t):e.setAttribute(t,""+o)):s.mustUseProperty?e[s.propertyName]=o===null?s.type===3?!1:"":o:(t=s.attributeName,a=s.attributeNamespace,o===null?e.removeAttribute(t):(s=s.type,o=s===3||s===4&&o===!0?"":""+o,a?e.setAttributeNS(a,t,o):e.setAttribute(t,o))))}var V=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,pe=Symbol.for("react.element"),De=Symbol.for("react.portal"),j=Symbol.for("react.fragment"),X=Symbol.for("react.strict_mode"),Se=Symbol.for("react.profiler"),ce=Symbol.for("react.provider"),Te=Symbol.for("react.context"),Ce=Symbol.for("react.forward_ref"),ke=Symbol.for("react.suspense"),Me=Symbol.for("react.suspense_list"),et=Symbol.for("react.memo"),ot=Symbol.for("react.lazy"),Ne=Symbol.for("react.offscreen"),O=Symbol.iterator;function de(e){return e===null||typeof e!="object"?null:(e=O&&e[O]||e["@@iterator"],typeof e=="function"?e:null)}var G=Object.assign,C;function z(e){if(C===void 0)try{throw Error()}catch(o){var t=o.stack.trim().match(/\n( *(at )?)/);C=t&&t[1]||""}return`
35
+ `+C+e}var ye=!1;function K(e,t){if(!e||ye)return"";ye=!0;var o=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(E){var a=E}Reflect.construct(e,[],t)}else{try{t.call()}catch(E){a=E}e.call(t.prototype)}else{try{throw Error()}catch(E){a=E}e()}}catch(E){if(E&&a&&typeof E.stack=="string"){for(var s=E.stack.split(`
36
36
  `),l=a.stack.split(`
37
37
  `),c=s.length-1,m=l.length-1;1<=c&&0<=m&&s[c]!==l[m];)m--;for(;1<=c&&0<=m;c--,m--)if(s[c]!==l[m]){if(c!==1||m!==1)do if(c--,m--,0>m||s[c]!==l[m]){var S=`
38
- `+s[c].replace(" at new "," at ");return e.displayName&&S.includes("<anonymous>")&&(S=S.replace("<anonymous>",e.displayName)),S}while(1<=c&&0<=m);break}}}finally{ye=!1,Error.prepareStackTrace=o}return(e=e?e.displayName||e.name:"")?z(e):""}function ae(e){switch(e.tag){case 5:return z(e.type);case 16:return z("Lazy");case 13:return z("Suspense");case 19:return z("SuspenseList");case 0:case 2:case 15:return e=K(e.type,!1),e;case 11:return e=K(e.type.render,!1),e;case 1:return e=K(e.type,!0),e;default:return""}}function ue(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case j:return"Fragment";case De:return"Portal";case Se:return"Profiler";case $:return"StrictMode";case ke:return"Suspense";case He:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Te:return(e.displayName||"Context")+".Consumer";case ce:return(e._context.displayName||"Context")+".Provider";case we:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case et:return t=e.displayName||null,t!==null?t:ue(e.type)||"Memo";case ot:t=e._payload,e=e._init;try{return ue(e(t))}catch{}}return null}function Pe(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ue(t);case 8:return t===$?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function xe(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Le(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function gt(e){var t=Le(e)?"checked":"value",o=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof o<"u"&&typeof o.get=="function"&&typeof o.set=="function"){var s=o.get,l=o.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(c){a=""+c,l.call(this,c)}}),Object.defineProperty(e,t,{enumerable:o.enumerable}),{getValue:function(){return a},setValue:function(c){a=""+c},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function yo(e){e._valueTracker||(e._valueTracker=gt(e))}function dt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var o=t.getValue(),a="";return e&&(a=Le(e)?e.checked?"true":"false":e.value),e=a,e!==o?(t.setValue(e),!0):!1}function Yt(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function La(e,t){var o=t.checked;return G({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:o??e._wrapperState.initialChecked})}function cs(e,t){var o=t.defaultValue==null?"":t.defaultValue,a=t.checked!=null?t.checked:t.defaultChecked;o=xe(t.value!=null?t.value:o),e._wrapperState={initialChecked:a,initialValue:o,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function io(e,t){t=t.checked,t!=null&&oe(e,"checked",t,!1)}function gi(e,t){io(e,t);var o=xe(t.value),a=t.type;if(o!=null)a==="number"?(o===0&&e.value===""||e.value!=o)&&(e.value=""+o):e.value!==""+o&&(e.value=""+o);else if(a==="submit"||a==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?za(e,t.type,o):t.hasOwnProperty("defaultValue")&&za(e,t.type,xe(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ps(e,t,o){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!(a!=="submit"&&a!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,o||t===e.value||(e.value=t),e.defaultValue=t}o=e.name,o!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,o!==""&&(e.name=o)}function za(e,t,o){(t!=="number"||Yt(e.ownerDocument)!==e)&&(o==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+o&&(e.defaultValue=""+o))}var la=Array.isArray;function zo(e,t,o,a){if(e=e.options,t){t={};for(var s=0;s<o.length;s++)t["$"+o[s]]=!0;for(o=0;o<e.length;o++)s=t.hasOwnProperty("$"+e[o].value),e[o].selected!==s&&(e[o].selected=s),s&&a&&(e[o].defaultSelected=!0)}else{for(o=""+xe(o),t=null,s=0;s<e.length;s++){if(e[s].value===o){e[s].selected=!0,a&&(e[s].defaultSelected=!0);return}t!==null||e[s].disabled||(t=e[s])}t!==null&&(t.selected=!0)}}function hi(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(r(91));return G({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function gs(e,t){var o=t.value;if(o==null){if(o=t.children,t=t.defaultValue,o!=null){if(t!=null)throw Error(r(92));if(la(o)){if(1<o.length)throw Error(r(93));o=o[0]}t=o}t==null&&(t=""),o=t}e._wrapperState={initialValue:xe(o)}}function so(e,t){var o=xe(t.value),a=xe(t.defaultValue);o!=null&&(o=""+o,o!==e.value&&(e.value=o),t.defaultValue==null&&e.defaultValue!==o&&(e.defaultValue=o)),a!=null&&(e.defaultValue=""+a)}function Uo(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function mi(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function da(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?mi(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Et,Ht=(function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,o,a,s){MSApp.execUnsafeLocalFunction(function(){return e(t,o,a,s)})}:e})(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Et=Et||document.createElement("div"),Et.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Et.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Mo(e,t){if(t){var o=e.firstChild;if(o&&o===e.lastChild&&o.nodeType===3){o.nodeValue=t;return}}e.textContent=t}var no={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Nn=["Webkit","ms","Moz","O"];Object.keys(no).forEach(function(e){Nn.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),no[t]=no[e]})});function Gt(e,t,o){return t==null||typeof t=="boolean"||t===""?"":o||typeof t!="number"||t===0||no.hasOwnProperty(e)&&no[e]?(""+t).trim():t+"px"}function yi(e,t){e=e.style;for(var o in t)if(t.hasOwnProperty(o)){var a=o.indexOf("--")===0,s=Gt(o,t[o],a);o==="float"&&(o="cssFloat"),a?e.setProperty(o,s):e[o]=s}}var hs=G({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ua(e,t){if(t){if(hs[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!="object")throw Error(r(62))}}function fi(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ma=null;function Ho(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ha=null,ro=null,lo=null;function ms(e){if(e=Ni(e)){if(typeof Ha!="function")throw Error(r(280));var t=e.stateNode;t&&(t=Hs(t),Ha(e.stateNode,e.type,t))}}function Si(e){ro?lo?lo.push(e):lo=[e]:ro=e}function ys(){if(ro){var e=ro,t=lo;if(lo=ro=null,ms(e),t)for(e=0;e<t.length;e++)ms(t[e])}}function vi(e,t){return e(t)}function ua(){}var _o=!1;function fs(e,t,o){if(_o)return e(t,o);_o=!0;try{return vi(e,t,o)}finally{_o=!1,(ro!==null||lo!==null)&&(ua(),ys())}}function ca(e,t){var o=e.stateNode;if(o===null)return null;var a=Hs(o);if(a===null)return null;o=a[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(a=!a.disabled)||(e=e.type,a=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!a;break e;default:e=!1}if(e)return null;if(o&&typeof o!="function")throw Error(r(231,t,typeof o));return o}var f=!1;if(y)try{var k={};Object.defineProperty(k,"passive",{get:function(){f=!0}}),window.addEventListener("test",k,k),window.removeEventListener("test",k,k)}catch{f=!1}function T(e,t,o,a,s,l,c,m,S){var E=Array.prototype.slice.call(arguments,3);try{t.apply(o,E)}catch(_){this.onError(_)}}var M=!1,Y=null,re=!1,me=null,ee={onError:function(e){M=!0,Y=e}};function ie(e,t,o,a,s,l,c,m,S){M=!1,Y=null,T.apply(ee,arguments)}function Q(e,t,o,a,s,l,c,m,S){if(ie.apply(this,arguments),M){if(M){var E=Y;M=!1,Y=null}else throw Error(r(198));re||(re=!0,me=E)}}function J(e){var t=e,o=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(o=t.return),e=t.return;while(e)}return t.tag===3?o:null}function ve(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Ae(e){if(J(e)!==e)throw Error(r(188))}function nt(e){var t=e.alternate;if(!t){if(t=J(e),t===null)throw Error(r(188));return t!==e?null:e}for(var o=e,a=t;;){var s=o.return;if(s===null)break;var l=s.alternate;if(l===null){if(a=s.return,a!==null){o=a;continue}break}if(s.child===l.child){for(l=s.child;l;){if(l===o)return Ae(s),e;if(l===a)return Ae(s),t;l=l.sibling}throw Error(r(188))}if(o.return!==a.return)o=s,a=l;else{for(var c=!1,m=s.child;m;){if(m===o){c=!0,o=s,a=l;break}if(m===a){c=!0,a=s,o=l;break}m=m.sibling}if(!c){for(m=l.child;m;){if(m===o){c=!0,o=l,a=s;break}if(m===a){c=!0,a=l,o=s;break}m=m.sibling}if(!c)throw Error(r(189))}}if(o.alternate!==a)throw Error(r(190))}if(o.tag!==3)throw Error(r(188));return o.stateNode.current===o?e:t}function Ne(e){return e=nt(e),e!==null?je(e):null}function je(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=je(e);if(t!==null)return t;e=e.sibling}return null}var Ve=n.unstable_scheduleCallback,fo=n.unstable_cancelCallback,pa=n.unstable_shouldYield,Xt=n.unstable_requestPaint,ze=n.unstable_now,bi=n.unstable_getCurrentPriorityLevel,So=n.unstable_ImmediatePriority,uo=n.unstable_UserBlockingPriority,vo=n.unstable_NormalPriority,_a=n.unstable_LowPriority,Ie=n.unstable_IdlePriority,Be=null,ht=null;function ga(e){if(ht&&typeof ht.onCommitFiberRoot=="function")try{ht.onCommitFiberRoot(Be,e,void 0,(e.current.flags&128)===128)}catch{}}var Ue=Math.clz32?Math.clz32:On,No=Math.log,Ss=Math.LN2;function On(e){return e>>>=0,e===0?32:31-(No(e)/Ss|0)|0}var vs=64,bs=4194304;function Pi(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Ps(e,t){var o=e.pendingLanes;if(o===0)return 0;var a=0,s=e.suspendedLanes,l=e.pingedLanes,c=o&268435455;if(c!==0){var m=c&~s;m!==0?a=Pi(m):(l&=c,l!==0&&(a=Pi(l)))}else c=o&~s,c!==0?a=Pi(c):l!==0&&(a=Pi(l));if(a===0)return 0;if(t!==0&&t!==a&&(t&s)===0&&(s=a&-a,l=t&-t,s>=l||s===16&&(l&4194240)!==0))return t;if((a&4)!==0&&(a|=o&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=a;0<t;)o=31-Ue(t),s=1<<o,a|=e[o],t&=~s;return a}function Qp(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Zp(e,t){for(var o=e.suspendedLanes,a=e.pingedLanes,s=e.expirationTimes,l=e.pendingLanes;0<l;){var c=31-Ue(l),m=1<<c,S=s[c];S===-1?((m&o)===0||(m&a)!==0)&&(s[c]=Qp(m,t)):S<=t&&(e.expiredLanes|=m),l&=~m}}function qn(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function ed(){var e=vs;return vs<<=1,(vs&4194240)===0&&(vs=64),e}function Bn(e){for(var t=[],o=0;31>o;o++)t.push(e);return t}function Ci(e,t,o){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ue(t),e[t]=o}function Jp(e,t){var o=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var a=e.eventTimes;for(e=e.expirationTimes;0<o;){var s=31-Ue(o),l=1<<s;t[s]=0,a[s]=-1,e[s]=-1,o&=~l}}function Wn(e,t){var o=e.entangledLanes|=t;for(e=e.entanglements;o;){var a=31-Ue(o),s=1<<a;s&t|e[a]&t&&(e[a]|=t),o&=~s}}var Oe=0;function td(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var od,Fn,ad,id,sd,Kn=!1,Cs=[],Oo=null,qo=null,Bo=null,wi=new Map,ki=new Map,Wo=[],eg="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function nd(e,t){switch(e){case"focusin":case"focusout":Oo=null;break;case"dragenter":case"dragleave":qo=null;break;case"mouseover":case"mouseout":Bo=null;break;case"pointerover":case"pointerout":wi.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ki.delete(t.pointerId)}}function xi(e,t,o,a,s,l){return e===null||e.nativeEvent!==l?(e={blockedOn:t,domEventName:o,eventSystemFlags:a,nativeEvent:l,targetContainers:[s]},t!==null&&(t=Ni(t),t!==null&&Fn(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,s!==null&&t.indexOf(s)===-1&&t.push(s),e)}function tg(e,t,o,a,s){switch(t){case"focusin":return Oo=xi(Oo,e,t,o,a,s),!0;case"dragenter":return qo=xi(qo,e,t,o,a,s),!0;case"mouseover":return Bo=xi(Bo,e,t,o,a,s),!0;case"pointerover":var l=s.pointerId;return wi.set(l,xi(wi.get(l)||null,e,t,o,a,s)),!0;case"gotpointercapture":return l=s.pointerId,ki.set(l,xi(ki.get(l)||null,e,t,o,a,s)),!0}return!1}function rd(e){var t=ha(e.target);if(t!==null){var o=J(t);if(o!==null){if(t=o.tag,t===13){if(t=ve(o),t!==null){e.blockedOn=t,sd(e.priority,function(){ad(o)});return}}else if(t===3&&o.stateNode.current.memoizedState.isDehydrated){e.blockedOn=o.tag===3?o.stateNode.containerInfo:null;return}}}e.blockedOn=null}function ws(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var o=Yn(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(o===null){o=e.nativeEvent;var a=new o.constructor(o.type,o);Ma=a,o.target.dispatchEvent(a),Ma=null}else return t=Ni(o),t!==null&&Fn(t),e.blockedOn=o,!1;t.shift()}return!0}function ld(e,t,o){ws(e)&&o.delete(t)}function og(){Kn=!1,Oo!==null&&ws(Oo)&&(Oo=null),qo!==null&&ws(qo)&&(qo=null),Bo!==null&&ws(Bo)&&(Bo=null),wi.forEach(ld),ki.forEach(ld)}function Ri(e,t){e.blockedOn===t&&(e.blockedOn=null,Kn||(Kn=!0,n.unstable_scheduleCallback(n.unstable_NormalPriority,og)))}function Ai(e){function t(s){return Ri(s,e)}if(0<Cs.length){Ri(Cs[0],e);for(var o=1;o<Cs.length;o++){var a=Cs[o];a.blockedOn===e&&(a.blockedOn=null)}}for(Oo!==null&&Ri(Oo,e),qo!==null&&Ri(qo,e),Bo!==null&&Ri(Bo,e),wi.forEach(t),ki.forEach(t),o=0;o<Wo.length;o++)a=Wo[o],a.blockedOn===e&&(a.blockedOn=null);for(;0<Wo.length&&(o=Wo[0],o.blockedOn===null);)rd(o),o.blockedOn===null&&Wo.shift()}var Na=V.ReactCurrentBatchConfig,ks=!0;function ag(e,t,o,a){var s=Oe,l=Na.transition;Na.transition=null;try{Oe=1,Vn(e,t,o,a)}finally{Oe=s,Na.transition=l}}function ig(e,t,o,a){var s=Oe,l=Na.transition;Na.transition=null;try{Oe=4,Vn(e,t,o,a)}finally{Oe=s,Na.transition=l}}function Vn(e,t,o,a){if(ks){var s=Yn(e,t,o,a);if(s===null)ur(e,t,a,xs,o),nd(e,a);else if(tg(s,e,t,o,a))a.stopPropagation();else if(nd(e,a),t&4&&-1<eg.indexOf(e)){for(;s!==null;){var l=Ni(s);if(l!==null&&od(l),l=Yn(e,t,o,a),l===null&&ur(e,t,a,xs,o),l===s)break;s=l}s!==null&&a.stopPropagation()}else ur(e,t,a,null,o)}}var xs=null;function Yn(e,t,o,a){if(xs=null,e=Ho(a),e=ha(e),e!==null)if(t=J(e),t===null)e=null;else if(o=t.tag,o===13){if(e=ve(t),e!==null)return e;e=null}else if(o===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return xs=e,null}function dd(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(bi()){case So:return 1;case uo:return 4;case vo:case _a:return 16;case Ie:return 536870912;default:return 16}default:return 16}}var Fo=null,Gn=null,Rs=null;function ud(){if(Rs)return Rs;var e,t=Gn,o=t.length,a,s="value"in Fo?Fo.value:Fo.textContent,l=s.length;for(e=0;e<o&&t[e]===s[e];e++);var c=o-e;for(a=1;a<=c&&t[o-a]===s[l-a];a++);return Rs=s.slice(e,1<a?1-a:void 0)}function As(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Is(){return!0}function cd(){return!1}function Tt(e){function t(o,a,s,l,c){this._reactName=o,this._targetInst=s,this.type=a,this.nativeEvent=l,this.target=c,this.currentTarget=null;for(var m in e)e.hasOwnProperty(m)&&(o=e[m],this[m]=o?o(l):l[m]);return this.isDefaultPrevented=(l.defaultPrevented!=null?l.defaultPrevented:l.returnValue===!1)?Is:cd,this.isPropagationStopped=cd,this}return G(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var o=this.nativeEvent;o&&(o.preventDefault?o.preventDefault():typeof o.returnValue!="unknown"&&(o.returnValue=!1),this.isDefaultPrevented=Is)},stopPropagation:function(){var o=this.nativeEvent;o&&(o.stopPropagation?o.stopPropagation():typeof o.cancelBubble!="unknown"&&(o.cancelBubble=!0),this.isPropagationStopped=Is)},persist:function(){},isPersistent:Is}),t}var Oa={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Xn=Tt(Oa),Ii=G({},Oa,{view:0,detail:0}),sg=Tt(Ii),$n,Qn,Di,Ds=G({},Ii,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Jn,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Di&&(Di&&e.type==="mousemove"?($n=e.screenX-Di.screenX,Qn=e.screenY-Di.screenY):Qn=$n=0,Di=e),$n)},movementY:function(e){return"movementY"in e?e.movementY:Qn}}),pd=Tt(Ds),ng=G({},Ds,{dataTransfer:0}),rg=Tt(ng),lg=G({},Ii,{relatedTarget:0}),Zn=Tt(lg),dg=G({},Oa,{animationName:0,elapsedTime:0,pseudoElement:0}),ug=Tt(dg),cg=G({},Oa,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),pg=Tt(cg),gg=G({},Oa,{data:0}),gd=Tt(gg),hg={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},mg={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},yg={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function fg(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=yg[e])?!!t[e]:!1}function Jn(){return fg}var Sg=G({},Ii,{key:function(e){if(e.key){var t=hg[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=As(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?mg[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Jn,charCode:function(e){return e.type==="keypress"?As(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?As(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),vg=Tt(Sg),bg=G({},Ds,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),hd=Tt(bg),Pg=G({},Ii,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Jn}),Cg=Tt(Pg),wg=G({},Oa,{propertyName:0,elapsedTime:0,pseudoElement:0}),kg=Tt(wg),xg=G({},Ds,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Rg=Tt(xg),Ag=[9,13,27,32],er=y&&"CompositionEvent"in window,ji=null;y&&"documentMode"in document&&(ji=document.documentMode);var Ig=y&&"TextEvent"in window&&!ji,md=y&&(!er||ji&&8<ji&&11>=ji),yd=" ",fd=!1;function Sd(e,t){switch(e){case"keyup":return Ag.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function vd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qa=!1;function Dg(e,t){switch(e){case"compositionend":return vd(t);case"keypress":return t.which!==32?null:(fd=!0,yd);case"textInput":return e=t.data,e===yd&&fd?null:e;default:return null}}function jg(e,t){if(qa)return e==="compositionend"||!er&&Sd(e,t)?(e=ud(),Rs=Gn=Fo=null,qa=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return md&&t.locale!=="ko"?null:t.data;default:return null}}var Eg={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function bd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!Eg[e.type]:t==="textarea"}function Pd(e,t,o,a){Si(a),t=zs(t,"onChange"),0<t.length&&(o=new Xn("onChange","change",null,o,a),e.push({event:o,listeners:t}))}var Ei=null,Ti=null;function Tg(e){Nd(e,0)}function js(e){var t=Va(e);if(dt(t))return e}function Lg(e,t){if(e==="change")return t}var Cd=!1;if(y){var tr;if(y){var or="oninput"in document;if(!or){var wd=document.createElement("div");wd.setAttribute("oninput","return;"),or=typeof wd.oninput=="function"}tr=or}else tr=!1;Cd=tr&&(!document.documentMode||9<document.documentMode)}function kd(){Ei&&(Ei.detachEvent("onpropertychange",xd),Ti=Ei=null)}function xd(e){if(e.propertyName==="value"&&js(Ti)){var t=[];Pd(t,Ti,e,Ho(e)),fs(Tg,t)}}function zg(e,t,o){e==="focusin"?(kd(),Ei=t,Ti=o,Ei.attachEvent("onpropertychange",xd)):e==="focusout"&&kd()}function Ug(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return js(Ti)}function Mg(e,t){if(e==="click")return js(t)}function Hg(e,t){if(e==="input"||e==="change")return js(t)}function _g(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var $t=typeof Object.is=="function"?Object.is:_g;function Li(e,t){if($t(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var o=Object.keys(e),a=Object.keys(t);if(o.length!==a.length)return!1;for(a=0;a<o.length;a++){var s=o[a];if(!h.call(t,s)||!$t(e[s],t[s]))return!1}return!0}function Rd(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Ad(e,t){var o=Rd(e);e=0;for(var a;o;){if(o.nodeType===3){if(a=e+o.textContent.length,e<=t&&a>=t)return{node:o,offset:t-e};e=a}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=Rd(o)}}function Id(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Id(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dd(){for(var e=window,t=Yt();t instanceof e.HTMLIFrameElement;){try{var o=typeof t.contentWindow.location.href=="string"}catch{o=!1}if(o)e=t.contentWindow;else break;t=Yt(e.document)}return t}function ar(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Ng(e){var t=Dd(),o=e.focusedElem,a=e.selectionRange;if(t!==o&&o&&o.ownerDocument&&Id(o.ownerDocument.documentElement,o)){if(a!==null&&ar(o)){if(t=a.start,e=a.end,e===void 0&&(e=t),"selectionStart"in o)o.selectionStart=t,o.selectionEnd=Math.min(e,o.value.length);else if(e=(t=o.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var s=o.textContent.length,l=Math.min(a.start,s);a=a.end===void 0?l:Math.min(a.end,s),!e.extend&&l>a&&(s=a,a=l,l=s),s=Ad(o,l);var c=Ad(o,a);s&&c&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==c.node||e.focusOffset!==c.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),l>a?(e.addRange(t),e.extend(c.node,c.offset)):(t.setEnd(c.node,c.offset),e.addRange(t)))}}for(t=[],e=o;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;o<t.length;o++)e=t[o],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var Og=y&&"documentMode"in document&&11>=document.documentMode,Ba=null,ir=null,zi=null,sr=!1;function jd(e,t,o){var a=o.window===o?o.document:o.nodeType===9?o:o.ownerDocument;sr||Ba==null||Ba!==Yt(a)||(a=Ba,"selectionStart"in a&&ar(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),zi&&Li(zi,a)||(zi=a,a=zs(ir,"onSelect"),0<a.length&&(t=new Xn("onSelect","select",null,t,o),e.push({event:t,listeners:a}),t.target=Ba)))}function Es(e,t){var o={};return o[e.toLowerCase()]=t.toLowerCase(),o["Webkit"+e]="webkit"+t,o["Moz"+e]="moz"+t,o}var Wa={animationend:Es("Animation","AnimationEnd"),animationiteration:Es("Animation","AnimationIteration"),animationstart:Es("Animation","AnimationStart"),transitionend:Es("Transition","TransitionEnd")},nr={},Ed={};y&&(Ed=document.createElement("div").style,"AnimationEvent"in window||(delete Wa.animationend.animation,delete Wa.animationiteration.animation,delete Wa.animationstart.animation),"TransitionEvent"in window||delete Wa.transitionend.transition);function Ts(e){if(nr[e])return nr[e];if(!Wa[e])return e;var t=Wa[e],o;for(o in t)if(t.hasOwnProperty(o)&&o in Ed)return nr[e]=t[o];return e}var Td=Ts("animationend"),Ld=Ts("animationiteration"),zd=Ts("animationstart"),Ud=Ts("transitionend"),Md=new Map,Hd="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Ko(e,t){Md.set(e,t),p(t,[e])}for(var rr=0;rr<Hd.length;rr++){var lr=Hd[rr],qg=lr.toLowerCase(),Bg=lr[0].toUpperCase()+lr.slice(1);Ko(qg,"on"+Bg)}Ko(Td,"onAnimationEnd"),Ko(Ld,"onAnimationIteration"),Ko(zd,"onAnimationStart"),Ko("dblclick","onDoubleClick"),Ko("focusin","onFocus"),Ko("focusout","onBlur"),Ko(Ud,"onTransitionEnd"),g("onMouseEnter",["mouseout","mouseover"]),g("onMouseLeave",["mouseout","mouseover"]),g("onPointerEnter",["pointerout","pointerover"]),g("onPointerLeave",["pointerout","pointerover"]),p("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),p("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),p("onBeforeInput",["compositionend","keypress","textInput","paste"]),p("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ui="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Wg=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ui));function _d(e,t,o){var a=e.type||"unknown-event";e.currentTarget=o,Q(a,t,void 0,e),e.currentTarget=null}function Nd(e,t){t=(t&4)!==0;for(var o=0;o<e.length;o++){var a=e[o],s=a.event;a=a.listeners;e:{var l=void 0;if(t)for(var c=a.length-1;0<=c;c--){var m=a[c],S=m.instance,E=m.currentTarget;if(m=m.listener,S!==l&&s.isPropagationStopped())break e;_d(s,m,E),l=S}else for(c=0;c<a.length;c++){if(m=a[c],S=m.instance,E=m.currentTarget,m=m.listener,S!==l&&s.isPropagationStopped())break e;_d(s,m,E),l=S}}}if(re)throw e=me,re=!1,me=null,e}function Ye(e,t){var o=t[yr];o===void 0&&(o=t[yr]=new Set);var a=e+"__bubble";o.has(a)||(Od(t,e,2,!1),o.add(a))}function dr(e,t,o){var a=0;t&&(a|=4),Od(o,e,a,t)}var Ls="_reactListening"+Math.random().toString(36).slice(2);function Mi(e){if(!e[Ls]){e[Ls]=!0,d.forEach(function(o){o!=="selectionchange"&&(Wg.has(o)||dr(o,!1,e),dr(o,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Ls]||(t[Ls]=!0,dr("selectionchange",!1,t))}}function Od(e,t,o,a){switch(dd(t)){case 1:var s=ag;break;case 4:s=ig;break;default:s=Vn}o=s.bind(null,t,o,e),s=void 0,!f||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(s=!0),a?s!==void 0?e.addEventListener(t,o,{capture:!0,passive:s}):e.addEventListener(t,o,!0):s!==void 0?e.addEventListener(t,o,{passive:s}):e.addEventListener(t,o,!1)}function ur(e,t,o,a,s){var l=a;if((t&1)===0&&(t&2)===0&&a!==null)e:for(;;){if(a===null)return;var c=a.tag;if(c===3||c===4){var m=a.stateNode.containerInfo;if(m===s||m.nodeType===8&&m.parentNode===s)break;if(c===4)for(c=a.return;c!==null;){var S=c.tag;if((S===3||S===4)&&(S=c.stateNode.containerInfo,S===s||S.nodeType===8&&S.parentNode===s))return;c=c.return}for(;m!==null;){if(c=ha(m),c===null)return;if(S=c.tag,S===5||S===6){a=l=c;continue e}m=m.parentNode}}a=a.return}fs(function(){var E=l,_=Ho(o),q=[];e:{var H=Md.get(e);if(H!==void 0){var X=Xn,te=e;switch(e){case"keypress":if(As(o)===0)break e;case"keydown":case"keyup":X=vg;break;case"focusin":te="focus",X=Zn;break;case"focusout":te="blur",X=Zn;break;case"beforeblur":case"afterblur":X=Zn;break;case"click":if(o.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":X=pd;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":X=rg;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":X=Cg;break;case Td:case Ld:case zd:X=ug;break;case Ud:X=kg;break;case"scroll":X=sg;break;case"wheel":X=Rg;break;case"copy":case"cut":case"paste":X=pg;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":X=hd}var se=(t&4)!==0,at=!se&&e==="scroll",A=se?H!==null?H+"Capture":null:H;se=[];for(var b=E,I;b!==null;){I=b;var F=I.stateNode;if(I.tag===5&&F!==null&&(I=F,A!==null&&(F=ca(b,A),F!=null&&se.push(Hi(b,F,I)))),at)break;b=b.return}0<se.length&&(H=new X(H,te,null,o,_),q.push({event:H,listeners:se}))}}if((t&7)===0){e:{if(H=e==="mouseover"||e==="pointerover",X=e==="mouseout"||e==="pointerout",H&&o!==Ma&&(te=o.relatedTarget||o.fromElement)&&(ha(te)||te[bo]))break e;if((X||H)&&(H=_.window===_?_:(H=_.ownerDocument)?H.defaultView||H.parentWindow:window,X?(te=o.relatedTarget||o.toElement,X=E,te=te?ha(te):null,te!==null&&(at=J(te),te!==at||te.tag!==5&&te.tag!==6)&&(te=null)):(X=null,te=E),X!==te)){if(se=pd,F="onMouseLeave",A="onMouseEnter",b="mouse",(e==="pointerout"||e==="pointerover")&&(se=hd,F="onPointerLeave",A="onPointerEnter",b="pointer"),at=X==null?H:Va(X),I=te==null?H:Va(te),H=new se(F,b+"leave",X,o,_),H.target=at,H.relatedTarget=I,F=null,ha(_)===E&&(se=new se(A,b+"enter",te,o,_),se.target=I,se.relatedTarget=at,F=se),at=F,X&&te)t:{for(se=X,A=te,b=0,I=se;I;I=Fa(I))b++;for(I=0,F=A;F;F=Fa(F))I++;for(;0<b-I;)se=Fa(se),b--;for(;0<I-b;)A=Fa(A),I--;for(;b--;){if(se===A||A!==null&&se===A.alternate)break t;se=Fa(se),A=Fa(A)}se=null}else se=null;X!==null&&qd(q,H,X,se,!1),te!==null&&at!==null&&qd(q,at,te,se,!0)}}e:{if(H=E?Va(E):window,X=H.nodeName&&H.nodeName.toLowerCase(),X==="select"||X==="input"&&H.type==="file")var ne=Lg;else if(bd(H))if(Cd)ne=Hg;else{ne=Ug;var ge=zg}else(X=H.nodeName)&&X.toLowerCase()==="input"&&(H.type==="checkbox"||H.type==="radio")&&(ne=Mg);if(ne&&(ne=ne(e,E))){Pd(q,ne,o,_);break e}ge&&ge(e,H,E),e==="focusout"&&(ge=H._wrapperState)&&ge.controlled&&H.type==="number"&&za(H,"number",H.value)}switch(ge=E?Va(E):window,e){case"focusin":(bd(ge)||ge.contentEditable==="true")&&(Ba=ge,ir=E,zi=null);break;case"focusout":zi=ir=Ba=null;break;case"mousedown":sr=!0;break;case"contextmenu":case"mouseup":case"dragend":sr=!1,jd(q,o,_);break;case"selectionchange":if(Og)break;case"keydown":case"keyup":jd(q,o,_)}var he;if(er)e:{switch(e){case"compositionstart":var fe="onCompositionStart";break e;case"compositionend":fe="onCompositionEnd";break e;case"compositionupdate":fe="onCompositionUpdate";break e}fe=void 0}else qa?Sd(e,o)&&(fe="onCompositionEnd"):e==="keydown"&&o.keyCode===229&&(fe="onCompositionStart");fe&&(md&&o.locale!=="ko"&&(qa||fe!=="onCompositionStart"?fe==="onCompositionEnd"&&qa&&(he=ud()):(Fo=_,Gn="value"in Fo?Fo.value:Fo.textContent,qa=!0)),ge=zs(E,fe),0<ge.length&&(fe=new gd(fe,e,null,o,_),q.push({event:fe,listeners:ge}),he?fe.data=he:(he=vd(o),he!==null&&(fe.data=he)))),(he=Ig?Dg(e,o):jg(e,o))&&(E=zs(E,"onBeforeInput"),0<E.length&&(_=new gd("onBeforeInput","beforeinput",null,o,_),q.push({event:_,listeners:E}),_.data=he))}Nd(q,t)})}function Hi(e,t,o){return{instance:e,listener:t,currentTarget:o}}function zs(e,t){for(var o=t+"Capture",a=[];e!==null;){var s=e,l=s.stateNode;s.tag===5&&l!==null&&(s=l,l=ca(e,o),l!=null&&a.unshift(Hi(e,l,s)),l=ca(e,t),l!=null&&a.push(Hi(e,l,s))),e=e.return}return a}function Fa(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function qd(e,t,o,a,s){for(var l=t._reactName,c=[];o!==null&&o!==a;){var m=o,S=m.alternate,E=m.stateNode;if(S!==null&&S===a)break;m.tag===5&&E!==null&&(m=E,s?(S=ca(o,l),S!=null&&c.unshift(Hi(o,S,m))):s||(S=ca(o,l),S!=null&&c.push(Hi(o,S,m)))),o=o.return}c.length!==0&&e.push({event:t,listeners:c})}var Fg=/\r\n?/g,Kg=/\u0000|\uFFFD/g;function Bd(e){return(typeof e=="string"?e:""+e).replace(Fg,`
39
- `).replace(Kg,"")}function Us(e,t,o){if(t=Bd(t),Bd(e)!==t&&o)throw Error(r(425))}function Ms(){}var cr=null,pr=null;function gr(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var hr=typeof setTimeout=="function"?setTimeout:void 0,Vg=typeof clearTimeout=="function"?clearTimeout:void 0,Wd=typeof Promise=="function"?Promise:void 0,Yg=typeof queueMicrotask=="function"?queueMicrotask:typeof Wd<"u"?function(e){return Wd.resolve(null).then(e).catch(Gg)}:hr;function Gg(e){setTimeout(function(){throw e})}function mr(e,t){var o=t,a=0;do{var s=o.nextSibling;if(e.removeChild(o),s&&s.nodeType===8)if(o=s.data,o==="/$"){if(a===0){e.removeChild(s),Ai(t);return}a--}else o!=="$"&&o!=="$?"&&o!=="$!"||a++;o=s}while(o);Ai(t)}function Vo(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Fd(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="$"||o==="$!"||o==="$?"){if(t===0)return e;t--}else o==="/$"&&t++}e=e.previousSibling}return null}var Ka=Math.random().toString(36).slice(2),co="__reactFiber$"+Ka,_i="__reactProps$"+Ka,bo="__reactContainer$"+Ka,yr="__reactEvents$"+Ka,Xg="__reactListeners$"+Ka,$g="__reactHandles$"+Ka;function ha(e){var t=e[co];if(t)return t;for(var o=e.parentNode;o;){if(t=o[bo]||o[co]){if(o=t.alternate,t.child!==null||o!==null&&o.child!==null)for(e=Fd(e);e!==null;){if(o=e[co])return o;e=Fd(e)}return t}e=o,o=e.parentNode}return null}function Ni(e){return e=e[co]||e[bo],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Va(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(r(33))}function Hs(e){return e[_i]||null}var fr=[],Ya=-1;function Yo(e){return{current:e}}function Ge(e){0>Ya||(e.current=fr[Ya],fr[Ya]=null,Ya--)}function Fe(e,t){Ya++,fr[Ya]=e.current,e.current=t}var Go={},ft=Yo(Go),wt=Yo(!1),ma=Go;function Ga(e,t){var o=e.type.contextTypes;if(!o)return Go;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var s={},l;for(l in o)s[l]=t[l];return a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function kt(e){return e=e.childContextTypes,e!=null}function _s(){Ge(wt),Ge(ft)}function Kd(e,t,o){if(ft.current!==Go)throw Error(r(168));Fe(ft,t),Fe(wt,o)}function Vd(e,t,o){var a=e.stateNode;if(t=t.childContextTypes,typeof a.getChildContext!="function")return o;a=a.getChildContext();for(var s in a)if(!(s in t))throw Error(r(108,Pe(e)||"Unknown",s));return G({},o,a)}function Ns(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Go,ma=ft.current,Fe(ft,e),Fe(wt,wt.current),!0}function Yd(e,t,o){var a=e.stateNode;if(!a)throw Error(r(169));o?(e=Vd(e,t,ma),a.__reactInternalMemoizedMergedChildContext=e,Ge(wt),Ge(ft),Fe(ft,e)):Ge(wt),Fe(wt,o)}var Po=null,Os=!1,Sr=!1;function Gd(e){Po===null?Po=[e]:Po.push(e)}function Qg(e){Os=!0,Gd(e)}function Xo(){if(!Sr&&Po!==null){Sr=!0;var e=0,t=Oe;try{var o=Po;for(Oe=1;e<o.length;e++){var a=o[e];do a=a(!0);while(a!==null)}Po=null,Os=!1}catch(s){throw Po!==null&&(Po=Po.slice(e+1)),Ve(So,Xo),s}finally{Oe=t,Sr=!1}}return null}var Xa=[],$a=0,qs=null,Bs=0,_t=[],Nt=0,ya=null,Co=1,wo="";function fa(e,t){Xa[$a++]=Bs,Xa[$a++]=qs,qs=e,Bs=t}function Xd(e,t,o){_t[Nt++]=Co,_t[Nt++]=wo,_t[Nt++]=ya,ya=e;var a=Co;e=wo;var s=32-Ue(a)-1;a&=~(1<<s),o+=1;var l=32-Ue(t)+s;if(30<l){var c=s-s%5;l=(a&(1<<c)-1).toString(32),a>>=c,s-=c,Co=1<<32-Ue(t)+s|o<<s|a,wo=l+e}else Co=1<<l|o<<s|a,wo=e}function vr(e){e.return!==null&&(fa(e,1),Xd(e,1,0))}function br(e){for(;e===qs;)qs=Xa[--$a],Xa[$a]=null,Bs=Xa[--$a],Xa[$a]=null;for(;e===ya;)ya=_t[--Nt],_t[Nt]=null,wo=_t[--Nt],_t[Nt]=null,Co=_t[--Nt],_t[Nt]=null}var Lt=null,zt=null,Xe=!1,Qt=null;function $d(e,t){var o=Wt(5,null,null,0);o.elementType="DELETED",o.stateNode=t,o.return=e,t=e.deletions,t===null?(e.deletions=[o],e.flags|=16):t.push(o)}function Qd(e,t){switch(e.tag){case 5:var o=e.type;return t=t.nodeType!==1||o.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,Lt=e,zt=Vo(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Lt=e,zt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(o=ya!==null?{id:Co,overflow:wo}:null,e.memoizedState={dehydrated:t,treeContext:o,retryLane:1073741824},o=Wt(18,null,null,0),o.stateNode=t,o.return=e,e.child=o,Lt=e,zt=null,!0):!1;default:return!1}}function Pr(e){return(e.mode&1)!==0&&(e.flags&128)===0}function Cr(e){if(Xe){var t=zt;if(t){var o=t;if(!Qd(e,t)){if(Pr(e))throw Error(r(418));t=Vo(o.nextSibling);var a=Lt;t&&Qd(e,t)?$d(a,o):(e.flags=e.flags&-4097|2,Xe=!1,Lt=e)}}else{if(Pr(e))throw Error(r(418));e.flags=e.flags&-4097|2,Xe=!1,Lt=e}}}function Zd(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Lt=e}function Ws(e){if(e!==Lt)return!1;if(!Xe)return Zd(e),Xe=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!gr(e.type,e.memoizedProps)),t&&(t=zt)){if(Pr(e))throw Jd(),Error(r(418));for(;t;)$d(e,t),t=Vo(t.nextSibling)}if(Zd(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="/$"){if(t===0){zt=Vo(e.nextSibling);break e}t--}else o!=="$"&&o!=="$!"&&o!=="$?"||t++}e=e.nextSibling}zt=null}}else zt=Lt?Vo(e.stateNode.nextSibling):null;return!0}function Jd(){for(var e=zt;e;)e=Vo(e.nextSibling)}function Qa(){zt=Lt=null,Xe=!1}function wr(e){Qt===null?Qt=[e]:Qt.push(e)}var Zg=V.ReactCurrentBatchConfig;function Oi(e,t,o){if(e=o.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(o._owner){if(o=o._owner,o){if(o.tag!==1)throw Error(r(309));var a=o.stateNode}if(!a)throw Error(r(147,e));var s=a,l=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===l?t.ref:(t=function(c){var m=s.refs;c===null?delete m[l]:m[l]=c},t._stringRef=l,t)}if(typeof e!="string")throw Error(r(284));if(!o._owner)throw Error(r(290,e))}return e}function Fs(e,t){throw e=Object.prototype.toString.call(t),Error(r(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function eu(e){var t=e._init;return t(e._payload)}function tu(e){function t(A,b){if(e){var I=A.deletions;I===null?(A.deletions=[b],A.flags|=16):I.push(b)}}function o(A,b){if(!e)return null;for(;b!==null;)t(A,b),b=b.sibling;return null}function a(A,b){for(A=new Map;b!==null;)b.key!==null?A.set(b.key,b):A.set(b.index,b),b=b.sibling;return A}function s(A,b){return A=aa(A,b),A.index=0,A.sibling=null,A}function l(A,b,I){return A.index=I,e?(I=A.alternate,I!==null?(I=I.index,I<b?(A.flags|=2,b):I):(A.flags|=2,b)):(A.flags|=1048576,b)}function c(A){return e&&A.alternate===null&&(A.flags|=2),A}function m(A,b,I,F){return b===null||b.tag!==6?(b=hl(I,A.mode,F),b.return=A,b):(b=s(b,I),b.return=A,b)}function S(A,b,I,F){var ne=I.type;return ne===j?_(A,b,I.props.children,F,I.key):b!==null&&(b.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===ot&&eu(ne)===b.type)?(F=s(b,I.props),F.ref=Oi(A,b,I),F.return=A,F):(F=mn(I.type,I.key,I.props,null,A.mode,F),F.ref=Oi(A,b,I),F.return=A,F)}function E(A,b,I,F){return b===null||b.tag!==4||b.stateNode.containerInfo!==I.containerInfo||b.stateNode.implementation!==I.implementation?(b=ml(I,A.mode,F),b.return=A,b):(b=s(b,I.children||[]),b.return=A,b)}function _(A,b,I,F,ne){return b===null||b.tag!==7?(b=xa(I,A.mode,F,ne),b.return=A,b):(b=s(b,I),b.return=A,b)}function q(A,b,I){if(typeof b=="string"&&b!==""||typeof b=="number")return b=hl(""+b,A.mode,I),b.return=A,b;if(typeof b=="object"&&b!==null){switch(b.$$typeof){case pe:return I=mn(b.type,b.key,b.props,null,A.mode,I),I.ref=Oi(A,null,b),I.return=A,I;case De:return b=ml(b,A.mode,I),b.return=A,b;case ot:var F=b._init;return q(A,F(b._payload),I)}if(la(b)||de(b))return b=xa(b,A.mode,I,null),b.return=A,b;Fs(A,b)}return null}function H(A,b,I,F){var ne=b!==null?b.key:null;if(typeof I=="string"&&I!==""||typeof I=="number")return ne!==null?null:m(A,b,""+I,F);if(typeof I=="object"&&I!==null){switch(I.$$typeof){case pe:return I.key===ne?S(A,b,I,F):null;case De:return I.key===ne?E(A,b,I,F):null;case ot:return ne=I._init,H(A,b,ne(I._payload),F)}if(la(I)||de(I))return ne!==null?null:_(A,b,I,F,null);Fs(A,I)}return null}function X(A,b,I,F,ne){if(typeof F=="string"&&F!==""||typeof F=="number")return A=A.get(I)||null,m(b,A,""+F,ne);if(typeof F=="object"&&F!==null){switch(F.$$typeof){case pe:return A=A.get(F.key===null?I:F.key)||null,S(b,A,F,ne);case De:return A=A.get(F.key===null?I:F.key)||null,E(b,A,F,ne);case ot:var ge=F._init;return X(A,b,I,ge(F._payload),ne)}if(la(F)||de(F))return A=A.get(I)||null,_(b,A,F,ne,null);Fs(b,F)}return null}function te(A,b,I,F){for(var ne=null,ge=null,he=b,fe=b=0,pt=null;he!==null&&fe<I.length;fe++){he.index>fe?(pt=he,he=null):pt=he.sibling;var Me=H(A,he,I[fe],F);if(Me===null){he===null&&(he=pt);break}e&&he&&Me.alternate===null&&t(A,he),b=l(Me,b,fe),ge===null?ne=Me:ge.sibling=Me,ge=Me,he=pt}if(fe===I.length)return o(A,he),Xe&&fa(A,fe),ne;if(he===null){for(;fe<I.length;fe++)he=q(A,I[fe],F),he!==null&&(b=l(he,b,fe),ge===null?ne=he:ge.sibling=he,ge=he);return Xe&&fa(A,fe),ne}for(he=a(A,he);fe<I.length;fe++)pt=X(he,A,fe,I[fe],F),pt!==null&&(e&&pt.alternate!==null&&he.delete(pt.key===null?fe:pt.key),b=l(pt,b,fe),ge===null?ne=pt:ge.sibling=pt,ge=pt);return e&&he.forEach(function(ia){return t(A,ia)}),Xe&&fa(A,fe),ne}function se(A,b,I,F){var ne=de(I);if(typeof ne!="function")throw Error(r(150));if(I=ne.call(I),I==null)throw Error(r(151));for(var ge=ne=null,he=b,fe=b=0,pt=null,Me=I.next();he!==null&&!Me.done;fe++,Me=I.next()){he.index>fe?(pt=he,he=null):pt=he.sibling;var ia=H(A,he,Me.value,F);if(ia===null){he===null&&(he=pt);break}e&&he&&ia.alternate===null&&t(A,he),b=l(ia,b,fe),ge===null?ne=ia:ge.sibling=ia,ge=ia,he=pt}if(Me.done)return o(A,he),Xe&&fa(A,fe),ne;if(he===null){for(;!Me.done;fe++,Me=I.next())Me=q(A,Me.value,F),Me!==null&&(b=l(Me,b,fe),ge===null?ne=Me:ge.sibling=Me,ge=Me);return Xe&&fa(A,fe),ne}for(he=a(A,he);!Me.done;fe++,Me=I.next())Me=X(he,A,fe,Me.value,F),Me!==null&&(e&&Me.alternate!==null&&he.delete(Me.key===null?fe:Me.key),b=l(Me,b,fe),ge===null?ne=Me:ge.sibling=Me,ge=Me);return e&&he.forEach(function(Eh){return t(A,Eh)}),Xe&&fa(A,fe),ne}function at(A,b,I,F){if(typeof I=="object"&&I!==null&&I.type===j&&I.key===null&&(I=I.props.children),typeof I=="object"&&I!==null){switch(I.$$typeof){case pe:e:{for(var ne=I.key,ge=b;ge!==null;){if(ge.key===ne){if(ne=I.type,ne===j){if(ge.tag===7){o(A,ge.sibling),b=s(ge,I.props.children),b.return=A,A=b;break e}}else if(ge.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===ot&&eu(ne)===ge.type){o(A,ge.sibling),b=s(ge,I.props),b.ref=Oi(A,ge,I),b.return=A,A=b;break e}o(A,ge);break}else t(A,ge);ge=ge.sibling}I.type===j?(b=xa(I.props.children,A.mode,F,I.key),b.return=A,A=b):(F=mn(I.type,I.key,I.props,null,A.mode,F),F.ref=Oi(A,b,I),F.return=A,A=F)}return c(A);case De:e:{for(ge=I.key;b!==null;){if(b.key===ge)if(b.tag===4&&b.stateNode.containerInfo===I.containerInfo&&b.stateNode.implementation===I.implementation){o(A,b.sibling),b=s(b,I.children||[]),b.return=A,A=b;break e}else{o(A,b);break}else t(A,b);b=b.sibling}b=ml(I,A.mode,F),b.return=A,A=b}return c(A);case ot:return ge=I._init,at(A,b,ge(I._payload),F)}if(la(I))return te(A,b,I,F);if(de(I))return se(A,b,I,F);Fs(A,I)}return typeof I=="string"&&I!==""||typeof I=="number"?(I=""+I,b!==null&&b.tag===6?(o(A,b.sibling),b=s(b,I),b.return=A,A=b):(o(A,b),b=hl(I,A.mode,F),b.return=A,A=b),c(A)):o(A,b)}return at}var Za=tu(!0),ou=tu(!1),Ks=Yo(null),Vs=null,Ja=null,kr=null;function xr(){kr=Ja=Vs=null}function Rr(e){var t=Ks.current;Ge(Ks),e._currentValue=t}function Ar(e,t,o){for(;e!==null;){var a=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,a!==null&&(a.childLanes|=t)):a!==null&&(a.childLanes&t)!==t&&(a.childLanes|=t),e===o)break;e=e.return}}function ei(e,t){Vs=e,kr=Ja=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(xt=!0),e.firstContext=null)}function Ot(e){var t=e._currentValue;if(kr!==e)if(e={context:e,memoizedValue:t,next:null},Ja===null){if(Vs===null)throw Error(r(308));Ja=e,Vs.dependencies={lanes:0,firstContext:e}}else Ja=Ja.next=e;return t}var Sa=null;function Ir(e){Sa===null?Sa=[e]:Sa.push(e)}function au(e,t,o,a){var s=t.interleaved;return s===null?(o.next=o,Ir(t)):(o.next=s.next,s.next=o),t.interleaved=o,ko(e,a)}function ko(e,t){e.lanes|=t;var o=e.alternate;for(o!==null&&(o.lanes|=t),o=e,e=e.return;e!==null;)e.childLanes|=t,o=e.alternate,o!==null&&(o.childLanes|=t),o=e,e=e.return;return o.tag===3?o.stateNode:null}var $o=!1;function Dr(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function iu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function xo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Qo(e,t,o){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(Ee&2)!==0){var s=a.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),a.pending=t,ko(e,o)}return s=a.interleaved,s===null?(t.next=t,Ir(a)):(t.next=s.next,s.next=t),a.interleaved=t,ko(e,o)}function Ys(e,t,o){if(t=t.updateQueue,t!==null&&(t=t.shared,(o&4194240)!==0)){var a=t.lanes;a&=e.pendingLanes,o|=a,t.lanes=o,Wn(e,o)}}function su(e,t){var o=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,o===a)){var s=null,l=null;if(o=o.firstBaseUpdate,o!==null){do{var c={eventTime:o.eventTime,lane:o.lane,tag:o.tag,payload:o.payload,callback:o.callback,next:null};l===null?s=l=c:l=l.next=c,o=o.next}while(o!==null);l===null?s=l=t:l=l.next=t}else s=l=t;o={baseState:a.baseState,firstBaseUpdate:s,lastBaseUpdate:l,shared:a.shared,effects:a.effects},e.updateQueue=o;return}e=o.lastBaseUpdate,e===null?o.firstBaseUpdate=t:e.next=t,o.lastBaseUpdate=t}function Gs(e,t,o,a){var s=e.updateQueue;$o=!1;var l=s.firstBaseUpdate,c=s.lastBaseUpdate,m=s.shared.pending;if(m!==null){s.shared.pending=null;var S=m,E=S.next;S.next=null,c===null?l=E:c.next=E,c=S;var _=e.alternate;_!==null&&(_=_.updateQueue,m=_.lastBaseUpdate,m!==c&&(m===null?_.firstBaseUpdate=E:m.next=E,_.lastBaseUpdate=S))}if(l!==null){var q=s.baseState;c=0,_=E=S=null,m=l;do{var H=m.lane,X=m.eventTime;if((a&H)===H){_!==null&&(_=_.next={eventTime:X,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var te=e,se=m;switch(H=t,X=o,se.tag){case 1:if(te=se.payload,typeof te=="function"){q=te.call(X,q,H);break e}q=te;break e;case 3:te.flags=te.flags&-65537|128;case 0:if(te=se.payload,H=typeof te=="function"?te.call(X,q,H):te,H==null)break e;q=G({},q,H);break e;case 2:$o=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,H=s.effects,H===null?s.effects=[m]:H.push(m))}else X={eventTime:X,lane:H,tag:m.tag,payload:m.payload,callback:m.callback,next:null},_===null?(E=_=X,S=q):_=_.next=X,c|=H;if(m=m.next,m===null){if(m=s.shared.pending,m===null)break;H=m,m=H.next,H.next=null,s.lastBaseUpdate=H,s.shared.pending=null}}while(!0);if(_===null&&(S=q),s.baseState=S,s.firstBaseUpdate=E,s.lastBaseUpdate=_,t=s.shared.interleaved,t!==null){s=t;do c|=s.lane,s=s.next;while(s!==t)}else l===null&&(s.shared.lanes=0);Pa|=c,e.lanes=c,e.memoizedState=q}}function nu(e,t,o){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var a=e[t],s=a.callback;if(s!==null){if(a.callback=null,a=o,typeof s!="function")throw Error(r(191,s));s.call(a)}}}var qi={},po=Yo(qi),Bi=Yo(qi),Wi=Yo(qi);function va(e){if(e===qi)throw Error(r(174));return e}function jr(e,t){switch(Fe(Wi,t),Fe(Bi,e),Fe(po,qi),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:da(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=da(t,e)}Ge(po),Fe(po,t)}function ti(){Ge(po),Ge(Bi),Ge(Wi)}function ru(e){va(Wi.current);var t=va(po.current),o=da(t,e.type);t!==o&&(Fe(Bi,e),Fe(po,o))}function Er(e){Bi.current===e&&(Ge(po),Ge(Bi))}var Qe=Yo(0);function Xs(e){for(var t=e;t!==null;){if(t.tag===13){var o=t.memoizedState;if(o!==null&&(o=o.dehydrated,o===null||o.data==="$?"||o.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Tr=[];function Lr(){for(var e=0;e<Tr.length;e++)Tr[e]._workInProgressVersionPrimary=null;Tr.length=0}var $s=V.ReactCurrentDispatcher,zr=V.ReactCurrentBatchConfig,ba=0,Ze=null,rt=null,ut=null,Qs=!1,Fi=!1,Ki=0,Jg=0;function St(){throw Error(r(321))}function Ur(e,t){if(t===null)return!1;for(var o=0;o<t.length&&o<e.length;o++)if(!$t(e[o],t[o]))return!1;return!0}function Mr(e,t,o,a,s,l){if(ba=l,Ze=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,$s.current=e===null||e.memoizedState===null?ah:ih,e=o(a,s),Fi){l=0;do{if(Fi=!1,Ki=0,25<=l)throw Error(r(301));l+=1,ut=rt=null,t.updateQueue=null,$s.current=sh,e=o(a,s)}while(Fi)}if($s.current=en,t=rt!==null&&rt.next!==null,ba=0,ut=rt=Ze=null,Qs=!1,t)throw Error(r(300));return e}function Hr(){var e=Ki!==0;return Ki=0,e}function go(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ut===null?Ze.memoizedState=ut=e:ut=ut.next=e,ut}function qt(){if(rt===null){var e=Ze.alternate;e=e!==null?e.memoizedState:null}else e=rt.next;var t=ut===null?Ze.memoizedState:ut.next;if(t!==null)ut=t,rt=e;else{if(e===null)throw Error(r(310));rt=e,e={memoizedState:rt.memoizedState,baseState:rt.baseState,baseQueue:rt.baseQueue,queue:rt.queue,next:null},ut===null?Ze.memoizedState=ut=e:ut=ut.next=e}return ut}function Vi(e,t){return typeof t=="function"?t(e):t}function _r(e){var t=qt(),o=t.queue;if(o===null)throw Error(r(311));o.lastRenderedReducer=e;var a=rt,s=a.baseQueue,l=o.pending;if(l!==null){if(s!==null){var c=s.next;s.next=l.next,l.next=c}a.baseQueue=s=l,o.pending=null}if(s!==null){l=s.next,a=a.baseState;var m=c=null,S=null,E=l;do{var _=E.lane;if((ba&_)===_)S!==null&&(S=S.next={lane:0,action:E.action,hasEagerState:E.hasEagerState,eagerState:E.eagerState,next:null}),a=E.hasEagerState?E.eagerState:e(a,E.action);else{var q={lane:_,action:E.action,hasEagerState:E.hasEagerState,eagerState:E.eagerState,next:null};S===null?(m=S=q,c=a):S=S.next=q,Ze.lanes|=_,Pa|=_}E=E.next}while(E!==null&&E!==l);S===null?c=a:S.next=m,$t(a,t.memoizedState)||(xt=!0),t.memoizedState=a,t.baseState=c,t.baseQueue=S,o.lastRenderedState=a}if(e=o.interleaved,e!==null){s=e;do l=s.lane,Ze.lanes|=l,Pa|=l,s=s.next;while(s!==e)}else s===null&&(o.lanes=0);return[t.memoizedState,o.dispatch]}function Nr(e){var t=qt(),o=t.queue;if(o===null)throw Error(r(311));o.lastRenderedReducer=e;var a=o.dispatch,s=o.pending,l=t.memoizedState;if(s!==null){o.pending=null;var c=s=s.next;do l=e(l,c.action),c=c.next;while(c!==s);$t(l,t.memoizedState)||(xt=!0),t.memoizedState=l,t.baseQueue===null&&(t.baseState=l),o.lastRenderedState=l}return[l,a]}function lu(){}function du(e,t){var o=Ze,a=qt(),s=t(),l=!$t(a.memoizedState,s);if(l&&(a.memoizedState=s,xt=!0),a=a.queue,Or(pu.bind(null,o,a,e),[e]),a.getSnapshot!==t||l||ut!==null&&ut.memoizedState.tag&1){if(o.flags|=2048,Yi(9,cu.bind(null,o,a,s,t),void 0,null),ct===null)throw Error(r(349));(ba&30)!==0||uu(o,t,s)}return s}function uu(e,t,o){e.flags|=16384,e={getSnapshot:t,value:o},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.stores=[e]):(o=t.stores,o===null?t.stores=[e]:o.push(e))}function cu(e,t,o,a){t.value=o,t.getSnapshot=a,gu(t)&&hu(e)}function pu(e,t,o){return o(function(){gu(t)&&hu(e)})}function gu(e){var t=e.getSnapshot;e=e.value;try{var o=t();return!$t(e,o)}catch{return!0}}function hu(e){var t=ko(e,1);t!==null&&to(t,e,1,-1)}function mu(e){var t=go();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Vi,lastRenderedState:e},t.queue=e,e=e.dispatch=oh.bind(null,Ze,e),[t.memoizedState,e]}function Yi(e,t,o,a){return e={tag:e,create:t,destroy:o,deps:a,next:null},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.lastEffect=e.next=e):(o=t.lastEffect,o===null?t.lastEffect=e.next=e:(a=o.next,o.next=e,e.next=a,t.lastEffect=e)),e}function yu(){return qt().memoizedState}function Zs(e,t,o,a){var s=go();Ze.flags|=e,s.memoizedState=Yi(1|t,o,void 0,a===void 0?null:a)}function Js(e,t,o,a){var s=qt();a=a===void 0?null:a;var l=void 0;if(rt!==null){var c=rt.memoizedState;if(l=c.destroy,a!==null&&Ur(a,c.deps)){s.memoizedState=Yi(t,o,l,a);return}}Ze.flags|=e,s.memoizedState=Yi(1|t,o,l,a)}function fu(e,t){return Zs(8390656,8,e,t)}function Or(e,t){return Js(2048,8,e,t)}function Su(e,t){return Js(4,2,e,t)}function vu(e,t){return Js(4,4,e,t)}function bu(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function Pu(e,t,o){return o=o!=null?o.concat([e]):null,Js(4,4,bu.bind(null,t,e),o)}function qr(){}function Cu(e,t){var o=qt();t=t===void 0?null:t;var a=o.memoizedState;return a!==null&&t!==null&&Ur(t,a[1])?a[0]:(o.memoizedState=[e,t],e)}function wu(e,t){var o=qt();t=t===void 0?null:t;var a=o.memoizedState;return a!==null&&t!==null&&Ur(t,a[1])?a[0]:(e=e(),o.memoizedState=[e,t],e)}function ku(e,t,o){return(ba&21)===0?(e.baseState&&(e.baseState=!1,xt=!0),e.memoizedState=o):($t(o,t)||(o=ed(),Ze.lanes|=o,Pa|=o,e.baseState=!0),t)}function eh(e,t){var o=Oe;Oe=o!==0&&4>o?o:4,e(!0);var a=zr.transition;zr.transition={};try{e(!1),t()}finally{Oe=o,zr.transition=a}}function xu(){return qt().memoizedState}function th(e,t,o){var a=ta(e);if(o={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null},Ru(e))Au(t,o);else if(o=au(e,t,o,a),o!==null){var s=Ct();to(o,e,a,s),Iu(o,t,a)}}function oh(e,t,o){var a=ta(e),s={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null};if(Ru(e))Au(t,s);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var c=t.lastRenderedState,m=l(c,o);if(s.hasEagerState=!0,s.eagerState=m,$t(m,c)){var S=t.interleaved;S===null?(s.next=s,Ir(t)):(s.next=S.next,S.next=s),t.interleaved=s;return}}catch{}finally{}o=au(e,t,s,a),o!==null&&(s=Ct(),to(o,e,a,s),Iu(o,t,a))}}function Ru(e){var t=e.alternate;return e===Ze||t!==null&&t===Ze}function Au(e,t){Fi=Qs=!0;var o=e.pending;o===null?t.next=t:(t.next=o.next,o.next=t),e.pending=t}function Iu(e,t,o){if((o&4194240)!==0){var a=t.lanes;a&=e.pendingLanes,o|=a,t.lanes=o,Wn(e,o)}}var en={readContext:Ot,useCallback:St,useContext:St,useEffect:St,useImperativeHandle:St,useInsertionEffect:St,useLayoutEffect:St,useMemo:St,useReducer:St,useRef:St,useState:St,useDebugValue:St,useDeferredValue:St,useTransition:St,useMutableSource:St,useSyncExternalStore:St,useId:St,unstable_isNewReconciler:!1},ah={readContext:Ot,useCallback:function(e,t){return go().memoizedState=[e,t===void 0?null:t],e},useContext:Ot,useEffect:fu,useImperativeHandle:function(e,t,o){return o=o!=null?o.concat([e]):null,Zs(4194308,4,bu.bind(null,t,e),o)},useLayoutEffect:function(e,t){return Zs(4194308,4,e,t)},useInsertionEffect:function(e,t){return Zs(4,2,e,t)},useMemo:function(e,t){var o=go();return t=t===void 0?null:t,e=e(),o.memoizedState=[e,t],e},useReducer:function(e,t,o){var a=go();return t=o!==void 0?o(t):t,a.memoizedState=a.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},a.queue=e,e=e.dispatch=th.bind(null,Ze,e),[a.memoizedState,e]},useRef:function(e){var t=go();return e={current:e},t.memoizedState=e},useState:mu,useDebugValue:qr,useDeferredValue:function(e){return go().memoizedState=e},useTransition:function(){var e=mu(!1),t=e[0];return e=eh.bind(null,e[1]),go().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,o){var a=Ze,s=go();if(Xe){if(o===void 0)throw Error(r(407));o=o()}else{if(o=t(),ct===null)throw Error(r(349));(ba&30)!==0||uu(a,t,o)}s.memoizedState=o;var l={value:o,getSnapshot:t};return s.queue=l,fu(pu.bind(null,a,l,e),[e]),a.flags|=2048,Yi(9,cu.bind(null,a,l,o,t),void 0,null),o},useId:function(){var e=go(),t=ct.identifierPrefix;if(Xe){var o=wo,a=Co;o=(a&~(1<<32-Ue(a)-1)).toString(32)+o,t=":"+t+"R"+o,o=Ki++,0<o&&(t+="H"+o.toString(32)),t+=":"}else o=Jg++,t=":"+t+"r"+o.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ih={readContext:Ot,useCallback:Cu,useContext:Ot,useEffect:Or,useImperativeHandle:Pu,useInsertionEffect:Su,useLayoutEffect:vu,useMemo:wu,useReducer:_r,useRef:yu,useState:function(){return _r(Vi)},useDebugValue:qr,useDeferredValue:function(e){var t=qt();return ku(t,rt.memoizedState,e)},useTransition:function(){var e=_r(Vi)[0],t=qt().memoizedState;return[e,t]},useMutableSource:lu,useSyncExternalStore:du,useId:xu,unstable_isNewReconciler:!1},sh={readContext:Ot,useCallback:Cu,useContext:Ot,useEffect:Or,useImperativeHandle:Pu,useInsertionEffect:Su,useLayoutEffect:vu,useMemo:wu,useReducer:Nr,useRef:yu,useState:function(){return Nr(Vi)},useDebugValue:qr,useDeferredValue:function(e){var t=qt();return rt===null?t.memoizedState=e:ku(t,rt.memoizedState,e)},useTransition:function(){var e=Nr(Vi)[0],t=qt().memoizedState;return[e,t]},useMutableSource:lu,useSyncExternalStore:du,useId:xu,unstable_isNewReconciler:!1};function Zt(e,t){if(e&&e.defaultProps){t=G({},t),e=e.defaultProps;for(var o in e)t[o]===void 0&&(t[o]=e[o]);return t}return t}function Br(e,t,o,a){t=e.memoizedState,o=o(a,t),o=o==null?t:G({},t,o),e.memoizedState=o,e.lanes===0&&(e.updateQueue.baseState=o)}var tn={isMounted:function(e){return(e=e._reactInternals)?J(e)===e:!1},enqueueSetState:function(e,t,o){e=e._reactInternals;var a=Ct(),s=ta(e),l=xo(a,s);l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,s),t!==null&&(to(t,e,s,a),Ys(t,e,s))},enqueueReplaceState:function(e,t,o){e=e._reactInternals;var a=Ct(),s=ta(e),l=xo(a,s);l.tag=1,l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,s),t!==null&&(to(t,e,s,a),Ys(t,e,s))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var o=Ct(),a=ta(e),s=xo(o,a);s.tag=2,t!=null&&(s.callback=t),t=Qo(e,s,a),t!==null&&(to(t,e,a,o),Ys(t,e,a))}};function Du(e,t,o,a,s,l,c){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(a,l,c):t.prototype&&t.prototype.isPureReactComponent?!Li(o,a)||!Li(s,l):!0}function ju(e,t,o){var a=!1,s=Go,l=t.contextType;return typeof l=="object"&&l!==null?l=Ot(l):(s=kt(t)?ma:ft.current,a=t.contextTypes,l=(a=a!=null)?Ga(e,s):Go),t=new t(o,l),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=tn,e.stateNode=t,t._reactInternals=e,a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=s,e.__reactInternalMemoizedMaskedChildContext=l),t}function Eu(e,t,o,a){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(o,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(o,a),t.state!==e&&tn.enqueueReplaceState(t,t.state,null)}function Wr(e,t,o,a){var s=e.stateNode;s.props=o,s.state=e.memoizedState,s.refs={},Dr(e);var l=t.contextType;typeof l=="object"&&l!==null?s.context=Ot(l):(l=kt(t)?ma:ft.current,s.context=Ga(e,l)),s.state=e.memoizedState,l=t.getDerivedStateFromProps,typeof l=="function"&&(Br(e,t,l,o),s.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(t=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),t!==s.state&&tn.enqueueReplaceState(s,s.state,null),Gs(e,o,s,a),s.state=e.memoizedState),typeof s.componentDidMount=="function"&&(e.flags|=4194308)}function oi(e,t){try{var o="",a=t;do o+=ae(a),a=a.return;while(a);var s=o}catch(l){s=`
38
+ `+s[c].replace(" at new "," at ");return e.displayName&&S.includes("<anonymous>")&&(S=S.replace("<anonymous>",e.displayName)),S}while(1<=c&&0<=m);break}}}finally{ye=!1,Error.prepareStackTrace=o}return(e=e?e.displayName||e.name:"")?z(e):""}function ae(e){switch(e.tag){case 5:return z(e.type);case 16:return z("Lazy");case 13:return z("Suspense");case 19:return z("SuspenseList");case 0:case 2:case 15:return e=K(e.type,!1),e;case 11:return e=K(e.type.render,!1),e;case 1:return e=K(e.type,!0),e;default:return""}}function ue(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case j:return"Fragment";case De:return"Portal";case Se:return"Profiler";case X:return"StrictMode";case ke:return"Suspense";case Me:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Te:return(e.displayName||"Context")+".Consumer";case ce:return(e._context.displayName||"Context")+".Provider";case Ce:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case et:return t=e.displayName||null,t!==null?t:ue(e.type)||"Memo";case ot:t=e._payload,e=e._init;try{return ue(e(t))}catch{}}return null}function Pe(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ue(t);case 8:return t===X?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function xe(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Le(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function gt(e){var t=Le(e)?"checked":"value",o=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof o<"u"&&typeof o.get=="function"&&typeof o.set=="function"){var s=o.get,l=o.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(c){a=""+c,l.call(this,c)}}),Object.defineProperty(e,t,{enumerable:o.enumerable}),{getValue:function(){return a},setValue:function(c){a=""+c},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function yo(e){e._valueTracker||(e._valueTracker=gt(e))}function dt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var o=t.getValue(),a="";return e&&(a=Le(e)?e.checked?"true":"false":e.value),e=a,e!==o?(t.setValue(e),!0):!1}function Yt(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function La(e,t){var o=t.checked;return G({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:o??e._wrapperState.initialChecked})}function cs(e,t){var o=t.defaultValue==null?"":t.defaultValue,a=t.checked!=null?t.checked:t.defaultChecked;o=xe(t.value!=null?t.value:o),e._wrapperState={initialChecked:a,initialValue:o,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function io(e,t){t=t.checked,t!=null&&oe(e,"checked",t,!1)}function gi(e,t){io(e,t);var o=xe(t.value),a=t.type;if(o!=null)a==="number"?(o===0&&e.value===""||e.value!=o)&&(e.value=""+o):e.value!==""+o&&(e.value=""+o);else if(a==="submit"||a==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?za(e,t.type,o):t.hasOwnProperty("defaultValue")&&za(e,t.type,xe(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ps(e,t,o){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!(a!=="submit"&&a!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,o||t===e.value||(e.value=t),e.defaultValue=t}o=e.name,o!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,o!==""&&(e.name=o)}function za(e,t,o){(t!=="number"||Yt(e.ownerDocument)!==e)&&(o==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+o&&(e.defaultValue=""+o))}var la=Array.isArray;function zo(e,t,o,a){if(e=e.options,t){t={};for(var s=0;s<o.length;s++)t["$"+o[s]]=!0;for(o=0;o<e.length;o++)s=t.hasOwnProperty("$"+e[o].value),e[o].selected!==s&&(e[o].selected=s),s&&a&&(e[o].defaultSelected=!0)}else{for(o=""+xe(o),t=null,s=0;s<e.length;s++){if(e[s].value===o){e[s].selected=!0,a&&(e[s].defaultSelected=!0);return}t!==null||e[s].disabled||(t=e[s])}t!==null&&(t.selected=!0)}}function hi(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(r(91));return G({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function gs(e,t){var o=t.value;if(o==null){if(o=t.children,t=t.defaultValue,o!=null){if(t!=null)throw Error(r(92));if(la(o)){if(1<o.length)throw Error(r(93));o=o[0]}t=o}t==null&&(t=""),o=t}e._wrapperState={initialValue:xe(o)}}function so(e,t){var o=xe(t.value),a=xe(t.defaultValue);o!=null&&(o=""+o,o!==e.value&&(e.value=o),t.defaultValue==null&&e.defaultValue!==o&&(e.defaultValue=o)),a!=null&&(e.defaultValue=""+a)}function Uo(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function mi(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function da(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?mi(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Et,Mt=(function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,o,a,s){MSApp.execUnsafeLocalFunction(function(){return e(t,o,a,s)})}:e})(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Et=Et||document.createElement("div"),Et.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Et.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ho(e,t){if(t){var o=e.firstChild;if(o&&o===e.lastChild&&o.nodeType===3){o.nodeValue=t;return}}e.textContent=t}var no={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},_n=["Webkit","ms","Moz","O"];Object.keys(no).forEach(function(e){_n.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),no[t]=no[e]})});function Gt(e,t,o){return t==null||typeof t=="boolean"||t===""?"":o||typeof t!="number"||t===0||no.hasOwnProperty(e)&&no[e]?(""+t).trim():t+"px"}function yi(e,t){e=e.style;for(var o in t)if(t.hasOwnProperty(o)){var a=o.indexOf("--")===0,s=Gt(o,t[o],a);o==="float"&&(o="cssFloat"),a?e.setProperty(o,s):e[o]=s}}var hs=G({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ua(e,t){if(t){if(hs[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!="object")throw Error(r(62))}}function fi(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ha=null;function Mo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ma=null,ro=null,lo=null;function ms(e){if(e=_i(e)){if(typeof Ma!="function")throw Error(r(280));var t=e.stateNode;t&&(t=Ms(t),Ma(e.stateNode,e.type,t))}}function Si(e){ro?lo?lo.push(e):lo=[e]:ro=e}function ys(){if(ro){var e=ro,t=lo;if(lo=ro=null,ms(e),t)for(e=0;e<t.length;e++)ms(t[e])}}function vi(e,t){return e(t)}function ua(){}var No=!1;function fs(e,t,o){if(No)return e(t,o);No=!0;try{return vi(e,t,o)}finally{No=!1,(ro!==null||lo!==null)&&(ua(),ys())}}function ca(e,t){var o=e.stateNode;if(o===null)return null;var a=Ms(o);if(a===null)return null;o=a[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(a=!a.disabled)||(e=e.type,a=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!a;break e;default:e=!1}if(e)return null;if(o&&typeof o!="function")throw Error(r(231,t,typeof o));return o}var f=!1;if(y)try{var k={};Object.defineProperty(k,"passive",{get:function(){f=!0}}),window.addEventListener("test",k,k),window.removeEventListener("test",k,k)}catch{f=!1}function T(e,t,o,a,s,l,c,m,S){var E=Array.prototype.slice.call(arguments,3);try{t.apply(o,E)}catch(N){this.onError(N)}}var H=!1,Y=null,re=!1,me=null,ee={onError:function(e){H=!0,Y=e}};function ie(e,t,o,a,s,l,c,m,S){H=!1,Y=null,T.apply(ee,arguments)}function Q(e,t,o,a,s,l,c,m,S){if(ie.apply(this,arguments),H){if(H){var E=Y;H=!1,Y=null}else throw Error(r(198));re||(re=!0,me=E)}}function J(e){var t=e,o=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(o=t.return),e=t.return;while(e)}return t.tag===3?o:null}function ve(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Ae(e){if(J(e)!==e)throw Error(r(188))}function nt(e){var t=e.alternate;if(!t){if(t=J(e),t===null)throw Error(r(188));return t!==e?null:e}for(var o=e,a=t;;){var s=o.return;if(s===null)break;var l=s.alternate;if(l===null){if(a=s.return,a!==null){o=a;continue}break}if(s.child===l.child){for(l=s.child;l;){if(l===o)return Ae(s),e;if(l===a)return Ae(s),t;l=l.sibling}throw Error(r(188))}if(o.return!==a.return)o=s,a=l;else{for(var c=!1,m=s.child;m;){if(m===o){c=!0,o=s,a=l;break}if(m===a){c=!0,a=s,o=l;break}m=m.sibling}if(!c){for(m=l.child;m;){if(m===o){c=!0,o=l,a=s;break}if(m===a){c=!0,a=l,o=s;break}m=m.sibling}if(!c)throw Error(r(189))}}if(o.alternate!==a)throw Error(r(190))}if(o.tag!==3)throw Error(r(188));return o.stateNode.current===o?e:t}function _e(e){return e=nt(e),e!==null?je(e):null}function je(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=je(e);if(t!==null)return t;e=e.sibling}return null}var Ve=n.unstable_scheduleCallback,fo=n.unstable_cancelCallback,pa=n.unstable_shouldYield,$t=n.unstable_requestPaint,ze=n.unstable_now,bi=n.unstable_getCurrentPriorityLevel,So=n.unstable_ImmediatePriority,uo=n.unstable_UserBlockingPriority,vo=n.unstable_NormalPriority,Na=n.unstable_LowPriority,Ie=n.unstable_IdlePriority,Be=null,ht=null;function ga(e){if(ht&&typeof ht.onCommitFiberRoot=="function")try{ht.onCommitFiberRoot(Be,e,void 0,(e.current.flags&128)===128)}catch{}}var Ue=Math.clz32?Math.clz32:On,_o=Math.log,Ss=Math.LN2;function On(e){return e>>>=0,e===0?32:31-(_o(e)/Ss|0)|0}var vs=64,bs=4194304;function Pi(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Ps(e,t){var o=e.pendingLanes;if(o===0)return 0;var a=0,s=e.suspendedLanes,l=e.pingedLanes,c=o&268435455;if(c!==0){var m=c&~s;m!==0?a=Pi(m):(l&=c,l!==0&&(a=Pi(l)))}else c=o&~s,c!==0?a=Pi(c):l!==0&&(a=Pi(l));if(a===0)return 0;if(t!==0&&t!==a&&(t&s)===0&&(s=a&-a,l=t&-t,s>=l||s===16&&(l&4194240)!==0))return t;if((a&4)!==0&&(a|=o&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=a;0<t;)o=31-Ue(t),s=1<<o,a|=e[o],t&=~s;return a}function Qp(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Zp(e,t){for(var o=e.suspendedLanes,a=e.pingedLanes,s=e.expirationTimes,l=e.pendingLanes;0<l;){var c=31-Ue(l),m=1<<c,S=s[c];S===-1?((m&o)===0||(m&a)!==0)&&(s[c]=Qp(m,t)):S<=t&&(e.expiredLanes|=m),l&=~m}}function qn(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function ed(){var e=vs;return vs<<=1,(vs&4194240)===0&&(vs=64),e}function Bn(e){for(var t=[],o=0;31>o;o++)t.push(e);return t}function wi(e,t,o){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ue(t),e[t]=o}function Jp(e,t){var o=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var a=e.eventTimes;for(e=e.expirationTimes;0<o;){var s=31-Ue(o),l=1<<s;t[s]=0,a[s]=-1,e[s]=-1,o&=~l}}function Wn(e,t){var o=e.entangledLanes|=t;for(e=e.entanglements;o;){var a=31-Ue(o),s=1<<a;s&t|e[a]&t&&(e[a]|=t),o&=~s}}var Oe=0;function td(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var od,Fn,ad,id,sd,Kn=!1,ws=[],Oo=null,qo=null,Bo=null,Ci=new Map,ki=new Map,Wo=[],eg="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function nd(e,t){switch(e){case"focusin":case"focusout":Oo=null;break;case"dragenter":case"dragleave":qo=null;break;case"mouseover":case"mouseout":Bo=null;break;case"pointerover":case"pointerout":Ci.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ki.delete(t.pointerId)}}function xi(e,t,o,a,s,l){return e===null||e.nativeEvent!==l?(e={blockedOn:t,domEventName:o,eventSystemFlags:a,nativeEvent:l,targetContainers:[s]},t!==null&&(t=_i(t),t!==null&&Fn(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,s!==null&&t.indexOf(s)===-1&&t.push(s),e)}function tg(e,t,o,a,s){switch(t){case"focusin":return Oo=xi(Oo,e,t,o,a,s),!0;case"dragenter":return qo=xi(qo,e,t,o,a,s),!0;case"mouseover":return Bo=xi(Bo,e,t,o,a,s),!0;case"pointerover":var l=s.pointerId;return Ci.set(l,xi(Ci.get(l)||null,e,t,o,a,s)),!0;case"gotpointercapture":return l=s.pointerId,ki.set(l,xi(ki.get(l)||null,e,t,o,a,s)),!0}return!1}function rd(e){var t=ha(e.target);if(t!==null){var o=J(t);if(o!==null){if(t=o.tag,t===13){if(t=ve(o),t!==null){e.blockedOn=t,sd(e.priority,function(){ad(o)});return}}else if(t===3&&o.stateNode.current.memoizedState.isDehydrated){e.blockedOn=o.tag===3?o.stateNode.containerInfo:null;return}}}e.blockedOn=null}function Cs(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var o=Yn(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(o===null){o=e.nativeEvent;var a=new o.constructor(o.type,o);Ha=a,o.target.dispatchEvent(a),Ha=null}else return t=_i(o),t!==null&&Fn(t),e.blockedOn=o,!1;t.shift()}return!0}function ld(e,t,o){Cs(e)&&o.delete(t)}function og(){Kn=!1,Oo!==null&&Cs(Oo)&&(Oo=null),qo!==null&&Cs(qo)&&(qo=null),Bo!==null&&Cs(Bo)&&(Bo=null),Ci.forEach(ld),ki.forEach(ld)}function Ri(e,t){e.blockedOn===t&&(e.blockedOn=null,Kn||(Kn=!0,n.unstable_scheduleCallback(n.unstable_NormalPriority,og)))}function Ai(e){function t(s){return Ri(s,e)}if(0<ws.length){Ri(ws[0],e);for(var o=1;o<ws.length;o++){var a=ws[o];a.blockedOn===e&&(a.blockedOn=null)}}for(Oo!==null&&Ri(Oo,e),qo!==null&&Ri(qo,e),Bo!==null&&Ri(Bo,e),Ci.forEach(t),ki.forEach(t),o=0;o<Wo.length;o++)a=Wo[o],a.blockedOn===e&&(a.blockedOn=null);for(;0<Wo.length&&(o=Wo[0],o.blockedOn===null);)rd(o),o.blockedOn===null&&Wo.shift()}var _a=V.ReactCurrentBatchConfig,ks=!0;function ag(e,t,o,a){var s=Oe,l=_a.transition;_a.transition=null;try{Oe=1,Vn(e,t,o,a)}finally{Oe=s,_a.transition=l}}function ig(e,t,o,a){var s=Oe,l=_a.transition;_a.transition=null;try{Oe=4,Vn(e,t,o,a)}finally{Oe=s,_a.transition=l}}function Vn(e,t,o,a){if(ks){var s=Yn(e,t,o,a);if(s===null)ur(e,t,a,xs,o),nd(e,a);else if(tg(s,e,t,o,a))a.stopPropagation();else if(nd(e,a),t&4&&-1<eg.indexOf(e)){for(;s!==null;){var l=_i(s);if(l!==null&&od(l),l=Yn(e,t,o,a),l===null&&ur(e,t,a,xs,o),l===s)break;s=l}s!==null&&a.stopPropagation()}else ur(e,t,a,null,o)}}var xs=null;function Yn(e,t,o,a){if(xs=null,e=Mo(a),e=ha(e),e!==null)if(t=J(e),t===null)e=null;else if(o=t.tag,o===13){if(e=ve(t),e!==null)return e;e=null}else if(o===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return xs=e,null}function dd(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(bi()){case So:return 1;case uo:return 4;case vo:case Na:return 16;case Ie:return 536870912;default:return 16}default:return 16}}var Fo=null,Gn=null,Rs=null;function ud(){if(Rs)return Rs;var e,t=Gn,o=t.length,a,s="value"in Fo?Fo.value:Fo.textContent,l=s.length;for(e=0;e<o&&t[e]===s[e];e++);var c=o-e;for(a=1;a<=c&&t[o-a]===s[l-a];a++);return Rs=s.slice(e,1<a?1-a:void 0)}function As(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Is(){return!0}function cd(){return!1}function Tt(e){function t(o,a,s,l,c){this._reactName=o,this._targetInst=s,this.type=a,this.nativeEvent=l,this.target=c,this.currentTarget=null;for(var m in e)e.hasOwnProperty(m)&&(o=e[m],this[m]=o?o(l):l[m]);return this.isDefaultPrevented=(l.defaultPrevented!=null?l.defaultPrevented:l.returnValue===!1)?Is:cd,this.isPropagationStopped=cd,this}return G(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var o=this.nativeEvent;o&&(o.preventDefault?o.preventDefault():typeof o.returnValue!="unknown"&&(o.returnValue=!1),this.isDefaultPrevented=Is)},stopPropagation:function(){var o=this.nativeEvent;o&&(o.stopPropagation?o.stopPropagation():typeof o.cancelBubble!="unknown"&&(o.cancelBubble=!0),this.isPropagationStopped=Is)},persist:function(){},isPersistent:Is}),t}var Oa={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},$n=Tt(Oa),Ii=G({},Oa,{view:0,detail:0}),sg=Tt(Ii),Xn,Qn,Di,Ds=G({},Ii,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Jn,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Di&&(Di&&e.type==="mousemove"?(Xn=e.screenX-Di.screenX,Qn=e.screenY-Di.screenY):Qn=Xn=0,Di=e),Xn)},movementY:function(e){return"movementY"in e?e.movementY:Qn}}),pd=Tt(Ds),ng=G({},Ds,{dataTransfer:0}),rg=Tt(ng),lg=G({},Ii,{relatedTarget:0}),Zn=Tt(lg),dg=G({},Oa,{animationName:0,elapsedTime:0,pseudoElement:0}),ug=Tt(dg),cg=G({},Oa,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),pg=Tt(cg),gg=G({},Oa,{data:0}),gd=Tt(gg),hg={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},mg={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},yg={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function fg(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=yg[e])?!!t[e]:!1}function Jn(){return fg}var Sg=G({},Ii,{key:function(e){if(e.key){var t=hg[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=As(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?mg[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Jn,charCode:function(e){return e.type==="keypress"?As(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?As(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),vg=Tt(Sg),bg=G({},Ds,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),hd=Tt(bg),Pg=G({},Ii,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Jn}),wg=Tt(Pg),Cg=G({},Oa,{propertyName:0,elapsedTime:0,pseudoElement:0}),kg=Tt(Cg),xg=G({},Ds,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Rg=Tt(xg),Ag=[9,13,27,32],er=y&&"CompositionEvent"in window,ji=null;y&&"documentMode"in document&&(ji=document.documentMode);var Ig=y&&"TextEvent"in window&&!ji,md=y&&(!er||ji&&8<ji&&11>=ji),yd=" ",fd=!1;function Sd(e,t){switch(e){case"keyup":return Ag.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function vd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qa=!1;function Dg(e,t){switch(e){case"compositionend":return vd(t);case"keypress":return t.which!==32?null:(fd=!0,yd);case"textInput":return e=t.data,e===yd&&fd?null:e;default:return null}}function jg(e,t){if(qa)return e==="compositionend"||!er&&Sd(e,t)?(e=ud(),Rs=Gn=Fo=null,qa=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return md&&t.locale!=="ko"?null:t.data;default:return null}}var Eg={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function bd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!Eg[e.type]:t==="textarea"}function Pd(e,t,o,a){Si(a),t=zs(t,"onChange"),0<t.length&&(o=new $n("onChange","change",null,o,a),e.push({event:o,listeners:t}))}var Ei=null,Ti=null;function Tg(e){_d(e,0)}function js(e){var t=Va(e);if(dt(t))return e}function Lg(e,t){if(e==="change")return t}var wd=!1;if(y){var tr;if(y){var or="oninput"in document;if(!or){var Cd=document.createElement("div");Cd.setAttribute("oninput","return;"),or=typeof Cd.oninput=="function"}tr=or}else tr=!1;wd=tr&&(!document.documentMode||9<document.documentMode)}function kd(){Ei&&(Ei.detachEvent("onpropertychange",xd),Ti=Ei=null)}function xd(e){if(e.propertyName==="value"&&js(Ti)){var t=[];Pd(t,Ti,e,Mo(e)),fs(Tg,t)}}function zg(e,t,o){e==="focusin"?(kd(),Ei=t,Ti=o,Ei.attachEvent("onpropertychange",xd)):e==="focusout"&&kd()}function Ug(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return js(Ti)}function Hg(e,t){if(e==="click")return js(t)}function Mg(e,t){if(e==="input"||e==="change")return js(t)}function Ng(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Xt=typeof Object.is=="function"?Object.is:Ng;function Li(e,t){if(Xt(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var o=Object.keys(e),a=Object.keys(t);if(o.length!==a.length)return!1;for(a=0;a<o.length;a++){var s=o[a];if(!h.call(t,s)||!Xt(e[s],t[s]))return!1}return!0}function Rd(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Ad(e,t){var o=Rd(e);e=0;for(var a;o;){if(o.nodeType===3){if(a=e+o.textContent.length,e<=t&&a>=t)return{node:o,offset:t-e};e=a}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=Rd(o)}}function Id(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Id(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dd(){for(var e=window,t=Yt();t instanceof e.HTMLIFrameElement;){try{var o=typeof t.contentWindow.location.href=="string"}catch{o=!1}if(o)e=t.contentWindow;else break;t=Yt(e.document)}return t}function ar(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function _g(e){var t=Dd(),o=e.focusedElem,a=e.selectionRange;if(t!==o&&o&&o.ownerDocument&&Id(o.ownerDocument.documentElement,o)){if(a!==null&&ar(o)){if(t=a.start,e=a.end,e===void 0&&(e=t),"selectionStart"in o)o.selectionStart=t,o.selectionEnd=Math.min(e,o.value.length);else if(e=(t=o.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var s=o.textContent.length,l=Math.min(a.start,s);a=a.end===void 0?l:Math.min(a.end,s),!e.extend&&l>a&&(s=a,a=l,l=s),s=Ad(o,l);var c=Ad(o,a);s&&c&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==c.node||e.focusOffset!==c.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),l>a?(e.addRange(t),e.extend(c.node,c.offset)):(t.setEnd(c.node,c.offset),e.addRange(t)))}}for(t=[],e=o;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;o<t.length;o++)e=t[o],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var Og=y&&"documentMode"in document&&11>=document.documentMode,Ba=null,ir=null,zi=null,sr=!1;function jd(e,t,o){var a=o.window===o?o.document:o.nodeType===9?o:o.ownerDocument;sr||Ba==null||Ba!==Yt(a)||(a=Ba,"selectionStart"in a&&ar(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),zi&&Li(zi,a)||(zi=a,a=zs(ir,"onSelect"),0<a.length&&(t=new $n("onSelect","select",null,t,o),e.push({event:t,listeners:a}),t.target=Ba)))}function Es(e,t){var o={};return o[e.toLowerCase()]=t.toLowerCase(),o["Webkit"+e]="webkit"+t,o["Moz"+e]="moz"+t,o}var Wa={animationend:Es("Animation","AnimationEnd"),animationiteration:Es("Animation","AnimationIteration"),animationstart:Es("Animation","AnimationStart"),transitionend:Es("Transition","TransitionEnd")},nr={},Ed={};y&&(Ed=document.createElement("div").style,"AnimationEvent"in window||(delete Wa.animationend.animation,delete Wa.animationiteration.animation,delete Wa.animationstart.animation),"TransitionEvent"in window||delete Wa.transitionend.transition);function Ts(e){if(nr[e])return nr[e];if(!Wa[e])return e;var t=Wa[e],o;for(o in t)if(t.hasOwnProperty(o)&&o in Ed)return nr[e]=t[o];return e}var Td=Ts("animationend"),Ld=Ts("animationiteration"),zd=Ts("animationstart"),Ud=Ts("transitionend"),Hd=new Map,Md="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Ko(e,t){Hd.set(e,t),p(t,[e])}for(var rr=0;rr<Md.length;rr++){var lr=Md[rr],qg=lr.toLowerCase(),Bg=lr[0].toUpperCase()+lr.slice(1);Ko(qg,"on"+Bg)}Ko(Td,"onAnimationEnd"),Ko(Ld,"onAnimationIteration"),Ko(zd,"onAnimationStart"),Ko("dblclick","onDoubleClick"),Ko("focusin","onFocus"),Ko("focusout","onBlur"),Ko(Ud,"onTransitionEnd"),g("onMouseEnter",["mouseout","mouseover"]),g("onMouseLeave",["mouseout","mouseover"]),g("onPointerEnter",["pointerout","pointerover"]),g("onPointerLeave",["pointerout","pointerover"]),p("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),p("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),p("onBeforeInput",["compositionend","keypress","textInput","paste"]),p("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ui="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Wg=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ui));function Nd(e,t,o){var a=e.type||"unknown-event";e.currentTarget=o,Q(a,t,void 0,e),e.currentTarget=null}function _d(e,t){t=(t&4)!==0;for(var o=0;o<e.length;o++){var a=e[o],s=a.event;a=a.listeners;e:{var l=void 0;if(t)for(var c=a.length-1;0<=c;c--){var m=a[c],S=m.instance,E=m.currentTarget;if(m=m.listener,S!==l&&s.isPropagationStopped())break e;Nd(s,m,E),l=S}else for(c=0;c<a.length;c++){if(m=a[c],S=m.instance,E=m.currentTarget,m=m.listener,S!==l&&s.isPropagationStopped())break e;Nd(s,m,E),l=S}}}if(re)throw e=me,re=!1,me=null,e}function Ye(e,t){var o=t[yr];o===void 0&&(o=t[yr]=new Set);var a=e+"__bubble";o.has(a)||(Od(t,e,2,!1),o.add(a))}function dr(e,t,o){var a=0;t&&(a|=4),Od(o,e,a,t)}var Ls="_reactListening"+Math.random().toString(36).slice(2);function Hi(e){if(!e[Ls]){e[Ls]=!0,d.forEach(function(o){o!=="selectionchange"&&(Wg.has(o)||dr(o,!1,e),dr(o,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Ls]||(t[Ls]=!0,dr("selectionchange",!1,t))}}function Od(e,t,o,a){switch(dd(t)){case 1:var s=ag;break;case 4:s=ig;break;default:s=Vn}o=s.bind(null,t,o,e),s=void 0,!f||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(s=!0),a?s!==void 0?e.addEventListener(t,o,{capture:!0,passive:s}):e.addEventListener(t,o,!0):s!==void 0?e.addEventListener(t,o,{passive:s}):e.addEventListener(t,o,!1)}function ur(e,t,o,a,s){var l=a;if((t&1)===0&&(t&2)===0&&a!==null)e:for(;;){if(a===null)return;var c=a.tag;if(c===3||c===4){var m=a.stateNode.containerInfo;if(m===s||m.nodeType===8&&m.parentNode===s)break;if(c===4)for(c=a.return;c!==null;){var S=c.tag;if((S===3||S===4)&&(S=c.stateNode.containerInfo,S===s||S.nodeType===8&&S.parentNode===s))return;c=c.return}for(;m!==null;){if(c=ha(m),c===null)return;if(S=c.tag,S===5||S===6){a=l=c;continue e}m=m.parentNode}}a=a.return}fs(function(){var E=l,N=Mo(o),q=[];e:{var M=Hd.get(e);if(M!==void 0){var $=$n,te=e;switch(e){case"keypress":if(As(o)===0)break e;case"keydown":case"keyup":$=vg;break;case"focusin":te="focus",$=Zn;break;case"focusout":te="blur",$=Zn;break;case"beforeblur":case"afterblur":$=Zn;break;case"click":if(o.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":$=pd;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":$=rg;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":$=wg;break;case Td:case Ld:case zd:$=ug;break;case Ud:$=kg;break;case"scroll":$=sg;break;case"wheel":$=Rg;break;case"copy":case"cut":case"paste":$=pg;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":$=hd}var se=(t&4)!==0,at=!se&&e==="scroll",A=se?M!==null?M+"Capture":null:M;se=[];for(var b=E,I;b!==null;){I=b;var F=I.stateNode;if(I.tag===5&&F!==null&&(I=F,A!==null&&(F=ca(b,A),F!=null&&se.push(Mi(b,F,I)))),at)break;b=b.return}0<se.length&&(M=new $(M,te,null,o,N),q.push({event:M,listeners:se}))}}if((t&7)===0){e:{if(M=e==="mouseover"||e==="pointerover",$=e==="mouseout"||e==="pointerout",M&&o!==Ha&&(te=o.relatedTarget||o.fromElement)&&(ha(te)||te[bo]))break e;if(($||M)&&(M=N.window===N?N:(M=N.ownerDocument)?M.defaultView||M.parentWindow:window,$?(te=o.relatedTarget||o.toElement,$=E,te=te?ha(te):null,te!==null&&(at=J(te),te!==at||te.tag!==5&&te.tag!==6)&&(te=null)):($=null,te=E),$!==te)){if(se=pd,F="onMouseLeave",A="onMouseEnter",b="mouse",(e==="pointerout"||e==="pointerover")&&(se=hd,F="onPointerLeave",A="onPointerEnter",b="pointer"),at=$==null?M:Va($),I=te==null?M:Va(te),M=new se(F,b+"leave",$,o,N),M.target=at,M.relatedTarget=I,F=null,ha(N)===E&&(se=new se(A,b+"enter",te,o,N),se.target=I,se.relatedTarget=at,F=se),at=F,$&&te)t:{for(se=$,A=te,b=0,I=se;I;I=Fa(I))b++;for(I=0,F=A;F;F=Fa(F))I++;for(;0<b-I;)se=Fa(se),b--;for(;0<I-b;)A=Fa(A),I--;for(;b--;){if(se===A||A!==null&&se===A.alternate)break t;se=Fa(se),A=Fa(A)}se=null}else se=null;$!==null&&qd(q,M,$,se,!1),te!==null&&at!==null&&qd(q,at,te,se,!0)}}e:{if(M=E?Va(E):window,$=M.nodeName&&M.nodeName.toLowerCase(),$==="select"||$==="input"&&M.type==="file")var ne=Lg;else if(bd(M))if(wd)ne=Mg;else{ne=Ug;var ge=zg}else($=M.nodeName)&&$.toLowerCase()==="input"&&(M.type==="checkbox"||M.type==="radio")&&(ne=Hg);if(ne&&(ne=ne(e,E))){Pd(q,ne,o,N);break e}ge&&ge(e,M,E),e==="focusout"&&(ge=M._wrapperState)&&ge.controlled&&M.type==="number"&&za(M,"number",M.value)}switch(ge=E?Va(E):window,e){case"focusin":(bd(ge)||ge.contentEditable==="true")&&(Ba=ge,ir=E,zi=null);break;case"focusout":zi=ir=Ba=null;break;case"mousedown":sr=!0;break;case"contextmenu":case"mouseup":case"dragend":sr=!1,jd(q,o,N);break;case"selectionchange":if(Og)break;case"keydown":case"keyup":jd(q,o,N)}var he;if(er)e:{switch(e){case"compositionstart":var fe="onCompositionStart";break e;case"compositionend":fe="onCompositionEnd";break e;case"compositionupdate":fe="onCompositionUpdate";break e}fe=void 0}else qa?Sd(e,o)&&(fe="onCompositionEnd"):e==="keydown"&&o.keyCode===229&&(fe="onCompositionStart");fe&&(md&&o.locale!=="ko"&&(qa||fe!=="onCompositionStart"?fe==="onCompositionEnd"&&qa&&(he=ud()):(Fo=N,Gn="value"in Fo?Fo.value:Fo.textContent,qa=!0)),ge=zs(E,fe),0<ge.length&&(fe=new gd(fe,e,null,o,N),q.push({event:fe,listeners:ge}),he?fe.data=he:(he=vd(o),he!==null&&(fe.data=he)))),(he=Ig?Dg(e,o):jg(e,o))&&(E=zs(E,"onBeforeInput"),0<E.length&&(N=new gd("onBeforeInput","beforeinput",null,o,N),q.push({event:N,listeners:E}),N.data=he))}_d(q,t)})}function Mi(e,t,o){return{instance:e,listener:t,currentTarget:o}}function zs(e,t){for(var o=t+"Capture",a=[];e!==null;){var s=e,l=s.stateNode;s.tag===5&&l!==null&&(s=l,l=ca(e,o),l!=null&&a.unshift(Mi(e,l,s)),l=ca(e,t),l!=null&&a.push(Mi(e,l,s))),e=e.return}return a}function Fa(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function qd(e,t,o,a,s){for(var l=t._reactName,c=[];o!==null&&o!==a;){var m=o,S=m.alternate,E=m.stateNode;if(S!==null&&S===a)break;m.tag===5&&E!==null&&(m=E,s?(S=ca(o,l),S!=null&&c.unshift(Mi(o,S,m))):s||(S=ca(o,l),S!=null&&c.push(Mi(o,S,m)))),o=o.return}c.length!==0&&e.push({event:t,listeners:c})}var Fg=/\r\n?/g,Kg=/\u0000|\uFFFD/g;function Bd(e){return(typeof e=="string"?e:""+e).replace(Fg,`
39
+ `).replace(Kg,"")}function Us(e,t,o){if(t=Bd(t),Bd(e)!==t&&o)throw Error(r(425))}function Hs(){}var cr=null,pr=null;function gr(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var hr=typeof setTimeout=="function"?setTimeout:void 0,Vg=typeof clearTimeout=="function"?clearTimeout:void 0,Wd=typeof Promise=="function"?Promise:void 0,Yg=typeof queueMicrotask=="function"?queueMicrotask:typeof Wd<"u"?function(e){return Wd.resolve(null).then(e).catch(Gg)}:hr;function Gg(e){setTimeout(function(){throw e})}function mr(e,t){var o=t,a=0;do{var s=o.nextSibling;if(e.removeChild(o),s&&s.nodeType===8)if(o=s.data,o==="/$"){if(a===0){e.removeChild(s),Ai(t);return}a--}else o!=="$"&&o!=="$?"&&o!=="$!"||a++;o=s}while(o);Ai(t)}function Vo(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Fd(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="$"||o==="$!"||o==="$?"){if(t===0)return e;t--}else o==="/$"&&t++}e=e.previousSibling}return null}var Ka=Math.random().toString(36).slice(2),co="__reactFiber$"+Ka,Ni="__reactProps$"+Ka,bo="__reactContainer$"+Ka,yr="__reactEvents$"+Ka,$g="__reactListeners$"+Ka,Xg="__reactHandles$"+Ka;function ha(e){var t=e[co];if(t)return t;for(var o=e.parentNode;o;){if(t=o[bo]||o[co]){if(o=t.alternate,t.child!==null||o!==null&&o.child!==null)for(e=Fd(e);e!==null;){if(o=e[co])return o;e=Fd(e)}return t}e=o,o=e.parentNode}return null}function _i(e){return e=e[co]||e[bo],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Va(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(r(33))}function Ms(e){return e[Ni]||null}var fr=[],Ya=-1;function Yo(e){return{current:e}}function Ge(e){0>Ya||(e.current=fr[Ya],fr[Ya]=null,Ya--)}function Fe(e,t){Ya++,fr[Ya]=e.current,e.current=t}var Go={},ft=Yo(Go),Ct=Yo(!1),ma=Go;function Ga(e,t){var o=e.type.contextTypes;if(!o)return Go;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var s={},l;for(l in o)s[l]=t[l];return a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function kt(e){return e=e.childContextTypes,e!=null}function Ns(){Ge(Ct),Ge(ft)}function Kd(e,t,o){if(ft.current!==Go)throw Error(r(168));Fe(ft,t),Fe(Ct,o)}function Vd(e,t,o){var a=e.stateNode;if(t=t.childContextTypes,typeof a.getChildContext!="function")return o;a=a.getChildContext();for(var s in a)if(!(s in t))throw Error(r(108,Pe(e)||"Unknown",s));return G({},o,a)}function _s(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Go,ma=ft.current,Fe(ft,e),Fe(Ct,Ct.current),!0}function Yd(e,t,o){var a=e.stateNode;if(!a)throw Error(r(169));o?(e=Vd(e,t,ma),a.__reactInternalMemoizedMergedChildContext=e,Ge(Ct),Ge(ft),Fe(ft,e)):Ge(Ct),Fe(Ct,o)}var Po=null,Os=!1,Sr=!1;function Gd(e){Po===null?Po=[e]:Po.push(e)}function Qg(e){Os=!0,Gd(e)}function $o(){if(!Sr&&Po!==null){Sr=!0;var e=0,t=Oe;try{var o=Po;for(Oe=1;e<o.length;e++){var a=o[e];do a=a(!0);while(a!==null)}Po=null,Os=!1}catch(s){throw Po!==null&&(Po=Po.slice(e+1)),Ve(So,$o),s}finally{Oe=t,Sr=!1}}return null}var $a=[],Xa=0,qs=null,Bs=0,Nt=[],_t=0,ya=null,wo=1,Co="";function fa(e,t){$a[Xa++]=Bs,$a[Xa++]=qs,qs=e,Bs=t}function $d(e,t,o){Nt[_t++]=wo,Nt[_t++]=Co,Nt[_t++]=ya,ya=e;var a=wo;e=Co;var s=32-Ue(a)-1;a&=~(1<<s),o+=1;var l=32-Ue(t)+s;if(30<l){var c=s-s%5;l=(a&(1<<c)-1).toString(32),a>>=c,s-=c,wo=1<<32-Ue(t)+s|o<<s|a,Co=l+e}else wo=1<<l|o<<s|a,Co=e}function vr(e){e.return!==null&&(fa(e,1),$d(e,1,0))}function br(e){for(;e===qs;)qs=$a[--Xa],$a[Xa]=null,Bs=$a[--Xa],$a[Xa]=null;for(;e===ya;)ya=Nt[--_t],Nt[_t]=null,Co=Nt[--_t],Nt[_t]=null,wo=Nt[--_t],Nt[_t]=null}var Lt=null,zt=null,$e=!1,Qt=null;function Xd(e,t){var o=Wt(5,null,null,0);o.elementType="DELETED",o.stateNode=t,o.return=e,t=e.deletions,t===null?(e.deletions=[o],e.flags|=16):t.push(o)}function Qd(e,t){switch(e.tag){case 5:var o=e.type;return t=t.nodeType!==1||o.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,Lt=e,zt=Vo(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Lt=e,zt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(o=ya!==null?{id:wo,overflow:Co}:null,e.memoizedState={dehydrated:t,treeContext:o,retryLane:1073741824},o=Wt(18,null,null,0),o.stateNode=t,o.return=e,e.child=o,Lt=e,zt=null,!0):!1;default:return!1}}function Pr(e){return(e.mode&1)!==0&&(e.flags&128)===0}function wr(e){if($e){var t=zt;if(t){var o=t;if(!Qd(e,t)){if(Pr(e))throw Error(r(418));t=Vo(o.nextSibling);var a=Lt;t&&Qd(e,t)?Xd(a,o):(e.flags=e.flags&-4097|2,$e=!1,Lt=e)}}else{if(Pr(e))throw Error(r(418));e.flags=e.flags&-4097|2,$e=!1,Lt=e}}}function Zd(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Lt=e}function Ws(e){if(e!==Lt)return!1;if(!$e)return Zd(e),$e=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!gr(e.type,e.memoizedProps)),t&&(t=zt)){if(Pr(e))throw Jd(),Error(r(418));for(;t;)Xd(e,t),t=Vo(t.nextSibling)}if(Zd(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="/$"){if(t===0){zt=Vo(e.nextSibling);break e}t--}else o!=="$"&&o!=="$!"&&o!=="$?"||t++}e=e.nextSibling}zt=null}}else zt=Lt?Vo(e.stateNode.nextSibling):null;return!0}function Jd(){for(var e=zt;e;)e=Vo(e.nextSibling)}function Qa(){zt=Lt=null,$e=!1}function Cr(e){Qt===null?Qt=[e]:Qt.push(e)}var Zg=V.ReactCurrentBatchConfig;function Oi(e,t,o){if(e=o.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(o._owner){if(o=o._owner,o){if(o.tag!==1)throw Error(r(309));var a=o.stateNode}if(!a)throw Error(r(147,e));var s=a,l=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===l?t.ref:(t=function(c){var m=s.refs;c===null?delete m[l]:m[l]=c},t._stringRef=l,t)}if(typeof e!="string")throw Error(r(284));if(!o._owner)throw Error(r(290,e))}return e}function Fs(e,t){throw e=Object.prototype.toString.call(t),Error(r(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function eu(e){var t=e._init;return t(e._payload)}function tu(e){function t(A,b){if(e){var I=A.deletions;I===null?(A.deletions=[b],A.flags|=16):I.push(b)}}function o(A,b){if(!e)return null;for(;b!==null;)t(A,b),b=b.sibling;return null}function a(A,b){for(A=new Map;b!==null;)b.key!==null?A.set(b.key,b):A.set(b.index,b),b=b.sibling;return A}function s(A,b){return A=aa(A,b),A.index=0,A.sibling=null,A}function l(A,b,I){return A.index=I,e?(I=A.alternate,I!==null?(I=I.index,I<b?(A.flags|=2,b):I):(A.flags|=2,b)):(A.flags|=1048576,b)}function c(A){return e&&A.alternate===null&&(A.flags|=2),A}function m(A,b,I,F){return b===null||b.tag!==6?(b=hl(I,A.mode,F),b.return=A,b):(b=s(b,I),b.return=A,b)}function S(A,b,I,F){var ne=I.type;return ne===j?N(A,b,I.props.children,F,I.key):b!==null&&(b.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===ot&&eu(ne)===b.type)?(F=s(b,I.props),F.ref=Oi(A,b,I),F.return=A,F):(F=mn(I.type,I.key,I.props,null,A.mode,F),F.ref=Oi(A,b,I),F.return=A,F)}function E(A,b,I,F){return b===null||b.tag!==4||b.stateNode.containerInfo!==I.containerInfo||b.stateNode.implementation!==I.implementation?(b=ml(I,A.mode,F),b.return=A,b):(b=s(b,I.children||[]),b.return=A,b)}function N(A,b,I,F,ne){return b===null||b.tag!==7?(b=xa(I,A.mode,F,ne),b.return=A,b):(b=s(b,I),b.return=A,b)}function q(A,b,I){if(typeof b=="string"&&b!==""||typeof b=="number")return b=hl(""+b,A.mode,I),b.return=A,b;if(typeof b=="object"&&b!==null){switch(b.$$typeof){case pe:return I=mn(b.type,b.key,b.props,null,A.mode,I),I.ref=Oi(A,null,b),I.return=A,I;case De:return b=ml(b,A.mode,I),b.return=A,b;case ot:var F=b._init;return q(A,F(b._payload),I)}if(la(b)||de(b))return b=xa(b,A.mode,I,null),b.return=A,b;Fs(A,b)}return null}function M(A,b,I,F){var ne=b!==null?b.key:null;if(typeof I=="string"&&I!==""||typeof I=="number")return ne!==null?null:m(A,b,""+I,F);if(typeof I=="object"&&I!==null){switch(I.$$typeof){case pe:return I.key===ne?S(A,b,I,F):null;case De:return I.key===ne?E(A,b,I,F):null;case ot:return ne=I._init,M(A,b,ne(I._payload),F)}if(la(I)||de(I))return ne!==null?null:N(A,b,I,F,null);Fs(A,I)}return null}function $(A,b,I,F,ne){if(typeof F=="string"&&F!==""||typeof F=="number")return A=A.get(I)||null,m(b,A,""+F,ne);if(typeof F=="object"&&F!==null){switch(F.$$typeof){case pe:return A=A.get(F.key===null?I:F.key)||null,S(b,A,F,ne);case De:return A=A.get(F.key===null?I:F.key)||null,E(b,A,F,ne);case ot:var ge=F._init;return $(A,b,I,ge(F._payload),ne)}if(la(F)||de(F))return A=A.get(I)||null,N(b,A,F,ne,null);Fs(b,F)}return null}function te(A,b,I,F){for(var ne=null,ge=null,he=b,fe=b=0,pt=null;he!==null&&fe<I.length;fe++){he.index>fe?(pt=he,he=null):pt=he.sibling;var He=M(A,he,I[fe],F);if(He===null){he===null&&(he=pt);break}e&&he&&He.alternate===null&&t(A,he),b=l(He,b,fe),ge===null?ne=He:ge.sibling=He,ge=He,he=pt}if(fe===I.length)return o(A,he),$e&&fa(A,fe),ne;if(he===null){for(;fe<I.length;fe++)he=q(A,I[fe],F),he!==null&&(b=l(he,b,fe),ge===null?ne=he:ge.sibling=he,ge=he);return $e&&fa(A,fe),ne}for(he=a(A,he);fe<I.length;fe++)pt=$(he,A,fe,I[fe],F),pt!==null&&(e&&pt.alternate!==null&&he.delete(pt.key===null?fe:pt.key),b=l(pt,b,fe),ge===null?ne=pt:ge.sibling=pt,ge=pt);return e&&he.forEach(function(ia){return t(A,ia)}),$e&&fa(A,fe),ne}function se(A,b,I,F){var ne=de(I);if(typeof ne!="function")throw Error(r(150));if(I=ne.call(I),I==null)throw Error(r(151));for(var ge=ne=null,he=b,fe=b=0,pt=null,He=I.next();he!==null&&!He.done;fe++,He=I.next()){he.index>fe?(pt=he,he=null):pt=he.sibling;var ia=M(A,he,He.value,F);if(ia===null){he===null&&(he=pt);break}e&&he&&ia.alternate===null&&t(A,he),b=l(ia,b,fe),ge===null?ne=ia:ge.sibling=ia,ge=ia,he=pt}if(He.done)return o(A,he),$e&&fa(A,fe),ne;if(he===null){for(;!He.done;fe++,He=I.next())He=q(A,He.value,F),He!==null&&(b=l(He,b,fe),ge===null?ne=He:ge.sibling=He,ge=He);return $e&&fa(A,fe),ne}for(he=a(A,he);!He.done;fe++,He=I.next())He=$(he,A,fe,He.value,F),He!==null&&(e&&He.alternate!==null&&he.delete(He.key===null?fe:He.key),b=l(He,b,fe),ge===null?ne=He:ge.sibling=He,ge=He);return e&&he.forEach(function(Eh){return t(A,Eh)}),$e&&fa(A,fe),ne}function at(A,b,I,F){if(typeof I=="object"&&I!==null&&I.type===j&&I.key===null&&(I=I.props.children),typeof I=="object"&&I!==null){switch(I.$$typeof){case pe:e:{for(var ne=I.key,ge=b;ge!==null;){if(ge.key===ne){if(ne=I.type,ne===j){if(ge.tag===7){o(A,ge.sibling),b=s(ge,I.props.children),b.return=A,A=b;break e}}else if(ge.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===ot&&eu(ne)===ge.type){o(A,ge.sibling),b=s(ge,I.props),b.ref=Oi(A,ge,I),b.return=A,A=b;break e}o(A,ge);break}else t(A,ge);ge=ge.sibling}I.type===j?(b=xa(I.props.children,A.mode,F,I.key),b.return=A,A=b):(F=mn(I.type,I.key,I.props,null,A.mode,F),F.ref=Oi(A,b,I),F.return=A,A=F)}return c(A);case De:e:{for(ge=I.key;b!==null;){if(b.key===ge)if(b.tag===4&&b.stateNode.containerInfo===I.containerInfo&&b.stateNode.implementation===I.implementation){o(A,b.sibling),b=s(b,I.children||[]),b.return=A,A=b;break e}else{o(A,b);break}else t(A,b);b=b.sibling}b=ml(I,A.mode,F),b.return=A,A=b}return c(A);case ot:return ge=I._init,at(A,b,ge(I._payload),F)}if(la(I))return te(A,b,I,F);if(de(I))return se(A,b,I,F);Fs(A,I)}return typeof I=="string"&&I!==""||typeof I=="number"?(I=""+I,b!==null&&b.tag===6?(o(A,b.sibling),b=s(b,I),b.return=A,A=b):(o(A,b),b=hl(I,A.mode,F),b.return=A,A=b),c(A)):o(A,b)}return at}var Za=tu(!0),ou=tu(!1),Ks=Yo(null),Vs=null,Ja=null,kr=null;function xr(){kr=Ja=Vs=null}function Rr(e){var t=Ks.current;Ge(Ks),e._currentValue=t}function Ar(e,t,o){for(;e!==null;){var a=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,a!==null&&(a.childLanes|=t)):a!==null&&(a.childLanes&t)!==t&&(a.childLanes|=t),e===o)break;e=e.return}}function ei(e,t){Vs=e,kr=Ja=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(xt=!0),e.firstContext=null)}function Ot(e){var t=e._currentValue;if(kr!==e)if(e={context:e,memoizedValue:t,next:null},Ja===null){if(Vs===null)throw Error(r(308));Ja=e,Vs.dependencies={lanes:0,firstContext:e}}else Ja=Ja.next=e;return t}var Sa=null;function Ir(e){Sa===null?Sa=[e]:Sa.push(e)}function au(e,t,o,a){var s=t.interleaved;return s===null?(o.next=o,Ir(t)):(o.next=s.next,s.next=o),t.interleaved=o,ko(e,a)}function ko(e,t){e.lanes|=t;var o=e.alternate;for(o!==null&&(o.lanes|=t),o=e,e=e.return;e!==null;)e.childLanes|=t,o=e.alternate,o!==null&&(o.childLanes|=t),o=e,e=e.return;return o.tag===3?o.stateNode:null}var Xo=!1;function Dr(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function iu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function xo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Qo(e,t,o){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(Ee&2)!==0){var s=a.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),a.pending=t,ko(e,o)}return s=a.interleaved,s===null?(t.next=t,Ir(a)):(t.next=s.next,s.next=t),a.interleaved=t,ko(e,o)}function Ys(e,t,o){if(t=t.updateQueue,t!==null&&(t=t.shared,(o&4194240)!==0)){var a=t.lanes;a&=e.pendingLanes,o|=a,t.lanes=o,Wn(e,o)}}function su(e,t){var o=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,o===a)){var s=null,l=null;if(o=o.firstBaseUpdate,o!==null){do{var c={eventTime:o.eventTime,lane:o.lane,tag:o.tag,payload:o.payload,callback:o.callback,next:null};l===null?s=l=c:l=l.next=c,o=o.next}while(o!==null);l===null?s=l=t:l=l.next=t}else s=l=t;o={baseState:a.baseState,firstBaseUpdate:s,lastBaseUpdate:l,shared:a.shared,effects:a.effects},e.updateQueue=o;return}e=o.lastBaseUpdate,e===null?o.firstBaseUpdate=t:e.next=t,o.lastBaseUpdate=t}function Gs(e,t,o,a){var s=e.updateQueue;Xo=!1;var l=s.firstBaseUpdate,c=s.lastBaseUpdate,m=s.shared.pending;if(m!==null){s.shared.pending=null;var S=m,E=S.next;S.next=null,c===null?l=E:c.next=E,c=S;var N=e.alternate;N!==null&&(N=N.updateQueue,m=N.lastBaseUpdate,m!==c&&(m===null?N.firstBaseUpdate=E:m.next=E,N.lastBaseUpdate=S))}if(l!==null){var q=s.baseState;c=0,N=E=S=null,m=l;do{var M=m.lane,$=m.eventTime;if((a&M)===M){N!==null&&(N=N.next={eventTime:$,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var te=e,se=m;switch(M=t,$=o,se.tag){case 1:if(te=se.payload,typeof te=="function"){q=te.call($,q,M);break e}q=te;break e;case 3:te.flags=te.flags&-65537|128;case 0:if(te=se.payload,M=typeof te=="function"?te.call($,q,M):te,M==null)break e;q=G({},q,M);break e;case 2:Xo=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,M=s.effects,M===null?s.effects=[m]:M.push(m))}else $={eventTime:$,lane:M,tag:m.tag,payload:m.payload,callback:m.callback,next:null},N===null?(E=N=$,S=q):N=N.next=$,c|=M;if(m=m.next,m===null){if(m=s.shared.pending,m===null)break;M=m,m=M.next,M.next=null,s.lastBaseUpdate=M,s.shared.pending=null}}while(!0);if(N===null&&(S=q),s.baseState=S,s.firstBaseUpdate=E,s.lastBaseUpdate=N,t=s.shared.interleaved,t!==null){s=t;do c|=s.lane,s=s.next;while(s!==t)}else l===null&&(s.shared.lanes=0);Pa|=c,e.lanes=c,e.memoizedState=q}}function nu(e,t,o){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var a=e[t],s=a.callback;if(s!==null){if(a.callback=null,a=o,typeof s!="function")throw Error(r(191,s));s.call(a)}}}var qi={},po=Yo(qi),Bi=Yo(qi),Wi=Yo(qi);function va(e){if(e===qi)throw Error(r(174));return e}function jr(e,t){switch(Fe(Wi,t),Fe(Bi,e),Fe(po,qi),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:da(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=da(t,e)}Ge(po),Fe(po,t)}function ti(){Ge(po),Ge(Bi),Ge(Wi)}function ru(e){va(Wi.current);var t=va(po.current),o=da(t,e.type);t!==o&&(Fe(Bi,e),Fe(po,o))}function Er(e){Bi.current===e&&(Ge(po),Ge(Bi))}var Qe=Yo(0);function $s(e){for(var t=e;t!==null;){if(t.tag===13){var o=t.memoizedState;if(o!==null&&(o=o.dehydrated,o===null||o.data==="$?"||o.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Tr=[];function Lr(){for(var e=0;e<Tr.length;e++)Tr[e]._workInProgressVersionPrimary=null;Tr.length=0}var Xs=V.ReactCurrentDispatcher,zr=V.ReactCurrentBatchConfig,ba=0,Ze=null,rt=null,ut=null,Qs=!1,Fi=!1,Ki=0,Jg=0;function St(){throw Error(r(321))}function Ur(e,t){if(t===null)return!1;for(var o=0;o<t.length&&o<e.length;o++)if(!Xt(e[o],t[o]))return!1;return!0}function Hr(e,t,o,a,s,l){if(ba=l,Ze=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Xs.current=e===null||e.memoizedState===null?ah:ih,e=o(a,s),Fi){l=0;do{if(Fi=!1,Ki=0,25<=l)throw Error(r(301));l+=1,ut=rt=null,t.updateQueue=null,Xs.current=sh,e=o(a,s)}while(Fi)}if(Xs.current=en,t=rt!==null&&rt.next!==null,ba=0,ut=rt=Ze=null,Qs=!1,t)throw Error(r(300));return e}function Mr(){var e=Ki!==0;return Ki=0,e}function go(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ut===null?Ze.memoizedState=ut=e:ut=ut.next=e,ut}function qt(){if(rt===null){var e=Ze.alternate;e=e!==null?e.memoizedState:null}else e=rt.next;var t=ut===null?Ze.memoizedState:ut.next;if(t!==null)ut=t,rt=e;else{if(e===null)throw Error(r(310));rt=e,e={memoizedState:rt.memoizedState,baseState:rt.baseState,baseQueue:rt.baseQueue,queue:rt.queue,next:null},ut===null?Ze.memoizedState=ut=e:ut=ut.next=e}return ut}function Vi(e,t){return typeof t=="function"?t(e):t}function Nr(e){var t=qt(),o=t.queue;if(o===null)throw Error(r(311));o.lastRenderedReducer=e;var a=rt,s=a.baseQueue,l=o.pending;if(l!==null){if(s!==null){var c=s.next;s.next=l.next,l.next=c}a.baseQueue=s=l,o.pending=null}if(s!==null){l=s.next,a=a.baseState;var m=c=null,S=null,E=l;do{var N=E.lane;if((ba&N)===N)S!==null&&(S=S.next={lane:0,action:E.action,hasEagerState:E.hasEagerState,eagerState:E.eagerState,next:null}),a=E.hasEagerState?E.eagerState:e(a,E.action);else{var q={lane:N,action:E.action,hasEagerState:E.hasEagerState,eagerState:E.eagerState,next:null};S===null?(m=S=q,c=a):S=S.next=q,Ze.lanes|=N,Pa|=N}E=E.next}while(E!==null&&E!==l);S===null?c=a:S.next=m,Xt(a,t.memoizedState)||(xt=!0),t.memoizedState=a,t.baseState=c,t.baseQueue=S,o.lastRenderedState=a}if(e=o.interleaved,e!==null){s=e;do l=s.lane,Ze.lanes|=l,Pa|=l,s=s.next;while(s!==e)}else s===null&&(o.lanes=0);return[t.memoizedState,o.dispatch]}function _r(e){var t=qt(),o=t.queue;if(o===null)throw Error(r(311));o.lastRenderedReducer=e;var a=o.dispatch,s=o.pending,l=t.memoizedState;if(s!==null){o.pending=null;var c=s=s.next;do l=e(l,c.action),c=c.next;while(c!==s);Xt(l,t.memoizedState)||(xt=!0),t.memoizedState=l,t.baseQueue===null&&(t.baseState=l),o.lastRenderedState=l}return[l,a]}function lu(){}function du(e,t){var o=Ze,a=qt(),s=t(),l=!Xt(a.memoizedState,s);if(l&&(a.memoizedState=s,xt=!0),a=a.queue,Or(pu.bind(null,o,a,e),[e]),a.getSnapshot!==t||l||ut!==null&&ut.memoizedState.tag&1){if(o.flags|=2048,Yi(9,cu.bind(null,o,a,s,t),void 0,null),ct===null)throw Error(r(349));(ba&30)!==0||uu(o,t,s)}return s}function uu(e,t,o){e.flags|=16384,e={getSnapshot:t,value:o},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.stores=[e]):(o=t.stores,o===null?t.stores=[e]:o.push(e))}function cu(e,t,o,a){t.value=o,t.getSnapshot=a,gu(t)&&hu(e)}function pu(e,t,o){return o(function(){gu(t)&&hu(e)})}function gu(e){var t=e.getSnapshot;e=e.value;try{var o=t();return!Xt(e,o)}catch{return!0}}function hu(e){var t=ko(e,1);t!==null&&to(t,e,1,-1)}function mu(e){var t=go();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Vi,lastRenderedState:e},t.queue=e,e=e.dispatch=oh.bind(null,Ze,e),[t.memoizedState,e]}function Yi(e,t,o,a){return e={tag:e,create:t,destroy:o,deps:a,next:null},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.lastEffect=e.next=e):(o=t.lastEffect,o===null?t.lastEffect=e.next=e:(a=o.next,o.next=e,e.next=a,t.lastEffect=e)),e}function yu(){return qt().memoizedState}function Zs(e,t,o,a){var s=go();Ze.flags|=e,s.memoizedState=Yi(1|t,o,void 0,a===void 0?null:a)}function Js(e,t,o,a){var s=qt();a=a===void 0?null:a;var l=void 0;if(rt!==null){var c=rt.memoizedState;if(l=c.destroy,a!==null&&Ur(a,c.deps)){s.memoizedState=Yi(t,o,l,a);return}}Ze.flags|=e,s.memoizedState=Yi(1|t,o,l,a)}function fu(e,t){return Zs(8390656,8,e,t)}function Or(e,t){return Js(2048,8,e,t)}function Su(e,t){return Js(4,2,e,t)}function vu(e,t){return Js(4,4,e,t)}function bu(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function Pu(e,t,o){return o=o!=null?o.concat([e]):null,Js(4,4,bu.bind(null,t,e),o)}function qr(){}function wu(e,t){var o=qt();t=t===void 0?null:t;var a=o.memoizedState;return a!==null&&t!==null&&Ur(t,a[1])?a[0]:(o.memoizedState=[e,t],e)}function Cu(e,t){var o=qt();t=t===void 0?null:t;var a=o.memoizedState;return a!==null&&t!==null&&Ur(t,a[1])?a[0]:(e=e(),o.memoizedState=[e,t],e)}function ku(e,t,o){return(ba&21)===0?(e.baseState&&(e.baseState=!1,xt=!0),e.memoizedState=o):(Xt(o,t)||(o=ed(),Ze.lanes|=o,Pa|=o,e.baseState=!0),t)}function eh(e,t){var o=Oe;Oe=o!==0&&4>o?o:4,e(!0);var a=zr.transition;zr.transition={};try{e(!1),t()}finally{Oe=o,zr.transition=a}}function xu(){return qt().memoizedState}function th(e,t,o){var a=ta(e);if(o={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null},Ru(e))Au(t,o);else if(o=au(e,t,o,a),o!==null){var s=wt();to(o,e,a,s),Iu(o,t,a)}}function oh(e,t,o){var a=ta(e),s={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null};if(Ru(e))Au(t,s);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var c=t.lastRenderedState,m=l(c,o);if(s.hasEagerState=!0,s.eagerState=m,Xt(m,c)){var S=t.interleaved;S===null?(s.next=s,Ir(t)):(s.next=S.next,S.next=s),t.interleaved=s;return}}catch{}finally{}o=au(e,t,s,a),o!==null&&(s=wt(),to(o,e,a,s),Iu(o,t,a))}}function Ru(e){var t=e.alternate;return e===Ze||t!==null&&t===Ze}function Au(e,t){Fi=Qs=!0;var o=e.pending;o===null?t.next=t:(t.next=o.next,o.next=t),e.pending=t}function Iu(e,t,o){if((o&4194240)!==0){var a=t.lanes;a&=e.pendingLanes,o|=a,t.lanes=o,Wn(e,o)}}var en={readContext:Ot,useCallback:St,useContext:St,useEffect:St,useImperativeHandle:St,useInsertionEffect:St,useLayoutEffect:St,useMemo:St,useReducer:St,useRef:St,useState:St,useDebugValue:St,useDeferredValue:St,useTransition:St,useMutableSource:St,useSyncExternalStore:St,useId:St,unstable_isNewReconciler:!1},ah={readContext:Ot,useCallback:function(e,t){return go().memoizedState=[e,t===void 0?null:t],e},useContext:Ot,useEffect:fu,useImperativeHandle:function(e,t,o){return o=o!=null?o.concat([e]):null,Zs(4194308,4,bu.bind(null,t,e),o)},useLayoutEffect:function(e,t){return Zs(4194308,4,e,t)},useInsertionEffect:function(e,t){return Zs(4,2,e,t)},useMemo:function(e,t){var o=go();return t=t===void 0?null:t,e=e(),o.memoizedState=[e,t],e},useReducer:function(e,t,o){var a=go();return t=o!==void 0?o(t):t,a.memoizedState=a.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},a.queue=e,e=e.dispatch=th.bind(null,Ze,e),[a.memoizedState,e]},useRef:function(e){var t=go();return e={current:e},t.memoizedState=e},useState:mu,useDebugValue:qr,useDeferredValue:function(e){return go().memoizedState=e},useTransition:function(){var e=mu(!1),t=e[0];return e=eh.bind(null,e[1]),go().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,o){var a=Ze,s=go();if($e){if(o===void 0)throw Error(r(407));o=o()}else{if(o=t(),ct===null)throw Error(r(349));(ba&30)!==0||uu(a,t,o)}s.memoizedState=o;var l={value:o,getSnapshot:t};return s.queue=l,fu(pu.bind(null,a,l,e),[e]),a.flags|=2048,Yi(9,cu.bind(null,a,l,o,t),void 0,null),o},useId:function(){var e=go(),t=ct.identifierPrefix;if($e){var o=Co,a=wo;o=(a&~(1<<32-Ue(a)-1)).toString(32)+o,t=":"+t+"R"+o,o=Ki++,0<o&&(t+="H"+o.toString(32)),t+=":"}else o=Jg++,t=":"+t+"r"+o.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ih={readContext:Ot,useCallback:wu,useContext:Ot,useEffect:Or,useImperativeHandle:Pu,useInsertionEffect:Su,useLayoutEffect:vu,useMemo:Cu,useReducer:Nr,useRef:yu,useState:function(){return Nr(Vi)},useDebugValue:qr,useDeferredValue:function(e){var t=qt();return ku(t,rt.memoizedState,e)},useTransition:function(){var e=Nr(Vi)[0],t=qt().memoizedState;return[e,t]},useMutableSource:lu,useSyncExternalStore:du,useId:xu,unstable_isNewReconciler:!1},sh={readContext:Ot,useCallback:wu,useContext:Ot,useEffect:Or,useImperativeHandle:Pu,useInsertionEffect:Su,useLayoutEffect:vu,useMemo:Cu,useReducer:_r,useRef:yu,useState:function(){return _r(Vi)},useDebugValue:qr,useDeferredValue:function(e){var t=qt();return rt===null?t.memoizedState=e:ku(t,rt.memoizedState,e)},useTransition:function(){var e=_r(Vi)[0],t=qt().memoizedState;return[e,t]},useMutableSource:lu,useSyncExternalStore:du,useId:xu,unstable_isNewReconciler:!1};function Zt(e,t){if(e&&e.defaultProps){t=G({},t),e=e.defaultProps;for(var o in e)t[o]===void 0&&(t[o]=e[o]);return t}return t}function Br(e,t,o,a){t=e.memoizedState,o=o(a,t),o=o==null?t:G({},t,o),e.memoizedState=o,e.lanes===0&&(e.updateQueue.baseState=o)}var tn={isMounted:function(e){return(e=e._reactInternals)?J(e)===e:!1},enqueueSetState:function(e,t,o){e=e._reactInternals;var a=wt(),s=ta(e),l=xo(a,s);l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,s),t!==null&&(to(t,e,s,a),Ys(t,e,s))},enqueueReplaceState:function(e,t,o){e=e._reactInternals;var a=wt(),s=ta(e),l=xo(a,s);l.tag=1,l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,s),t!==null&&(to(t,e,s,a),Ys(t,e,s))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var o=wt(),a=ta(e),s=xo(o,a);s.tag=2,t!=null&&(s.callback=t),t=Qo(e,s,a),t!==null&&(to(t,e,a,o),Ys(t,e,a))}};function Du(e,t,o,a,s,l,c){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(a,l,c):t.prototype&&t.prototype.isPureReactComponent?!Li(o,a)||!Li(s,l):!0}function ju(e,t,o){var a=!1,s=Go,l=t.contextType;return typeof l=="object"&&l!==null?l=Ot(l):(s=kt(t)?ma:ft.current,a=t.contextTypes,l=(a=a!=null)?Ga(e,s):Go),t=new t(o,l),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=tn,e.stateNode=t,t._reactInternals=e,a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=s,e.__reactInternalMemoizedMaskedChildContext=l),t}function Eu(e,t,o,a){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(o,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(o,a),t.state!==e&&tn.enqueueReplaceState(t,t.state,null)}function Wr(e,t,o,a){var s=e.stateNode;s.props=o,s.state=e.memoizedState,s.refs={},Dr(e);var l=t.contextType;typeof l=="object"&&l!==null?s.context=Ot(l):(l=kt(t)?ma:ft.current,s.context=Ga(e,l)),s.state=e.memoizedState,l=t.getDerivedStateFromProps,typeof l=="function"&&(Br(e,t,l,o),s.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(t=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),t!==s.state&&tn.enqueueReplaceState(s,s.state,null),Gs(e,o,s,a),s.state=e.memoizedState),typeof s.componentDidMount=="function"&&(e.flags|=4194308)}function oi(e,t){try{var o="",a=t;do o+=ae(a),a=a.return;while(a);var s=o}catch(l){s=`
40
40
  Error generating stack: `+l.message+`
41
- `+l.stack}return{value:e,source:t,stack:s,digest:null}}function Fr(e,t,o){return{value:e,source:null,stack:o??null,digest:t??null}}function Kr(e,t){try{console.error(t.value)}catch(o){setTimeout(function(){throw o})}}var nh=typeof WeakMap=="function"?WeakMap:Map;function Tu(e,t,o){o=xo(-1,o),o.tag=3,o.payload={element:null};var a=t.value;return o.callback=function(){dn||(dn=!0,nl=a),Kr(e,t)},o}function Lu(e,t,o){o=xo(-1,o),o.tag=3;var a=e.type.getDerivedStateFromError;if(typeof a=="function"){var s=t.value;o.payload=function(){return a(s)},o.callback=function(){Kr(e,t)}}var l=e.stateNode;return l!==null&&typeof l.componentDidCatch=="function"&&(o.callback=function(){Kr(e,t),typeof a!="function"&&(Jo===null?Jo=new Set([this]):Jo.add(this));var c=t.stack;this.componentDidCatch(t.value,{componentStack:c!==null?c:""})}),o}function zu(e,t,o){var a=e.pingCache;if(a===null){a=e.pingCache=new nh;var s=new Set;a.set(t,s)}else s=a.get(t),s===void 0&&(s=new Set,a.set(t,s));s.has(o)||(s.add(o),e=bh.bind(null,e,t,o),t.then(e,e))}function Uu(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Mu(e,t,o,a,s){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,o.flags|=131072,o.flags&=-52805,o.tag===1&&(o.alternate===null?o.tag=17:(t=xo(-1,1),t.tag=2,Qo(o,t,1))),o.lanes|=1),e):(e.flags|=65536,e.lanes=s,e)}var rh=V.ReactCurrentOwner,xt=!1;function Pt(e,t,o,a){t.child=e===null?ou(t,null,o,a):Za(t,e.child,o,a)}function Hu(e,t,o,a,s){o=o.render;var l=t.ref;return ei(t,s),a=Mr(e,t,o,a,l,s),o=Hr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Ro(e,t,s)):(Xe&&o&&vr(t),t.flags|=1,Pt(e,t,a,s),t.child)}function _u(e,t,o,a,s){if(e===null){var l=o.type;return typeof l=="function"&&!gl(l)&&l.defaultProps===void 0&&o.compare===null&&o.defaultProps===void 0?(t.tag=15,t.type=l,Nu(e,t,l,a,s)):(e=mn(o.type,null,a,t,t.mode,s),e.ref=t.ref,e.return=t,t.child=e)}if(l=e.child,(e.lanes&s)===0){var c=l.memoizedProps;if(o=o.compare,o=o!==null?o:Li,o(c,a)&&e.ref===t.ref)return Ro(e,t,s)}return t.flags|=1,e=aa(l,a),e.ref=t.ref,e.return=t,t.child=e}function Nu(e,t,o,a,s){if(e!==null){var l=e.memoizedProps;if(Li(l,a)&&e.ref===t.ref)if(xt=!1,t.pendingProps=a=l,(e.lanes&s)!==0)(e.flags&131072)!==0&&(xt=!0);else return t.lanes=e.lanes,Ro(e,t,s)}return Vr(e,t,o,a,s)}function Ou(e,t,o){var a=t.pendingProps,s=a.children,l=e!==null?e.memoizedState:null;if(a.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Fe(ii,Ut),Ut|=o;else{if((o&1073741824)===0)return e=l!==null?l.baseLanes|o:o,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Fe(ii,Ut),Ut|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},a=l!==null?l.baseLanes:o,Fe(ii,Ut),Ut|=a}else l!==null?(a=l.baseLanes|o,t.memoizedState=null):a=o,Fe(ii,Ut),Ut|=a;return Pt(e,t,s,o),t.child}function qu(e,t){var o=t.ref;(e===null&&o!==null||e!==null&&e.ref!==o)&&(t.flags|=512,t.flags|=2097152)}function Vr(e,t,o,a,s){var l=kt(o)?ma:ft.current;return l=Ga(t,l),ei(t,s),o=Mr(e,t,o,a,l,s),a=Hr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Ro(e,t,s)):(Xe&&a&&vr(t),t.flags|=1,Pt(e,t,o,s),t.child)}function Bu(e,t,o,a,s){if(kt(o)){var l=!0;Ns(t)}else l=!1;if(ei(t,s),t.stateNode===null)an(e,t),ju(t,o,a),Wr(t,o,a,s),a=!0;else if(e===null){var c=t.stateNode,m=t.memoizedProps;c.props=m;var S=c.context,E=o.contextType;typeof E=="object"&&E!==null?E=Ot(E):(E=kt(o)?ma:ft.current,E=Ga(t,E));var _=o.getDerivedStateFromProps,q=typeof _=="function"||typeof c.getSnapshotBeforeUpdate=="function";q||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==a||S!==E)&&Eu(t,c,a,E),$o=!1;var H=t.memoizedState;c.state=H,Gs(t,a,c,s),S=t.memoizedState,m!==a||H!==S||wt.current||$o?(typeof _=="function"&&(Br(t,o,_,a),S=t.memoizedState),(m=$o||Du(t,o,m,a,H,S,E))?(q||typeof c.UNSAFE_componentWillMount!="function"&&typeof c.componentWillMount!="function"||(typeof c.componentWillMount=="function"&&c.componentWillMount(),typeof c.UNSAFE_componentWillMount=="function"&&c.UNSAFE_componentWillMount()),typeof c.componentDidMount=="function"&&(t.flags|=4194308)):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=a,t.memoizedState=S),c.props=a,c.state=S,c.context=E,a=m):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{c=t.stateNode,iu(e,t),m=t.memoizedProps,E=t.type===t.elementType?m:Zt(t.type,m),c.props=E,q=t.pendingProps,H=c.context,S=o.contextType,typeof S=="object"&&S!==null?S=Ot(S):(S=kt(o)?ma:ft.current,S=Ga(t,S));var X=o.getDerivedStateFromProps;(_=typeof X=="function"||typeof c.getSnapshotBeforeUpdate=="function")||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==q||H!==S)&&Eu(t,c,a,S),$o=!1,H=t.memoizedState,c.state=H,Gs(t,a,c,s);var te=t.memoizedState;m!==q||H!==te||wt.current||$o?(typeof X=="function"&&(Br(t,o,X,a),te=t.memoizedState),(E=$o||Du(t,o,E,a,H,te,S)||!1)?(_||typeof c.UNSAFE_componentWillUpdate!="function"&&typeof c.componentWillUpdate!="function"||(typeof c.componentWillUpdate=="function"&&c.componentWillUpdate(a,te,S),typeof c.UNSAFE_componentWillUpdate=="function"&&c.UNSAFE_componentWillUpdate(a,te,S)),typeof c.componentDidUpdate=="function"&&(t.flags|=4),typeof c.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=te),c.props=a,c.state=te,c.context=S,a=E):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&H===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&H===e.memoizedState||(t.flags|=1024),a=!1)}return Yr(e,t,o,a,l,s)}function Yr(e,t,o,a,s,l){qu(e,t);var c=(t.flags&128)!==0;if(!a&&!c)return s&&Yd(t,o,!1),Ro(e,t,l);a=t.stateNode,rh.current=t;var m=c&&typeof o.getDerivedStateFromError!="function"?null:a.render();return t.flags|=1,e!==null&&c?(t.child=Za(t,e.child,null,l),t.child=Za(t,null,m,l)):Pt(e,t,m,l),t.memoizedState=a.state,s&&Yd(t,o,!0),t.child}function Wu(e){var t=e.stateNode;t.pendingContext?Kd(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Kd(e,t.context,!1),jr(e,t.containerInfo)}function Fu(e,t,o,a,s){return Qa(),wr(s),t.flags|=256,Pt(e,t,o,a),t.child}var Gr={dehydrated:null,treeContext:null,retryLane:0};function Xr(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ku(e,t,o){var a=t.pendingProps,s=Qe.current,l=!1,c=(t.flags&128)!==0,m;if((m=c)||(m=e!==null&&e.memoizedState===null?!1:(s&2)!==0),m?(l=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(s|=1),Fe(Qe,s&1),e===null)return Cr(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(c=a.children,e=a.fallback,l?(a=t.mode,l=t.child,c={mode:"hidden",children:c},(a&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=c):l=yn(c,a,0,null),e=xa(e,a,o,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Xr(o),t.memoizedState=Gr,e):$r(t,c));if(s=e.memoizedState,s!==null&&(m=s.dehydrated,m!==null))return lh(e,t,c,a,m,s,o);if(l){l=a.fallback,c=t.mode,s=e.child,m=s.sibling;var S={mode:"hidden",children:a.children};return(c&1)===0&&t.child!==s?(a=t.child,a.childLanes=0,a.pendingProps=S,t.deletions=null):(a=aa(s,S),a.subtreeFlags=s.subtreeFlags&14680064),m!==null?l=aa(m,l):(l=xa(l,c,o,null),l.flags|=2),l.return=t,a.return=t,a.sibling=l,t.child=a,a=l,l=t.child,c=e.child.memoizedState,c=c===null?Xr(o):{baseLanes:c.baseLanes|o,cachePool:null,transitions:c.transitions},l.memoizedState=c,l.childLanes=e.childLanes&~o,t.memoizedState=Gr,a}return l=e.child,e=l.sibling,a=aa(l,{mode:"visible",children:a.children}),(t.mode&1)===0&&(a.lanes=o),a.return=t,a.sibling=null,e!==null&&(o=t.deletions,o===null?(t.deletions=[e],t.flags|=16):o.push(e)),t.child=a,t.memoizedState=null,a}function $r(e,t){return t=yn({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function on(e,t,o,a){return a!==null&&wr(a),Za(t,e.child,null,o),e=$r(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function lh(e,t,o,a,s,l,c){if(o)return t.flags&256?(t.flags&=-257,a=Fr(Error(r(422))),on(e,t,c,a)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(l=a.fallback,s=t.mode,a=yn({mode:"visible",children:a.children},s,0,null),l=xa(l,s,c,null),l.flags|=2,a.return=t,l.return=t,a.sibling=l,t.child=a,(t.mode&1)!==0&&Za(t,e.child,null,c),t.child.memoizedState=Xr(c),t.memoizedState=Gr,l);if((t.mode&1)===0)return on(e,t,c,null);if(s.data==="$!"){if(a=s.nextSibling&&s.nextSibling.dataset,a)var m=a.dgst;return a=m,l=Error(r(419)),a=Fr(l,a,void 0),on(e,t,c,a)}if(m=(c&e.childLanes)!==0,xt||m){if(a=ct,a!==null){switch(c&-c){case 4:s=2;break;case 16:s=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:s=32;break;case 536870912:s=268435456;break;default:s=0}s=(s&(a.suspendedLanes|c))!==0?0:s,s!==0&&s!==l.retryLane&&(l.retryLane=s,ko(e,s),to(a,e,s,-1))}return pl(),a=Fr(Error(r(421))),on(e,t,c,a)}return s.data==="$?"?(t.flags|=128,t.child=e.child,t=Ph.bind(null,e),s._reactRetry=t,null):(e=l.treeContext,zt=Vo(s.nextSibling),Lt=t,Xe=!0,Qt=null,e!==null&&(_t[Nt++]=Co,_t[Nt++]=wo,_t[Nt++]=ya,Co=e.id,wo=e.overflow,ya=t),t=$r(t,a.children),t.flags|=4096,t)}function Vu(e,t,o){e.lanes|=t;var a=e.alternate;a!==null&&(a.lanes|=t),Ar(e.return,t,o)}function Qr(e,t,o,a,s){var l=e.memoizedState;l===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:o,tailMode:s}:(l.isBackwards=t,l.rendering=null,l.renderingStartTime=0,l.last=a,l.tail=o,l.tailMode=s)}function Yu(e,t,o){var a=t.pendingProps,s=a.revealOrder,l=a.tail;if(Pt(e,t,a.children,o),a=Qe.current,(a&2)!==0)a=a&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Vu(e,o,t);else if(e.tag===19)Vu(e,o,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}a&=1}if(Fe(Qe,a),(t.mode&1)===0)t.memoizedState=null;else switch(s){case"forwards":for(o=t.child,s=null;o!==null;)e=o.alternate,e!==null&&Xs(e)===null&&(s=o),o=o.sibling;o=s,o===null?(s=t.child,t.child=null):(s=o.sibling,o.sibling=null),Qr(t,!1,s,o,l);break;case"backwards":for(o=null,s=t.child,t.child=null;s!==null;){if(e=s.alternate,e!==null&&Xs(e)===null){t.child=s;break}e=s.sibling,s.sibling=o,o=s,s=e}Qr(t,!0,o,null,l);break;case"together":Qr(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function an(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Ro(e,t,o){if(e!==null&&(t.dependencies=e.dependencies),Pa|=t.lanes,(o&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(r(153));if(t.child!==null){for(e=t.child,o=aa(e,e.pendingProps),t.child=o,o.return=t;e.sibling!==null;)e=e.sibling,o=o.sibling=aa(e,e.pendingProps),o.return=t;o.sibling=null}return t.child}function dh(e,t,o){switch(t.tag){case 3:Wu(t),Qa();break;case 5:ru(t);break;case 1:kt(t.type)&&Ns(t);break;case 4:jr(t,t.stateNode.containerInfo);break;case 10:var a=t.type._context,s=t.memoizedProps.value;Fe(Ks,a._currentValue),a._currentValue=s;break;case 13:if(a=t.memoizedState,a!==null)return a.dehydrated!==null?(Fe(Qe,Qe.current&1),t.flags|=128,null):(o&t.child.childLanes)!==0?Ku(e,t,o):(Fe(Qe,Qe.current&1),e=Ro(e,t,o),e!==null?e.sibling:null);Fe(Qe,Qe.current&1);break;case 19:if(a=(o&t.childLanes)!==0,(e.flags&128)!==0){if(a)return Yu(e,t,o);t.flags|=128}if(s=t.memoizedState,s!==null&&(s.rendering=null,s.tail=null,s.lastEffect=null),Fe(Qe,Qe.current),a)break;return null;case 22:case 23:return t.lanes=0,Ou(e,t,o)}return Ro(e,t,o)}var Gu,Zr,Xu,$u;Gu=function(e,t){for(var o=t.child;o!==null;){if(o.tag===5||o.tag===6)e.appendChild(o.stateNode);else if(o.tag!==4&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break;for(;o.sibling===null;){if(o.return===null||o.return===t)return;o=o.return}o.sibling.return=o.return,o=o.sibling}},Zr=function(){},Xu=function(e,t,o,a){var s=e.memoizedProps;if(s!==a){e=t.stateNode,va(po.current);var l=null;switch(o){case"input":s=La(e,s),a=La(e,a),l=[];break;case"select":s=G({},s,{value:void 0}),a=G({},a,{value:void 0}),l=[];break;case"textarea":s=hi(e,s),a=hi(e,a),l=[];break;default:typeof s.onClick!="function"&&typeof a.onClick=="function"&&(e.onclick=Ms)}Ua(o,a);var c;o=null;for(E in s)if(!a.hasOwnProperty(E)&&s.hasOwnProperty(E)&&s[E]!=null)if(E==="style"){var m=s[E];for(c in m)m.hasOwnProperty(c)&&(o||(o={}),o[c]="")}else E!=="dangerouslySetInnerHTML"&&E!=="children"&&E!=="suppressContentEditableWarning"&&E!=="suppressHydrationWarning"&&E!=="autoFocus"&&(u.hasOwnProperty(E)?l||(l=[]):(l=l||[]).push(E,null));for(E in a){var S=a[E];if(m=s!=null?s[E]:void 0,a.hasOwnProperty(E)&&S!==m&&(S!=null||m!=null))if(E==="style")if(m){for(c in m)!m.hasOwnProperty(c)||S&&S.hasOwnProperty(c)||(o||(o={}),o[c]="");for(c in S)S.hasOwnProperty(c)&&m[c]!==S[c]&&(o||(o={}),o[c]=S[c])}else o||(l||(l=[]),l.push(E,o)),o=S;else E==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,m=m?m.__html:void 0,S!=null&&m!==S&&(l=l||[]).push(E,S)):E==="children"?typeof S!="string"&&typeof S!="number"||(l=l||[]).push(E,""+S):E!=="suppressContentEditableWarning"&&E!=="suppressHydrationWarning"&&(u.hasOwnProperty(E)?(S!=null&&E==="onScroll"&&Ye("scroll",e),l||m===S||(l=[])):(l=l||[]).push(E,S))}o&&(l=l||[]).push("style",o);var E=l;(t.updateQueue=E)&&(t.flags|=4)}},$u=function(e,t,o,a){o!==a&&(t.flags|=4)};function Gi(e,t){if(!Xe)switch(e.tailMode){case"hidden":t=e.tail;for(var o=null;t!==null;)t.alternate!==null&&(o=t),t=t.sibling;o===null?e.tail=null:o.sibling=null;break;case"collapsed":o=e.tail;for(var a=null;o!==null;)o.alternate!==null&&(a=o),o=o.sibling;a===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:a.sibling=null}}function vt(e){var t=e.alternate!==null&&e.alternate.child===e.child,o=0,a=0;if(t)for(var s=e.child;s!==null;)o|=s.lanes|s.childLanes,a|=s.subtreeFlags&14680064,a|=s.flags&14680064,s.return=e,s=s.sibling;else for(s=e.child;s!==null;)o|=s.lanes|s.childLanes,a|=s.subtreeFlags,a|=s.flags,s.return=e,s=s.sibling;return e.subtreeFlags|=a,e.childLanes=o,t}function uh(e,t,o){var a=t.pendingProps;switch(br(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return vt(t),null;case 1:return kt(t.type)&&_s(),vt(t),null;case 3:return a=t.stateNode,ti(),Ge(wt),Ge(ft),Lr(),a.pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),(e===null||e.child===null)&&(Ws(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Qt!==null&&(dl(Qt),Qt=null))),Zr(e,t),vt(t),null;case 5:Er(t);var s=va(Wi.current);if(o=t.type,e!==null&&t.stateNode!=null)Xu(e,t,o,a,s),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!a){if(t.stateNode===null)throw Error(r(166));return vt(t),null}if(e=va(po.current),Ws(t)){a=t.stateNode,o=t.type;var l=t.memoizedProps;switch(a[co]=t,a[_i]=l,e=(t.mode&1)!==0,o){case"dialog":Ye("cancel",a),Ye("close",a);break;case"iframe":case"object":case"embed":Ye("load",a);break;case"video":case"audio":for(s=0;s<Ui.length;s++)Ye(Ui[s],a);break;case"source":Ye("error",a);break;case"img":case"image":case"link":Ye("error",a),Ye("load",a);break;case"details":Ye("toggle",a);break;case"input":cs(a,l),Ye("invalid",a);break;case"select":a._wrapperState={wasMultiple:!!l.multiple},Ye("invalid",a);break;case"textarea":gs(a,l),Ye("invalid",a)}Ua(o,l),s=null;for(var c in l)if(l.hasOwnProperty(c)){var m=l[c];c==="children"?typeof m=="string"?a.textContent!==m&&(l.suppressHydrationWarning!==!0&&Us(a.textContent,m,e),s=["children",m]):typeof m=="number"&&a.textContent!==""+m&&(l.suppressHydrationWarning!==!0&&Us(a.textContent,m,e),s=["children",""+m]):u.hasOwnProperty(c)&&m!=null&&c==="onScroll"&&Ye("scroll",a)}switch(o){case"input":yo(a),ps(a,l,!0);break;case"textarea":yo(a),Uo(a);break;case"select":case"option":break;default:typeof l.onClick=="function"&&(a.onclick=Ms)}a=s,t.updateQueue=a,a!==null&&(t.flags|=4)}else{c=s.nodeType===9?s:s.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=mi(o)),e==="http://www.w3.org/1999/xhtml"?o==="script"?(e=c.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof a.is=="string"?e=c.createElement(o,{is:a.is}):(e=c.createElement(o),o==="select"&&(c=e,a.multiple?c.multiple=!0:a.size&&(c.size=a.size))):e=c.createElementNS(e,o),e[co]=t,e[_i]=a,Gu(e,t,!1,!1),t.stateNode=e;e:{switch(c=fi(o,a),o){case"dialog":Ye("cancel",e),Ye("close",e),s=a;break;case"iframe":case"object":case"embed":Ye("load",e),s=a;break;case"video":case"audio":for(s=0;s<Ui.length;s++)Ye(Ui[s],e);s=a;break;case"source":Ye("error",e),s=a;break;case"img":case"image":case"link":Ye("error",e),Ye("load",e),s=a;break;case"details":Ye("toggle",e),s=a;break;case"input":cs(e,a),s=La(e,a),Ye("invalid",e);break;case"option":s=a;break;case"select":e._wrapperState={wasMultiple:!!a.multiple},s=G({},a,{value:void 0}),Ye("invalid",e);break;case"textarea":gs(e,a),s=hi(e,a),Ye("invalid",e);break;default:s=a}Ua(o,s),m=s;for(l in m)if(m.hasOwnProperty(l)){var S=m[l];l==="style"?yi(e,S):l==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,S!=null&&Ht(e,S)):l==="children"?typeof S=="string"?(o!=="textarea"||S!=="")&&Mo(e,S):typeof S=="number"&&Mo(e,""+S):l!=="suppressContentEditableWarning"&&l!=="suppressHydrationWarning"&&l!=="autoFocus"&&(u.hasOwnProperty(l)?S!=null&&l==="onScroll"&&Ye("scroll",e):S!=null&&oe(e,l,S,c))}switch(o){case"input":yo(e),ps(e,a,!1);break;case"textarea":yo(e),Uo(e);break;case"option":a.value!=null&&e.setAttribute("value",""+xe(a.value));break;case"select":e.multiple=!!a.multiple,l=a.value,l!=null?zo(e,!!a.multiple,l,!1):a.defaultValue!=null&&zo(e,!!a.multiple,a.defaultValue,!0);break;default:typeof s.onClick=="function"&&(e.onclick=Ms)}switch(o){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}}a&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return vt(t),null;case 6:if(e&&t.stateNode!=null)$u(e,t,e.memoizedProps,a);else{if(typeof a!="string"&&t.stateNode===null)throw Error(r(166));if(o=va(Wi.current),va(po.current),Ws(t)){if(a=t.stateNode,o=t.memoizedProps,a[co]=t,(l=a.nodeValue!==o)&&(e=Lt,e!==null))switch(e.tag){case 3:Us(a.nodeValue,o,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&Us(a.nodeValue,o,(e.mode&1)!==0)}l&&(t.flags|=4)}else a=(o.nodeType===9?o:o.ownerDocument).createTextNode(a),a[co]=t,t.stateNode=a}return vt(t),null;case 13:if(Ge(Qe),a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(Xe&&zt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)Jd(),Qa(),t.flags|=98560,l=!1;else if(l=Ws(t),a!==null&&a.dehydrated!==null){if(e===null){if(!l)throw Error(r(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(r(317));l[co]=t}else Qa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;vt(t),l=!1}else Qt!==null&&(dl(Qt),Qt=null),l=!0;if(!l)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=o,t):(a=a!==null,a!==(e!==null&&e.memoizedState!==null)&&a&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(Qe.current&1)!==0?lt===0&&(lt=3):pl())),t.updateQueue!==null&&(t.flags|=4),vt(t),null);case 4:return ti(),Zr(e,t),e===null&&Mi(t.stateNode.containerInfo),vt(t),null;case 10:return Rr(t.type._context),vt(t),null;case 17:return kt(t.type)&&_s(),vt(t),null;case 19:if(Ge(Qe),l=t.memoizedState,l===null)return vt(t),null;if(a=(t.flags&128)!==0,c=l.rendering,c===null)if(a)Gi(l,!1);else{if(lt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(c=Xs(e),c!==null){for(t.flags|=128,Gi(l,!1),a=c.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),t.subtreeFlags=0,a=o,o=t.child;o!==null;)l=o,e=a,l.flags&=14680066,c=l.alternate,c===null?(l.childLanes=0,l.lanes=e,l.child=null,l.subtreeFlags=0,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=c.childLanes,l.lanes=c.lanes,l.child=c.child,l.subtreeFlags=0,l.deletions=null,l.memoizedProps=c.memoizedProps,l.memoizedState=c.memoizedState,l.updateQueue=c.updateQueue,l.type=c.type,e=c.dependencies,l.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),o=o.sibling;return Fe(Qe,Qe.current&1|2),t.child}e=e.sibling}l.tail!==null&&ze()>si&&(t.flags|=128,a=!0,Gi(l,!1),t.lanes=4194304)}else{if(!a)if(e=Xs(c),e!==null){if(t.flags|=128,a=!0,o=e.updateQueue,o!==null&&(t.updateQueue=o,t.flags|=4),Gi(l,!0),l.tail===null&&l.tailMode==="hidden"&&!c.alternate&&!Xe)return vt(t),null}else 2*ze()-l.renderingStartTime>si&&o!==1073741824&&(t.flags|=128,a=!0,Gi(l,!1),t.lanes=4194304);l.isBackwards?(c.sibling=t.child,t.child=c):(o=l.last,o!==null?o.sibling=c:t.child=c,l.last=c)}return l.tail!==null?(t=l.tail,l.rendering=t,l.tail=t.sibling,l.renderingStartTime=ze(),t.sibling=null,o=Qe.current,Fe(Qe,a?o&1|2:o&1),t):(vt(t),null);case 22:case 23:return cl(),a=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==a&&(t.flags|=8192),a&&(t.mode&1)!==0?(Ut&1073741824)!==0&&(vt(t),t.subtreeFlags&6&&(t.flags|=8192)):vt(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function ch(e,t){switch(br(t),t.tag){case 1:return kt(t.type)&&_s(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ti(),Ge(wt),Ge(ft),Lr(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Er(t),null;case 13:if(Ge(Qe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Qa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ge(Qe),null;case 4:return ti(),null;case 10:return Rr(t.type._context),null;case 22:case 23:return cl(),null;case 24:return null;default:return null}}var sn=!1,bt=!1,ph=typeof WeakSet=="function"?WeakSet:Set,Z=null;function ai(e,t){var o=e.ref;if(o!==null)if(typeof o=="function")try{o(null)}catch(a){tt(e,t,a)}else o.current=null}function Jr(e,t,o){try{o()}catch(a){tt(e,t,a)}}var Qu=!1;function gh(e,t){if(cr=ks,e=Dd(),ar(e)){if("selectionStart"in e)var o={start:e.selectionStart,end:e.selectionEnd};else e:{o=(o=e.ownerDocument)&&o.defaultView||window;var a=o.getSelection&&o.getSelection();if(a&&a.rangeCount!==0){o=a.anchorNode;var s=a.anchorOffset,l=a.focusNode;a=a.focusOffset;try{o.nodeType,l.nodeType}catch{o=null;break e}var c=0,m=-1,S=-1,E=0,_=0,q=e,H=null;t:for(;;){for(var X;q!==o||s!==0&&q.nodeType!==3||(m=c+s),q!==l||a!==0&&q.nodeType!==3||(S=c+a),q.nodeType===3&&(c+=q.nodeValue.length),(X=q.firstChild)!==null;)H=q,q=X;for(;;){if(q===e)break t;if(H===o&&++E===s&&(m=c),H===l&&++_===a&&(S=c),(X=q.nextSibling)!==null)break;q=H,H=q.parentNode}q=X}o=m===-1||S===-1?null:{start:m,end:S}}else o=null}o=o||{start:0,end:0}}else o=null;for(pr={focusedElem:e,selectionRange:o},ks=!1,Z=t;Z!==null;)if(t=Z,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Z=e;else for(;Z!==null;){t=Z;try{var te=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(te!==null){var se=te.memoizedProps,at=te.memoizedState,A=t.stateNode,b=A.getSnapshotBeforeUpdate(t.elementType===t.type?se:Zt(t.type,se),at);A.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var I=t.stateNode.containerInfo;I.nodeType===1?I.textContent="":I.nodeType===9&&I.documentElement&&I.removeChild(I.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(F){tt(t,t.return,F)}if(e=t.sibling,e!==null){e.return=t.return,Z=e;break}Z=t.return}return te=Qu,Qu=!1,te}function Xi(e,t,o){var a=t.updateQueue;if(a=a!==null?a.lastEffect:null,a!==null){var s=a=a.next;do{if((s.tag&e)===e){var l=s.destroy;s.destroy=void 0,l!==void 0&&Jr(t,o,l)}s=s.next}while(s!==a)}}function nn(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var o=t=t.next;do{if((o.tag&e)===e){var a=o.create;o.destroy=a()}o=o.next}while(o!==t)}}function el(e){var t=e.ref;if(t!==null){var o=e.stateNode;switch(e.tag){case 5:e=o;break;default:e=o}typeof t=="function"?t(e):t.current=e}}function Zu(e){var t=e.alternate;t!==null&&(e.alternate=null,Zu(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[co],delete t[_i],delete t[yr],delete t[Xg],delete t[$g])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ju(e){return e.tag===5||e.tag===3||e.tag===4}function ec(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ju(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function tl(e,t,o){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?o.nodeType===8?o.parentNode.insertBefore(e,t):o.insertBefore(e,t):(o.nodeType===8?(t=o.parentNode,t.insertBefore(e,o)):(t=o,t.appendChild(e)),o=o._reactRootContainer,o!=null||t.onclick!==null||(t.onclick=Ms));else if(a!==4&&(e=e.child,e!==null))for(tl(e,t,o),e=e.sibling;e!==null;)tl(e,t,o),e=e.sibling}function ol(e,t,o){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?o.insertBefore(e,t):o.appendChild(e);else if(a!==4&&(e=e.child,e!==null))for(ol(e,t,o),e=e.sibling;e!==null;)ol(e,t,o),e=e.sibling}var mt=null,Jt=!1;function Zo(e,t,o){for(o=o.child;o!==null;)tc(e,t,o),o=o.sibling}function tc(e,t,o){if(ht&&typeof ht.onCommitFiberUnmount=="function")try{ht.onCommitFiberUnmount(Be,o)}catch{}switch(o.tag){case 5:bt||ai(o,t);case 6:var a=mt,s=Jt;mt=null,Zo(e,t,o),mt=a,Jt=s,mt!==null&&(Jt?(e=mt,o=o.stateNode,e.nodeType===8?e.parentNode.removeChild(o):e.removeChild(o)):mt.removeChild(o.stateNode));break;case 18:mt!==null&&(Jt?(e=mt,o=o.stateNode,e.nodeType===8?mr(e.parentNode,o):e.nodeType===1&&mr(e,o),Ai(e)):mr(mt,o.stateNode));break;case 4:a=mt,s=Jt,mt=o.stateNode.containerInfo,Jt=!0,Zo(e,t,o),mt=a,Jt=s;break;case 0:case 11:case 14:case 15:if(!bt&&(a=o.updateQueue,a!==null&&(a=a.lastEffect,a!==null))){s=a=a.next;do{var l=s,c=l.destroy;l=l.tag,c!==void 0&&((l&2)!==0||(l&4)!==0)&&Jr(o,t,c),s=s.next}while(s!==a)}Zo(e,t,o);break;case 1:if(!bt&&(ai(o,t),a=o.stateNode,typeof a.componentWillUnmount=="function"))try{a.props=o.memoizedProps,a.state=o.memoizedState,a.componentWillUnmount()}catch(m){tt(o,t,m)}Zo(e,t,o);break;case 21:Zo(e,t,o);break;case 22:o.mode&1?(bt=(a=bt)||o.memoizedState!==null,Zo(e,t,o),bt=a):Zo(e,t,o);break;default:Zo(e,t,o)}}function oc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var o=e.stateNode;o===null&&(o=e.stateNode=new ph),t.forEach(function(a){var s=Ch.bind(null,e,a);o.has(a)||(o.add(a),a.then(s,s))})}}function eo(e,t){var o=t.deletions;if(o!==null)for(var a=0;a<o.length;a++){var s=o[a];try{var l=e,c=t,m=c;e:for(;m!==null;){switch(m.tag){case 5:mt=m.stateNode,Jt=!1;break e;case 3:mt=m.stateNode.containerInfo,Jt=!0;break e;case 4:mt=m.stateNode.containerInfo,Jt=!0;break e}m=m.return}if(mt===null)throw Error(r(160));tc(l,c,s),mt=null,Jt=!1;var S=s.alternate;S!==null&&(S.return=null),s.return=null}catch(E){tt(s,t,E)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)ac(t,e),t=t.sibling}function ac(e,t){var o=e.alternate,a=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(eo(t,e),ho(e),a&4){try{Xi(3,e,e.return),nn(3,e)}catch(se){tt(e,e.return,se)}try{Xi(5,e,e.return)}catch(se){tt(e,e.return,se)}}break;case 1:eo(t,e),ho(e),a&512&&o!==null&&ai(o,o.return);break;case 5:if(eo(t,e),ho(e),a&512&&o!==null&&ai(o,o.return),e.flags&32){var s=e.stateNode;try{Mo(s,"")}catch(se){tt(e,e.return,se)}}if(a&4&&(s=e.stateNode,s!=null)){var l=e.memoizedProps,c=o!==null?o.memoizedProps:l,m=e.type,S=e.updateQueue;if(e.updateQueue=null,S!==null)try{m==="input"&&l.type==="radio"&&l.name!=null&&io(s,l),fi(m,c);var E=fi(m,l);for(c=0;c<S.length;c+=2){var _=S[c],q=S[c+1];_==="style"?yi(s,q):_==="dangerouslySetInnerHTML"?Ht(s,q):_==="children"?Mo(s,q):oe(s,_,q,E)}switch(m){case"input":gi(s,l);break;case"textarea":so(s,l);break;case"select":var H=s._wrapperState.wasMultiple;s._wrapperState.wasMultiple=!!l.multiple;var X=l.value;X!=null?zo(s,!!l.multiple,X,!1):H!==!!l.multiple&&(l.defaultValue!=null?zo(s,!!l.multiple,l.defaultValue,!0):zo(s,!!l.multiple,l.multiple?[]:"",!1))}s[_i]=l}catch(se){tt(e,e.return,se)}}break;case 6:if(eo(t,e),ho(e),a&4){if(e.stateNode===null)throw Error(r(162));s=e.stateNode,l=e.memoizedProps;try{s.nodeValue=l}catch(se){tt(e,e.return,se)}}break;case 3:if(eo(t,e),ho(e),a&4&&o!==null&&o.memoizedState.isDehydrated)try{Ai(t.containerInfo)}catch(se){tt(e,e.return,se)}break;case 4:eo(t,e),ho(e);break;case 13:eo(t,e),ho(e),s=e.child,s.flags&8192&&(l=s.memoizedState!==null,s.stateNode.isHidden=l,!l||s.alternate!==null&&s.alternate.memoizedState!==null||(sl=ze())),a&4&&oc(e);break;case 22:if(_=o!==null&&o.memoizedState!==null,e.mode&1?(bt=(E=bt)||_,eo(t,e),bt=E):eo(t,e),ho(e),a&8192){if(E=e.memoizedState!==null,(e.stateNode.isHidden=E)&&!_&&(e.mode&1)!==0)for(Z=e,_=e.child;_!==null;){for(q=Z=_;Z!==null;){switch(H=Z,X=H.child,H.tag){case 0:case 11:case 14:case 15:Xi(4,H,H.return);break;case 1:ai(H,H.return);var te=H.stateNode;if(typeof te.componentWillUnmount=="function"){a=H,o=H.return;try{t=a,te.props=t.memoizedProps,te.state=t.memoizedState,te.componentWillUnmount()}catch(se){tt(a,o,se)}}break;case 5:ai(H,H.return);break;case 22:if(H.memoizedState!==null){nc(q);continue}}X!==null?(X.return=H,Z=X):nc(q)}_=_.sibling}e:for(_=null,q=e;;){if(q.tag===5){if(_===null){_=q;try{s=q.stateNode,E?(l=s.style,typeof l.setProperty=="function"?l.setProperty("display","none","important"):l.display="none"):(m=q.stateNode,S=q.memoizedProps.style,c=S!=null&&S.hasOwnProperty("display")?S.display:null,m.style.display=Gt("display",c))}catch(se){tt(e,e.return,se)}}}else if(q.tag===6){if(_===null)try{q.stateNode.nodeValue=E?"":q.memoizedProps}catch(se){tt(e,e.return,se)}}else if((q.tag!==22&&q.tag!==23||q.memoizedState===null||q===e)&&q.child!==null){q.child.return=q,q=q.child;continue}if(q===e)break e;for(;q.sibling===null;){if(q.return===null||q.return===e)break e;_===q&&(_=null),q=q.return}_===q&&(_=null),q.sibling.return=q.return,q=q.sibling}}break;case 19:eo(t,e),ho(e),a&4&&oc(e);break;case 21:break;default:eo(t,e),ho(e)}}function ho(e){var t=e.flags;if(t&2){try{e:{for(var o=e.return;o!==null;){if(Ju(o)){var a=o;break e}o=o.return}throw Error(r(160))}switch(a.tag){case 5:var s=a.stateNode;a.flags&32&&(Mo(s,""),a.flags&=-33);var l=ec(e);ol(e,l,s);break;case 3:case 4:var c=a.stateNode.containerInfo,m=ec(e);tl(e,m,c);break;default:throw Error(r(161))}}catch(S){tt(e,e.return,S)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function hh(e,t,o){Z=e,ic(e)}function ic(e,t,o){for(var a=(e.mode&1)!==0;Z!==null;){var s=Z,l=s.child;if(s.tag===22&&a){var c=s.memoizedState!==null||sn;if(!c){var m=s.alternate,S=m!==null&&m.memoizedState!==null||bt;m=sn;var E=bt;if(sn=c,(bt=S)&&!E)for(Z=s;Z!==null;)c=Z,S=c.child,c.tag===22&&c.memoizedState!==null?rc(s):S!==null?(S.return=c,Z=S):rc(s);for(;l!==null;)Z=l,ic(l),l=l.sibling;Z=s,sn=m,bt=E}sc(e)}else(s.subtreeFlags&8772)!==0&&l!==null?(l.return=s,Z=l):sc(e)}}function sc(e){for(;Z!==null;){var t=Z;if((t.flags&8772)!==0){var o=t.alternate;try{if((t.flags&8772)!==0)switch(t.tag){case 0:case 11:case 15:bt||nn(5,t);break;case 1:var a=t.stateNode;if(t.flags&4&&!bt)if(o===null)a.componentDidMount();else{var s=t.elementType===t.type?o.memoizedProps:Zt(t.type,o.memoizedProps);a.componentDidUpdate(s,o.memoizedState,a.__reactInternalSnapshotBeforeUpdate)}var l=t.updateQueue;l!==null&&nu(t,l,a);break;case 3:var c=t.updateQueue;if(c!==null){if(o=null,t.child!==null)switch(t.child.tag){case 5:o=t.child.stateNode;break;case 1:o=t.child.stateNode}nu(t,c,o)}break;case 5:var m=t.stateNode;if(o===null&&t.flags&4){o=m;var S=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":S.autoFocus&&o.focus();break;case"img":S.src&&(o.src=S.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var E=t.alternate;if(E!==null){var _=E.memoizedState;if(_!==null){var q=_.dehydrated;q!==null&&Ai(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(r(163))}bt||t.flags&512&&el(t)}catch(H){tt(t,t.return,H)}}if(t===e){Z=null;break}if(o=t.sibling,o!==null){o.return=t.return,Z=o;break}Z=t.return}}function nc(e){for(;Z!==null;){var t=Z;if(t===e){Z=null;break}var o=t.sibling;if(o!==null){o.return=t.return,Z=o;break}Z=t.return}}function rc(e){for(;Z!==null;){var t=Z;try{switch(t.tag){case 0:case 11:case 15:var o=t.return;try{nn(4,t)}catch(S){tt(t,o,S)}break;case 1:var a=t.stateNode;if(typeof a.componentDidMount=="function"){var s=t.return;try{a.componentDidMount()}catch(S){tt(t,s,S)}}var l=t.return;try{el(t)}catch(S){tt(t,l,S)}break;case 5:var c=t.return;try{el(t)}catch(S){tt(t,c,S)}}}catch(S){tt(t,t.return,S)}if(t===e){Z=null;break}var m=t.sibling;if(m!==null){m.return=t.return,Z=m;break}Z=t.return}}var mh=Math.ceil,rn=V.ReactCurrentDispatcher,al=V.ReactCurrentOwner,Bt=V.ReactCurrentBatchConfig,Ee=0,ct=null,it=null,yt=0,Ut=0,ii=Yo(0),lt=0,$i=null,Pa=0,ln=0,il=0,Qi=null,Rt=null,sl=0,si=1/0,Ao=null,dn=!1,nl=null,Jo=null,un=!1,ea=null,cn=0,Zi=0,rl=null,pn=-1,gn=0;function Ct(){return(Ee&6)!==0?ze():pn!==-1?pn:pn=ze()}function ta(e){return(e.mode&1)===0?1:(Ee&2)!==0&&yt!==0?yt&-yt:Zg.transition!==null?(gn===0&&(gn=ed()),gn):(e=Oe,e!==0||(e=window.event,e=e===void 0?16:dd(e.type)),e)}function to(e,t,o,a){if(50<Zi)throw Zi=0,rl=null,Error(r(185));Ci(e,o,a),((Ee&2)===0||e!==ct)&&(e===ct&&((Ee&2)===0&&(ln|=o),lt===4&&oa(e,yt)),At(e,a),o===1&&Ee===0&&(t.mode&1)===0&&(si=ze()+500,Os&&Xo()))}function At(e,t){var o=e.callbackNode;Zp(e,t);var a=Ps(e,e===ct?yt:0);if(a===0)o!==null&&fo(o),e.callbackNode=null,e.callbackPriority=0;else if(t=a&-a,e.callbackPriority!==t){if(o!=null&&fo(o),t===1)e.tag===0?Qg(dc.bind(null,e)):Gd(dc.bind(null,e)),Yg(function(){(Ee&6)===0&&Xo()}),o=null;else{switch(td(a)){case 1:o=So;break;case 4:o=uo;break;case 16:o=vo;break;case 536870912:o=Ie;break;default:o=vo}o=fc(o,lc.bind(null,e))}e.callbackPriority=t,e.callbackNode=o}}function lc(e,t){if(pn=-1,gn=0,(Ee&6)!==0)throw Error(r(327));var o=e.callbackNode;if(ni()&&e.callbackNode!==o)return null;var a=Ps(e,e===ct?yt:0);if(a===0)return null;if((a&30)!==0||(a&e.expiredLanes)!==0||t)t=hn(e,a);else{t=a;var s=Ee;Ee|=2;var l=cc();(ct!==e||yt!==t)&&(Ao=null,si=ze()+500,wa(e,t));do try{Sh();break}catch(m){uc(e,m)}while(!0);xr(),rn.current=l,Ee=s,it!==null?t=0:(ct=null,yt=0,t=lt)}if(t!==0){if(t===2&&(s=qn(e),s!==0&&(a=s,t=ll(e,s))),t===1)throw o=$i,wa(e,0),oa(e,a),At(e,ze()),o;if(t===6)oa(e,a);else{if(s=e.current.alternate,(a&30)===0&&!yh(s)&&(t=hn(e,a),t===2&&(l=qn(e),l!==0&&(a=l,t=ll(e,l))),t===1))throw o=$i,wa(e,0),oa(e,a),At(e,ze()),o;switch(e.finishedWork=s,e.finishedLanes=a,t){case 0:case 1:throw Error(r(345));case 2:ka(e,Rt,Ao);break;case 3:if(oa(e,a),(a&130023424)===a&&(t=sl+500-ze(),10<t)){if(Ps(e,0)!==0)break;if(s=e.suspendedLanes,(s&a)!==a){Ct(),e.pingedLanes|=e.suspendedLanes&s;break}e.timeoutHandle=hr(ka.bind(null,e,Rt,Ao),t);break}ka(e,Rt,Ao);break;case 4:if(oa(e,a),(a&4194240)===a)break;for(t=e.eventTimes,s=-1;0<a;){var c=31-Ue(a);l=1<<c,c=t[c],c>s&&(s=c),a&=~l}if(a=s,a=ze()-a,a=(120>a?120:480>a?480:1080>a?1080:1920>a?1920:3e3>a?3e3:4320>a?4320:1960*mh(a/1960))-a,10<a){e.timeoutHandle=hr(ka.bind(null,e,Rt,Ao),a);break}ka(e,Rt,Ao);break;case 5:ka(e,Rt,Ao);break;default:throw Error(r(329))}}}return At(e,ze()),e.callbackNode===o?lc.bind(null,e):null}function ll(e,t){var o=Qi;return e.current.memoizedState.isDehydrated&&(wa(e,t).flags|=256),e=hn(e,t),e!==2&&(t=Rt,Rt=o,t!==null&&dl(t)),e}function dl(e){Rt===null?Rt=e:Rt.push.apply(Rt,e)}function yh(e){for(var t=e;;){if(t.flags&16384){var o=t.updateQueue;if(o!==null&&(o=o.stores,o!==null))for(var a=0;a<o.length;a++){var s=o[a],l=s.getSnapshot;s=s.value;try{if(!$t(l(),s))return!1}catch{return!1}}}if(o=t.child,t.subtreeFlags&16384&&o!==null)o.return=t,t=o;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function oa(e,t){for(t&=~il,t&=~ln,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var o=31-Ue(t),a=1<<o;e[o]=-1,t&=~a}}function dc(e){if((Ee&6)!==0)throw Error(r(327));ni();var t=Ps(e,0);if((t&1)===0)return At(e,ze()),null;var o=hn(e,t);if(e.tag!==0&&o===2){var a=qn(e);a!==0&&(t=a,o=ll(e,a))}if(o===1)throw o=$i,wa(e,0),oa(e,t),At(e,ze()),o;if(o===6)throw Error(r(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,ka(e,Rt,Ao),At(e,ze()),null}function ul(e,t){var o=Ee;Ee|=1;try{return e(t)}finally{Ee=o,Ee===0&&(si=ze()+500,Os&&Xo())}}function Ca(e){ea!==null&&ea.tag===0&&(Ee&6)===0&&ni();var t=Ee;Ee|=1;var o=Bt.transition,a=Oe;try{if(Bt.transition=null,Oe=1,e)return e()}finally{Oe=a,Bt.transition=o,Ee=t,(Ee&6)===0&&Xo()}}function cl(){Ut=ii.current,Ge(ii)}function wa(e,t){e.finishedWork=null,e.finishedLanes=0;var o=e.timeoutHandle;if(o!==-1&&(e.timeoutHandle=-1,Vg(o)),it!==null)for(o=it.return;o!==null;){var a=o;switch(br(a),a.tag){case 1:a=a.type.childContextTypes,a!=null&&_s();break;case 3:ti(),Ge(wt),Ge(ft),Lr();break;case 5:Er(a);break;case 4:ti();break;case 13:Ge(Qe);break;case 19:Ge(Qe);break;case 10:Rr(a.type._context);break;case 22:case 23:cl()}o=o.return}if(ct=e,it=e=aa(e.current,null),yt=Ut=t,lt=0,$i=null,il=ln=Pa=0,Rt=Qi=null,Sa!==null){for(t=0;t<Sa.length;t++)if(o=Sa[t],a=o.interleaved,a!==null){o.interleaved=null;var s=a.next,l=o.pending;if(l!==null){var c=l.next;l.next=s,a.next=c}o.pending=a}Sa=null}return e}function uc(e,t){do{var o=it;try{if(xr(),$s.current=en,Qs){for(var a=Ze.memoizedState;a!==null;){var s=a.queue;s!==null&&(s.pending=null),a=a.next}Qs=!1}if(ba=0,ut=rt=Ze=null,Fi=!1,Ki=0,al.current=null,o===null||o.return===null){lt=1,$i=t,it=null;break}e:{var l=e,c=o.return,m=o,S=t;if(t=yt,m.flags|=32768,S!==null&&typeof S=="object"&&typeof S.then=="function"){var E=S,_=m,q=_.tag;if((_.mode&1)===0&&(q===0||q===11||q===15)){var H=_.alternate;H?(_.updateQueue=H.updateQueue,_.memoizedState=H.memoizedState,_.lanes=H.lanes):(_.updateQueue=null,_.memoizedState=null)}var X=Uu(c);if(X!==null){X.flags&=-257,Mu(X,c,m,l,t),X.mode&1&&zu(l,E,t),t=X,S=E;var te=t.updateQueue;if(te===null){var se=new Set;se.add(S),t.updateQueue=se}else te.add(S);break e}else{if((t&1)===0){zu(l,E,t),pl();break e}S=Error(r(426))}}else if(Xe&&m.mode&1){var at=Uu(c);if(at!==null){(at.flags&65536)===0&&(at.flags|=256),Mu(at,c,m,l,t),wr(oi(S,m));break e}}l=S=oi(S,m),lt!==4&&(lt=2),Qi===null?Qi=[l]:Qi.push(l),l=c;do{switch(l.tag){case 3:l.flags|=65536,t&=-t,l.lanes|=t;var A=Tu(l,S,t);su(l,A);break e;case 1:m=S;var b=l.type,I=l.stateNode;if((l.flags&128)===0&&(typeof b.getDerivedStateFromError=="function"||I!==null&&typeof I.componentDidCatch=="function"&&(Jo===null||!Jo.has(I)))){l.flags|=65536,t&=-t,l.lanes|=t;var F=Lu(l,m,t);su(l,F);break e}}l=l.return}while(l!==null)}gc(o)}catch(ne){t=ne,it===o&&o!==null&&(it=o=o.return);continue}break}while(!0)}function cc(){var e=rn.current;return rn.current=en,e===null?en:e}function pl(){(lt===0||lt===3||lt===2)&&(lt=4),ct===null||(Pa&268435455)===0&&(ln&268435455)===0||oa(ct,yt)}function hn(e,t){var o=Ee;Ee|=2;var a=cc();(ct!==e||yt!==t)&&(Ao=null,wa(e,t));do try{fh();break}catch(s){uc(e,s)}while(!0);if(xr(),Ee=o,rn.current=a,it!==null)throw Error(r(261));return ct=null,yt=0,lt}function fh(){for(;it!==null;)pc(it)}function Sh(){for(;it!==null&&!pa();)pc(it)}function pc(e){var t=yc(e.alternate,e,Ut);e.memoizedProps=e.pendingProps,t===null?gc(e):it=t,al.current=null}function gc(e){var t=e;do{var o=t.alternate;if(e=t.return,(t.flags&32768)===0){if(o=uh(o,t,Ut),o!==null){it=o;return}}else{if(o=ch(o,t),o!==null){o.flags&=32767,it=o;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{lt=6,it=null;return}}if(t=t.sibling,t!==null){it=t;return}it=t=e}while(t!==null);lt===0&&(lt=5)}function ka(e,t,o){var a=Oe,s=Bt.transition;try{Bt.transition=null,Oe=1,vh(e,t,o,a)}finally{Bt.transition=s,Oe=a}return null}function vh(e,t,o,a){do ni();while(ea!==null);if((Ee&6)!==0)throw Error(r(327));o=e.finishedWork;var s=e.finishedLanes;if(o===null)return null;if(e.finishedWork=null,e.finishedLanes=0,o===e.current)throw Error(r(177));e.callbackNode=null,e.callbackPriority=0;var l=o.lanes|o.childLanes;if(Jp(e,l),e===ct&&(it=ct=null,yt=0),(o.subtreeFlags&2064)===0&&(o.flags&2064)===0||un||(un=!0,fc(vo,function(){return ni(),null})),l=(o.flags&15990)!==0,(o.subtreeFlags&15990)!==0||l){l=Bt.transition,Bt.transition=null;var c=Oe;Oe=1;var m=Ee;Ee|=4,al.current=null,gh(e,o),ac(o,e),Ng(pr),ks=!!cr,pr=cr=null,e.current=o,hh(o),Xt(),Ee=m,Oe=c,Bt.transition=l}else e.current=o;if(un&&(un=!1,ea=e,cn=s),l=e.pendingLanes,l===0&&(Jo=null),ga(o.stateNode),At(e,ze()),t!==null)for(a=e.onRecoverableError,o=0;o<t.length;o++)s=t[o],a(s.value,{componentStack:s.stack,digest:s.digest});if(dn)throw dn=!1,e=nl,nl=null,e;return(cn&1)!==0&&e.tag!==0&&ni(),l=e.pendingLanes,(l&1)!==0?e===rl?Zi++:(Zi=0,rl=e):Zi=0,Xo(),null}function ni(){if(ea!==null){var e=td(cn),t=Bt.transition,o=Oe;try{if(Bt.transition=null,Oe=16>e?16:e,ea===null)var a=!1;else{if(e=ea,ea=null,cn=0,(Ee&6)!==0)throw Error(r(331));var s=Ee;for(Ee|=4,Z=e.current;Z!==null;){var l=Z,c=l.child;if((Z.flags&16)!==0){var m=l.deletions;if(m!==null){for(var S=0;S<m.length;S++){var E=m[S];for(Z=E;Z!==null;){var _=Z;switch(_.tag){case 0:case 11:case 15:Xi(8,_,l)}var q=_.child;if(q!==null)q.return=_,Z=q;else for(;Z!==null;){_=Z;var H=_.sibling,X=_.return;if(Zu(_),_===E){Z=null;break}if(H!==null){H.return=X,Z=H;break}Z=X}}}var te=l.alternate;if(te!==null){var se=te.child;if(se!==null){te.child=null;do{var at=se.sibling;se.sibling=null,se=at}while(se!==null)}}Z=l}}if((l.subtreeFlags&2064)!==0&&c!==null)c.return=l,Z=c;else e:for(;Z!==null;){if(l=Z,(l.flags&2048)!==0)switch(l.tag){case 0:case 11:case 15:Xi(9,l,l.return)}var A=l.sibling;if(A!==null){A.return=l.return,Z=A;break e}Z=l.return}}var b=e.current;for(Z=b;Z!==null;){c=Z;var I=c.child;if((c.subtreeFlags&2064)!==0&&I!==null)I.return=c,Z=I;else e:for(c=b;Z!==null;){if(m=Z,(m.flags&2048)!==0)try{switch(m.tag){case 0:case 11:case 15:nn(9,m)}}catch(ne){tt(m,m.return,ne)}if(m===c){Z=null;break e}var F=m.sibling;if(F!==null){F.return=m.return,Z=F;break e}Z=m.return}}if(Ee=s,Xo(),ht&&typeof ht.onPostCommitFiberRoot=="function")try{ht.onPostCommitFiberRoot(Be,e)}catch{}a=!0}return a}finally{Oe=o,Bt.transition=t}}return!1}function hc(e,t,o){t=oi(o,t),t=Tu(e,t,1),e=Qo(e,t,1),t=Ct(),e!==null&&(Ci(e,1,t),At(e,t))}function tt(e,t,o){if(e.tag===3)hc(e,e,o);else for(;t!==null;){if(t.tag===3){hc(t,e,o);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Jo===null||!Jo.has(a))){e=oi(o,e),e=Lu(t,e,1),t=Qo(t,e,1),e=Ct(),t!==null&&(Ci(t,1,e),At(t,e));break}}t=t.return}}function bh(e,t,o){var a=e.pingCache;a!==null&&a.delete(t),t=Ct(),e.pingedLanes|=e.suspendedLanes&o,ct===e&&(yt&o)===o&&(lt===4||lt===3&&(yt&130023424)===yt&&500>ze()-sl?wa(e,0):il|=o),At(e,t)}function mc(e,t){t===0&&((e.mode&1)===0?t=1:(t=bs,bs<<=1,(bs&130023424)===0&&(bs=4194304)));var o=Ct();e=ko(e,t),e!==null&&(Ci(e,t,o),At(e,o))}function Ph(e){var t=e.memoizedState,o=0;t!==null&&(o=t.retryLane),mc(e,o)}function Ch(e,t){var o=0;switch(e.tag){case 13:var a=e.stateNode,s=e.memoizedState;s!==null&&(o=s.retryLane);break;case 19:a=e.stateNode;break;default:throw Error(r(314))}a!==null&&a.delete(t),mc(e,o)}var yc;yc=function(e,t,o){if(e!==null)if(e.memoizedProps!==t.pendingProps||wt.current)xt=!0;else{if((e.lanes&o)===0&&(t.flags&128)===0)return xt=!1,dh(e,t,o);xt=(e.flags&131072)!==0}else xt=!1,Xe&&(t.flags&1048576)!==0&&Xd(t,Bs,t.index);switch(t.lanes=0,t.tag){case 2:var a=t.type;an(e,t),e=t.pendingProps;var s=Ga(t,ft.current);ei(t,o),s=Mr(null,t,a,e,s,o);var l=Hr();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,kt(a)?(l=!0,Ns(t)):l=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,Dr(t),s.updater=tn,t.stateNode=s,s._reactInternals=t,Wr(t,a,e,o),t=Yr(null,t,a,!0,l,o)):(t.tag=0,Xe&&l&&vr(t),Pt(null,t,s,o),t=t.child),t;case 16:a=t.elementType;e:{switch(an(e,t),e=t.pendingProps,s=a._init,a=s(a._payload),t.type=a,s=t.tag=kh(a),e=Zt(a,e),s){case 0:t=Vr(null,t,a,e,o);break e;case 1:t=Bu(null,t,a,e,o);break e;case 11:t=Hu(null,t,a,e,o);break e;case 14:t=_u(null,t,a,Zt(a.type,e),o);break e}throw Error(r(306,a,""))}return t;case 0:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Vr(e,t,a,s,o);case 1:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Bu(e,t,a,s,o);case 3:e:{if(Wu(t),e===null)throw Error(r(387));a=t.pendingProps,l=t.memoizedState,s=l.element,iu(e,t),Gs(t,a,null,o);var c=t.memoizedState;if(a=c.element,l.isDehydrated)if(l={element:a,isDehydrated:!1,cache:c.cache,pendingSuspenseBoundaries:c.pendingSuspenseBoundaries,transitions:c.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){s=oi(Error(r(423)),t),t=Fu(e,t,a,o,s);break e}else if(a!==s){s=oi(Error(r(424)),t),t=Fu(e,t,a,o,s);break e}else for(zt=Vo(t.stateNode.containerInfo.firstChild),Lt=t,Xe=!0,Qt=null,o=ou(t,null,a,o),t.child=o;o;)o.flags=o.flags&-3|4096,o=o.sibling;else{if(Qa(),a===s){t=Ro(e,t,o);break e}Pt(e,t,a,o)}t=t.child}return t;case 5:return ru(t),e===null&&Cr(t),a=t.type,s=t.pendingProps,l=e!==null?e.memoizedProps:null,c=s.children,gr(a,s)?c=null:l!==null&&gr(a,l)&&(t.flags|=32),qu(e,t),Pt(e,t,c,o),t.child;case 6:return e===null&&Cr(t),null;case 13:return Ku(e,t,o);case 4:return jr(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=Za(t,null,a,o):Pt(e,t,a,o),t.child;case 11:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Hu(e,t,a,s,o);case 7:return Pt(e,t,t.pendingProps,o),t.child;case 8:return Pt(e,t,t.pendingProps.children,o),t.child;case 12:return Pt(e,t,t.pendingProps.children,o),t.child;case 10:e:{if(a=t.type._context,s=t.pendingProps,l=t.memoizedProps,c=s.value,Fe(Ks,a._currentValue),a._currentValue=c,l!==null)if($t(l.value,c)){if(l.children===s.children&&!wt.current){t=Ro(e,t,o);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var m=l.dependencies;if(m!==null){c=l.child;for(var S=m.firstContext;S!==null;){if(S.context===a){if(l.tag===1){S=xo(-1,o&-o),S.tag=2;var E=l.updateQueue;if(E!==null){E=E.shared;var _=E.pending;_===null?S.next=S:(S.next=_.next,_.next=S),E.pending=S}}l.lanes|=o,S=l.alternate,S!==null&&(S.lanes|=o),Ar(l.return,o,t),m.lanes|=o;break}S=S.next}}else if(l.tag===10)c=l.type===t.type?null:l.child;else if(l.tag===18){if(c=l.return,c===null)throw Error(r(341));c.lanes|=o,m=c.alternate,m!==null&&(m.lanes|=o),Ar(c,o,t),c=l.sibling}else c=l.child;if(c!==null)c.return=l;else for(c=l;c!==null;){if(c===t){c=null;break}if(l=c.sibling,l!==null){l.return=c.return,c=l;break}c=c.return}l=c}Pt(e,t,s.children,o),t=t.child}return t;case 9:return s=t.type,a=t.pendingProps.children,ei(t,o),s=Ot(s),a=a(s),t.flags|=1,Pt(e,t,a,o),t.child;case 14:return a=t.type,s=Zt(a,t.pendingProps),s=Zt(a.type,s),_u(e,t,a,s,o);case 15:return Nu(e,t,t.type,t.pendingProps,o);case 17:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),an(e,t),t.tag=1,kt(a)?(e=!0,Ns(t)):e=!1,ei(t,o),ju(t,a,s),Wr(t,a,s,o),Yr(null,t,a,!0,e,o);case 19:return Yu(e,t,o);case 22:return Ou(e,t,o)}throw Error(r(156,t.tag))};function fc(e,t){return Ve(e,t)}function wh(e,t,o,a){this.tag=e,this.key=o,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Wt(e,t,o,a){return new wh(e,t,o,a)}function gl(e){return e=e.prototype,!(!e||!e.isReactComponent)}function kh(e){if(typeof e=="function")return gl(e)?1:0;if(e!=null){if(e=e.$$typeof,e===we)return 11;if(e===et)return 14}return 2}function aa(e,t){var o=e.alternate;return o===null?(o=Wt(e.tag,t,e.key,e.mode),o.elementType=e.elementType,o.type=e.type,o.stateNode=e.stateNode,o.alternate=e,e.alternate=o):(o.pendingProps=t,o.type=e.type,o.flags=0,o.subtreeFlags=0,o.deletions=null),o.flags=e.flags&14680064,o.childLanes=e.childLanes,o.lanes=e.lanes,o.child=e.child,o.memoizedProps=e.memoizedProps,o.memoizedState=e.memoizedState,o.updateQueue=e.updateQueue,t=e.dependencies,o.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},o.sibling=e.sibling,o.index=e.index,o.ref=e.ref,o}function mn(e,t,o,a,s,l){var c=2;if(a=e,typeof e=="function")gl(e)&&(c=1);else if(typeof e=="string")c=5;else e:switch(e){case j:return xa(o.children,s,l,t);case $:c=8,s|=8;break;case Se:return e=Wt(12,o,t,s|2),e.elementType=Se,e.lanes=l,e;case ke:return e=Wt(13,o,t,s),e.elementType=ke,e.lanes=l,e;case He:return e=Wt(19,o,t,s),e.elementType=He,e.lanes=l,e;case _e:return yn(o,s,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ce:c=10;break e;case Te:c=9;break e;case we:c=11;break e;case et:c=14;break e;case ot:c=16,a=null;break e}throw Error(r(130,e==null?e:typeof e,""))}return t=Wt(c,o,t,s),t.elementType=e,t.type=a,t.lanes=l,t}function xa(e,t,o,a){return e=Wt(7,e,a,t),e.lanes=o,e}function yn(e,t,o,a){return e=Wt(22,e,a,t),e.elementType=_e,e.lanes=o,e.stateNode={isHidden:!1},e}function hl(e,t,o){return e=Wt(6,e,null,t),e.lanes=o,e}function ml(e,t,o){return t=Wt(4,e.children!==null?e.children:[],e.key,t),t.lanes=o,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function xh(e,t,o,a,s){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Bn(0),this.expirationTimes=Bn(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Bn(0),this.identifierPrefix=a,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function yl(e,t,o,a,s,l,c,m,S){return e=new xh(e,t,o,m,S),t===1?(t=1,l===!0&&(t|=8)):t=0,l=Wt(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:a,isDehydrated:o,cache:null,transitions:null,pendingSuspenseBoundaries:null},Dr(l),e}function Rh(e,t,o){var a=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:De,key:a==null?null:""+a,children:e,containerInfo:t,implementation:o}}function Sc(e){if(!e)return Go;e=e._reactInternals;e:{if(J(e)!==e||e.tag!==1)throw Error(r(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(kt(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(r(171))}if(e.tag===1){var o=e.type;if(kt(o))return Vd(e,o,t)}return t}function vc(e,t,o,a,s,l,c,m,S){return e=yl(o,a,!0,e,s,l,c,m,S),e.context=Sc(null),o=e.current,a=Ct(),s=ta(o),l=xo(a,s),l.callback=t??null,Qo(o,l,s),e.current.lanes=s,Ci(e,s,a),At(e,a),e}function fn(e,t,o,a){var s=t.current,l=Ct(),c=ta(s);return o=Sc(o),t.context===null?t.context=o:t.pendingContext=o,t=xo(l,c),t.payload={element:e},a=a===void 0?null:a,a!==null&&(t.callback=a),e=Qo(s,t,c),e!==null&&(to(e,s,c,l),Ys(e,s,c)),c}function Sn(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function bc(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var o=e.retryLane;e.retryLane=o!==0&&o<t?o:t}}function fl(e,t){bc(e,t),(e=e.alternate)&&bc(e,t)}function Ah(){return null}var Pc=typeof reportError=="function"?reportError:function(e){console.error(e)};function Sl(e){this._internalRoot=e}vn.prototype.render=Sl.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(r(409));fn(e,t,null,null)},vn.prototype.unmount=Sl.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;Ca(function(){fn(null,e,null,null)}),t[bo]=null}};function vn(e){this._internalRoot=e}vn.prototype.unstable_scheduleHydration=function(e){if(e){var t=id();e={blockedOn:null,target:e,priority:t};for(var o=0;o<Wo.length&&t!==0&&t<Wo[o].priority;o++);Wo.splice(o,0,e),o===0&&rd(e)}};function vl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function bn(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function Cc(){}function Ih(e,t,o,a,s){if(s){if(typeof a=="function"){var l=a;a=function(){var E=Sn(c);l.call(E)}}var c=vc(t,a,e,0,null,!1,!1,"",Cc);return e._reactRootContainer=c,e[bo]=c.current,Mi(e.nodeType===8?e.parentNode:e),Ca(),c}for(;s=e.lastChild;)e.removeChild(s);if(typeof a=="function"){var m=a;a=function(){var E=Sn(S);m.call(E)}}var S=yl(e,0,!1,null,null,!1,!1,"",Cc);return e._reactRootContainer=S,e[bo]=S.current,Mi(e.nodeType===8?e.parentNode:e),Ca(function(){fn(t,S,o,a)}),S}function Pn(e,t,o,a,s){var l=o._reactRootContainer;if(l){var c=l;if(typeof s=="function"){var m=s;s=function(){var S=Sn(c);m.call(S)}}fn(t,c,e,s)}else c=Ih(o,t,e,s,a);return Sn(c)}od=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var o=Pi(t.pendingLanes);o!==0&&(Wn(t,o|1),At(t,ze()),(Ee&6)===0&&(si=ze()+500,Xo()))}break;case 13:Ca(function(){var a=ko(e,1);if(a!==null){var s=Ct();to(a,e,1,s)}}),fl(e,1)}},Fn=function(e){if(e.tag===13){var t=ko(e,134217728);if(t!==null){var o=Ct();to(t,e,134217728,o)}fl(e,134217728)}},ad=function(e){if(e.tag===13){var t=ta(e),o=ko(e,t);if(o!==null){var a=Ct();to(o,e,t,a)}fl(e,t)}},id=function(){return Oe},sd=function(e,t){var o=Oe;try{return Oe=e,t()}finally{Oe=o}},Ha=function(e,t,o){switch(t){case"input":if(gi(e,o),t=o.name,o.type==="radio"&&t!=null){for(o=e;o.parentNode;)o=o.parentNode;for(o=o.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<o.length;t++){var a=o[t];if(a!==e&&a.form===e.form){var s=Hs(a);if(!s)throw Error(r(90));dt(a),gi(a,s)}}}break;case"textarea":so(e,o);break;case"select":t=o.value,t!=null&&zo(e,!!o.multiple,t,!1)}},vi=ul,ua=Ca;var Dh={usingClientEntryPoint:!1,Events:[Ni,Va,Hs,Si,ys,ul]},Ji={findFiberByHostInstance:ha,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},jh={bundleType:Ji.bundleType,version:Ji.version,rendererPackageName:Ji.rendererPackageName,rendererConfig:Ji.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:V.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Ne(e),e===null?null:e.stateNode},findFiberByHostInstance:Ji.findFiberByHostInstance||Ah,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var Cn=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Cn.isDisabled&&Cn.supportsFiber)try{Be=Cn.inject(jh),ht=Cn}catch{}}return It.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Dh,It.createPortal=function(e,t){var o=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!vl(t))throw Error(r(200));return Rh(e,t,null,o)},It.createRoot=function(e,t){if(!vl(e))throw Error(r(299));var o=!1,a="",s=Pc;return t!=null&&(t.unstable_strictMode===!0&&(o=!0),t.identifierPrefix!==void 0&&(a=t.identifierPrefix),t.onRecoverableError!==void 0&&(s=t.onRecoverableError)),t=yl(e,1,!1,null,null,o,!1,a,s),e[bo]=t.current,Mi(e.nodeType===8?e.parentNode:e),new Sl(t)},It.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(r(188)):(e=Object.keys(e).join(","),Error(r(268,e)));return e=Ne(t),e=e===null?null:e.stateNode,e},It.flushSync=function(e){return Ca(e)},It.hydrate=function(e,t,o){if(!bn(t))throw Error(r(200));return Pn(null,e,t,!0,o)},It.hydrateRoot=function(e,t,o){if(!vl(e))throw Error(r(405));var a=o!=null&&o.hydratedSources||null,s=!1,l="",c=Pc;if(o!=null&&(o.unstable_strictMode===!0&&(s=!0),o.identifierPrefix!==void 0&&(l=o.identifierPrefix),o.onRecoverableError!==void 0&&(c=o.onRecoverableError)),t=vc(t,null,e,1,o??null,s,!1,l,c),e[bo]=t.current,Mi(e),a)for(e=0;e<a.length;e++)o=a[e],s=o._getVersion,s=s(o._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[o,s]:t.mutableSourceEagerHydrationData.push(o,s);return new vn(t)},It.render=function(e,t,o){if(!bn(t))throw Error(r(200));return Pn(null,e,t,!1,o)},It.unmountComponentAtNode=function(e){if(!bn(e))throw Error(r(40));return e._reactRootContainer?(Ca(function(){Pn(null,null,e,!1,function(){e._reactRootContainer=null,e[bo]=null})}),!0):!1},It.unstable_batchedUpdates=ul,It.unstable_renderSubtreeIntoContainer=function(e,t,o,a){if(!bn(o))throw Error(r(200));if(e==null||e._reactInternals===void 0)throw Error(r(38));return Pn(e,t,o,!1,a)},It.version="18.3.1-next-f1338f8080-20240426",It}var jc;function fp(){if(jc)return Cl.exports;jc=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(n){console.error(n)}}return i(),Cl.exports=Nh(),Cl.exports}var Ec;function Oh(){if(Ec)return wn;Ec=1;var i=fp();return wn.createRoot=i.createRoot,wn.hydrateRoot=i.hydrateRoot,wn}var qh=Oh(),R=Fl();const Bh=yp(R),Wh=mp({__proto__:null,default:Bh},[R]);var Ln=fp();const Fh=yp(Ln),Kh=mp({__proto__:null,default:Fh},[Ln]);/**
41
+ `+l.stack}return{value:e,source:t,stack:s,digest:null}}function Fr(e,t,o){return{value:e,source:null,stack:o??null,digest:t??null}}function Kr(e,t){try{console.error(t.value)}catch(o){setTimeout(function(){throw o})}}var nh=typeof WeakMap=="function"?WeakMap:Map;function Tu(e,t,o){o=xo(-1,o),o.tag=3,o.payload={element:null};var a=t.value;return o.callback=function(){dn||(dn=!0,nl=a),Kr(e,t)},o}function Lu(e,t,o){o=xo(-1,o),o.tag=3;var a=e.type.getDerivedStateFromError;if(typeof a=="function"){var s=t.value;o.payload=function(){return a(s)},o.callback=function(){Kr(e,t)}}var l=e.stateNode;return l!==null&&typeof l.componentDidCatch=="function"&&(o.callback=function(){Kr(e,t),typeof a!="function"&&(Jo===null?Jo=new Set([this]):Jo.add(this));var c=t.stack;this.componentDidCatch(t.value,{componentStack:c!==null?c:""})}),o}function zu(e,t,o){var a=e.pingCache;if(a===null){a=e.pingCache=new nh;var s=new Set;a.set(t,s)}else s=a.get(t),s===void 0&&(s=new Set,a.set(t,s));s.has(o)||(s.add(o),e=bh.bind(null,e,t,o),t.then(e,e))}function Uu(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Hu(e,t,o,a,s){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,o.flags|=131072,o.flags&=-52805,o.tag===1&&(o.alternate===null?o.tag=17:(t=xo(-1,1),t.tag=2,Qo(o,t,1))),o.lanes|=1),e):(e.flags|=65536,e.lanes=s,e)}var rh=V.ReactCurrentOwner,xt=!1;function Pt(e,t,o,a){t.child=e===null?ou(t,null,o,a):Za(t,e.child,o,a)}function Mu(e,t,o,a,s){o=o.render;var l=t.ref;return ei(t,s),a=Hr(e,t,o,a,l,s),o=Mr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Ro(e,t,s)):($e&&o&&vr(t),t.flags|=1,Pt(e,t,a,s),t.child)}function Nu(e,t,o,a,s){if(e===null){var l=o.type;return typeof l=="function"&&!gl(l)&&l.defaultProps===void 0&&o.compare===null&&o.defaultProps===void 0?(t.tag=15,t.type=l,_u(e,t,l,a,s)):(e=mn(o.type,null,a,t,t.mode,s),e.ref=t.ref,e.return=t,t.child=e)}if(l=e.child,(e.lanes&s)===0){var c=l.memoizedProps;if(o=o.compare,o=o!==null?o:Li,o(c,a)&&e.ref===t.ref)return Ro(e,t,s)}return t.flags|=1,e=aa(l,a),e.ref=t.ref,e.return=t,t.child=e}function _u(e,t,o,a,s){if(e!==null){var l=e.memoizedProps;if(Li(l,a)&&e.ref===t.ref)if(xt=!1,t.pendingProps=a=l,(e.lanes&s)!==0)(e.flags&131072)!==0&&(xt=!0);else return t.lanes=e.lanes,Ro(e,t,s)}return Vr(e,t,o,a,s)}function Ou(e,t,o){var a=t.pendingProps,s=a.children,l=e!==null?e.memoizedState:null;if(a.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Fe(ii,Ut),Ut|=o;else{if((o&1073741824)===0)return e=l!==null?l.baseLanes|o:o,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Fe(ii,Ut),Ut|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},a=l!==null?l.baseLanes:o,Fe(ii,Ut),Ut|=a}else l!==null?(a=l.baseLanes|o,t.memoizedState=null):a=o,Fe(ii,Ut),Ut|=a;return Pt(e,t,s,o),t.child}function qu(e,t){var o=t.ref;(e===null&&o!==null||e!==null&&e.ref!==o)&&(t.flags|=512,t.flags|=2097152)}function Vr(e,t,o,a,s){var l=kt(o)?ma:ft.current;return l=Ga(t,l),ei(t,s),o=Hr(e,t,o,a,l,s),a=Mr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Ro(e,t,s)):($e&&a&&vr(t),t.flags|=1,Pt(e,t,o,s),t.child)}function Bu(e,t,o,a,s){if(kt(o)){var l=!0;_s(t)}else l=!1;if(ei(t,s),t.stateNode===null)an(e,t),ju(t,o,a),Wr(t,o,a,s),a=!0;else if(e===null){var c=t.stateNode,m=t.memoizedProps;c.props=m;var S=c.context,E=o.contextType;typeof E=="object"&&E!==null?E=Ot(E):(E=kt(o)?ma:ft.current,E=Ga(t,E));var N=o.getDerivedStateFromProps,q=typeof N=="function"||typeof c.getSnapshotBeforeUpdate=="function";q||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==a||S!==E)&&Eu(t,c,a,E),Xo=!1;var M=t.memoizedState;c.state=M,Gs(t,a,c,s),S=t.memoizedState,m!==a||M!==S||Ct.current||Xo?(typeof N=="function"&&(Br(t,o,N,a),S=t.memoizedState),(m=Xo||Du(t,o,m,a,M,S,E))?(q||typeof c.UNSAFE_componentWillMount!="function"&&typeof c.componentWillMount!="function"||(typeof c.componentWillMount=="function"&&c.componentWillMount(),typeof c.UNSAFE_componentWillMount=="function"&&c.UNSAFE_componentWillMount()),typeof c.componentDidMount=="function"&&(t.flags|=4194308)):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=a,t.memoizedState=S),c.props=a,c.state=S,c.context=E,a=m):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{c=t.stateNode,iu(e,t),m=t.memoizedProps,E=t.type===t.elementType?m:Zt(t.type,m),c.props=E,q=t.pendingProps,M=c.context,S=o.contextType,typeof S=="object"&&S!==null?S=Ot(S):(S=kt(o)?ma:ft.current,S=Ga(t,S));var $=o.getDerivedStateFromProps;(N=typeof $=="function"||typeof c.getSnapshotBeforeUpdate=="function")||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==q||M!==S)&&Eu(t,c,a,S),Xo=!1,M=t.memoizedState,c.state=M,Gs(t,a,c,s);var te=t.memoizedState;m!==q||M!==te||Ct.current||Xo?(typeof $=="function"&&(Br(t,o,$,a),te=t.memoizedState),(E=Xo||Du(t,o,E,a,M,te,S)||!1)?(N||typeof c.UNSAFE_componentWillUpdate!="function"&&typeof c.componentWillUpdate!="function"||(typeof c.componentWillUpdate=="function"&&c.componentWillUpdate(a,te,S),typeof c.UNSAFE_componentWillUpdate=="function"&&c.UNSAFE_componentWillUpdate(a,te,S)),typeof c.componentDidUpdate=="function"&&(t.flags|=4),typeof c.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&M===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&M===e.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=te),c.props=a,c.state=te,c.context=S,a=E):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&M===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&M===e.memoizedState||(t.flags|=1024),a=!1)}return Yr(e,t,o,a,l,s)}function Yr(e,t,o,a,s,l){qu(e,t);var c=(t.flags&128)!==0;if(!a&&!c)return s&&Yd(t,o,!1),Ro(e,t,l);a=t.stateNode,rh.current=t;var m=c&&typeof o.getDerivedStateFromError!="function"?null:a.render();return t.flags|=1,e!==null&&c?(t.child=Za(t,e.child,null,l),t.child=Za(t,null,m,l)):Pt(e,t,m,l),t.memoizedState=a.state,s&&Yd(t,o,!0),t.child}function Wu(e){var t=e.stateNode;t.pendingContext?Kd(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Kd(e,t.context,!1),jr(e,t.containerInfo)}function Fu(e,t,o,a,s){return Qa(),Cr(s),t.flags|=256,Pt(e,t,o,a),t.child}var Gr={dehydrated:null,treeContext:null,retryLane:0};function $r(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ku(e,t,o){var a=t.pendingProps,s=Qe.current,l=!1,c=(t.flags&128)!==0,m;if((m=c)||(m=e!==null&&e.memoizedState===null?!1:(s&2)!==0),m?(l=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(s|=1),Fe(Qe,s&1),e===null)return wr(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(c=a.children,e=a.fallback,l?(a=t.mode,l=t.child,c={mode:"hidden",children:c},(a&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=c):l=yn(c,a,0,null),e=xa(e,a,o,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=$r(o),t.memoizedState=Gr,e):Xr(t,c));if(s=e.memoizedState,s!==null&&(m=s.dehydrated,m!==null))return lh(e,t,c,a,m,s,o);if(l){l=a.fallback,c=t.mode,s=e.child,m=s.sibling;var S={mode:"hidden",children:a.children};return(c&1)===0&&t.child!==s?(a=t.child,a.childLanes=0,a.pendingProps=S,t.deletions=null):(a=aa(s,S),a.subtreeFlags=s.subtreeFlags&14680064),m!==null?l=aa(m,l):(l=xa(l,c,o,null),l.flags|=2),l.return=t,a.return=t,a.sibling=l,t.child=a,a=l,l=t.child,c=e.child.memoizedState,c=c===null?$r(o):{baseLanes:c.baseLanes|o,cachePool:null,transitions:c.transitions},l.memoizedState=c,l.childLanes=e.childLanes&~o,t.memoizedState=Gr,a}return l=e.child,e=l.sibling,a=aa(l,{mode:"visible",children:a.children}),(t.mode&1)===0&&(a.lanes=o),a.return=t,a.sibling=null,e!==null&&(o=t.deletions,o===null?(t.deletions=[e],t.flags|=16):o.push(e)),t.child=a,t.memoizedState=null,a}function Xr(e,t){return t=yn({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function on(e,t,o,a){return a!==null&&Cr(a),Za(t,e.child,null,o),e=Xr(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function lh(e,t,o,a,s,l,c){if(o)return t.flags&256?(t.flags&=-257,a=Fr(Error(r(422))),on(e,t,c,a)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(l=a.fallback,s=t.mode,a=yn({mode:"visible",children:a.children},s,0,null),l=xa(l,s,c,null),l.flags|=2,a.return=t,l.return=t,a.sibling=l,t.child=a,(t.mode&1)!==0&&Za(t,e.child,null,c),t.child.memoizedState=$r(c),t.memoizedState=Gr,l);if((t.mode&1)===0)return on(e,t,c,null);if(s.data==="$!"){if(a=s.nextSibling&&s.nextSibling.dataset,a)var m=a.dgst;return a=m,l=Error(r(419)),a=Fr(l,a,void 0),on(e,t,c,a)}if(m=(c&e.childLanes)!==0,xt||m){if(a=ct,a!==null){switch(c&-c){case 4:s=2;break;case 16:s=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:s=32;break;case 536870912:s=268435456;break;default:s=0}s=(s&(a.suspendedLanes|c))!==0?0:s,s!==0&&s!==l.retryLane&&(l.retryLane=s,ko(e,s),to(a,e,s,-1))}return pl(),a=Fr(Error(r(421))),on(e,t,c,a)}return s.data==="$?"?(t.flags|=128,t.child=e.child,t=Ph.bind(null,e),s._reactRetry=t,null):(e=l.treeContext,zt=Vo(s.nextSibling),Lt=t,$e=!0,Qt=null,e!==null&&(Nt[_t++]=wo,Nt[_t++]=Co,Nt[_t++]=ya,wo=e.id,Co=e.overflow,ya=t),t=Xr(t,a.children),t.flags|=4096,t)}function Vu(e,t,o){e.lanes|=t;var a=e.alternate;a!==null&&(a.lanes|=t),Ar(e.return,t,o)}function Qr(e,t,o,a,s){var l=e.memoizedState;l===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:o,tailMode:s}:(l.isBackwards=t,l.rendering=null,l.renderingStartTime=0,l.last=a,l.tail=o,l.tailMode=s)}function Yu(e,t,o){var a=t.pendingProps,s=a.revealOrder,l=a.tail;if(Pt(e,t,a.children,o),a=Qe.current,(a&2)!==0)a=a&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Vu(e,o,t);else if(e.tag===19)Vu(e,o,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}a&=1}if(Fe(Qe,a),(t.mode&1)===0)t.memoizedState=null;else switch(s){case"forwards":for(o=t.child,s=null;o!==null;)e=o.alternate,e!==null&&$s(e)===null&&(s=o),o=o.sibling;o=s,o===null?(s=t.child,t.child=null):(s=o.sibling,o.sibling=null),Qr(t,!1,s,o,l);break;case"backwards":for(o=null,s=t.child,t.child=null;s!==null;){if(e=s.alternate,e!==null&&$s(e)===null){t.child=s;break}e=s.sibling,s.sibling=o,o=s,s=e}Qr(t,!0,o,null,l);break;case"together":Qr(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function an(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Ro(e,t,o){if(e!==null&&(t.dependencies=e.dependencies),Pa|=t.lanes,(o&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(r(153));if(t.child!==null){for(e=t.child,o=aa(e,e.pendingProps),t.child=o,o.return=t;e.sibling!==null;)e=e.sibling,o=o.sibling=aa(e,e.pendingProps),o.return=t;o.sibling=null}return t.child}function dh(e,t,o){switch(t.tag){case 3:Wu(t),Qa();break;case 5:ru(t);break;case 1:kt(t.type)&&_s(t);break;case 4:jr(t,t.stateNode.containerInfo);break;case 10:var a=t.type._context,s=t.memoizedProps.value;Fe(Ks,a._currentValue),a._currentValue=s;break;case 13:if(a=t.memoizedState,a!==null)return a.dehydrated!==null?(Fe(Qe,Qe.current&1),t.flags|=128,null):(o&t.child.childLanes)!==0?Ku(e,t,o):(Fe(Qe,Qe.current&1),e=Ro(e,t,o),e!==null?e.sibling:null);Fe(Qe,Qe.current&1);break;case 19:if(a=(o&t.childLanes)!==0,(e.flags&128)!==0){if(a)return Yu(e,t,o);t.flags|=128}if(s=t.memoizedState,s!==null&&(s.rendering=null,s.tail=null,s.lastEffect=null),Fe(Qe,Qe.current),a)break;return null;case 22:case 23:return t.lanes=0,Ou(e,t,o)}return Ro(e,t,o)}var Gu,Zr,$u,Xu;Gu=function(e,t){for(var o=t.child;o!==null;){if(o.tag===5||o.tag===6)e.appendChild(o.stateNode);else if(o.tag!==4&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break;for(;o.sibling===null;){if(o.return===null||o.return===t)return;o=o.return}o.sibling.return=o.return,o=o.sibling}},Zr=function(){},$u=function(e,t,o,a){var s=e.memoizedProps;if(s!==a){e=t.stateNode,va(po.current);var l=null;switch(o){case"input":s=La(e,s),a=La(e,a),l=[];break;case"select":s=G({},s,{value:void 0}),a=G({},a,{value:void 0}),l=[];break;case"textarea":s=hi(e,s),a=hi(e,a),l=[];break;default:typeof s.onClick!="function"&&typeof a.onClick=="function"&&(e.onclick=Hs)}Ua(o,a);var c;o=null;for(E in s)if(!a.hasOwnProperty(E)&&s.hasOwnProperty(E)&&s[E]!=null)if(E==="style"){var m=s[E];for(c in m)m.hasOwnProperty(c)&&(o||(o={}),o[c]="")}else E!=="dangerouslySetInnerHTML"&&E!=="children"&&E!=="suppressContentEditableWarning"&&E!=="suppressHydrationWarning"&&E!=="autoFocus"&&(u.hasOwnProperty(E)?l||(l=[]):(l=l||[]).push(E,null));for(E in a){var S=a[E];if(m=s!=null?s[E]:void 0,a.hasOwnProperty(E)&&S!==m&&(S!=null||m!=null))if(E==="style")if(m){for(c in m)!m.hasOwnProperty(c)||S&&S.hasOwnProperty(c)||(o||(o={}),o[c]="");for(c in S)S.hasOwnProperty(c)&&m[c]!==S[c]&&(o||(o={}),o[c]=S[c])}else o||(l||(l=[]),l.push(E,o)),o=S;else E==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,m=m?m.__html:void 0,S!=null&&m!==S&&(l=l||[]).push(E,S)):E==="children"?typeof S!="string"&&typeof S!="number"||(l=l||[]).push(E,""+S):E!=="suppressContentEditableWarning"&&E!=="suppressHydrationWarning"&&(u.hasOwnProperty(E)?(S!=null&&E==="onScroll"&&Ye("scroll",e),l||m===S||(l=[])):(l=l||[]).push(E,S))}o&&(l=l||[]).push("style",o);var E=l;(t.updateQueue=E)&&(t.flags|=4)}},Xu=function(e,t,o,a){o!==a&&(t.flags|=4)};function Gi(e,t){if(!$e)switch(e.tailMode){case"hidden":t=e.tail;for(var o=null;t!==null;)t.alternate!==null&&(o=t),t=t.sibling;o===null?e.tail=null:o.sibling=null;break;case"collapsed":o=e.tail;for(var a=null;o!==null;)o.alternate!==null&&(a=o),o=o.sibling;a===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:a.sibling=null}}function vt(e){var t=e.alternate!==null&&e.alternate.child===e.child,o=0,a=0;if(t)for(var s=e.child;s!==null;)o|=s.lanes|s.childLanes,a|=s.subtreeFlags&14680064,a|=s.flags&14680064,s.return=e,s=s.sibling;else for(s=e.child;s!==null;)o|=s.lanes|s.childLanes,a|=s.subtreeFlags,a|=s.flags,s.return=e,s=s.sibling;return e.subtreeFlags|=a,e.childLanes=o,t}function uh(e,t,o){var a=t.pendingProps;switch(br(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return vt(t),null;case 1:return kt(t.type)&&Ns(),vt(t),null;case 3:return a=t.stateNode,ti(),Ge(Ct),Ge(ft),Lr(),a.pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),(e===null||e.child===null)&&(Ws(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Qt!==null&&(dl(Qt),Qt=null))),Zr(e,t),vt(t),null;case 5:Er(t);var s=va(Wi.current);if(o=t.type,e!==null&&t.stateNode!=null)$u(e,t,o,a,s),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!a){if(t.stateNode===null)throw Error(r(166));return vt(t),null}if(e=va(po.current),Ws(t)){a=t.stateNode,o=t.type;var l=t.memoizedProps;switch(a[co]=t,a[Ni]=l,e=(t.mode&1)!==0,o){case"dialog":Ye("cancel",a),Ye("close",a);break;case"iframe":case"object":case"embed":Ye("load",a);break;case"video":case"audio":for(s=0;s<Ui.length;s++)Ye(Ui[s],a);break;case"source":Ye("error",a);break;case"img":case"image":case"link":Ye("error",a),Ye("load",a);break;case"details":Ye("toggle",a);break;case"input":cs(a,l),Ye("invalid",a);break;case"select":a._wrapperState={wasMultiple:!!l.multiple},Ye("invalid",a);break;case"textarea":gs(a,l),Ye("invalid",a)}Ua(o,l),s=null;for(var c in l)if(l.hasOwnProperty(c)){var m=l[c];c==="children"?typeof m=="string"?a.textContent!==m&&(l.suppressHydrationWarning!==!0&&Us(a.textContent,m,e),s=["children",m]):typeof m=="number"&&a.textContent!==""+m&&(l.suppressHydrationWarning!==!0&&Us(a.textContent,m,e),s=["children",""+m]):u.hasOwnProperty(c)&&m!=null&&c==="onScroll"&&Ye("scroll",a)}switch(o){case"input":yo(a),ps(a,l,!0);break;case"textarea":yo(a),Uo(a);break;case"select":case"option":break;default:typeof l.onClick=="function"&&(a.onclick=Hs)}a=s,t.updateQueue=a,a!==null&&(t.flags|=4)}else{c=s.nodeType===9?s:s.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=mi(o)),e==="http://www.w3.org/1999/xhtml"?o==="script"?(e=c.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof a.is=="string"?e=c.createElement(o,{is:a.is}):(e=c.createElement(o),o==="select"&&(c=e,a.multiple?c.multiple=!0:a.size&&(c.size=a.size))):e=c.createElementNS(e,o),e[co]=t,e[Ni]=a,Gu(e,t,!1,!1),t.stateNode=e;e:{switch(c=fi(o,a),o){case"dialog":Ye("cancel",e),Ye("close",e),s=a;break;case"iframe":case"object":case"embed":Ye("load",e),s=a;break;case"video":case"audio":for(s=0;s<Ui.length;s++)Ye(Ui[s],e);s=a;break;case"source":Ye("error",e),s=a;break;case"img":case"image":case"link":Ye("error",e),Ye("load",e),s=a;break;case"details":Ye("toggle",e),s=a;break;case"input":cs(e,a),s=La(e,a),Ye("invalid",e);break;case"option":s=a;break;case"select":e._wrapperState={wasMultiple:!!a.multiple},s=G({},a,{value:void 0}),Ye("invalid",e);break;case"textarea":gs(e,a),s=hi(e,a),Ye("invalid",e);break;default:s=a}Ua(o,s),m=s;for(l in m)if(m.hasOwnProperty(l)){var S=m[l];l==="style"?yi(e,S):l==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,S!=null&&Mt(e,S)):l==="children"?typeof S=="string"?(o!=="textarea"||S!=="")&&Ho(e,S):typeof S=="number"&&Ho(e,""+S):l!=="suppressContentEditableWarning"&&l!=="suppressHydrationWarning"&&l!=="autoFocus"&&(u.hasOwnProperty(l)?S!=null&&l==="onScroll"&&Ye("scroll",e):S!=null&&oe(e,l,S,c))}switch(o){case"input":yo(e),ps(e,a,!1);break;case"textarea":yo(e),Uo(e);break;case"option":a.value!=null&&e.setAttribute("value",""+xe(a.value));break;case"select":e.multiple=!!a.multiple,l=a.value,l!=null?zo(e,!!a.multiple,l,!1):a.defaultValue!=null&&zo(e,!!a.multiple,a.defaultValue,!0);break;default:typeof s.onClick=="function"&&(e.onclick=Hs)}switch(o){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}}a&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return vt(t),null;case 6:if(e&&t.stateNode!=null)Xu(e,t,e.memoizedProps,a);else{if(typeof a!="string"&&t.stateNode===null)throw Error(r(166));if(o=va(Wi.current),va(po.current),Ws(t)){if(a=t.stateNode,o=t.memoizedProps,a[co]=t,(l=a.nodeValue!==o)&&(e=Lt,e!==null))switch(e.tag){case 3:Us(a.nodeValue,o,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&Us(a.nodeValue,o,(e.mode&1)!==0)}l&&(t.flags|=4)}else a=(o.nodeType===9?o:o.ownerDocument).createTextNode(a),a[co]=t,t.stateNode=a}return vt(t),null;case 13:if(Ge(Qe),a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if($e&&zt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)Jd(),Qa(),t.flags|=98560,l=!1;else if(l=Ws(t),a!==null&&a.dehydrated!==null){if(e===null){if(!l)throw Error(r(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(r(317));l[co]=t}else Qa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;vt(t),l=!1}else Qt!==null&&(dl(Qt),Qt=null),l=!0;if(!l)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=o,t):(a=a!==null,a!==(e!==null&&e.memoizedState!==null)&&a&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(Qe.current&1)!==0?lt===0&&(lt=3):pl())),t.updateQueue!==null&&(t.flags|=4),vt(t),null);case 4:return ti(),Zr(e,t),e===null&&Hi(t.stateNode.containerInfo),vt(t),null;case 10:return Rr(t.type._context),vt(t),null;case 17:return kt(t.type)&&Ns(),vt(t),null;case 19:if(Ge(Qe),l=t.memoizedState,l===null)return vt(t),null;if(a=(t.flags&128)!==0,c=l.rendering,c===null)if(a)Gi(l,!1);else{if(lt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(c=$s(e),c!==null){for(t.flags|=128,Gi(l,!1),a=c.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),t.subtreeFlags=0,a=o,o=t.child;o!==null;)l=o,e=a,l.flags&=14680066,c=l.alternate,c===null?(l.childLanes=0,l.lanes=e,l.child=null,l.subtreeFlags=0,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=c.childLanes,l.lanes=c.lanes,l.child=c.child,l.subtreeFlags=0,l.deletions=null,l.memoizedProps=c.memoizedProps,l.memoizedState=c.memoizedState,l.updateQueue=c.updateQueue,l.type=c.type,e=c.dependencies,l.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),o=o.sibling;return Fe(Qe,Qe.current&1|2),t.child}e=e.sibling}l.tail!==null&&ze()>si&&(t.flags|=128,a=!0,Gi(l,!1),t.lanes=4194304)}else{if(!a)if(e=$s(c),e!==null){if(t.flags|=128,a=!0,o=e.updateQueue,o!==null&&(t.updateQueue=o,t.flags|=4),Gi(l,!0),l.tail===null&&l.tailMode==="hidden"&&!c.alternate&&!$e)return vt(t),null}else 2*ze()-l.renderingStartTime>si&&o!==1073741824&&(t.flags|=128,a=!0,Gi(l,!1),t.lanes=4194304);l.isBackwards?(c.sibling=t.child,t.child=c):(o=l.last,o!==null?o.sibling=c:t.child=c,l.last=c)}return l.tail!==null?(t=l.tail,l.rendering=t,l.tail=t.sibling,l.renderingStartTime=ze(),t.sibling=null,o=Qe.current,Fe(Qe,a?o&1|2:o&1),t):(vt(t),null);case 22:case 23:return cl(),a=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==a&&(t.flags|=8192),a&&(t.mode&1)!==0?(Ut&1073741824)!==0&&(vt(t),t.subtreeFlags&6&&(t.flags|=8192)):vt(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function ch(e,t){switch(br(t),t.tag){case 1:return kt(t.type)&&Ns(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ti(),Ge(Ct),Ge(ft),Lr(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Er(t),null;case 13:if(Ge(Qe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Qa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ge(Qe),null;case 4:return ti(),null;case 10:return Rr(t.type._context),null;case 22:case 23:return cl(),null;case 24:return null;default:return null}}var sn=!1,bt=!1,ph=typeof WeakSet=="function"?WeakSet:Set,Z=null;function ai(e,t){var o=e.ref;if(o!==null)if(typeof o=="function")try{o(null)}catch(a){tt(e,t,a)}else o.current=null}function Jr(e,t,o){try{o()}catch(a){tt(e,t,a)}}var Qu=!1;function gh(e,t){if(cr=ks,e=Dd(),ar(e)){if("selectionStart"in e)var o={start:e.selectionStart,end:e.selectionEnd};else e:{o=(o=e.ownerDocument)&&o.defaultView||window;var a=o.getSelection&&o.getSelection();if(a&&a.rangeCount!==0){o=a.anchorNode;var s=a.anchorOffset,l=a.focusNode;a=a.focusOffset;try{o.nodeType,l.nodeType}catch{o=null;break e}var c=0,m=-1,S=-1,E=0,N=0,q=e,M=null;t:for(;;){for(var $;q!==o||s!==0&&q.nodeType!==3||(m=c+s),q!==l||a!==0&&q.nodeType!==3||(S=c+a),q.nodeType===3&&(c+=q.nodeValue.length),($=q.firstChild)!==null;)M=q,q=$;for(;;){if(q===e)break t;if(M===o&&++E===s&&(m=c),M===l&&++N===a&&(S=c),($=q.nextSibling)!==null)break;q=M,M=q.parentNode}q=$}o=m===-1||S===-1?null:{start:m,end:S}}else o=null}o=o||{start:0,end:0}}else o=null;for(pr={focusedElem:e,selectionRange:o},ks=!1,Z=t;Z!==null;)if(t=Z,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Z=e;else for(;Z!==null;){t=Z;try{var te=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(te!==null){var se=te.memoizedProps,at=te.memoizedState,A=t.stateNode,b=A.getSnapshotBeforeUpdate(t.elementType===t.type?se:Zt(t.type,se),at);A.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var I=t.stateNode.containerInfo;I.nodeType===1?I.textContent="":I.nodeType===9&&I.documentElement&&I.removeChild(I.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(F){tt(t,t.return,F)}if(e=t.sibling,e!==null){e.return=t.return,Z=e;break}Z=t.return}return te=Qu,Qu=!1,te}function $i(e,t,o){var a=t.updateQueue;if(a=a!==null?a.lastEffect:null,a!==null){var s=a=a.next;do{if((s.tag&e)===e){var l=s.destroy;s.destroy=void 0,l!==void 0&&Jr(t,o,l)}s=s.next}while(s!==a)}}function nn(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var o=t=t.next;do{if((o.tag&e)===e){var a=o.create;o.destroy=a()}o=o.next}while(o!==t)}}function el(e){var t=e.ref;if(t!==null){var o=e.stateNode;switch(e.tag){case 5:e=o;break;default:e=o}typeof t=="function"?t(e):t.current=e}}function Zu(e){var t=e.alternate;t!==null&&(e.alternate=null,Zu(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[co],delete t[Ni],delete t[yr],delete t[$g],delete t[Xg])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ju(e){return e.tag===5||e.tag===3||e.tag===4}function ec(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ju(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function tl(e,t,o){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?o.nodeType===8?o.parentNode.insertBefore(e,t):o.insertBefore(e,t):(o.nodeType===8?(t=o.parentNode,t.insertBefore(e,o)):(t=o,t.appendChild(e)),o=o._reactRootContainer,o!=null||t.onclick!==null||(t.onclick=Hs));else if(a!==4&&(e=e.child,e!==null))for(tl(e,t,o),e=e.sibling;e!==null;)tl(e,t,o),e=e.sibling}function ol(e,t,o){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?o.insertBefore(e,t):o.appendChild(e);else if(a!==4&&(e=e.child,e!==null))for(ol(e,t,o),e=e.sibling;e!==null;)ol(e,t,o),e=e.sibling}var mt=null,Jt=!1;function Zo(e,t,o){for(o=o.child;o!==null;)tc(e,t,o),o=o.sibling}function tc(e,t,o){if(ht&&typeof ht.onCommitFiberUnmount=="function")try{ht.onCommitFiberUnmount(Be,o)}catch{}switch(o.tag){case 5:bt||ai(o,t);case 6:var a=mt,s=Jt;mt=null,Zo(e,t,o),mt=a,Jt=s,mt!==null&&(Jt?(e=mt,o=o.stateNode,e.nodeType===8?e.parentNode.removeChild(o):e.removeChild(o)):mt.removeChild(o.stateNode));break;case 18:mt!==null&&(Jt?(e=mt,o=o.stateNode,e.nodeType===8?mr(e.parentNode,o):e.nodeType===1&&mr(e,o),Ai(e)):mr(mt,o.stateNode));break;case 4:a=mt,s=Jt,mt=o.stateNode.containerInfo,Jt=!0,Zo(e,t,o),mt=a,Jt=s;break;case 0:case 11:case 14:case 15:if(!bt&&(a=o.updateQueue,a!==null&&(a=a.lastEffect,a!==null))){s=a=a.next;do{var l=s,c=l.destroy;l=l.tag,c!==void 0&&((l&2)!==0||(l&4)!==0)&&Jr(o,t,c),s=s.next}while(s!==a)}Zo(e,t,o);break;case 1:if(!bt&&(ai(o,t),a=o.stateNode,typeof a.componentWillUnmount=="function"))try{a.props=o.memoizedProps,a.state=o.memoizedState,a.componentWillUnmount()}catch(m){tt(o,t,m)}Zo(e,t,o);break;case 21:Zo(e,t,o);break;case 22:o.mode&1?(bt=(a=bt)||o.memoizedState!==null,Zo(e,t,o),bt=a):Zo(e,t,o);break;default:Zo(e,t,o)}}function oc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var o=e.stateNode;o===null&&(o=e.stateNode=new ph),t.forEach(function(a){var s=wh.bind(null,e,a);o.has(a)||(o.add(a),a.then(s,s))})}}function eo(e,t){var o=t.deletions;if(o!==null)for(var a=0;a<o.length;a++){var s=o[a];try{var l=e,c=t,m=c;e:for(;m!==null;){switch(m.tag){case 5:mt=m.stateNode,Jt=!1;break e;case 3:mt=m.stateNode.containerInfo,Jt=!0;break e;case 4:mt=m.stateNode.containerInfo,Jt=!0;break e}m=m.return}if(mt===null)throw Error(r(160));tc(l,c,s),mt=null,Jt=!1;var S=s.alternate;S!==null&&(S.return=null),s.return=null}catch(E){tt(s,t,E)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)ac(t,e),t=t.sibling}function ac(e,t){var o=e.alternate,a=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(eo(t,e),ho(e),a&4){try{$i(3,e,e.return),nn(3,e)}catch(se){tt(e,e.return,se)}try{$i(5,e,e.return)}catch(se){tt(e,e.return,se)}}break;case 1:eo(t,e),ho(e),a&512&&o!==null&&ai(o,o.return);break;case 5:if(eo(t,e),ho(e),a&512&&o!==null&&ai(o,o.return),e.flags&32){var s=e.stateNode;try{Ho(s,"")}catch(se){tt(e,e.return,se)}}if(a&4&&(s=e.stateNode,s!=null)){var l=e.memoizedProps,c=o!==null?o.memoizedProps:l,m=e.type,S=e.updateQueue;if(e.updateQueue=null,S!==null)try{m==="input"&&l.type==="radio"&&l.name!=null&&io(s,l),fi(m,c);var E=fi(m,l);for(c=0;c<S.length;c+=2){var N=S[c],q=S[c+1];N==="style"?yi(s,q):N==="dangerouslySetInnerHTML"?Mt(s,q):N==="children"?Ho(s,q):oe(s,N,q,E)}switch(m){case"input":gi(s,l);break;case"textarea":so(s,l);break;case"select":var M=s._wrapperState.wasMultiple;s._wrapperState.wasMultiple=!!l.multiple;var $=l.value;$!=null?zo(s,!!l.multiple,$,!1):M!==!!l.multiple&&(l.defaultValue!=null?zo(s,!!l.multiple,l.defaultValue,!0):zo(s,!!l.multiple,l.multiple?[]:"",!1))}s[Ni]=l}catch(se){tt(e,e.return,se)}}break;case 6:if(eo(t,e),ho(e),a&4){if(e.stateNode===null)throw Error(r(162));s=e.stateNode,l=e.memoizedProps;try{s.nodeValue=l}catch(se){tt(e,e.return,se)}}break;case 3:if(eo(t,e),ho(e),a&4&&o!==null&&o.memoizedState.isDehydrated)try{Ai(t.containerInfo)}catch(se){tt(e,e.return,se)}break;case 4:eo(t,e),ho(e);break;case 13:eo(t,e),ho(e),s=e.child,s.flags&8192&&(l=s.memoizedState!==null,s.stateNode.isHidden=l,!l||s.alternate!==null&&s.alternate.memoizedState!==null||(sl=ze())),a&4&&oc(e);break;case 22:if(N=o!==null&&o.memoizedState!==null,e.mode&1?(bt=(E=bt)||N,eo(t,e),bt=E):eo(t,e),ho(e),a&8192){if(E=e.memoizedState!==null,(e.stateNode.isHidden=E)&&!N&&(e.mode&1)!==0)for(Z=e,N=e.child;N!==null;){for(q=Z=N;Z!==null;){switch(M=Z,$=M.child,M.tag){case 0:case 11:case 14:case 15:$i(4,M,M.return);break;case 1:ai(M,M.return);var te=M.stateNode;if(typeof te.componentWillUnmount=="function"){a=M,o=M.return;try{t=a,te.props=t.memoizedProps,te.state=t.memoizedState,te.componentWillUnmount()}catch(se){tt(a,o,se)}}break;case 5:ai(M,M.return);break;case 22:if(M.memoizedState!==null){nc(q);continue}}$!==null?($.return=M,Z=$):nc(q)}N=N.sibling}e:for(N=null,q=e;;){if(q.tag===5){if(N===null){N=q;try{s=q.stateNode,E?(l=s.style,typeof l.setProperty=="function"?l.setProperty("display","none","important"):l.display="none"):(m=q.stateNode,S=q.memoizedProps.style,c=S!=null&&S.hasOwnProperty("display")?S.display:null,m.style.display=Gt("display",c))}catch(se){tt(e,e.return,se)}}}else if(q.tag===6){if(N===null)try{q.stateNode.nodeValue=E?"":q.memoizedProps}catch(se){tt(e,e.return,se)}}else if((q.tag!==22&&q.tag!==23||q.memoizedState===null||q===e)&&q.child!==null){q.child.return=q,q=q.child;continue}if(q===e)break e;for(;q.sibling===null;){if(q.return===null||q.return===e)break e;N===q&&(N=null),q=q.return}N===q&&(N=null),q.sibling.return=q.return,q=q.sibling}}break;case 19:eo(t,e),ho(e),a&4&&oc(e);break;case 21:break;default:eo(t,e),ho(e)}}function ho(e){var t=e.flags;if(t&2){try{e:{for(var o=e.return;o!==null;){if(Ju(o)){var a=o;break e}o=o.return}throw Error(r(160))}switch(a.tag){case 5:var s=a.stateNode;a.flags&32&&(Ho(s,""),a.flags&=-33);var l=ec(e);ol(e,l,s);break;case 3:case 4:var c=a.stateNode.containerInfo,m=ec(e);tl(e,m,c);break;default:throw Error(r(161))}}catch(S){tt(e,e.return,S)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function hh(e,t,o){Z=e,ic(e)}function ic(e,t,o){for(var a=(e.mode&1)!==0;Z!==null;){var s=Z,l=s.child;if(s.tag===22&&a){var c=s.memoizedState!==null||sn;if(!c){var m=s.alternate,S=m!==null&&m.memoizedState!==null||bt;m=sn;var E=bt;if(sn=c,(bt=S)&&!E)for(Z=s;Z!==null;)c=Z,S=c.child,c.tag===22&&c.memoizedState!==null?rc(s):S!==null?(S.return=c,Z=S):rc(s);for(;l!==null;)Z=l,ic(l),l=l.sibling;Z=s,sn=m,bt=E}sc(e)}else(s.subtreeFlags&8772)!==0&&l!==null?(l.return=s,Z=l):sc(e)}}function sc(e){for(;Z!==null;){var t=Z;if((t.flags&8772)!==0){var o=t.alternate;try{if((t.flags&8772)!==0)switch(t.tag){case 0:case 11:case 15:bt||nn(5,t);break;case 1:var a=t.stateNode;if(t.flags&4&&!bt)if(o===null)a.componentDidMount();else{var s=t.elementType===t.type?o.memoizedProps:Zt(t.type,o.memoizedProps);a.componentDidUpdate(s,o.memoizedState,a.__reactInternalSnapshotBeforeUpdate)}var l=t.updateQueue;l!==null&&nu(t,l,a);break;case 3:var c=t.updateQueue;if(c!==null){if(o=null,t.child!==null)switch(t.child.tag){case 5:o=t.child.stateNode;break;case 1:o=t.child.stateNode}nu(t,c,o)}break;case 5:var m=t.stateNode;if(o===null&&t.flags&4){o=m;var S=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":S.autoFocus&&o.focus();break;case"img":S.src&&(o.src=S.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var E=t.alternate;if(E!==null){var N=E.memoizedState;if(N!==null){var q=N.dehydrated;q!==null&&Ai(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(r(163))}bt||t.flags&512&&el(t)}catch(M){tt(t,t.return,M)}}if(t===e){Z=null;break}if(o=t.sibling,o!==null){o.return=t.return,Z=o;break}Z=t.return}}function nc(e){for(;Z!==null;){var t=Z;if(t===e){Z=null;break}var o=t.sibling;if(o!==null){o.return=t.return,Z=o;break}Z=t.return}}function rc(e){for(;Z!==null;){var t=Z;try{switch(t.tag){case 0:case 11:case 15:var o=t.return;try{nn(4,t)}catch(S){tt(t,o,S)}break;case 1:var a=t.stateNode;if(typeof a.componentDidMount=="function"){var s=t.return;try{a.componentDidMount()}catch(S){tt(t,s,S)}}var l=t.return;try{el(t)}catch(S){tt(t,l,S)}break;case 5:var c=t.return;try{el(t)}catch(S){tt(t,c,S)}}}catch(S){tt(t,t.return,S)}if(t===e){Z=null;break}var m=t.sibling;if(m!==null){m.return=t.return,Z=m;break}Z=t.return}}var mh=Math.ceil,rn=V.ReactCurrentDispatcher,al=V.ReactCurrentOwner,Bt=V.ReactCurrentBatchConfig,Ee=0,ct=null,it=null,yt=0,Ut=0,ii=Yo(0),lt=0,Xi=null,Pa=0,ln=0,il=0,Qi=null,Rt=null,sl=0,si=1/0,Ao=null,dn=!1,nl=null,Jo=null,un=!1,ea=null,cn=0,Zi=0,rl=null,pn=-1,gn=0;function wt(){return(Ee&6)!==0?ze():pn!==-1?pn:pn=ze()}function ta(e){return(e.mode&1)===0?1:(Ee&2)!==0&&yt!==0?yt&-yt:Zg.transition!==null?(gn===0&&(gn=ed()),gn):(e=Oe,e!==0||(e=window.event,e=e===void 0?16:dd(e.type)),e)}function to(e,t,o,a){if(50<Zi)throw Zi=0,rl=null,Error(r(185));wi(e,o,a),((Ee&2)===0||e!==ct)&&(e===ct&&((Ee&2)===0&&(ln|=o),lt===4&&oa(e,yt)),At(e,a),o===1&&Ee===0&&(t.mode&1)===0&&(si=ze()+500,Os&&$o()))}function At(e,t){var o=e.callbackNode;Zp(e,t);var a=Ps(e,e===ct?yt:0);if(a===0)o!==null&&fo(o),e.callbackNode=null,e.callbackPriority=0;else if(t=a&-a,e.callbackPriority!==t){if(o!=null&&fo(o),t===1)e.tag===0?Qg(dc.bind(null,e)):Gd(dc.bind(null,e)),Yg(function(){(Ee&6)===0&&$o()}),o=null;else{switch(td(a)){case 1:o=So;break;case 4:o=uo;break;case 16:o=vo;break;case 536870912:o=Ie;break;default:o=vo}o=fc(o,lc.bind(null,e))}e.callbackPriority=t,e.callbackNode=o}}function lc(e,t){if(pn=-1,gn=0,(Ee&6)!==0)throw Error(r(327));var o=e.callbackNode;if(ni()&&e.callbackNode!==o)return null;var a=Ps(e,e===ct?yt:0);if(a===0)return null;if((a&30)!==0||(a&e.expiredLanes)!==0||t)t=hn(e,a);else{t=a;var s=Ee;Ee|=2;var l=cc();(ct!==e||yt!==t)&&(Ao=null,si=ze()+500,Ca(e,t));do try{Sh();break}catch(m){uc(e,m)}while(!0);xr(),rn.current=l,Ee=s,it!==null?t=0:(ct=null,yt=0,t=lt)}if(t!==0){if(t===2&&(s=qn(e),s!==0&&(a=s,t=ll(e,s))),t===1)throw o=Xi,Ca(e,0),oa(e,a),At(e,ze()),o;if(t===6)oa(e,a);else{if(s=e.current.alternate,(a&30)===0&&!yh(s)&&(t=hn(e,a),t===2&&(l=qn(e),l!==0&&(a=l,t=ll(e,l))),t===1))throw o=Xi,Ca(e,0),oa(e,a),At(e,ze()),o;switch(e.finishedWork=s,e.finishedLanes=a,t){case 0:case 1:throw Error(r(345));case 2:ka(e,Rt,Ao);break;case 3:if(oa(e,a),(a&130023424)===a&&(t=sl+500-ze(),10<t)){if(Ps(e,0)!==0)break;if(s=e.suspendedLanes,(s&a)!==a){wt(),e.pingedLanes|=e.suspendedLanes&s;break}e.timeoutHandle=hr(ka.bind(null,e,Rt,Ao),t);break}ka(e,Rt,Ao);break;case 4:if(oa(e,a),(a&4194240)===a)break;for(t=e.eventTimes,s=-1;0<a;){var c=31-Ue(a);l=1<<c,c=t[c],c>s&&(s=c),a&=~l}if(a=s,a=ze()-a,a=(120>a?120:480>a?480:1080>a?1080:1920>a?1920:3e3>a?3e3:4320>a?4320:1960*mh(a/1960))-a,10<a){e.timeoutHandle=hr(ka.bind(null,e,Rt,Ao),a);break}ka(e,Rt,Ao);break;case 5:ka(e,Rt,Ao);break;default:throw Error(r(329))}}}return At(e,ze()),e.callbackNode===o?lc.bind(null,e):null}function ll(e,t){var o=Qi;return e.current.memoizedState.isDehydrated&&(Ca(e,t).flags|=256),e=hn(e,t),e!==2&&(t=Rt,Rt=o,t!==null&&dl(t)),e}function dl(e){Rt===null?Rt=e:Rt.push.apply(Rt,e)}function yh(e){for(var t=e;;){if(t.flags&16384){var o=t.updateQueue;if(o!==null&&(o=o.stores,o!==null))for(var a=0;a<o.length;a++){var s=o[a],l=s.getSnapshot;s=s.value;try{if(!Xt(l(),s))return!1}catch{return!1}}}if(o=t.child,t.subtreeFlags&16384&&o!==null)o.return=t,t=o;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function oa(e,t){for(t&=~il,t&=~ln,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var o=31-Ue(t),a=1<<o;e[o]=-1,t&=~a}}function dc(e){if((Ee&6)!==0)throw Error(r(327));ni();var t=Ps(e,0);if((t&1)===0)return At(e,ze()),null;var o=hn(e,t);if(e.tag!==0&&o===2){var a=qn(e);a!==0&&(t=a,o=ll(e,a))}if(o===1)throw o=Xi,Ca(e,0),oa(e,t),At(e,ze()),o;if(o===6)throw Error(r(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,ka(e,Rt,Ao),At(e,ze()),null}function ul(e,t){var o=Ee;Ee|=1;try{return e(t)}finally{Ee=o,Ee===0&&(si=ze()+500,Os&&$o())}}function wa(e){ea!==null&&ea.tag===0&&(Ee&6)===0&&ni();var t=Ee;Ee|=1;var o=Bt.transition,a=Oe;try{if(Bt.transition=null,Oe=1,e)return e()}finally{Oe=a,Bt.transition=o,Ee=t,(Ee&6)===0&&$o()}}function cl(){Ut=ii.current,Ge(ii)}function Ca(e,t){e.finishedWork=null,e.finishedLanes=0;var o=e.timeoutHandle;if(o!==-1&&(e.timeoutHandle=-1,Vg(o)),it!==null)for(o=it.return;o!==null;){var a=o;switch(br(a),a.tag){case 1:a=a.type.childContextTypes,a!=null&&Ns();break;case 3:ti(),Ge(Ct),Ge(ft),Lr();break;case 5:Er(a);break;case 4:ti();break;case 13:Ge(Qe);break;case 19:Ge(Qe);break;case 10:Rr(a.type._context);break;case 22:case 23:cl()}o=o.return}if(ct=e,it=e=aa(e.current,null),yt=Ut=t,lt=0,Xi=null,il=ln=Pa=0,Rt=Qi=null,Sa!==null){for(t=0;t<Sa.length;t++)if(o=Sa[t],a=o.interleaved,a!==null){o.interleaved=null;var s=a.next,l=o.pending;if(l!==null){var c=l.next;l.next=s,a.next=c}o.pending=a}Sa=null}return e}function uc(e,t){do{var o=it;try{if(xr(),Xs.current=en,Qs){for(var a=Ze.memoizedState;a!==null;){var s=a.queue;s!==null&&(s.pending=null),a=a.next}Qs=!1}if(ba=0,ut=rt=Ze=null,Fi=!1,Ki=0,al.current=null,o===null||o.return===null){lt=1,Xi=t,it=null;break}e:{var l=e,c=o.return,m=o,S=t;if(t=yt,m.flags|=32768,S!==null&&typeof S=="object"&&typeof S.then=="function"){var E=S,N=m,q=N.tag;if((N.mode&1)===0&&(q===0||q===11||q===15)){var M=N.alternate;M?(N.updateQueue=M.updateQueue,N.memoizedState=M.memoizedState,N.lanes=M.lanes):(N.updateQueue=null,N.memoizedState=null)}var $=Uu(c);if($!==null){$.flags&=-257,Hu($,c,m,l,t),$.mode&1&&zu(l,E,t),t=$,S=E;var te=t.updateQueue;if(te===null){var se=new Set;se.add(S),t.updateQueue=se}else te.add(S);break e}else{if((t&1)===0){zu(l,E,t),pl();break e}S=Error(r(426))}}else if($e&&m.mode&1){var at=Uu(c);if(at!==null){(at.flags&65536)===0&&(at.flags|=256),Hu(at,c,m,l,t),Cr(oi(S,m));break e}}l=S=oi(S,m),lt!==4&&(lt=2),Qi===null?Qi=[l]:Qi.push(l),l=c;do{switch(l.tag){case 3:l.flags|=65536,t&=-t,l.lanes|=t;var A=Tu(l,S,t);su(l,A);break e;case 1:m=S;var b=l.type,I=l.stateNode;if((l.flags&128)===0&&(typeof b.getDerivedStateFromError=="function"||I!==null&&typeof I.componentDidCatch=="function"&&(Jo===null||!Jo.has(I)))){l.flags|=65536,t&=-t,l.lanes|=t;var F=Lu(l,m,t);su(l,F);break e}}l=l.return}while(l!==null)}gc(o)}catch(ne){t=ne,it===o&&o!==null&&(it=o=o.return);continue}break}while(!0)}function cc(){var e=rn.current;return rn.current=en,e===null?en:e}function pl(){(lt===0||lt===3||lt===2)&&(lt=4),ct===null||(Pa&268435455)===0&&(ln&268435455)===0||oa(ct,yt)}function hn(e,t){var o=Ee;Ee|=2;var a=cc();(ct!==e||yt!==t)&&(Ao=null,Ca(e,t));do try{fh();break}catch(s){uc(e,s)}while(!0);if(xr(),Ee=o,rn.current=a,it!==null)throw Error(r(261));return ct=null,yt=0,lt}function fh(){for(;it!==null;)pc(it)}function Sh(){for(;it!==null&&!pa();)pc(it)}function pc(e){var t=yc(e.alternate,e,Ut);e.memoizedProps=e.pendingProps,t===null?gc(e):it=t,al.current=null}function gc(e){var t=e;do{var o=t.alternate;if(e=t.return,(t.flags&32768)===0){if(o=uh(o,t,Ut),o!==null){it=o;return}}else{if(o=ch(o,t),o!==null){o.flags&=32767,it=o;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{lt=6,it=null;return}}if(t=t.sibling,t!==null){it=t;return}it=t=e}while(t!==null);lt===0&&(lt=5)}function ka(e,t,o){var a=Oe,s=Bt.transition;try{Bt.transition=null,Oe=1,vh(e,t,o,a)}finally{Bt.transition=s,Oe=a}return null}function vh(e,t,o,a){do ni();while(ea!==null);if((Ee&6)!==0)throw Error(r(327));o=e.finishedWork;var s=e.finishedLanes;if(o===null)return null;if(e.finishedWork=null,e.finishedLanes=0,o===e.current)throw Error(r(177));e.callbackNode=null,e.callbackPriority=0;var l=o.lanes|o.childLanes;if(Jp(e,l),e===ct&&(it=ct=null,yt=0),(o.subtreeFlags&2064)===0&&(o.flags&2064)===0||un||(un=!0,fc(vo,function(){return ni(),null})),l=(o.flags&15990)!==0,(o.subtreeFlags&15990)!==0||l){l=Bt.transition,Bt.transition=null;var c=Oe;Oe=1;var m=Ee;Ee|=4,al.current=null,gh(e,o),ac(o,e),_g(pr),ks=!!cr,pr=cr=null,e.current=o,hh(o),$t(),Ee=m,Oe=c,Bt.transition=l}else e.current=o;if(un&&(un=!1,ea=e,cn=s),l=e.pendingLanes,l===0&&(Jo=null),ga(o.stateNode),At(e,ze()),t!==null)for(a=e.onRecoverableError,o=0;o<t.length;o++)s=t[o],a(s.value,{componentStack:s.stack,digest:s.digest});if(dn)throw dn=!1,e=nl,nl=null,e;return(cn&1)!==0&&e.tag!==0&&ni(),l=e.pendingLanes,(l&1)!==0?e===rl?Zi++:(Zi=0,rl=e):Zi=0,$o(),null}function ni(){if(ea!==null){var e=td(cn),t=Bt.transition,o=Oe;try{if(Bt.transition=null,Oe=16>e?16:e,ea===null)var a=!1;else{if(e=ea,ea=null,cn=0,(Ee&6)!==0)throw Error(r(331));var s=Ee;for(Ee|=4,Z=e.current;Z!==null;){var l=Z,c=l.child;if((Z.flags&16)!==0){var m=l.deletions;if(m!==null){for(var S=0;S<m.length;S++){var E=m[S];for(Z=E;Z!==null;){var N=Z;switch(N.tag){case 0:case 11:case 15:$i(8,N,l)}var q=N.child;if(q!==null)q.return=N,Z=q;else for(;Z!==null;){N=Z;var M=N.sibling,$=N.return;if(Zu(N),N===E){Z=null;break}if(M!==null){M.return=$,Z=M;break}Z=$}}}var te=l.alternate;if(te!==null){var se=te.child;if(se!==null){te.child=null;do{var at=se.sibling;se.sibling=null,se=at}while(se!==null)}}Z=l}}if((l.subtreeFlags&2064)!==0&&c!==null)c.return=l,Z=c;else e:for(;Z!==null;){if(l=Z,(l.flags&2048)!==0)switch(l.tag){case 0:case 11:case 15:$i(9,l,l.return)}var A=l.sibling;if(A!==null){A.return=l.return,Z=A;break e}Z=l.return}}var b=e.current;for(Z=b;Z!==null;){c=Z;var I=c.child;if((c.subtreeFlags&2064)!==0&&I!==null)I.return=c,Z=I;else e:for(c=b;Z!==null;){if(m=Z,(m.flags&2048)!==0)try{switch(m.tag){case 0:case 11:case 15:nn(9,m)}}catch(ne){tt(m,m.return,ne)}if(m===c){Z=null;break e}var F=m.sibling;if(F!==null){F.return=m.return,Z=F;break e}Z=m.return}}if(Ee=s,$o(),ht&&typeof ht.onPostCommitFiberRoot=="function")try{ht.onPostCommitFiberRoot(Be,e)}catch{}a=!0}return a}finally{Oe=o,Bt.transition=t}}return!1}function hc(e,t,o){t=oi(o,t),t=Tu(e,t,1),e=Qo(e,t,1),t=wt(),e!==null&&(wi(e,1,t),At(e,t))}function tt(e,t,o){if(e.tag===3)hc(e,e,o);else for(;t!==null;){if(t.tag===3){hc(t,e,o);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Jo===null||!Jo.has(a))){e=oi(o,e),e=Lu(t,e,1),t=Qo(t,e,1),e=wt(),t!==null&&(wi(t,1,e),At(t,e));break}}t=t.return}}function bh(e,t,o){var a=e.pingCache;a!==null&&a.delete(t),t=wt(),e.pingedLanes|=e.suspendedLanes&o,ct===e&&(yt&o)===o&&(lt===4||lt===3&&(yt&130023424)===yt&&500>ze()-sl?Ca(e,0):il|=o),At(e,t)}function mc(e,t){t===0&&((e.mode&1)===0?t=1:(t=bs,bs<<=1,(bs&130023424)===0&&(bs=4194304)));var o=wt();e=ko(e,t),e!==null&&(wi(e,t,o),At(e,o))}function Ph(e){var t=e.memoizedState,o=0;t!==null&&(o=t.retryLane),mc(e,o)}function wh(e,t){var o=0;switch(e.tag){case 13:var a=e.stateNode,s=e.memoizedState;s!==null&&(o=s.retryLane);break;case 19:a=e.stateNode;break;default:throw Error(r(314))}a!==null&&a.delete(t),mc(e,o)}var yc;yc=function(e,t,o){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ct.current)xt=!0;else{if((e.lanes&o)===0&&(t.flags&128)===0)return xt=!1,dh(e,t,o);xt=(e.flags&131072)!==0}else xt=!1,$e&&(t.flags&1048576)!==0&&$d(t,Bs,t.index);switch(t.lanes=0,t.tag){case 2:var a=t.type;an(e,t),e=t.pendingProps;var s=Ga(t,ft.current);ei(t,o),s=Hr(null,t,a,e,s,o);var l=Mr();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,kt(a)?(l=!0,_s(t)):l=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,Dr(t),s.updater=tn,t.stateNode=s,s._reactInternals=t,Wr(t,a,e,o),t=Yr(null,t,a,!0,l,o)):(t.tag=0,$e&&l&&vr(t),Pt(null,t,s,o),t=t.child),t;case 16:a=t.elementType;e:{switch(an(e,t),e=t.pendingProps,s=a._init,a=s(a._payload),t.type=a,s=t.tag=kh(a),e=Zt(a,e),s){case 0:t=Vr(null,t,a,e,o);break e;case 1:t=Bu(null,t,a,e,o);break e;case 11:t=Mu(null,t,a,e,o);break e;case 14:t=Nu(null,t,a,Zt(a.type,e),o);break e}throw Error(r(306,a,""))}return t;case 0:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Vr(e,t,a,s,o);case 1:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Bu(e,t,a,s,o);case 3:e:{if(Wu(t),e===null)throw Error(r(387));a=t.pendingProps,l=t.memoizedState,s=l.element,iu(e,t),Gs(t,a,null,o);var c=t.memoizedState;if(a=c.element,l.isDehydrated)if(l={element:a,isDehydrated:!1,cache:c.cache,pendingSuspenseBoundaries:c.pendingSuspenseBoundaries,transitions:c.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){s=oi(Error(r(423)),t),t=Fu(e,t,a,o,s);break e}else if(a!==s){s=oi(Error(r(424)),t),t=Fu(e,t,a,o,s);break e}else for(zt=Vo(t.stateNode.containerInfo.firstChild),Lt=t,$e=!0,Qt=null,o=ou(t,null,a,o),t.child=o;o;)o.flags=o.flags&-3|4096,o=o.sibling;else{if(Qa(),a===s){t=Ro(e,t,o);break e}Pt(e,t,a,o)}t=t.child}return t;case 5:return ru(t),e===null&&wr(t),a=t.type,s=t.pendingProps,l=e!==null?e.memoizedProps:null,c=s.children,gr(a,s)?c=null:l!==null&&gr(a,l)&&(t.flags|=32),qu(e,t),Pt(e,t,c,o),t.child;case 6:return e===null&&wr(t),null;case 13:return Ku(e,t,o);case 4:return jr(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=Za(t,null,a,o):Pt(e,t,a,o),t.child;case 11:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Mu(e,t,a,s,o);case 7:return Pt(e,t,t.pendingProps,o),t.child;case 8:return Pt(e,t,t.pendingProps.children,o),t.child;case 12:return Pt(e,t,t.pendingProps.children,o),t.child;case 10:e:{if(a=t.type._context,s=t.pendingProps,l=t.memoizedProps,c=s.value,Fe(Ks,a._currentValue),a._currentValue=c,l!==null)if(Xt(l.value,c)){if(l.children===s.children&&!Ct.current){t=Ro(e,t,o);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var m=l.dependencies;if(m!==null){c=l.child;for(var S=m.firstContext;S!==null;){if(S.context===a){if(l.tag===1){S=xo(-1,o&-o),S.tag=2;var E=l.updateQueue;if(E!==null){E=E.shared;var N=E.pending;N===null?S.next=S:(S.next=N.next,N.next=S),E.pending=S}}l.lanes|=o,S=l.alternate,S!==null&&(S.lanes|=o),Ar(l.return,o,t),m.lanes|=o;break}S=S.next}}else if(l.tag===10)c=l.type===t.type?null:l.child;else if(l.tag===18){if(c=l.return,c===null)throw Error(r(341));c.lanes|=o,m=c.alternate,m!==null&&(m.lanes|=o),Ar(c,o,t),c=l.sibling}else c=l.child;if(c!==null)c.return=l;else for(c=l;c!==null;){if(c===t){c=null;break}if(l=c.sibling,l!==null){l.return=c.return,c=l;break}c=c.return}l=c}Pt(e,t,s.children,o),t=t.child}return t;case 9:return s=t.type,a=t.pendingProps.children,ei(t,o),s=Ot(s),a=a(s),t.flags|=1,Pt(e,t,a,o),t.child;case 14:return a=t.type,s=Zt(a,t.pendingProps),s=Zt(a.type,s),Nu(e,t,a,s,o);case 15:return _u(e,t,t.type,t.pendingProps,o);case 17:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),an(e,t),t.tag=1,kt(a)?(e=!0,_s(t)):e=!1,ei(t,o),ju(t,a,s),Wr(t,a,s,o),Yr(null,t,a,!0,e,o);case 19:return Yu(e,t,o);case 22:return Ou(e,t,o)}throw Error(r(156,t.tag))};function fc(e,t){return Ve(e,t)}function Ch(e,t,o,a){this.tag=e,this.key=o,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Wt(e,t,o,a){return new Ch(e,t,o,a)}function gl(e){return e=e.prototype,!(!e||!e.isReactComponent)}function kh(e){if(typeof e=="function")return gl(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ce)return 11;if(e===et)return 14}return 2}function aa(e,t){var o=e.alternate;return o===null?(o=Wt(e.tag,t,e.key,e.mode),o.elementType=e.elementType,o.type=e.type,o.stateNode=e.stateNode,o.alternate=e,e.alternate=o):(o.pendingProps=t,o.type=e.type,o.flags=0,o.subtreeFlags=0,o.deletions=null),o.flags=e.flags&14680064,o.childLanes=e.childLanes,o.lanes=e.lanes,o.child=e.child,o.memoizedProps=e.memoizedProps,o.memoizedState=e.memoizedState,o.updateQueue=e.updateQueue,t=e.dependencies,o.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},o.sibling=e.sibling,o.index=e.index,o.ref=e.ref,o}function mn(e,t,o,a,s,l){var c=2;if(a=e,typeof e=="function")gl(e)&&(c=1);else if(typeof e=="string")c=5;else e:switch(e){case j:return xa(o.children,s,l,t);case X:c=8,s|=8;break;case Se:return e=Wt(12,o,t,s|2),e.elementType=Se,e.lanes=l,e;case ke:return e=Wt(13,o,t,s),e.elementType=ke,e.lanes=l,e;case Me:return e=Wt(19,o,t,s),e.elementType=Me,e.lanes=l,e;case Ne:return yn(o,s,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ce:c=10;break e;case Te:c=9;break e;case Ce:c=11;break e;case et:c=14;break e;case ot:c=16,a=null;break e}throw Error(r(130,e==null?e:typeof e,""))}return t=Wt(c,o,t,s),t.elementType=e,t.type=a,t.lanes=l,t}function xa(e,t,o,a){return e=Wt(7,e,a,t),e.lanes=o,e}function yn(e,t,o,a){return e=Wt(22,e,a,t),e.elementType=Ne,e.lanes=o,e.stateNode={isHidden:!1},e}function hl(e,t,o){return e=Wt(6,e,null,t),e.lanes=o,e}function ml(e,t,o){return t=Wt(4,e.children!==null?e.children:[],e.key,t),t.lanes=o,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function xh(e,t,o,a,s){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Bn(0),this.expirationTimes=Bn(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Bn(0),this.identifierPrefix=a,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function yl(e,t,o,a,s,l,c,m,S){return e=new xh(e,t,o,m,S),t===1?(t=1,l===!0&&(t|=8)):t=0,l=Wt(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:a,isDehydrated:o,cache:null,transitions:null,pendingSuspenseBoundaries:null},Dr(l),e}function Rh(e,t,o){var a=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:De,key:a==null?null:""+a,children:e,containerInfo:t,implementation:o}}function Sc(e){if(!e)return Go;e=e._reactInternals;e:{if(J(e)!==e||e.tag!==1)throw Error(r(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(kt(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(r(171))}if(e.tag===1){var o=e.type;if(kt(o))return Vd(e,o,t)}return t}function vc(e,t,o,a,s,l,c,m,S){return e=yl(o,a,!0,e,s,l,c,m,S),e.context=Sc(null),o=e.current,a=wt(),s=ta(o),l=xo(a,s),l.callback=t??null,Qo(o,l,s),e.current.lanes=s,wi(e,s,a),At(e,a),e}function fn(e,t,o,a){var s=t.current,l=wt(),c=ta(s);return o=Sc(o),t.context===null?t.context=o:t.pendingContext=o,t=xo(l,c),t.payload={element:e},a=a===void 0?null:a,a!==null&&(t.callback=a),e=Qo(s,t,c),e!==null&&(to(e,s,c,l),Ys(e,s,c)),c}function Sn(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function bc(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var o=e.retryLane;e.retryLane=o!==0&&o<t?o:t}}function fl(e,t){bc(e,t),(e=e.alternate)&&bc(e,t)}function Ah(){return null}var Pc=typeof reportError=="function"?reportError:function(e){console.error(e)};function Sl(e){this._internalRoot=e}vn.prototype.render=Sl.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(r(409));fn(e,t,null,null)},vn.prototype.unmount=Sl.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;wa(function(){fn(null,e,null,null)}),t[bo]=null}};function vn(e){this._internalRoot=e}vn.prototype.unstable_scheduleHydration=function(e){if(e){var t=id();e={blockedOn:null,target:e,priority:t};for(var o=0;o<Wo.length&&t!==0&&t<Wo[o].priority;o++);Wo.splice(o,0,e),o===0&&rd(e)}};function vl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function bn(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function wc(){}function Ih(e,t,o,a,s){if(s){if(typeof a=="function"){var l=a;a=function(){var E=Sn(c);l.call(E)}}var c=vc(t,a,e,0,null,!1,!1,"",wc);return e._reactRootContainer=c,e[bo]=c.current,Hi(e.nodeType===8?e.parentNode:e),wa(),c}for(;s=e.lastChild;)e.removeChild(s);if(typeof a=="function"){var m=a;a=function(){var E=Sn(S);m.call(E)}}var S=yl(e,0,!1,null,null,!1,!1,"",wc);return e._reactRootContainer=S,e[bo]=S.current,Hi(e.nodeType===8?e.parentNode:e),wa(function(){fn(t,S,o,a)}),S}function Pn(e,t,o,a,s){var l=o._reactRootContainer;if(l){var c=l;if(typeof s=="function"){var m=s;s=function(){var S=Sn(c);m.call(S)}}fn(t,c,e,s)}else c=Ih(o,t,e,s,a);return Sn(c)}od=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var o=Pi(t.pendingLanes);o!==0&&(Wn(t,o|1),At(t,ze()),(Ee&6)===0&&(si=ze()+500,$o()))}break;case 13:wa(function(){var a=ko(e,1);if(a!==null){var s=wt();to(a,e,1,s)}}),fl(e,1)}},Fn=function(e){if(e.tag===13){var t=ko(e,134217728);if(t!==null){var o=wt();to(t,e,134217728,o)}fl(e,134217728)}},ad=function(e){if(e.tag===13){var t=ta(e),o=ko(e,t);if(o!==null){var a=wt();to(o,e,t,a)}fl(e,t)}},id=function(){return Oe},sd=function(e,t){var o=Oe;try{return Oe=e,t()}finally{Oe=o}},Ma=function(e,t,o){switch(t){case"input":if(gi(e,o),t=o.name,o.type==="radio"&&t!=null){for(o=e;o.parentNode;)o=o.parentNode;for(o=o.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<o.length;t++){var a=o[t];if(a!==e&&a.form===e.form){var s=Ms(a);if(!s)throw Error(r(90));dt(a),gi(a,s)}}}break;case"textarea":so(e,o);break;case"select":t=o.value,t!=null&&zo(e,!!o.multiple,t,!1)}},vi=ul,ua=wa;var Dh={usingClientEntryPoint:!1,Events:[_i,Va,Ms,Si,ys,ul]},Ji={findFiberByHostInstance:ha,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},jh={bundleType:Ji.bundleType,version:Ji.version,rendererPackageName:Ji.rendererPackageName,rendererConfig:Ji.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:V.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=_e(e),e===null?null:e.stateNode},findFiberByHostInstance:Ji.findFiberByHostInstance||Ah,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var wn=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!wn.isDisabled&&wn.supportsFiber)try{Be=wn.inject(jh),ht=wn}catch{}}return It.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Dh,It.createPortal=function(e,t){var o=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!vl(t))throw Error(r(200));return Rh(e,t,null,o)},It.createRoot=function(e,t){if(!vl(e))throw Error(r(299));var o=!1,a="",s=Pc;return t!=null&&(t.unstable_strictMode===!0&&(o=!0),t.identifierPrefix!==void 0&&(a=t.identifierPrefix),t.onRecoverableError!==void 0&&(s=t.onRecoverableError)),t=yl(e,1,!1,null,null,o,!1,a,s),e[bo]=t.current,Hi(e.nodeType===8?e.parentNode:e),new Sl(t)},It.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(r(188)):(e=Object.keys(e).join(","),Error(r(268,e)));return e=_e(t),e=e===null?null:e.stateNode,e},It.flushSync=function(e){return wa(e)},It.hydrate=function(e,t,o){if(!bn(t))throw Error(r(200));return Pn(null,e,t,!0,o)},It.hydrateRoot=function(e,t,o){if(!vl(e))throw Error(r(405));var a=o!=null&&o.hydratedSources||null,s=!1,l="",c=Pc;if(o!=null&&(o.unstable_strictMode===!0&&(s=!0),o.identifierPrefix!==void 0&&(l=o.identifierPrefix),o.onRecoverableError!==void 0&&(c=o.onRecoverableError)),t=vc(t,null,e,1,o??null,s,!1,l,c),e[bo]=t.current,Hi(e),a)for(e=0;e<a.length;e++)o=a[e],s=o._getVersion,s=s(o._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[o,s]:t.mutableSourceEagerHydrationData.push(o,s);return new vn(t)},It.render=function(e,t,o){if(!bn(t))throw Error(r(200));return Pn(null,e,t,!1,o)},It.unmountComponentAtNode=function(e){if(!bn(e))throw Error(r(40));return e._reactRootContainer?(wa(function(){Pn(null,null,e,!1,function(){e._reactRootContainer=null,e[bo]=null})}),!0):!1},It.unstable_batchedUpdates=ul,It.unstable_renderSubtreeIntoContainer=function(e,t,o,a){if(!bn(o))throw Error(r(200));if(e==null||e._reactInternals===void 0)throw Error(r(38));return Pn(e,t,o,!1,a)},It.version="18.3.1-next-f1338f8080-20240426",It}var jc;function fp(){if(jc)return wl.exports;jc=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(n){console.error(n)}}return i(),wl.exports=_h(),wl.exports}var Ec;function Oh(){if(Ec)return Cn;Ec=1;var i=fp();return Cn.createRoot=i.createRoot,Cn.hydrateRoot=i.hydrateRoot,Cn}var qh=Oh(),R=Fl();const Bh=yp(R),Wh=mp({__proto__:null,default:Bh},[R]);var Ln=fp();const Fh=yp(Ln),Kh=mp({__proto__:null,default:Fh},[Ln]);/**
42
42
  * @remix-run/router v1.23.2
43
43
  *
44
44
  * Copyright (c) Remix Software Inc.
@@ -47,8 +47,8 @@ Error generating stack: `+l.message+`
47
47
  * LICENSE.md file in the root directory of this source tree.
48
48
  *
49
49
  * @license MIT
50
- */function $e(){return $e=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},$e.apply(this,arguments)}var st;(function(i){i.Pop="POP",i.Push="PUSH",i.Replace="REPLACE"})(st||(st={}));const Tc="popstate";function Vh(i){i===void 0&&(i={});function n(u,p){let{pathname:g="/",search:y="",hash:h=""}=Eo(u.location.hash.substr(1));return!g.startsWith("/")&&!g.startsWith(".")&&(g="/"+g),ns("",{pathname:g,search:y,hash:h},p.state&&p.state.usr||null,p.state&&p.state.key||"default")}function r(u,p){let g=u.document.querySelector("base"),y="";if(g&&g.getAttribute("href")){let h=u.location.href,v=h.indexOf("#");y=v===-1?h:h.slice(0,v)}return y+"#"+(typeof p=="string"?p:Ta(p))}function d(u,p){ra(u.pathname.charAt(0)==="/","relative pathnames are not supported in hash history.push("+JSON.stringify(p)+")")}return Gh(n,r,d,i)}function Ce(i,n){if(i===!1||i===null||typeof i>"u")throw new Error(n)}function ra(i,n){if(!i){typeof console<"u"&&console.warn(n);try{throw new Error(n)}catch{}}}function Yh(){return Math.random().toString(36).substr(2,8)}function Lc(i,n){return{usr:i.state,key:i.key,idx:n}}function ns(i,n,r,d){return r===void 0&&(r=null),$e({pathname:typeof i=="string"?i:i.pathname,search:"",hash:""},typeof n=="string"?Eo(n):n,{state:r,key:n&&n.key||d||Yh()})}function Ta(i){let{pathname:n="/",search:r="",hash:d=""}=i;return r&&r!=="?"&&(n+=r.charAt(0)==="?"?r:"?"+r),d&&d!=="#"&&(n+=d.charAt(0)==="#"?d:"#"+d),n}function Eo(i){let n={};if(i){let r=i.indexOf("#");r>=0&&(n.hash=i.substr(r),i=i.substr(0,r));let d=i.indexOf("?");d>=0&&(n.search=i.substr(d),i=i.substr(0,d)),i&&(n.pathname=i)}return n}function Gh(i,n,r,d){d===void 0&&(d={});let{window:u=document.defaultView,v5Compat:p=!1}=d,g=u.history,y=st.Pop,h=null,v=C();v==null&&(v=0,g.replaceState($e({},g.state,{idx:v}),""));function C(){return(g.state||{idx:null}).idx}function P(){y=st.Pop;let N=C(),le=N==null?null:N-v;v=N,h&&h({action:y,location:U.location,delta:le})}function D(N,le){y=st.Push;let W=ns(U.location,N,le);r&&r(W,N),v=C()+1;let oe=Lc(W,v),V=U.createHref(W);try{g.pushState(oe,"",V)}catch(pe){if(pe instanceof DOMException&&pe.name==="DataCloneError")throw pe;u.location.assign(V)}p&&h&&h({action:y,location:U.location,delta:1})}function L(N,le){y=st.Replace;let W=ns(U.location,N,le);r&&r(W,N),v=C();let oe=Lc(W,v),V=U.createHref(W);g.replaceState(oe,"",V),p&&h&&h({action:y,location:U.location,delta:0})}function B(N){let le=u.location.origin!=="null"?u.location.origin:u.location.href,W=typeof N=="string"?N:Ta(N);return W=W.replace(/ $/,"%20"),Ce(le,"No window.location.(origin|href) available to create URL for href: "+W),new URL(W,le)}let U={get action(){return y},get location(){return i(u,g)},listen(N){if(h)throw new Error("A history only accepts one active listener");return u.addEventListener(Tc,P),h=N,()=>{u.removeEventListener(Tc,P),h=null}},createHref(N){return n(u,N)},createURL:B,encodeLocation(N){let le=B(N);return{pathname:le.pathname,search:le.search,hash:le.hash}},push:D,replace:L,go(N){return g.go(N)}};return U}var qe;(function(i){i.data="data",i.deferred="deferred",i.redirect="redirect",i.error="error"})(qe||(qe={}));const Xh=new Set(["lazy","caseSensitive","path","id","index","children"]);function $h(i){return i.index===!0}function Dn(i,n,r,d){return r===void 0&&(r=[]),d===void 0&&(d={}),i.map((u,p)=>{let g=[...r,String(p)],y=typeof u.id=="string"?u.id:g.join("-");if(Ce(u.index!==!0||!u.children,"Cannot specify children on an index route"),Ce(!d[y],'Found a route id collision on id "'+y+`". Route id's must be globally unique within Data Router usages`),$h(u)){let h=$e({},u,n(u),{id:y});return d[y]=h,h}else{let h=$e({},u,n(u),{id:y,children:void 0});return d[y]=h,u.children&&(h.children=Dn(u.children,n,g,d)),h}})}function Aa(i,n,r){return r===void 0&&(r="/"),Rn(i,n,r,!1)}function Rn(i,n,r,d){let u=typeof n=="string"?Eo(n):n,p=jo(u.pathname||"/",r);if(p==null)return null;let g=Sp(i);Zh(g);let y=null;for(let h=0;y==null&&h<g.length;++h){let v=dm(p);y=rm(g[h],v,d)}return y}function Qh(i,n){let{route:r,pathname:d,params:u}=i;return{id:r.id,pathname:d,params:u,data:n[r.id],handle:r.handle}}function Sp(i,n,r,d){n===void 0&&(n=[]),r===void 0&&(r=[]),d===void 0&&(d="");let u=(p,g,y)=>{let h={relativePath:y===void 0?p.path||"":y,caseSensitive:p.caseSensitive===!0,childrenIndex:g,route:p};h.relativePath.startsWith("/")&&(Ce(h.relativePath.startsWith(d),'Absolute route path "'+h.relativePath+'" nested under path '+('"'+d+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),h.relativePath=h.relativePath.slice(d.length));let v=Do([d,h.relativePath]),C=r.concat(h);p.children&&p.children.length>0&&(Ce(p.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+v+'".')),Sp(p.children,n,C,v)),!(p.path==null&&!p.index)&&n.push({path:v,score:sm(v,p.index),routesMeta:C})};return i.forEach((p,g)=>{var y;if(p.path===""||!((y=p.path)!=null&&y.includes("?")))u(p,g);else for(let h of vp(p.path))u(p,g,h)}),n}function vp(i){let n=i.split("/");if(n.length===0)return[];let[r,...d]=n,u=r.endsWith("?"),p=r.replace(/\?$/,"");if(d.length===0)return u?[p,""]:[p];let g=vp(d.join("/")),y=[];return y.push(...g.map(h=>h===""?p:[p,h].join("/"))),u&&y.push(...g),y.map(h=>i.startsWith("/")&&h===""?"/":h)}function Zh(i){i.sort((n,r)=>n.score!==r.score?r.score-n.score:nm(n.routesMeta.map(d=>d.childrenIndex),r.routesMeta.map(d=>d.childrenIndex)))}const Jh=/^:[\w-]+$/,em=3,tm=2,om=1,am=10,im=-2,zc=i=>i==="*";function sm(i,n){let r=i.split("/"),d=r.length;return r.some(zc)&&(d+=im),n&&(d+=tm),r.filter(u=>!zc(u)).reduce((u,p)=>u+(Jh.test(p)?em:p===""?om:am),d)}function nm(i,n){return i.length===n.length&&i.slice(0,-1).every((d,u)=>d===n[u])?i[i.length-1]-n[n.length-1]:0}function rm(i,n,r){r===void 0&&(r=!1);let{routesMeta:d}=i,u={},p="/",g=[];for(let y=0;y<d.length;++y){let h=d[y],v=y===d.length-1,C=p==="/"?n:n.slice(p.length)||"/",P=jn({path:h.relativePath,caseSensitive:h.caseSensitive,end:v},C),D=h.route;if(!P&&v&&r&&!d[d.length-1].route.index&&(P=jn({path:h.relativePath,caseSensitive:h.caseSensitive,end:!1},C)),!P)return null;Object.assign(u,P.params),g.push({params:u,pathname:Do([p,P.pathname]),pathnameBase:gm(Do([p,P.pathnameBase])),route:D}),P.pathnameBase!=="/"&&(p=Do([p,P.pathnameBase]))}return g}function jn(i,n){typeof i=="string"&&(i={path:i,caseSensitive:!1,end:!0});let[r,d]=lm(i.path,i.caseSensitive,i.end),u=n.match(r);if(!u)return null;let p=u[0],g=p.replace(/(.)\/+$/,"$1"),y=u.slice(1);return{params:d.reduce((v,C,P)=>{let{paramName:D,isOptional:L}=C;if(D==="*"){let U=y[P]||"";g=p.slice(0,p.length-U.length).replace(/(.)\/+$/,"$1")}const B=y[P];return L&&!B?v[D]=void 0:v[D]=(B||"").replace(/%2F/g,"/"),v},{}),pathname:p,pathnameBase:g,pattern:i}}function lm(i,n,r){n===void 0&&(n=!1),r===void 0&&(r=!0),ra(i==="*"||!i.endsWith("*")||i.endsWith("/*"),'Route path "'+i+'" will be treated as if it were '+('"'+i.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+i.replace(/\*$/,"/*")+'".'));let d=[],u="^"+i.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(g,y,h)=>(d.push({paramName:y,isOptional:h!=null}),h?"/?([^\\/]+)?":"/([^\\/]+)"));return i.endsWith("*")?(d.push({paramName:"*"}),u+=i==="*"||i==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?u+="\\/*$":i!==""&&i!=="/"&&(u+="(?:(?=\\/|$))"),[new RegExp(u,n?void 0:"i"),d]}function dm(i){try{return i.split("/").map(n=>decodeURIComponent(n).replace(/\//g,"%2F")).join("/")}catch(n){return ra(!1,'The URL path "'+i+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+n+").")),i}}function jo(i,n){if(n==="/")return i;if(!i.toLowerCase().startsWith(n.toLowerCase()))return null;let r=n.endsWith("/")?n.length-1:n.length,d=i.charAt(r);return d&&d!=="/"?null:i.slice(r)||"/"}const um=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,cm=i=>um.test(i);function pm(i,n){n===void 0&&(n="/");let{pathname:r,search:d="",hash:u=""}=typeof i=="string"?Eo(i):i,p;if(r)if(cm(r))p=r;else{if(r.includes("//")){let g=r;r=r.replace(/\/\/+/g,"/"),ra(!1,"Pathnames cannot have embedded double slashes - normalizing "+(g+" -> "+r))}r.startsWith("/")?p=Uc(r.substring(1),"/"):p=Uc(r,n)}else p=n;return{pathname:p,search:hm(d),hash:mm(u)}}function Uc(i,n){let r=n.replace(/\/+$/,"").split("/");return i.split("/").forEach(u=>{u===".."?r.length>1&&r.pop():u!=="."&&r.push(u)}),r.length>1?r.join("/"):"/"}function xl(i,n,r,d){return"Cannot include a '"+i+"' character in a manually specified "+("`to."+n+"` field ["+JSON.stringify(d)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function bp(i){return i.filter((n,r)=>r===0||n.route.path&&n.route.path.length>0)}function zn(i,n){let r=bp(i);return n?r.map((d,u)=>u===r.length-1?d.pathname:d.pathnameBase):r.map(d=>d.pathnameBase)}function Un(i,n,r,d){d===void 0&&(d=!1);let u;typeof i=="string"?u=Eo(i):(u=$e({},i),Ce(!u.pathname||!u.pathname.includes("?"),xl("?","pathname","search",u)),Ce(!u.pathname||!u.pathname.includes("#"),xl("#","pathname","hash",u)),Ce(!u.search||!u.search.includes("#"),xl("#","search","hash",u)));let p=i===""||u.pathname==="",g=p?"/":u.pathname,y;if(g==null)y=r;else{let P=n.length-1;if(!d&&g.startsWith("..")){let D=g.split("/");for(;D[0]==="..";)D.shift(),P-=1;u.pathname=D.join("/")}y=P>=0?n[P]:"/"}let h=pm(u,y),v=g&&g!=="/"&&g.endsWith("/"),C=(p||g===".")&&r.endsWith("/");return!h.pathname.endsWith("/")&&(v||C)&&(h.pathname+="/"),h}const Do=i=>i.join("/").replace(/\/\/+/g,"/"),gm=i=>i.replace(/\/+$/,"").replace(/^\/*/,"/"),hm=i=>!i||i==="?"?"":i.startsWith("?")?i:"?"+i,mm=i=>!i||i==="#"?"":i.startsWith("#")?i:"#"+i;class En{constructor(n,r,d,u){u===void 0&&(u=!1),this.status=n,this.statusText=r||"",this.internal=u,d instanceof Error?(this.data=d.toString(),this.error=d):this.data=d}}function rs(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.internal=="boolean"&&"data"in i}const Pp=["post","put","patch","delete"],ym=new Set(Pp),fm=["get",...Pp],Sm=new Set(fm),vm=new Set([301,302,303,307,308]),bm=new Set([307,308]),Rl={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},Pm={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ts={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Kl=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Cm=i=>({hasErrorBoundary:!!i.hasErrorBoundary}),Cp="remix-router-transitions";function wm(i){const n=i.window?i.window:typeof window<"u"?window:void 0,r=typeof n<"u"&&typeof n.document<"u"&&typeof n.document.createElement<"u",d=!r;Ce(i.routes.length>0,"You must provide a non-empty routes array to createRouter");let u;if(i.mapRouteProperties)u=i.mapRouteProperties;else if(i.detectErrorBoundary){let f=i.detectErrorBoundary;u=k=>({hasErrorBoundary:f(k)})}else u=Cm;let p={},g=Dn(i.routes,u,void 0,p),y,h=i.basename||"/",v=i.dataStrategy||Am,C=i.patchRoutesOnNavigation,P=$e({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},i.future),D=null,L=new Set,B=null,U=null,N=null,le=i.hydrationData!=null,W=Aa(g,i.history.location,h),oe=!1,V=null;if(W==null&&!C){let f=Dt(404,{pathname:i.history.location.pathname}),{matches:k,route:T}=Vc(g);W=k,V={[T.id]:f}}W&&!i.hydrationData&&ua(W,g,i.history.location.pathname).active&&(W=null);let pe;if(W)if(W.some(f=>f.route.lazy))pe=!1;else if(!W.some(f=>f.route.loader))pe=!0;else if(P.v7_partialHydration){let f=i.hydrationData?i.hydrationData.loaderData:null,k=i.hydrationData?i.hydrationData.errors:null;if(k){let T=W.findIndex(M=>k[M.route.id]!==void 0);pe=W.slice(0,T+1).every(M=>!Ml(M.route,f,k))}else pe=W.every(T=>!Ml(T.route,f,k))}else pe=i.hydrationData!=null;else if(pe=!1,W=[],P.v7_partialHydration){let f=ua(null,g,i.history.location.pathname);f.active&&f.matches&&(oe=!0,W=f.matches)}let De,j={historyAction:i.history.action,location:i.history.location,matches:W,initialized:pe,navigation:Rl,restoreScrollPosition:i.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:i.hydrationData&&i.hydrationData.loaderData||{},actionData:i.hydrationData&&i.hydrationData.actionData||null,errors:i.hydrationData&&i.hydrationData.errors||V,fetchers:new Map,blockers:new Map},$=st.Pop,Se=!1,ce,Te=!1,we=new Map,ke=null,He=!1,et=!1,ot=[],_e=new Set,O=new Map,de=0,G=-1,w=new Map,z=new Set,ye=new Map,K=new Map,ae=new Set,ue=new Map,Pe=new Map,xe;function Le(){if(D=i.history.listen(f=>{let{action:k,location:T,delta:M}=f;if(xe){xe(),xe=void 0;return}ra(Pe.size===0||M!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let Y=Ha({currentLocation:j.location,nextLocation:T,historyAction:k});if(Y&&M!=null){let re=new Promise(me=>{xe=me});i.history.go(M*-1),Ho(Y,{state:"blocked",location:T,proceed(){Ho(Y,{state:"proceeding",proceed:void 0,reset:void 0,location:T}),re.then(()=>i.history.go(M))},reset(){let me=new Map(j.blockers);me.set(Y,ts),dt({blockers:me})}});return}return io(k,T)}),r){qm(n,we);let f=()=>Bm(n,we);n.addEventListener("pagehide",f),ke=()=>n.removeEventListener("pagehide",f)}return j.initialized||io(st.Pop,j.location,{initialHydration:!0}),De}function gt(){D&&D(),ke&&ke(),L.clear(),ce&&ce.abort(),j.fetchers.forEach((f,k)=>no(k)),j.blockers.forEach((f,k)=>Ma(k))}function yo(f){return L.add(f),()=>L.delete(f)}function dt(f,k){k===void 0&&(k={}),j=$e({},j,f);let T=[],M=[];P.v7_fetcherPersist&&j.fetchers.forEach((Y,re)=>{Y.state==="idle"&&(ae.has(re)?M.push(re):T.push(re))}),ae.forEach(Y=>{!j.fetchers.has(Y)&&!O.has(Y)&&M.push(Y)}),[...L].forEach(Y=>Y(j,{deletedFetchers:M,viewTransitionOpts:k.viewTransitionOpts,flushSync:k.flushSync===!0})),P.v7_fetcherPersist?(T.forEach(Y=>j.fetchers.delete(Y)),M.forEach(Y=>no(Y))):M.forEach(Y=>ae.delete(Y))}function Yt(f,k,T){var M,Y;let{flushSync:re}=T===void 0?{}:T,me=j.actionData!=null&&j.navigation.formMethod!=null&&ao(j.navigation.formMethod)&&j.navigation.state==="loading"&&((M=f.state)==null?void 0:M._isRedirect)!==!0,ee;k.actionData?Object.keys(k.actionData).length>0?ee=k.actionData:ee=null:me?ee=j.actionData:ee=null;let ie=k.loaderData?Fc(j.loaderData,k.loaderData,k.matches||[],k.errors):j.loaderData,Q=j.blockers;Q.size>0&&(Q=new Map(Q),Q.forEach((Ae,nt)=>Q.set(nt,ts)));let J=Se===!0||j.navigation.formMethod!=null&&ao(j.navigation.formMethod)&&((Y=f.state)==null?void 0:Y._isRedirect)!==!0;y&&(g=y,y=void 0),He||$===st.Pop||($===st.Push?i.history.push(f,f.state):$===st.Replace&&i.history.replace(f,f.state));let ve;if($===st.Pop){let Ae=we.get(j.location.pathname);Ae&&Ae.has(f.pathname)?ve={currentLocation:j.location,nextLocation:f}:we.has(f.pathname)&&(ve={currentLocation:f,nextLocation:j.location})}else if(Te){let Ae=we.get(j.location.pathname);Ae?Ae.add(f.pathname):(Ae=new Set([f.pathname]),we.set(j.location.pathname,Ae)),ve={currentLocation:j.location,nextLocation:f}}dt($e({},k,{actionData:ee,loaderData:ie,historyAction:$,location:f,initialized:!0,navigation:Rl,revalidation:"idle",restoreScrollPosition:vi(f,k.matches||j.matches),preventScrollReset:J,blockers:Q}),{viewTransitionOpts:ve,flushSync:re===!0}),$=st.Pop,Se=!1,Te=!1,He=!1,et=!1,ot=[]}async function La(f,k){if(typeof f=="number"){i.history.go(f);return}let T=Ul(j.location,j.matches,h,P.v7_prependBasename,f,P.v7_relativeSplatPath,k==null?void 0:k.fromRouteId,k==null?void 0:k.relative),{path:M,submission:Y,error:re}=Mc(P.v7_normalizeFormMethod,!1,T,k),me=j.location,ee=ns(j.location,M,k&&k.state);ee=$e({},ee,i.history.encodeLocation(ee));let ie=k&&k.replace!=null?k.replace:void 0,Q=st.Push;ie===!0?Q=st.Replace:ie===!1||Y!=null&&ao(Y.formMethod)&&Y.formAction===j.location.pathname+j.location.search&&(Q=st.Replace);let J=k&&"preventScrollReset"in k?k.preventScrollReset===!0:void 0,ve=(k&&k.flushSync)===!0,Ae=Ha({currentLocation:me,nextLocation:ee,historyAction:Q});if(Ae){Ho(Ae,{state:"blocked",location:ee,proceed(){Ho(Ae,{state:"proceeding",proceed:void 0,reset:void 0,location:ee}),La(f,k)},reset(){let nt=new Map(j.blockers);nt.set(Ae,ts),dt({blockers:nt})}});return}return await io(Q,ee,{submission:Y,pendingError:re,preventScrollReset:J,replace:k&&k.replace,enableViewTransition:k&&k.viewTransition,flushSync:ve})}function cs(){if(da(),dt({revalidation:"loading"}),j.navigation.state!=="submitting"){if(j.navigation.state==="idle"){io(j.historyAction,j.location,{startUninterruptedRevalidation:!0});return}io($||j.historyAction,j.navigation.location,{overrideNavigation:j.navigation,enableViewTransition:Te===!0})}}async function io(f,k,T){ce&&ce.abort(),ce=null,$=f,He=(T&&T.startUninterruptedRevalidation)===!0,ys(j.location,j.matches),Se=(T&&T.preventScrollReset)===!0,Te=(T&&T.enableViewTransition)===!0;let M=y||g,Y=T&&T.overrideNavigation,re=T!=null&&T.initialHydration&&j.matches&&j.matches.length>0&&!oe?j.matches:Aa(M,k,h),me=(T&&T.flushSync)===!0;if(re&&j.initialized&&!et&&Lm(j.location,k)&&!(T&&T.submission&&ao(T.submission.formMethod))){Yt(k,{matches:re},{flushSync:me});return}let ee=ua(re,M,k.pathname);if(ee.active&&ee.matches&&(re=ee.matches),!re){let{error:Ne,notFoundMatches:je,route:Ve}=ro(k.pathname);Yt(k,{matches:je,loaderData:{},errors:{[Ve.id]:Ne}},{flushSync:me});return}ce=new AbortController;let ie=ri(i.history,k,ce.signal,T&&T.submission),Q;if(T&&T.pendingError)Q=[Ia(re).route.id,{type:qe.error,error:T.pendingError}];else if(T&&T.submission&&ao(T.submission.formMethod)){let Ne=await gi(ie,k,T.submission,re,ee.active,{replace:T.replace,flushSync:me});if(Ne.shortCircuited)return;if(Ne.pendingActionResult){let[je,Ve]=Ne.pendingActionResult;if(Mt(Ve)&&rs(Ve.error)&&Ve.error.status===404){ce=null,Yt(k,{matches:Ne.matches,loaderData:{},errors:{[je]:Ve.error}});return}}re=Ne.matches||re,Q=Ne.pendingActionResult,Y=Al(k,T.submission),me=!1,ee.active=!1,ie=ri(i.history,ie.url,ie.signal)}let{shortCircuited:J,matches:ve,loaderData:Ae,errors:nt}=await ps(ie,k,re,ee.active,Y,T&&T.submission,T&&T.fetcherSubmission,T&&T.replace,T&&T.initialHydration===!0,me,Q);J||(ce=null,Yt(k,$e({matches:ve||re},Kc(Q),{loaderData:Ae,errors:nt})))}async function gi(f,k,T,M,Y,re){re===void 0&&(re={}),da();let me=Nm(k,T);if(dt({navigation:me},{flushSync:re.flushSync===!0}),Y){let Q=await _o(M,k.pathname,f.signal);if(Q.type==="aborted")return{shortCircuited:!0};if(Q.type==="error"){let J=Ia(Q.partialMatches).route.id;return{matches:Q.partialMatches,pendingActionResult:[J,{type:qe.error,error:Q.error}]}}else if(Q.matches)M=Q.matches;else{let{notFoundMatches:J,error:ve,route:Ae}=ro(k.pathname);return{matches:J,pendingActionResult:[Ae.id,{type:qe.error,error:ve}]}}}let ee,ie=ss(M,k);if(!ie.route.action&&!ie.route.lazy)ee={type:qe.error,error:Dt(405,{method:f.method,pathname:k.pathname,routeId:ie.route.id})};else if(ee=(await Uo("action",j,f,[ie],M,null))[ie.route.id],f.signal.aborted)return{shortCircuited:!0};if(Da(ee)){let Q;return re&&re.replace!=null?Q=re.replace:Q=qc(ee.response.headers.get("Location"),new URL(f.url),h,i.history)===j.location.pathname+j.location.search,await so(f,ee,!0,{submission:T,replace:Q}),{shortCircuited:!0}}if(na(ee))throw Dt(400,{type:"defer-action"});if(Mt(ee)){let Q=Ia(M,ie.route.id);return(re&&re.replace)!==!0&&($=st.Push),{matches:M,pendingActionResult:[Q.route.id,ee]}}return{matches:M,pendingActionResult:[ie.route.id,ee]}}async function ps(f,k,T,M,Y,re,me,ee,ie,Q,J){let ve=Y||Al(k,re),Ae=re||me||Gc(ve),nt=!He&&(!P.v7_partialHydration||!ie);if(M){if(nt){let Be=za(J);dt($e({navigation:ve},Be!==void 0?{actionData:Be}:{}),{flushSync:Q})}let Ie=await _o(T,k.pathname,f.signal);if(Ie.type==="aborted")return{shortCircuited:!0};if(Ie.type==="error"){let Be=Ia(Ie.partialMatches).route.id;return{matches:Ie.partialMatches,loaderData:{},errors:{[Be]:Ie.error}}}else if(Ie.matches)T=Ie.matches;else{let{error:Be,notFoundMatches:ht,route:ga}=ro(k.pathname);return{matches:ht,loaderData:{},errors:{[ga.id]:Be}}}}let Ne=y||g,[je,Ve]=_c(i.history,j,T,Ae,k,P.v7_partialHydration&&ie===!0,P.v7_skipActionErrorRevalidation,et,ot,_e,ae,ye,z,Ne,h,J);if(lo(Ie=>!(T&&T.some(Be=>Be.route.id===Ie))||je&&je.some(Be=>Be.route.id===Ie)),G=++de,je.length===0&&Ve.length===0){let Ie=hs();return Yt(k,$e({matches:T,loaderData:{},errors:J&&Mt(J[1])?{[J[0]]:J[1].error}:null},Kc(J),Ie?{fetchers:new Map(j.fetchers)}:{}),{flushSync:Q}),{shortCircuited:!0}}if(nt){let Ie={};if(!M){Ie.navigation=ve;let Be=za(J);Be!==void 0&&(Ie.actionData=Be)}Ve.length>0&&(Ie.fetchers=la(Ve)),dt(Ie,{flushSync:Q})}Ve.forEach(Ie=>{Gt(Ie.key),Ie.controller&&O.set(Ie.key,Ie.controller)});let fo=()=>Ve.forEach(Ie=>Gt(Ie.key));ce&&ce.signal.addEventListener("abort",fo);let{loaderResults:pa,fetcherResults:Xt}=await mi(j,T,je,Ve,f);if(f.signal.aborted)return{shortCircuited:!0};ce&&ce.signal.removeEventListener("abort",fo),Ve.forEach(Ie=>O.delete(Ie.key));let ze=kn(pa);if(ze)return await so(f,ze.result,!0,{replace:ee}),{shortCircuited:!0};if(ze=kn(Xt),ze)return z.add(ze.key),await so(f,ze.result,!0,{replace:ee}),{shortCircuited:!0};let{loaderData:bi,errors:So}=Wc(j,T,pa,J,Ve,Xt,ue);ue.forEach((Ie,Be)=>{Ie.subscribe(ht=>{(ht||Ie.done)&&ue.delete(Be)})}),P.v7_partialHydration&&ie&&j.errors&&(So=$e({},j.errors,So));let uo=hs(),vo=Ua(G),_a=uo||vo||Ve.length>0;return $e({matches:T,loaderData:bi,errors:So},_a?{fetchers:new Map(j.fetchers)}:{})}function za(f){if(f&&!Mt(f[1]))return{[f[0]]:f[1].data};if(j.actionData)return Object.keys(j.actionData).length===0?null:j.actionData}function la(f){return f.forEach(k=>{let T=j.fetchers.get(k.key),M=os(void 0,T?T.data:void 0);j.fetchers.set(k.key,M)}),new Map(j.fetchers)}function zo(f,k,T,M){if(d)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");Gt(f);let Y=(M&&M.flushSync)===!0,re=y||g,me=Ul(j.location,j.matches,h,P.v7_prependBasename,T,P.v7_relativeSplatPath,k,M==null?void 0:M.relative),ee=Aa(re,me,h),ie=ua(ee,re,me);if(ie.active&&ie.matches&&(ee=ie.matches),!ee){Ht(f,k,Dt(404,{pathname:me}),{flushSync:Y});return}let{path:Q,submission:J,error:ve}=Mc(P.v7_normalizeFormMethod,!0,me,M);if(ve){Ht(f,k,ve,{flushSync:Y});return}let Ae=ss(ee,Q),nt=(M&&M.preventScrollReset)===!0;if(J&&ao(J.formMethod)){hi(f,k,Q,Ae,ee,ie.active,Y,nt,J);return}ye.set(f,{routeId:k,path:Q}),gs(f,k,Q,Ae,ee,ie.active,Y,nt,J)}async function hi(f,k,T,M,Y,re,me,ee,ie){da(),ye.delete(f);function Q(Ue){if(!Ue.route.action&&!Ue.route.lazy){let No=Dt(405,{method:ie.formMethod,pathname:T,routeId:k});return Ht(f,k,No,{flushSync:me}),!0}return!1}if(!re&&Q(M))return;let J=j.fetchers.get(f);Et(f,Om(ie,J),{flushSync:me});let ve=new AbortController,Ae=ri(i.history,T,ve.signal,ie);if(re){let Ue=await _o(Y,new URL(Ae.url).pathname,Ae.signal,f);if(Ue.type==="aborted")return;if(Ue.type==="error"){Ht(f,k,Ue.error,{flushSync:me});return}else if(Ue.matches){if(Y=Ue.matches,M=ss(Y,T),Q(M))return}else{Ht(f,k,Dt(404,{pathname:T}),{flushSync:me});return}}O.set(f,ve);let nt=de,je=(await Uo("action",j,Ae,[M],Y,f))[M.route.id];if(Ae.signal.aborted){O.get(f)===ve&&O.delete(f);return}if(P.v7_fetcherPersist&&ae.has(f)){if(Da(je)||Mt(je)){Et(f,sa(void 0));return}}else{if(Da(je))if(O.delete(f),G>nt){Et(f,sa(void 0));return}else return z.add(f),Et(f,os(ie)),so(Ae,je,!1,{fetcherSubmission:ie,preventScrollReset:ee});if(Mt(je)){Ht(f,k,je.error);return}}if(na(je))throw Dt(400,{type:"defer-action"});let Ve=j.navigation.location||j.location,fo=ri(i.history,Ve,ve.signal),pa=y||g,Xt=j.navigation.state!=="idle"?Aa(pa,j.navigation.location,h):j.matches;Ce(Xt,"Didn't find any matches after fetcher action");let ze=++de;w.set(f,ze);let bi=os(ie,je.data);j.fetchers.set(f,bi);let[So,uo]=_c(i.history,j,Xt,ie,Ve,!1,P.v7_skipActionErrorRevalidation,et,ot,_e,ae,ye,z,pa,h,[M.route.id,je]);uo.filter(Ue=>Ue.key!==f).forEach(Ue=>{let No=Ue.key,Ss=j.fetchers.get(No),On=os(void 0,Ss?Ss.data:void 0);j.fetchers.set(No,On),Gt(No),Ue.controller&&O.set(No,Ue.controller)}),dt({fetchers:new Map(j.fetchers)});let vo=()=>uo.forEach(Ue=>Gt(Ue.key));ve.signal.addEventListener("abort",vo);let{loaderResults:_a,fetcherResults:Ie}=await mi(j,Xt,So,uo,fo);if(ve.signal.aborted)return;ve.signal.removeEventListener("abort",vo),w.delete(f),O.delete(f),uo.forEach(Ue=>O.delete(Ue.key));let Be=kn(_a);if(Be)return so(fo,Be.result,!1,{preventScrollReset:ee});if(Be=kn(Ie),Be)return z.add(Be.key),so(fo,Be.result,!1,{preventScrollReset:ee});let{loaderData:ht,errors:ga}=Wc(j,Xt,_a,void 0,uo,Ie,ue);if(j.fetchers.has(f)){let Ue=sa(je.data);j.fetchers.set(f,Ue)}Ua(ze),j.navigation.state==="loading"&&ze>G?(Ce($,"Expected pending action"),ce&&ce.abort(),Yt(j.navigation.location,{matches:Xt,loaderData:ht,errors:ga,fetchers:new Map(j.fetchers)})):(dt({errors:ga,loaderData:Fc(j.loaderData,ht,Xt,ga),fetchers:new Map(j.fetchers)}),et=!1)}async function gs(f,k,T,M,Y,re,me,ee,ie){let Q=j.fetchers.get(f);Et(f,os(ie,Q?Q.data:void 0),{flushSync:me});let J=new AbortController,ve=ri(i.history,T,J.signal);if(re){let je=await _o(Y,new URL(ve.url).pathname,ve.signal,f);if(je.type==="aborted")return;if(je.type==="error"){Ht(f,k,je.error,{flushSync:me});return}else if(je.matches)Y=je.matches,M=ss(Y,T);else{Ht(f,k,Dt(404,{pathname:T}),{flushSync:me});return}}O.set(f,J);let Ae=de,Ne=(await Uo("loader",j,ve,[M],Y,f))[M.route.id];if(na(Ne)&&(Ne=await Vl(Ne,ve.signal,!0)||Ne),O.get(f)===J&&O.delete(f),!ve.signal.aborted){if(ae.has(f)){Et(f,sa(void 0));return}if(Da(Ne))if(G>Ae){Et(f,sa(void 0));return}else{z.add(f),await so(ve,Ne,!1,{preventScrollReset:ee});return}if(Mt(Ne)){Ht(f,k,Ne.error);return}Ce(!na(Ne),"Unhandled fetcher deferred data"),Et(f,sa(Ne.data))}}async function so(f,k,T,M){let{submission:Y,fetcherSubmission:re,preventScrollReset:me,replace:ee}=M===void 0?{}:M;k.response.headers.has("X-Remix-Revalidate")&&(et=!0);let ie=k.response.headers.get("Location");Ce(ie,"Expected a Location header on the redirect Response"),ie=qc(ie,new URL(f.url),h,i.history);let Q=ns(j.location,ie,{_isRedirect:!0});if(r){let je=!1;if(k.response.headers.has("X-Remix-Reload-Document"))je=!0;else if(Kl.test(ie)){const Ve=i.history.createURL(ie);je=Ve.origin!==n.location.origin||jo(Ve.pathname,h)==null}if(je){ee?n.location.replace(ie):n.location.assign(ie);return}}ce=null;let J=ee===!0||k.response.headers.has("X-Remix-Replace")?st.Replace:st.Push,{formMethod:ve,formAction:Ae,formEncType:nt}=j.navigation;!Y&&!re&&ve&&Ae&&nt&&(Y=Gc(j.navigation));let Ne=Y||re;if(bm.has(k.response.status)&&Ne&&ao(Ne.formMethod))await io(J,Q,{submission:$e({},Ne,{formAction:ie}),preventScrollReset:me||Se,enableViewTransition:T?Te:void 0});else{let je=Al(Q,Y);await io(J,Q,{overrideNavigation:je,fetcherSubmission:re,preventScrollReset:me||Se,enableViewTransition:T?Te:void 0})}}async function Uo(f,k,T,M,Y,re){let me,ee={};try{me=await Im(v,f,k,T,M,Y,re,p,u)}catch(ie){return M.forEach(Q=>{ee[Q.route.id]={type:qe.error,error:ie}}),ee}for(let[ie,Q]of Object.entries(me))if(zm(Q)){let J=Q.result;ee[ie]={type:qe.redirect,response:Em(J,T,ie,Y,h,P.v7_relativeSplatPath)}}else ee[ie]=await jm(Q);return ee}async function mi(f,k,T,M,Y){let re=f.matches,me=Uo("loader",f,Y,T,k,null),ee=Promise.all(M.map(async J=>{if(J.matches&&J.match&&J.controller){let Ae=(await Uo("loader",f,ri(i.history,J.path,J.controller.signal),[J.match],J.matches,J.key))[J.match.route.id];return{[J.key]:Ae}}else return Promise.resolve({[J.key]:{type:qe.error,error:Dt(404,{pathname:J.path})}})})),ie=await me,Q=(await ee).reduce((J,ve)=>Object.assign(J,ve),{});return await Promise.all([Hm(k,ie,Y.signal,re,f.loaderData),_m(k,Q,M)]),{loaderResults:ie,fetcherResults:Q}}function da(){et=!0,ot.push(...lo()),ye.forEach((f,k)=>{O.has(k)&&_e.add(k),Gt(k)})}function Et(f,k,T){T===void 0&&(T={}),j.fetchers.set(f,k),dt({fetchers:new Map(j.fetchers)},{flushSync:(T&&T.flushSync)===!0})}function Ht(f,k,T,M){M===void 0&&(M={});let Y=Ia(j.matches,k);no(f),dt({errors:{[Y.route.id]:T},fetchers:new Map(j.fetchers)},{flushSync:(M&&M.flushSync)===!0})}function Mo(f){return K.set(f,(K.get(f)||0)+1),ae.has(f)&&ae.delete(f),j.fetchers.get(f)||Pm}function no(f){let k=j.fetchers.get(f);O.has(f)&&!(k&&k.state==="loading"&&w.has(f))&&Gt(f),ye.delete(f),w.delete(f),z.delete(f),P.v7_fetcherPersist&&ae.delete(f),_e.delete(f),j.fetchers.delete(f)}function Nn(f){let k=(K.get(f)||0)-1;k<=0?(K.delete(f),ae.add(f),P.v7_fetcherPersist||no(f)):K.set(f,k),dt({fetchers:new Map(j.fetchers)})}function Gt(f){let k=O.get(f);k&&(k.abort(),O.delete(f))}function yi(f){for(let k of f){let T=Mo(k),M=sa(T.data);j.fetchers.set(k,M)}}function hs(){let f=[],k=!1;for(let T of z){let M=j.fetchers.get(T);Ce(M,"Expected fetcher: "+T),M.state==="loading"&&(z.delete(T),f.push(T),k=!0)}return yi(f),k}function Ua(f){let k=[];for(let[T,M]of w)if(M<f){let Y=j.fetchers.get(T);Ce(Y,"Expected fetcher: "+T),Y.state==="loading"&&(Gt(T),w.delete(T),k.push(T))}return yi(k),k.length>0}function fi(f,k){let T=j.blockers.get(f)||ts;return Pe.get(f)!==k&&Pe.set(f,k),T}function Ma(f){j.blockers.delete(f),Pe.delete(f)}function Ho(f,k){let T=j.blockers.get(f)||ts;Ce(T.state==="unblocked"&&k.state==="blocked"||T.state==="blocked"&&k.state==="blocked"||T.state==="blocked"&&k.state==="proceeding"||T.state==="blocked"&&k.state==="unblocked"||T.state==="proceeding"&&k.state==="unblocked","Invalid blocker state transition: "+T.state+" -> "+k.state);let M=new Map(j.blockers);M.set(f,k),dt({blockers:M})}function Ha(f){let{currentLocation:k,nextLocation:T,historyAction:M}=f;if(Pe.size===0)return;Pe.size>1&&ra(!1,"A router only supports one blocker at a time");let Y=Array.from(Pe.entries()),[re,me]=Y[Y.length-1],ee=j.blockers.get(re);if(!(ee&&ee.state==="proceeding")&&me({currentLocation:k,nextLocation:T,historyAction:M}))return re}function ro(f){let k=Dt(404,{pathname:f}),T=y||g,{matches:M,route:Y}=Vc(T);return lo(),{notFoundMatches:M,route:Y,error:k}}function lo(f){let k=[];return ue.forEach((T,M)=>{(!f||f(M))&&(T.cancel(),k.push(M),ue.delete(M))}),k}function ms(f,k,T){if(B=f,N=k,U=T||null,!le&&j.navigation===Rl){le=!0;let M=vi(j.location,j.matches);M!=null&&dt({restoreScrollPosition:M})}return()=>{B=null,N=null,U=null}}function Si(f,k){return U&&U(f,k.map(M=>Qh(M,j.loaderData)))||f.key}function ys(f,k){if(B&&N){let T=Si(f,k);B[T]=N()}}function vi(f,k){if(B){let T=Si(f,k),M=B[T];if(typeof M=="number")return M}return null}function ua(f,k,T){if(C)if(f){if(Object.keys(f[0].params).length>0)return{active:!0,matches:Rn(k,T,h,!0)}}else return{active:!0,matches:Rn(k,T,h,!0)||[]};return{active:!1,matches:null}}async function _o(f,k,T,M){if(!C)return{type:"success",matches:f};let Y=f;for(;;){let re=y==null,me=y||g,ee=p;try{await C({signal:T,path:k,matches:Y,fetcherKey:M,patch:(J,ve)=>{T.aborted||Oc(J,ve,me,ee,u)}})}catch(J){return{type:"error",error:J,partialMatches:Y}}finally{re&&!T.aborted&&(g=[...g])}if(T.aborted)return{type:"aborted"};let ie=Aa(me,k,h);if(ie)return{type:"success",matches:ie};let Q=Rn(me,k,h,!0);if(!Q||Y.length===Q.length&&Y.every((J,ve)=>J.route.id===Q[ve].route.id))return{type:"success",matches:null};Y=Q}}function fs(f){p={},y=Dn(f,u,void 0,p)}function ca(f,k){let T=y==null;Oc(f,k,y||g,p,u),T&&(g=[...g],dt({}))}return De={get basename(){return h},get future(){return P},get state(){return j},get routes(){return g},get window(){return n},initialize:Le,subscribe:yo,enableScrollRestoration:ms,navigate:La,fetch:zo,revalidate:cs,createHref:f=>i.history.createHref(f),encodeLocation:f=>i.history.encodeLocation(f),getFetcher:Mo,deleteFetcher:Nn,dispose:gt,getBlocker:fi,deleteBlocker:Ma,patchRoutes:ca,_internalFetchControllers:O,_internalActiveDeferreds:ue,_internalSetRoutes:fs},De}function km(i){return i!=null&&("formData"in i&&i.formData!=null||"body"in i&&i.body!==void 0)}function Ul(i,n,r,d,u,p,g,y){let h,v;if(g){h=[];for(let P of n)if(h.push(P),P.route.id===g){v=P;break}}else h=n,v=n[n.length-1];let C=Un(u||".",zn(h,p),jo(i.pathname,r)||i.pathname,y==="path");if(u==null&&(C.search=i.search,C.hash=i.hash),(u==null||u===""||u===".")&&v){let P=Yl(C.search);if(v.route.index&&!P)C.search=C.search?C.search.replace(/^\?/,"?index&"):"?index";else if(!v.route.index&&P){let D=new URLSearchParams(C.search),L=D.getAll("index");D.delete("index"),L.filter(U=>U).forEach(U=>D.append("index",U));let B=D.toString();C.search=B?"?"+B:""}}return d&&r!=="/"&&(C.pathname=C.pathname==="/"?r:Do([r,C.pathname])),Ta(C)}function Mc(i,n,r,d){if(!d||!km(d))return{path:r};if(d.formMethod&&!Mm(d.formMethod))return{path:r,error:Dt(405,{method:d.formMethod})};let u=()=>({path:r,error:Dt(400,{type:"invalid-body"})}),p=d.formMethod||"get",g=i?p.toUpperCase():p.toLowerCase(),y=xp(r);if(d.body!==void 0){if(d.formEncType==="text/plain"){if(!ao(g))return u();let D=typeof d.body=="string"?d.body:d.body instanceof FormData||d.body instanceof URLSearchParams?Array.from(d.body.entries()).reduce((L,B)=>{let[U,N]=B;return""+L+U+"="+N+`
51
- `},""):String(d.body);return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:void 0,text:D}}}else if(d.formEncType==="application/json"){if(!ao(g))return u();try{let D=typeof d.body=="string"?JSON.parse(d.body):d.body;return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:D,text:void 0}}}catch{return u()}}}Ce(typeof FormData=="function","FormData is not available in this environment");let h,v;if(d.formData)h=Hl(d.formData),v=d.formData;else if(d.body instanceof FormData)h=Hl(d.body),v=d.body;else if(d.body instanceof URLSearchParams)h=d.body,v=Bc(h);else if(d.body==null)h=new URLSearchParams,v=new FormData;else try{h=new URLSearchParams(d.body),v=Bc(h)}catch{return u()}let C={formMethod:g,formAction:y,formEncType:d&&d.formEncType||"application/x-www-form-urlencoded",formData:v,json:void 0,text:void 0};if(ao(C.formMethod))return{path:r,submission:C};let P=Eo(r);return n&&P.search&&Yl(P.search)&&h.append("index",""),P.search="?"+h,{path:Ta(P),submission:C}}function Hc(i,n,r){r===void 0&&(r=!1);let d=i.findIndex(u=>u.route.id===n);return d>=0?i.slice(0,r?d+1:d):i}function _c(i,n,r,d,u,p,g,y,h,v,C,P,D,L,B,U){let N=U?Mt(U[1])?U[1].error:U[1].data:void 0,le=i.createURL(n.location),W=i.createURL(u),oe=r;p&&n.errors?oe=Hc(r,Object.keys(n.errors)[0],!0):U&&Mt(U[1])&&(oe=Hc(r,U[0]));let V=U?U[1].statusCode:void 0,pe=g&&V&&V>=400,De=oe.filter(($,Se)=>{let{route:ce}=$;if(ce.lazy)return!0;if(ce.loader==null)return!1;if(p)return Ml(ce,n.loaderData,n.errors);if(xm(n.loaderData,n.matches[Se],$)||h.some(ke=>ke===$.route.id))return!0;let Te=n.matches[Se],we=$;return Nc($,$e({currentUrl:le,currentParams:Te.params,nextUrl:W,nextParams:we.params},d,{actionResult:N,actionStatus:V,defaultShouldRevalidate:pe?!1:y||le.pathname+le.search===W.pathname+W.search||le.search!==W.search||wp(Te,we)}))}),j=[];return P.forEach(($,Se)=>{if(p||!r.some(He=>He.route.id===$.routeId)||C.has(Se))return;let ce=Aa(L,$.path,B);if(!ce){j.push({key:Se,routeId:$.routeId,path:$.path,matches:null,match:null,controller:null});return}let Te=n.fetchers.get(Se),we=ss(ce,$.path),ke=!1;D.has(Se)?ke=!1:v.has(Se)?(v.delete(Se),ke=!0):Te&&Te.state!=="idle"&&Te.data===void 0?ke=y:ke=Nc(we,$e({currentUrl:le,currentParams:n.matches[n.matches.length-1].params,nextUrl:W,nextParams:r[r.length-1].params},d,{actionResult:N,actionStatus:V,defaultShouldRevalidate:pe?!1:y})),ke&&j.push({key:Se,routeId:$.routeId,path:$.path,matches:ce,match:we,controller:new AbortController})}),[De,j]}function Ml(i,n,r){if(i.lazy)return!0;if(!i.loader)return!1;let d=n!=null&&n[i.id]!==void 0,u=r!=null&&r[i.id]!==void 0;return!d&&u?!1:typeof i.loader=="function"&&i.loader.hydrate===!0?!0:!d&&!u}function xm(i,n,r){let d=!n||r.route.id!==n.route.id,u=i[r.route.id]===void 0;return d||u}function wp(i,n){let r=i.route.path;return i.pathname!==n.pathname||r!=null&&r.endsWith("*")&&i.params["*"]!==n.params["*"]}function Nc(i,n){if(i.route.shouldRevalidate){let r=i.route.shouldRevalidate(n);if(typeof r=="boolean")return r}return n.defaultShouldRevalidate}function Oc(i,n,r,d,u){var p;let g;if(i){let v=d[i];Ce(v,"No route found to patch children into: routeId = "+i),v.children||(v.children=[]),g=v.children}else g=r;let y=n.filter(v=>!g.some(C=>kp(v,C))),h=Dn(y,u,[i||"_","patch",String(((p=g)==null?void 0:p.length)||"0")],d);g.push(...h)}function kp(i,n){return"id"in i&&"id"in n&&i.id===n.id?!0:i.index===n.index&&i.path===n.path&&i.caseSensitive===n.caseSensitive?(!i.children||i.children.length===0)&&(!n.children||n.children.length===0)?!0:i.children.every((r,d)=>{var u;return(u=n.children)==null?void 0:u.some(p=>kp(r,p))}):!1}async function Rm(i,n,r){if(!i.lazy)return;let d=await i.lazy();if(!i.lazy)return;let u=r[i.id];Ce(u,"No route found in manifest");let p={};for(let g in d){let h=u[g]!==void 0&&g!=="hasErrorBoundary";ra(!h,'Route "'+u.id+'" has a static property "'+g+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+g+'" will be ignored.')),!h&&!Xh.has(g)&&(p[g]=d[g])}Object.assign(u,p),Object.assign(u,$e({},n(u),{lazy:void 0}))}async function Am(i){let{matches:n}=i,r=n.filter(u=>u.shouldLoad);return(await Promise.all(r.map(u=>u.resolve()))).reduce((u,p,g)=>Object.assign(u,{[r[g].route.id]:p}),{})}async function Im(i,n,r,d,u,p,g,y,h,v){let C=p.map(L=>L.route.lazy?Rm(L.route,h,y):void 0),P=p.map((L,B)=>{let U=C[B],N=u.some(W=>W.route.id===L.route.id);return $e({},L,{shouldLoad:N,resolve:async W=>(W&&d.method==="GET"&&(L.route.lazy||L.route.loader)&&(N=!0),N?Dm(n,d,L,U,W,v):Promise.resolve({type:qe.data,result:void 0}))})}),D=await i({matches:P,request:d,params:p[0].params,fetcherKey:g,context:v});try{await Promise.all(C)}catch{}return D}async function Dm(i,n,r,d,u,p){let g,y,h=v=>{let C,P=new Promise((B,U)=>C=U);y=()=>C(),n.signal.addEventListener("abort",y);let D=B=>typeof v!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+i+'" [routeId: '+r.route.id+"]"))):v({request:n,params:r.params,context:p},...B!==void 0?[B]:[]),L=(async()=>{try{return{type:"data",result:await(u?u(U=>D(U)):D())}}catch(B){return{type:"error",result:B}}})();return Promise.race([L,P])};try{let v=r.route[i];if(d)if(v){let C,[P]=await Promise.all([h(v).catch(D=>{C=D}),d]);if(C!==void 0)throw C;g=P}else if(await d,v=r.route[i],v)g=await h(v);else if(i==="action"){let C=new URL(n.url),P=C.pathname+C.search;throw Dt(405,{method:n.method,pathname:P,routeId:r.route.id})}else return{type:qe.data,result:void 0};else if(v)g=await h(v);else{let C=new URL(n.url),P=C.pathname+C.search;throw Dt(404,{pathname:P})}Ce(g.result!==void 0,"You defined "+(i==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+i+"` ")+"function. Please return a value or `null`.")}catch(v){return{type:qe.error,result:v}}finally{y&&n.signal.removeEventListener("abort",y)}return g}async function jm(i){let{result:n,type:r}=i;if(Rp(n)){let P;try{let D=n.headers.get("Content-Type");D&&/\bapplication\/json\b/.test(D)?n.body==null?P=null:P=await n.json():P=await n.text()}catch(D){return{type:qe.error,error:D}}return r===qe.error?{type:qe.error,error:new En(n.status,n.statusText,P),statusCode:n.status,headers:n.headers}:{type:qe.data,data:P,statusCode:n.status,headers:n.headers}}if(r===qe.error){if(Yc(n)){var d,u;if(n.data instanceof Error){var p,g;return{type:qe.error,error:n.data,statusCode:(p=n.init)==null?void 0:p.status,headers:(g=n.init)!=null&&g.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:new En(((d=n.init)==null?void 0:d.status)||500,void 0,n.data),statusCode:rs(n)?n.status:void 0,headers:(u=n.init)!=null&&u.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:n,statusCode:rs(n)?n.status:void 0}}if(Um(n)){var y,h;return{type:qe.deferred,deferredData:n,statusCode:(y=n.init)==null?void 0:y.status,headers:((h=n.init)==null?void 0:h.headers)&&new Headers(n.init.headers)}}if(Yc(n)){var v,C;return{type:qe.data,data:n.data,statusCode:(v=n.init)==null?void 0:v.status,headers:(C=n.init)!=null&&C.headers?new Headers(n.init.headers):void 0}}return{type:qe.data,data:n}}function Em(i,n,r,d,u,p){let g=i.headers.get("Location");if(Ce(g,"Redirects returned/thrown from loaders/actions must have a Location header"),!Kl.test(g)){let y=d.slice(0,d.findIndex(h=>h.route.id===r)+1);g=Ul(new URL(n.url),y,u,!0,g,p),i.headers.set("Location",g)}return i}function qc(i,n,r,d){let u=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(Kl.test(i)){let p=i,g=p.startsWith("//")?new URL(n.protocol+p):new URL(p);if(u.includes(g.protocol))throw new Error("Invalid redirect location");let y=jo(g.pathname,r)!=null;if(g.origin===n.origin&&y)return g.pathname+g.search+g.hash}try{let p=d.createURL(i);if(u.includes(p.protocol))throw new Error("Invalid redirect location")}catch{}return i}function ri(i,n,r,d){let u=i.createURL(xp(n)).toString(),p={signal:r};if(d&&ao(d.formMethod)){let{formMethod:g,formEncType:y}=d;p.method=g.toUpperCase(),y==="application/json"?(p.headers=new Headers({"Content-Type":y}),p.body=JSON.stringify(d.json)):y==="text/plain"?p.body=d.text:y==="application/x-www-form-urlencoded"&&d.formData?p.body=Hl(d.formData):p.body=d.formData}return new Request(u,p)}function Hl(i){let n=new URLSearchParams;for(let[r,d]of i.entries())n.append(r,typeof d=="string"?d:d.name);return n}function Bc(i){let n=new FormData;for(let[r,d]of i.entries())n.append(r,d);return n}function Tm(i,n,r,d,u){let p={},g=null,y,h=!1,v={},C=r&&Mt(r[1])?r[1].error:void 0;return i.forEach(P=>{if(!(P.route.id in n))return;let D=P.route.id,L=n[D];if(Ce(!Da(L),"Cannot handle redirect results in processLoaderData"),Mt(L)){let B=L.error;C!==void 0&&(B=C,C=void 0),g=g||{};{let U=Ia(i,D);g[U.route.id]==null&&(g[U.route.id]=B)}p[D]=void 0,h||(h=!0,y=rs(L.error)?L.error.status:500),L.headers&&(v[D]=L.headers)}else na(L)?(d.set(D,L.deferredData),p[D]=L.deferredData.data,L.statusCode!=null&&L.statusCode!==200&&!h&&(y=L.statusCode),L.headers&&(v[D]=L.headers)):(p[D]=L.data,L.statusCode&&L.statusCode!==200&&!h&&(y=L.statusCode),L.headers&&(v[D]=L.headers))}),C!==void 0&&r&&(g={[r[0]]:C},p[r[0]]=void 0),{loaderData:p,errors:g,statusCode:y||200,loaderHeaders:v}}function Wc(i,n,r,d,u,p,g){let{loaderData:y,errors:h}=Tm(n,r,d,g);return u.forEach(v=>{let{key:C,match:P,controller:D}=v,L=p[C];if(Ce(L,"Did not find corresponding fetcher result"),!(D&&D.signal.aborted))if(Mt(L)){let B=Ia(i.matches,P==null?void 0:P.route.id);h&&h[B.route.id]||(h=$e({},h,{[B.route.id]:L.error})),i.fetchers.delete(C)}else if(Da(L))Ce(!1,"Unhandled fetcher revalidation redirect");else if(na(L))Ce(!1,"Unhandled fetcher deferred data");else{let B=sa(L.data);i.fetchers.set(C,B)}}),{loaderData:y,errors:h}}function Fc(i,n,r,d){let u=$e({},n);for(let p of r){let g=p.route.id;if(n.hasOwnProperty(g)?n[g]!==void 0&&(u[g]=n[g]):i[g]!==void 0&&p.route.loader&&(u[g]=i[g]),d&&d.hasOwnProperty(g))break}return u}function Kc(i){return i?Mt(i[1])?{actionData:{}}:{actionData:{[i[0]]:i[1].data}}:{}}function Ia(i,n){return(n?i.slice(0,i.findIndex(d=>d.route.id===n)+1):[...i]).reverse().find(d=>d.route.hasErrorBoundary===!0)||i[0]}function Vc(i){let n=i.length===1?i[0]:i.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:n}],route:n}}function Dt(i,n){let{pathname:r,routeId:d,method:u,type:p,message:g}=n===void 0?{}:n,y="Unknown Server Error",h="Unknown @remix-run/router error";return i===400?(y="Bad Request",u&&r&&d?h="You made a "+u+' request to "'+r+'" but '+('did not provide a `loader` for route "'+d+'", ')+"so there is no way to handle the request.":p==="defer-action"?h="defer() is not supported in actions":p==="invalid-body"&&(h="Unable to encode submission body")):i===403?(y="Forbidden",h='Route "'+d+'" does not match URL "'+r+'"'):i===404?(y="Not Found",h='No route matches URL "'+r+'"'):i===405&&(y="Method Not Allowed",u&&r&&d?h="You made a "+u.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+d+'", ')+"so there is no way to handle the request.":u&&(h='Invalid request method "'+u.toUpperCase()+'"')),new En(i||500,y,new Error(h),!0)}function kn(i){let n=Object.entries(i);for(let r=n.length-1;r>=0;r--){let[d,u]=n[r];if(Da(u))return{key:d,result:u}}}function xp(i){let n=typeof i=="string"?Eo(i):i;return Ta($e({},n,{hash:""}))}function Lm(i,n){return i.pathname!==n.pathname||i.search!==n.search?!1:i.hash===""?n.hash!=="":i.hash===n.hash?!0:n.hash!==""}function zm(i){return Rp(i.result)&&vm.has(i.result.status)}function na(i){return i.type===qe.deferred}function Mt(i){return i.type===qe.error}function Da(i){return(i&&i.type)===qe.redirect}function Yc(i){return typeof i=="object"&&i!=null&&"type"in i&&"data"in i&&"init"in i&&i.type==="DataWithResponseInit"}function Um(i){let n=i;return n&&typeof n=="object"&&typeof n.data=="object"&&typeof n.subscribe=="function"&&typeof n.cancel=="function"&&typeof n.resolveData=="function"}function Rp(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.headers=="object"&&typeof i.body<"u"}function Mm(i){return Sm.has(i.toLowerCase())}function ao(i){return ym.has(i.toLowerCase())}async function Hm(i,n,r,d,u){let p=Object.entries(n);for(let g=0;g<p.length;g++){let[y,h]=p[g],v=i.find(D=>(D==null?void 0:D.route.id)===y);if(!v)continue;let C=d.find(D=>D.route.id===v.route.id),P=C!=null&&!wp(C,v)&&(u&&u[v.route.id])!==void 0;na(h)&&P&&await Vl(h,r,!1).then(D=>{D&&(n[y]=D)})}}async function _m(i,n,r){for(let d=0;d<r.length;d++){let{key:u,routeId:p,controller:g}=r[d],y=n[u];i.find(v=>(v==null?void 0:v.route.id)===p)&&na(y)&&(Ce(g,"Expected an AbortController for revalidating fetcher deferred result"),await Vl(y,g.signal,!0).then(v=>{v&&(n[u]=v)}))}}async function Vl(i,n,r){if(r===void 0&&(r=!1),!await i.deferredData.resolveData(n)){if(r)try{return{type:qe.data,data:i.deferredData.unwrappedData}}catch(u){return{type:qe.error,error:u}}return{type:qe.data,data:i.deferredData.data}}}function Yl(i){return new URLSearchParams(i).getAll("index").some(n=>n==="")}function ss(i,n){let r=typeof n=="string"?Eo(n).search:n.search;if(i[i.length-1].route.index&&Yl(r||""))return i[i.length-1];let d=bp(i);return d[d.length-1]}function Gc(i){let{formMethod:n,formAction:r,formEncType:d,text:u,formData:p,json:g}=i;if(!(!n||!r||!d)){if(u!=null)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:void 0,text:u};if(p!=null)return{formMethod:n,formAction:r,formEncType:d,formData:p,json:void 0,text:void 0};if(g!==void 0)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:g,text:void 0}}}function Al(i,n){return n?{state:"loading",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}:{state:"loading",location:i,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Nm(i,n){return{state:"submitting",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}}function os(i,n){return i?{state:"loading",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:n}}function Om(i,n){return{state:"submitting",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n?n.data:void 0}}function sa(i){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:i}}function qm(i,n){try{let r=i.sessionStorage.getItem(Cp);if(r){let d=JSON.parse(r);for(let[u,p]of Object.entries(d||{}))p&&Array.isArray(p)&&n.set(u,new Set(p||[]))}}catch{}}function Bm(i,n){if(n.size>0){let r={};for(let[d,u]of n)r[d]=[...u];try{i.sessionStorage.setItem(Cp,JSON.stringify(r))}catch(d){ra(!1,"Failed to save applied view transitions in sessionStorage ("+d+").")}}}/**
50
+ */function Xe(){return Xe=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},Xe.apply(this,arguments)}var st;(function(i){i.Pop="POP",i.Push="PUSH",i.Replace="REPLACE"})(st||(st={}));const Tc="popstate";function Vh(i){i===void 0&&(i={});function n(u,p){let{pathname:g="/",search:y="",hash:h=""}=Eo(u.location.hash.substr(1));return!g.startsWith("/")&&!g.startsWith(".")&&(g="/"+g),ns("",{pathname:g,search:y,hash:h},p.state&&p.state.usr||null,p.state&&p.state.key||"default")}function r(u,p){let g=u.document.querySelector("base"),y="";if(g&&g.getAttribute("href")){let h=u.location.href,v=h.indexOf("#");y=v===-1?h:h.slice(0,v)}return y+"#"+(typeof p=="string"?p:Ta(p))}function d(u,p){ra(u.pathname.charAt(0)==="/","relative pathnames are not supported in hash history.push("+JSON.stringify(p)+")")}return Gh(n,r,d,i)}function we(i,n){if(i===!1||i===null||typeof i>"u")throw new Error(n)}function ra(i,n){if(!i){typeof console<"u"&&console.warn(n);try{throw new Error(n)}catch{}}}function Yh(){return Math.random().toString(36).substr(2,8)}function Lc(i,n){return{usr:i.state,key:i.key,idx:n}}function ns(i,n,r,d){return r===void 0&&(r=null),Xe({pathname:typeof i=="string"?i:i.pathname,search:"",hash:""},typeof n=="string"?Eo(n):n,{state:r,key:n&&n.key||d||Yh()})}function Ta(i){let{pathname:n="/",search:r="",hash:d=""}=i;return r&&r!=="?"&&(n+=r.charAt(0)==="?"?r:"?"+r),d&&d!=="#"&&(n+=d.charAt(0)==="#"?d:"#"+d),n}function Eo(i){let n={};if(i){let r=i.indexOf("#");r>=0&&(n.hash=i.substr(r),i=i.substr(0,r));let d=i.indexOf("?");d>=0&&(n.search=i.substr(d),i=i.substr(0,d)),i&&(n.pathname=i)}return n}function Gh(i,n,r,d){d===void 0&&(d={});let{window:u=document.defaultView,v5Compat:p=!1}=d,g=u.history,y=st.Pop,h=null,v=w();v==null&&(v=0,g.replaceState(Xe({},g.state,{idx:v}),""));function w(){return(g.state||{idx:null}).idx}function P(){y=st.Pop;let _=w(),le=_==null?null:_-v;v=_,h&&h({action:y,location:U.location,delta:le})}function D(_,le){y=st.Push;let W=ns(U.location,_,le);r&&r(W,_),v=w()+1;let oe=Lc(W,v),V=U.createHref(W);try{g.pushState(oe,"",V)}catch(pe){if(pe instanceof DOMException&&pe.name==="DataCloneError")throw pe;u.location.assign(V)}p&&h&&h({action:y,location:U.location,delta:1})}function L(_,le){y=st.Replace;let W=ns(U.location,_,le);r&&r(W,_),v=w();let oe=Lc(W,v),V=U.createHref(W);g.replaceState(oe,"",V),p&&h&&h({action:y,location:U.location,delta:0})}function B(_){let le=u.location.origin!=="null"?u.location.origin:u.location.href,W=typeof _=="string"?_:Ta(_);return W=W.replace(/ $/,"%20"),we(le,"No window.location.(origin|href) available to create URL for href: "+W),new URL(W,le)}let U={get action(){return y},get location(){return i(u,g)},listen(_){if(h)throw new Error("A history only accepts one active listener");return u.addEventListener(Tc,P),h=_,()=>{u.removeEventListener(Tc,P),h=null}},createHref(_){return n(u,_)},createURL:B,encodeLocation(_){let le=B(_);return{pathname:le.pathname,search:le.search,hash:le.hash}},push:D,replace:L,go(_){return g.go(_)}};return U}var qe;(function(i){i.data="data",i.deferred="deferred",i.redirect="redirect",i.error="error"})(qe||(qe={}));const $h=new Set(["lazy","caseSensitive","path","id","index","children"]);function Xh(i){return i.index===!0}function Dn(i,n,r,d){return r===void 0&&(r=[]),d===void 0&&(d={}),i.map((u,p)=>{let g=[...r,String(p)],y=typeof u.id=="string"?u.id:g.join("-");if(we(u.index!==!0||!u.children,"Cannot specify children on an index route"),we(!d[y],'Found a route id collision on id "'+y+`". Route id's must be globally unique within Data Router usages`),Xh(u)){let h=Xe({},u,n(u),{id:y});return d[y]=h,h}else{let h=Xe({},u,n(u),{id:y,children:void 0});return d[y]=h,u.children&&(h.children=Dn(u.children,n,g,d)),h}})}function Aa(i,n,r){return r===void 0&&(r="/"),Rn(i,n,r,!1)}function Rn(i,n,r,d){let u=typeof n=="string"?Eo(n):n,p=jo(u.pathname||"/",r);if(p==null)return null;let g=Sp(i);Zh(g);let y=null;for(let h=0;y==null&&h<g.length;++h){let v=dm(p);y=rm(g[h],v,d)}return y}function Qh(i,n){let{route:r,pathname:d,params:u}=i;return{id:r.id,pathname:d,params:u,data:n[r.id],handle:r.handle}}function Sp(i,n,r,d){n===void 0&&(n=[]),r===void 0&&(r=[]),d===void 0&&(d="");let u=(p,g,y)=>{let h={relativePath:y===void 0?p.path||"":y,caseSensitive:p.caseSensitive===!0,childrenIndex:g,route:p};h.relativePath.startsWith("/")&&(we(h.relativePath.startsWith(d),'Absolute route path "'+h.relativePath+'" nested under path '+('"'+d+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),h.relativePath=h.relativePath.slice(d.length));let v=Do([d,h.relativePath]),w=r.concat(h);p.children&&p.children.length>0&&(we(p.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+v+'".')),Sp(p.children,n,w,v)),!(p.path==null&&!p.index)&&n.push({path:v,score:sm(v,p.index),routesMeta:w})};return i.forEach((p,g)=>{var y;if(p.path===""||!((y=p.path)!=null&&y.includes("?")))u(p,g);else for(let h of vp(p.path))u(p,g,h)}),n}function vp(i){let n=i.split("/");if(n.length===0)return[];let[r,...d]=n,u=r.endsWith("?"),p=r.replace(/\?$/,"");if(d.length===0)return u?[p,""]:[p];let g=vp(d.join("/")),y=[];return y.push(...g.map(h=>h===""?p:[p,h].join("/"))),u&&y.push(...g),y.map(h=>i.startsWith("/")&&h===""?"/":h)}function Zh(i){i.sort((n,r)=>n.score!==r.score?r.score-n.score:nm(n.routesMeta.map(d=>d.childrenIndex),r.routesMeta.map(d=>d.childrenIndex)))}const Jh=/^:[\w-]+$/,em=3,tm=2,om=1,am=10,im=-2,zc=i=>i==="*";function sm(i,n){let r=i.split("/"),d=r.length;return r.some(zc)&&(d+=im),n&&(d+=tm),r.filter(u=>!zc(u)).reduce((u,p)=>u+(Jh.test(p)?em:p===""?om:am),d)}function nm(i,n){return i.length===n.length&&i.slice(0,-1).every((d,u)=>d===n[u])?i[i.length-1]-n[n.length-1]:0}function rm(i,n,r){r===void 0&&(r=!1);let{routesMeta:d}=i,u={},p="/",g=[];for(let y=0;y<d.length;++y){let h=d[y],v=y===d.length-1,w=p==="/"?n:n.slice(p.length)||"/",P=jn({path:h.relativePath,caseSensitive:h.caseSensitive,end:v},w),D=h.route;if(!P&&v&&r&&!d[d.length-1].route.index&&(P=jn({path:h.relativePath,caseSensitive:h.caseSensitive,end:!1},w)),!P)return null;Object.assign(u,P.params),g.push({params:u,pathname:Do([p,P.pathname]),pathnameBase:gm(Do([p,P.pathnameBase])),route:D}),P.pathnameBase!=="/"&&(p=Do([p,P.pathnameBase]))}return g}function jn(i,n){typeof i=="string"&&(i={path:i,caseSensitive:!1,end:!0});let[r,d]=lm(i.path,i.caseSensitive,i.end),u=n.match(r);if(!u)return null;let p=u[0],g=p.replace(/(.)\/+$/,"$1"),y=u.slice(1);return{params:d.reduce((v,w,P)=>{let{paramName:D,isOptional:L}=w;if(D==="*"){let U=y[P]||"";g=p.slice(0,p.length-U.length).replace(/(.)\/+$/,"$1")}const B=y[P];return L&&!B?v[D]=void 0:v[D]=(B||"").replace(/%2F/g,"/"),v},{}),pathname:p,pathnameBase:g,pattern:i}}function lm(i,n,r){n===void 0&&(n=!1),r===void 0&&(r=!0),ra(i==="*"||!i.endsWith("*")||i.endsWith("/*"),'Route path "'+i+'" will be treated as if it were '+('"'+i.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+i.replace(/\*$/,"/*")+'".'));let d=[],u="^"+i.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(g,y,h)=>(d.push({paramName:y,isOptional:h!=null}),h?"/?([^\\/]+)?":"/([^\\/]+)"));return i.endsWith("*")?(d.push({paramName:"*"}),u+=i==="*"||i==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?u+="\\/*$":i!==""&&i!=="/"&&(u+="(?:(?=\\/|$))"),[new RegExp(u,n?void 0:"i"),d]}function dm(i){try{return i.split("/").map(n=>decodeURIComponent(n).replace(/\//g,"%2F")).join("/")}catch(n){return ra(!1,'The URL path "'+i+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+n+").")),i}}function jo(i,n){if(n==="/")return i;if(!i.toLowerCase().startsWith(n.toLowerCase()))return null;let r=n.endsWith("/")?n.length-1:n.length,d=i.charAt(r);return d&&d!=="/"?null:i.slice(r)||"/"}const um=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,cm=i=>um.test(i);function pm(i,n){n===void 0&&(n="/");let{pathname:r,search:d="",hash:u=""}=typeof i=="string"?Eo(i):i,p;if(r)if(cm(r))p=r;else{if(r.includes("//")){let g=r;r=r.replace(/\/\/+/g,"/"),ra(!1,"Pathnames cannot have embedded double slashes - normalizing "+(g+" -> "+r))}r.startsWith("/")?p=Uc(r.substring(1),"/"):p=Uc(r,n)}else p=n;return{pathname:p,search:hm(d),hash:mm(u)}}function Uc(i,n){let r=n.replace(/\/+$/,"").split("/");return i.split("/").forEach(u=>{u===".."?r.length>1&&r.pop():u!=="."&&r.push(u)}),r.length>1?r.join("/"):"/"}function xl(i,n,r,d){return"Cannot include a '"+i+"' character in a manually specified "+("`to."+n+"` field ["+JSON.stringify(d)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function bp(i){return i.filter((n,r)=>r===0||n.route.path&&n.route.path.length>0)}function zn(i,n){let r=bp(i);return n?r.map((d,u)=>u===r.length-1?d.pathname:d.pathnameBase):r.map(d=>d.pathnameBase)}function Un(i,n,r,d){d===void 0&&(d=!1);let u;typeof i=="string"?u=Eo(i):(u=Xe({},i),we(!u.pathname||!u.pathname.includes("?"),xl("?","pathname","search",u)),we(!u.pathname||!u.pathname.includes("#"),xl("#","pathname","hash",u)),we(!u.search||!u.search.includes("#"),xl("#","search","hash",u)));let p=i===""||u.pathname==="",g=p?"/":u.pathname,y;if(g==null)y=r;else{let P=n.length-1;if(!d&&g.startsWith("..")){let D=g.split("/");for(;D[0]==="..";)D.shift(),P-=1;u.pathname=D.join("/")}y=P>=0?n[P]:"/"}let h=pm(u,y),v=g&&g!=="/"&&g.endsWith("/"),w=(p||g===".")&&r.endsWith("/");return!h.pathname.endsWith("/")&&(v||w)&&(h.pathname+="/"),h}const Do=i=>i.join("/").replace(/\/\/+/g,"/"),gm=i=>i.replace(/\/+$/,"").replace(/^\/*/,"/"),hm=i=>!i||i==="?"?"":i.startsWith("?")?i:"?"+i,mm=i=>!i||i==="#"?"":i.startsWith("#")?i:"#"+i;class En{constructor(n,r,d,u){u===void 0&&(u=!1),this.status=n,this.statusText=r||"",this.internal=u,d instanceof Error?(this.data=d.toString(),this.error=d):this.data=d}}function rs(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.internal=="boolean"&&"data"in i}const Pp=["post","put","patch","delete"],ym=new Set(Pp),fm=["get",...Pp],Sm=new Set(fm),vm=new Set([301,302,303,307,308]),bm=new Set([307,308]),Rl={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},Pm={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ts={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Kl=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,wm=i=>({hasErrorBoundary:!!i.hasErrorBoundary}),wp="remix-router-transitions";function Cm(i){const n=i.window?i.window:typeof window<"u"?window:void 0,r=typeof n<"u"&&typeof n.document<"u"&&typeof n.document.createElement<"u",d=!r;we(i.routes.length>0,"You must provide a non-empty routes array to createRouter");let u;if(i.mapRouteProperties)u=i.mapRouteProperties;else if(i.detectErrorBoundary){let f=i.detectErrorBoundary;u=k=>({hasErrorBoundary:f(k)})}else u=wm;let p={},g=Dn(i.routes,u,void 0,p),y,h=i.basename||"/",v=i.dataStrategy||Am,w=i.patchRoutesOnNavigation,P=Xe({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},i.future),D=null,L=new Set,B=null,U=null,_=null,le=i.hydrationData!=null,W=Aa(g,i.history.location,h),oe=!1,V=null;if(W==null&&!w){let f=Dt(404,{pathname:i.history.location.pathname}),{matches:k,route:T}=Vc(g);W=k,V={[T.id]:f}}W&&!i.hydrationData&&ua(W,g,i.history.location.pathname).active&&(W=null);let pe;if(W)if(W.some(f=>f.route.lazy))pe=!1;else if(!W.some(f=>f.route.loader))pe=!0;else if(P.v7_partialHydration){let f=i.hydrationData?i.hydrationData.loaderData:null,k=i.hydrationData?i.hydrationData.errors:null;if(k){let T=W.findIndex(H=>k[H.route.id]!==void 0);pe=W.slice(0,T+1).every(H=>!Hl(H.route,f,k))}else pe=W.every(T=>!Hl(T.route,f,k))}else pe=i.hydrationData!=null;else if(pe=!1,W=[],P.v7_partialHydration){let f=ua(null,g,i.history.location.pathname);f.active&&f.matches&&(oe=!0,W=f.matches)}let De,j={historyAction:i.history.action,location:i.history.location,matches:W,initialized:pe,navigation:Rl,restoreScrollPosition:i.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:i.hydrationData&&i.hydrationData.loaderData||{},actionData:i.hydrationData&&i.hydrationData.actionData||null,errors:i.hydrationData&&i.hydrationData.errors||V,fetchers:new Map,blockers:new Map},X=st.Pop,Se=!1,ce,Te=!1,Ce=new Map,ke=null,Me=!1,et=!1,ot=[],Ne=new Set,O=new Map,de=0,G=-1,C=new Map,z=new Set,ye=new Map,K=new Map,ae=new Set,ue=new Map,Pe=new Map,xe;function Le(){if(D=i.history.listen(f=>{let{action:k,location:T,delta:H}=f;if(xe){xe(),xe=void 0;return}ra(Pe.size===0||H!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let Y=Ma({currentLocation:j.location,nextLocation:T,historyAction:k});if(Y&&H!=null){let re=new Promise(me=>{xe=me});i.history.go(H*-1),Mo(Y,{state:"blocked",location:T,proceed(){Mo(Y,{state:"proceeding",proceed:void 0,reset:void 0,location:T}),re.then(()=>i.history.go(H))},reset(){let me=new Map(j.blockers);me.set(Y,ts),dt({blockers:me})}});return}return io(k,T)}),r){qm(n,Ce);let f=()=>Bm(n,Ce);n.addEventListener("pagehide",f),ke=()=>n.removeEventListener("pagehide",f)}return j.initialized||io(st.Pop,j.location,{initialHydration:!0}),De}function gt(){D&&D(),ke&&ke(),L.clear(),ce&&ce.abort(),j.fetchers.forEach((f,k)=>no(k)),j.blockers.forEach((f,k)=>Ha(k))}function yo(f){return L.add(f),()=>L.delete(f)}function dt(f,k){k===void 0&&(k={}),j=Xe({},j,f);let T=[],H=[];P.v7_fetcherPersist&&j.fetchers.forEach((Y,re)=>{Y.state==="idle"&&(ae.has(re)?H.push(re):T.push(re))}),ae.forEach(Y=>{!j.fetchers.has(Y)&&!O.has(Y)&&H.push(Y)}),[...L].forEach(Y=>Y(j,{deletedFetchers:H,viewTransitionOpts:k.viewTransitionOpts,flushSync:k.flushSync===!0})),P.v7_fetcherPersist?(T.forEach(Y=>j.fetchers.delete(Y)),H.forEach(Y=>no(Y))):H.forEach(Y=>ae.delete(Y))}function Yt(f,k,T){var H,Y;let{flushSync:re}=T===void 0?{}:T,me=j.actionData!=null&&j.navigation.formMethod!=null&&ao(j.navigation.formMethod)&&j.navigation.state==="loading"&&((H=f.state)==null?void 0:H._isRedirect)!==!0,ee;k.actionData?Object.keys(k.actionData).length>0?ee=k.actionData:ee=null:me?ee=j.actionData:ee=null;let ie=k.loaderData?Fc(j.loaderData,k.loaderData,k.matches||[],k.errors):j.loaderData,Q=j.blockers;Q.size>0&&(Q=new Map(Q),Q.forEach((Ae,nt)=>Q.set(nt,ts)));let J=Se===!0||j.navigation.formMethod!=null&&ao(j.navigation.formMethod)&&((Y=f.state)==null?void 0:Y._isRedirect)!==!0;y&&(g=y,y=void 0),Me||X===st.Pop||(X===st.Push?i.history.push(f,f.state):X===st.Replace&&i.history.replace(f,f.state));let ve;if(X===st.Pop){let Ae=Ce.get(j.location.pathname);Ae&&Ae.has(f.pathname)?ve={currentLocation:j.location,nextLocation:f}:Ce.has(f.pathname)&&(ve={currentLocation:f,nextLocation:j.location})}else if(Te){let Ae=Ce.get(j.location.pathname);Ae?Ae.add(f.pathname):(Ae=new Set([f.pathname]),Ce.set(j.location.pathname,Ae)),ve={currentLocation:j.location,nextLocation:f}}dt(Xe({},k,{actionData:ee,loaderData:ie,historyAction:X,location:f,initialized:!0,navigation:Rl,revalidation:"idle",restoreScrollPosition:vi(f,k.matches||j.matches),preventScrollReset:J,blockers:Q}),{viewTransitionOpts:ve,flushSync:re===!0}),X=st.Pop,Se=!1,Te=!1,Me=!1,et=!1,ot=[]}async function La(f,k){if(typeof f=="number"){i.history.go(f);return}let T=Ul(j.location,j.matches,h,P.v7_prependBasename,f,P.v7_relativeSplatPath,k==null?void 0:k.fromRouteId,k==null?void 0:k.relative),{path:H,submission:Y,error:re}=Hc(P.v7_normalizeFormMethod,!1,T,k),me=j.location,ee=ns(j.location,H,k&&k.state);ee=Xe({},ee,i.history.encodeLocation(ee));let ie=k&&k.replace!=null?k.replace:void 0,Q=st.Push;ie===!0?Q=st.Replace:ie===!1||Y!=null&&ao(Y.formMethod)&&Y.formAction===j.location.pathname+j.location.search&&(Q=st.Replace);let J=k&&"preventScrollReset"in k?k.preventScrollReset===!0:void 0,ve=(k&&k.flushSync)===!0,Ae=Ma({currentLocation:me,nextLocation:ee,historyAction:Q});if(Ae){Mo(Ae,{state:"blocked",location:ee,proceed(){Mo(Ae,{state:"proceeding",proceed:void 0,reset:void 0,location:ee}),La(f,k)},reset(){let nt=new Map(j.blockers);nt.set(Ae,ts),dt({blockers:nt})}});return}return await io(Q,ee,{submission:Y,pendingError:re,preventScrollReset:J,replace:k&&k.replace,enableViewTransition:k&&k.viewTransition,flushSync:ve})}function cs(){if(da(),dt({revalidation:"loading"}),j.navigation.state!=="submitting"){if(j.navigation.state==="idle"){io(j.historyAction,j.location,{startUninterruptedRevalidation:!0});return}io(X||j.historyAction,j.navigation.location,{overrideNavigation:j.navigation,enableViewTransition:Te===!0})}}async function io(f,k,T){ce&&ce.abort(),ce=null,X=f,Me=(T&&T.startUninterruptedRevalidation)===!0,ys(j.location,j.matches),Se=(T&&T.preventScrollReset)===!0,Te=(T&&T.enableViewTransition)===!0;let H=y||g,Y=T&&T.overrideNavigation,re=T!=null&&T.initialHydration&&j.matches&&j.matches.length>0&&!oe?j.matches:Aa(H,k,h),me=(T&&T.flushSync)===!0;if(re&&j.initialized&&!et&&Lm(j.location,k)&&!(T&&T.submission&&ao(T.submission.formMethod))){Yt(k,{matches:re},{flushSync:me});return}let ee=ua(re,H,k.pathname);if(ee.active&&ee.matches&&(re=ee.matches),!re){let{error:_e,notFoundMatches:je,route:Ve}=ro(k.pathname);Yt(k,{matches:je,loaderData:{},errors:{[Ve.id]:_e}},{flushSync:me});return}ce=new AbortController;let ie=ri(i.history,k,ce.signal,T&&T.submission),Q;if(T&&T.pendingError)Q=[Ia(re).route.id,{type:qe.error,error:T.pendingError}];else if(T&&T.submission&&ao(T.submission.formMethod)){let _e=await gi(ie,k,T.submission,re,ee.active,{replace:T.replace,flushSync:me});if(_e.shortCircuited)return;if(_e.pendingActionResult){let[je,Ve]=_e.pendingActionResult;if(Ht(Ve)&&rs(Ve.error)&&Ve.error.status===404){ce=null,Yt(k,{matches:_e.matches,loaderData:{},errors:{[je]:Ve.error}});return}}re=_e.matches||re,Q=_e.pendingActionResult,Y=Al(k,T.submission),me=!1,ee.active=!1,ie=ri(i.history,ie.url,ie.signal)}let{shortCircuited:J,matches:ve,loaderData:Ae,errors:nt}=await ps(ie,k,re,ee.active,Y,T&&T.submission,T&&T.fetcherSubmission,T&&T.replace,T&&T.initialHydration===!0,me,Q);J||(ce=null,Yt(k,Xe({matches:ve||re},Kc(Q),{loaderData:Ae,errors:nt})))}async function gi(f,k,T,H,Y,re){re===void 0&&(re={}),da();let me=_m(k,T);if(dt({navigation:me},{flushSync:re.flushSync===!0}),Y){let Q=await No(H,k.pathname,f.signal);if(Q.type==="aborted")return{shortCircuited:!0};if(Q.type==="error"){let J=Ia(Q.partialMatches).route.id;return{matches:Q.partialMatches,pendingActionResult:[J,{type:qe.error,error:Q.error}]}}else if(Q.matches)H=Q.matches;else{let{notFoundMatches:J,error:ve,route:Ae}=ro(k.pathname);return{matches:J,pendingActionResult:[Ae.id,{type:qe.error,error:ve}]}}}let ee,ie=ss(H,k);if(!ie.route.action&&!ie.route.lazy)ee={type:qe.error,error:Dt(405,{method:f.method,pathname:k.pathname,routeId:ie.route.id})};else if(ee=(await Uo("action",j,f,[ie],H,null))[ie.route.id],f.signal.aborted)return{shortCircuited:!0};if(Da(ee)){let Q;return re&&re.replace!=null?Q=re.replace:Q=qc(ee.response.headers.get("Location"),new URL(f.url),h,i.history)===j.location.pathname+j.location.search,await so(f,ee,!0,{submission:T,replace:Q}),{shortCircuited:!0}}if(na(ee))throw Dt(400,{type:"defer-action"});if(Ht(ee)){let Q=Ia(H,ie.route.id);return(re&&re.replace)!==!0&&(X=st.Push),{matches:H,pendingActionResult:[Q.route.id,ee]}}return{matches:H,pendingActionResult:[ie.route.id,ee]}}async function ps(f,k,T,H,Y,re,me,ee,ie,Q,J){let ve=Y||Al(k,re),Ae=re||me||Gc(ve),nt=!Me&&(!P.v7_partialHydration||!ie);if(H){if(nt){let Be=za(J);dt(Xe({navigation:ve},Be!==void 0?{actionData:Be}:{}),{flushSync:Q})}let Ie=await No(T,k.pathname,f.signal);if(Ie.type==="aborted")return{shortCircuited:!0};if(Ie.type==="error"){let Be=Ia(Ie.partialMatches).route.id;return{matches:Ie.partialMatches,loaderData:{},errors:{[Be]:Ie.error}}}else if(Ie.matches)T=Ie.matches;else{let{error:Be,notFoundMatches:ht,route:ga}=ro(k.pathname);return{matches:ht,loaderData:{},errors:{[ga.id]:Be}}}}let _e=y||g,[je,Ve]=Nc(i.history,j,T,Ae,k,P.v7_partialHydration&&ie===!0,P.v7_skipActionErrorRevalidation,et,ot,Ne,ae,ye,z,_e,h,J);if(lo(Ie=>!(T&&T.some(Be=>Be.route.id===Ie))||je&&je.some(Be=>Be.route.id===Ie)),G=++de,je.length===0&&Ve.length===0){let Ie=hs();return Yt(k,Xe({matches:T,loaderData:{},errors:J&&Ht(J[1])?{[J[0]]:J[1].error}:null},Kc(J),Ie?{fetchers:new Map(j.fetchers)}:{}),{flushSync:Q}),{shortCircuited:!0}}if(nt){let Ie={};if(!H){Ie.navigation=ve;let Be=za(J);Be!==void 0&&(Ie.actionData=Be)}Ve.length>0&&(Ie.fetchers=la(Ve)),dt(Ie,{flushSync:Q})}Ve.forEach(Ie=>{Gt(Ie.key),Ie.controller&&O.set(Ie.key,Ie.controller)});let fo=()=>Ve.forEach(Ie=>Gt(Ie.key));ce&&ce.signal.addEventListener("abort",fo);let{loaderResults:pa,fetcherResults:$t}=await mi(j,T,je,Ve,f);if(f.signal.aborted)return{shortCircuited:!0};ce&&ce.signal.removeEventListener("abort",fo),Ve.forEach(Ie=>O.delete(Ie.key));let ze=kn(pa);if(ze)return await so(f,ze.result,!0,{replace:ee}),{shortCircuited:!0};if(ze=kn($t),ze)return z.add(ze.key),await so(f,ze.result,!0,{replace:ee}),{shortCircuited:!0};let{loaderData:bi,errors:So}=Wc(j,T,pa,J,Ve,$t,ue);ue.forEach((Ie,Be)=>{Ie.subscribe(ht=>{(ht||Ie.done)&&ue.delete(Be)})}),P.v7_partialHydration&&ie&&j.errors&&(So=Xe({},j.errors,So));let uo=hs(),vo=Ua(G),Na=uo||vo||Ve.length>0;return Xe({matches:T,loaderData:bi,errors:So},Na?{fetchers:new Map(j.fetchers)}:{})}function za(f){if(f&&!Ht(f[1]))return{[f[0]]:f[1].data};if(j.actionData)return Object.keys(j.actionData).length===0?null:j.actionData}function la(f){return f.forEach(k=>{let T=j.fetchers.get(k.key),H=os(void 0,T?T.data:void 0);j.fetchers.set(k.key,H)}),new Map(j.fetchers)}function zo(f,k,T,H){if(d)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");Gt(f);let Y=(H&&H.flushSync)===!0,re=y||g,me=Ul(j.location,j.matches,h,P.v7_prependBasename,T,P.v7_relativeSplatPath,k,H==null?void 0:H.relative),ee=Aa(re,me,h),ie=ua(ee,re,me);if(ie.active&&ie.matches&&(ee=ie.matches),!ee){Mt(f,k,Dt(404,{pathname:me}),{flushSync:Y});return}let{path:Q,submission:J,error:ve}=Hc(P.v7_normalizeFormMethod,!0,me,H);if(ve){Mt(f,k,ve,{flushSync:Y});return}let Ae=ss(ee,Q),nt=(H&&H.preventScrollReset)===!0;if(J&&ao(J.formMethod)){hi(f,k,Q,Ae,ee,ie.active,Y,nt,J);return}ye.set(f,{routeId:k,path:Q}),gs(f,k,Q,Ae,ee,ie.active,Y,nt,J)}async function hi(f,k,T,H,Y,re,me,ee,ie){da(),ye.delete(f);function Q(Ue){if(!Ue.route.action&&!Ue.route.lazy){let _o=Dt(405,{method:ie.formMethod,pathname:T,routeId:k});return Mt(f,k,_o,{flushSync:me}),!0}return!1}if(!re&&Q(H))return;let J=j.fetchers.get(f);Et(f,Om(ie,J),{flushSync:me});let ve=new AbortController,Ae=ri(i.history,T,ve.signal,ie);if(re){let Ue=await No(Y,new URL(Ae.url).pathname,Ae.signal,f);if(Ue.type==="aborted")return;if(Ue.type==="error"){Mt(f,k,Ue.error,{flushSync:me});return}else if(Ue.matches){if(Y=Ue.matches,H=ss(Y,T),Q(H))return}else{Mt(f,k,Dt(404,{pathname:T}),{flushSync:me});return}}O.set(f,ve);let nt=de,je=(await Uo("action",j,Ae,[H],Y,f))[H.route.id];if(Ae.signal.aborted){O.get(f)===ve&&O.delete(f);return}if(P.v7_fetcherPersist&&ae.has(f)){if(Da(je)||Ht(je)){Et(f,sa(void 0));return}}else{if(Da(je))if(O.delete(f),G>nt){Et(f,sa(void 0));return}else return z.add(f),Et(f,os(ie)),so(Ae,je,!1,{fetcherSubmission:ie,preventScrollReset:ee});if(Ht(je)){Mt(f,k,je.error);return}}if(na(je))throw Dt(400,{type:"defer-action"});let Ve=j.navigation.location||j.location,fo=ri(i.history,Ve,ve.signal),pa=y||g,$t=j.navigation.state!=="idle"?Aa(pa,j.navigation.location,h):j.matches;we($t,"Didn't find any matches after fetcher action");let ze=++de;C.set(f,ze);let bi=os(ie,je.data);j.fetchers.set(f,bi);let[So,uo]=Nc(i.history,j,$t,ie,Ve,!1,P.v7_skipActionErrorRevalidation,et,ot,Ne,ae,ye,z,pa,h,[H.route.id,je]);uo.filter(Ue=>Ue.key!==f).forEach(Ue=>{let _o=Ue.key,Ss=j.fetchers.get(_o),On=os(void 0,Ss?Ss.data:void 0);j.fetchers.set(_o,On),Gt(_o),Ue.controller&&O.set(_o,Ue.controller)}),dt({fetchers:new Map(j.fetchers)});let vo=()=>uo.forEach(Ue=>Gt(Ue.key));ve.signal.addEventListener("abort",vo);let{loaderResults:Na,fetcherResults:Ie}=await mi(j,$t,So,uo,fo);if(ve.signal.aborted)return;ve.signal.removeEventListener("abort",vo),C.delete(f),O.delete(f),uo.forEach(Ue=>O.delete(Ue.key));let Be=kn(Na);if(Be)return so(fo,Be.result,!1,{preventScrollReset:ee});if(Be=kn(Ie),Be)return z.add(Be.key),so(fo,Be.result,!1,{preventScrollReset:ee});let{loaderData:ht,errors:ga}=Wc(j,$t,Na,void 0,uo,Ie,ue);if(j.fetchers.has(f)){let Ue=sa(je.data);j.fetchers.set(f,Ue)}Ua(ze),j.navigation.state==="loading"&&ze>G?(we(X,"Expected pending action"),ce&&ce.abort(),Yt(j.navigation.location,{matches:$t,loaderData:ht,errors:ga,fetchers:new Map(j.fetchers)})):(dt({errors:ga,loaderData:Fc(j.loaderData,ht,$t,ga),fetchers:new Map(j.fetchers)}),et=!1)}async function gs(f,k,T,H,Y,re,me,ee,ie){let Q=j.fetchers.get(f);Et(f,os(ie,Q?Q.data:void 0),{flushSync:me});let J=new AbortController,ve=ri(i.history,T,J.signal);if(re){let je=await No(Y,new URL(ve.url).pathname,ve.signal,f);if(je.type==="aborted")return;if(je.type==="error"){Mt(f,k,je.error,{flushSync:me});return}else if(je.matches)Y=je.matches,H=ss(Y,T);else{Mt(f,k,Dt(404,{pathname:T}),{flushSync:me});return}}O.set(f,J);let Ae=de,_e=(await Uo("loader",j,ve,[H],Y,f))[H.route.id];if(na(_e)&&(_e=await Vl(_e,ve.signal,!0)||_e),O.get(f)===J&&O.delete(f),!ve.signal.aborted){if(ae.has(f)){Et(f,sa(void 0));return}if(Da(_e))if(G>Ae){Et(f,sa(void 0));return}else{z.add(f),await so(ve,_e,!1,{preventScrollReset:ee});return}if(Ht(_e)){Mt(f,k,_e.error);return}we(!na(_e),"Unhandled fetcher deferred data"),Et(f,sa(_e.data))}}async function so(f,k,T,H){let{submission:Y,fetcherSubmission:re,preventScrollReset:me,replace:ee}=H===void 0?{}:H;k.response.headers.has("X-Remix-Revalidate")&&(et=!0);let ie=k.response.headers.get("Location");we(ie,"Expected a Location header on the redirect Response"),ie=qc(ie,new URL(f.url),h,i.history);let Q=ns(j.location,ie,{_isRedirect:!0});if(r){let je=!1;if(k.response.headers.has("X-Remix-Reload-Document"))je=!0;else if(Kl.test(ie)){const Ve=i.history.createURL(ie);je=Ve.origin!==n.location.origin||jo(Ve.pathname,h)==null}if(je){ee?n.location.replace(ie):n.location.assign(ie);return}}ce=null;let J=ee===!0||k.response.headers.has("X-Remix-Replace")?st.Replace:st.Push,{formMethod:ve,formAction:Ae,formEncType:nt}=j.navigation;!Y&&!re&&ve&&Ae&&nt&&(Y=Gc(j.navigation));let _e=Y||re;if(bm.has(k.response.status)&&_e&&ao(_e.formMethod))await io(J,Q,{submission:Xe({},_e,{formAction:ie}),preventScrollReset:me||Se,enableViewTransition:T?Te:void 0});else{let je=Al(Q,Y);await io(J,Q,{overrideNavigation:je,fetcherSubmission:re,preventScrollReset:me||Se,enableViewTransition:T?Te:void 0})}}async function Uo(f,k,T,H,Y,re){let me,ee={};try{me=await Im(v,f,k,T,H,Y,re,p,u)}catch(ie){return H.forEach(Q=>{ee[Q.route.id]={type:qe.error,error:ie}}),ee}for(let[ie,Q]of Object.entries(me))if(zm(Q)){let J=Q.result;ee[ie]={type:qe.redirect,response:Em(J,T,ie,Y,h,P.v7_relativeSplatPath)}}else ee[ie]=await jm(Q);return ee}async function mi(f,k,T,H,Y){let re=f.matches,me=Uo("loader",f,Y,T,k,null),ee=Promise.all(H.map(async J=>{if(J.matches&&J.match&&J.controller){let Ae=(await Uo("loader",f,ri(i.history,J.path,J.controller.signal),[J.match],J.matches,J.key))[J.match.route.id];return{[J.key]:Ae}}else return Promise.resolve({[J.key]:{type:qe.error,error:Dt(404,{pathname:J.path})}})})),ie=await me,Q=(await ee).reduce((J,ve)=>Object.assign(J,ve),{});return await Promise.all([Mm(k,ie,Y.signal,re,f.loaderData),Nm(k,Q,H)]),{loaderResults:ie,fetcherResults:Q}}function da(){et=!0,ot.push(...lo()),ye.forEach((f,k)=>{O.has(k)&&Ne.add(k),Gt(k)})}function Et(f,k,T){T===void 0&&(T={}),j.fetchers.set(f,k),dt({fetchers:new Map(j.fetchers)},{flushSync:(T&&T.flushSync)===!0})}function Mt(f,k,T,H){H===void 0&&(H={});let Y=Ia(j.matches,k);no(f),dt({errors:{[Y.route.id]:T},fetchers:new Map(j.fetchers)},{flushSync:(H&&H.flushSync)===!0})}function Ho(f){return K.set(f,(K.get(f)||0)+1),ae.has(f)&&ae.delete(f),j.fetchers.get(f)||Pm}function no(f){let k=j.fetchers.get(f);O.has(f)&&!(k&&k.state==="loading"&&C.has(f))&&Gt(f),ye.delete(f),C.delete(f),z.delete(f),P.v7_fetcherPersist&&ae.delete(f),Ne.delete(f),j.fetchers.delete(f)}function _n(f){let k=(K.get(f)||0)-1;k<=0?(K.delete(f),ae.add(f),P.v7_fetcherPersist||no(f)):K.set(f,k),dt({fetchers:new Map(j.fetchers)})}function Gt(f){let k=O.get(f);k&&(k.abort(),O.delete(f))}function yi(f){for(let k of f){let T=Ho(k),H=sa(T.data);j.fetchers.set(k,H)}}function hs(){let f=[],k=!1;for(let T of z){let H=j.fetchers.get(T);we(H,"Expected fetcher: "+T),H.state==="loading"&&(z.delete(T),f.push(T),k=!0)}return yi(f),k}function Ua(f){let k=[];for(let[T,H]of C)if(H<f){let Y=j.fetchers.get(T);we(Y,"Expected fetcher: "+T),Y.state==="loading"&&(Gt(T),C.delete(T),k.push(T))}return yi(k),k.length>0}function fi(f,k){let T=j.blockers.get(f)||ts;return Pe.get(f)!==k&&Pe.set(f,k),T}function Ha(f){j.blockers.delete(f),Pe.delete(f)}function Mo(f,k){let T=j.blockers.get(f)||ts;we(T.state==="unblocked"&&k.state==="blocked"||T.state==="blocked"&&k.state==="blocked"||T.state==="blocked"&&k.state==="proceeding"||T.state==="blocked"&&k.state==="unblocked"||T.state==="proceeding"&&k.state==="unblocked","Invalid blocker state transition: "+T.state+" -> "+k.state);let H=new Map(j.blockers);H.set(f,k),dt({blockers:H})}function Ma(f){let{currentLocation:k,nextLocation:T,historyAction:H}=f;if(Pe.size===0)return;Pe.size>1&&ra(!1,"A router only supports one blocker at a time");let Y=Array.from(Pe.entries()),[re,me]=Y[Y.length-1],ee=j.blockers.get(re);if(!(ee&&ee.state==="proceeding")&&me({currentLocation:k,nextLocation:T,historyAction:H}))return re}function ro(f){let k=Dt(404,{pathname:f}),T=y||g,{matches:H,route:Y}=Vc(T);return lo(),{notFoundMatches:H,route:Y,error:k}}function lo(f){let k=[];return ue.forEach((T,H)=>{(!f||f(H))&&(T.cancel(),k.push(H),ue.delete(H))}),k}function ms(f,k,T){if(B=f,_=k,U=T||null,!le&&j.navigation===Rl){le=!0;let H=vi(j.location,j.matches);H!=null&&dt({restoreScrollPosition:H})}return()=>{B=null,_=null,U=null}}function Si(f,k){return U&&U(f,k.map(H=>Qh(H,j.loaderData)))||f.key}function ys(f,k){if(B&&_){let T=Si(f,k);B[T]=_()}}function vi(f,k){if(B){let T=Si(f,k),H=B[T];if(typeof H=="number")return H}return null}function ua(f,k,T){if(w)if(f){if(Object.keys(f[0].params).length>0)return{active:!0,matches:Rn(k,T,h,!0)}}else return{active:!0,matches:Rn(k,T,h,!0)||[]};return{active:!1,matches:null}}async function No(f,k,T,H){if(!w)return{type:"success",matches:f};let Y=f;for(;;){let re=y==null,me=y||g,ee=p;try{await w({signal:T,path:k,matches:Y,fetcherKey:H,patch:(J,ve)=>{T.aborted||Oc(J,ve,me,ee,u)}})}catch(J){return{type:"error",error:J,partialMatches:Y}}finally{re&&!T.aborted&&(g=[...g])}if(T.aborted)return{type:"aborted"};let ie=Aa(me,k,h);if(ie)return{type:"success",matches:ie};let Q=Rn(me,k,h,!0);if(!Q||Y.length===Q.length&&Y.every((J,ve)=>J.route.id===Q[ve].route.id))return{type:"success",matches:null};Y=Q}}function fs(f){p={},y=Dn(f,u,void 0,p)}function ca(f,k){let T=y==null;Oc(f,k,y||g,p,u),T&&(g=[...g],dt({}))}return De={get basename(){return h},get future(){return P},get state(){return j},get routes(){return g},get window(){return n},initialize:Le,subscribe:yo,enableScrollRestoration:ms,navigate:La,fetch:zo,revalidate:cs,createHref:f=>i.history.createHref(f),encodeLocation:f=>i.history.encodeLocation(f),getFetcher:Ho,deleteFetcher:_n,dispose:gt,getBlocker:fi,deleteBlocker:Ha,patchRoutes:ca,_internalFetchControllers:O,_internalActiveDeferreds:ue,_internalSetRoutes:fs},De}function km(i){return i!=null&&("formData"in i&&i.formData!=null||"body"in i&&i.body!==void 0)}function Ul(i,n,r,d,u,p,g,y){let h,v;if(g){h=[];for(let P of n)if(h.push(P),P.route.id===g){v=P;break}}else h=n,v=n[n.length-1];let w=Un(u||".",zn(h,p),jo(i.pathname,r)||i.pathname,y==="path");if(u==null&&(w.search=i.search,w.hash=i.hash),(u==null||u===""||u===".")&&v){let P=Yl(w.search);if(v.route.index&&!P)w.search=w.search?w.search.replace(/^\?/,"?index&"):"?index";else if(!v.route.index&&P){let D=new URLSearchParams(w.search),L=D.getAll("index");D.delete("index"),L.filter(U=>U).forEach(U=>D.append("index",U));let B=D.toString();w.search=B?"?"+B:""}}return d&&r!=="/"&&(w.pathname=w.pathname==="/"?r:Do([r,w.pathname])),Ta(w)}function Hc(i,n,r,d){if(!d||!km(d))return{path:r};if(d.formMethod&&!Hm(d.formMethod))return{path:r,error:Dt(405,{method:d.formMethod})};let u=()=>({path:r,error:Dt(400,{type:"invalid-body"})}),p=d.formMethod||"get",g=i?p.toUpperCase():p.toLowerCase(),y=xp(r);if(d.body!==void 0){if(d.formEncType==="text/plain"){if(!ao(g))return u();let D=typeof d.body=="string"?d.body:d.body instanceof FormData||d.body instanceof URLSearchParams?Array.from(d.body.entries()).reduce((L,B)=>{let[U,_]=B;return""+L+U+"="+_+`
51
+ `},""):String(d.body);return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:void 0,text:D}}}else if(d.formEncType==="application/json"){if(!ao(g))return u();try{let D=typeof d.body=="string"?JSON.parse(d.body):d.body;return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:D,text:void 0}}}catch{return u()}}}we(typeof FormData=="function","FormData is not available in this environment");let h,v;if(d.formData)h=Ml(d.formData),v=d.formData;else if(d.body instanceof FormData)h=Ml(d.body),v=d.body;else if(d.body instanceof URLSearchParams)h=d.body,v=Bc(h);else if(d.body==null)h=new URLSearchParams,v=new FormData;else try{h=new URLSearchParams(d.body),v=Bc(h)}catch{return u()}let w={formMethod:g,formAction:y,formEncType:d&&d.formEncType||"application/x-www-form-urlencoded",formData:v,json:void 0,text:void 0};if(ao(w.formMethod))return{path:r,submission:w};let P=Eo(r);return n&&P.search&&Yl(P.search)&&h.append("index",""),P.search="?"+h,{path:Ta(P),submission:w}}function Mc(i,n,r){r===void 0&&(r=!1);let d=i.findIndex(u=>u.route.id===n);return d>=0?i.slice(0,r?d+1:d):i}function Nc(i,n,r,d,u,p,g,y,h,v,w,P,D,L,B,U){let _=U?Ht(U[1])?U[1].error:U[1].data:void 0,le=i.createURL(n.location),W=i.createURL(u),oe=r;p&&n.errors?oe=Mc(r,Object.keys(n.errors)[0],!0):U&&Ht(U[1])&&(oe=Mc(r,U[0]));let V=U?U[1].statusCode:void 0,pe=g&&V&&V>=400,De=oe.filter((X,Se)=>{let{route:ce}=X;if(ce.lazy)return!0;if(ce.loader==null)return!1;if(p)return Hl(ce,n.loaderData,n.errors);if(xm(n.loaderData,n.matches[Se],X)||h.some(ke=>ke===X.route.id))return!0;let Te=n.matches[Se],Ce=X;return _c(X,Xe({currentUrl:le,currentParams:Te.params,nextUrl:W,nextParams:Ce.params},d,{actionResult:_,actionStatus:V,defaultShouldRevalidate:pe?!1:y||le.pathname+le.search===W.pathname+W.search||le.search!==W.search||Cp(Te,Ce)}))}),j=[];return P.forEach((X,Se)=>{if(p||!r.some(Me=>Me.route.id===X.routeId)||w.has(Se))return;let ce=Aa(L,X.path,B);if(!ce){j.push({key:Se,routeId:X.routeId,path:X.path,matches:null,match:null,controller:null});return}let Te=n.fetchers.get(Se),Ce=ss(ce,X.path),ke=!1;D.has(Se)?ke=!1:v.has(Se)?(v.delete(Se),ke=!0):Te&&Te.state!=="idle"&&Te.data===void 0?ke=y:ke=_c(Ce,Xe({currentUrl:le,currentParams:n.matches[n.matches.length-1].params,nextUrl:W,nextParams:r[r.length-1].params},d,{actionResult:_,actionStatus:V,defaultShouldRevalidate:pe?!1:y})),ke&&j.push({key:Se,routeId:X.routeId,path:X.path,matches:ce,match:Ce,controller:new AbortController})}),[De,j]}function Hl(i,n,r){if(i.lazy)return!0;if(!i.loader)return!1;let d=n!=null&&n[i.id]!==void 0,u=r!=null&&r[i.id]!==void 0;return!d&&u?!1:typeof i.loader=="function"&&i.loader.hydrate===!0?!0:!d&&!u}function xm(i,n,r){let d=!n||r.route.id!==n.route.id,u=i[r.route.id]===void 0;return d||u}function Cp(i,n){let r=i.route.path;return i.pathname!==n.pathname||r!=null&&r.endsWith("*")&&i.params["*"]!==n.params["*"]}function _c(i,n){if(i.route.shouldRevalidate){let r=i.route.shouldRevalidate(n);if(typeof r=="boolean")return r}return n.defaultShouldRevalidate}function Oc(i,n,r,d,u){var p;let g;if(i){let v=d[i];we(v,"No route found to patch children into: routeId = "+i),v.children||(v.children=[]),g=v.children}else g=r;let y=n.filter(v=>!g.some(w=>kp(v,w))),h=Dn(y,u,[i||"_","patch",String(((p=g)==null?void 0:p.length)||"0")],d);g.push(...h)}function kp(i,n){return"id"in i&&"id"in n&&i.id===n.id?!0:i.index===n.index&&i.path===n.path&&i.caseSensitive===n.caseSensitive?(!i.children||i.children.length===0)&&(!n.children||n.children.length===0)?!0:i.children.every((r,d)=>{var u;return(u=n.children)==null?void 0:u.some(p=>kp(r,p))}):!1}async function Rm(i,n,r){if(!i.lazy)return;let d=await i.lazy();if(!i.lazy)return;let u=r[i.id];we(u,"No route found in manifest");let p={};for(let g in d){let h=u[g]!==void 0&&g!=="hasErrorBoundary";ra(!h,'Route "'+u.id+'" has a static property "'+g+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+g+'" will be ignored.')),!h&&!$h.has(g)&&(p[g]=d[g])}Object.assign(u,p),Object.assign(u,Xe({},n(u),{lazy:void 0}))}async function Am(i){let{matches:n}=i,r=n.filter(u=>u.shouldLoad);return(await Promise.all(r.map(u=>u.resolve()))).reduce((u,p,g)=>Object.assign(u,{[r[g].route.id]:p}),{})}async function Im(i,n,r,d,u,p,g,y,h,v){let w=p.map(L=>L.route.lazy?Rm(L.route,h,y):void 0),P=p.map((L,B)=>{let U=w[B],_=u.some(W=>W.route.id===L.route.id);return Xe({},L,{shouldLoad:_,resolve:async W=>(W&&d.method==="GET"&&(L.route.lazy||L.route.loader)&&(_=!0),_?Dm(n,d,L,U,W,v):Promise.resolve({type:qe.data,result:void 0}))})}),D=await i({matches:P,request:d,params:p[0].params,fetcherKey:g,context:v});try{await Promise.all(w)}catch{}return D}async function Dm(i,n,r,d,u,p){let g,y,h=v=>{let w,P=new Promise((B,U)=>w=U);y=()=>w(),n.signal.addEventListener("abort",y);let D=B=>typeof v!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+i+'" [routeId: '+r.route.id+"]"))):v({request:n,params:r.params,context:p},...B!==void 0?[B]:[]),L=(async()=>{try{return{type:"data",result:await(u?u(U=>D(U)):D())}}catch(B){return{type:"error",result:B}}})();return Promise.race([L,P])};try{let v=r.route[i];if(d)if(v){let w,[P]=await Promise.all([h(v).catch(D=>{w=D}),d]);if(w!==void 0)throw w;g=P}else if(await d,v=r.route[i],v)g=await h(v);else if(i==="action"){let w=new URL(n.url),P=w.pathname+w.search;throw Dt(405,{method:n.method,pathname:P,routeId:r.route.id})}else return{type:qe.data,result:void 0};else if(v)g=await h(v);else{let w=new URL(n.url),P=w.pathname+w.search;throw Dt(404,{pathname:P})}we(g.result!==void 0,"You defined "+(i==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+i+"` ")+"function. Please return a value or `null`.")}catch(v){return{type:qe.error,result:v}}finally{y&&n.signal.removeEventListener("abort",y)}return g}async function jm(i){let{result:n,type:r}=i;if(Rp(n)){let P;try{let D=n.headers.get("Content-Type");D&&/\bapplication\/json\b/.test(D)?n.body==null?P=null:P=await n.json():P=await n.text()}catch(D){return{type:qe.error,error:D}}return r===qe.error?{type:qe.error,error:new En(n.status,n.statusText,P),statusCode:n.status,headers:n.headers}:{type:qe.data,data:P,statusCode:n.status,headers:n.headers}}if(r===qe.error){if(Yc(n)){var d,u;if(n.data instanceof Error){var p,g;return{type:qe.error,error:n.data,statusCode:(p=n.init)==null?void 0:p.status,headers:(g=n.init)!=null&&g.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:new En(((d=n.init)==null?void 0:d.status)||500,void 0,n.data),statusCode:rs(n)?n.status:void 0,headers:(u=n.init)!=null&&u.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:n,statusCode:rs(n)?n.status:void 0}}if(Um(n)){var y,h;return{type:qe.deferred,deferredData:n,statusCode:(y=n.init)==null?void 0:y.status,headers:((h=n.init)==null?void 0:h.headers)&&new Headers(n.init.headers)}}if(Yc(n)){var v,w;return{type:qe.data,data:n.data,statusCode:(v=n.init)==null?void 0:v.status,headers:(w=n.init)!=null&&w.headers?new Headers(n.init.headers):void 0}}return{type:qe.data,data:n}}function Em(i,n,r,d,u,p){let g=i.headers.get("Location");if(we(g,"Redirects returned/thrown from loaders/actions must have a Location header"),!Kl.test(g)){let y=d.slice(0,d.findIndex(h=>h.route.id===r)+1);g=Ul(new URL(n.url),y,u,!0,g,p),i.headers.set("Location",g)}return i}function qc(i,n,r,d){let u=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(Kl.test(i)){let p=i,g=p.startsWith("//")?new URL(n.protocol+p):new URL(p);if(u.includes(g.protocol))throw new Error("Invalid redirect location");let y=jo(g.pathname,r)!=null;if(g.origin===n.origin&&y)return g.pathname+g.search+g.hash}try{let p=d.createURL(i);if(u.includes(p.protocol))throw new Error("Invalid redirect location")}catch{}return i}function ri(i,n,r,d){let u=i.createURL(xp(n)).toString(),p={signal:r};if(d&&ao(d.formMethod)){let{formMethod:g,formEncType:y}=d;p.method=g.toUpperCase(),y==="application/json"?(p.headers=new Headers({"Content-Type":y}),p.body=JSON.stringify(d.json)):y==="text/plain"?p.body=d.text:y==="application/x-www-form-urlencoded"&&d.formData?p.body=Ml(d.formData):p.body=d.formData}return new Request(u,p)}function Ml(i){let n=new URLSearchParams;for(let[r,d]of i.entries())n.append(r,typeof d=="string"?d:d.name);return n}function Bc(i){let n=new FormData;for(let[r,d]of i.entries())n.append(r,d);return n}function Tm(i,n,r,d,u){let p={},g=null,y,h=!1,v={},w=r&&Ht(r[1])?r[1].error:void 0;return i.forEach(P=>{if(!(P.route.id in n))return;let D=P.route.id,L=n[D];if(we(!Da(L),"Cannot handle redirect results in processLoaderData"),Ht(L)){let B=L.error;w!==void 0&&(B=w,w=void 0),g=g||{};{let U=Ia(i,D);g[U.route.id]==null&&(g[U.route.id]=B)}p[D]=void 0,h||(h=!0,y=rs(L.error)?L.error.status:500),L.headers&&(v[D]=L.headers)}else na(L)?(d.set(D,L.deferredData),p[D]=L.deferredData.data,L.statusCode!=null&&L.statusCode!==200&&!h&&(y=L.statusCode),L.headers&&(v[D]=L.headers)):(p[D]=L.data,L.statusCode&&L.statusCode!==200&&!h&&(y=L.statusCode),L.headers&&(v[D]=L.headers))}),w!==void 0&&r&&(g={[r[0]]:w},p[r[0]]=void 0),{loaderData:p,errors:g,statusCode:y||200,loaderHeaders:v}}function Wc(i,n,r,d,u,p,g){let{loaderData:y,errors:h}=Tm(n,r,d,g);return u.forEach(v=>{let{key:w,match:P,controller:D}=v,L=p[w];if(we(L,"Did not find corresponding fetcher result"),!(D&&D.signal.aborted))if(Ht(L)){let B=Ia(i.matches,P==null?void 0:P.route.id);h&&h[B.route.id]||(h=Xe({},h,{[B.route.id]:L.error})),i.fetchers.delete(w)}else if(Da(L))we(!1,"Unhandled fetcher revalidation redirect");else if(na(L))we(!1,"Unhandled fetcher deferred data");else{let B=sa(L.data);i.fetchers.set(w,B)}}),{loaderData:y,errors:h}}function Fc(i,n,r,d){let u=Xe({},n);for(let p of r){let g=p.route.id;if(n.hasOwnProperty(g)?n[g]!==void 0&&(u[g]=n[g]):i[g]!==void 0&&p.route.loader&&(u[g]=i[g]),d&&d.hasOwnProperty(g))break}return u}function Kc(i){return i?Ht(i[1])?{actionData:{}}:{actionData:{[i[0]]:i[1].data}}:{}}function Ia(i,n){return(n?i.slice(0,i.findIndex(d=>d.route.id===n)+1):[...i]).reverse().find(d=>d.route.hasErrorBoundary===!0)||i[0]}function Vc(i){let n=i.length===1?i[0]:i.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:n}],route:n}}function Dt(i,n){let{pathname:r,routeId:d,method:u,type:p,message:g}=n===void 0?{}:n,y="Unknown Server Error",h="Unknown @remix-run/router error";return i===400?(y="Bad Request",u&&r&&d?h="You made a "+u+' request to "'+r+'" but '+('did not provide a `loader` for route "'+d+'", ')+"so there is no way to handle the request.":p==="defer-action"?h="defer() is not supported in actions":p==="invalid-body"&&(h="Unable to encode submission body")):i===403?(y="Forbidden",h='Route "'+d+'" does not match URL "'+r+'"'):i===404?(y="Not Found",h='No route matches URL "'+r+'"'):i===405&&(y="Method Not Allowed",u&&r&&d?h="You made a "+u.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+d+'", ')+"so there is no way to handle the request.":u&&(h='Invalid request method "'+u.toUpperCase()+'"')),new En(i||500,y,new Error(h),!0)}function kn(i){let n=Object.entries(i);for(let r=n.length-1;r>=0;r--){let[d,u]=n[r];if(Da(u))return{key:d,result:u}}}function xp(i){let n=typeof i=="string"?Eo(i):i;return Ta(Xe({},n,{hash:""}))}function Lm(i,n){return i.pathname!==n.pathname||i.search!==n.search?!1:i.hash===""?n.hash!=="":i.hash===n.hash?!0:n.hash!==""}function zm(i){return Rp(i.result)&&vm.has(i.result.status)}function na(i){return i.type===qe.deferred}function Ht(i){return i.type===qe.error}function Da(i){return(i&&i.type)===qe.redirect}function Yc(i){return typeof i=="object"&&i!=null&&"type"in i&&"data"in i&&"init"in i&&i.type==="DataWithResponseInit"}function Um(i){let n=i;return n&&typeof n=="object"&&typeof n.data=="object"&&typeof n.subscribe=="function"&&typeof n.cancel=="function"&&typeof n.resolveData=="function"}function Rp(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.headers=="object"&&typeof i.body<"u"}function Hm(i){return Sm.has(i.toLowerCase())}function ao(i){return ym.has(i.toLowerCase())}async function Mm(i,n,r,d,u){let p=Object.entries(n);for(let g=0;g<p.length;g++){let[y,h]=p[g],v=i.find(D=>(D==null?void 0:D.route.id)===y);if(!v)continue;let w=d.find(D=>D.route.id===v.route.id),P=w!=null&&!Cp(w,v)&&(u&&u[v.route.id])!==void 0;na(h)&&P&&await Vl(h,r,!1).then(D=>{D&&(n[y]=D)})}}async function Nm(i,n,r){for(let d=0;d<r.length;d++){let{key:u,routeId:p,controller:g}=r[d],y=n[u];i.find(v=>(v==null?void 0:v.route.id)===p)&&na(y)&&(we(g,"Expected an AbortController for revalidating fetcher deferred result"),await Vl(y,g.signal,!0).then(v=>{v&&(n[u]=v)}))}}async function Vl(i,n,r){if(r===void 0&&(r=!1),!await i.deferredData.resolveData(n)){if(r)try{return{type:qe.data,data:i.deferredData.unwrappedData}}catch(u){return{type:qe.error,error:u}}return{type:qe.data,data:i.deferredData.data}}}function Yl(i){return new URLSearchParams(i).getAll("index").some(n=>n==="")}function ss(i,n){let r=typeof n=="string"?Eo(n).search:n.search;if(i[i.length-1].route.index&&Yl(r||""))return i[i.length-1];let d=bp(i);return d[d.length-1]}function Gc(i){let{formMethod:n,formAction:r,formEncType:d,text:u,formData:p,json:g}=i;if(!(!n||!r||!d)){if(u!=null)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:void 0,text:u};if(p!=null)return{formMethod:n,formAction:r,formEncType:d,formData:p,json:void 0,text:void 0};if(g!==void 0)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:g,text:void 0}}}function Al(i,n){return n?{state:"loading",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}:{state:"loading",location:i,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function _m(i,n){return{state:"submitting",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}}function os(i,n){return i?{state:"loading",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:n}}function Om(i,n){return{state:"submitting",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n?n.data:void 0}}function sa(i){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:i}}function qm(i,n){try{let r=i.sessionStorage.getItem(wp);if(r){let d=JSON.parse(r);for(let[u,p]of Object.entries(d||{}))p&&Array.isArray(p)&&n.set(u,new Set(p||[]))}}catch{}}function Bm(i,n){if(n.size>0){let r={};for(let[d,u]of n)r[d]=[...u];try{i.sessionStorage.setItem(wp,JSON.stringify(r))}catch(d){ra(!1,"Failed to save applied view transitions in sessionStorage ("+d+").")}}}/**
52
52
  * React Router v6.30.3
53
53
  *
54
54
  * Copyright (c) Remix Software Inc.
@@ -57,7 +57,7 @@ Error generating stack: `+l.message+`
57
57
  * LICENSE.md file in the root directory of this source tree.
58
58
  *
59
59
  * @license MIT
60
- */function Tn(){return Tn=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},Tn.apply(this,arguments)}const ls=R.createContext(null),Gl=R.createContext(null),To=R.createContext(null),Xl=R.createContext(null),mo=R.createContext({outlet:null,matches:[],isDataRoute:!1}),Ap=R.createContext(null);function Wm(i,n){let{relative:r}=n===void 0?{}:n;pi()||Ce(!1);let{basename:d,navigator:u}=R.useContext(To),{hash:p,pathname:g,search:y}=Mn(i,{relative:r}),h=g;return d!=="/"&&(h=g==="/"?d:Do([d,g])),u.createHref({pathname:h,search:y,hash:p})}function pi(){return R.useContext(Xl)!=null}function Vt(){return pi()||Ce(!1),R.useContext(Xl).location}function Ip(i){R.useContext(To).static||R.useLayoutEffect(i)}function $l(){let{isDataRoute:i}=R.useContext(mo);return i?ay():Fm()}function Fm(){pi()||Ce(!1);let i=R.useContext(ls),{basename:n,future:r,navigator:d}=R.useContext(To),{matches:u}=R.useContext(mo),{pathname:p}=Vt(),g=JSON.stringify(zn(u,r.v7_relativeSplatPath)),y=R.useRef(!1);return Ip(()=>{y.current=!0}),R.useCallback(function(v,C){if(C===void 0&&(C={}),!y.current)return;if(typeof v=="number"){d.go(v);return}let P=Un(v,JSON.parse(g),p,C.relative==="path");i==null&&n!=="/"&&(P.pathname=P.pathname==="/"?n:Do([n,P.pathname])),(C.replace?d.replace:d.push)(P,C.state,C)},[n,d,g,p,i])}const Km=R.createContext(null);function Vm(i){let n=R.useContext(mo).outlet;return n&&R.createElement(Km.Provider,{value:i},n)}function Eb(){let{matches:i}=R.useContext(mo),n=i[i.length-1];return n?n.params:{}}function Mn(i,n){let{relative:r}=n===void 0?{}:n,{future:d}=R.useContext(To),{matches:u}=R.useContext(mo),{pathname:p}=Vt(),g=JSON.stringify(zn(u,d.v7_relativeSplatPath));return R.useMemo(()=>Un(i,JSON.parse(g),p,r==="path"),[i,g,p,r])}function Ym(i,n,r,d){pi()||Ce(!1);let{navigator:u}=R.useContext(To),{matches:p}=R.useContext(mo),g=p[p.length-1],y=g?g.params:{};g&&g.pathname;let h=g?g.pathnameBase:"/";g&&g.route;let v=Vt(),C;C=v;let P=C.pathname||"/",D=P;if(h!=="/"){let U=h.replace(/^\//,"").split("/");D="/"+P.replace(/^\//,"").split("/").slice(U.length).join("/")}let L=Aa(i,{pathname:D});return Zm(L&&L.map(U=>Object.assign({},U,{params:Object.assign({},y,U.params),pathname:Do([h,u.encodeLocation?u.encodeLocation(U.pathname).pathname:U.pathname]),pathnameBase:U.pathnameBase==="/"?h:Do([h,u.encodeLocation?u.encodeLocation(U.pathnameBase).pathname:U.pathnameBase])})),p,r,d)}function Gm(){let i=oy(),n=rs(i)?i.status+" "+i.statusText:i instanceof Error?i.message:JSON.stringify(i),r=i instanceof Error?i.stack:null,u={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return R.createElement(R.Fragment,null,R.createElement("h2",null,"Unexpected Application Error!"),R.createElement("h3",{style:{fontStyle:"italic"}},n),r?R.createElement("pre",{style:u},r):null,null)}const Xm=R.createElement(Gm,null);class $m extends R.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,r){return r.location!==n.location||r.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:r.error,location:r.location,revalidation:n.revalidation||r.revalidation}}componentDidCatch(n,r){console.error("React Router caught the following error during render",n,r)}render(){return this.state.error!==void 0?R.createElement(mo.Provider,{value:this.props.routeContext},R.createElement(Ap.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Qm(i){let{routeContext:n,match:r,children:d}=i,u=R.useContext(ls);return u&&u.static&&u.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(u.staticContext._deepestRenderedBoundaryId=r.route.id),R.createElement(mo.Provider,{value:n},d)}function Zm(i,n,r,d){var u;if(n===void 0&&(n=[]),r===void 0&&(r=null),d===void 0&&(d=null),i==null){var p;if(!r)return null;if(r.errors)i=r.matches;else if((p=d)!=null&&p.v7_partialHydration&&n.length===0&&!r.initialized&&r.matches.length>0)i=r.matches;else return null}let g=i,y=(u=r)==null?void 0:u.errors;if(y!=null){let C=g.findIndex(P=>P.route.id&&(y==null?void 0:y[P.route.id])!==void 0);C>=0||Ce(!1),g=g.slice(0,Math.min(g.length,C+1))}let h=!1,v=-1;if(r&&d&&d.v7_partialHydration)for(let C=0;C<g.length;C++){let P=g[C];if((P.route.HydrateFallback||P.route.hydrateFallbackElement)&&(v=C),P.route.id){let{loaderData:D,errors:L}=r,B=P.route.loader&&D[P.route.id]===void 0&&(!L||L[P.route.id]===void 0);if(P.route.lazy||B){h=!0,v>=0?g=g.slice(0,v+1):g=[g[0]];break}}}return g.reduceRight((C,P,D)=>{let L,B=!1,U=null,N=null;r&&(L=y&&P.route.id?y[P.route.id]:void 0,U=P.route.errorElement||Xm,h&&(v<0&&D===0?(iy("route-fallback"),B=!0,N=null):v===D&&(B=!0,N=P.route.hydrateFallbackElement||null)));let le=n.concat(g.slice(0,D+1)),W=()=>{let oe;return L?oe=U:B?oe=N:P.route.Component?oe=R.createElement(P.route.Component,null):P.route.element?oe=P.route.element:oe=C,R.createElement(Qm,{match:P,routeContext:{outlet:C,matches:le,isDataRoute:r!=null},children:oe})};return r&&(P.route.ErrorBoundary||P.route.errorElement||D===0)?R.createElement($m,{location:r.location,revalidation:r.revalidation,component:U,error:L,children:W(),routeContext:{outlet:null,matches:le,isDataRoute:!0}}):W()},null)}var Dp=(function(i){return i.UseBlocker="useBlocker",i.UseRevalidator="useRevalidator",i.UseNavigateStable="useNavigate",i})(Dp||{}),jp=(function(i){return i.UseBlocker="useBlocker",i.UseLoaderData="useLoaderData",i.UseActionData="useActionData",i.UseRouteError="useRouteError",i.UseNavigation="useNavigation",i.UseRouteLoaderData="useRouteLoaderData",i.UseMatches="useMatches",i.UseRevalidator="useRevalidator",i.UseNavigateStable="useNavigate",i.UseRouteId="useRouteId",i})(jp||{});function Jm(i){let n=R.useContext(ls);return n||Ce(!1),n}function ey(i){let n=R.useContext(Gl);return n||Ce(!1),n}function ty(i){let n=R.useContext(mo);return n||Ce(!1),n}function Ep(i){let n=ty(),r=n.matches[n.matches.length-1];return r.route.id||Ce(!1),r.route.id}function oy(){var i;let n=R.useContext(Ap),r=ey(),d=Ep();return n!==void 0?n:(i=r.errors)==null?void 0:i[d]}function ay(){let{router:i}=Jm(Dp.UseNavigateStable),n=Ep(jp.UseNavigateStable),r=R.useRef(!1);return Ip(()=>{r.current=!0}),R.useCallback(function(u,p){p===void 0&&(p={}),r.current&&(typeof u=="number"?i.navigate(u):i.navigate(u,Tn({fromRouteId:n},p)))},[i,n])}const Xc={};function iy(i,n,r){Xc[i]||(Xc[i]=!0)}function sy(i,n){i==null||i.v7_startTransition,(i==null?void 0:i.v7_relativeSplatPath)===void 0&&(!n||n.v7_relativeSplatPath),n&&(n.v7_fetcherPersist,n.v7_normalizeFormMethod,n.v7_partialHydration,n.v7_skipActionErrorRevalidation)}function Tb(i){let{to:n,replace:r,state:d,relative:u}=i;pi()||Ce(!1);let{future:p,static:g}=R.useContext(To),{matches:y}=R.useContext(mo),{pathname:h}=Vt(),v=$l(),C=Un(n,zn(y,p.v7_relativeSplatPath),h,u==="path"),P=JSON.stringify(C);return R.useEffect(()=>v(JSON.parse(P),{replace:r,state:d,relative:u}),[v,P,u,r,d]),null}function ny(i){return Vm(i.context)}function ry(i){let{basename:n="/",children:r=null,location:d,navigationType:u=st.Pop,navigator:p,static:g=!1,future:y}=i;pi()&&Ce(!1);let h=n.replace(/^\/*/,"/"),v=R.useMemo(()=>({basename:h,navigator:p,static:g,future:Tn({v7_relativeSplatPath:!1},y)}),[h,y,p,g]);typeof d=="string"&&(d=Eo(d));let{pathname:C="/",search:P="",hash:D="",state:L=null,key:B="default"}=d,U=R.useMemo(()=>{let N=jo(C,h);return N==null?null:{location:{pathname:N,search:P,hash:D,state:L,key:B},navigationType:u}},[h,C,P,D,L,B,u]);return U==null?null:R.createElement(To.Provider,{value:v},R.createElement(Xl.Provider,{children:r,value:U}))}new Promise(()=>{});function ly(i){let n={hasErrorBoundary:i.ErrorBoundary!=null||i.errorElement!=null};return i.Component&&Object.assign(n,{element:R.createElement(i.Component),Component:void 0}),i.HydrateFallback&&Object.assign(n,{hydrateFallbackElement:R.createElement(i.HydrateFallback),HydrateFallback:void 0}),i.ErrorBoundary&&Object.assign(n,{errorElement:R.createElement(i.ErrorBoundary),ErrorBoundary:void 0}),n}/**
60
+ */function Tn(){return Tn=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},Tn.apply(this,arguments)}const ls=R.createContext(null),Gl=R.createContext(null),To=R.createContext(null),$l=R.createContext(null),mo=R.createContext({outlet:null,matches:[],isDataRoute:!1}),Ap=R.createContext(null);function Wm(i,n){let{relative:r}=n===void 0?{}:n;pi()||we(!1);let{basename:d,navigator:u}=R.useContext(To),{hash:p,pathname:g,search:y}=Hn(i,{relative:r}),h=g;return d!=="/"&&(h=g==="/"?d:Do([d,g])),u.createHref({pathname:h,search:y,hash:p})}function pi(){return R.useContext($l)!=null}function Vt(){return pi()||we(!1),R.useContext($l).location}function Ip(i){R.useContext(To).static||R.useLayoutEffect(i)}function Xl(){let{isDataRoute:i}=R.useContext(mo);return i?ay():Fm()}function Fm(){pi()||we(!1);let i=R.useContext(ls),{basename:n,future:r,navigator:d}=R.useContext(To),{matches:u}=R.useContext(mo),{pathname:p}=Vt(),g=JSON.stringify(zn(u,r.v7_relativeSplatPath)),y=R.useRef(!1);return Ip(()=>{y.current=!0}),R.useCallback(function(v,w){if(w===void 0&&(w={}),!y.current)return;if(typeof v=="number"){d.go(v);return}let P=Un(v,JSON.parse(g),p,w.relative==="path");i==null&&n!=="/"&&(P.pathname=P.pathname==="/"?n:Do([n,P.pathname])),(w.replace?d.replace:d.push)(P,w.state,w)},[n,d,g,p,i])}const Km=R.createContext(null);function Vm(i){let n=R.useContext(mo).outlet;return n&&R.createElement(Km.Provider,{value:i},n)}function Eb(){let{matches:i}=R.useContext(mo),n=i[i.length-1];return n?n.params:{}}function Hn(i,n){let{relative:r}=n===void 0?{}:n,{future:d}=R.useContext(To),{matches:u}=R.useContext(mo),{pathname:p}=Vt(),g=JSON.stringify(zn(u,d.v7_relativeSplatPath));return R.useMemo(()=>Un(i,JSON.parse(g),p,r==="path"),[i,g,p,r])}function Ym(i,n,r,d){pi()||we(!1);let{navigator:u}=R.useContext(To),{matches:p}=R.useContext(mo),g=p[p.length-1],y=g?g.params:{};g&&g.pathname;let h=g?g.pathnameBase:"/";g&&g.route;let v=Vt(),w;w=v;let P=w.pathname||"/",D=P;if(h!=="/"){let U=h.replace(/^\//,"").split("/");D="/"+P.replace(/^\//,"").split("/").slice(U.length).join("/")}let L=Aa(i,{pathname:D});return Zm(L&&L.map(U=>Object.assign({},U,{params:Object.assign({},y,U.params),pathname:Do([h,u.encodeLocation?u.encodeLocation(U.pathname).pathname:U.pathname]),pathnameBase:U.pathnameBase==="/"?h:Do([h,u.encodeLocation?u.encodeLocation(U.pathnameBase).pathname:U.pathnameBase])})),p,r,d)}function Gm(){let i=oy(),n=rs(i)?i.status+" "+i.statusText:i instanceof Error?i.message:JSON.stringify(i),r=i instanceof Error?i.stack:null,u={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return R.createElement(R.Fragment,null,R.createElement("h2",null,"Unexpected Application Error!"),R.createElement("h3",{style:{fontStyle:"italic"}},n),r?R.createElement("pre",{style:u},r):null,null)}const $m=R.createElement(Gm,null);class Xm extends R.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,r){return r.location!==n.location||r.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:r.error,location:r.location,revalidation:n.revalidation||r.revalidation}}componentDidCatch(n,r){console.error("React Router caught the following error during render",n,r)}render(){return this.state.error!==void 0?R.createElement(mo.Provider,{value:this.props.routeContext},R.createElement(Ap.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Qm(i){let{routeContext:n,match:r,children:d}=i,u=R.useContext(ls);return u&&u.static&&u.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(u.staticContext._deepestRenderedBoundaryId=r.route.id),R.createElement(mo.Provider,{value:n},d)}function Zm(i,n,r,d){var u;if(n===void 0&&(n=[]),r===void 0&&(r=null),d===void 0&&(d=null),i==null){var p;if(!r)return null;if(r.errors)i=r.matches;else if((p=d)!=null&&p.v7_partialHydration&&n.length===0&&!r.initialized&&r.matches.length>0)i=r.matches;else return null}let g=i,y=(u=r)==null?void 0:u.errors;if(y!=null){let w=g.findIndex(P=>P.route.id&&(y==null?void 0:y[P.route.id])!==void 0);w>=0||we(!1),g=g.slice(0,Math.min(g.length,w+1))}let h=!1,v=-1;if(r&&d&&d.v7_partialHydration)for(let w=0;w<g.length;w++){let P=g[w];if((P.route.HydrateFallback||P.route.hydrateFallbackElement)&&(v=w),P.route.id){let{loaderData:D,errors:L}=r,B=P.route.loader&&D[P.route.id]===void 0&&(!L||L[P.route.id]===void 0);if(P.route.lazy||B){h=!0,v>=0?g=g.slice(0,v+1):g=[g[0]];break}}}return g.reduceRight((w,P,D)=>{let L,B=!1,U=null,_=null;r&&(L=y&&P.route.id?y[P.route.id]:void 0,U=P.route.errorElement||$m,h&&(v<0&&D===0?(iy("route-fallback"),B=!0,_=null):v===D&&(B=!0,_=P.route.hydrateFallbackElement||null)));let le=n.concat(g.slice(0,D+1)),W=()=>{let oe;return L?oe=U:B?oe=_:P.route.Component?oe=R.createElement(P.route.Component,null):P.route.element?oe=P.route.element:oe=w,R.createElement(Qm,{match:P,routeContext:{outlet:w,matches:le,isDataRoute:r!=null},children:oe})};return r&&(P.route.ErrorBoundary||P.route.errorElement||D===0)?R.createElement(Xm,{location:r.location,revalidation:r.revalidation,component:U,error:L,children:W(),routeContext:{outlet:null,matches:le,isDataRoute:!0}}):W()},null)}var Dp=(function(i){return i.UseBlocker="useBlocker",i.UseRevalidator="useRevalidator",i.UseNavigateStable="useNavigate",i})(Dp||{}),jp=(function(i){return i.UseBlocker="useBlocker",i.UseLoaderData="useLoaderData",i.UseActionData="useActionData",i.UseRouteError="useRouteError",i.UseNavigation="useNavigation",i.UseRouteLoaderData="useRouteLoaderData",i.UseMatches="useMatches",i.UseRevalidator="useRevalidator",i.UseNavigateStable="useNavigate",i.UseRouteId="useRouteId",i})(jp||{});function Jm(i){let n=R.useContext(ls);return n||we(!1),n}function ey(i){let n=R.useContext(Gl);return n||we(!1),n}function ty(i){let n=R.useContext(mo);return n||we(!1),n}function Ep(i){let n=ty(),r=n.matches[n.matches.length-1];return r.route.id||we(!1),r.route.id}function oy(){var i;let n=R.useContext(Ap),r=ey(),d=Ep();return n!==void 0?n:(i=r.errors)==null?void 0:i[d]}function ay(){let{router:i}=Jm(Dp.UseNavigateStable),n=Ep(jp.UseNavigateStable),r=R.useRef(!1);return Ip(()=>{r.current=!0}),R.useCallback(function(u,p){p===void 0&&(p={}),r.current&&(typeof u=="number"?i.navigate(u):i.navigate(u,Tn({fromRouteId:n},p)))},[i,n])}const $c={};function iy(i,n,r){$c[i]||($c[i]=!0)}function sy(i,n){i==null||i.v7_startTransition,(i==null?void 0:i.v7_relativeSplatPath)===void 0&&(!n||n.v7_relativeSplatPath),n&&(n.v7_fetcherPersist,n.v7_normalizeFormMethod,n.v7_partialHydration,n.v7_skipActionErrorRevalidation)}function Tb(i){let{to:n,replace:r,state:d,relative:u}=i;pi()||we(!1);let{future:p,static:g}=R.useContext(To),{matches:y}=R.useContext(mo),{pathname:h}=Vt(),v=Xl(),w=Un(n,zn(y,p.v7_relativeSplatPath),h,u==="path"),P=JSON.stringify(w);return R.useEffect(()=>v(JSON.parse(P),{replace:r,state:d,relative:u}),[v,P,u,r,d]),null}function ny(i){return Vm(i.context)}function ry(i){let{basename:n="/",children:r=null,location:d,navigationType:u=st.Pop,navigator:p,static:g=!1,future:y}=i;pi()&&we(!1);let h=n.replace(/^\/*/,"/"),v=R.useMemo(()=>({basename:h,navigator:p,static:g,future:Tn({v7_relativeSplatPath:!1},y)}),[h,y,p,g]);typeof d=="string"&&(d=Eo(d));let{pathname:w="/",search:P="",hash:D="",state:L=null,key:B="default"}=d,U=R.useMemo(()=>{let _=jo(w,h);return _==null?null:{location:{pathname:_,search:P,hash:D,state:L,key:B},navigationType:u}},[h,w,P,D,L,B,u]);return U==null?null:R.createElement(To.Provider,{value:v},R.createElement($l.Provider,{children:r,value:U}))}new Promise(()=>{});function ly(i){let n={hasErrorBoundary:i.ErrorBoundary!=null||i.errorElement!=null};return i.Component&&Object.assign(n,{element:R.createElement(i.Component),Component:void 0}),i.HydrateFallback&&Object.assign(n,{hydrateFallbackElement:R.createElement(i.HydrateFallback),HydrateFallback:void 0}),i.ErrorBoundary&&Object.assign(n,{errorElement:R.createElement(i.ErrorBoundary),ErrorBoundary:void 0}),n}/**
61
61
  * React Router DOM v6.30.3
62
62
  *
63
63
  * Copyright (c) Remix Software Inc.
@@ -66,7 +66,7 @@ Error generating stack: `+l.message+`
66
66
  * LICENSE.md file in the root directory of this source tree.
67
67
  *
68
68
  * @license MIT
69
- */function ui(){return ui=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},ui.apply(this,arguments)}function Tp(i,n){if(i==null)return{};var r={},d=Object.keys(i),u,p;for(p=0;p<d.length;p++)u=d[p],!(n.indexOf(u)>=0)&&(r[u]=i[u]);return r}function dy(i){return!!(i.metaKey||i.altKey||i.ctrlKey||i.shiftKey)}function uy(i,n){return i.button===0&&(!n||n==="_self")&&!dy(i)}function _l(i){return i===void 0&&(i=""),new URLSearchParams(typeof i=="string"||Array.isArray(i)||i instanceof URLSearchParams?i:Object.keys(i).reduce((n,r)=>{let d=i[r];return n.concat(Array.isArray(d)?d.map(u=>[r,u]):[[r,d]])},[]))}function cy(i,n){let r=_l(i);return n&&n.forEach((d,u)=>{r.has(u)||n.getAll(u).forEach(p=>{r.append(u,p)})}),r}const py=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],gy=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],hy="6";try{window.__reactRouterVersion=hy}catch{}function my(i,n){return wm({basename:void 0,future:ui({},void 0,{v7_prependBasename:!0}),history:Vh({window:void 0}),hydrationData:yy(),routes:i,mapRouteProperties:ly,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function yy(){var i;let n=(i=window)==null?void 0:i.__staticRouterHydrationData;return n&&n.errors&&(n=ui({},n,{errors:fy(n.errors)})),n}function fy(i){if(!i)return null;let n=Object.entries(i),r={};for(let[d,u]of n)if(u&&u.__type==="RouteErrorResponse")r[d]=new En(u.status,u.statusText,u.data,u.internal===!0);else if(u&&u.__type==="Error"){if(u.__subType){let p=window[u.__subType];if(typeof p=="function")try{let g=new p(u.message);g.stack="",r[d]=g}catch{}}if(r[d]==null){let p=new Error(u.message);p.stack="",r[d]=p}}else r[d]=u;return r}const Lp=R.createContext({isTransitioning:!1}),Sy=R.createContext(new Map),vy="startTransition",$c=Wh[vy],by="flushSync",Qc=Kh[by];function Py(i){$c?$c(i):i()}function as(i){Qc?Qc(i):i()}class Cy{constructor(){this.status="pending",this.promise=new Promise((n,r)=>{this.resolve=d=>{this.status==="pending"&&(this.status="resolved",n(d))},this.reject=d=>{this.status==="pending"&&(this.status="rejected",r(d))}})}}function wy(i){let{fallbackElement:n,router:r,future:d}=i,[u,p]=R.useState(r.state),[g,y]=R.useState(),[h,v]=R.useState({isTransitioning:!1}),[C,P]=R.useState(),[D,L]=R.useState(),[B,U]=R.useState(),N=R.useRef(new Map),{v7_startTransition:le}=d||{},W=R.useCallback($=>{le?Py($):$()},[le]),oe=R.useCallback(($,Se)=>{let{deletedFetchers:ce,flushSync:Te,viewTransitionOpts:we}=Se;$.fetchers.forEach((He,et)=>{He.data!==void 0&&N.current.set(et,He.data)}),ce.forEach(He=>N.current.delete(He));let ke=r.window==null||r.window.document==null||typeof r.window.document.startViewTransition!="function";if(!we||ke){Te?as(()=>p($)):W(()=>p($));return}if(Te){as(()=>{D&&(C&&C.resolve(),D.skipTransition()),v({isTransitioning:!0,flushSync:!0,currentLocation:we.currentLocation,nextLocation:we.nextLocation})});let He=r.window.document.startViewTransition(()=>{as(()=>p($))});He.finished.finally(()=>{as(()=>{P(void 0),L(void 0),y(void 0),v({isTransitioning:!1})})}),as(()=>L(He));return}D?(C&&C.resolve(),D.skipTransition(),U({state:$,currentLocation:we.currentLocation,nextLocation:we.nextLocation})):(y($),v({isTransitioning:!0,flushSync:!1,currentLocation:we.currentLocation,nextLocation:we.nextLocation}))},[r.window,D,C,N,W]);R.useLayoutEffect(()=>r.subscribe(oe),[r,oe]),R.useEffect(()=>{h.isTransitioning&&!h.flushSync&&P(new Cy)},[h]),R.useEffect(()=>{if(C&&g&&r.window){let $=g,Se=C.promise,ce=r.window.document.startViewTransition(async()=>{W(()=>p($)),await Se});ce.finished.finally(()=>{P(void 0),L(void 0),y(void 0),v({isTransitioning:!1})}),L(ce)}},[W,g,C,r.window]),R.useEffect(()=>{C&&g&&u.location.key===g.location.key&&C.resolve()},[C,D,u.location,g]),R.useEffect(()=>{!h.isTransitioning&&B&&(y(B.state),v({isTransitioning:!0,flushSync:!1,currentLocation:B.currentLocation,nextLocation:B.nextLocation}),U(void 0))},[h.isTransitioning,B]),R.useEffect(()=>{},[]);let V=R.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:$=>r.navigate($),push:($,Se,ce)=>r.navigate($,{state:Se,preventScrollReset:ce==null?void 0:ce.preventScrollReset}),replace:($,Se,ce)=>r.navigate($,{replace:!0,state:Se,preventScrollReset:ce==null?void 0:ce.preventScrollReset})}),[r]),pe=r.basename||"/",De=R.useMemo(()=>({router:r,navigator:V,static:!1,basename:pe}),[r,V,pe]),j=R.useMemo(()=>({v7_relativeSplatPath:r.future.v7_relativeSplatPath}),[r.future.v7_relativeSplatPath]);return R.useEffect(()=>sy(d,r.future),[d,r.future]),R.createElement(R.Fragment,null,R.createElement(ls.Provider,{value:De},R.createElement(Gl.Provider,{value:u},R.createElement(Sy.Provider,{value:N.current},R.createElement(Lp.Provider,{value:h},R.createElement(ry,{basename:pe,location:u.location,navigationType:u.historyAction,navigator:V,future:j},u.initialized||r.future.v7_partialHydration?R.createElement(ky,{routes:r.routes,future:r.future,state:u}):n))))),null)}const ky=R.memo(xy);function xy(i){let{routes:n,future:r,state:d}=i;return Ym(n,void 0,d,r)}const Ry=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Ay=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,ja=R.forwardRef(function(n,r){let{onClick:d,relative:u,reloadDocument:p,replace:g,state:y,target:h,to:v,preventScrollReset:C,viewTransition:P}=n,D=Tp(n,py),{basename:L}=R.useContext(To),B,U=!1;if(typeof v=="string"&&Ay.test(v)&&(B=v,Ry))try{let oe=new URL(window.location.href),V=v.startsWith("//")?new URL(oe.protocol+v):new URL(v),pe=jo(V.pathname,L);V.origin===oe.origin&&pe!=null?v=pe+V.search+V.hash:U=!0}catch{}let N=Wm(v,{relative:u}),le=jy(v,{replace:g,state:y,target:h,preventScrollReset:C,relative:u,viewTransition:P});function W(oe){d&&d(oe),oe.defaultPrevented||le(oe)}return R.createElement("a",ui({},D,{href:B||N,onClick:U||p?d:W,ref:r,target:h}))}),Iy=R.forwardRef(function(n,r){let{"aria-current":d="page",caseSensitive:u=!1,className:p="",end:g=!1,style:y,to:h,viewTransition:v,children:C}=n,P=Tp(n,gy),D=Mn(h,{relative:P.relative}),L=Vt(),B=R.useContext(Gl),{navigator:U,basename:N}=R.useContext(To),le=B!=null&&Ey(D)&&v===!0,W=U.encodeLocation?U.encodeLocation(D).pathname:D.pathname,oe=L.pathname,V=B&&B.navigation&&B.navigation.location?B.navigation.location.pathname:null;u||(oe=oe.toLowerCase(),V=V?V.toLowerCase():null,W=W.toLowerCase()),V&&N&&(V=jo(V,N)||V);const pe=W!=="/"&&W.endsWith("/")?W.length-1:W.length;let De=oe===W||!g&&oe.startsWith(W)&&oe.charAt(pe)==="/",j=V!=null&&(V===W||!g&&V.startsWith(W)&&V.charAt(W.length)==="/"),$={isActive:De,isPending:j,isTransitioning:le},Se=De?d:void 0,ce;typeof p=="function"?ce=p($):ce=[p,De?"active":null,j?"pending":null,le?"transitioning":null].filter(Boolean).join(" ");let Te=typeof y=="function"?y($):y;return R.createElement(ja,ui({},P,{"aria-current":Se,className:ce,ref:r,style:Te,to:h,viewTransition:v}),typeof C=="function"?C($):C)});var Nl;(function(i){i.UseScrollRestoration="useScrollRestoration",i.UseSubmit="useSubmit",i.UseSubmitFetcher="useSubmitFetcher",i.UseFetcher="useFetcher",i.useViewTransitionState="useViewTransitionState"})(Nl||(Nl={}));var Zc;(function(i){i.UseFetcher="useFetcher",i.UseFetchers="useFetchers",i.UseScrollRestoration="useScrollRestoration"})(Zc||(Zc={}));function Dy(i){let n=R.useContext(ls);return n||Ce(!1),n}function jy(i,n){let{target:r,replace:d,state:u,preventScrollReset:p,relative:g,viewTransition:y}=n===void 0?{}:n,h=$l(),v=Vt(),C=Mn(i,{relative:g});return R.useCallback(P=>{if(uy(P,r)){P.preventDefault();let D=d!==void 0?d:Ta(v)===Ta(C);h(i,{replace:D,state:u,preventScrollReset:p,relative:g,viewTransition:y})}},[v,h,C,d,u,r,i,p,g,y])}function Lb(i){let n=R.useRef(_l(i)),r=R.useRef(!1),d=Vt(),u=R.useMemo(()=>cy(d.search,r.current?null:n.current),[d.search]),p=$l(),g=R.useCallback((y,h)=>{const v=_l(typeof y=="function"?y(u):y);r.current=!0,p("?"+v,h)},[p,u]);return[u,g]}function Ey(i,n){n===void 0&&(n={});let r=R.useContext(Lp);r==null&&Ce(!1);let{basename:d}=Dy(Nl.useViewTransitionState),u=Mn(i,{relative:n.relative});if(!r.isTransitioning)return!1;let p=jo(r.currentLocation.pathname,d)||r.currentLocation.pathname,g=jo(r.nextLocation.pathname,d)||r.nextLocation.pathname;return jn(u.pathname,g)!=null||jn(u.pathname,p)!=null}const Ty="modulepreload",Ly=function(i){return"/dashboard/"+i},Jc={},Kt=function(n,r,d){let u=Promise.resolve();if(r&&r.length>0){let g=function(v){return Promise.all(v.map(C=>Promise.resolve(C).then(P=>({status:"fulfilled",value:P}),P=>({status:"rejected",reason:P}))))};document.getElementsByTagName("link");const y=document.querySelector("meta[property=csp-nonce]"),h=(y==null?void 0:y.nonce)||(y==null?void 0:y.getAttribute("nonce"));u=g(r.map(v=>{if(v=Ly(v),v in Jc)return;Jc[v]=!0;const C=v.endsWith(".css"),P=C?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${P}`))return;const D=document.createElement("link");if(D.rel=C?"stylesheet":Ty,C||(D.as="script"),D.crossOrigin="",D.href=v,h&&D.setAttribute("nonce",h),document.head.appendChild(D),C)return new Promise((L,B)=>{D.addEventListener("load",L),D.addEventListener("error",()=>B(new Error(`Unable to preload CSS for ${v}`)))})}))}function p(g){const y=new Event("vite:preloadError",{cancelable:!0});if(y.payload=g,window.dispatchEvent(y),!y.defaultPrevented)throw g}return u.then(g=>{for(const y of g||[])y.status==="rejected"&&p(y.reason);return n().catch(p)})},Hn=window.location.origin,zy=3e3,Uy=5e3;class My extends Error{constructor(r,d,u=null,p=null){super(d);Io(this,"status");Io(this,"error");Io(this,"payload");this.name="ApiClientError",this.status=r,this.error=u,this.payload=p}}function Hy(i){var r,d;const n=(d=(r=i.headers)==null?void 0:r.get)==null?void 0:d.call(r,"content-type");return typeof n=="string"&&n.toLowerCase().includes("application/json")}async function _y(i){if(!Hy(i))return null;try{const n=await i.json();if(n&&typeof n=="object")return n}catch{return null}return null}async function is(i){if(i.ok)return;const n=await _y(i),r=typeof(n==null?void 0:n.message)=="string"&&n.message.trim().length>0?n.message:`API ${i.status}: ${i.statusText}`,d=typeof(n==null?void 0:n.error)=="string"?n.error:null;throw new My(i.status,r,d,n)}class Ny{constructor(n){Io(this,"base");this.base=n}async get(n,r){const d=new URL(n,this.base);r&&Object.entries(r).forEach(([p,g])=>d.searchParams.set(p,g));const u=await fetch(d.toString(),{method:"GET"});return await is(u),u.json()}async patch(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await is(u),u.json()}async put(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await is(u),u.json()}async post(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"POST",headers:r?{"Content-Type":"application/json"}:{},body:r?JSON.stringify(r):void 0});return await is(u),u.json()}async delete(n){const r=new URL(n,this.base),d=await fetch(r.toString(),{method:"DELETE"});return await is(d),d.json()}}const jt=new Ny(Hn);class Ql{constructor(n){Io(this,"source",null);Io(this,"handlers",new Map);Io(this,"reconnectTimer",null);Io(this,"url");this.url=n??`${Hn}/api/dashboard/events`}connect(){this.disconnect(),this.source=new EventSource(this.url),this.source.onopen=()=>{this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)},this.source.onerror=()=>{var r;(r=this.source)==null||r.close(),this.source=null,this.scheduleReconnect()};const n=["connection","sync","command","game_change","mcp_status","license"];for(const r of n)this.source.addEventListener(r,d=>{var p;const u=JSON.parse(d.data);(p=this.handlers.get(r))==null||p.forEach(g=>g(u))})}on(n,r){return this.handlers.has(n)||this.handlers.set(n,new Set),this.handlers.get(n).add(r),()=>{var d;return(d=this.handlers.get(n))==null?void 0:d.delete(r)}}disconnect(){var n;(n=this.source)==null||n.close(),this.source=null,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}get connected(){var n;return((n=this.source)==null?void 0:n.readyState)===EventSource.OPEN}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},zy))}}function Oy(i){return i.pluginClients&&i.pluginClients.length>0?"studioConnected":(i.connectedClients===0||!i.pluginClients,"serverOnly")}const zp=R.createContext(null);function qy({children:i}){const[n,r]=R.useState("disconnected"),[d,u]=R.useState(null),[p,g]=R.useState(null),y=R.useRef(null);return R.useEffect(()=>{let h=!1;async function v(){try{const D=await jt.get("/status");if(h)return;u(D),r(Oy(D)),g(null)}catch(D){if(h)return;r("disconnected"),g(D instanceof Error?D.message:String(D))}}v(),y.current=setInterval(v,Uy);const C=new Ql;C.connect();const P=C.on("connection",()=>{v()});return()=>{h=!0,y.current&&clearInterval(y.current),P(),C.disconnect()}},[]),x.jsx(zp.Provider,{value:{level:n,status:d,error:p},children:i})}function _n(){const i=R.useContext(zp);if(!i)throw new Error("useConnection must be used within a ConnectionProvider");return i}const By={"sidebar.overview":"Overview","sidebar.changelog":"Changelog","sidebar.connection":"Connection","sidebar.sync":"Sync","sidebar.playtest":"Playtest","sidebar.tools":"Tools","sidebar.settings":"Settings","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP server connection required","sidebar.gate.l2":"Roblox Studio plugin connection required","header.currentProject":"Current Project","header.unknownProject":"Unknown project","header.projectRoot.label":"Project Root","header.currentProject.loading":"Loading project root...","header.currentProject.unavailable":"Project root unavailable","header.placeNotConnected":"Place not connected","header.currentProject.tooltip":"Currently selected project folder","header.currentProject.loading.tooltip":"Project root information is still loading","header.currentProject.unavailable.tooltip":"Current project root information is unavailable","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Loading sync root...","header.currentProjectSyncRoot.unavailable":"Sync root unavailable","header.currentProjectSyncRoot.tooltip":"Current sync root folder for the selected project","header.currentProjectSyncRoot.loading.tooltip":"Sync root information is still loading","header.currentProjectSyncRoot.unavailable.tooltip":"Current sync root information is unavailable","header.testFiles.label":"Test Files","header.testFiles.unavailable":"Test files unavailable","header.testFiles.tooltip":"Current playtest files directory for the selected place","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Plugin connection required","header.places.liveRequired":"Plugin connection required for live active place","header.place.tooltip":"Connected Roblox place","header.placeNotConnected.tooltip":"Place not connected","placeScope.current.label":"Current Place","placeScope.lastActive.label":"Last Active Place","placeScope.selected.label":"Selected Place","placeScope.unknownPlace":"Unknown place","placeScope.live":"Live","placeScope.stored":"Stored","placeScope.pluginRequired":"Plugin required","placeScope.pluginRequired.note":"Connect WEPPY Plugin to confirm the live active place.","placeScope.noPlace.label":"Place scope","placeScope.noPlace.value":"No place data available yet","placeScope.noPlace.badge":"No place","placeScope.noPlace.note":"Connect WEPPY Plugin and sync a place to create place-scoped data.","placeScope.selected.note":"Showing stored data only. Studio routing is unchanged.","placeScope.surface.sync":"Sync status and logs use this place.","placeScope.surface.changelog":"Changelog sessions use this place.","placeScope.surface.playtest":"Playtest reports use this place.","placeScope.surface.uiStudio":"UI captures and change history use this place.","placeScope.surface.tools":"Tool history and statistics use this place.","placeScope.loading":"Loading place scope...","placeScope.unavailable":"Place scope unavailable","placeScope.selector.label":"Place data","header.changeProjectRoot":"Change Project Root","header.changeProjectRoot.ariaLabel":"Change project root","header.changeProjectRoot.tooltip":"Change the current project root","header.changeProjectRoot.disabledTooltip.l0":"MCP server connection required before project root can be changed","header.changeProjectRoot.disabledTooltip.loading":"Project root information is still loading","header.changeProjectRoot.disabledTooltip.unavailable":"Current project root information is unavailable","header.projectRootModal.initial.title":"Change project root","header.projectRootModal.initial.body.connected":"After you choose a project folder, MCP will switch to the new project root and the current Studio contents will be fully resynced into the new <selected project folder>/weppy-project-sync target.","header.projectRootModal.initial.body.disconnected":"After you choose a project folder, MCP will switch to the new project root and use <selected project folder>/weppy-project-sync as the next sync target.","header.projectRootModal.initial.nextSyncRoot":"New sync target after selection","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Current sync stops immediately.","header.projectRootModal.initial.warningFreshSync":"The current Studio contents will be used to build a fresh full sync in the new target.","header.projectRootModal.initial.warningNoMove":"Old sync folders are not moved automatically.","header.projectRootModal.initial.warningDeferredSync":"If Studio is not connected, full resync starts the next time the plugin connects.","header.projectRootModal.confirm.title":"Confirm new project root","header.projectRootModal.confirm.body":"Review the selected project folder before applying.","header.projectRootModal.confirm.projectRoot":"Selected project folder","header.projectRootModal.confirm.syncRoot":"New sync target","header.projectRootModal.confirm.warningNoMove":"Existing sync folders are not moved automatically.","header.projectRootModal.pick":"Choose folder","header.projectRootModal.apply":"Apply change","header.projectRootModal.cancel":"Cancel","header.projectRootModal.error":"Failed to change project root","status.online":"Online","status.offline":"Offline","status.idle":"Idle","status.syncing":"Syncing","status.error":"Error","status.initializing":"Initializing","level.l0.title":"Server disconnected","level.l0.message":"WEPPY Dashboard opened but MCP server has stopped or is not responding.","level.l1.title":"Server connected","level.l1.hint":"Check: Is Roblox Studio running? Is the plugin installed?","level.l2.ok":"Studio connected","tier.basic":"Basic","tier.basic.tooltip":"Basic tier with the standard WEPPY Dashboard feature set.","tier.pro":"Pro","tier.pro.tooltip":"Pro tier with the full WEPPY Dashboard feature set.","tier.mixed":"Mixed","tier.upgrade":"View Pro","tier.banner.save":"Save AI tokens with Pro!","tier.tool.query_instances.desc":"Inspect instances, search children and descendants, and inspect class data. Pro adds file tree, project structure, and property or tag search.","tier.tool.mutate_instances.desc":"Create, delete, clone, and move instances. Pro adds tree creation and bulk create, delete, or clone operations.","tier.tool.manage_properties.desc":"Read and set properties, attributes, and tags. Pro adds calculated updates, relative changes, and bulk property operations.","tier.tool.manage_scripts.desc":"Read, write, create, delete, edit, and search script source. Pro adds bulk replacement across scripts.","tier.tool.manage_ui.desc":"Pro only. Create or refine game-style menus, HUDs, buttons, labels, and image panels, then capture screens and review improvement suggestions.","tier.tool.manage_ui.action.design_brief":"Plan UI direction","tier.tool.manage_ui.action.create_tree":"Create new UI","tier.tool.manage_ui.action.update":"Update existing UI","tier.tool.manage_ui.action.delete":"Remove UI","tier.tool.manage_ui.action.preview":"Capture UI screen","tier.tool.manage_ui.action.check":"Review improvement suggestions","tier.tool.manage_lighting.desc":"Pro only. Configure lighting, atmosphere, sky, terrain properties, and time-of-day settings.","tier.tool.manage_selection.desc":"Read, set, and clear the current Studio selection. Pro adds context, details, add or remove, and selection watch support.","tier.tool.manage_camera.desc":"Inspect camera state, focus by path or position, and request suggested views.","tier.tool.manage_tween.desc":"Pro only. Create, play, pause, and cancel tweens for smooth animation.","tier.tool.manage_audio.desc":"Pro only. Play, stop, pause, and resume sounds, and configure the audio listener.","tier.tool.manage_animation.desc":"Pro only. Load, play, and stop animations, and inspect active animation tracks.","tier.tool.manage_physics.desc":"Pro only. Register collision groups, configure group collisions, and inspect available groups.","tier.tool.manage_effects.desc":"Pro only. Emit particles, clear effects, and toggle effect state.","tier.tool.manage_terrain.desc":"Pro only. Fill terrain shapes, clear regions, replace materials, manage terrain colors, read or write voxels, generate terrain, and smooth terrain.","tier.tool.spatial_query.desc":"Pro only. Run raycasts, find ground, validate placement, scan areas, search for flat or spawn positions, analyze walkability, map space, and inspect collisions.","tier.tool.manage_assets.desc":"Pro only. Insert models, inspect asset info, search the creator store, insert free assets or packages, and export assets.","tier.tool.manage_sync.desc":"Pro only. Inspect sync status, configuration, history, directions, and read or write synced files.","tier.tool.workspace_state.desc":"Pro only. Run full sync, capture snapshots, inspect recent changes and viewport state, and manage related metadata.","tier.tool.manage_logs.desc":"Inspect output logs with filtering, incremental polling, buffer clearing, and recent error lookup.","tier.tool.system_info.desc":"Inspect connection status and current tier. Pro adds place info, services, Studio settings, playtest control, and automated tests.","tier.tool.manage_studio.desc":"Pro only. Toggle Studio editor view settings such as UI preview for screenshot and QA workflows; it changes Studio session settings, not game UI objects.","tier.tool.batch_execute.desc":"Pro only. Run multiple commands in a batch, with sequential execution and optional continue-on-error behavior.","tier.tool.execute_luau.desc":"Pro only. Execute arbitrary Luau code inside the Roblox Studio sandbox.","connection.server.title":"Server Status","connection.server.version":"Version","connection.server.version.tooltip":"Installed MCP server version","connection.server.pid":"PID","connection.server.pid.tooltip":"Operating system process identifier","connection.server.uptime":"Uptime","connection.server.uptime.tooltip":"Time elapsed since the MCP server started","connection.server.session":"Session","connection.server.session.tooltip":"Current MCP session identifier","connection.server.exec":"Exec","connection.server.exec.tooltip":"Executable path used to launch the MCP server","connection.reconnect":"Reconnect","connection.checkSettings":"Check Settings","connection.agents.title":"AI Agents","connection.agents.name":"Agent","connection.agents.cwd":"Working Dir","connection.agents.cwd.tooltip":"Current working directory for the connected AI agent","connection.agents.projectRoot":"Project Root","connection.agents.projectRoot.tooltip":"Authoritative project root for sync ownership","connection.agents.projectRoot.unresolved":"Unresolved","connection.agents.connected":"Connected","connection.agents.unknown":"Unknown","connection.agents.none":"No agents connected","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Last Seen","connection.plugins.lastSeen.tooltip":"Most recent heartbeat received from the plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Installed plugin version reported by Studio","connection.plugins.none":"No plugins connected","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test connection","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Connection Log","connection.log.empty":"No events yet","connection.time.secondsAgo":"s ago","connection.time.minutesAgo":"m ago","connection.time.hoursAgo":"h ago","common.loading":"Loading...","common.retry":"Retry","common.reconnecting":"Reconnecting...","common.expand":"Expand","common.collapse":"Collapse","tools.tab.history":"History","tools.tab.statistics":"Statistics","tools.tab.failures":"Failures","tools.col.time":"Time","tools.col.time.tooltip":"When the tool run was recorded.","tools.col.toolAction":"Tool.Action","tools.col.toolAction.tooltip":"Tool name and action that were executed.","tools.col.duration":"Duration","tools.col.duration.tooltip":"How long the tool took to finish.","tools.col.status":"Status","tools.col.status.tooltip":"Outcome of the recorded tool run.","tools.col.tier":"Tier","tools.col.tier.tooltip":"License tier required for the tool or action.","tools.col.tierStats.tooltip":"Basic, Pro, or Mixed summary for the tool statistics row.","tools.col.tool":"Tool","tools.col.tool.tooltip":"Consolidated tool name in the statistics table.","tools.col.calls":"Calls","tools.col.calls.tooltip":"Total number of recorded calls for this tool.","tools.col.ok":"OK","tools.col.ok.tooltip":"Number of direct successful runs.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Number of runs that succeeded through fallback execution.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Number of blocked runs without fallback execution.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Number of expected failures caused by caller input, project state, Roblox policy, or user code.","tools.col.err":"FAILED","tools.col.err.tooltip":"Number of runs that failed.","tools.col.okRate":"OK%","tools.col.okRate.tooltip":"Percentage of calls that finished successfully.","tools.col.avgTime":"Avg Time","tools.col.avgTime.tooltip":"Average execution time across recorded calls.","tools.col.error":"Error","tools.filter.tool":"Tool","tools.filter.all":"All","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"This entry used a Pro-only tool or action.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"The requested Pro action succeeded via a Basic fallback.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"The requested Pro action was blocked and no fallback ran.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"The tool call failed as an expected caller, project, policy, or user-code issue.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"The tool run failed.","tools.status.ok":"OK","tools.status.ok.tooltip":"The tool run completed successfully.","tools.tier.mixed.tooltip":"This tool includes both Basic and Pro actions.","tools.detail.params":"Parameters","tools.detail.params.tooltip":"Input parameters passed to this tool run.","tools.detail.result":"Result","tools.detail.result.tooltip":"Returned result payload for this tool run.","tools.detail.requestedCommand":"Command Sent","tools.detail.executedCommand":"Executed Command","tools.detail.alternatives":"Alternatives","tools.detail.blockedMessage":"Blocked Reason","tools.detail.noFallback":"No Fallback","tools.detail.noFallback.value":"No fallback ran.","tools.detail.warningMessage":"Warning Message","tools.detail.errorMessage":"Error Message","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Clear history?","tools.clear.history.message":"This permanently removes the current place tools history.","tools.clear.statistics.title":"Clear statistics?","tools.clear.statistics.message":"This permanently resets the current place tool statistics.","tools.detail.error":"Error","tools.page.prev":"Prev","tools.page.prev.tooltip":"Go to the previous page of tool history results.","tools.page.next":"Next","tools.page.next.tooltip":"Go to the next page of tool history results.","tools.empty.history":"No history entries","tools.empty.stats":"No tool statistics","tools.empty.failures":"No failures","tools.summary.total":"Total","tools.summary.calls":"calls","tools.summary.sessions":"Sessions","settings.license.title":"License","settings.license.title.tooltip":"Current license status and subscription tier.","settings.license.status":"Status","settings.license.status.tooltip":"Current license activation state.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Current subscription tier for available WEPPY Dashboard features.","settings.license.key":"Key","settings.license.key.tooltip":"Masked license key currently loaded by the server.","settings.license.keyValue.tooltip":"Masked license key currently loaded by the server.","settings.license.provider":"Provider","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"License provider used to validate this key.","settings.license.providerValue.tooltip":"License provider used to validate this key.","settings.license.active":"Active","settings.license.active.tooltip":"Current license activation state.","settings.license.status.activeCancelPending.tooltip":"Cancellation is pending, but Pro access remains active until the current billing period ends.","settings.license.inactive":"Inactive","settings.license.inactive.tooltip":"Current license activation state.","settings.license.expired":"Expired","settings.license.expired.tooltip":"Current license activation state.","settings.license.unavailable":"License info unavailable","settings.license.detail.cancelPending":"Cancellation is scheduled. Pro access remains active until the current billing period ends.","settings.license.reset":"Reset License","settings.readOnly":"Read-only","settings.readOnly.tooltip":"This section shows values that cannot be edited from the WEPPY Dashboard.","settings.unavailable":"Settings unavailable","settings.general.title":"General Settings","settings.general.title.tooltip":"Hot settings that apply immediately when changed.","settings.general.liveApply":"Live Apply","settings.general.liveApply.tooltip":"Changes in this section are applied immediately without a separate save button.","settings.general.applied":"Applied","settings.general.logLevel":"Log Level","settings.general.logLevel.tooltip":"Choose how much detail the MCP server writes to logs. Lower to ‘debug’ when tracking down a problem.","settings.general.localHistory":"Tool History Recording","settings.general.localHistory.tooltip":"Save AI tool runs to disk. Required for the Tools and History pages.","settings.general.localStatistics":"Tool Statistics Collection","settings.general.localStatistics.tooltip":"Aggregate tool usage counts. Used by the Overview statistics.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"Save structured execution context so the Changelog and Playtest views can render it.","settings.general.requestTimeout":"Action Timeout","settings.general.requestTimeout.tooltip":"Maximum time (in ms) to wait for a single tool action before failing.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Action timeout is measured in milliseconds.","settings.cold.title":"Server Environment","settings.cold.title.tooltip":"Read-only server environment values loaded at startup.","settings.cold.httpPort.tooltip":"Port number used by the MCP WEPPY Dashboard HTTP server.","settings.cold.httpHost.tooltip":"Host interface that the MCP WEPPY Dashboard HTTP server binds to.","settings.cold.dashboardAutoOpen.tooltip":"Controls whether the WEPPY Dashboard opens automatically in the browser when the server starts.","settings.cold.dashboardAutoOpen.value.tooltip":"Current startup behavior for opening the WEPPY Dashboard in a browser.","settings.cold.hint":"Set via environment variables to change these values.","settings.language.title":"Language","settings.language.title.tooltip":"Choose how the WEPPY Dashboard interface text is localized.","settings.language.dashboard":"WEPPY Dashboard Language","settings.language.dashboard.tooltip":"Overrides the WEPPY Dashboard language or follows the system language when set to Auto.","settings.language.auto":"Auto","overview.l0.title":"MCP Server Disconnected","overview.l0.message":"The MCP server is not responding. The WEPPY Dashboard will automatically attempt to reconnect.","overview.l0.step1":"Check that the MCP server process is running","overview.l0.step2":"Restart the MCP server command if needed","overview.l0.reconnecting":"Auto-reconnecting every 3s...","overview.l0.reconnectBtn":"Reconnect","overview.l0.settingsBtn":"Check Settings","overview.l1.pluginGuide":"Roblox Studio plugin is not connected","overview.l1.check1":"Is Roblox Studio running?","overview.l1.check2":"Is the WEPPY Plugin installed?","overview.l1.feedHint":"Changes will appear here once the plugin connects","overview.metric.server":"Server","overview.metric.server.tooltip":"MCP server runtime and process status","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Roblox Studio plugin connection and version status","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Connected AI coding agents and their runtime state","overview.metric.agent.instancesUnit":"instances","overview.metric.sync":"Sync","overview.metric.sync.tooltip":"Current Studio to local sync activity","overview.metric.noAgent":"No Agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Installed MCP server version","overview.meta.session":"Session","overview.meta.session.tooltip":"Current MCP session identifier","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Operating system process identifier","overview.meta.uptime":"Uptime","overview.meta.uptime.tooltip":"Time elapsed since the MCP server started","overview.feed.title":"Recent Game Changes","overview.feed.empty":"No recent changes","overview.changelog.title":"Session Change Summary","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instances","overview.changelog.properties":"properties","overview.changelog.assets":"assets","overview.tier.title":"Tier Usage","changelog.subtitle":"Game Change History","changelog.filter.all":"All","changelog.filter.active":"Active","changelog.filter.completed":"Completed","changelog.empty":"No changelog entries yet","changelog.basic.limit.title":"Basic preview shows the latest 3 sessions","changelog.basic.limit.body":"Full changelog timeline browsing is available with Pro.","changelog.basic.metricLabel":"Visible Changelog / Total","changelog.basic.visible":"visible","changelog.basic.total":"total","changelog.card.active":"Active","changelog.card.active.tooltip":"This session is still receiving new game changes.","changelog.card.completed":"Completed","changelog.card.completed.tooltip":"This session has ended and no more changes are expected.","changelog.card.bootstrapStatus":"Bootstrap","changelog.card.bootstrapStatus.tooltip":"This session only contains the initial sync bootstrap snapshot.","changelog.card.inProgress":"in progress","changelog.card.noChanges":"No changes yet","changelog.card.noChanges.tooltip":"No game changes have been extracted for this session yet.","changelog.card.bootstrapSummary":"Initial sync snapshot","changelog.card.bootstrapSummary.tooltip":"Initial file sync writes are collapsed into a single bootstrap snapshot row.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Script changes made in this session.","changelog.card.instances":"instances","changelog.card.instances.tooltip":"Instance create, delete, move, or clone changes in this session.","changelog.card.modified":"modified","changelog.card.created":"created","changelog.card.deleted":"deleted","changelog.card.moved":"moved","changelog.card.propertiesChanged":"properties changed","changelog.card.propertiesChanged.tooltip":"Property value changes recorded for this session.","changelog.card.lightingConfigured":"Lighting configured","changelog.card.lightingConfigured.tooltip":"Lighting or atmosphere settings changed in this session.","changelog.card.terrainConfigured":"Terrain configured","changelog.card.terrainConfigured.tooltip":"Terrain data or terrain settings changed in this session.","changelog.card.assetsInserted":"assets inserted","changelog.card.assetsInserted.tooltip":"Assets inserted into the place during this session.","changelog.category.script":"Scripts","changelog.category.instance":"Instances","changelog.category.property":"Properties","changelog.category.lighting":"Lighting","changelog.category.terrain":"Terrain","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Change Summary","changelog.detail.changeSummary.tooltip":"Counts of extracted game changes grouped by category for this session.","changelog.detail.changeTimeline":"Change Timeline","changelog.detail.changeTimeline.tooltip":"Chronological list of extracted game changes for this session.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Before & After","changelog.detail.filterCategory":"Category","changelog.detail.filterCategory.tooltip":"Filter the timeline to a single change category.","changelog.detail.confidence.exact":"Exact","changelog.detail.confidence.exact.tooltip":"Both the before and after state were confirmed for this change.","changelog.detail.confidence.partial":"Partial","changelog.detail.confidence.partial.tooltip":"Only part of the before and after state could be confirmed for this change.","changelog.detail.confidence.afterOnly":"After only","changelog.detail.confidence.afterOnly.tooltip":"Only the resulting state after the change could be confirmed.","changelog.detail.confidence.intentOnly":"Intent only","changelog.detail.confidence.intentOnly.tooltip":"Only the requested action was recorded, not the resulting state.","changelog.detail.confidence.unknown":"Unknown","changelog.detail.confidence.unknown.tooltip":"This change could not be confidently classified from the available data.","changelog.detail.noChanges":"No changes in this category","changelog.detail.backToList":"Back to list","changelog.diff.empty":"No diff available","changelog.diff.unified":"Unified","changelog.diff.sideBySide":"Side by Side","changelog.diff.before":"Before","changelog.diff.after":"After","sync.overlay.title":"Roblox Studio plugin required","sync.overlay.message":"Sync status will be available once the Roblox Studio plugin connects.","sync.overlay.check1":"Is Roblox Studio running?","sync.overlay.check2":"Is the WEPPY Plugin installed?","sync.status.title":"Sync Status","sync.status.title.tooltip":"Current Studio and local file sync status for this place.","sync.status.forwardOnly":"Forward Only","sync.status.forwardOnly.tooltip":"Basic tier allows Studio to local forward sync only.","sync.status.place":"Place","sync.status.place.tooltip":"Connected Roblox place name and place ID.","sync.status.path":"Path","sync.status.path.tooltip":"Local filesystem root currently used for sync output.","sync.status.instances":"Instances","sync.status.instances.tooltip":"Total synced Roblox instances tracked in the local mirror.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Total synced script files currently indexed for this place.","sync.status.state":"State","sync.status.state.tooltip":"Current runtime sync state reported by the server.","sync.directions.title":"Sync Directions","sync.directions.title.tooltip":"Per-category sync direction and apply behavior between Local and Studio.","sync.directions.type":"Type","sync.directions.type.tooltip":"Sync category affected by this rule.","sync.directions.direction":"Direction","sync.directions.direction.tooltip":"Whether each category syncs from Studio, to Studio, or both ways.","sync.directions.applyMode":"Apply Mode","sync.directions.applyMode.tooltip":"How incoming sync changes are applied for this category.","sync.directions.deletePolicy":"Delete Policy","sync.directions.deletePolicy.tooltip":"Controls whether local file deletes can remove matching Studio instances automatically.","sync.directions.deletePolicy.ask":"Ask Before Delete","sync.directions.deletePolicy.ask.tooltip":"Deleted local files are reviewed before Studio instances are removed.","sync.directions.deletePolicy.auto":"Auto Delete","sync.directions.deletePolicy.auto.tooltip":"Deleted local files can remove matching Studio instances automatically.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Values","sync.directions.cat.containers":"Containers","sync.directions.cat.data":"Data","sync.directions.cat.services":"Services","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"Local files on disk are always shown on the left side of the direction rail.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio is always shown on the right side of the direction rail.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Applies sync changes only when you trigger them manually.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Applies sync changes automatically when updates arrive.","sync.directions.tooltip.forward.body":"Studio changes sync to local files only","sync.directions.tooltip.bidirectional.body":"Two-way sync between Local and Studio","sync.directions.tooltip.reverse.body":"Push local file changes to Studio","sync.directions.tooltip.proRequired":"Pro required in Basic tier","sync.directions.dir.forward":"forward","sync.directions.dir.bidirectional":"bidirectional","sync.directions.dir.reverse":"reverse","sync.log.title":"Sync Log","sync.log.empty":"No sync events yet","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"A new sync output was written to disk.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"An existing synced file or instance was updated.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"A synced file or instance was removed.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"A sync event was recorded without a file mutation.","sync.upgrade.title":"Explore Full Sync with Pro","sync.upgrade.benefit1":"Bidirectional sync — edit files, auto-apply to Studio","sync.upgrade.benefit2":"Reverse sync — push file changes back to Studio","sync.upgrade.benefit3":"Full sync history and detailed change log","sync.upgrade.buy":"View Pro","playtest.status.title":"Playtest Status","playtest.status.title.tooltip":"Current Roblox playtest session state reported by Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Studio playtest launch mode for the current session.","playtest.status.mode.value.tooltip":"Specific Roblox Studio playtest mode currently in use.","playtest.status.mode.play":"Play","playtest.status.mode.run":"Run","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Roblox place currently associated with this playtest session.","playtest.status.state.running":"Running","playtest.status.state.running.tooltip":"A Roblox playtest session is currently running.","playtest.status.state.paused":"Paused","playtest.status.state.paused.tooltip":"The current Roblox playtest session is paused.","playtest.status.state.notRunning":"Not Running","playtest.status.state.notRunning.tooltip":"No Roblox playtest session is currently running.","playtest.control.play":"Play","playtest.control.pause":"Pause","playtest.control.resume":"Resume","playtest.control.stop":"Stop","playtest.history.title":"Test History","playtest.history.title.tooltip":"Recorded automated playtest runs for this project.","playtest.history.empty":"No test results yet","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Playtest mode used for this recorded test run.","playtest.history.status.passed":"Passed","playtest.history.status.failed":"Failed","playtest.history.status.running":"Running","playtest.history.status.unknown":"Unknown","playtest.history.status.tooltip":"Recorded result state for this automated playtest run.","playtest.empty.title":"No playtest results yet","playtest.empty.message":"Test results will appear here after the AI Agent runs a Playtest.","playtest.empty.message.before":"Test results will appear here after the AI Agent runs a Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Selected Report","playtest.report.title.tooltip":"Detailed output for the currently selected automated playtest run.","playtest.report.content":"Report","playtest.report.content.tooltip":"Markdown summary for the selected automated playtest run.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Execution logs captured for the selected automated playtest run.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"No report content available","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest is a Pro-only feature","playtest.basic.desc":"Control playtesting from the WEPPY Dashboard, run automated tests, and view detailed test reports.","playtest.basic.benefit1":"One-click play/pause/stop controls","playtest.basic.benefit2":"Automated test execution via AI agent","playtest.basic.benefit3":"Test history with pass/fail tracking","playtest.basic.benefit4":"Detailed markdown test reports","playtest.sample.badge":"Preview of the Pro playtest view","playtest.sample.title":"You are previewing the playtest screen that becomes available after upgrading to Pro.","playtest.sample.message":"This preview uses sample data. Live playtest control, history management, and real reports unlock with Pro.","playtest.sample.clearDisabled":"Available with Pro for live playtest history.","playtest.sample.place":"Arena Preview","playtest.sample.history.name":"Sample Arena Smoke Test","playtest.sample.context.why":"Spawn into the arena, survive the opener, and verify the HUD responds immediately.","playtest.sample.context.expected":"The player spawns safely, the countdown UI appears within one second, and the first wave starts without errors.","playtest.sample.context.observed":"Spawn protection held, the HUD updated on time, and wave one completed with no gameplay regressions.","playtest.sample.report.markdown":`# Sample Arena Smoke Test
69
+ */function ui(){return ui=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},ui.apply(this,arguments)}function Tp(i,n){if(i==null)return{};var r={},d=Object.keys(i),u,p;for(p=0;p<d.length;p++)u=d[p],!(n.indexOf(u)>=0)&&(r[u]=i[u]);return r}function dy(i){return!!(i.metaKey||i.altKey||i.ctrlKey||i.shiftKey)}function uy(i,n){return i.button===0&&(!n||n==="_self")&&!dy(i)}function Nl(i){return i===void 0&&(i=""),new URLSearchParams(typeof i=="string"||Array.isArray(i)||i instanceof URLSearchParams?i:Object.keys(i).reduce((n,r)=>{let d=i[r];return n.concat(Array.isArray(d)?d.map(u=>[r,u]):[[r,d]])},[]))}function cy(i,n){let r=Nl(i);return n&&n.forEach((d,u)=>{r.has(u)||n.getAll(u).forEach(p=>{r.append(u,p)})}),r}const py=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],gy=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],hy="6";try{window.__reactRouterVersion=hy}catch{}function my(i,n){return Cm({basename:void 0,future:ui({},void 0,{v7_prependBasename:!0}),history:Vh({window:void 0}),hydrationData:yy(),routes:i,mapRouteProperties:ly,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function yy(){var i;let n=(i=window)==null?void 0:i.__staticRouterHydrationData;return n&&n.errors&&(n=ui({},n,{errors:fy(n.errors)})),n}function fy(i){if(!i)return null;let n=Object.entries(i),r={};for(let[d,u]of n)if(u&&u.__type==="RouteErrorResponse")r[d]=new En(u.status,u.statusText,u.data,u.internal===!0);else if(u&&u.__type==="Error"){if(u.__subType){let p=window[u.__subType];if(typeof p=="function")try{let g=new p(u.message);g.stack="",r[d]=g}catch{}}if(r[d]==null){let p=new Error(u.message);p.stack="",r[d]=p}}else r[d]=u;return r}const Lp=R.createContext({isTransitioning:!1}),Sy=R.createContext(new Map),vy="startTransition",Xc=Wh[vy],by="flushSync",Qc=Kh[by];function Py(i){Xc?Xc(i):i()}function as(i){Qc?Qc(i):i()}class wy{constructor(){this.status="pending",this.promise=new Promise((n,r)=>{this.resolve=d=>{this.status==="pending"&&(this.status="resolved",n(d))},this.reject=d=>{this.status==="pending"&&(this.status="rejected",r(d))}})}}function Cy(i){let{fallbackElement:n,router:r,future:d}=i,[u,p]=R.useState(r.state),[g,y]=R.useState(),[h,v]=R.useState({isTransitioning:!1}),[w,P]=R.useState(),[D,L]=R.useState(),[B,U]=R.useState(),_=R.useRef(new Map),{v7_startTransition:le}=d||{},W=R.useCallback(X=>{le?Py(X):X()},[le]),oe=R.useCallback((X,Se)=>{let{deletedFetchers:ce,flushSync:Te,viewTransitionOpts:Ce}=Se;X.fetchers.forEach((Me,et)=>{Me.data!==void 0&&_.current.set(et,Me.data)}),ce.forEach(Me=>_.current.delete(Me));let ke=r.window==null||r.window.document==null||typeof r.window.document.startViewTransition!="function";if(!Ce||ke){Te?as(()=>p(X)):W(()=>p(X));return}if(Te){as(()=>{D&&(w&&w.resolve(),D.skipTransition()),v({isTransitioning:!0,flushSync:!0,currentLocation:Ce.currentLocation,nextLocation:Ce.nextLocation})});let Me=r.window.document.startViewTransition(()=>{as(()=>p(X))});Me.finished.finally(()=>{as(()=>{P(void 0),L(void 0),y(void 0),v({isTransitioning:!1})})}),as(()=>L(Me));return}D?(w&&w.resolve(),D.skipTransition(),U({state:X,currentLocation:Ce.currentLocation,nextLocation:Ce.nextLocation})):(y(X),v({isTransitioning:!0,flushSync:!1,currentLocation:Ce.currentLocation,nextLocation:Ce.nextLocation}))},[r.window,D,w,_,W]);R.useLayoutEffect(()=>r.subscribe(oe),[r,oe]),R.useEffect(()=>{h.isTransitioning&&!h.flushSync&&P(new wy)},[h]),R.useEffect(()=>{if(w&&g&&r.window){let X=g,Se=w.promise,ce=r.window.document.startViewTransition(async()=>{W(()=>p(X)),await Se});ce.finished.finally(()=>{P(void 0),L(void 0),y(void 0),v({isTransitioning:!1})}),L(ce)}},[W,g,w,r.window]),R.useEffect(()=>{w&&g&&u.location.key===g.location.key&&w.resolve()},[w,D,u.location,g]),R.useEffect(()=>{!h.isTransitioning&&B&&(y(B.state),v({isTransitioning:!0,flushSync:!1,currentLocation:B.currentLocation,nextLocation:B.nextLocation}),U(void 0))},[h.isTransitioning,B]),R.useEffect(()=>{},[]);let V=R.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:X=>r.navigate(X),push:(X,Se,ce)=>r.navigate(X,{state:Se,preventScrollReset:ce==null?void 0:ce.preventScrollReset}),replace:(X,Se,ce)=>r.navigate(X,{replace:!0,state:Se,preventScrollReset:ce==null?void 0:ce.preventScrollReset})}),[r]),pe=r.basename||"/",De=R.useMemo(()=>({router:r,navigator:V,static:!1,basename:pe}),[r,V,pe]),j=R.useMemo(()=>({v7_relativeSplatPath:r.future.v7_relativeSplatPath}),[r.future.v7_relativeSplatPath]);return R.useEffect(()=>sy(d,r.future),[d,r.future]),R.createElement(R.Fragment,null,R.createElement(ls.Provider,{value:De},R.createElement(Gl.Provider,{value:u},R.createElement(Sy.Provider,{value:_.current},R.createElement(Lp.Provider,{value:h},R.createElement(ry,{basename:pe,location:u.location,navigationType:u.historyAction,navigator:V,future:j},u.initialized||r.future.v7_partialHydration?R.createElement(ky,{routes:r.routes,future:r.future,state:u}):n))))),null)}const ky=R.memo(xy);function xy(i){let{routes:n,future:r,state:d}=i;return Ym(n,void 0,d,r)}const Ry=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Ay=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,ja=R.forwardRef(function(n,r){let{onClick:d,relative:u,reloadDocument:p,replace:g,state:y,target:h,to:v,preventScrollReset:w,viewTransition:P}=n,D=Tp(n,py),{basename:L}=R.useContext(To),B,U=!1;if(typeof v=="string"&&Ay.test(v)&&(B=v,Ry))try{let oe=new URL(window.location.href),V=v.startsWith("//")?new URL(oe.protocol+v):new URL(v),pe=jo(V.pathname,L);V.origin===oe.origin&&pe!=null?v=pe+V.search+V.hash:U=!0}catch{}let _=Wm(v,{relative:u}),le=jy(v,{replace:g,state:y,target:h,preventScrollReset:w,relative:u,viewTransition:P});function W(oe){d&&d(oe),oe.defaultPrevented||le(oe)}return R.createElement("a",ui({},D,{href:B||_,onClick:U||p?d:W,ref:r,target:h}))}),Iy=R.forwardRef(function(n,r){let{"aria-current":d="page",caseSensitive:u=!1,className:p="",end:g=!1,style:y,to:h,viewTransition:v,children:w}=n,P=Tp(n,gy),D=Hn(h,{relative:P.relative}),L=Vt(),B=R.useContext(Gl),{navigator:U,basename:_}=R.useContext(To),le=B!=null&&Ey(D)&&v===!0,W=U.encodeLocation?U.encodeLocation(D).pathname:D.pathname,oe=L.pathname,V=B&&B.navigation&&B.navigation.location?B.navigation.location.pathname:null;u||(oe=oe.toLowerCase(),V=V?V.toLowerCase():null,W=W.toLowerCase()),V&&_&&(V=jo(V,_)||V);const pe=W!=="/"&&W.endsWith("/")?W.length-1:W.length;let De=oe===W||!g&&oe.startsWith(W)&&oe.charAt(pe)==="/",j=V!=null&&(V===W||!g&&V.startsWith(W)&&V.charAt(W.length)==="/"),X={isActive:De,isPending:j,isTransitioning:le},Se=De?d:void 0,ce;typeof p=="function"?ce=p(X):ce=[p,De?"active":null,j?"pending":null,le?"transitioning":null].filter(Boolean).join(" ");let Te=typeof y=="function"?y(X):y;return R.createElement(ja,ui({},P,{"aria-current":Se,className:ce,ref:r,style:Te,to:h,viewTransition:v}),typeof w=="function"?w(X):w)});var _l;(function(i){i.UseScrollRestoration="useScrollRestoration",i.UseSubmit="useSubmit",i.UseSubmitFetcher="useSubmitFetcher",i.UseFetcher="useFetcher",i.useViewTransitionState="useViewTransitionState"})(_l||(_l={}));var Zc;(function(i){i.UseFetcher="useFetcher",i.UseFetchers="useFetchers",i.UseScrollRestoration="useScrollRestoration"})(Zc||(Zc={}));function Dy(i){let n=R.useContext(ls);return n||we(!1),n}function jy(i,n){let{target:r,replace:d,state:u,preventScrollReset:p,relative:g,viewTransition:y}=n===void 0?{}:n,h=Xl(),v=Vt(),w=Hn(i,{relative:g});return R.useCallback(P=>{if(uy(P,r)){P.preventDefault();let D=d!==void 0?d:Ta(v)===Ta(w);h(i,{replace:D,state:u,preventScrollReset:p,relative:g,viewTransition:y})}},[v,h,w,d,u,r,i,p,g,y])}function Lb(i){let n=R.useRef(Nl(i)),r=R.useRef(!1),d=Vt(),u=R.useMemo(()=>cy(d.search,r.current?null:n.current),[d.search]),p=Xl(),g=R.useCallback((y,h)=>{const v=Nl(typeof y=="function"?y(u):y);r.current=!0,p("?"+v,h)},[p,u]);return[u,g]}function Ey(i,n){n===void 0&&(n={});let r=R.useContext(Lp);r==null&&we(!1);let{basename:d}=Dy(_l.useViewTransitionState),u=Hn(i,{relative:n.relative});if(!r.isTransitioning)return!1;let p=jo(r.currentLocation.pathname,d)||r.currentLocation.pathname,g=jo(r.nextLocation.pathname,d)||r.nextLocation.pathname;return jn(u.pathname,g)!=null||jn(u.pathname,p)!=null}const Ty="modulepreload",Ly=function(i){return"/dashboard/"+i},Jc={},Kt=function(n,r,d){let u=Promise.resolve();if(r&&r.length>0){let g=function(v){return Promise.all(v.map(w=>Promise.resolve(w).then(P=>({status:"fulfilled",value:P}),P=>({status:"rejected",reason:P}))))};document.getElementsByTagName("link");const y=document.querySelector("meta[property=csp-nonce]"),h=(y==null?void 0:y.nonce)||(y==null?void 0:y.getAttribute("nonce"));u=g(r.map(v=>{if(v=Ly(v),v in Jc)return;Jc[v]=!0;const w=v.endsWith(".css"),P=w?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${P}`))return;const D=document.createElement("link");if(D.rel=w?"stylesheet":Ty,w||(D.as="script"),D.crossOrigin="",D.href=v,h&&D.setAttribute("nonce",h),document.head.appendChild(D),w)return new Promise((L,B)=>{D.addEventListener("load",L),D.addEventListener("error",()=>B(new Error(`Unable to preload CSS for ${v}`)))})}))}function p(g){const y=new Event("vite:preloadError",{cancelable:!0});if(y.payload=g,window.dispatchEvent(y),!y.defaultPrevented)throw g}return u.then(g=>{for(const y of g||[])y.status==="rejected"&&p(y.reason);return n().catch(p)})},Mn=window.location.origin,zy=3e3,Uy=5e3;class Hy extends Error{constructor(r,d,u=null,p=null){super(d);Io(this,"status");Io(this,"error");Io(this,"payload");this.name="ApiClientError",this.status=r,this.error=u,this.payload=p}}function My(i){var r,d;const n=(d=(r=i.headers)==null?void 0:r.get)==null?void 0:d.call(r,"content-type");return typeof n=="string"&&n.toLowerCase().includes("application/json")}async function Ny(i){if(!My(i))return null;try{const n=await i.json();if(n&&typeof n=="object")return n}catch{return null}return null}async function is(i){if(i.ok)return;const n=await Ny(i),r=typeof(n==null?void 0:n.message)=="string"&&n.message.trim().length>0?n.message:`API ${i.status}: ${i.statusText}`,d=typeof(n==null?void 0:n.error)=="string"?n.error:null;throw new Hy(i.status,r,d,n)}class _y{constructor(n){Io(this,"base");this.base=n}async get(n,r){const d=new URL(n,this.base);r&&Object.entries(r).forEach(([p,g])=>d.searchParams.set(p,g));const u=await fetch(d.toString(),{method:"GET"});return await is(u),u.json()}async patch(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await is(u),u.json()}async put(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await is(u),u.json()}async post(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"POST",headers:r?{"Content-Type":"application/json"}:{},body:r?JSON.stringify(r):void 0});return await is(u),u.json()}async delete(n){const r=new URL(n,this.base),d=await fetch(r.toString(),{method:"DELETE"});return await is(d),d.json()}}const jt=new _y(Mn);class Ql{constructor(n){Io(this,"source",null);Io(this,"handlers",new Map);Io(this,"reconnectTimer",null);Io(this,"url");this.url=n??`${Mn}/api/dashboard/events`}connect(){this.disconnect(),this.source=new EventSource(this.url),this.source.onopen=()=>{this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)},this.source.onerror=()=>{var r;(r=this.source)==null||r.close(),this.source=null,this.scheduleReconnect()};const n=["connection","sync","command","game_change","mcp_status","license"];for(const r of n)this.source.addEventListener(r,d=>{var p;const u=JSON.parse(d.data);(p=this.handlers.get(r))==null||p.forEach(g=>g(u))})}on(n,r){return this.handlers.has(n)||this.handlers.set(n,new Set),this.handlers.get(n).add(r),()=>{var d;return(d=this.handlers.get(n))==null?void 0:d.delete(r)}}disconnect(){var n;(n=this.source)==null||n.close(),this.source=null,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}get connected(){var n;return((n=this.source)==null?void 0:n.readyState)===EventSource.OPEN}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},zy))}}function Oy(i){return i.pluginClients&&i.pluginClients.length>0?"studioConnected":(i.connectedClients===0||!i.pluginClients,"serverOnly")}const zp=R.createContext(null);function qy({children:i}){const[n,r]=R.useState("disconnected"),[d,u]=R.useState(null),[p,g]=R.useState(null),y=R.useRef(null);return R.useEffect(()=>{let h=!1;async function v(){try{const D=await jt.get("/status");if(h)return;u(D),r(Oy(D)),g(null)}catch(D){if(h)return;r("disconnected"),g(D instanceof Error?D.message:String(D))}}v(),y.current=setInterval(v,Uy);const w=new Ql;w.connect();const P=w.on("connection",()=>{v()});return()=>{h=!0,y.current&&clearInterval(y.current),P(),w.disconnect()}},[]),x.jsx(zp.Provider,{value:{level:n,status:d,error:p},children:i})}function Nn(){const i=R.useContext(zp);if(!i)throw new Error("useConnection must be used within a ConnectionProvider");return i}const By={"sidebar.overview":"Overview","sidebar.changelog":"Changelog","sidebar.connection":"Connection","sidebar.sync":"Sync","sidebar.playtest":"Playtest","sidebar.tools":"Tools","sidebar.settings":"Settings","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP server connection required","sidebar.gate.l2":"Roblox Studio plugin connection required","header.currentProject":"Current Project","header.unknownProject":"Unknown project","header.projectRoot.label":"Project Root","header.currentProject.loading":"Loading project root...","header.currentProject.unavailable":"Project root unavailable","header.placeNotConnected":"Place not connected","header.currentProject.tooltip":"Currently selected project folder","header.currentProject.loading.tooltip":"Project root information is still loading","header.currentProject.unavailable.tooltip":"Current project root information is unavailable","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Loading sync root...","header.currentProjectSyncRoot.unavailable":"Sync root unavailable","header.currentProjectSyncRoot.tooltip":"Current sync root folder for the selected project","header.currentProjectSyncRoot.loading.tooltip":"Sync root information is still loading","header.currentProjectSyncRoot.unavailable.tooltip":"Current sync root information is unavailable","header.testFiles.label":"Test Files","header.testFiles.unavailable":"Test files unavailable","header.testFiles.tooltip":"Current playtest files directory for the selected place","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Plugin connection required","header.places.liveRequired":"Plugin connection required for live active place","header.place.tooltip":"Connected Roblox place","header.placeNotConnected.tooltip":"Place not connected","placeScope.current.label":"Current Place","placeScope.lastActive.label":"Last Active Place","placeScope.selected.label":"Selected Place","placeScope.unknownPlace":"Unknown place","placeScope.live":"Live","placeScope.stored":"Stored","placeScope.pluginRequired":"Plugin required","placeScope.pluginRequired.note":"Connect WEPPY Plugin to confirm the live active place.","placeScope.noPlace.label":"Place scope","placeScope.noPlace.value":"No place data available yet","placeScope.noPlace.badge":"No place","placeScope.noPlace.note":"Connect WEPPY Plugin and sync a place to create place-scoped data.","placeScope.selected.note":"Showing stored data only. Studio routing is unchanged.","placeScope.surface.sync":"Sync status and logs use this place.","placeScope.surface.changelog":"Changelog sessions use this place.","placeScope.surface.playtest":"Playtest reports use this place.","placeScope.surface.uiStudio":"UI captures and change history use this place.","placeScope.surface.tools":"Tool history and statistics use this place.","placeScope.loading":"Loading place scope...","placeScope.unavailable":"Place scope unavailable","placeScope.selector.label":"Place data","header.changeProjectRoot":"Change Project Root","header.changeProjectRoot.ariaLabel":"Change project root","header.changeProjectRoot.tooltip":"Change the current project root","header.changeProjectRoot.disabledTooltip.l0":"MCP server connection required before project root can be changed","header.changeProjectRoot.disabledTooltip.loading":"Project root information is still loading","header.changeProjectRoot.disabledTooltip.unavailable":"Current project root information is unavailable","header.projectRootModal.initial.title":"Change project root","header.projectRootModal.initial.body.connected":"After you choose a project folder, MCP will switch to the new project root and the current Studio contents will be fully resynced into the new <selected project folder>/weppy-project-sync target.","header.projectRootModal.initial.body.disconnected":"After you choose a project folder, MCP will switch to the new project root and use <selected project folder>/weppy-project-sync as the next sync target.","header.projectRootModal.initial.nextSyncRoot":"New sync target after selection","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Current sync stops immediately.","header.projectRootModal.initial.warningFreshSync":"The current Studio contents will be used to build a fresh full sync in the new target.","header.projectRootModal.initial.warningNoMove":"Old sync folders are not moved automatically.","header.projectRootModal.initial.warningDeferredSync":"If Studio is not connected, full resync starts the next time the plugin connects.","header.projectRootModal.confirm.title":"Confirm new project root","header.projectRootModal.confirm.body":"Review the selected project folder before applying.","header.projectRootModal.confirm.projectRoot":"Selected project folder","header.projectRootModal.confirm.syncRoot":"New sync target","header.projectRootModal.confirm.warningNoMove":"Existing sync folders are not moved automatically.","header.projectRootModal.pick":"Choose folder","header.projectRootModal.apply":"Apply change","header.projectRootModal.cancel":"Cancel","header.projectRootModal.error":"Failed to change project root","status.online":"Online","status.offline":"Offline","status.idle":"Idle","status.syncing":"Syncing","status.error":"Error","status.initializing":"Initializing","level.l0.title":"Server disconnected","level.l0.message":"WEPPY Dashboard opened but MCP server has stopped or is not responding.","level.l1.title":"Server connected","level.l1.hint":"Check: Is Roblox Studio running? Is the plugin installed?","level.l2.ok":"Studio connected","tier.basic":"Basic","tier.basic.tooltip":"Basic tier with the standard WEPPY Dashboard feature set.","tier.pro":"Pro","tier.pro.tooltip":"Pro tier with the full WEPPY Dashboard feature set.","tier.mixed":"Mixed","tier.upgrade":"View Pro","tier.banner.save":"Save AI tokens with Pro!","tier.tool.query_instances.desc":"Inspect instances, search children and descendants, and inspect class data. Pro adds file tree, project structure, and property or tag search.","tier.tool.mutate_instances.desc":"Create, delete, clone, and move instances. Pro adds tree creation and bulk create, delete, or clone operations.","tier.tool.manage_properties.desc":"Read and set properties, attributes, and tags. Pro adds calculated updates, relative changes, and bulk property operations.","tier.tool.manage_scripts.desc":"Read, write, create, delete, edit, and search script source. Pro adds bulk replacement across scripts.","tier.tool.manage_ui.desc":"Pro only. Create or refine game-style menus, HUDs, buttons, labels, and image panels, then capture screens and review improvement suggestions.","tier.tool.manage_ui.action.design_brief":"Plan UI direction","tier.tool.manage_ui.action.create_tree":"Create new UI","tier.tool.manage_ui.action.update":"Update existing UI","tier.tool.manage_ui.action.delete":"Remove UI","tier.tool.manage_ui.action.preview":"Capture UI screen","tier.tool.manage_ui.action.check":"Review improvement suggestions","tier.tool.manage_lighting.desc":"Pro only. Configure lighting, atmosphere, sky, terrain properties, and time-of-day settings.","tier.tool.manage_selection.desc":"Read, set, and clear the current Studio selection. Pro adds context, details, add or remove, and selection watch support.","tier.tool.manage_camera.desc":"Inspect camera state, focus by path or position, and request suggested views.","tier.tool.manage_tween.desc":"Pro only. Create, play, pause, and cancel tweens for smooth animation.","tier.tool.manage_audio.desc":"Pro only. Play, stop, pause, and resume sounds, and configure the audio listener.","tier.tool.manage_animation.desc":"Pro only. Load, play, and stop animations, and inspect active animation tracks.","tier.tool.manage_physics.desc":"Pro only. Register collision groups, configure group collisions, and inspect available groups.","tier.tool.manage_effects.desc":"Pro only. Emit particles, clear effects, and toggle effect state.","tier.tool.manage_terrain.desc":"Pro only. Fill terrain shapes, clear regions, replace materials, manage terrain colors, read or write voxels, generate terrain, and smooth terrain.","tier.tool.spatial_query.desc":"Pro only. Run raycasts, find ground, validate placement, scan areas, search for flat or spawn positions, analyze walkability, map space, and inspect collisions.","tier.tool.manage_assets.desc":"Pro only. Insert models, inspect asset info, search the creator store, insert free assets or packages, and export assets.","tier.tool.manage_sync.desc":"Pro only. Inspect sync status, configuration, history, directions, and read or write synced files.","tier.tool.workspace_state.desc":"Pro only. Run full sync, capture snapshots, inspect recent changes and viewport state, and manage related metadata.","tier.tool.manage_logs.desc":"Inspect output logs with filtering, incremental polling, buffer clearing, and recent error lookup.","tier.tool.system_info.desc":"Inspect connection status and current tier. Pro adds place info, services, Studio settings, playtest control, and automated tests.","tier.tool.manage_studio.desc":"Pro only. Toggle Studio editor view settings such as UI preview for screenshot and QA workflows; it changes Studio session settings, not game UI objects.","tier.tool.batch_execute.desc":"Pro only. Run multiple commands in a batch, with sequential execution and optional continue-on-error behavior.","tier.tool.execute_luau.desc":"Pro only. Execute arbitrary Luau code inside the Roblox Studio sandbox.","connection.server.title":"Server Status","connection.server.version":"Version","connection.server.version.tooltip":"Installed MCP server version","connection.server.pid":"PID","connection.server.pid.tooltip":"Operating system process identifier","connection.server.uptime":"Uptime","connection.server.uptime.tooltip":"Time elapsed since the MCP server started","connection.server.session":"Session","connection.server.session.tooltip":"Current MCP session identifier","connection.server.exec":"Exec","connection.server.exec.tooltip":"Executable path used to launch the MCP server","connection.reconnect":"Reconnect","connection.checkSettings":"Check Settings","connection.agents.title":"AI Agents","connection.agents.name":"Agent","connection.agents.cwd":"Working Dir","connection.agents.cwd.tooltip":"Current working directory for the connected AI agent","connection.agents.projectRoot":"Project Root","connection.agents.projectRoot.tooltip":"Authoritative project root for sync ownership","connection.agents.projectRoot.unresolved":"Unresolved","connection.agents.connected":"Connected","connection.agents.unknown":"Unknown","connection.agents.none":"No agents connected","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Last Seen","connection.plugins.lastSeen.tooltip":"Most recent heartbeat received from the plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Installed plugin version reported by Studio","connection.plugins.none":"No plugins connected","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test connection","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Connection Log","connection.log.empty":"No events yet","connection.time.secondsAgo":"s ago","connection.time.minutesAgo":"m ago","connection.time.hoursAgo":"h ago","common.loading":"Loading...","common.retry":"Retry","common.reconnecting":"Reconnecting...","common.expand":"Expand","common.collapse":"Collapse","tools.tab.history":"History","tools.tab.statistics":"Statistics","tools.tab.failures":"Failures","tools.col.time":"Time","tools.col.time.tooltip":"When the tool run was recorded.","tools.col.toolAction":"Tool.Action","tools.col.toolAction.tooltip":"Tool name and action that were executed.","tools.col.duration":"Duration","tools.col.duration.tooltip":"How long the tool took to finish.","tools.col.status":"Status","tools.col.status.tooltip":"Outcome of the recorded tool run.","tools.col.tier":"Tier","tools.col.tier.tooltip":"License tier required for the tool or action.","tools.col.tierStats.tooltip":"Basic, Pro, or Mixed summary for the tool statistics row.","tools.col.tool":"Tool","tools.col.tool.tooltip":"Consolidated tool name in the statistics table.","tools.col.calls":"Calls","tools.col.calls.tooltip":"Total number of recorded calls for this tool.","tools.col.ok":"OK","tools.col.ok.tooltip":"Number of direct successful runs.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Number of runs that succeeded through fallback execution.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Number of blocked runs without fallback execution.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Number of expected failures caused by caller input, project state, Roblox policy, or user code.","tools.col.err":"FAILED","tools.col.err.tooltip":"Number of runs that failed.","tools.col.okRate":"OK%","tools.col.okRate.tooltip":"Percentage of calls that finished successfully.","tools.col.avgTime":"Avg Time","tools.col.avgTime.tooltip":"Average execution time across recorded calls.","tools.col.error":"Error","tools.filter.tool":"Tool","tools.filter.all":"All","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"This entry used a Pro-only tool or action.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"The requested Pro action succeeded via a Basic fallback.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"The requested Pro action was blocked and no fallback ran.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"The tool call failed as an expected caller, project, policy, or user-code issue.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"The tool run failed.","tools.status.ok":"OK","tools.status.ok.tooltip":"The tool run completed successfully.","tools.tier.mixed.tooltip":"This tool includes both Basic and Pro actions.","tools.detail.params":"Parameters","tools.detail.params.tooltip":"Input parameters passed to this tool run.","tools.detail.result":"Result","tools.detail.result.tooltip":"Returned result payload for this tool run.","tools.detail.requestedCommand":"Command Sent","tools.detail.executedCommand":"Executed Command","tools.detail.alternatives":"Alternatives","tools.detail.blockedMessage":"Blocked Reason","tools.detail.noFallback":"No Fallback","tools.detail.noFallback.value":"No fallback ran.","tools.detail.warningMessage":"Warning Message","tools.detail.errorMessage":"Error Message","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Clear history?","tools.clear.history.message":"This permanently removes the current place tools history.","tools.clear.statistics.title":"Clear statistics?","tools.clear.statistics.message":"This permanently resets the current place tool statistics.","tools.detail.error":"Error","tools.page.prev":"Prev","tools.page.prev.tooltip":"Go to the previous page of tool history results.","tools.page.next":"Next","tools.page.next.tooltip":"Go to the next page of tool history results.","tools.empty.history":"No history entries","tools.empty.stats":"No tool statistics","tools.empty.failures":"No failures","tools.summary.total":"Total","tools.summary.calls":"calls","tools.summary.sessions":"Sessions","settings.license.title":"License","settings.license.title.tooltip":"Current license status and subscription tier.","settings.license.status":"Status","settings.license.status.tooltip":"Current license activation state.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Current subscription tier for available WEPPY Dashboard features.","settings.license.key":"Key","settings.license.key.tooltip":"Masked license key currently loaded by the server.","settings.license.keyValue.tooltip":"Masked license key currently loaded by the server.","settings.license.provider":"Provider","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"License provider used to validate this key.","settings.license.providerValue.tooltip":"License provider used to validate this key.","settings.license.active":"Active","settings.license.active.tooltip":"Current license activation state.","settings.license.status.activeCancelPending.tooltip":"Cancellation is pending, but Pro access remains active until the current billing period ends.","settings.license.inactive":"Inactive","settings.license.inactive.tooltip":"Current license activation state.","settings.license.expired":"Expired","settings.license.expired.tooltip":"Current license activation state.","settings.license.unavailable":"License info unavailable","settings.license.detail.cancelPending":"Cancellation is scheduled. Pro access remains active until the current billing period ends.","settings.license.reset":"Reset License","settings.readOnly":"Read-only","settings.readOnly.tooltip":"This section shows values that cannot be edited from the WEPPY Dashboard.","settings.unavailable":"Settings unavailable","settings.general.title":"General Settings","settings.general.title.tooltip":"Hot settings that apply immediately when changed.","settings.general.liveApply":"Live Apply","settings.general.liveApply.tooltip":"Changes in this section are applied immediately without a separate save button.","settings.general.applied":"Applied","settings.general.logLevel":"Log Level","settings.general.logLevel.tooltip":"Choose how much detail the MCP server writes to logs. Lower to ‘debug’ when tracking down a problem.","settings.general.localHistory":"Tool History Recording","settings.general.localHistory.tooltip":"Save AI tool runs to disk. Required for the Tools and History pages.","settings.general.localStatistics":"Tool Statistics Collection","settings.general.localStatistics.tooltip":"Aggregate tool usage counts. Used by the Overview statistics.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"Save structured execution context so the Changelog and Playtest views can render it.","settings.general.requestTimeout":"Action Timeout","settings.general.requestTimeout.tooltip":"Maximum time (in ms) to wait for a single tool action before failing.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Action timeout is measured in milliseconds.","settings.cold.title":"Server Environment","settings.cold.title.tooltip":"Read-only server environment values loaded at startup.","settings.cold.httpPort.tooltip":"Port number used by the MCP WEPPY Dashboard HTTP server.","settings.cold.httpHost.tooltip":"Host interface that the MCP WEPPY Dashboard HTTP server binds to.","settings.cold.dashboardAutoOpen.tooltip":"Controls whether the WEPPY Dashboard opens automatically in the browser when the server starts.","settings.cold.dashboardAutoOpen.value.tooltip":"Current startup behavior for opening the WEPPY Dashboard in a browser.","settings.cold.hint":"Set via environment variables to change these values.","settings.language.title":"Language","settings.language.title.tooltip":"Choose how the WEPPY Dashboard interface text is localized.","settings.language.dashboard":"WEPPY Dashboard Language","settings.language.dashboard.tooltip":"Overrides the WEPPY Dashboard language or follows the system language when set to Auto.","settings.language.auto":"Auto","overview.l0.title":"MCP Server Disconnected","overview.l0.message":"The MCP server is not responding. The WEPPY Dashboard will automatically attempt to reconnect.","overview.l0.step1":"Check that the MCP server process is running","overview.l0.step2":"Restart the MCP server command if needed","overview.l0.reconnecting":"Auto-reconnecting every 3s...","overview.l0.reconnectBtn":"Reconnect","overview.l0.settingsBtn":"Check Settings","overview.l1.pluginGuide":"Roblox Studio plugin is not connected","overview.l1.check1":"Is Roblox Studio running?","overview.l1.check2":"Is the WEPPY Plugin installed?","overview.l1.feedHint":"Changes will appear here once the plugin connects","overview.metric.server":"Server","overview.metric.server.tooltip":"MCP server runtime and process status","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Roblox Studio plugin connection and version status","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Connected AI coding agents and their runtime state","overview.metric.agent.instancesUnit":"instances","overview.metric.sync":"Sync","overview.metric.sync.tooltip":"Current Studio to local sync activity","overview.metric.noAgent":"No Agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Installed MCP server version","overview.meta.session":"Session","overview.meta.session.tooltip":"Current MCP session identifier","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Operating system process identifier","overview.meta.uptime":"Uptime","overview.meta.uptime.tooltip":"Time elapsed since the MCP server started","overview.feed.title":"Recent Game Changes","overview.feed.empty":"No recent changes","overview.changelog.title":"Session Change Summary","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instances","overview.changelog.properties":"properties","overview.changelog.assets":"assets","overview.tier.title":"Tier Usage","changelog.subtitle":"Game Change History","changelog.filter.all":"All","changelog.filter.active":"Active","changelog.filter.completed":"Completed","changelog.empty":"No changelog entries yet","changelog.basic.limit.title":"Basic preview shows the latest 3 sessions","changelog.basic.limit.body":"Full changelog timeline browsing is available with Pro.","changelog.basic.metricLabel":"Visible Changelog / Total","changelog.basic.visible":"visible","changelog.basic.total":"total","changelog.card.active":"Active","changelog.card.active.tooltip":"This session is still receiving new game changes.","changelog.card.completed":"Completed","changelog.card.completed.tooltip":"This session has ended and no more changes are expected.","changelog.card.bootstrapStatus":"Bootstrap","changelog.card.bootstrapStatus.tooltip":"This session only contains the initial sync bootstrap snapshot.","changelog.card.inProgress":"in progress","changelog.card.noChanges":"No changes yet","changelog.card.noChanges.tooltip":"No game changes have been extracted for this session yet.","changelog.card.bootstrapSummary":"Initial sync snapshot","changelog.card.bootstrapSummary.tooltip":"Initial file sync writes are collapsed into a single bootstrap snapshot row.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Script changes made in this session.","changelog.card.instances":"instances","changelog.card.instances.tooltip":"Instance create, delete, move, or clone changes in this session.","changelog.card.modified":"modified","changelog.card.created":"created","changelog.card.deleted":"deleted","changelog.card.moved":"moved","changelog.card.propertiesChanged":"properties changed","changelog.card.propertiesChanged.tooltip":"Property value changes recorded for this session.","changelog.card.lightingConfigured":"Lighting configured","changelog.card.lightingConfigured.tooltip":"Lighting or atmosphere settings changed in this session.","changelog.card.terrainConfigured":"Terrain configured","changelog.card.terrainConfigured.tooltip":"Terrain data or terrain settings changed in this session.","changelog.card.assetsInserted":"assets inserted","changelog.card.assetsInserted.tooltip":"Assets inserted into the place during this session.","changelog.category.script":"Scripts","changelog.category.instance":"Instances","changelog.category.property":"Properties","changelog.category.lighting":"Lighting","changelog.category.terrain":"Terrain","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Change Summary","changelog.detail.changeSummary.tooltip":"Counts of extracted game changes grouped by category for this session.","changelog.detail.changeTimeline":"Change Timeline","changelog.detail.changeTimeline.tooltip":"Chronological list of extracted game changes for this session.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Before & After","changelog.detail.filterCategory":"Category","changelog.detail.filterCategory.tooltip":"Filter the timeline to a single change category.","changelog.detail.confidence.exact":"Exact","changelog.detail.confidence.exact.tooltip":"Both the before and after state were confirmed for this change.","changelog.detail.confidence.partial":"Partial","changelog.detail.confidence.partial.tooltip":"Only part of the before and after state could be confirmed for this change.","changelog.detail.confidence.afterOnly":"After only","changelog.detail.confidence.afterOnly.tooltip":"Only the resulting state after the change could be confirmed.","changelog.detail.confidence.intentOnly":"Intent only","changelog.detail.confidence.intentOnly.tooltip":"Only the requested action was recorded, not the resulting state.","changelog.detail.confidence.unknown":"Unknown","changelog.detail.confidence.unknown.tooltip":"This change could not be confidently classified from the available data.","changelog.detail.noChanges":"No changes in this category","changelog.detail.backToList":"Back to list","changelog.diff.empty":"No diff available","changelog.diff.unified":"Unified","changelog.diff.sideBySide":"Side by Side","changelog.diff.before":"Before","changelog.diff.after":"After","sync.overlay.title":"Roblox Studio plugin required","sync.overlay.message":"Sync status will be available once the Roblox Studio plugin connects.","sync.overlay.check1":"Is Roblox Studio running?","sync.overlay.check2":"Is the WEPPY Plugin installed?","sync.status.title":"Sync Status","sync.status.title.tooltip":"Current Studio and local file sync status for this place.","sync.status.forwardOnly":"Forward Only","sync.status.forwardOnly.tooltip":"Basic tier allows Studio to local forward sync only.","sync.status.place":"Place","sync.status.place.tooltip":"Connected Roblox place name and place ID.","sync.status.path":"Path","sync.status.path.tooltip":"Local filesystem root currently used for sync output.","sync.status.instances":"Instances","sync.status.instances.tooltip":"Total synced Roblox instances tracked in the local mirror.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Total synced script files currently indexed for this place.","sync.status.state":"State","sync.status.state.tooltip":"Current runtime sync state reported by the server.","sync.directions.title":"Sync Directions","sync.directions.title.tooltip":"Per-category sync direction and apply behavior between Local and Studio.","sync.directions.type":"Type","sync.directions.type.tooltip":"Sync category affected by this rule.","sync.directions.direction":"Direction","sync.directions.direction.tooltip":"Whether each category syncs from Studio, to Studio, or both ways.","sync.directions.applyMode":"Apply Mode","sync.directions.applyMode.tooltip":"How incoming sync changes are applied for this category.","sync.directions.deletePolicy":"Delete Policy","sync.directions.deletePolicy.tooltip":"Controls whether local file deletes can remove matching Studio instances automatically.","sync.directions.deletePolicy.ask":"Ask Before Delete","sync.directions.deletePolicy.ask.tooltip":"Deleted local files are reviewed before Studio instances are removed.","sync.directions.deletePolicy.auto":"Auto Delete","sync.directions.deletePolicy.auto.tooltip":"Deleted local files can remove matching Studio instances automatically.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Values","sync.directions.cat.containers":"Containers","sync.directions.cat.data":"Data","sync.directions.cat.services":"Services","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"Local files on disk are always shown on the left side of the direction rail.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio is always shown on the right side of the direction rail.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Applies sync changes only when you trigger them manually.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Applies sync changes automatically when updates arrive.","sync.directions.tooltip.forward.body":"Studio changes sync to local files only","sync.directions.tooltip.bidirectional.body":"Two-way sync between Local and Studio","sync.directions.tooltip.reverse.body":"Push local file changes to Studio","sync.directions.tooltip.proRequired":"Pro required in Basic tier","sync.directions.dir.forward":"forward","sync.directions.dir.bidirectional":"bidirectional","sync.directions.dir.reverse":"reverse","sync.log.title":"Sync Log","sync.log.empty":"No sync events yet","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"A new sync output was written to disk.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"An existing synced file or instance was updated.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"A synced file or instance was removed.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"A sync event was recorded without a file mutation.","sync.upgrade.title":"Explore Full Sync with Pro","sync.upgrade.benefit1":"Bidirectional sync — edit files, auto-apply to Studio","sync.upgrade.benefit2":"Reverse sync — push file changes back to Studio","sync.upgrade.benefit3":"Full sync history and detailed change log","sync.upgrade.buy":"View Pro","playtest.status.title":"Playtest Status","playtest.status.title.tooltip":"Current Roblox playtest session state reported by Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Studio playtest launch mode for the current session.","playtest.status.mode.value.tooltip":"Specific Roblox Studio playtest mode currently in use.","playtest.status.mode.play":"Play","playtest.status.mode.run":"Run","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Roblox place currently associated with this playtest session.","playtest.status.state.running":"Running","playtest.status.state.running.tooltip":"A Roblox playtest session is currently running.","playtest.status.state.paused":"Paused","playtest.status.state.paused.tooltip":"The current Roblox playtest session is paused.","playtest.status.state.notRunning":"Not Running","playtest.status.state.notRunning.tooltip":"No Roblox playtest session is currently running.","playtest.control.play":"Play","playtest.control.pause":"Pause","playtest.control.resume":"Resume","playtest.control.stop":"Stop","playtest.history.title":"Test History","playtest.history.title.tooltip":"Recorded automated playtest runs for this project.","playtest.history.empty":"No test results yet","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Playtest mode used for this recorded test run.","playtest.history.status.passed":"Passed","playtest.history.status.failed":"Failed","playtest.history.status.running":"Running","playtest.history.status.unknown":"Unknown","playtest.history.status.tooltip":"Recorded result state for this automated playtest run.","playtest.empty.title":"No playtest results yet","playtest.empty.message":"Test results will appear here after the AI Agent runs a Playtest.","playtest.empty.message.before":"Test results will appear here after the AI Agent runs a Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Selected Report","playtest.report.title.tooltip":"Detailed output for the currently selected automated playtest run.","playtest.report.content":"Report","playtest.report.content.tooltip":"Markdown summary for the selected automated playtest run.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Execution logs captured for the selected automated playtest run.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"No report content available","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest is a Pro-only feature","playtest.basic.desc":"Control playtesting from the WEPPY Dashboard, run automated tests, and view detailed test reports.","playtest.basic.benefit1":"One-click play/pause/stop controls","playtest.basic.benefit2":"Automated test execution via AI agent","playtest.basic.benefit3":"Test history with pass/fail tracking","playtest.basic.benefit4":"Detailed markdown test reports","playtest.sample.badge":"Preview of the Pro playtest view","playtest.sample.title":"You are previewing the playtest screen that becomes available after upgrading to Pro.","playtest.sample.message":"This preview uses sample data. Live playtest control, history management, and real reports unlock with Pro.","playtest.sample.clearDisabled":"Available with Pro for live playtest history.","playtest.sample.place":"Arena Preview","playtest.sample.history.name":"Sample Arena Smoke Test","playtest.sample.context.why":"Spawn into the arena, survive the opener, and verify the HUD responds immediately.","playtest.sample.context.expected":"The player spawns safely, the countdown UI appears within one second, and the first wave starts without errors.","playtest.sample.context.observed":"Spawn protection held, the HUD updated on time, and wave one completed with no gameplay regressions.","playtest.sample.report.markdown":`# Sample Arena Smoke Test
70
70
 
71
71
  - Spawn flow: PASS
72
72
  - HUD countdown: PASS
@@ -136,7 +136,7 @@ Dies ist eine Beispielvorschau. Upgraden Sie auf Pro, um Live-Playtests auszufü
136
136
  [sample] spawn protection active
137
137
  [sample] hud countdown rendered
138
138
  [sample] wave one completed
139
- [sample] preview report finished`,"sidebar.whatsNew":"Neuigkeiten","sidebar.help.group":"Hilfe & Feedback","sidebar.help.bug":"Fehler melden","sidebar.help.bug.tooltip":"Lokales Diagnosepaket erstellen und einen vorausgefuellten Fehlerbericht auf GitHub oeffnen","bugReportDialog.title":"diagnostics.zip kann bei der Fehlersuche helfen","bugReportDialog.subtitle":"WEPPY hat auf diesem Computer eine Diagnose-Zip erstellt. Sie enthält Studio-, Plugin-, Sync- und Tool-Logs, die uns helfen können zu verstehen, was passiert ist.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Du kannst den Bug Report auch ohne diese Datei senden, aber mit der Zip finden wir die Ursache meist schneller.","bugReportDialog.attachHow":"Lade die Zip herunter oder öffne ihren Speicherort und füge sie vor dem Absenden im Feld Diagnostics ZIP (optional) des GitHub-Issues hinzu.","bugReportDialog.download":"1. diagnostics.zip herunterladen","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. GitHub-Issue öffnen","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Die Zip kann lokale Logs und Projektkontext enthalten. Prüfe sie vor dem Anhängen, wenn du sie teilen möchtest.","sidebar.help.feature":"Feature vorschlagen","sidebar.help.feature.tooltip":"Neues Feature oder Verbesserung auf GitHub vorschlagen","sidebar.help.discussions":"Hilfe zu Installation und Nutzung","sidebar.help.discussions.tooltip":"Hilfe zu Installation oder Nutzung über GitHub Issues anfragen","sidebar.help.troubleshooting":"Leitfaden zur Fehlerbehebung","sidebar.help.troubleshooting.tooltip":"Offiziellen Troubleshooting-Leitfaden auf weppyai.com öffnen","header.whatsNew":"Neuigkeiten","header.whatsNew.tooltip":"Neuigkeiten","upgrade.title":"Pro ansehen","upgrade.tagline":"Pro-Funktionen ansehen","upgrade.cta":"Pro ansehen","upgrade.licenseShortcut":"Lizenz eingeben","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Neuigkeiten","whatsNew.pageSubtitle":"Bleiben Sie über MCP-Änderungen auf dem Laufenden","whatsNew.unreadSection":"Ungelesen","whatsNew.allSection":"Alle Ankündigungen","whatsNew.empty":"Noch keine Ankündigungen","whatsNew.newBadge":"NEU","whatsNew.importantBadge":"WICHTIG","whatsNew.category.release":"Release","whatsNew.category.notice":"Hinweis","whatsNew.category.deprecation":"Veraltet","whatsNew.category.tip":"Tipp","uiStudio.title":"UI Studio","uiStudio.empty":"Noch keine Screenshots gespeichert. Sie werden automatisch erstellt, wenn ein KI-Agent den aktuellen UI-Zustand erfasst.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio Plugin ist nicht verbunden","uiStudio.pluginGuide.message":"UI Studio zeigt Screenshots und Änderungsverlauf aus dem verbundenen Studio-Place. Es wird automatisch aktualisiert, sobald Studio und das WEPPY Plugin verbunden sind.","uiStudio.pluginGuide.check1":"Läuft Roblox Studio?","uiStudio.pluginGuide.check2":"Ist das WEPPY Plugin installiert und aktiv?","uiStudio.pluginGuide.waiting":"Warten auf Plugin-Verbindung...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Zuerst prüfen","uiStudio.priorityLow":"Optionale Verbesserung","uiStudio.highPrioritySection":"Zuerst prüfen","uiStudio.lowPrioritySection":"Optionale Verbesserungen","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Verlauf","uiStudio.analysis.reportsTitle":"Neueste Analyse nach UI-Ziel","uiStudio.analysis.recentCapturesTitle":"Letzte Aufnahmen","uiStudio.analysis.detailDialog":"Analysedetails","uiStudio.analysis.targetCountLabel":"Analysierte Ziele","uiStudio.analysis.captureLabel":"Aufnahmen","uiStudio.analysis.verdict.hasSuggestions":"Verbesserungsvorschläge","uiStudio.analysis.verdict.needsFix":"Verbesserungsvorschläge","uiStudio.analysis.verdict.review":"Verbesserungsvorschläge","uiStudio.analysis.verdict.passed":"Keine aktuellen Vorschläge","uiStudio.analysis.verdictLabel":"Verbesserungsübersicht","uiStudio.analysis.thresholds":"Prüfgrundlage","uiStudio.analysis.issueSummary.passed":"Auf der aktuellen Prüfgrundlage gibt es keine weiteren Verbesserungsvorschläge.","uiStudio.history.title":"Änderungsverlauf","uiStudio.history.empty":"Noch kein Verlauf vorhanden. Wenn ein KI-Agent die UI mit manage_ui ändert, wird es automatisch aufgezeichnet.","uiStudio.history.loading":"Wird geladen...","uiStudio.history.loadingPlace":"Aktueller Place wird geladen...","uiStudio.history.noPlace":"Für den aktuellen Place sind noch keine Daten verfügbar. Verbinde das WEPPY Plugin und synchronisiere einen Place, um den UI-Änderungsverlauf anzuzeigen.","uiStudio.history.noPlaceAction":"Der aktuelle Place ist noch nicht verfügbar.","uiStudio.history.error":"Fehler","uiStudio.history.clear":"Alles löschen","uiStudio.history.filter.actions":"Aktionstyp","uiStudio.history.filter.actionAll":"Alle","uiStudio.history.filter.actionCreate":"Erstellen","uiStudio.history.filter.actionUpdate":"Aktualisieren","uiStudio.history.filter.actionDelete":"Löschen","uiStudio.history.filter.period":"Zeitraum","uiStudio.history.filter.dateAll":"Alle","uiStudio.history.filter.today":"Heute","uiStudio.history.filter.yesterday":"Gestern","uiStudio.history.filter.last7Days":"Letzte 7 Tage","uiStudio.history.filter.last30Days":"Letzte 30 Tage","uiStudio.history.filter.customRange":"Eigener Zeitraum","uiStudio.history.filter.reset":"Zurücksetzen","uiStudio.history.filter.from":"Von","uiStudio.history.filter.to":"Bis","uiStudio.history.row.affectedPaths":"Pfade","uiStudio.history.row.mutations":"Änderungsdetails","uiStudio.history.row.expand":"▾ Erweitern","uiStudio.history.row.collapse":"▲ Einklappen","uiStudio.history.row.expandDetails":"{n} Änderungen anzeigen","uiStudio.history.row.collapseDetails":"Änderungen ausblenden","uiStudio.history.row.toggleDetails":"Änderungsdetails umschalten","uiStudio.history.row.mutationsEmpty":"Keine Änderungsdetails","uiStudio.history.row.toolLabel":"UI-Änderungen ({n})","uiStudio.history.row.compare":"Vorher / Nachher","uiStudio.history.row.noBeforeState":"Kein Vorher-Zustand","uiStudio.history.row.noAfterState":"Kein Nachher-Zustand","uiStudio.history.row.qualityPlan":"Designrichtung","uiStudio.history.row.designCheck":"Vorschläge","uiStudio.history.row.designCheckUnavailable":"Vorschläge: nicht verfügbar","uiStudio.history.row.designCheckNone":"Vorschläge: keine","uiStudio.history.selection.deleteSelected":"Ausgewählte löschen","uiStudio.history.selection.selectAll":"Alle auswählen","uiStudio.history.selection.clearSelection":"Auswahl aufheben","uiStudio.history.confirm.deleteRequestsTitle":"Änderungsprotokolle löschen","uiStudio.history.confirm.deleteRequestsMessage":"Die ausgewählten Änderungsprotokolle werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.history.confirm.clearRequestsTitle":"Änderungsverlauf löschen","uiStudio.history.confirm.clearRequestsMessage":"Der Änderungsverlauf des aktuellen Place wird gelöscht. Studio-Instanzen sind nicht betroffen.","uiStudio.history.confirm.cascadeOption":"Verknüpfte Screenshots ebenfalls löschen","uiStudio.history.drawer.close":"Schließen","uiStudio.actions.previewAgain":"Erneut vorschau","uiStudio.actions.deleteSnapshot":"Diesen Screenshot löschen","uiStudio.actions.proRequired":"Nach Pro-Upgrade verfügbar","uiStudio.actions.captureCurrentState":"Aktuellen Zustand erfassen","uiStudio.actions.checkSuggestionsAgain":"Vorschläge erneut prüfen","uiStudio.actions.previewRunning":"Wird erfasst…","uiStudio.actions.previewRunningDetail":"Nach Abschluss wird die neue Screenshot-Datei-ID angezeigt.","uiStudio.actions.previewNeedsSaveCheck":"Erfassung abgeschlossen, Speicherung prüfen","uiStudio.actions.previewSaved":"Neuer Screenshot gespeichert","uiStudio.actions.previewComplete":"Erfassung abgeschlossen","uiStudio.actions.previewSavedDetail":"Vorhandene Screenshots bleiben erhalten; dies wurde als neue Datei gespeichert.","uiStudio.actions.previewSavedPathMissing":"Eine neue Screenshot-ID wurde zurückgegeben, aber der Speicherpfad konnte nicht bestätigt werden.","uiStudio.actions.previewSnapshotIdMissing":"Die neue Screenshot-ID konnte nicht bestätigt werden. Aktualisiere die Liste, um zu prüfen, ob sie gespeichert wurde.","uiStudio.actions.more":"Mehr","uiStudio.gallery.selection.selectedCount":" ausgewählt","uiStudio.confirm.deleteSnapshotTitle":"Screenshot löschen","uiStudio.confirm.deleteSnapshotMessage":"Nur diese Screenshot-Datei wird gelöscht (Studio-Instanz bleibt erhalten).","uiStudio.confirm.deleteBatchTitle":"Ausgewählte Screenshots löschen","uiStudio.confirm.deleteBatchMessage":"Die ausgewählten Screenshots werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.gallery.selectMode":"Auswählen","uiStudio.gallery.exitSelectMode":"Abbrechen","uiStudio.gallery.selectAll":"Alle auswählen","uiStudio.gallery.clearSelection":"Auswahl aufheben","uiStudio.gallery.deleteSelected":"Auswahl löschen","common.save":"Speichern","common.cancel":"Abbrechen","common.delete":"Löschen","uiStudio.storage.title":"Gespeicherte UI Studio-Daten","uiStudio.storage.usageLabel":"In Verwendung","uiStudio.storage.historyBytes":"Verlauf","uiStudio.storage.snapshotBytes":"Screenshots","uiStudio.storage.requestCount":"Änderungsprotokolle","uiStudio.storage.mutationCount":"Änderungsdetails","uiStudio.storage.snapshotCount":"Screenshots","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Letzte automatische Bereinigung","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"freigegeben","uiStudio.storage.lastRunErrors":"Fehler","uiStudio.storage.loading":"Lädt...","uiStudio.cleanup.policy.title":"Richtlinie zur automatischen Löschung","uiStudio.cleanup.policy.modeOff":"Deaktiviert","uiStudio.cleanup.policy.modeAge":"Altersbasiert","uiStudio.cleanup.policy.modeSize":"Größenbasiert","uiStudio.cleanup.policy.cascade":"Auch verknüpfte Screenshots löschen","uiStudio.cleanup.policy.save":"Richtlinie speichern","uiStudio.cleanup.policy.runNow":"Gespeicherte Regel ausführen","uiStudio.cleanup.policy.proRequired":"Nach dem Upgrade auf Pro verfügbar","uiStudio.cleanup.policy.daysUnit":"T","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Richtlinie bestätigen","uiStudio.cleanup.policy.confirm.messageStrict":"Diese Richtlinie wird sofort löschen","uiStudio.cleanup.policy.confirm.requests":" Änderungsprotokolle","uiStudio.cleanup.policy.confirm.snapshots":" Screenshots","uiStudio.cleanup.policy.confirm.freed":"freigegeben — Anwenden?","uiStudio.cleanup.keepLastNDays":"Nur letzte {n} Tage behalten","uiStudio.cleanup.selectedDelete":"Auswahl löschen…","uiStudio.cleanup.deleteAll":"Alles löschen…","uiStudio.cleanup.cleanupConfirmTitle":"Bereinigung bestätigen","uiStudio.cleanup.cleanupConfirmMessage":"Die ausgewählten Elemente werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Manuelle Bereinigung","uiStudio.cleanup.studioPreservedNote":"Diese Aktion löscht nur Verlaufs- und Screenshot-Dateien auf dem Datenträger; Roblox Studio-Instanzen sind nicht betroffen.","uiStudio.history.sample.bannerBadge":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerTitle":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerMessage":"Diese Vorschau verwendet Beispieldaten. Echter Anfrageverlauf, Vorher/Nachher-Vergleich und Massenlöschung sind in Pro verfügbar.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Auf Pro upgraden, um den vollständigen Verlauf freizuschalten","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Gespeicherte Regel ausführen","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clearAll":"Alles leeren","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"MCP-Server verbunden","toast.serverDisconnected":"MCP-Server getrennt","toast.pluginConnected":"Plugin verbunden","toast.pluginDisconnected":"Plugin getrennt","toast.clearSuccess":"Erfolgreich geleert","toast.clearFailed":"Daten konnten nicht geleert werden","common.clear":"Leeren","settings.license.activate":"Lizenz aktivieren","settings.license.refresh":"Lizenz aktualisieren","settings.license.keyInput":"Lizenzschlüssel","settings.license.disconnected":"Getrennt","settings.license.disconnected.tooltip":"Verbinden Sie sich erneut mit dem MCP-Server, um Lizenzaktionen über das WEPPY Dashboard zu verwalten.","settings.license.live.tooltip":"Lizenzaktionen werden sofort an den MCP-Server gesendet.","settings.license.status.activationRequired":"Aktivierung erforderlich","settings.license.status.activationRequired.tooltip":"Eine manuelle Lizenzaktivierung ist erforderlich, bevor das WEPPY Dashboard diesen Status aktualisieren kann.","settings.license.status.grace":"Karenzzeit","settings.license.status.grace.tooltip":"Die Anbieterprüfung ist vorübergehend nicht verfügbar, der Pro-Zugriff bleibt während der Karenzzeit aktiv.","settings.license.status.graceBilling.tooltip":"Während einer abrechnungsbedingten Karenzzeit bleibt der Pro-Zugriff verfügbar.","settings.license.detail.graceBilling":"Der Pro-Zugriff bleibt während einer Abrechnungs-Karenzzeit verfügbar.","settings.license.detail.graceProviderUnavailable":"Anbieter nicht verfügbar. Der Pro-Zugriff bleibt im Karenzmodus aktiv.","settings.license.detail.manualActivation":"Manuelle Aktivierung erforderlich, um den Pro-Zugriff wiederherzustellen.","settings.license.detail.missingSessionToken":"Die Aktualisierung ist blockiert, da das aktuelle Session-Token fehlt.","settings.license.detail.refreshRecommended":"Die Lizenzprüfung sollte bald aktualisiert werden.","connection.agents.kill":"Beenden","connection.agents.kill.title":"Agent beenden?","connection.agents.killed":"Agent beendet","connection.agents.killFailed":"Agent konnte nicht beendet werden","connection.agents.lastCommand":"Letzter Befehl","connection.agents.lastCommand.tooltip":"Der zuletzt von diesem Agenten ausgeführte Tool-Aufruf","connection.agents.lastSeen":"Zuletzt aktiv","connection.agents.lastSeen.tooltip":"Der letzte Heartbeat oder die letzte Aktivität dieses Agenten","connection.clear.title":"Verbindungsprotokoll leeren?","connection.clear.message":"Dadurch wird das gespeicherte Verbindungsprotokoll des aktuellen Projekts dauerhaft entfernt.","sync.clear.title":"Synchronisierungsprotokoll leeren?","sync.clear.message":"Dadurch wird das gespeicherte Synchronisierungsprotokoll des aktuellen Place dauerhaft entfernt.","playtest.clear.title":"Testverlauf leeren?","playtest.clear.message":"Dadurch werden die gespeicherten Playtest-Berichte des aktuellen Place dauerhaft entfernt.","changelog.clear.title":"Änderungsprotokoll leeren?","changelog.clear.message":"Dadurch wird das gespeicherte Änderungsprotokoll des aktuellen Place dauerhaft entfernt.","sync.status.placePath":"Place-Pfad","sync.status.placePath.tooltip":"Aktives Place-Verzeichnis, in das Explorer-Dateien synchronisiert werden.","tier.progress.label":"Pro / Gesamt","changelog.card.representativeArea":"Repräsentativer Bereich","changelog.card.verification":"Überprüfung","uiStudio.designCheckResultsTitle":"Design-Check-Vorschläge","uiStudio.actions.designCheckAgain":"Erneut prüfen","uiStudio.actions.designCheckRunning":"Vorschläge werden geprüft...","uiStudio.actions.designCheckRunningDetail":"Nach Abschluss werden zuerst zu prüfende, empfohlene und optionale Elemente angezeigt.","uiStudio.actions.designCheckComplete":"Vorschlagsprüfung abgeschlossen","uiStudio.actions.designCheckNoSnapshotSaved":"Diese Aktion speichert keine neue Screenshot-Datei.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.priorityMedium":"Prüfung empfohlen","uiStudio.mediumPrioritySection":"Prüfung empfohlen","uiStudio.history.row.qualityPlan.tooltip":"Für diese Änderung verwendete Brief-Designrichtung.","uiStudio.history.row.designCheck.tooltip":"Zusammenfassung der Design-Check-Vorschläge nach der Änderung.","uiStudio.gallery.priorityHighBadge.tooltip":"Anzahl der zuerst zu prüfenden Vorschläge. Für Details klicken.","uiStudio.gallery.priorityMediumBadge.tooltip":"Anzahl der empfohlenen Vorschläge.","uiStudio.gallery.priorityLowBadge.tooltip":"Anzahl der optionalen Verbesserungen.","settings.dataHistory.clear.tooltip":"Nur die für diesen Eintrag gespeicherten Daten löschen. Roblox-Studio-Daten werden nicht geändert.","settings.dataHistory.connectionLog.metric.tooltip":"Anzahl gespeicherter Verbindungsereignisse und belegter Speicherplatz.","settings.dataHistory.open.tooltip":"Die Seite öffnen, die diesen Eintrag im Detail zeigt.","settings.dataHistory.playtestReports.metric.tooltip":"Anzahl gespeicherter Playtest-Berichte und belegter Speicherplatz.","settings.dataHistory.projectChanges.metric.tooltip":"Anzahl gespeicherter Projektänderungs-Zusammenfassungen und belegter Speicherplatz.","settings.dataHistory.syncLog.metric.tooltip":"Anzahl gespeicherter Sync-Ereignisse und belegter Speicherplatz.","settings.dataHistory.toggle.tooltip":"Diesen Abschnitt ein- oder ausklappen.","settings.dataHistory.manageStorage":"Speicher verwalten","settings.dataHistory.manageStorage.tooltip":"Speicherrichtlinie und Bereinigungsoptionen ein- oder ausblenden.","settings.dataHistory.manageStorage.projectChanges.aria":"Speicher der Projektänderungsübersicht verwalten","settings.dataHistory.manageStorage.uiStudio.aria":"Speicher für UI-Studio-Verlauf und Screenshots verwalten","settings.dataHistory.toolStats.metric.tooltip":"Aggregierte Gesamtaufrufe und Sitzungszahlen.","settings.dataHistory.toolsActivity.metric.tooltip":"Anzahl gespeicherter Tool-Ausführungen und belegter Speicherplatz.","settings.dataHistory.uiStudio.metric.tooltip":"UI-Studio-Änderungsdatensätze, Capture-Anzahlen und gesamte Speichernutzung.","settings.language.auto.tooltip":"Die Sprache des Betriebssystems verwenden. Fällt auf Englisch zurück, wenn sie nicht unterstützt wird.","settings.license.activate.tooltip":"Pro-Funktionen mit dem eingegebenen Lizenzschlüssel aktivieren.","settings.license.refresh.tooltip":"Den aktuellen Status erneut vom Lizenzserver abrufen. Nützlich, wenn eine Abrechnungsänderung noch nicht sichtbar ist.","settings.license.reset.tooltip":"Den aktuell registrierten Lizenzschlüssel entfernen. Vor dem Aktivieren mit einem anderen Schlüssel verwenden.","tier.upgrade.tooltip":"Pro-Funktionen und Kaufoptionen ansehen.","uiStudio.actions.captureCurrentState.tooltip":"Den aktuellen Zustand dieses UI-Ziels als neuen Screenshot erfassen.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Die Design-Check-Vorschläge für dieses UI-Ziel erneut prüfen.","uiStudio.actions.deleteSnapshot.tooltip":"Nur diese gespeicherte Screenshot-Datei löschen. Roblox Studio wird nicht geändert.","uiStudio.actions.more.tooltip":"Weitere Aktionen für diesen Screenshot anzeigen.","uiStudio.analysis.counts.tooltip":"Zeigt, wie viele Vorschläge als zuerst prüfen, empfohlen oder optional markiert sind.","uiStudio.analysis.recentCapturesTitle.tooltip":"Die zuletzt gespeicherten Screenshots für UI-Studio-Analyse und Debugging.","uiStudio.analysis.reportsTitle.tooltip":"Der neueste Analysebericht je UI-Ziel.","uiStudio.analysis.thresholds.tooltip":"Der für diese Prüfung verwendete Schwellenwertsatz (Standard oder benutzerdefiniert).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"In diesem UI wurden Verbesserungen gefunden. Karte anklicken, um Details zu sehen.","uiStudio.analysis.verdict.passed.tooltip":"Unter den aktuellen Prüfschwellen werden keine Verbesserungen vorgeschlagen.","uiStudio.analysis.verdictLabel.tooltip":"Gesamtbewertung der Verbesserungen für diesen Capture.","uiStudio.briefId.tooltip":"Kennung des Design-Briefs, der dieses UI erzeugt hat.","uiStudio.capturedAt.tooltip":"Zeitpunkt, zu dem dieser Screenshot gespeichert wurde.","uiStudio.cleanup.deleteAll.tooltip":"Alle Änderungsdatensätze und Captures für dieses Projekt löschen. Das tatsächliche UI in Roblox Studio bleibt unverändert.","uiStudio.cleanup.keep30.tooltip":"Änderungsdatensätze und Captures löschen, die älter als 30 Tage sind.","uiStudio.cleanup.keep7.tooltip":"Änderungsdatensätze und Captures löschen, die älter als 7 Tage sind.","uiStudio.cleanup.label.tooltip":"Änderungsdatensätze und Captures jederzeit manuell bereinigen.","uiStudio.cleanup.policy.ageInput.tooltip":"Einen beliebigen Wert zwischen 1 und 365 Tagen eingeben.","uiStudio.cleanup.policy.agePreset.tooltip":"Daten löschen, die älter als diese Anzahl von Tagen sind.","uiStudio.cleanup.policy.cascade.tooltip":"Auch die Capture-Bilder löschen, die mit diesen Datensätzen verknüpft sind. Wenn aus, bleiben die Bilder erhalten.","uiStudio.cleanup.policy.modeAge.tooltip":"Daten automatisch löschen, die älter als die konfigurierte Anzahl von Tagen sind.","uiStudio.cleanup.policy.modeOff.tooltip":"Automatische Bereinigung ausschalten. Daten bleiben erhalten, bis du sie manuell entfernst.","uiStudio.cleanup.policy.modeSize.tooltip":"Wenn die Gesamtnutzung das Limit überschreitet, werden die ältesten Daten zuerst entfernt.","uiStudio.cleanup.policy.runNow.tooltip":"Die gespeicherte Bereinigungsregel jetzt einmal ausführen, ohne auf den nächsten geplanten Lauf zu warten.","uiStudio.cleanup.policy.save.tooltip":"Die aktuelle Bereinigungsregel speichern. Danach läuft sie im Hintergrund.","uiStudio.cleanup.policy.sizeInput.tooltip":"Einen beliebigen Wert zwischen 50 MB und 10000 MB (10 GB) eingeben.","uiStudio.cleanup.policy.sizePreset.tooltip":"Die Gesamtnutzung unter dieser Größe halten.","uiStudio.cleanup.policy.title.tooltip":"Regeln, die alte oder große Captures automatisch entfernen.","uiStudio.colCurrent.tooltip":"Der aktuell angewendete Wert.","uiStudio.colRecommended.tooltip":"Der empfohlene Wert.","uiStudio.compare.after.tooltip":"Der Bildschirm, der direkt nach der KI-Änderung gespeichert wurde.","uiStudio.compare.before.tooltip":"Der Bildschirm, der direkt vor der KI-Änderung gespeichert wurde.","uiStudio.compare.path.tooltip":"Der UI-Instanzpfad für diesen Bildschirm.","uiStudio.copyFixCommand.tooltip":"Eine Eingabeaufforderung kopieren, die die KI bittet, dieses Problem zu beheben.","uiStudio.detailClose.tooltip":"Detailansicht schließen.","uiStudio.falsePositiveWarning.tooltip":"Diese Prüfung kann Fehlalarme erzeugen — vor dem Anwenden überprüfen.","uiStudio.gallery.cardCheckbox.tooltip":"Diesen Capture auswählen. Wähle mehrere aus, um sie zusammen zu löschen.","uiStudio.gallery.clearSelection.tooltip":"Die aktuelle Capture-Auswahl aufheben.","uiStudio.gallery.deleteSelected.tooltip":"Die ausgewählten Screenshot-Dateien löschen. Roblox Studio bleibt unverändert.","uiStudio.gallery.selectAll.tooltip":"Alle aktuell sichtbaren Captures auswählen.","uiStudio.groupSummary.tooltip":"Anzahl der UI-Elemente, die zu dieser Gruppe passen.","uiStudio.history.clear.tooltip":"Alle Änderungsdatensätze für dieses Projekt löschen. Das tatsächliche UI in Roblox Studio bleibt unverändert.","uiStudio.history.filter.actionAll.tooltip":"Alle Aktionsarten anzeigen.","uiStudio.history.filter.actionCreate.tooltip":"Nur Aktionen anzeigen, die ein neues UI erstellt haben.","uiStudio.history.filter.actionDelete.tooltip":"Nur Aktionen anzeigen, die ein UI gelöscht haben.","uiStudio.history.filter.actionUpdate.tooltip":"Nur Aktionen anzeigen, die ein bestehendes UI aktualisiert haben.","uiStudio.history.filter.actions.tooltip":"Datensätze nach der Art der KI-Änderung filtern.","uiStudio.history.filter.customRange.tooltip":"Ein benutzerdefiniertes Start- und Enddatum wählen.","uiStudio.history.filter.dateAll.tooltip":"Den gesamten Verlauf anzeigen.","uiStudio.history.filter.from.tooltip":"Startdatum für die Abfrage.","uiStudio.history.filter.last30Days.tooltip":"Änderungen der letzten 30 Tage anzeigen.","uiStudio.history.filter.last7Days.tooltip":"Änderungen der letzten 7 Tage anzeigen.","uiStudio.history.filter.period.tooltip":"Datensätze nach Zeitraum filtern.","uiStudio.history.filter.reset.tooltip":"Alle Filter auf Standardwerte zurücksetzen.","uiStudio.history.filter.to.tooltip":"Enddatum für die Abfrage.","uiStudio.history.filter.today.tooltip":"Nur heutige Änderungen anzeigen.","uiStudio.history.filter.yesterday.tooltip":"Nur gestrige Änderungen anzeigen.","uiStudio.history.row.affectedPaths.tooltip":"Anzahl der UIs, die von dieser Aktion betroffen sind.","uiStudio.history.row.compare.tooltip":"Vorher- und Nachher-Bildschirm vergleichen. Zum Öffnen der vollständigen Vergleichsansicht klicken.","uiStudio.history.row.extraPaths.tooltip":"Anzahl zusätzlicher UIs, die in dieser Aktion geändert wurden.","uiStudio.history.row.mutations.tooltip":"Anzahl detaillierter Änderungen (z. B. Eigenschaftsänderungen).","uiStudio.history.row.noAfterState.tooltip":"Nach dieser Änderung wurde kein Capture gespeichert.","uiStudio.history.row.noBeforeState.tooltip":"Vor dieser Änderung wurde kein Capture gespeichert.","uiStudio.history.row.toggleDetails.tooltip":"Eine zeilenweise Aufschlüsselung der Änderungen ein- oder ausblenden.","uiStudio.history.title.tooltip":"Eine Zeitleiste aller UI-Änderungen, die von KI vorgenommen wurden.","uiStudio.scope.tooltip":"Capture-Bereich (voller Bildschirm oder ein bestimmtes UI).","uiStudio.storage.historyBytes.tooltip":"Speicherplatz für Änderungsdatensätze (JSON).","uiStudio.storage.lastRun.tooltip":"Wann die automatische Bereinigungsregel zuletzt lief und was entfernt wurde.","uiStudio.storage.mutationCount.tooltip":"Anzahl detaillierter Änderungen innerhalb von Aktionen (eine Eigenschaftsänderung = 1).","uiStudio.storage.requestCount.tooltip":"Anzahl der Aktionen, bei denen die KI das UI geändert hat.","uiStudio.storage.snapshotBytes.tooltip":"Speicherplatz für erfasste PNG-Bilddateien.","uiStudio.storage.snapshotCount.tooltip":"Anzahl gespeicherter Capture-Bilddateien.","uiStudio.storage.title.tooltip":"Speichernutzung von UI-Studio-Änderungsdatensätzen und Screenshots.","uiStudio.storage.usageLabel.tooltip":"Speicherplatz, den UI Studio aktuell für dieses Projekt verwendet.","uiStudio.suggestionGroup.tooltip":"Vorschläge derselben Art, gruppiert angezeigt. Zum Ein- oder Ausklappen klicken.","uiStudio.tabs.analysis.tooltip":"Neueste UI-Captures und Design-Check-Vorschläge überprüfen.","uiStudio.tabs.history.tooltip":"Von KI vorgenommene UI-Änderungen mit Vorher-/Nachher-Captures prüfen.","uiStudio.target.tooltip":"Exakter Pfad der erfassten UI-Instanz.","uiStudio.title.tooltip":"UI-Studio-Captures und Designvorschläge für Roblox-UI.","tier.banner.progressLabel":"Pro / Gesamt","uiStudio.error":"Fehler","uiStudio.analysis.expandChildren":"Unterziele anzeigen","uiStudio.analysis.openDetail":"Detail öffnen","uiStudio.analysis.childTargets":"Unterziele","uiStudio.analysis.childDetailHint":"Details zum Unterziel öffnen","uiStudio.compare.before":"Vorher","uiStudio.compare.after":"Nachher","uiStudio.history.drawer.changeDetails":"Änderungsdetails","uiStudio.gallery.cardCheckbox":"Screenshot auswählen","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Alle Bereiche","assets.explorer.label":"Asset-Explorer","assets.breadcrumb.label":"Asset-Pfad","assets.explorer.summary":"{direct} in diesem Ordner · {descendant} in Unterordnern","assets.folder.count.one":"1 Asset","assets.folder.count.many":"{count} Assets","assets.folder.type":"Ordner","assets.folders.title":"Ordner","assets.folder.assetsTitle":"Assets in diesem Ordner","assets.organization.label":"Durchsuchen","assets.organization.folders":"Ordner","assets.organization.all":"Alle Assets","assets.organization.summary":"{count} Assets","assets.view.options":"Ansichtsoptionen","assets.view.mode":"Ansichtsmodus","assets.view.grid":"Raster","assets.view.list":"Liste","assets.view.thumbnailSize":"Miniaturgröße","assets.view.thumbnailSize.listReason":"Die Miniaturgröße ist in der Rasteransicht verfügbar.","assets.view.size.small":"Klein","assets.view.size.medium":"Mittel","assets.view.size.large":"Groß","assets.list.name":"Name","assets.list.type":"Typ","assets.list.scope":"Bereich","assets.list.status":"Status","assets.list.updated":"Aktualisiert","assets.loading.scope":"Assets für {scope} werden geladen...","assets.partial.title":"Einige Speicherorte konnten nicht geladen werden","assets.empty.folderTitle":"Keine passenden Assets in diesem Ordner","assets.empty.folderBody":"Versuche einen anderen Ordner oder Kategoriefilter.","assets.empty.filteredTitle":"Keine Assets entsprechen diesem Filter","assets.empty.filteredBody":"Wähle eine andere Kategorie oder scanne die passenden Ordner erneut.","assets.place.selector":"Asset place","assets.place.context":"Asset-Place-Kontext","assets.place.sharedLibrary":"Gemeinsame Bibliothek","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Funktionsweise","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Schließen","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio-Routing","controls.studioRouting.title.tooltip":"Priorität für MCP-Anfragen ohne angegebenes Studio.","controls.studioRouting.settingLabel":"Anfragen ohne angegebenes Studio","controls.studioRouting.mode.auto":"Automatisch","controls.studioRouting.mode.pinned":"Studio festlegen","controls.studioRouting.state.auto":"Aktuell: automatisch","controls.studioRouting.state.pinned":"Aktuell: Studio festgelegt","controls.studioRouting.saving":"Wird angewendet…","controls.studioRouting.applied":"Angewendet","controls.studioRouting.failed":"Anwenden fehlgeschlagen","controls.studioRouting.pinnedUnavailable":"Verbinde ein Studio, um ein Studio festzulegen.","controls.studioRouting.helpLabel":"So funktioniert das Studio-Routing","controls.studioRouting.helpButton":"Wie funktioniert das?","controls.studioRouting.selectTarget":"Festes Studio auswählen","controls.studioRouting.select":"Auswählen","controls.studioRouting.targetGroupLabel":"Festgelegtes Studio","controls.luauValidation.title":"Luau-Syntaxprüfung","controls.luauValidation.settingLabel":"Nach Script-Änderungen automatisch prüfen","controls.luauValidation.benefit":"Nach einer Script-Änderung durch die KI auf Luau-Syntaxfehler prüfen.","controls.luauValidation.state.on":"Aktuell: Ein","controls.luauValidation.state.off":"Aktuell: Aus","controls.luauValidation.priority":"Wenn eine KI-Anfrage von dieser Option abweicht, gilt die Dashboard-Einstellung. Hier ein- oder ausschalten, um die Prüfung von Script-Änderungen anzupassen.","controls.luauValidation.switchLabel":"Automatische Prüfung nach Script-Änderungen","controls.luauValidation.saving":"Wird gespeichert…","controls.luauValidation.applied":"Angewendet","controls.luauValidation.failed":"Anwenden fehlgeschlagen","controls.luauValidation.helpLabel":"So funktioniert die automatische Luau-Syntaxprüfung","controls.luauValidation.helpButton":"Wie funktioniert das?","controls.luauValidation.help.behavior":"Wenn die Option eingeschaltet ist, prüft WEPPY nach dem Ersetzen, Bearbeiten, Einfügen oder Löschen von Script-Zeilen durch die KI den tatsächlich gespeicherten vollständigen Code. Wenn sie ausgeschaltet ist, wird nur das Script geändert.","controls.luauValidation.help.response":"Bei einem fehlerfreien Script bleibt die übliche kurze Abschlussmeldung erhalten. WEPPY zeigt nur dann Details, wenn ein Fehler gefunden oder die Prüfung nicht abgeschlossen wird. Große Scripts können etwas länger dauern.","controls.luauValidation.help.nonBlocking":"Wenn WEPPY einen Syntaxfehler findet oder die Prüfung nicht abschließen kann, wird die gespeicherte Script-Änderung nicht rückgängig gemacht. Das Ergebnis hilft der KI, dasselbe Script sofort zu korrigieren.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Mehrere verbundene Studio-Fenster haben dieselbe Place ID. Verwende für diesen Ort die Studio ID.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Anfragen mit Studio ID, Connection ID oder Place ID umgehen diese Priorität und werden an das angegebene Studio gesendet.","controls.studioRouting.state.currentTarget":"Aktuelles Prioritätsziel","controls.studioRouting.noPriorityTarget":"Kein Studio verbunden","controls.studioRouting.help.auto":"Automatisch nutzt das aktive Studio mit der höchsten Priorität anhand der letzten Befehle und der Verbindungsreihenfolge.","controls.studioRouting.help.pinned":"Studio festlegen nutzt das ausgewählte Studio, wenn die Anfrage keine Ziel-ID angibt.","sync.migration.title":"Update des Sync-Formats verfügbar","sync.migration.description":"Prüfe die Metadatenänderungen, bevor du diesen Place vom Sync-Format v2 auf v3 aktualisierst.","sync.migration.status.ready":"Bereit zur Prüfung","sync.migration.status.blocked":"Blockiert","sync.migration.preview":"Änderungen prüfen","sync.migration.summary.add":"Hinzufügen","sync.migration.summary.modify":"Ändern","sync.migration.summary.delete":"Löschen","sync.migration.summary.blocked":"Blockiert","sync.migration.changes":"Metadatenänderungen","sync.migration.blockers":"Zu lösende Punkte","sync.migration.operation.add":"hinzufügen","sync.migration.operation.modify":"ändern","sync.migration.operation.delete":"löschen","sync.migration.reason.serializer_regeneration":"Schreibt Metadaten im kanonischen v3-Format neu.","sync.migration.reason.volatile_metadata_removal":"Entfernt flüchtige Sync-Metadaten.","sync.migration.reason.redundant_empty_metadata":"Entfernt überflüssige leere Metadaten.","sync.migration.reason.runtime_ignore_policy":"Aktualisiert die verwaltete Runtime-Ausschlussregel.","sync.migration.reason.reverse_pending":"Wende ausstehende lokale Änderungen an Studio zuerst an oder verwirf sie.","sync.migration.reason.conflict":"Löse zuerst den Konflikt zwischen lokalen Dateien und Studio.","sync.migration.reason.local_canonical_change":"Prüfe zuerst die lokal geänderten kanonischen Metadaten.","sync.migration.reason.source_mutation_detected":"Eine Benutzerquelldatei wurde während der Prüfung geändert.","sync.migration.blocked":"Löse Sync-Konflikte vor dem Update","sync.migration.stale":"Die Vorschau hat sich geändert. Prüfe den neuesten Unterschied.","sync.migration.error":"Das Sync-Format konnte nicht aktualisiert werden. Versuche es erneut.","sync.migration.refresh":"Vorschau aktualisieren","sync.migration.refreshing":"Wird aktualisiert…","sync.migration.applying":"Wird angewendet…","sync.migration.apply":"Update anwenden","sync.migration.confirm.title":"Update des Sync-Formats anwenden?","sync.migration.confirm.message":"Die aufgeführten Sync-Metadaten werden gesichert und aktualisiert. Deine Luau-Quelldateien bleiben unverändert.","changelog.ownership.showGenerated":"Generierte Metadaten anzeigen","changelog.ownership.userSource":"Benutzerquelle","changelog.ownership.canonicalMirror":"Spiegel-Metadaten","changelog.ownership.generated":"Generiert"},Xy={"sidebar.overview":"Aperçu","sidebar.changelog":"Journal des modifications","sidebar.connection":"Connexion","sidebar.sync":"Synchroniser","sidebar.playtest":"Test de jeu","sidebar.tools":"Outils","sidebar.settings":"Paramètres","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Connexion au serveur MCP requise","sidebar.gate.l2":"Connexion au plugin Roblox Studio requise","header.currentProject":"Projet actuel","header.unknownProject":"Projet inconnu","header.projectRoot.label":"Racine du projet","header.currentProject.loading":"Chargement de la racine du projet...","header.currentProject.unavailable":"Racine Project indisponible","header.placeNotConnected":"Lieu non connecté","header.currentProject.tooltip":"Dossier de projet actuellement sélectionné","header.currentProject.loading.tooltip":"Les informations racine de Project sont toujours en cours de chargement","header.currentProject.unavailable.tooltip":"Les informations sur la racine du projet actuel ne sont pas disponibles","header.currentProjectSyncRoot.label":"Synchroniser la racine","header.currentProjectSyncRoot.loading":"Chargement de la racine de synchronisation...","header.currentProjectSyncRoot.unavailable":"Racine de synchronisation indisponible","header.currentProjectSyncRoot.tooltip":"Dossier racine de synchronisation actuel pour le projet sélectionné","header.currentProjectSyncRoot.loading.tooltip":"Les informations sur la racine de synchronisation sont toujours en cours de chargement","header.currentProjectSyncRoot.unavailable.tooltip":"Les informations actuelles sur la racine de synchronisation ne sont pas disponibles","header.testFiles.label":"Fichiers de test","header.testFiles.unavailable":"Fichiers de test indisponibles","header.testFiles.tooltip":"Répertoire actuel des fichiers de test de lecture pour l'endroit sélectionné","header.places.title":"Lieux","header.places.active":"Actif","header.places.inactive":"Inactif","header.places.pluginRequired":"Connexion plug-in requise","header.places.liveRequired":"Connexion plug-in requise pour le lieu actif en direct","header.place.tooltip":"Lieu Roblox connecté","header.placeNotConnected.tooltip":"Lieu non connecté","placeScope.current.label":"Place actuel","placeScope.lastActive.label":"Dernier place actif","placeScope.selected.label":"Place sélectionné","placeScope.unknownPlace":"Place inconnu","placeScope.live":"En direct","placeScope.stored":"Enregistré","placeScope.pluginRequired":"Plugin requis","placeScope.pluginRequired.note":"Connectez le WEPPY Plugin pour confirmer le place actif en direct.","placeScope.noPlace.label":"Portée du place","placeScope.noPlace.value":"Aucune donnée de place disponible pour le moment","placeScope.noPlace.badge":"Aucun place","placeScope.noPlace.note":"Connectez le WEPPY Plugin et synchronisez un place pour créer des données par place.","placeScope.selected.note":"Seules les données enregistrées sont affichées. Le routage Studio reste inchangé.","placeScope.surface.sync":"L'état de synchronisation et les journaux utilisent ce place.","placeScope.surface.changelog":"Les sessions du journal des changements utilisent ce place.","placeScope.surface.playtest":"Les rapports de playtest utilisent ce place.","placeScope.surface.uiStudio":"Les captures UI et l'historique des changements utilisent ce place.","placeScope.surface.tools":"L'historique et les statistiques des outils utilisent ce place.","placeScope.loading":"Chargement de la portée du place...","placeScope.unavailable":"Portée du place indisponible","placeScope.selector.label":"Données du place","header.changeProjectRoot":"Changer la racine du projet Project","header.changeProjectRoot.ariaLabel":"Changer la racine du projet","header.changeProjectRoot.tooltip":"Changer la racine actuelle du projet","header.changeProjectRoot.disabledTooltip.l0":"Connexion au serveur MCP requise avant que la racine du projet puisse être modifiée","header.changeProjectRoot.disabledTooltip.loading":"Les informations racine de Project sont toujours en cours de chargement","header.changeProjectRoot.disabledTooltip.unavailable":"Les informations sur la racine du projet actuel ne sont pas disponibles","header.projectRootModal.initial.title":"Changer la racine du projet","header.projectRootModal.initial.body.connected":"Après avoir choisi un dossier de projet, MCP basculera vers la nouvelle racine du projet et le contenu actuel du Studio sera entièrement resynchronisé dans la nouvelle cible <dossier de projet sélectionné>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Après avoir choisi un dossier de projet, MCP basculera vers la nouvelle racine du projet et utilisera <dossier de projet sélectionné>/weppy-project-sync comme prochaine cible de synchronisation.","header.projectRootModal.initial.nextSyncRoot":"Nouvelle cible de synchronisation après sélection","header.projectRootModal.initial.nextSyncRoot.placeholder":"<dossier de projet sélectionné>/weppy-project-sync","header.projectRootModal.initial.warningStop":"La synchronisation actuelle s'arrête immédiatement.","header.projectRootModal.initial.warningFreshSync":"Le contenu actuel du Studio sera utilisé pour créer une nouvelle synchronisation complète dans la nouvelle cible.","header.projectRootModal.initial.warningNoMove":"Les anciens dossiers de synchronisation ne sont pas déplacés automatiquement.","header.projectRootModal.initial.warningDeferredSync":"Si Studio n'est pas connecté, la resynchronisation complète démarre à la prochaine connexion du plugin.","header.projectRootModal.confirm.title":"Confirmer la nouvelle racine du projet","header.projectRootModal.confirm.body":"Examinez le dossier de projet sélectionné avant de postuler.","header.projectRootModal.confirm.projectRoot":"Dossier de projet sélectionné","header.projectRootModal.confirm.syncRoot":"Nouvelle cible de synchronisation","header.projectRootModal.confirm.warningNoMove":"Les dossiers de synchronisation existants ne sont pas déplacés automatiquement.","header.projectRootModal.pick":"Choisir un dossier","header.projectRootModal.apply":"Appliquer le changement","header.projectRootModal.cancel":"Annuler","header.projectRootModal.error":"Échec de la modification de la racine du projet","status.online":"En ligne","status.offline":"Hors ligne","status.idle":"Inactif","status.syncing":"Synchronisation","status.error":"Erreur","status.initializing":"Initialisation","level.l0.title":"Serveur déconnecté","level.l0.message":"WEPPY Dashboard ouvert mais le serveur MCP s'est arrêté ou ne répond pas.","level.l1.title":"Serveur connecté","level.l1.hint":"Vérifiez : Roblox Studio est-il en cours d'exécution ? Le plugin est-il installé ?","level.l2.ok":"Studio connecté","tier.basic":"Basic","tier.basic.tooltip":"Niveau Basic avec l'ensemble de fonctionnalités standard WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Niveau Pro avec l'ensemble complet de fonctionnalités WEPPY Dashboard.","tier.mixed":"Mixte","tier.upgrade":"Voir Pro","tier.banner.save":"Enregistrez les jetons IA avec Pro !","tier.tool.query_instances.desc":"Inspectez les instances, recherchez les enfants et les descendants et inspectez les données de classe. Pro ajoute une arborescence de fichiers, une structure de projet et une recherche de propriétés ou de balises.","tier.tool.mutate_instances.desc":"Créez, supprimez, clonez et déplacez des instances. Pro ajoute la création d'arborescence et les opérations de création, de suppression ou de clonage en masse.","tier.tool.manage_properties.desc":"Lisez et définissez les propriétés, les attributs et les balises. Pro ajoute des mises à jour calculées, des modifications relatives et des opérations de propriété en masse.","tier.tool.manage_scripts.desc":"Lisez, écrivez, créez, supprimez, modifiez et recherchez la source du script. Pro ajoute un remplacement groupé entre les scripts.","tier.tool.manage_ui.desc":"Pro uniquement. Créez ou affinez des menus de style jeu, des HUD, des boutons, des étiquettes et des panneaux d'images, puis capturez des écrans et examinez les suggestions d'amélioration.","tier.tool.manage_ui.action.design_brief":"Planifier l'orientation de l'interface utilisateur","tier.tool.manage_ui.action.create_tree":"Créer une nouvelle interface utilisateur","tier.tool.manage_ui.action.update":"Mettre à jour l'interface utilisateur existante","tier.tool.manage_ui.action.delete":"Supprimer l'interface utilisateur","tier.tool.manage_ui.action.preview":"Capturer l'écran de l'interface utilisateur","tier.tool.manage_ui.action.check":"Examiner les suggestions d'amélioration","tier.tool.manage_lighting.desc":"Pro uniquement. Configurez l'éclairage, l'atmosphère, le ciel, les propriétés du terrain et les paramètres d'heure.","tier.tool.manage_selection.desc":"Lisez, définissez et effacez la sélection actuelle de Studio. Pro ajoute le contexte, les détails, l'ajout ou la suppression et la prise en charge de la surveillance de la sélection.","tier.tool.manage_camera.desc":"Inspectez l’état de la caméra, faites la mise au point par chemin ou position et demandez des suggestions de vues.","tier.tool.manage_tween.desc":"Pro uniquement. Créez, lisez, mettez en pause et annulez des interpolations pour une animation fluide.","tier.tool.manage_audio.desc":"Pro uniquement. Jouez, arrêtez, mettez en pause et reprenez les sons, et configurez l'écouteur audio.","tier.tool.manage_animation.desc":"Pro uniquement. Chargez, lisez et arrêtez des animations, et inspectez les pistes d'animation actives.","tier.tool.manage_physics.desc":"Pro uniquement. Enregistrez les groupes de collision, configurez les collisions de groupe et inspectez les groupes disponibles.","tier.tool.manage_effects.desc":"Pro uniquement. Émettez des particules, supprimez les effets et basculez l'état de l'effet.","tier.tool.manage_terrain.desc":"Pro uniquement. Remplissez les formes du terrain, effacez les régions, remplacez les matériaux, gérez les couleurs du terrain, lisez ou écrivez des voxels, générez du terrain et lissez le terrain.","tier.tool.spatial_query.desc":"Pro uniquement. Exécutez des raycasts, trouvez le terrain, validez le placement, scannez des zones, recherchez des positions plates ou d'apparition, analysez la possibilité de marcher, cartographiez l'espace et inspectez les collisions.","tier.tool.manage_assets.desc":"Pro uniquement. Insérez des modèles, inspectez les informations sur les actifs, recherchez dans la boutique du créateur, insérez des actifs ou des packages gratuits et exportez des actifs.","tier.tool.manage_sync.desc":"Pro uniquement. Inspectez l’état de synchronisation, la configuration, l’historique, les instructions et lisez ou écrivez les fichiers synchronisés.","tier.tool.workspace_state.desc":"Pro uniquement. Exécutez une synchronisation complète, capturez des instantanés, inspectez les modifications récentes et l'état de la fenêtre d'affichage, et gérez les métadonnées associées.","tier.tool.manage_logs.desc":"Inspectez les journaux de sortie avec filtrage, interrogation incrémentielle, effacement de la mémoire tampon et recherche d'erreurs récentes.","tier.tool.system_info.desc":"Inspectez l’état de la connexion et le niveau actuel. Pro ajoute des informations sur le lieu, des services, des paramètres de Studio, un contrôle de test de jeu et des tests automatisés.","tier.tool.manage_studio.desc":"Pro uniquement. Basculez les paramètres d'affichage de l'éditeur Studio tels que l'aperçu de l'interface utilisateur pour les flux de capture d'écran et d'assurance qualité ; il modifie les paramètres de session Studio, pas les objets de l'interface utilisateur du jeu.","tier.tool.batch_execute.desc":"Pro uniquement. Exécutez plusieurs commandes par lots, avec une exécution séquentielle et un comportement facultatif de poursuite en cas d'erreur.","tier.tool.execute_luau.desc":"Pro uniquement. Exécutez du code Luau arbitraire dans le bac à sable Roblox Studio.","connection.server.title":"État du serveur","connection.server.version":"Version","connection.server.version.tooltip":"Version du serveur MCP installée","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificateur de processus du système d'exploitation","connection.server.uptime":"Temps de disponibilité","connection.server.uptime.tooltip":"Temps écoulé depuis le démarrage du serveur MCP","connection.server.session":"Session","connection.server.session.tooltip":"Identifiant de session MCP actuel","connection.server.exec":"Exécutif","connection.server.exec.tooltip":"Chemin de l'exécutable utilisé pour lancer le serveur MCP","connection.reconnect":"Reconnecter","connection.checkSettings":"Vérifier les paramètres","connection.agents.title":"Agents IA","connection.agents.name":"Agent","connection.agents.cwd":"Directeur de travail","connection.agents.cwd.tooltip":"Répertoire de travail actuel pour l'agent AI connecté","connection.agents.projectRoot":"Racine du projet","connection.agents.projectRoot.tooltip":"Racine de projet faisant autorité pour la propriété de synchronisation","connection.agents.projectRoot.unresolved":"Non résolu","connection.agents.connected":"Connecté","connection.agents.unknown":"Inconnu","connection.agents.none":"Aucun agent connecté","connection.plugins.title":"Plugins","connection.plugins.place":"Lieu","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Vu pour la dernière fois","connection.plugins.lastSeen.tooltip":"Battement de cœur le plus récent reçu du plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Version du plugin installé signalée par Studio","connection.plugins.none":"Aucun plugin connecté","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Connexion Play/Test de Studio","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Journal de connexion","connection.log.empty":"Aucun événement pour l'instant","connection.time.secondsAgo":"il y a","connection.time.minutesAgo":"il y a m","connection.time.hoursAgo":"il y a h","common.loading":"Chargement...","common.retry":"Réessayer","common.reconnecting":"Reconnexion...","common.expand":"Développer","common.collapse":"Effondrement","tools.tab.history":"Histoire","tools.tab.statistics":"Statistiques","tools.tab.failures":"Échecs","tools.col.time":"Temps","tools.col.time.tooltip":"Date à laquelle l'exécution de l'outil a été enregistrée.","tools.col.toolAction":"Outil.Action","tools.col.toolAction.tooltip":"Nom de l’outil et action exécutée.","tools.col.duration":"Durée","tools.col.duration.tooltip":"Combien de temps l'outil a mis pour terminer.","tools.col.status":"Statut","tools.col.status.tooltip":"Résultat de l'exécution de l'outil enregistrée.","tools.col.tier":"Étage","tools.col.tier.tooltip":"Niveau de licence requis pour l’outil ou l’action.","tools.col.tierStats.tooltip":"Basic, Pro ou résumé mixte pour la ligne de statistiques de l'outil.","tools.col.tool":"Outil","tools.col.tool.tooltip":"Nom de l'outil consolidé dans le tableau des statistiques.","tools.col.calls":"Appels","tools.col.calls.tooltip":"Nombre total d'appels enregistrés pour cet outil.","tools.col.ok":"OK","tools.col.ok.tooltip":"Nombre d'exécutions directes réussies.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Nombre d'exécutions réussies grâce à une exécution de secours.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Nombre d'exécutions bloquées sans exécution de secours.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Nombre d'échecs attendus provoqués par l'entrée de l'appelant, l'état du projet, la stratégie Roblox ou le code utilisateur.","tools.col.err":"FAILED","tools.col.err.tooltip":"Nombre d'exécutions ayant échoué.","tools.col.okRate":"D'ACCORD%","tools.col.okRate.tooltip":"Pourcentage d'appels terminés avec succès.","tools.col.avgTime":"Temps moyen","tools.col.avgTime.tooltip":"Temps d'exécution moyen sur les appels enregistrés.","tools.col.error":"Erreur","tools.filter.tool":"Outil","tools.filter.all":"Tous","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Cette entrée utilisait un outil ou une action uniquement Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"L'action Pro demandée a réussi via un repli Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"L'action Pro demandée a été bloquée et aucune solution de secours n'a été exécutée.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"L’appel de l’outil a échoué en raison d’un problème attendu d’appelant, de projet, de stratégie ou de code utilisateur.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"L’exécution de l’outil a échoué.","tools.status.ok":"OK","tools.status.ok.tooltip":"L’exécution de l’outil s’est terminée avec succès.","tools.tier.mixed.tooltip":"Cet outil comprend à la fois les actions Basic et Pro.","tools.detail.params":"Paramètres","tools.detail.params.tooltip":"Paramètres d’entrée transmis à cette exécution d’outil.","tools.detail.result":"Résultat","tools.detail.result.tooltip":"Charge utile du résultat renvoyé pour cette exécution de cet outil.","tools.detail.requestedCommand":"Commande envoyée","tools.detail.executedCommand":"Commande exécutée","tools.detail.alternatives":"Alternatives","tools.detail.blockedMessage":"Raison du blocage","tools.detail.noFallback":"Pas de solution de repli","tools.detail.noFallback.value":"Aucune solution de secours n'a été exécutée.","tools.detail.warningMessage":"Message d'avertissement","tools.detail.errorMessage":"Message d'erreur","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Effacer l'historique ?","tools.clear.history.message":"Cela supprime définitivement l’historique actuel des outils de lieu.","tools.clear.statistics.title":"Des statistiques claires ?","tools.clear.statistics.message":"Cela réinitialise définitivement les statistiques actuelles de l'outil de placement.","tools.detail.error":"Erreur","tools.page.prev":"Précédent","tools.page.prev.tooltip":"Accédez à la page précédente des résultats de l’historique des outils.","tools.page.next":"Suivant","tools.page.next.tooltip":"Accédez à la page suivante des résultats de l’historique des outils.","tools.empty.history":"Aucune entrée dans l'historique","tools.empty.stats":"Aucune statistique sur les outils","tools.empty.failures":"Aucun échec","tools.summary.total":"Total","tools.summary.calls":"appels","tools.summary.sessions":"Séances","settings.license.title":"Licence","settings.license.title.tooltip":"Statut actuel de la licence et niveau d'abonnement.","settings.license.status":"Statut","settings.license.status.tooltip":"État d'activation actuel de la licence.","settings.license.tier":"Étage","settings.license.tier.tooltip":"Niveau d'abonnement actuel pour les fonctionnalités WEPPY Dashboard disponibles.","settings.license.key":"Clé","settings.license.key.tooltip":"Clé de licence masquée actuellement chargée par le serveur.","settings.license.keyValue.tooltip":"Clé de licence masquée actuellement chargée par le serveur.","settings.license.provider":"Provider","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"Fournisseur de licence utilisé pour valider cette clé.","settings.license.providerValue.tooltip":"Fournisseur de licence utilisé pour valider cette clé.","settings.license.active":"Actif","settings.license.active.tooltip":"État d'activation actuel de la licence.","settings.license.status.activeCancelPending.tooltip":"L'annulation est en attente, mais l'accès Pro reste actif jusqu'à la fin de la période de facturation en cours.","settings.license.inactive":"Inactif","settings.license.inactive.tooltip":"État d'activation actuel de la licence.","settings.license.expired":"Expiré","settings.license.expired.tooltip":"État d'activation actuel de la licence.","settings.license.unavailable":"Informations de licence indisponibles","settings.license.detail.cancelPending":"L'annulation est programmée. L'accès Pro reste actif jusqu'à la fin de la période de facturation en cours.","settings.license.reset":"Réinitialiser la licence","settings.readOnly":"Lecture seule","settings.readOnly.tooltip":"Cette section affiche les valeurs qui ne peuvent pas être modifiées à partir du WEPPY Dashboard.","settings.unavailable":"Paramètres indisponibles","settings.general.title":"Paramètres généraux","settings.general.title.tooltip":"Paramètres chauds qui s’appliquent immédiatement lorsqu’ils sont modifiés.","settings.general.liveApply":"Postuler en direct","settings.general.liveApply.tooltip":"Les modifications apportées à cette section sont appliquées immédiatement sans bouton de sauvegarde séparé.","settings.general.applied":"Appliqué","settings.general.logLevel":"Niveau de journalisation","settings.general.logLevel.tooltip":"Choisissez la quantité de détails que le serveur MCP écrit dans les journaux. Réduisez à « debug » lors de la recherche d’un problème.","settings.general.localHistory":"Enregistrement de l'historique des outils","settings.general.localHistory.tooltip":"Enregistrez les exécutions de l’outil AI sur le disque. Obligatoire pour les pages Outils et Historique.","settings.general.localStatistics":"Collecte de statistiques sur les outils","settings.general.localStatistics.tooltip":"Comptes agrégés d’utilisation des outils. Utilisé par les statistiques de présentation.","settings.general.contextCapture":"Capture de contexte","settings.general.contextCapture.tooltip":"Enregistrez le contexte d'exécution structuré afin que les vues Changelog et Playtest puissent le restituer.","settings.general.requestTimeout":"Expiration du délai d'action","settings.general.requestTimeout.tooltip":"Temps maximum (en ms) d'attente pour une seule action de l'outil avant d'échouer.","settings.general.requestTimeout.unit":"MS","settings.general.requestTimeout.unit.tooltip":"Le délai d’expiration de l’action est mesuré en millisecondes.","settings.cold.title":"Environnement serveur","settings.cold.title.tooltip":"Valeurs d'environnement de serveur en lecture seule chargées au démarrage.","settings.cold.httpPort.tooltip":"Numéro de port utilisé par le serveur HTTP MCP WEPPY Dashboard.","settings.cold.httpHost.tooltip":"Interface hôte à laquelle le serveur HTTP MCP WEPPY Dashboard se lie.","settings.cold.dashboardAutoOpen.tooltip":"Contrôle si le WEPPY Dashboard s'ouvre automatiquement dans le navigateur au démarrage du serveur.","settings.cold.dashboardAutoOpen.value.tooltip":"Comportement de démarrage actuel pour l'ouverture du WEPPY Dashboard dans un navigateur.","settings.cold.hint":"Définissez via des variables d’environnement pour modifier ces valeurs.","settings.language.title":"Langue","settings.language.title.tooltip":"Choisissez comment le texte de l'interface WEPPY Dashboard est localisé.","settings.language.dashboard":"WEPPY Dashboard Langue","settings.language.dashboard.tooltip":"Remplace la langue WEPPY Dashboard ou suit la langue du système lorsqu'elle est définie sur Auto.","settings.language.auto":"Auto","overview.l0.title":"Serveur MCP déconnecté","overview.l0.message":"Le serveur MCP ne répond pas. Le WEPPY Dashboard tentera automatiquement de se reconnecter.","overview.l0.step1":"Vérifiez que le processus serveur MCP est en cours d'exécution","overview.l0.step2":"Redémarrez la commande du serveur MCP si nécessaire","overview.l0.reconnecting":"Reconnexion automatique toutes les 3 secondes...","overview.l0.reconnectBtn":"Reconnecter","overview.l0.settingsBtn":"Vérifier les paramètres","overview.l1.pluginGuide":"Le plugin Roblox Studio n'est pas connecté","overview.l1.check1":"Roblox Studio est-il en cours d'exécution ?","overview.l1.check2":"Le WEPPY Plugin est-il installé ?","overview.l1.feedHint":"Les modifications apparaîtront ici une fois le plugin connecté","overview.metric.server":"Serveur","overview.metric.server.tooltip":"État d'exécution du serveur MCP et état du processus","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Connexion du plugin Roblox Studio et état de la version","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Agents de codage IA connectés et leur état d'exécution","overview.metric.agent.instancesUnit":"cas","overview.metric.sync":"Synchroniser","overview.metric.sync.tooltip":"Activité actuelle de synchronisation entre Studio et local","overview.metric.noAgent":"Aucun agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Version du serveur MCP installée","overview.meta.session":"Session","overview.meta.session.tooltip":"Identifiant de session MCP actuel","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificateur de processus du système d'exploitation","overview.meta.uptime":"Temps de disponibilité","overview.meta.uptime.tooltip":"Temps écoulé depuis le démarrage du serveur MCP","overview.feed.title":"Modifications récentes du jeu","overview.feed.empty":"Aucun changement récent","overview.changelog.title":"Résumé des modifications de session","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"cas","overview.changelog.properties":"propriétés","overview.changelog.assets":"actifs","overview.tier.title":"Utilisation du niveau","changelog.subtitle":"Historique des changements de jeu","changelog.filter.all":"Tous","changelog.filter.active":"Actif","changelog.filter.completed":"Complété","changelog.empty":"Aucune entrée du journal des modifications pour l'instant","changelog.basic.limit.title":"L'aperçu Basic affiche les 3 dernières sessions","changelog.basic.limit.body":"Passez à Pro pour parcourir la chronologie complète du journal des modifications pour ce lieu.","changelog.basic.metricLabel":"Journal des modifications visible / Total","changelog.basic.visible":"visible","changelog.basic.total":"total","changelog.card.active":"Actif","changelog.card.active.tooltip":"Cette session reçoit toujours de nouveaux changements de jeu.","changelog.card.completed":"Complété","changelog.card.completed.tooltip":"Cette session est terminée et aucun autre changement n'est attendu.","changelog.card.bootstrapStatus":"Amorçage","changelog.card.bootstrapStatus.tooltip":"Cette session contient uniquement l'instantané d'amorçage de synchronisation initial.","changelog.card.inProgress":"en cours","changelog.card.noChanges":"Aucun changement pour l'instant","changelog.card.noChanges.tooltip":"Aucun changement de jeu n'a encore été extrait pour cette session.","changelog.card.bootstrapSummary":"Instantané de synchronisation initial","changelog.card.bootstrapSummary.tooltip":"Les écritures initiales de synchronisation de fichiers sont regroupées en une seule ligne d'instantané d'amorçage.","changelog.card.sessionIntent":"Intention de session","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Modifications du script apportées au cours de cette session.","changelog.card.instances":"cas","changelog.card.instances.tooltip":"Instance créer, supprimer, déplacer ou cloner les modifications dans cette session.","changelog.card.modified":"modifié","changelog.card.created":"créé","changelog.card.deleted":"supprimé","changelog.card.moved":"déplacé","changelog.card.propertiesChanged":"propriétés modifiées","changelog.card.propertiesChanged.tooltip":"Modifications de la valeur Property enregistrées pour cette session.","changelog.card.lightingConfigured":"Éclairage configuré","changelog.card.lightingConfigured.tooltip":"Les paramètres d'éclairage ou d'ambiance ont été modifiés au cours de cette session.","changelog.card.terrainConfigured":"Terrain configuré","changelog.card.terrainConfigured.tooltip":"Les données de terrain ou les paramètres de terrain ont été modifiés au cours de cette session.","changelog.card.assetsInserted":"éléments insérés","changelog.card.assetsInserted.tooltip":"Actifs insérés dans le lieu lors de cette séance.","changelog.category.script":"Scripts","changelog.category.instance":"Instances","changelog.category.property":"Properties","changelog.category.lighting":"Éclairage","changelog.category.terrain":"Terrain","changelog.category.asset":"Actifs","changelog.detail.changeSummary":"Résumé des modifications","changelog.detail.changeSummary.tooltip":"Nombre de modifications de jeu extraites regroupées par catégorie pour cette session.","changelog.detail.changeTimeline":"Modifier la chronologie","changelog.detail.changeTimeline.tooltip":"Liste chronologique des modifications de jeu extraites pour cette session.","changelog.detail.context.title":"Résumé du contexte","changelog.detail.context.tooltip":"Contexte d'exécution structuré capturé pour cette session de journal des modifications.","changelog.detail.verification.title":"Vérification","changelog.detail.verification.tooltip":"Signaux de vérification liés à cette session de changelog.","changelog.detail.verification.label":"Résultat","changelog.detail.verification.status":"Statut","changelog.detail.verification.timestamp":"Enregistré à","changelog.detail.beforeAfter":"Avant et après","changelog.detail.filterCategory":"Catégorie","changelog.detail.filterCategory.tooltip":"Filtrez la chronologie sur une seule catégorie de changement.","changelog.detail.confidence.exact":"Exact","changelog.detail.confidence.exact.tooltip":"Les états avant et après ont été confirmés pour ce changement.","changelog.detail.confidence.partial":"Partiel","changelog.detail.confidence.partial.tooltip":"Seule une partie de l’état avant et après a pu être confirmée pour ce changement.","changelog.detail.confidence.afterOnly":"Après seulement","changelog.detail.confidence.afterOnly.tooltip":"Seul l'état résultant après le changement a pu être confirmé.","changelog.detail.confidence.intentOnly":"Intention uniquement","changelog.detail.confidence.intentOnly.tooltip":"Seule l'action demandée a été enregistrée, pas l'état résultant.","changelog.detail.confidence.unknown":"Inconnu","changelog.detail.confidence.unknown.tooltip":"Ce changement n’a pas pu être classé avec certitude à partir des données disponibles.","changelog.detail.noChanges":"Aucun changement dans cette catégorie","changelog.detail.backToList":"Retour à la liste","changelog.diff.empty":"Aucune différence disponible","changelog.diff.unified":"Unifié","changelog.diff.sideBySide":"Côte à côte","changelog.diff.before":"Avant","changelog.diff.after":"Après","sync.overlay.title":"Plugin Roblox Studio requis","sync.overlay.message":"L'état de synchronisation sera disponible une fois le plugin Roblox Studio connecté.","sync.overlay.check1":"Roblox Studio est-il en cours d'exécution ?","sync.overlay.check2":"Le WEPPY Plugin est-il installé ?","sync.status.title":"Statut de synchronisation","sync.status.title.tooltip":"État actuel de synchronisation du Studio et des fichiers locaux pour cet emplacement.","sync.status.forwardOnly":"Transférer uniquement","sync.status.forwardOnly.tooltip":"Le niveau Basic permet à Studio d'effectuer une synchronisation directe locale uniquement.","sync.status.place":"Lieu","sync.status.place.tooltip":"Nom et identifiant du lieu Roblox connecté.","sync.status.path":"Chemin","sync.status.path.tooltip":"Racine du système de fichiers local actuellement utilisée pour la sortie de synchronisation.","sync.status.instances":"Instances","sync.status.instances.tooltip":"Nombre total d'instances Roblox synchronisées suivies dans le miroir local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Nombre total de fichiers de script synchronisés actuellement indexés pour cet emplacement.","sync.status.state":"État","sync.status.state.tooltip":"État de synchronisation d'exécution actuel signalé par le serveur.","sync.directions.title":"Instructions de synchronisation","sync.directions.title.tooltip":"Direction de synchronisation par catégorie et application du comportement entre Local et Studio.","sync.directions.type":"Taper","sync.directions.type.tooltip":"Catégorie de synchronisation affectée par cette règle.","sync.directions.direction":"Direction","sync.directions.direction.tooltip":"Indique si chaque catégorie est synchronisée de Studio vers Studio ou dans les deux sens.","sync.directions.applyMode":"Mode Appliquer","sync.directions.applyMode.tooltip":"Comment les modifications de synchronisation entrantes sont appliquées pour cette catégorie.","sync.directions.deletePolicy":"Politique de suppression","sync.directions.deletePolicy.tooltip":"Contrôle si la suppression de fichiers locaux peut supprimer automatiquement les instances Studio correspondantes.","sync.directions.deletePolicy.ask":"Demander avant suppression","sync.directions.deletePolicy.ask.tooltip":"Les fichiers locaux supprimés sont vérifiés avant la suppression des instances Studio.","sync.directions.deletePolicy.auto":"Suppression automatique","sync.directions.deletePolicy.auto.tooltip":"Les fichiers locaux supprimés peuvent supprimer automatiquement les instances Studio correspondantes.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Valeurs","sync.directions.cat.containers":"Conteneurs","sync.directions.cat.data":"Données","sync.directions.cat.services":"Services","sync.directions.endpoint.local":"Locale","sync.directions.endpoint.local.tooltip":"Les fichiers locaux sur le disque sont toujours affichés sur le côté gauche du rail de direction.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio est toujours affiché sur le côté droit du rail de direction.","sync.directions.mode.manual":"Manuel","sync.directions.mode.manual.tooltip":"Applique les modifications de synchronisation uniquement lorsque vous les déclenchez manuellement.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Applique automatiquement les modifications de synchronisation lorsque les mises à jour arrivent.","sync.directions.tooltip.forward.body":"Les modifications de Studio sont synchronisées uniquement avec les fichiers locaux","sync.directions.tooltip.bidirectional.body":"Synchronisation bidirectionnelle entre Local et Studio","sync.directions.tooltip.reverse.body":"Transférer les modifications des fichiers locaux vers Studio","sync.directions.tooltip.proRequired":"Pro requis au niveau Basic","sync.directions.dir.forward":"avant","sync.directions.dir.bidirectional":"bidirectionnel","sync.directions.dir.reverse":"inverse","sync.log.title":"Journal de synchronisation","sync.log.empty":"Aucun événement de synchronisation pour l'instant","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"Une nouvelle sortie de synchronisation a été écrite sur le disque.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"Un fichier ou une instance synchronisée existante a été mise à jour.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"Un fichier ou une instance synchronisé a été supprimé.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Un événement de synchronisation a été enregistré sans mutation de fichier.","sync.upgrade.title":"Découvrir la synchronisation complète avec Pro","sync.upgrade.benefit1":"Synchronisation bidirectionnelle : modifiez des fichiers, appliquez-les automatiquement à Studio","sync.upgrade.benefit2":"Synchronisation inversée : renvoyer les modifications de fichiers vers Studio","sync.upgrade.benefit3":"Historique de synchronisation complet et journal des modifications détaillé","sync.upgrade.buy":"Voir Pro","playtest.status.title":"Statut du test de jeu","playtest.status.title.tooltip":"État actuel de la session de test de jeu Roblox signalé par Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Mode de lancement du playtest Studio pour la session en cours.","playtest.status.mode.value.tooltip":"Mode de test de jeu Roblox Studio spécifique actuellement utilisé.","playtest.status.mode.play":"Jouer","playtest.status.mode.run":"Courir","playtest.status.mode.server":"Serveur","playtest.status.mode.edit":"Modifier","playtest.status.place.tooltip":"Lieu Roblox actuellement associé à cette session de playtest.","playtest.status.state.running":"En cours d'exécution","playtest.status.state.running.tooltip":"Une session de test de jeu Roblox est actuellement en cours.","playtest.status.state.paused":"En pause","playtest.status.state.paused.tooltip":"La session de test de jeu Roblox en cours est suspendue.","playtest.status.state.notRunning":"Ne fonctionne pas","playtest.status.state.notRunning.tooltip":"Aucune session de test de jeu Roblox n'est actuellement en cours.","playtest.control.play":"Jouer","playtest.control.pause":"Pause","playtest.control.resume":"CV","playtest.control.stop":"Arrêt","playtest.history.title":"Historique des tests","playtest.history.title.tooltip":"Exécutions de tests de jeu automatisés enregistrés pour ce projet.","playtest.history.empty":"Aucun résultat de test pour l'instant","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Mode Playtest utilisé pour ce test enregistré.","playtest.history.status.passed":"Passé","playtest.history.status.failed":"Échoué","playtest.history.status.running":"En cours d'exécution","playtest.history.status.unknown":"Inconnu","playtest.history.status.tooltip":"État des résultats enregistrés pour cette exécution de test de jeu automatisé.","playtest.empty.title":"Aucun résultat de test de jeu pour l'instant","playtest.empty.message":"Les résultats apparaîtront ici après l’exécution d’un Playtest par l’agent IA.","playtest.empty.message.before":"Les résultats apparaîtront ici après l’exécution d’un Playtest par l’agent IA.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Rapport sélectionné","playtest.report.title.tooltip":"Sortie détaillée pour l’exécution de test de jeu automatisé actuellement sélectionnée.","playtest.report.content":"Rapport","playtest.report.content.tooltip":"Résumé de la démarque pour l'exécution du test de jeu automatisé sélectionné.","playtest.report.logs":"Journaux","playtest.report.logs.tooltip":"Journaux d'exécution capturés pour l'exécution du test de lecture automatisé sélectionné.","playtest.context.contextId":"ID de contexte","playtest.context.why":"Pourquoi ce test a été exécuté","playtest.context.expected":"Attendu","playtest.context.observed":"Observé","playtest.report.empty":"Aucun contenu de rapport disponible","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest est une fonctionnalité réservée à Pro","playtest.basic.desc":"Contrôlez les tests de jeu à partir de WEPPY Dashboard, exécutez des tests automatisés et consultez des rapports de test détaillés.","playtest.basic.benefit1":"Commandes de lecture/pause/arrêt en un clic","playtest.basic.benefit2":"Exécution de tests automatisés via un agent IA","playtest.basic.benefit3":"Historique des tests avec suivi des réussites/échecs","playtest.basic.benefit4":"Rapports de tests de démarque détaillés","playtest.sample.badge":"Aperçu de la vue du playtest Pro","playtest.sample.title":"Vous prévisualisez l'écran de test de jeu qui devient disponible après la mise à niveau vers Pro.","playtest.sample.message":"Cet aperçu utilise des exemples de données. Le contrôle des tests de jeu en direct, la gestion de l'historique et les rapports réels sont débloqués avec Pro.","playtest.sample.clearDisabled":"Passez à Pro pour effacer l'historique des tests de jeu en direct.","playtest.sample.place":"Aperçu de l'arène","playtest.sample.history.name":"Exemple de test de fumée dans une arène","playtest.sample.context.why":"Apparaissez dans l'arène, survivez à l'ouverture et vérifiez que le HUD répond immédiatement.","playtest.sample.context.expected":"Le joueur apparaît en toute sécurité, l'interface utilisateur du compte à rebours apparaît en une seconde et la première vague démarre sans erreur.","playtest.sample.context.observed":"Protection contre l'apparition maintenue, le HUD mis à jour à temps et la première vague terminée sans régression de gameplay.","playtest.sample.report.markdown":`# Exemple de test de fumée d'arène
139
+ [sample] preview report finished`,"sidebar.whatsNew":"Neuigkeiten","sidebar.help.group":"Hilfe & Feedback","sidebar.help.bug":"Fehler melden","sidebar.help.bug.tooltip":"Lokales Diagnosepaket erstellen und einen vorausgefuellten Fehlerbericht auf GitHub oeffnen","bugReportDialog.title":"diagnostics.zip kann bei der Fehlersuche helfen","bugReportDialog.subtitle":"WEPPY hat auf diesem Computer eine Diagnose-Zip erstellt. Sie enthält Studio-, Plugin-, Sync- und Tool-Logs, die uns helfen können zu verstehen, was passiert ist.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Du kannst den Bug Report auch ohne diese Datei senden, aber mit der Zip finden wir die Ursache meist schneller.","bugReportDialog.attachHow":"Lade die Zip herunter oder öffne ihren Speicherort und füge sie vor dem Absenden im Feld Diagnostics ZIP (optional) des GitHub-Issues hinzu.","bugReportDialog.download":"1. diagnostics.zip herunterladen","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. GitHub-Issue öffnen","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Die Zip kann lokale Logs und Projektkontext enthalten. Prüfe sie vor dem Anhängen, wenn du sie teilen möchtest.","sidebar.help.feature":"Feature vorschlagen","sidebar.help.feature.tooltip":"Neues Feature oder Verbesserung auf GitHub vorschlagen","sidebar.help.discussions":"Hilfe zu Installation und Nutzung","sidebar.help.discussions.tooltip":"Hilfe zu Installation oder Nutzung über GitHub Issues anfragen","sidebar.help.troubleshooting":"Leitfaden zur Fehlerbehebung","sidebar.help.troubleshooting.tooltip":"Offiziellen Troubleshooting-Leitfaden auf weppyai.com öffnen","header.whatsNew":"Neuigkeiten","header.whatsNew.tooltip":"Neuigkeiten","upgrade.title":"Pro ansehen","upgrade.tagline":"Pro-Funktionen ansehen","upgrade.cta":"Pro ansehen","upgrade.licenseShortcut":"Lizenz eingeben","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Neuigkeiten","whatsNew.pageSubtitle":"Bleiben Sie über MCP-Änderungen auf dem Laufenden","whatsNew.unreadSection":"Ungelesen","whatsNew.allSection":"Alle Ankündigungen","whatsNew.empty":"Noch keine Ankündigungen","whatsNew.newBadge":"NEU","whatsNew.importantBadge":"WICHTIG","whatsNew.category.release":"Release","whatsNew.category.notice":"Hinweis","whatsNew.category.deprecation":"Veraltet","whatsNew.category.tip":"Tipp","uiStudio.title":"UI Studio","uiStudio.empty":"Noch keine Screenshots gespeichert. Sie werden automatisch erstellt, wenn ein KI-Agent den aktuellen UI-Zustand erfasst.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio Plugin ist nicht verbunden","uiStudio.pluginGuide.message":"UI Studio zeigt Screenshots und Änderungsverlauf aus dem verbundenen Studio-Place. Es wird automatisch aktualisiert, sobald Studio und das WEPPY Plugin verbunden sind.","uiStudio.pluginGuide.check1":"Läuft Roblox Studio?","uiStudio.pluginGuide.check2":"Ist das WEPPY Plugin installiert und aktiv?","uiStudio.pluginGuide.waiting":"Warten auf Plugin-Verbindung...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Zuerst prüfen","uiStudio.priorityLow":"Optionale Verbesserung","uiStudio.highPrioritySection":"Zuerst prüfen","uiStudio.lowPrioritySection":"Optionale Verbesserungen","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Verlauf","uiStudio.analysis.reportsTitle":"Neueste Analyse nach UI-Ziel","uiStudio.analysis.recentCapturesTitle":"Letzte Aufnahmen","uiStudio.analysis.detailDialog":"Analysedetails","uiStudio.analysis.targetCountLabel":"Analysierte Ziele","uiStudio.analysis.captureLabel":"Aufnahmen","uiStudio.analysis.verdict.hasSuggestions":"Verbesserungsvorschläge","uiStudio.analysis.verdict.needsFix":"Verbesserungsvorschläge","uiStudio.analysis.verdict.review":"Verbesserungsvorschläge","uiStudio.analysis.verdict.passed":"Keine aktuellen Vorschläge","uiStudio.analysis.verdictLabel":"Verbesserungsübersicht","uiStudio.analysis.thresholds":"Prüfgrundlage","uiStudio.analysis.issueSummary.passed":"Auf der aktuellen Prüfgrundlage gibt es keine weiteren Verbesserungsvorschläge.","uiStudio.history.title":"Änderungsverlauf","uiStudio.history.empty":"Noch kein Verlauf vorhanden. Wenn ein KI-Agent die UI mit manage_ui ändert, wird es automatisch aufgezeichnet.","uiStudio.history.loading":"Wird geladen...","uiStudio.history.loadingPlace":"Aktueller Place wird geladen...","uiStudio.history.noPlace":"Für den aktuellen Place sind noch keine Daten verfügbar. Verbinde das WEPPY Plugin und synchronisiere einen Place, um den UI-Änderungsverlauf anzuzeigen.","uiStudio.history.noPlaceAction":"Der aktuelle Place ist noch nicht verfügbar.","uiStudio.history.error":"Fehler","uiStudio.history.clear":"Alles löschen","uiStudio.history.filter.actions":"Aktionstyp","uiStudio.history.filter.actionAll":"Alle","uiStudio.history.filter.actionCreate":"Erstellen","uiStudio.history.filter.actionUpdate":"Aktualisieren","uiStudio.history.filter.actionDelete":"Löschen","uiStudio.history.filter.period":"Zeitraum","uiStudio.history.filter.dateAll":"Alle","uiStudio.history.filter.today":"Heute","uiStudio.history.filter.yesterday":"Gestern","uiStudio.history.filter.last7Days":"Letzte 7 Tage","uiStudio.history.filter.last30Days":"Letzte 30 Tage","uiStudio.history.filter.customRange":"Eigener Zeitraum","uiStudio.history.filter.reset":"Zurücksetzen","uiStudio.history.filter.from":"Von","uiStudio.history.filter.to":"Bis","uiStudio.history.row.affectedPaths":"Pfade","uiStudio.history.row.mutations":"Änderungsdetails","uiStudio.history.row.expand":"▾ Erweitern","uiStudio.history.row.collapse":"▲ Einklappen","uiStudio.history.row.expandDetails":"{n} Änderungen anzeigen","uiStudio.history.row.collapseDetails":"Änderungen ausblenden","uiStudio.history.row.toggleDetails":"Änderungsdetails umschalten","uiStudio.history.row.mutationsEmpty":"Keine Änderungsdetails","uiStudio.history.row.toolLabel":"UI-Änderungen ({n})","uiStudio.history.row.compare":"Vorher / Nachher","uiStudio.history.row.noBeforeState":"Kein Vorher-Zustand","uiStudio.history.row.noAfterState":"Kein Nachher-Zustand","uiStudio.history.row.qualityPlan":"Designrichtung","uiStudio.history.row.designCheck":"Vorschläge","uiStudio.history.row.designCheckUnavailable":"Vorschläge: nicht verfügbar","uiStudio.history.row.designCheckNone":"Vorschläge: keine","uiStudio.history.selection.deleteSelected":"Ausgewählte löschen","uiStudio.history.selection.selectAll":"Alle auswählen","uiStudio.history.selection.clearSelection":"Auswahl aufheben","uiStudio.history.confirm.deleteRequestsTitle":"Änderungsprotokolle löschen","uiStudio.history.confirm.deleteRequestsMessage":"Die ausgewählten Änderungsprotokolle werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.history.confirm.clearRequestsTitle":"Änderungsverlauf löschen","uiStudio.history.confirm.clearRequestsMessage":"Der Änderungsverlauf des aktuellen Place wird gelöscht. Studio-Instanzen sind nicht betroffen.","uiStudio.history.confirm.cascadeOption":"Verknüpfte Screenshots ebenfalls löschen","uiStudio.history.drawer.close":"Schließen","uiStudio.actions.previewAgain":"Erneut vorschau","uiStudio.actions.deleteSnapshot":"Diesen Screenshot löschen","uiStudio.actions.proRequired":"Nach Pro-Upgrade verfügbar","uiStudio.actions.captureCurrentState":"Aktuellen Zustand erfassen","uiStudio.actions.checkSuggestionsAgain":"Vorschläge erneut prüfen","uiStudio.actions.previewRunning":"Wird erfasst…","uiStudio.actions.previewRunningDetail":"Nach Abschluss wird die neue Screenshot-Datei-ID angezeigt.","uiStudio.actions.previewNeedsSaveCheck":"Erfassung abgeschlossen, Speicherung prüfen","uiStudio.actions.previewSaved":"Neuer Screenshot gespeichert","uiStudio.actions.previewComplete":"Erfassung abgeschlossen","uiStudio.actions.previewSavedDetail":"Vorhandene Screenshots bleiben erhalten; dies wurde als neue Datei gespeichert.","uiStudio.actions.previewSavedPathMissing":"Eine neue Screenshot-ID wurde zurückgegeben, aber der Speicherpfad konnte nicht bestätigt werden.","uiStudio.actions.previewSnapshotIdMissing":"Die neue Screenshot-ID konnte nicht bestätigt werden. Aktualisiere die Liste, um zu prüfen, ob sie gespeichert wurde.","uiStudio.actions.more":"Mehr","uiStudio.gallery.selection.selectedCount":" ausgewählt","uiStudio.confirm.deleteSnapshotTitle":"Screenshot löschen","uiStudio.confirm.deleteSnapshotMessage":"Nur diese Screenshot-Datei wird gelöscht (Studio-Instanz bleibt erhalten).","uiStudio.confirm.deleteBatchTitle":"Ausgewählte Screenshots löschen","uiStudio.confirm.deleteBatchMessage":"Die ausgewählten Screenshots werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.gallery.selectMode":"Auswählen","uiStudio.gallery.exitSelectMode":"Abbrechen","uiStudio.gallery.selectAll":"Alle auswählen","uiStudio.gallery.clearSelection":"Auswahl aufheben","uiStudio.gallery.deleteSelected":"Auswahl löschen","common.save":"Speichern","common.cancel":"Abbrechen","common.delete":"Löschen","uiStudio.storage.title":"Gespeicherte UI Studio-Daten","uiStudio.storage.usageLabel":"In Verwendung","uiStudio.storage.historyBytes":"Verlauf","uiStudio.storage.snapshotBytes":"Screenshots","uiStudio.storage.requestCount":"Änderungsprotokolle","uiStudio.storage.mutationCount":"Änderungsdetails","uiStudio.storage.snapshotCount":"Screenshots","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Letzte automatische Bereinigung","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"freigegeben","uiStudio.storage.lastRunErrors":"Fehler","uiStudio.storage.loading":"Lädt...","uiStudio.cleanup.policy.title":"Richtlinie zur automatischen Löschung","uiStudio.cleanup.policy.modeOff":"Deaktiviert","uiStudio.cleanup.policy.modeAge":"Altersbasiert","uiStudio.cleanup.policy.modeSize":"Größenbasiert","uiStudio.cleanup.policy.cascade":"Auch verknüpfte Screenshots löschen","uiStudio.cleanup.policy.save":"Richtlinie speichern","uiStudio.cleanup.policy.runNow":"Gespeicherte Regel ausführen","uiStudio.cleanup.policy.proRequired":"Nach dem Upgrade auf Pro verfügbar","uiStudio.cleanup.policy.daysUnit":"T","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Richtlinie bestätigen","uiStudio.cleanup.policy.confirm.messageStrict":"Diese Richtlinie wird sofort löschen","uiStudio.cleanup.policy.confirm.requests":" Änderungsprotokolle","uiStudio.cleanup.policy.confirm.snapshots":" Screenshots","uiStudio.cleanup.policy.confirm.freed":"freigegeben — Anwenden?","uiStudio.cleanup.keepLastNDays":"Nur letzte {n} Tage behalten","uiStudio.cleanup.selectedDelete":"Auswahl löschen…","uiStudio.cleanup.deleteAll":"Alles löschen…","uiStudio.cleanup.cleanupConfirmTitle":"Bereinigung bestätigen","uiStudio.cleanup.cleanupConfirmMessage":"Die ausgewählten Elemente werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Manuelle Bereinigung","uiStudio.cleanup.studioPreservedNote":"Diese Aktion löscht nur Verlaufs- und Screenshot-Dateien auf dem Datenträger; Roblox Studio-Instanzen sind nicht betroffen.","uiStudio.history.sample.bannerBadge":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerTitle":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerMessage":"Diese Vorschau verwendet Beispieldaten. Echter Anfrageverlauf, Vorher/Nachher-Vergleich und Massenlöschung sind in Pro verfügbar.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Auf Pro upgraden, um den vollständigen Verlauf freizuschalten","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Gespeicherte Regel ausführen","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clearAll":"Alles leeren","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"MCP-Server verbunden","toast.serverDisconnected":"MCP-Server getrennt","toast.pluginConnected":"Plugin verbunden","toast.pluginDisconnected":"Plugin getrennt","toast.clearSuccess":"Erfolgreich geleert","toast.clearFailed":"Daten konnten nicht geleert werden","common.clear":"Leeren","settings.license.activate":"Lizenz aktivieren","settings.license.refresh":"Lizenz aktualisieren","settings.license.keyInput":"Lizenzschlüssel","settings.license.disconnected":"Getrennt","settings.license.disconnected.tooltip":"Verbinden Sie sich erneut mit dem MCP-Server, um Lizenzaktionen über das WEPPY Dashboard zu verwalten.","settings.license.live.tooltip":"Lizenzaktionen werden sofort an den MCP-Server gesendet.","settings.license.status.activationRequired":"Aktivierung erforderlich","settings.license.status.activationRequired.tooltip":"Eine manuelle Lizenzaktivierung ist erforderlich, bevor das WEPPY Dashboard diesen Status aktualisieren kann.","settings.license.status.grace":"Karenzzeit","settings.license.status.grace.tooltip":"Die Anbieterprüfung ist vorübergehend nicht verfügbar, der Pro-Zugriff bleibt während der Karenzzeit aktiv.","settings.license.status.graceBilling.tooltip":"Während einer abrechnungsbedingten Karenzzeit bleibt der Pro-Zugriff verfügbar.","settings.license.detail.graceBilling":"Der Pro-Zugriff bleibt während einer Abrechnungs-Karenzzeit verfügbar.","settings.license.detail.graceProviderUnavailable":"Anbieter nicht verfügbar. Der Pro-Zugriff bleibt im Karenzmodus aktiv.","settings.license.detail.manualActivation":"Manuelle Aktivierung erforderlich, um den Pro-Zugriff wiederherzustellen.","settings.license.detail.missingSessionToken":"Die Aktualisierung ist blockiert, da das aktuelle Session-Token fehlt.","settings.license.detail.refreshRecommended":"Die Lizenzprüfung sollte bald aktualisiert werden.","connection.agents.kill":"Beenden","connection.agents.kill.title":"Agent beenden?","connection.agents.killed":"Agent beendet","connection.agents.killFailed":"Agent konnte nicht beendet werden","connection.agents.lastCommand":"Letzter Befehl","connection.agents.lastCommand.tooltip":"Der zuletzt von diesem Agenten ausgeführte Tool-Aufruf","connection.agents.lastSeen":"Zuletzt aktiv","connection.agents.lastSeen.tooltip":"Der letzte Heartbeat oder die letzte Aktivität dieses Agenten","connection.clear.title":"Verbindungsprotokoll leeren?","connection.clear.message":"Dadurch wird das gespeicherte Verbindungsprotokoll des aktuellen Projekts dauerhaft entfernt.","sync.clear.title":"Synchronisierungsprotokoll leeren?","sync.clear.message":"Dadurch wird das gespeicherte Synchronisierungsprotokoll des aktuellen Place dauerhaft entfernt.","playtest.clear.title":"Testverlauf leeren?","playtest.clear.message":"Dadurch werden die gespeicherten Playtest-Berichte des aktuellen Place dauerhaft entfernt.","changelog.clear.title":"Änderungsprotokoll leeren?","changelog.clear.message":"Dadurch wird das gespeicherte Änderungsprotokoll des aktuellen Place dauerhaft entfernt.","sync.status.placePath":"Place-Pfad","sync.status.placePath.tooltip":"Aktives Place-Verzeichnis, in das Explorer-Dateien synchronisiert werden.","tier.progress.label":"Pro / Gesamt","changelog.card.representativeArea":"Repräsentativer Bereich","changelog.card.verification":"Überprüfung","uiStudio.designCheckResultsTitle":"Design-Check-Vorschläge","uiStudio.actions.designCheckAgain":"Erneut prüfen","uiStudio.actions.designCheckRunning":"Vorschläge werden geprüft...","uiStudio.actions.designCheckRunningDetail":"Nach Abschluss werden zuerst zu prüfende, empfohlene und optionale Elemente angezeigt.","uiStudio.actions.designCheckComplete":"Vorschlagsprüfung abgeschlossen","uiStudio.actions.designCheckNoSnapshotSaved":"Diese Aktion speichert keine neue Screenshot-Datei.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.priorityMedium":"Prüfung empfohlen","uiStudio.mediumPrioritySection":"Prüfung empfohlen","uiStudio.history.row.qualityPlan.tooltip":"Für diese Änderung verwendete Brief-Designrichtung.","uiStudio.history.row.designCheck.tooltip":"Zusammenfassung der Design-Check-Vorschläge nach der Änderung.","uiStudio.gallery.priorityHighBadge.tooltip":"Anzahl der zuerst zu prüfenden Vorschläge. Für Details klicken.","uiStudio.gallery.priorityMediumBadge.tooltip":"Anzahl der empfohlenen Vorschläge.","uiStudio.gallery.priorityLowBadge.tooltip":"Anzahl der optionalen Verbesserungen.","settings.dataHistory.clear.tooltip":"Nur die für diesen Eintrag gespeicherten Daten löschen. Roblox-Studio-Daten werden nicht geändert.","settings.dataHistory.connectionLog.metric.tooltip":"Anzahl gespeicherter Verbindungsereignisse und belegter Speicherplatz.","settings.dataHistory.open.tooltip":"Die Seite öffnen, die diesen Eintrag im Detail zeigt.","settings.dataHistory.playtestReports.metric.tooltip":"Anzahl gespeicherter Playtest-Berichte und belegter Speicherplatz.","settings.dataHistory.projectChanges.metric.tooltip":"Anzahl gespeicherter Projektänderungs-Zusammenfassungen und belegter Speicherplatz.","settings.dataHistory.syncLog.metric.tooltip":"Anzahl gespeicherter Sync-Ereignisse und belegter Speicherplatz.","settings.dataHistory.toggle.tooltip":"Diesen Abschnitt ein- oder ausklappen.","settings.dataHistory.manageStorage":"Speicher verwalten","settings.dataHistory.manageStorage.tooltip":"Speicherrichtlinie und Bereinigungsoptionen ein- oder ausblenden.","settings.dataHistory.manageStorage.projectChanges.aria":"Speicher der Projektänderungsübersicht verwalten","settings.dataHistory.manageStorage.uiStudio.aria":"Speicher für UI-Studio-Verlauf und Screenshots verwalten","settings.dataHistory.toolStats.metric.tooltip":"Aggregierte Gesamtaufrufe und Sitzungszahlen.","settings.dataHistory.toolsActivity.metric.tooltip":"Anzahl gespeicherter Tool-Ausführungen und belegter Speicherplatz.","settings.dataHistory.uiStudio.metric.tooltip":"UI-Studio-Änderungsdatensätze, Capture-Anzahlen und gesamte Speichernutzung.","settings.language.auto.tooltip":"Die Sprache des Betriebssystems verwenden. Fällt auf Englisch zurück, wenn sie nicht unterstützt wird.","settings.license.activate.tooltip":"Pro-Funktionen mit dem eingegebenen Lizenzschlüssel aktivieren.","settings.license.refresh.tooltip":"Den aktuellen Status erneut vom Lizenzserver abrufen. Nützlich, wenn eine Abrechnungsänderung noch nicht sichtbar ist.","settings.license.reset.tooltip":"Den aktuell registrierten Lizenzschlüssel entfernen. Vor dem Aktivieren mit einem anderen Schlüssel verwenden.","tier.upgrade.tooltip":"Pro-Funktionen und Kaufoptionen ansehen.","uiStudio.actions.captureCurrentState.tooltip":"Den aktuellen Zustand dieses UI-Ziels als neuen Screenshot erfassen.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Die Design-Check-Vorschläge für dieses UI-Ziel erneut prüfen.","uiStudio.actions.deleteSnapshot.tooltip":"Nur diese gespeicherte Screenshot-Datei löschen. Roblox Studio wird nicht geändert.","uiStudio.actions.more.tooltip":"Weitere Aktionen für diesen Screenshot anzeigen.","uiStudio.analysis.counts.tooltip":"Zeigt, wie viele Vorschläge als zuerst prüfen, empfohlen oder optional markiert sind.","uiStudio.analysis.recentCapturesTitle.tooltip":"Die zuletzt gespeicherten Screenshots für UI-Studio-Analyse und Debugging.","uiStudio.analysis.reportsTitle.tooltip":"Der neueste Analysebericht je UI-Ziel.","uiStudio.analysis.thresholds.tooltip":"Der für diese Prüfung verwendete Schwellenwertsatz (Standard oder benutzerdefiniert).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"In diesem UI wurden Verbesserungen gefunden. Karte anklicken, um Details zu sehen.","uiStudio.analysis.verdict.passed.tooltip":"Unter den aktuellen Prüfschwellen werden keine Verbesserungen vorgeschlagen.","uiStudio.analysis.verdictLabel.tooltip":"Gesamtbewertung der Verbesserungen für diesen Capture.","uiStudio.briefId.tooltip":"Kennung des Design-Briefs, der dieses UI erzeugt hat.","uiStudio.capturedAt.tooltip":"Zeitpunkt, zu dem dieser Screenshot gespeichert wurde.","uiStudio.cleanup.deleteAll.tooltip":"Alle Änderungsdatensätze und Captures für dieses Projekt löschen. Das tatsächliche UI in Roblox Studio bleibt unverändert.","uiStudio.cleanup.keep30.tooltip":"Änderungsdatensätze und Captures löschen, die älter als 30 Tage sind.","uiStudio.cleanup.keep7.tooltip":"Änderungsdatensätze und Captures löschen, die älter als 7 Tage sind.","uiStudio.cleanup.label.tooltip":"Änderungsdatensätze und Captures jederzeit manuell bereinigen.","uiStudio.cleanup.policy.ageInput.tooltip":"Einen beliebigen Wert zwischen 1 und 365 Tagen eingeben.","uiStudio.cleanup.policy.agePreset.tooltip":"Daten löschen, die älter als diese Anzahl von Tagen sind.","uiStudio.cleanup.policy.cascade.tooltip":"Auch die Capture-Bilder löschen, die mit diesen Datensätzen verknüpft sind. Wenn aus, bleiben die Bilder erhalten.","uiStudio.cleanup.policy.modeAge.tooltip":"Daten automatisch löschen, die älter als die konfigurierte Anzahl von Tagen sind.","uiStudio.cleanup.policy.modeOff.tooltip":"Automatische Bereinigung ausschalten. Daten bleiben erhalten, bis du sie manuell entfernst.","uiStudio.cleanup.policy.modeSize.tooltip":"Wenn die Gesamtnutzung das Limit überschreitet, werden die ältesten Daten zuerst entfernt.","uiStudio.cleanup.policy.runNow.tooltip":"Die gespeicherte Bereinigungsregel jetzt einmal ausführen, ohne auf den nächsten geplanten Lauf zu warten.","uiStudio.cleanup.policy.save.tooltip":"Die aktuelle Bereinigungsregel speichern. Danach läuft sie im Hintergrund.","uiStudio.cleanup.policy.sizeInput.tooltip":"Einen beliebigen Wert zwischen 50 MB und 10000 MB (10 GB) eingeben.","uiStudio.cleanup.policy.sizePreset.tooltip":"Die Gesamtnutzung unter dieser Größe halten.","uiStudio.cleanup.policy.title.tooltip":"Regeln, die alte oder große Captures automatisch entfernen.","uiStudio.colCurrent.tooltip":"Der aktuell angewendete Wert.","uiStudio.colRecommended.tooltip":"Der empfohlene Wert.","uiStudio.compare.after.tooltip":"Der Bildschirm, der direkt nach der KI-Änderung gespeichert wurde.","uiStudio.compare.before.tooltip":"Der Bildschirm, der direkt vor der KI-Änderung gespeichert wurde.","uiStudio.compare.path.tooltip":"Der UI-Instanzpfad für diesen Bildschirm.","uiStudio.copyFixCommand.tooltip":"Eine Eingabeaufforderung kopieren, die die KI bittet, dieses Problem zu beheben.","uiStudio.detailClose.tooltip":"Detailansicht schließen.","uiStudio.falsePositiveWarning.tooltip":"Diese Prüfung kann Fehlalarme erzeugen — vor dem Anwenden überprüfen.","uiStudio.gallery.cardCheckbox.tooltip":"Diesen Capture auswählen. Wähle mehrere aus, um sie zusammen zu löschen.","uiStudio.gallery.clearSelection.tooltip":"Die aktuelle Capture-Auswahl aufheben.","uiStudio.gallery.deleteSelected.tooltip":"Die ausgewählten Screenshot-Dateien löschen. Roblox Studio bleibt unverändert.","uiStudio.gallery.selectAll.tooltip":"Alle aktuell sichtbaren Captures auswählen.","uiStudio.groupSummary.tooltip":"Anzahl der UI-Elemente, die zu dieser Gruppe passen.","uiStudio.history.clear.tooltip":"Alle Änderungsdatensätze für dieses Projekt löschen. Das tatsächliche UI in Roblox Studio bleibt unverändert.","uiStudio.history.filter.actionAll.tooltip":"Alle Aktionsarten anzeigen.","uiStudio.history.filter.actionCreate.tooltip":"Nur Aktionen anzeigen, die ein neues UI erstellt haben.","uiStudio.history.filter.actionDelete.tooltip":"Nur Aktionen anzeigen, die ein UI gelöscht haben.","uiStudio.history.filter.actionUpdate.tooltip":"Nur Aktionen anzeigen, die ein bestehendes UI aktualisiert haben.","uiStudio.history.filter.actions.tooltip":"Datensätze nach der Art der KI-Änderung filtern.","uiStudio.history.filter.customRange.tooltip":"Ein benutzerdefiniertes Start- und Enddatum wählen.","uiStudio.history.filter.dateAll.tooltip":"Den gesamten Verlauf anzeigen.","uiStudio.history.filter.from.tooltip":"Startdatum für die Abfrage.","uiStudio.history.filter.last30Days.tooltip":"Änderungen der letzten 30 Tage anzeigen.","uiStudio.history.filter.last7Days.tooltip":"Änderungen der letzten 7 Tage anzeigen.","uiStudio.history.filter.period.tooltip":"Datensätze nach Zeitraum filtern.","uiStudio.history.filter.reset.tooltip":"Alle Filter auf Standardwerte zurücksetzen.","uiStudio.history.filter.to.tooltip":"Enddatum für die Abfrage.","uiStudio.history.filter.today.tooltip":"Nur heutige Änderungen anzeigen.","uiStudio.history.filter.yesterday.tooltip":"Nur gestrige Änderungen anzeigen.","uiStudio.history.row.affectedPaths.tooltip":"Anzahl der UIs, die von dieser Aktion betroffen sind.","uiStudio.history.row.compare.tooltip":"Vorher- und Nachher-Bildschirm vergleichen. Zum Öffnen der vollständigen Vergleichsansicht klicken.","uiStudio.history.row.extraPaths.tooltip":"Anzahl zusätzlicher UIs, die in dieser Aktion geändert wurden.","uiStudio.history.row.mutations.tooltip":"Anzahl detaillierter Änderungen (z. B. Eigenschaftsänderungen).","uiStudio.history.row.noAfterState.tooltip":"Nach dieser Änderung wurde kein Capture gespeichert.","uiStudio.history.row.noBeforeState.tooltip":"Vor dieser Änderung wurde kein Capture gespeichert.","uiStudio.history.row.toggleDetails.tooltip":"Eine zeilenweise Aufschlüsselung der Änderungen ein- oder ausblenden.","uiStudio.history.title.tooltip":"Eine Zeitleiste aller UI-Änderungen, die von KI vorgenommen wurden.","uiStudio.scope.tooltip":"Capture-Bereich (voller Bildschirm oder ein bestimmtes UI).","uiStudio.storage.historyBytes.tooltip":"Speicherplatz für Änderungsdatensätze (JSON).","uiStudio.storage.lastRun.tooltip":"Wann die automatische Bereinigungsregel zuletzt lief und was entfernt wurde.","uiStudio.storage.mutationCount.tooltip":"Anzahl detaillierter Änderungen innerhalb von Aktionen (eine Eigenschaftsänderung = 1).","uiStudio.storage.requestCount.tooltip":"Anzahl der Aktionen, bei denen die KI das UI geändert hat.","uiStudio.storage.snapshotBytes.tooltip":"Speicherplatz für erfasste PNG-Bilddateien.","uiStudio.storage.snapshotCount.tooltip":"Anzahl gespeicherter Capture-Bilddateien.","uiStudio.storage.title.tooltip":"Speichernutzung von UI-Studio-Änderungsdatensätzen und Screenshots.","uiStudio.storage.usageLabel.tooltip":"Speicherplatz, den UI Studio aktuell für dieses Projekt verwendet.","uiStudio.suggestionGroup.tooltip":"Vorschläge derselben Art, gruppiert angezeigt. Zum Ein- oder Ausklappen klicken.","uiStudio.tabs.analysis.tooltip":"Neueste UI-Captures und Design-Check-Vorschläge überprüfen.","uiStudio.tabs.history.tooltip":"Von KI vorgenommene UI-Änderungen mit Vorher-/Nachher-Captures prüfen.","uiStudio.target.tooltip":"Exakter Pfad der erfassten UI-Instanz.","uiStudio.title.tooltip":"UI-Studio-Captures und Designvorschläge für Roblox-UI.","tier.banner.progressLabel":"Pro / Gesamt","uiStudio.error":"Fehler","uiStudio.analysis.expandChildren":"Unterziele anzeigen","uiStudio.analysis.openDetail":"Detail öffnen","uiStudio.analysis.childTargets":"Unterziele","uiStudio.analysis.childDetailHint":"Details zum Unterziel öffnen","uiStudio.compare.before":"Vorher","uiStudio.compare.after":"Nachher","uiStudio.history.drawer.changeDetails":"Änderungsdetails","uiStudio.gallery.cardCheckbox":"Screenshot auswählen","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Alle Bereiche","assets.explorer.label":"Asset-Explorer","assets.breadcrumb.label":"Asset-Pfad","assets.explorer.summary":"{direct} in diesem Ordner · {descendant} in Unterordnern","assets.folder.count.one":"1 Asset","assets.folder.count.many":"{count} Assets","assets.folder.type":"Ordner","assets.folders.title":"Ordner","assets.folder.assetsTitle":"Assets in diesem Ordner","assets.organization.label":"Durchsuchen","assets.organization.folders":"Ordner","assets.organization.all":"Alle Assets","assets.organization.summary":"{count} Assets","assets.view.options":"Ansichtsoptionen","assets.view.mode":"Ansichtsmodus","assets.view.grid":"Raster","assets.view.list":"Liste","assets.view.thumbnailSize":"Miniaturgröße","assets.view.thumbnailSize.listReason":"Die Miniaturgröße ist in der Rasteransicht verfügbar.","assets.view.size.small":"Klein","assets.view.size.medium":"Mittel","assets.view.size.large":"Groß","assets.list.name":"Name","assets.list.type":"Typ","assets.list.scope":"Bereich","assets.list.status":"Status","assets.list.updated":"Aktualisiert","assets.loading.scope":"Assets für {scope} werden geladen...","assets.partial.title":"Einige Speicherorte konnten nicht geladen werden","assets.empty.folderTitle":"Keine passenden Assets in diesem Ordner","assets.empty.folderBody":"Versuche einen anderen Ordner oder Kategoriefilter.","assets.empty.filteredTitle":"Keine Assets entsprechen diesem Filter","assets.empty.filteredBody":"Wähle eine andere Kategorie oder scanne die passenden Ordner erneut.","assets.place.selector":"Asset place","assets.place.context":"Asset-Place-Kontext","assets.place.sharedLibrary":"Gemeinsame Bibliothek","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Funktionsweise","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Schließen","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio-Routing","controls.studioRouting.title.tooltip":"Priorität für MCP-Anfragen ohne angegebenes Studio.","controls.studioRouting.settingLabel":"Anfragen ohne angegebenes Studio","controls.studioRouting.mode.auto":"Automatisch","controls.studioRouting.mode.pinned":"Studio festlegen","controls.studioRouting.state.auto":"Aktuell: automatisch","controls.studioRouting.state.pinned":"Aktuell: Studio festgelegt","controls.studioRouting.saving":"Wird angewendet…","controls.studioRouting.applied":"Angewendet","controls.studioRouting.failed":"Anwenden fehlgeschlagen","controls.studioRouting.pinnedUnavailable":"Verbinde ein Studio, um ein Studio festzulegen.","controls.studioRouting.helpLabel":"So funktioniert das Studio-Routing","controls.studioRouting.helpButton":"Wie funktioniert das?","controls.studioRouting.selectTarget":"Festes Studio auswählen","controls.studioRouting.select":"Auswählen","controls.studioRouting.targetGroupLabel":"Festgelegtes Studio","controls.luauValidation.title":"Luau-Syntaxprüfung","controls.luauValidation.settingLabel":"Nach Script-Änderungen automatisch prüfen","controls.luauValidation.benefit":"Nach einer Script-Änderung durch die KI auf Luau-Syntaxfehler prüfen.","controls.luauValidation.state.on":"Aktuell: Ein","controls.luauValidation.state.off":"Aktuell: Aus","controls.luauValidation.priority":"Wenn eine KI-Anfrage von dieser Option abweicht, gilt die Dashboard-Einstellung. Hier ein- oder ausschalten, um die Prüfung von Script-Änderungen anzupassen.","controls.luauValidation.switchLabel":"Automatische Prüfung nach Script-Änderungen","controls.luauValidation.saving":"Wird gespeichert…","controls.luauValidation.applied":"Angewendet","controls.luauValidation.failed":"Anwenden fehlgeschlagen","controls.luauValidation.helpLabel":"So funktioniert die automatische Luau-Syntaxprüfung","controls.luauValidation.helpButton":"Wie funktioniert das?","controls.luauValidation.help.behavior":"Wenn die Option eingeschaltet ist, prüft WEPPY nach dem Ersetzen, Bearbeiten, Einfügen oder Löschen von Script-Zeilen durch die KI den tatsächlich gespeicherten vollständigen Code. Wenn sie ausgeschaltet ist, wird nur das Script geändert.","controls.luauValidation.help.response":"Bei einem fehlerfreien Script bleibt die übliche kurze Abschlussmeldung erhalten. WEPPY zeigt nur dann Details, wenn ein Fehler gefunden oder die Prüfung nicht abgeschlossen wird. Große Scripts können etwas länger dauern.","controls.luauValidation.help.nonBlocking":"Wenn WEPPY einen Syntaxfehler findet oder die Prüfung nicht abschließen kann, wird die gespeicherte Script-Änderung nicht rückgängig gemacht. Das Ergebnis hilft der KI, dasselbe Script sofort zu korrigieren.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Mehrere verbundene Studio-Fenster haben dieselbe Place ID. Verwende für diesen Ort die Studio ID.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Anfragen mit Studio ID, Connection ID oder Place ID umgehen diese Priorität und werden an das angegebene Studio gesendet.","controls.studioRouting.state.currentTarget":"Aktuelles Prioritätsziel","controls.studioRouting.noPriorityTarget":"Kein Studio verbunden","controls.studioRouting.help.auto":"Automatisch nutzt das aktive Studio mit der höchsten Priorität anhand der letzten Befehle und der Verbindungsreihenfolge.","controls.studioRouting.help.pinned":"Studio festlegen nutzt das ausgewählte Studio, wenn die Anfrage keine Ziel-ID angibt.","sync.migration.title":"Update des Sync-Formats verfügbar","sync.migration.description":"Prüfe die Metadatenänderungen, bevor du diesen Place vom Sync-Format v2 auf v3 aktualisierst.","sync.migration.status.ready":"Bereit zur Prüfung","sync.migration.status.blocked":"Blockiert","sync.migration.preview":"Änderungen prüfen","sync.migration.summary.add":"Hinzufügen","sync.migration.summary.modify":"Ändern","sync.migration.summary.delete":"Löschen","sync.migration.summary.blocked":"Blockiert","sync.migration.changes":"Metadatenänderungen","sync.migration.blockers":"Zu lösende Punkte","sync.migration.operation.add":"hinzufügen","sync.migration.operation.modify":"ändern","sync.migration.operation.delete":"löschen","sync.migration.reason.serializer_regeneration":"Schreibt Metadaten im kanonischen v3-Format neu.","sync.migration.reason.volatile_metadata_removal":"Entfernt flüchtige Sync-Metadaten.","sync.migration.reason.redundant_empty_metadata":"Entfernt überflüssige leere Metadaten.","sync.migration.reason.runtime_ignore_policy":"Aktualisiert die verwaltete Runtime-Ausschlussregel.","sync.migration.reason.reverse_pending":"Wende ausstehende lokale Änderungen an Studio zuerst an oder verwirf sie.","sync.migration.reason.conflict":"Löse zuerst den Konflikt zwischen lokalen Dateien und Studio.","sync.migration.reason.local_canonical_change":"Prüfe zuerst die lokal geänderten kanonischen Metadaten.","sync.migration.reason.source_mutation_detected":"Eine Benutzerquelldatei wurde während der Prüfung geändert.","sync.migration.blocked":"Löse Sync-Konflikte vor dem Update","sync.migration.stale":"Die Vorschau hat sich geändert. Prüfe den neuesten Unterschied.","sync.migration.error":"Das Sync-Format konnte nicht aktualisiert werden. Versuche es erneut.","sync.migration.refresh":"Vorschau aktualisieren","sync.migration.refreshing":"Wird aktualisiert…","sync.migration.applying":"Wird angewendet…","sync.migration.apply":"Update anwenden","sync.migration.confirm.title":"Update des Sync-Formats anwenden?","sync.migration.confirm.message":"Die aufgeführten Sync-Metadaten werden gesichert und aktualisiert. Deine Luau-Quelldateien bleiben unverändert.","changelog.ownership.showGenerated":"Generierte Metadaten anzeigen","changelog.ownership.userSource":"Benutzerquelle","changelog.ownership.canonicalMirror":"Spiegel-Metadaten","changelog.ownership.generated":"Generiert"},$y={"sidebar.overview":"Aperçu","sidebar.changelog":"Journal des modifications","sidebar.connection":"Connexion","sidebar.sync":"Synchroniser","sidebar.playtest":"Test de jeu","sidebar.tools":"Outils","sidebar.settings":"Paramètres","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Connexion au serveur MCP requise","sidebar.gate.l2":"Connexion au plugin Roblox Studio requise","header.currentProject":"Projet actuel","header.unknownProject":"Projet inconnu","header.projectRoot.label":"Racine du projet","header.currentProject.loading":"Chargement de la racine du projet...","header.currentProject.unavailable":"Racine Project indisponible","header.placeNotConnected":"Lieu non connecté","header.currentProject.tooltip":"Dossier de projet actuellement sélectionné","header.currentProject.loading.tooltip":"Les informations racine de Project sont toujours en cours de chargement","header.currentProject.unavailable.tooltip":"Les informations sur la racine du projet actuel ne sont pas disponibles","header.currentProjectSyncRoot.label":"Synchroniser la racine","header.currentProjectSyncRoot.loading":"Chargement de la racine de synchronisation...","header.currentProjectSyncRoot.unavailable":"Racine de synchronisation indisponible","header.currentProjectSyncRoot.tooltip":"Dossier racine de synchronisation actuel pour le projet sélectionné","header.currentProjectSyncRoot.loading.tooltip":"Les informations sur la racine de synchronisation sont toujours en cours de chargement","header.currentProjectSyncRoot.unavailable.tooltip":"Les informations actuelles sur la racine de synchronisation ne sont pas disponibles","header.testFiles.label":"Fichiers de test","header.testFiles.unavailable":"Fichiers de test indisponibles","header.testFiles.tooltip":"Répertoire actuel des fichiers de test de lecture pour l'endroit sélectionné","header.places.title":"Lieux","header.places.active":"Actif","header.places.inactive":"Inactif","header.places.pluginRequired":"Connexion plug-in requise","header.places.liveRequired":"Connexion plug-in requise pour le lieu actif en direct","header.place.tooltip":"Lieu Roblox connecté","header.placeNotConnected.tooltip":"Lieu non connecté","placeScope.current.label":"Place actuel","placeScope.lastActive.label":"Dernier place actif","placeScope.selected.label":"Place sélectionné","placeScope.unknownPlace":"Place inconnu","placeScope.live":"En direct","placeScope.stored":"Enregistré","placeScope.pluginRequired":"Plugin requis","placeScope.pluginRequired.note":"Connectez le WEPPY Plugin pour confirmer le place actif en direct.","placeScope.noPlace.label":"Portée du place","placeScope.noPlace.value":"Aucune donnée de place disponible pour le moment","placeScope.noPlace.badge":"Aucun place","placeScope.noPlace.note":"Connectez le WEPPY Plugin et synchronisez un place pour créer des données par place.","placeScope.selected.note":"Seules les données enregistrées sont affichées. Le routage Studio reste inchangé.","placeScope.surface.sync":"L'état de synchronisation et les journaux utilisent ce place.","placeScope.surface.changelog":"Les sessions du journal des changements utilisent ce place.","placeScope.surface.playtest":"Les rapports de playtest utilisent ce place.","placeScope.surface.uiStudio":"Les captures UI et l'historique des changements utilisent ce place.","placeScope.surface.tools":"L'historique et les statistiques des outils utilisent ce place.","placeScope.loading":"Chargement de la portée du place...","placeScope.unavailable":"Portée du place indisponible","placeScope.selector.label":"Données du place","header.changeProjectRoot":"Changer la racine du projet Project","header.changeProjectRoot.ariaLabel":"Changer la racine du projet","header.changeProjectRoot.tooltip":"Changer la racine actuelle du projet","header.changeProjectRoot.disabledTooltip.l0":"Connexion au serveur MCP requise avant que la racine du projet puisse être modifiée","header.changeProjectRoot.disabledTooltip.loading":"Les informations racine de Project sont toujours en cours de chargement","header.changeProjectRoot.disabledTooltip.unavailable":"Les informations sur la racine du projet actuel ne sont pas disponibles","header.projectRootModal.initial.title":"Changer la racine du projet","header.projectRootModal.initial.body.connected":"Après avoir choisi un dossier de projet, MCP basculera vers la nouvelle racine du projet et le contenu actuel du Studio sera entièrement resynchronisé dans la nouvelle cible <dossier de projet sélectionné>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Après avoir choisi un dossier de projet, MCP basculera vers la nouvelle racine du projet et utilisera <dossier de projet sélectionné>/weppy-project-sync comme prochaine cible de synchronisation.","header.projectRootModal.initial.nextSyncRoot":"Nouvelle cible de synchronisation après sélection","header.projectRootModal.initial.nextSyncRoot.placeholder":"<dossier de projet sélectionné>/weppy-project-sync","header.projectRootModal.initial.warningStop":"La synchronisation actuelle s'arrête immédiatement.","header.projectRootModal.initial.warningFreshSync":"Le contenu actuel du Studio sera utilisé pour créer une nouvelle synchronisation complète dans la nouvelle cible.","header.projectRootModal.initial.warningNoMove":"Les anciens dossiers de synchronisation ne sont pas déplacés automatiquement.","header.projectRootModal.initial.warningDeferredSync":"Si Studio n'est pas connecté, la resynchronisation complète démarre à la prochaine connexion du plugin.","header.projectRootModal.confirm.title":"Confirmer la nouvelle racine du projet","header.projectRootModal.confirm.body":"Examinez le dossier de projet sélectionné avant de postuler.","header.projectRootModal.confirm.projectRoot":"Dossier de projet sélectionné","header.projectRootModal.confirm.syncRoot":"Nouvelle cible de synchronisation","header.projectRootModal.confirm.warningNoMove":"Les dossiers de synchronisation existants ne sont pas déplacés automatiquement.","header.projectRootModal.pick":"Choisir un dossier","header.projectRootModal.apply":"Appliquer le changement","header.projectRootModal.cancel":"Annuler","header.projectRootModal.error":"Échec de la modification de la racine du projet","status.online":"En ligne","status.offline":"Hors ligne","status.idle":"Inactif","status.syncing":"Synchronisation","status.error":"Erreur","status.initializing":"Initialisation","level.l0.title":"Serveur déconnecté","level.l0.message":"WEPPY Dashboard ouvert mais le serveur MCP s'est arrêté ou ne répond pas.","level.l1.title":"Serveur connecté","level.l1.hint":"Vérifiez : Roblox Studio est-il en cours d'exécution ? Le plugin est-il installé ?","level.l2.ok":"Studio connecté","tier.basic":"Basic","tier.basic.tooltip":"Niveau Basic avec l'ensemble de fonctionnalités standard WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Niveau Pro avec l'ensemble complet de fonctionnalités WEPPY Dashboard.","tier.mixed":"Mixte","tier.upgrade":"Voir Pro","tier.banner.save":"Enregistrez les jetons IA avec Pro !","tier.tool.query_instances.desc":"Inspectez les instances, recherchez les enfants et les descendants et inspectez les données de classe. Pro ajoute une arborescence de fichiers, une structure de projet et une recherche de propriétés ou de balises.","tier.tool.mutate_instances.desc":"Créez, supprimez, clonez et déplacez des instances. Pro ajoute la création d'arborescence et les opérations de création, de suppression ou de clonage en masse.","tier.tool.manage_properties.desc":"Lisez et définissez les propriétés, les attributs et les balises. Pro ajoute des mises à jour calculées, des modifications relatives et des opérations de propriété en masse.","tier.tool.manage_scripts.desc":"Lisez, écrivez, créez, supprimez, modifiez et recherchez la source du script. Pro ajoute un remplacement groupé entre les scripts.","tier.tool.manage_ui.desc":"Pro uniquement. Créez ou affinez des menus de style jeu, des HUD, des boutons, des étiquettes et des panneaux d'images, puis capturez des écrans et examinez les suggestions d'amélioration.","tier.tool.manage_ui.action.design_brief":"Planifier l'orientation de l'interface utilisateur","tier.tool.manage_ui.action.create_tree":"Créer une nouvelle interface utilisateur","tier.tool.manage_ui.action.update":"Mettre à jour l'interface utilisateur existante","tier.tool.manage_ui.action.delete":"Supprimer l'interface utilisateur","tier.tool.manage_ui.action.preview":"Capturer l'écran de l'interface utilisateur","tier.tool.manage_ui.action.check":"Examiner les suggestions d'amélioration","tier.tool.manage_lighting.desc":"Pro uniquement. Configurez l'éclairage, l'atmosphère, le ciel, les propriétés du terrain et les paramètres d'heure.","tier.tool.manage_selection.desc":"Lisez, définissez et effacez la sélection actuelle de Studio. Pro ajoute le contexte, les détails, l'ajout ou la suppression et la prise en charge de la surveillance de la sélection.","tier.tool.manage_camera.desc":"Inspectez l’état de la caméra, faites la mise au point par chemin ou position et demandez des suggestions de vues.","tier.tool.manage_tween.desc":"Pro uniquement. Créez, lisez, mettez en pause et annulez des interpolations pour une animation fluide.","tier.tool.manage_audio.desc":"Pro uniquement. Jouez, arrêtez, mettez en pause et reprenez les sons, et configurez l'écouteur audio.","tier.tool.manage_animation.desc":"Pro uniquement. Chargez, lisez et arrêtez des animations, et inspectez les pistes d'animation actives.","tier.tool.manage_physics.desc":"Pro uniquement. Enregistrez les groupes de collision, configurez les collisions de groupe et inspectez les groupes disponibles.","tier.tool.manage_effects.desc":"Pro uniquement. Émettez des particules, supprimez les effets et basculez l'état de l'effet.","tier.tool.manage_terrain.desc":"Pro uniquement. Remplissez les formes du terrain, effacez les régions, remplacez les matériaux, gérez les couleurs du terrain, lisez ou écrivez des voxels, générez du terrain et lissez le terrain.","tier.tool.spatial_query.desc":"Pro uniquement. Exécutez des raycasts, trouvez le terrain, validez le placement, scannez des zones, recherchez des positions plates ou d'apparition, analysez la possibilité de marcher, cartographiez l'espace et inspectez les collisions.","tier.tool.manage_assets.desc":"Pro uniquement. Insérez des modèles, inspectez les informations sur les actifs, recherchez dans la boutique du créateur, insérez des actifs ou des packages gratuits et exportez des actifs.","tier.tool.manage_sync.desc":"Pro uniquement. Inspectez l’état de synchronisation, la configuration, l’historique, les instructions et lisez ou écrivez les fichiers synchronisés.","tier.tool.workspace_state.desc":"Pro uniquement. Exécutez une synchronisation complète, capturez des instantanés, inspectez les modifications récentes et l'état de la fenêtre d'affichage, et gérez les métadonnées associées.","tier.tool.manage_logs.desc":"Inspectez les journaux de sortie avec filtrage, interrogation incrémentielle, effacement de la mémoire tampon et recherche d'erreurs récentes.","tier.tool.system_info.desc":"Inspectez l’état de la connexion et le niveau actuel. Pro ajoute des informations sur le lieu, des services, des paramètres de Studio, un contrôle de test de jeu et des tests automatisés.","tier.tool.manage_studio.desc":"Pro uniquement. Basculez les paramètres d'affichage de l'éditeur Studio tels que l'aperçu de l'interface utilisateur pour les flux de capture d'écran et d'assurance qualité ; il modifie les paramètres de session Studio, pas les objets de l'interface utilisateur du jeu.","tier.tool.batch_execute.desc":"Pro uniquement. Exécutez plusieurs commandes par lots, avec une exécution séquentielle et un comportement facultatif de poursuite en cas d'erreur.","tier.tool.execute_luau.desc":"Pro uniquement. Exécutez du code Luau arbitraire dans le bac à sable Roblox Studio.","connection.server.title":"État du serveur","connection.server.version":"Version","connection.server.version.tooltip":"Version du serveur MCP installée","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificateur de processus du système d'exploitation","connection.server.uptime":"Temps de disponibilité","connection.server.uptime.tooltip":"Temps écoulé depuis le démarrage du serveur MCP","connection.server.session":"Session","connection.server.session.tooltip":"Identifiant de session MCP actuel","connection.server.exec":"Exécutif","connection.server.exec.tooltip":"Chemin de l'exécutable utilisé pour lancer le serveur MCP","connection.reconnect":"Reconnecter","connection.checkSettings":"Vérifier les paramètres","connection.agents.title":"Agents IA","connection.agents.name":"Agent","connection.agents.cwd":"Directeur de travail","connection.agents.cwd.tooltip":"Répertoire de travail actuel pour l'agent AI connecté","connection.agents.projectRoot":"Racine du projet","connection.agents.projectRoot.tooltip":"Racine de projet faisant autorité pour la propriété de synchronisation","connection.agents.projectRoot.unresolved":"Non résolu","connection.agents.connected":"Connecté","connection.agents.unknown":"Inconnu","connection.agents.none":"Aucun agent connecté","connection.plugins.title":"Plugins","connection.plugins.place":"Lieu","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Vu pour la dernière fois","connection.plugins.lastSeen.tooltip":"Battement de cœur le plus récent reçu du plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Version du plugin installé signalée par Studio","connection.plugins.none":"Aucun plugin connecté","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Connexion Play/Test de Studio","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Journal de connexion","connection.log.empty":"Aucun événement pour l'instant","connection.time.secondsAgo":"il y a","connection.time.minutesAgo":"il y a m","connection.time.hoursAgo":"il y a h","common.loading":"Chargement...","common.retry":"Réessayer","common.reconnecting":"Reconnexion...","common.expand":"Développer","common.collapse":"Effondrement","tools.tab.history":"Histoire","tools.tab.statistics":"Statistiques","tools.tab.failures":"Échecs","tools.col.time":"Temps","tools.col.time.tooltip":"Date à laquelle l'exécution de l'outil a été enregistrée.","tools.col.toolAction":"Outil.Action","tools.col.toolAction.tooltip":"Nom de l’outil et action exécutée.","tools.col.duration":"Durée","tools.col.duration.tooltip":"Combien de temps l'outil a mis pour terminer.","tools.col.status":"Statut","tools.col.status.tooltip":"Résultat de l'exécution de l'outil enregistrée.","tools.col.tier":"Étage","tools.col.tier.tooltip":"Niveau de licence requis pour l’outil ou l’action.","tools.col.tierStats.tooltip":"Basic, Pro ou résumé mixte pour la ligne de statistiques de l'outil.","tools.col.tool":"Outil","tools.col.tool.tooltip":"Nom de l'outil consolidé dans le tableau des statistiques.","tools.col.calls":"Appels","tools.col.calls.tooltip":"Nombre total d'appels enregistrés pour cet outil.","tools.col.ok":"OK","tools.col.ok.tooltip":"Nombre d'exécutions directes réussies.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Nombre d'exécutions réussies grâce à une exécution de secours.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Nombre d'exécutions bloquées sans exécution de secours.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Nombre d'échecs attendus provoqués par l'entrée de l'appelant, l'état du projet, la stratégie Roblox ou le code utilisateur.","tools.col.err":"FAILED","tools.col.err.tooltip":"Nombre d'exécutions ayant échoué.","tools.col.okRate":"D'ACCORD%","tools.col.okRate.tooltip":"Pourcentage d'appels terminés avec succès.","tools.col.avgTime":"Temps moyen","tools.col.avgTime.tooltip":"Temps d'exécution moyen sur les appels enregistrés.","tools.col.error":"Erreur","tools.filter.tool":"Outil","tools.filter.all":"Tous","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Cette entrée utilisait un outil ou une action uniquement Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"L'action Pro demandée a réussi via un repli Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"L'action Pro demandée a été bloquée et aucune solution de secours n'a été exécutée.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"L’appel de l’outil a échoué en raison d’un problème attendu d’appelant, de projet, de stratégie ou de code utilisateur.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"L’exécution de l’outil a échoué.","tools.status.ok":"OK","tools.status.ok.tooltip":"L’exécution de l’outil s’est terminée avec succès.","tools.tier.mixed.tooltip":"Cet outil comprend à la fois les actions Basic et Pro.","tools.detail.params":"Paramètres","tools.detail.params.tooltip":"Paramètres d’entrée transmis à cette exécution d’outil.","tools.detail.result":"Résultat","tools.detail.result.tooltip":"Charge utile du résultat renvoyé pour cette exécution de cet outil.","tools.detail.requestedCommand":"Commande envoyée","tools.detail.executedCommand":"Commande exécutée","tools.detail.alternatives":"Alternatives","tools.detail.blockedMessage":"Raison du blocage","tools.detail.noFallback":"Pas de solution de repli","tools.detail.noFallback.value":"Aucune solution de secours n'a été exécutée.","tools.detail.warningMessage":"Message d'avertissement","tools.detail.errorMessage":"Message d'erreur","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Effacer l'historique ?","tools.clear.history.message":"Cela supprime définitivement l’historique actuel des outils de lieu.","tools.clear.statistics.title":"Des statistiques claires ?","tools.clear.statistics.message":"Cela réinitialise définitivement les statistiques actuelles de l'outil de placement.","tools.detail.error":"Erreur","tools.page.prev":"Précédent","tools.page.prev.tooltip":"Accédez à la page précédente des résultats de l’historique des outils.","tools.page.next":"Suivant","tools.page.next.tooltip":"Accédez à la page suivante des résultats de l’historique des outils.","tools.empty.history":"Aucune entrée dans l'historique","tools.empty.stats":"Aucune statistique sur les outils","tools.empty.failures":"Aucun échec","tools.summary.total":"Total","tools.summary.calls":"appels","tools.summary.sessions":"Séances","settings.license.title":"Licence","settings.license.title.tooltip":"Statut actuel de la licence et niveau d'abonnement.","settings.license.status":"Statut","settings.license.status.tooltip":"État d'activation actuel de la licence.","settings.license.tier":"Étage","settings.license.tier.tooltip":"Niveau d'abonnement actuel pour les fonctionnalités WEPPY Dashboard disponibles.","settings.license.key":"Clé","settings.license.key.tooltip":"Clé de licence masquée actuellement chargée par le serveur.","settings.license.keyValue.tooltip":"Clé de licence masquée actuellement chargée par le serveur.","settings.license.provider":"Provider","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"Fournisseur de licence utilisé pour valider cette clé.","settings.license.providerValue.tooltip":"Fournisseur de licence utilisé pour valider cette clé.","settings.license.active":"Actif","settings.license.active.tooltip":"État d'activation actuel de la licence.","settings.license.status.activeCancelPending.tooltip":"L'annulation est en attente, mais l'accès Pro reste actif jusqu'à la fin de la période de facturation en cours.","settings.license.inactive":"Inactif","settings.license.inactive.tooltip":"État d'activation actuel de la licence.","settings.license.expired":"Expiré","settings.license.expired.tooltip":"État d'activation actuel de la licence.","settings.license.unavailable":"Informations de licence indisponibles","settings.license.detail.cancelPending":"L'annulation est programmée. L'accès Pro reste actif jusqu'à la fin de la période de facturation en cours.","settings.license.reset":"Réinitialiser la licence","settings.readOnly":"Lecture seule","settings.readOnly.tooltip":"Cette section affiche les valeurs qui ne peuvent pas être modifiées à partir du WEPPY Dashboard.","settings.unavailable":"Paramètres indisponibles","settings.general.title":"Paramètres généraux","settings.general.title.tooltip":"Paramètres chauds qui s’appliquent immédiatement lorsqu’ils sont modifiés.","settings.general.liveApply":"Postuler en direct","settings.general.liveApply.tooltip":"Les modifications apportées à cette section sont appliquées immédiatement sans bouton de sauvegarde séparé.","settings.general.applied":"Appliqué","settings.general.logLevel":"Niveau de journalisation","settings.general.logLevel.tooltip":"Choisissez la quantité de détails que le serveur MCP écrit dans les journaux. Réduisez à « debug » lors de la recherche d’un problème.","settings.general.localHistory":"Enregistrement de l'historique des outils","settings.general.localHistory.tooltip":"Enregistrez les exécutions de l’outil AI sur le disque. Obligatoire pour les pages Outils et Historique.","settings.general.localStatistics":"Collecte de statistiques sur les outils","settings.general.localStatistics.tooltip":"Comptes agrégés d’utilisation des outils. Utilisé par les statistiques de présentation.","settings.general.contextCapture":"Capture de contexte","settings.general.contextCapture.tooltip":"Enregistrez le contexte d'exécution structuré afin que les vues Changelog et Playtest puissent le restituer.","settings.general.requestTimeout":"Expiration du délai d'action","settings.general.requestTimeout.tooltip":"Temps maximum (en ms) d'attente pour une seule action de l'outil avant d'échouer.","settings.general.requestTimeout.unit":"MS","settings.general.requestTimeout.unit.tooltip":"Le délai d’expiration de l’action est mesuré en millisecondes.","settings.cold.title":"Environnement serveur","settings.cold.title.tooltip":"Valeurs d'environnement de serveur en lecture seule chargées au démarrage.","settings.cold.httpPort.tooltip":"Numéro de port utilisé par le serveur HTTP MCP WEPPY Dashboard.","settings.cold.httpHost.tooltip":"Interface hôte à laquelle le serveur HTTP MCP WEPPY Dashboard se lie.","settings.cold.dashboardAutoOpen.tooltip":"Contrôle si le WEPPY Dashboard s'ouvre automatiquement dans le navigateur au démarrage du serveur.","settings.cold.dashboardAutoOpen.value.tooltip":"Comportement de démarrage actuel pour l'ouverture du WEPPY Dashboard dans un navigateur.","settings.cold.hint":"Définissez via des variables d’environnement pour modifier ces valeurs.","settings.language.title":"Langue","settings.language.title.tooltip":"Choisissez comment le texte de l'interface WEPPY Dashboard est localisé.","settings.language.dashboard":"WEPPY Dashboard Langue","settings.language.dashboard.tooltip":"Remplace la langue WEPPY Dashboard ou suit la langue du système lorsqu'elle est définie sur Auto.","settings.language.auto":"Auto","overview.l0.title":"Serveur MCP déconnecté","overview.l0.message":"Le serveur MCP ne répond pas. Le WEPPY Dashboard tentera automatiquement de se reconnecter.","overview.l0.step1":"Vérifiez que le processus serveur MCP est en cours d'exécution","overview.l0.step2":"Redémarrez la commande du serveur MCP si nécessaire","overview.l0.reconnecting":"Reconnexion automatique toutes les 3 secondes...","overview.l0.reconnectBtn":"Reconnecter","overview.l0.settingsBtn":"Vérifier les paramètres","overview.l1.pluginGuide":"Le plugin Roblox Studio n'est pas connecté","overview.l1.check1":"Roblox Studio est-il en cours d'exécution ?","overview.l1.check2":"Le WEPPY Plugin est-il installé ?","overview.l1.feedHint":"Les modifications apparaîtront ici une fois le plugin connecté","overview.metric.server":"Serveur","overview.metric.server.tooltip":"État d'exécution du serveur MCP et état du processus","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Connexion du plugin Roblox Studio et état de la version","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Agents de codage IA connectés et leur état d'exécution","overview.metric.agent.instancesUnit":"cas","overview.metric.sync":"Synchroniser","overview.metric.sync.tooltip":"Activité actuelle de synchronisation entre Studio et local","overview.metric.noAgent":"Aucun agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Version du serveur MCP installée","overview.meta.session":"Session","overview.meta.session.tooltip":"Identifiant de session MCP actuel","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificateur de processus du système d'exploitation","overview.meta.uptime":"Temps de disponibilité","overview.meta.uptime.tooltip":"Temps écoulé depuis le démarrage du serveur MCP","overview.feed.title":"Modifications récentes du jeu","overview.feed.empty":"Aucun changement récent","overview.changelog.title":"Résumé des modifications de session","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"cas","overview.changelog.properties":"propriétés","overview.changelog.assets":"actifs","overview.tier.title":"Utilisation du niveau","changelog.subtitle":"Historique des changements de jeu","changelog.filter.all":"Tous","changelog.filter.active":"Actif","changelog.filter.completed":"Complété","changelog.empty":"Aucune entrée du journal des modifications pour l'instant","changelog.basic.limit.title":"L'aperçu Basic affiche les 3 dernières sessions","changelog.basic.limit.body":"Passez à Pro pour parcourir la chronologie complète du journal des modifications pour ce lieu.","changelog.basic.metricLabel":"Journal des modifications visible / Total","changelog.basic.visible":"visible","changelog.basic.total":"total","changelog.card.active":"Actif","changelog.card.active.tooltip":"Cette session reçoit toujours de nouveaux changements de jeu.","changelog.card.completed":"Complété","changelog.card.completed.tooltip":"Cette session est terminée et aucun autre changement n'est attendu.","changelog.card.bootstrapStatus":"Amorçage","changelog.card.bootstrapStatus.tooltip":"Cette session contient uniquement l'instantané d'amorçage de synchronisation initial.","changelog.card.inProgress":"en cours","changelog.card.noChanges":"Aucun changement pour l'instant","changelog.card.noChanges.tooltip":"Aucun changement de jeu n'a encore été extrait pour cette session.","changelog.card.bootstrapSummary":"Instantané de synchronisation initial","changelog.card.bootstrapSummary.tooltip":"Les écritures initiales de synchronisation de fichiers sont regroupées en une seule ligne d'instantané d'amorçage.","changelog.card.sessionIntent":"Intention de session","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Modifications du script apportées au cours de cette session.","changelog.card.instances":"cas","changelog.card.instances.tooltip":"Instance créer, supprimer, déplacer ou cloner les modifications dans cette session.","changelog.card.modified":"modifié","changelog.card.created":"créé","changelog.card.deleted":"supprimé","changelog.card.moved":"déplacé","changelog.card.propertiesChanged":"propriétés modifiées","changelog.card.propertiesChanged.tooltip":"Modifications de la valeur Property enregistrées pour cette session.","changelog.card.lightingConfigured":"Éclairage configuré","changelog.card.lightingConfigured.tooltip":"Les paramètres d'éclairage ou d'ambiance ont été modifiés au cours de cette session.","changelog.card.terrainConfigured":"Terrain configuré","changelog.card.terrainConfigured.tooltip":"Les données de terrain ou les paramètres de terrain ont été modifiés au cours de cette session.","changelog.card.assetsInserted":"éléments insérés","changelog.card.assetsInserted.tooltip":"Actifs insérés dans le lieu lors de cette séance.","changelog.category.script":"Scripts","changelog.category.instance":"Instances","changelog.category.property":"Properties","changelog.category.lighting":"Éclairage","changelog.category.terrain":"Terrain","changelog.category.asset":"Actifs","changelog.detail.changeSummary":"Résumé des modifications","changelog.detail.changeSummary.tooltip":"Nombre de modifications de jeu extraites regroupées par catégorie pour cette session.","changelog.detail.changeTimeline":"Modifier la chronologie","changelog.detail.changeTimeline.tooltip":"Liste chronologique des modifications de jeu extraites pour cette session.","changelog.detail.context.title":"Résumé du contexte","changelog.detail.context.tooltip":"Contexte d'exécution structuré capturé pour cette session de journal des modifications.","changelog.detail.verification.title":"Vérification","changelog.detail.verification.tooltip":"Signaux de vérification liés à cette session de changelog.","changelog.detail.verification.label":"Résultat","changelog.detail.verification.status":"Statut","changelog.detail.verification.timestamp":"Enregistré à","changelog.detail.beforeAfter":"Avant et après","changelog.detail.filterCategory":"Catégorie","changelog.detail.filterCategory.tooltip":"Filtrez la chronologie sur une seule catégorie de changement.","changelog.detail.confidence.exact":"Exact","changelog.detail.confidence.exact.tooltip":"Les états avant et après ont été confirmés pour ce changement.","changelog.detail.confidence.partial":"Partiel","changelog.detail.confidence.partial.tooltip":"Seule une partie de l’état avant et après a pu être confirmée pour ce changement.","changelog.detail.confidence.afterOnly":"Après seulement","changelog.detail.confidence.afterOnly.tooltip":"Seul l'état résultant après le changement a pu être confirmé.","changelog.detail.confidence.intentOnly":"Intention uniquement","changelog.detail.confidence.intentOnly.tooltip":"Seule l'action demandée a été enregistrée, pas l'état résultant.","changelog.detail.confidence.unknown":"Inconnu","changelog.detail.confidence.unknown.tooltip":"Ce changement n’a pas pu être classé avec certitude à partir des données disponibles.","changelog.detail.noChanges":"Aucun changement dans cette catégorie","changelog.detail.backToList":"Retour à la liste","changelog.diff.empty":"Aucune différence disponible","changelog.diff.unified":"Unifié","changelog.diff.sideBySide":"Côte à côte","changelog.diff.before":"Avant","changelog.diff.after":"Après","sync.overlay.title":"Plugin Roblox Studio requis","sync.overlay.message":"L'état de synchronisation sera disponible une fois le plugin Roblox Studio connecté.","sync.overlay.check1":"Roblox Studio est-il en cours d'exécution ?","sync.overlay.check2":"Le WEPPY Plugin est-il installé ?","sync.status.title":"Statut de synchronisation","sync.status.title.tooltip":"État actuel de synchronisation du Studio et des fichiers locaux pour cet emplacement.","sync.status.forwardOnly":"Transférer uniquement","sync.status.forwardOnly.tooltip":"Le niveau Basic permet à Studio d'effectuer une synchronisation directe locale uniquement.","sync.status.place":"Lieu","sync.status.place.tooltip":"Nom et identifiant du lieu Roblox connecté.","sync.status.path":"Chemin","sync.status.path.tooltip":"Racine du système de fichiers local actuellement utilisée pour la sortie de synchronisation.","sync.status.instances":"Instances","sync.status.instances.tooltip":"Nombre total d'instances Roblox synchronisées suivies dans le miroir local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Nombre total de fichiers de script synchronisés actuellement indexés pour cet emplacement.","sync.status.state":"État","sync.status.state.tooltip":"État de synchronisation d'exécution actuel signalé par le serveur.","sync.directions.title":"Instructions de synchronisation","sync.directions.title.tooltip":"Direction de synchronisation par catégorie et application du comportement entre Local et Studio.","sync.directions.type":"Taper","sync.directions.type.tooltip":"Catégorie de synchronisation affectée par cette règle.","sync.directions.direction":"Direction","sync.directions.direction.tooltip":"Indique si chaque catégorie est synchronisée de Studio vers Studio ou dans les deux sens.","sync.directions.applyMode":"Mode Appliquer","sync.directions.applyMode.tooltip":"Comment les modifications de synchronisation entrantes sont appliquées pour cette catégorie.","sync.directions.deletePolicy":"Politique de suppression","sync.directions.deletePolicy.tooltip":"Contrôle si la suppression de fichiers locaux peut supprimer automatiquement les instances Studio correspondantes.","sync.directions.deletePolicy.ask":"Demander avant suppression","sync.directions.deletePolicy.ask.tooltip":"Les fichiers locaux supprimés sont vérifiés avant la suppression des instances Studio.","sync.directions.deletePolicy.auto":"Suppression automatique","sync.directions.deletePolicy.auto.tooltip":"Les fichiers locaux supprimés peuvent supprimer automatiquement les instances Studio correspondantes.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Valeurs","sync.directions.cat.containers":"Conteneurs","sync.directions.cat.data":"Données","sync.directions.cat.services":"Services","sync.directions.endpoint.local":"Locale","sync.directions.endpoint.local.tooltip":"Les fichiers locaux sur le disque sont toujours affichés sur le côté gauche du rail de direction.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio est toujours affiché sur le côté droit du rail de direction.","sync.directions.mode.manual":"Manuel","sync.directions.mode.manual.tooltip":"Applique les modifications de synchronisation uniquement lorsque vous les déclenchez manuellement.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Applique automatiquement les modifications de synchronisation lorsque les mises à jour arrivent.","sync.directions.tooltip.forward.body":"Les modifications de Studio sont synchronisées uniquement avec les fichiers locaux","sync.directions.tooltip.bidirectional.body":"Synchronisation bidirectionnelle entre Local et Studio","sync.directions.tooltip.reverse.body":"Transférer les modifications des fichiers locaux vers Studio","sync.directions.tooltip.proRequired":"Pro requis au niveau Basic","sync.directions.dir.forward":"avant","sync.directions.dir.bidirectional":"bidirectionnel","sync.directions.dir.reverse":"inverse","sync.log.title":"Journal de synchronisation","sync.log.empty":"Aucun événement de synchronisation pour l'instant","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"Une nouvelle sortie de synchronisation a été écrite sur le disque.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"Un fichier ou une instance synchronisée existante a été mise à jour.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"Un fichier ou une instance synchronisé a été supprimé.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Un événement de synchronisation a été enregistré sans mutation de fichier.","sync.upgrade.title":"Découvrir la synchronisation complète avec Pro","sync.upgrade.benefit1":"Synchronisation bidirectionnelle : modifiez des fichiers, appliquez-les automatiquement à Studio","sync.upgrade.benefit2":"Synchronisation inversée : renvoyer les modifications de fichiers vers Studio","sync.upgrade.benefit3":"Historique de synchronisation complet et journal des modifications détaillé","sync.upgrade.buy":"Voir Pro","playtest.status.title":"Statut du test de jeu","playtest.status.title.tooltip":"État actuel de la session de test de jeu Roblox signalé par Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Mode de lancement du playtest Studio pour la session en cours.","playtest.status.mode.value.tooltip":"Mode de test de jeu Roblox Studio spécifique actuellement utilisé.","playtest.status.mode.play":"Jouer","playtest.status.mode.run":"Courir","playtest.status.mode.server":"Serveur","playtest.status.mode.edit":"Modifier","playtest.status.place.tooltip":"Lieu Roblox actuellement associé à cette session de playtest.","playtest.status.state.running":"En cours d'exécution","playtest.status.state.running.tooltip":"Une session de test de jeu Roblox est actuellement en cours.","playtest.status.state.paused":"En pause","playtest.status.state.paused.tooltip":"La session de test de jeu Roblox en cours est suspendue.","playtest.status.state.notRunning":"Ne fonctionne pas","playtest.status.state.notRunning.tooltip":"Aucune session de test de jeu Roblox n'est actuellement en cours.","playtest.control.play":"Jouer","playtest.control.pause":"Pause","playtest.control.resume":"CV","playtest.control.stop":"Arrêt","playtest.history.title":"Historique des tests","playtest.history.title.tooltip":"Exécutions de tests de jeu automatisés enregistrés pour ce projet.","playtest.history.empty":"Aucun résultat de test pour l'instant","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Mode Playtest utilisé pour ce test enregistré.","playtest.history.status.passed":"Passé","playtest.history.status.failed":"Échoué","playtest.history.status.running":"En cours d'exécution","playtest.history.status.unknown":"Inconnu","playtest.history.status.tooltip":"État des résultats enregistrés pour cette exécution de test de jeu automatisé.","playtest.empty.title":"Aucun résultat de test de jeu pour l'instant","playtest.empty.message":"Les résultats apparaîtront ici après l’exécution d’un Playtest par l’agent IA.","playtest.empty.message.before":"Les résultats apparaîtront ici après l’exécution d’un Playtest par l’agent IA.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Rapport sélectionné","playtest.report.title.tooltip":"Sortie détaillée pour l’exécution de test de jeu automatisé actuellement sélectionnée.","playtest.report.content":"Rapport","playtest.report.content.tooltip":"Résumé de la démarque pour l'exécution du test de jeu automatisé sélectionné.","playtest.report.logs":"Journaux","playtest.report.logs.tooltip":"Journaux d'exécution capturés pour l'exécution du test de lecture automatisé sélectionné.","playtest.context.contextId":"ID de contexte","playtest.context.why":"Pourquoi ce test a été exécuté","playtest.context.expected":"Attendu","playtest.context.observed":"Observé","playtest.report.empty":"Aucun contenu de rapport disponible","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest est une fonctionnalité réservée à Pro","playtest.basic.desc":"Contrôlez les tests de jeu à partir de WEPPY Dashboard, exécutez des tests automatisés et consultez des rapports de test détaillés.","playtest.basic.benefit1":"Commandes de lecture/pause/arrêt en un clic","playtest.basic.benefit2":"Exécution de tests automatisés via un agent IA","playtest.basic.benefit3":"Historique des tests avec suivi des réussites/échecs","playtest.basic.benefit4":"Rapports de tests de démarque détaillés","playtest.sample.badge":"Aperçu de la vue du playtest Pro","playtest.sample.title":"Vous prévisualisez l'écran de test de jeu qui devient disponible après la mise à niveau vers Pro.","playtest.sample.message":"Cet aperçu utilise des exemples de données. Le contrôle des tests de jeu en direct, la gestion de l'historique et les rapports réels sont débloqués avec Pro.","playtest.sample.clearDisabled":"Passez à Pro pour effacer l'historique des tests de jeu en direct.","playtest.sample.place":"Aperçu de l'arène","playtest.sample.history.name":"Exemple de test de fumée dans une arène","playtest.sample.context.why":"Apparaissez dans l'arène, survivez à l'ouverture et vérifiez que le HUD répond immédiatement.","playtest.sample.context.expected":"Le joueur apparaît en toute sécurité, l'interface utilisateur du compte à rebours apparaît en une seconde et la première vague démarre sans erreur.","playtest.sample.context.observed":"Protection contre l'apparition maintenue, le HUD mis à jour à temps et la première vague terminée sans régression de gameplay.","playtest.sample.report.markdown":`# Exemple de test de fumée d'arène
140
140
 
141
141
  - Flux d'apparition : PASS
142
142
  - Compte à rebours HUD : PASS
@@ -146,7 +146,7 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
146
146
  [exemple] protection contre l'apparition active
147
147
  [exemple] compte à rebours hud rendu
148
148
  [exemple] première vague terminée
149
- [exemple] rapport d'aperçu terminé`,"sidebar.whatsNew":"Quoi de neuf","sidebar.help.group":"Aide et commentaires","sidebar.help.bug":"Signaler un bug","sidebar.help.bug.tooltip":"Créer un bundle de diagnostic local, puis ouvrir un rapport de bug pré-rempli sur GitHub","bugReportDialog.title":"diagnostics.zip peut nous aider à analyser le problème","bugReportDialog.subtitle":"WEPPY a créé un zip de diagnostic sur cet ordinateur. Il contient des logs Studio, plugin, Sync et outils qui peuvent nous aider à comprendre ce qui s’est passé.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Vous pouvez envoyer le rapport sans ce fichier, mais joindre le zip nous aide souvent à trouver la cause plus vite.","bugReportDialog.attachHow":"Pour le joindre, téléchargez ou affichez le zip, puis ajoutez-le au champ Diagnostics ZIP (optional) de l’issue GitHub avant de l’envoyer.","bugReportDialog.download":"1. Télécharger diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Ouvrir l’issue GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Le zip peut contenir des logs locaux et du contexte de projet. Vérifiez-le avant de le joindre si vous voulez le partager.","sidebar.help.feature":"Suggérer une fonctionnalité","sidebar.help.feature.tooltip":"Suggérer une nouvelle fonctionnalité ou une amélioration sur GitHub","sidebar.help.discussions":"Aide pour l’installation et l’utilisation","sidebar.help.discussions.tooltip":"Demander de l'aide pour l'installation ou l'utilisation via GitHub Issues","sidebar.help.troubleshooting":"Guide de dépannage","sidebar.help.troubleshooting.tooltip":"Ouvrez le guide de dépannage officiel sur weppyai.com","header.whatsNew":"Quoi de neuf","header.whatsNew.tooltip":"Quoi de neuf","upgrade.title":"Voir Pro","upgrade.tagline":"Découvrir les fonctions Pro","upgrade.cta":"Voir Pro","upgrade.licenseShortcut":"Saisir la licence","upgrade.validUntil":"Jusqu'au {{date}}","whatsNew.pageTitle":"Quoi de neuf","whatsNew.pageSubtitle":"Restez informé des modifications apportées à MCP","whatsNew.unreadSection":"Non lu","whatsNew.allSection":"Toutes les annonces","whatsNew.empty":"Aucune annonce pour l'instant","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"IMPORTANT","whatsNew.category.release":"Libérer","whatsNew.category.notice":"Avis","whatsNew.category.deprecation":"Obsolète","whatsNew.category.tip":"Conseil","uiStudio.title":"UI Studio","uiStudio.empty":"Aucune capture d'écran enregistrée pour l'instant. Ils sont créés automatiquement lorsqu'un agent IA capture l'état actuel de l'interface utilisateur.","uiStudio.loading":"Chargement…","uiStudio.pluginGuide.title":"Le plugin Roblox Studio n'est pas connecté","uiStudio.pluginGuide.message":"UI Studio affiche des captures d'écran et l'historique des modifications à partir du lieu Studio connecté. Il sera mis à jour automatiquement après la connexion de Studio et de WEPPY Plugin.","uiStudio.pluginGuide.check1":"Roblox Studio est-il en cours d'exécution ?","uiStudio.pluginGuide.check2":"Le WEPPY Plugin est-il installé et en cours d'exécution ?","uiStudio.pluginGuide.waiting":"En attente de connexion au plugin...","uiStudio.capturedAt":"Capturé à","uiStudio.scope":"Portée","uiStudio.target":"Cible","uiStudio.briefId":"Brève pièce d'identité","uiStudio.detailClose":"Fermer","uiStudio.colCheck":"Vérifier","uiStudio.colPriority":"Priorité","uiStudio.colCurrent":"Actuel","uiStudio.colRecommended":"Recommandé","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Examinez d'abord","uiStudio.priorityLow":"Amélioration facultative","uiStudio.highPrioritySection":"Examinez d'abord","uiStudio.lowPrioritySection":"Améliorations facultatives","uiStudio.groupSummary":"articles","uiStudio.fixLabel":"Réparer","uiStudio.copyFixCommand":"Copier l'instruction IA","uiStudio.copiedToClipboard":"Copié","uiStudio.fullPath":"Chemin complet","uiStudio.falsePositiveWarning":"Ce groupe peut contenir des faux positifs","uiStudio.noSuggestions":"Aucune suggestion d'amélioration actuelle","uiStudio.sample.badge":"Aperçu du Pro UI Studio","uiStudio.sample.title":"Vous prévisualisez le UI Studio qui se déverrouille après la mise à niveau vers Pro.","uiStudio.sample.message":"Cet aperçu utilise des exemples de données provenant d’une interface utilisateur d’inventaire de démonstration. De vraies captures d'écran, un historique des révisions et des correctifs basés sur l'IA sont déverrouillés avec Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Histoire","uiStudio.analysis.reportsTitle":"Dernière analyse par cible d'interface utilisateur","uiStudio.analysis.recentCapturesTitle":"Captures récentes","uiStudio.analysis.detailDialog":"Détail de l'analyse","uiStudio.analysis.targetCountLabel":"Cibles analysées","uiStudio.analysis.captureLabel":"Captures","uiStudio.analysis.verdict.hasSuggestions":"Suggestions d'amélioration","uiStudio.analysis.verdict.needsFix":"Suggestions d'amélioration","uiStudio.analysis.verdict.review":"Suggestions d'amélioration","uiStudio.analysis.verdict.passed":"Aucune suggestion actuelle","uiStudio.analysis.verdictLabel":"Résumé des améliorations","uiStudio.analysis.thresholds":"Base de révision","uiStudio.analysis.issueSummary.passed":"Aucune suggestion d’amélioration supplémentaire dans le cadre de l’examen actuel.","uiStudio.history.title":"Historique des modifications","uiStudio.history.empty":"Pas d'historique pour l'instant. Lorsqu'un agent IA modifie l'interface utilisateur à l'aide de manage_ui, cela sera automatiquement enregistré.","uiStudio.history.loading":"Chargement...","uiStudio.history.loadingPlace":"Chargement du place actuel...","uiStudio.history.noPlace":"Aucune donnée du place actuel n'est encore disponible. Connectez le WEPPY Plugin et synchronisez un place pour voir l'historique des changements UI.","uiStudio.history.noPlaceAction":"Le place actuel n'est pas encore disponible.","uiStudio.history.error":"Erreur","uiStudio.history.clear":"Clair","uiStudio.history.filter.actions":"Type d'action","uiStudio.history.filter.actionAll":"Tous","uiStudio.history.filter.actionCreate":"Créer","uiStudio.history.filter.actionUpdate":"Mise à jour","uiStudio.history.filter.actionDelete":"Supprimer","uiStudio.history.filter.period":"Période","uiStudio.history.filter.dateAll":"Tous","uiStudio.history.filter.today":"Aujourd'hui","uiStudio.history.filter.yesterday":"Hier","uiStudio.history.filter.last7Days":"7 derniers jours","uiStudio.history.filter.last30Days":"30 derniers jours","uiStudio.history.filter.customRange":"Gamme personnalisée","uiStudio.history.filter.reset":"Réinitialiser","uiStudio.history.filter.from":"Depuis","uiStudio.history.filter.to":"À","uiStudio.history.row.affectedPaths":"Chemins","uiStudio.history.row.mutations":"Modifier les détails","uiStudio.history.row.expand":"▾ Développer","uiStudio.history.row.collapse":"▲ Réduire","uiStudio.history.row.expandDetails":"Afficher les détails de la modification {n}","uiStudio.history.row.collapseDetails":"Masquer les détails des modifications","uiStudio.history.row.toggleDetails":"Toggle modifier les détails","uiStudio.history.row.mutationsEmpty":"Aucun détail de changement","uiStudio.history.row.toolLabel":"Modifications de l'interface utilisateur ({n})","uiStudio.history.row.compare":"Avant/Après","uiStudio.history.row.noBeforeState":"Non avant l'état","uiStudio.history.row.noAfterState":"Non après l'état","uiStudio.history.row.qualityPlan":"Direction de la conception","uiStudio.history.row.designCheck":"Suggestions","uiStudio.history.row.designCheckUnavailable":"Suggestions: indisponible","uiStudio.history.row.designCheckNone":"Suggestions : aucune","uiStudio.history.selection.deleteSelected":"Supprimer la sélection","uiStudio.history.selection.selectAll":"Sélectionner tout","uiStudio.history.selection.clearSelection":"Effacer la sélection","uiStudio.history.confirm.deleteRequestsTitle":"Supprimer les enregistrements de modifications","uiStudio.history.confirm.deleteRequestsMessage":"Les enregistrements de modifications sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.history.confirm.clearRequestsTitle":"Effacer l'historique des modifications","uiStudio.history.confirm.clearRequestsMessage":"Cela efface l’historique actuel des changements de lieu. Les instances Studio ne sont pas affectées.","uiStudio.history.confirm.cascadeOption":"Supprimez également les captures d'écran liées","uiStudio.history.drawer.close":"Fermer","uiStudio.actions.previewAgain":"Aperçu à nouveau","uiStudio.actions.deleteSnapshot":"Supprimer cette capture d'écran","uiStudio.actions.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.actions.captureCurrentState":"Capturer l'état actuel","uiStudio.actions.checkSuggestionsAgain":"Revérifiez les suggestions","uiStudio.actions.previewRunning":"Capturer…","uiStudio.actions.previewRunningDetail":"Le nouvel ID de fichier de capture d'écran apparaîtra une fois la capture terminée.","uiStudio.actions.previewNeedsSaveCheck":"Capture terminée, la sauvegarde doit être révisée","uiStudio.actions.previewSaved":"Nouvelle capture d'écran enregistrée","uiStudio.actions.previewComplete":"Capture terminée","uiStudio.actions.previewSavedDetail":"Les captures d'écran existantes sont conservées ; cela a été enregistré en tant que nouveau fichier.","uiStudio.actions.previewSavedPathMissing":"Un nouvel ID de capture d'écran a été renvoyé, mais le chemin du fichier enregistré n'a pas pu être confirmé.","uiStudio.actions.previewSnapshotIdMissing":"Le nouvel ID de capture d'écran n'a pas pu être confirmé. Actualisez la liste pour vérifier si elle a été enregistrée.","uiStudio.actions.more":"Plus","uiStudio.gallery.selection.selectedCount":"choisi","uiStudio.confirm.deleteSnapshotTitle":"Supprimer la capture d'écran","uiStudio.confirm.deleteSnapshotMessage":"Seul ce fichier de capture d'écran sera supprimé (l'instance Studio est conservée).","uiStudio.confirm.deleteBatchTitle":"Supprimer les captures d'écran sélectionnées","uiStudio.confirm.deleteBatchMessage":"Les captures d'écran sélectionnées seront supprimées. Cette action ne peut pas être annulée.","uiStudio.gallery.selectMode":"Sélectionner","uiStudio.gallery.exitSelectMode":"Annuler","uiStudio.gallery.selectAll":"Sélectionner tout","uiStudio.gallery.clearSelection":"Effacer la sélection","uiStudio.gallery.deleteSelected":"Supprimer la sélection","common.save":"Enregistrer","common.cancel":"Annuler","common.delete":"Supprimer","uiStudio.storage.title":"UI Studio Données enregistrées","uiStudio.storage.usageLabel":"Utilisé","uiStudio.storage.historyBytes":"Changer l'historique","uiStudio.storage.snapshotBytes":"Captures d'écran","uiStudio.storage.requestCount":"Modifier les enregistrements","uiStudio.storage.mutationCount":"Modifier les détails","uiStudio.storage.snapshotCount":"Captures d'écran","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Dernier nettoyage automatique","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"libéré","uiStudio.storage.lastRunErrors":"Erreurs","uiStudio.storage.loading":"Chargement...","uiStudio.cleanup.policy.title":"Politique de suppression automatique","uiStudio.cleanup.policy.modeOff":"Désactivé","uiStudio.cleanup.policy.modeAge":"Basé sur l'âge","uiStudio.cleanup.policy.modeSize":"Basé sur la taille","uiStudio.cleanup.policy.cascade":"Supprimez également les captures d'écran liées","uiStudio.cleanup.policy.save":"Enregistrer la politique","uiStudio.cleanup.policy.runNow":"Exécuter la règle enregistrée","uiStudio.cleanup.policy.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmer la politique","uiStudio.cleanup.policy.confirm.messageStrict":"L'application de cette politique entraînera la suppression immédiate","uiStudio.cleanup.policy.confirm.requests":"modifier les enregistrements","uiStudio.cleanup.policy.confirm.snapshots":"captures d'écran","uiStudio.cleanup.policy.confirm.freed":"libéré — Postuler ?","uiStudio.cleanup.keepLastNDays":"Conserver les {n} derniers jours","uiStudio.cleanup.selectedDelete":"Supprimer la sélection…","uiStudio.cleanup.deleteAll":"Supprimer tout…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmer le nettoyage","uiStudio.cleanup.cleanupConfirmMessage":"Tous les éléments sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Les enregistrements de modifications et les captures d'écran datant de plus de 7 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Les enregistrements de modifications et les captures d'écran datant de plus de 30 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.all":"Les enregistrements de modifications enregistrées et les captures d'écran seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.label":"Nettoyage manuel","uiStudio.cleanup.studioPreservedNote":"Cela supprime uniquement les enregistrements de modifications enregistrées et les captures d'écran sur le disque ; Les instances Roblox Studio ne sont pas affectées.","uiStudio.history.sample.bannerBadge":"Aperçu de l'historique des modifications Pro","uiStudio.history.sample.bannerTitle":"Vous prévisualisez l'historique des modifications de l'interface utilisateur qui se déverrouille après la mise à niveau vers Pro.","uiStudio.history.sample.bannerMessage":"Cet aperçu utilise des exemples de données. Historique réel des modifications, comparaison avant/après et déverrouillage de suppression par lots avec Pro.","uiStudio.fix.touchTarget.label":"Taille de la cible tactile","uiStudio.fix.touchTarget.description":"Vérifie si les commandes sont suffisamment grandes pour appuyer confortablement sur mobile.","uiStudio.fix.touchTarget.howToFix":"Augmentez la taille du bouton à au moins 44 x 44 px ou agrandissez la zone tactile avec UIPadding.","uiStudio.fix.contrast.label":"Contraste du texte","uiStudio.fix.contrast.description":"Vérifie si le contraste du texte et de l’arrière-plan respecte les directives d’accessibilité.","uiStudio.fix.contrast.howToFix":"Utilisez un TextColor3 plus clair ou assombrissez le BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Les icônes Emoji peuvent être des faux positifs lorsque leur couleur est corrigée.","uiStudio.fix.textScaled.label":"Utilisation à l'échelle du texte","uiStudio.fix.textScaled.description":"TextScaled sans UITextSizeConstraint peut interrompre les mises en page lorsque le texte se développe.","uiStudio.fix.textScaled.howToFix":"Ajoutez un enfant UITextSizeConstraint au TextLabel et définissez MaxTextSize.","uiStudio.fix.safezone.label":"Placement en zone de sécurité","uiStudio.fix.safezone.description":"Vérifie si les contrôles restent à l’intérieur des zones de sécurité de la plate-forme.","uiStudio.fix.safezone.howToFix":"Déplacez la position à l’intérieur de la zone de sécurité ou réduisez le cadre parent.","uiStudio.fix.minTextSize.label":"Taille de police minimale","uiStudio.fix.minTextSize.description":"Vérifie si le texte est trop petit pour être lu confortablement.","uiStudio.fix.minTextSize.howToFix":"Augmentez TextSize à au moins 14 pour le corps du texte.","uiStudio.sample.history.request1.label":"Création initiale de la disposition du HUD","uiStudio.sample.history.request2.label":"Mise à jour de la conception modale de l'inventaire","uiStudio.sample.history.request3.label":"Mise à jour des couleurs du HUD HealthBar","uiStudio.sample.history.request4.label":"Cibles tactiles du bouton de l'onglet Développer l'inventaire","uiStudio.sample.history.request5.label":"Fenêtre contextuelle Supprimer les paramètres","uiStudio.sample.history.request6.label":"Ajouter un composant de mini-carte HUD","uiStudio.sample.history.request1.mutation1.diff":"Cadre créé + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Définir le point d'ancrage, la position et la taille","uiStudio.sample.history.request1.mutation5.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 pour un meilleur contraste","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, définissez BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (ton rouge)","uiStudio.sample.history.request3.mutation2.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request4.mutation1.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request5.mutation1.diff":"ScreenGui supprimé (interface utilisateur réservée aux paramètres uniquement)","uiStudio.sample.history.request6.mutation1.diff":"Tentative de création de Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Définir la taille, la position et la transparence de l'arrière-plan","uiStudio.sample.history.request6.mutation3.diff":"Interrompu par le redémarrage du serveur lors de la configuration d'ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Capture d'écran partielle enregistrée","uiStudio.sample.history.request6.mutation3.error":"server_restart : connexion perdue","uiStudio.sample.history.request6.mutation4.error":"capture d'écran partielle : couches manquantes","uiStudio.sample.history.detail.backgroundColor":"Couleur de fond","uiStudio.sample.history.detail.anchorPoint":"Ancre","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Taille","uiStudio.sample.history.detail.textColor":"Couleur du texte","uiStudio.sample.history.detail.textSize":"Taille du texte","uiStudio.sample.history.detail.borderSize":"Taille de la bordure","uiStudio.sample.history.detail.borderColor":"Couleur de la bordure","settings.dataHistory.title":"Données et historique","settings.dataHistory.title.tooltip":"Gérez les données enregistrées du tableau de bord en un seul endroit.","settings.dataHistory.collapse":"Réduire {title}","settings.dataHistory.expand":"Développez {title}","settings.dataHistory.scope":"Projet actuel","settings.dataHistory.scope.tooltip":"Des actions claires s’appliquent au projet en cours et au lieu actif le cas échéant.","settings.dataHistory.intro":"Consultez les données enregistrées du tableau de bord, ouvrez la page associée ou effacez les enregistrements stockés à partir d'un seul endroit.","settings.dataHistory.toolsActivity.title":"Activité de l'outil","settings.dataHistory.toolsActivity.description":"Exécutions d'outils enregistrées affichées sur la page Outils.","settings.dataHistory.toolStats.title":"Statistiques d'utilisation des outils","settings.dataHistory.toolStats.description":"Nombre d’outils agrégés et totaux d’état.","settings.dataHistory.syncLog.title":"Journal de synchronisation","settings.dataHistory.syncLog.description":"Événements de synchronisation de fichiers enregistrés pour le lieu actif.","settings.dataHistory.playtest.title":"Rapports de tests de jeu","settings.dataHistory.playtest.description":"Rapports et journaux de tests de jeu automatisés enregistrés.","settings.dataHistory.projectChanges.title":"Prorésumé des modifications du projet","settings.dataHistory.projectChanges.description":"Résumés enregistrés des modifications du projet.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Exécuter la règle enregistrée","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Journal de connexion","settings.dataHistory.connectionLog.description":"Enregistrement des événements de connexion MCP et Studio.","settings.dataHistory.uiStudio.title":"Historique et captures d'écran de UI Studio","settings.dataHistory.uiStudio.tooltip":"Gérez les enregistrements de modifications UI Studio enregistrés, les captures d'écran et la politique de suppression automatique.","settings.dataHistory.uiStudio.description":"Enregistrements de modifications, captures d'écran et politique de nettoyage UI Studio enregistrés.","settings.dataHistory.uiStudio.clear.title":"Effacer les données enregistrées UI Studio ?","settings.dataHistory.uiStudio.clear.message":"Cela supprime uniquement les enregistrements de modifications et les captures d'écran UI Studio enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.uiStudio.clear.success":"Les données enregistrées par UI Studio ont été effacées.","settings.dataHistory.uiStudio.clear.failed":"Échec de la suppression des données enregistrées UI Studio.","settings.dataHistory.metric.unavailable":"Indisponible","settings.dataHistory.metric.sizeUnavailable":"taille indisponible","settings.dataHistory.metric.records":"enregistrements","settings.dataHistory.metric.runs":"court","settings.dataHistory.metric.sessions":"séances","settings.dataHistory.metric.reports":"rapports","settings.dataHistory.open":"Ouvrir","settings.dataHistory.clearAll":"Tout effacer","settings.dataHistory.clear.title":"Effacer les données enregistrées ?","settings.dataHistory.clear.message":"Cela supprime uniquement les enregistrements de tableau de bord enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.clear.success":"Données enregistrées effacées.","settings.dataHistory.clear.failed":"Échec de la suppression des données enregistrées.","uiStudio.history.sample.tooltip":"Passez à Pro pour débloquer l'historique complet","toast.serverConnected":"Serveur MCP connecté","toast.serverDisconnected":"Serveur MCP déconnecté","toast.pluginConnected":"Plugin connecté","toast.pluginDisconnected":"Plugin déconnecté","toast.clearSuccess":"Effacé avec succès","toast.clearFailed":"Échec de la suppression des données","common.clear":"Clair","settings.license.activate":"Activer la licence","settings.license.refresh":"Actualiser la licence","settings.license.keyInput":"Clé de licence","settings.license.disconnected":"Déconnecté","settings.license.disconnected.tooltip":"Reconnectez-vous au serveur MCP pour gérer les actions de licence à partir de WEPPY Dashboard.","settings.license.live.tooltip":"Les actions de licence sont immédiatement envoyées au serveur MCP.","settings.license.status.activationRequired":"Activation requise","settings.license.status.activationRequired.tooltip":"L'activation manuelle de la licence est requise avant que WEPPY Dashboard puisse actualiser ce statut.","settings.license.status.grace":"Grâce","settings.license.status.grace.tooltip":"La vérification Provider est temporairement indisponible, mais l'accès Pro reste actif pendant la période de grâce.","settings.license.status.graceBilling.tooltip":"L'accès Pro est toujours disponible pendant une période de grâce liée à la facturation.","settings.license.detail.graceBilling":"L'accès Pro reste disponible pendant une période de grâce de facturation.","settings.license.detail.graceProviderUnavailable":"Provider indisponible. L'accès Pro reste actif pendant le mode grâce.","settings.license.detail.manualActivation":"Activation manuelle requise pour restaurer l'accès à Pro.","settings.license.detail.missingSessionToken":"L'actualisation est bloquée car le jeton de session en cours est manquant.","settings.license.detail.refreshRecommended":"La vérification des licences devrait être actualisée prochainement.","connection.agents.kill":"Tuer","connection.agents.kill.title":"Tuer l'agent ?","connection.agents.killed":"Agent tué","connection.agents.killFailed":"Impossible de tuer l'agent","connection.agents.lastCommand":"Dernière commande","connection.agents.lastCommand.tooltip":"Appel d'outil le plus récent exécuté par cet agent","connection.agents.lastSeen":"Vu pour la dernière fois","connection.agents.lastSeen.tooltip":"Battement de cœur ou activité la plus récente de cet agent","connection.clear.title":"Effacer le journal de connexion ?","connection.clear.message":"Cela supprime définitivement le journal de connexion stocké pour le projet en cours.","sync.clear.title":"Effacer le journal de synchronisation ?","sync.clear.message":"Cela supprime définitivement le journal de synchronisation stocké pour le lieu actuel.","playtest.clear.title":"Effacer l'historique des tests ?","playtest.clear.message":"Cela supprime définitivement les rapports de test de jeu stockés pour le lieu actuel.","changelog.clear.title":"Effacer le journal des modifications ?","changelog.clear.message":"Cela supprime définitivement le journal des modifications stocké pour le lieu actuel.","sync.status.placePath":"Placer le chemin","sync.status.placePath.tooltip":"Répertoire de lieu actif où les fichiers de l'explorateur sont synchronisés.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Zone représentative","changelog.card.verification":"Vérification","uiStudio.tabs.analysis.tooltip":"Parcourez les écrans d’interface utilisateur capturés par l’IA et trouvez rapidement quelles interfaces utilisateur doivent être améliorées.","uiStudio.tabs.history.tooltip":"Chaque changement d'interface utilisateur effectué par l'IA, dans l'ordre. Comparez les écrans avant et après.","uiStudio.title.tooltip":"Un endroit central pour examiner les écrans d’interface utilisateur générés par l’IA et les suggestions d’amélioration.","uiStudio.analysis.reportsTitle.tooltip":"Affiche le dernier résumé de capture et de suggestion par interface utilisateur (par exemple, fenêtre d'inventaire, menu principal).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Certaines améliorations ont été trouvées dans cette interface utilisateur. Cliquez sur la carte pour plus de détails.","uiStudio.analysis.verdict.passed.tooltip":"Aucune amélioration suggérée en vertu des seuils d'examen actuels.","uiStudio.analysis.counts.tooltip":"« Principal » sont les éléments clés à examiner en premier ; Les « notes » sont des raffinements agréables à avoir.","uiStudio.analysis.thresholds.tooltip":"Ensemble de seuils utilisé pour cet examen (par défaut ou personnalisé).","uiStudio.analysis.recentCapturesTitle.tooltip":"Toutes les captures récemment enregistrées par ordre chronologique.","uiStudio.gallery.selectAll.tooltip":"Sélectionnez toutes les captures visibles à la fois.","uiStudio.gallery.clearSelection.tooltip":"Effacez la sélection actuelle.","uiStudio.gallery.deleteSelected.tooltip":"Supprimez uniquement les fichiers de capture sélectionnés. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.gallery.cardCheckbox.tooltip":"Sélectionnez cette capture. Choisissez-en plusieurs pour les supprimer ensemble.","uiStudio.detailClose.tooltip":"Fermez ce panneau de détails.","uiStudio.actions.captureCurrentState.tooltip":"Enregistrez l'interface utilisateur actuellement affichée dans Studio en tant que nouvelle capture. Les captures existantes sont conservées.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recalculez les suggestions pour cette capture sans prendre une nouvelle capture d'écran.","uiStudio.actions.more.tooltip":"Ouvrez des actions supplémentaires.","uiStudio.actions.deleteSnapshot.tooltip":"Supprimez uniquement ce fichier de capture. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.capturedAt.tooltip":"Quand cet écran a été capturé.","uiStudio.scope.tooltip":"Portée de capture (plein écran ou interface utilisateur spécifique).","uiStudio.target.tooltip":"Chemin exact de l’instance d’interface utilisateur capturée.","uiStudio.briefId.tooltip":"Identifiant du cahier des charges qui a produit cette interface utilisateur.","uiStudio.analysis.verdictLabel.tooltip":"Verdict d'amélioration globale pour cette capture.","uiStudio.suggestionGroup.tooltip":"Suggestions du même genre regroupées. Cliquez pour agrandir ou réduire.","uiStudio.groupSummary.tooltip":"Nombre d'éléments d'interface utilisateur correspondant à ce groupe.","uiStudio.colCurrent.tooltip":"La valeur actuellement appliquée.","uiStudio.colRecommended.tooltip":"La valeur recommandée.","uiStudio.copyFixCommand.tooltip":"Copiez une invite demandant à l'IA de résoudre ce problème.","uiStudio.falsePositiveWarning.tooltip":"Cette vérification peut produire des faux positifs – vérifiez avant de postuler.","uiStudio.history.filter.actions.tooltip":"Filtrez les enregistrements en fonction du type de modification apportée par l'IA.","uiStudio.history.filter.period.tooltip":"Filtrer les enregistrements par plage horaire.","uiStudio.history.filter.from.tooltip":"Date de début de la requête.","uiStudio.history.filter.to.tooltip":"Date de fin de la requête.","uiStudio.history.filter.actionAll.tooltip":"Montrez tout type d'action.","uiStudio.history.filter.actionCreate.tooltip":"Afficher uniquement les actions qui ont créé une nouvelle interface utilisateur.","uiStudio.history.filter.actionUpdate.tooltip":"Afficher uniquement les actions qui ont mis à jour une interface utilisateur existante.","uiStudio.history.filter.actionDelete.tooltip":"Afficher uniquement les actions qui ont supprimé une interface utilisateur.","uiStudio.history.filter.dateAll.tooltip":"Afficher l'historique complet.","uiStudio.history.filter.today.tooltip":"Afficher uniquement les modifications apportées à aujourd'hui.","uiStudio.history.filter.yesterday.tooltip":"Afficher uniquement les modifications d'hier.","uiStudio.history.filter.last7Days.tooltip":"Afficher les modifications des 7 derniers jours.","uiStudio.history.filter.last30Days.tooltip":"Afficher les modifications des 30 derniers jours.","uiStudio.history.filter.customRange.tooltip":"Choisissez une date de début et de fin personnalisée.","uiStudio.history.filter.reset.tooltip":"Réinitialisez tous les filtres aux valeurs par défaut.","uiStudio.history.title.tooltip":"Une chronologie de chaque modification de l'interface utilisateur effectuée par l'IA.","uiStudio.history.clear.tooltip":"Supprimez tous les enregistrements de modifications pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.history.row.compare.tooltip":"Comparez les écrans avant et après. Cliquez pour ouvrir la vue de comparaison complète.","uiStudio.history.row.extraPaths.tooltip":"Nombre d'interfaces utilisateur supplémentaires modifiées dans cette action.","uiStudio.history.row.noBeforeState.tooltip":"Aucune capture enregistrée avant ce changement.","uiStudio.history.row.noAfterState.tooltip":"Aucune capture enregistrée après ce changement.","uiStudio.history.row.affectedPaths.tooltip":"Nombre d'interfaces utilisateur affectées par cette action.","uiStudio.history.row.mutations.tooltip":"Nombre de modifications détaillées (par exemple, modifications de propriétés).","uiStudio.history.row.qualityPlan.tooltip":"Brève direction de conception utilisée pour ce changement.","uiStudio.history.row.designCheck.tooltip":"Résumé des suggestions de contrôle de conception après modification.","uiStudio.history.row.toggleDetails.tooltip":"Afficher ou masquer une ventilation par ligne de ce qui a changé.","uiStudio.compare.before.tooltip":"L'écran a été enregistré juste avant que l'IA n'effectue la modification.","uiStudio.compare.after.tooltip":"L'écran a été enregistré juste après que l'IA ait effectué la modification.","uiStudio.compare.path.tooltip":"Chemin d'accès à l'instance d'interface utilisateur pour cet écran.","uiStudio.storage.title.tooltip":"Utilisation du disque des enregistrements de modifications et des captures d'écran de UI Studio.","uiStudio.storage.usageLabel.tooltip":"Espace disque actuellement utilisé par UI Studio pour ce projet.","uiStudio.storage.historyBytes.tooltip":"Espace occupé par les données d'enregistrement de modification (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Espace occupé par les fichiers image PNG capturés.","uiStudio.storage.requestCount.tooltip":"Nombre d'actions où l'IA a modifié l'interface utilisateur.","uiStudio.storage.mutationCount.tooltip":"Nombre de modifications détaillées dans les actions (une modification de propriété = 1).","uiStudio.storage.snapshotCount.tooltip":"Nombre de fichiers d'images de capture enregistrés.","uiStudio.storage.lastRun.tooltip":"Quand la stratégie de nettoyage automatique a été exécutée pour la dernière fois et ce qu’elle a supprimé.","uiStudio.cleanup.label.tooltip":"Nettoyez manuellement les enregistrements et les captures de modifications quand vous le souhaitez.","uiStudio.cleanup.keep7.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 7 jours.","uiStudio.cleanup.keep30.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 30 jours.","uiStudio.cleanup.deleteAll.tooltip":"Supprimez chaque enregistrement de modification et capture pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.cleanup.policy.title.tooltip":"Règles qui suppriment automatiquement les captures anciennes ou volumineuses.","uiStudio.cleanup.policy.modeOff.tooltip":"Désactivez le nettoyage automatique. Les données restent jusqu'à ce que vous les supprimiez manuellement.","uiStudio.cleanup.policy.modeAge.tooltip":"Supprimez automatiquement les données antérieures au nombre de jours configuré.","uiStudio.cleanup.policy.modeSize.tooltip":"Lorsque l'utilisation totale dépasse la limite, les données les plus anciennes sont supprimées en premier.","uiStudio.cleanup.policy.agePreset.tooltip":"Supprimez les données datant de plus de plusieurs jours.","uiStudio.cleanup.policy.ageInput.tooltip":"Entrez n'importe quelle valeur comprise entre 1 et 365 jours.","uiStudio.cleanup.policy.sizePreset.tooltip":"Gardez l’utilisation totale en dessous de cette taille.","uiStudio.cleanup.policy.sizeInput.tooltip":"Saisissez n'importe quelle valeur comprise entre 50 Mo et 10 000 Mo (10 Go).","uiStudio.cleanup.policy.cascade.tooltip":"Supprimez également les images de capture liées à ces enregistrements. Si cette option est désactivée, les images restent.","uiStudio.cleanup.policy.save.tooltip":"Enregistrez la règle de nettoyage actuelle. Il fonctionne désormais en arrière-plan.","uiStudio.cleanup.policy.runNow.tooltip":"Exécutez maintenant une fois la règle de nettoyage enregistrée, sans attendre la prochaine exécution planifiée.","settings.license.refresh.tooltip":"Récupérez à nouveau l'état actuel à partir du serveur de licences. Utile lorsqu'un changement de facturation n'est pas encore apparu.","settings.license.reset.tooltip":"Supprimez la clé de licence actuellement enregistrée. Utilisez-le avant d'activer avec une clé différente.","settings.license.activate.tooltip":"Activez les fonctionnalités Pro avec la clé de licence saisie.","tier.upgrade.tooltip":"Voir les fonctions Pro et les options d’achat.","settings.language.auto.tooltip":"Suivez la langue du système d'exploitation. Revient à l'anglais lorsqu'il n'est pas pris en charge.","settings.dataHistory.open.tooltip":"Ouvrez la page qui montre cet élément en détail.","settings.dataHistory.clear.tooltip":"Supprimez uniquement les enregistrements enregistrés pour cet élément. Les données Roblox Studio ne sont pas modifiées.","settings.dataHistory.toggle.tooltip":"Réduisez ou développez cette section.","settings.dataHistory.manageStorage":"Gérer le stockage","settings.dataHistory.manageStorage.tooltip":"Afficher ou masquer la politique de stockage et les options de nettoyage.","settings.dataHistory.manageStorage.projectChanges.aria":"Gérer le stockage du résumé des modifications du projet","settings.dataHistory.manageStorage.uiStudio.aria":"Gérer le stockage de l’historique et des captures d’écran UI Studio","settings.dataHistory.toolsActivity.metric.tooltip":"Nombre d'exécutions d'outils enregistrées et espace disque qu'elles utilisent.","settings.dataHistory.toolStats.metric.tooltip":"Nombre total d'exécutions et de sessions agrégées.","settings.dataHistory.syncLog.metric.tooltip":"Nombre d'événements de synchronisation enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.playtestReports.metric.tooltip":"Nombre de rapports de tests de jeu enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.projectChanges.metric.tooltip":"Nombre de résumés de modifications de projet enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.connectionLog.metric.tooltip":"Nombre d'événements de connexion enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio modifie le nombre d'enregistrements et de captures, ainsi que l'utilisation totale du disque.","uiStudio.designCheckResultsTitle":"Suggestions de contrôle de conception","uiStudio.designCheckResultsTitle.tooltip":"Toutes les suggestions d'amélioration trouvées dans cette capture.","uiStudio.actions.designCheckAgain":"Revérifier","uiStudio.actions.designCheckRunning":"Vérification des suggestions...","uiStudio.actions.designCheckRunningDetail":"Les décomptes d’articles examinés en premier, recommandés et facultatifs apparaîtront une fois la vérification terminée.","uiStudio.actions.designCheckComplete":"Vérification des suggestions terminée","uiStudio.actions.designCheckNoSnapshotSaved":"Cette action n'enregistre pas un nouveau fichier de capture d'écran.","uiStudio.sample.designCheck.contrast":"Le contraste du texte est inférieur à {expected} (actuel {actual}). Ajustez TextColor3 ou BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"La cible tactile est inférieure à {expected} (actuel {actual}). Augmentez la taille ou le rembourrage.","uiStudio.sample.designCheck.minTextSize":"TextSize est inférieur à {expected} (actuel {actual}). Augmentez-le pour plus de lisibilité.","uiStudio.gallery.priorityHighBadge.tooltip":"Nombre de suggestions à examiner en premier. Cliquez pour plus de détails.","uiStudio.gallery.priorityMediumBadge.tooltip":"Nombre de suggestions recommandées.","uiStudio.priorityMedium":"Examen recommandé","uiStudio.mediumPrioritySection":"Examen recommandé","uiStudio.gallery.priorityLowBadge.tooltip":"Nombre d'améliorations facultatives.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Erreur","uiStudio.analysis.expandChildren":"Afficher les cibles enfants","uiStudio.analysis.openDetail":"Détail ouvert","uiStudio.analysis.childTargets":"Enfants cibles","uiStudio.analysis.childDetailHint":"Ouvrir les détails de la cible enfant","uiStudio.compare.before":"Avant","uiStudio.compare.after":"Après","uiStudio.history.drawer.changeDetails":"Modifier les détails","uiStudio.gallery.cardCheckbox":"Sélectionnez une capture d'écran","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Toutes les portées","assets.explorer.label":"Explorateur de ressources","assets.breadcrumb.label":"Chemin de la ressource","assets.explorer.summary":"{direct} dans ce dossier · {descendant} dans les sous-dossiers","assets.folder.count.one":"1 ressource","assets.folder.count.many":"{count} ressources","assets.folder.type":"Dossier","assets.folders.title":"Dossiers","assets.folder.assetsTitle":"Ressources dans ce dossier","assets.organization.label":"Parcourir","assets.organization.folders":"Dossiers","assets.organization.all":"Toutes les ressources","assets.organization.summary":"{count} ressources","assets.view.options":"Options d’affichage","assets.view.mode":"Mode d’affichage","assets.view.grid":"Grille","assets.view.list":"Liste","assets.view.thumbnailSize":"Taille des miniatures","assets.view.thumbnailSize.listReason":"La taille des miniatures est disponible en vue Grille.","assets.view.size.small":"Petite","assets.view.size.medium":"Moyenne","assets.view.size.large":"Grande","assets.list.name":"Nom","assets.list.type":"Type","assets.list.scope":"Portée","assets.list.status":"Statut","assets.list.updated":"Mis à jour","assets.loading.scope":"Chargement des ressources de {scope}...","assets.partial.title":"Certains emplacements n’ont pas pu être chargés","assets.empty.folderTitle":"Aucune ressource correspondante dans ce dossier","assets.empty.folderBody":"Essayez un autre dossier ou filtre de catégorie.","assets.empty.filteredTitle":"Aucune ressource ne correspond à ce filtre","assets.empty.filteredBody":"Choisissez une autre catégorie ou analysez à nouveau les dossiers correspondants.","assets.place.selector":"Asset place","assets.place.context":"Contexte du lieu de la ressource","assets.place.sharedLibrary":"Bibliothèque partagée","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Fonctionnement","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Fermer","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Routage de Studio","controls.studioRouting.title.tooltip":"Priorité des requêtes MCP qui n’indiquent aucun Studio.","controls.studioRouting.settingLabel":"Requêtes sans Studio indiqué","controls.studioRouting.mode.auto":"Automatique","controls.studioRouting.mode.pinned":"Studio fixe","controls.studioRouting.state.auto":"État actuel : automatique","controls.studioRouting.state.pinned":"État actuel : Studio fixe","controls.studioRouting.saving":"Application…","controls.studioRouting.applied":"Appliqué","controls.studioRouting.failed":"Échec de l’application","controls.studioRouting.pinnedUnavailable":"Connectez un Studio pour utiliser le mode Studio fixe.","controls.studioRouting.helpLabel":"Fonctionnement du routage de Studio","controls.studioRouting.helpButton":"Comment ça marche ?","controls.studioRouting.selectTarget":"Sélectionner le Studio fixe","controls.studioRouting.select":"Sélectionner","controls.studioRouting.targetGroupLabel":"Cible du Studio fixe","controls.luauValidation.title":"Vérification de la syntaxe Luau","controls.luauValidation.settingLabel":"Vérifier automatiquement après modification des Scripts","controls.luauValidation.benefit":"Après une modification de Script par l’IA, recherchez les erreurs de syntaxe Luau.","controls.luauValidation.state.on":"État actuel : activée","controls.luauValidation.state.off":"État actuel : désactivée","controls.luauValidation.priority":"Si une demande de l’IA diffère de cette option, le réglage du Dashboard est utilisé. Activez ou désactivez ici pour modifier la vérification des Scripts.","controls.luauValidation.switchLabel":"Vérification automatique après modification des Scripts","controls.luauValidation.saving":"Enregistrement…","controls.luauValidation.applied":"Appliqué","controls.luauValidation.failed":"Échec de l’application","controls.luauValidation.helpLabel":"Fonctionnement de la vérification automatique de syntaxe Luau","controls.luauValidation.helpButton":"Comment ça marche ?","controls.luauValidation.help.behavior":"Lorsque l’option est activée, après que l’IA a remplacé, modifié, inséré ou supprimé des lignes de Script, WEPPY vérifie tout le code réellement enregistré. Lorsqu’elle est désactivée, seul le Script est modifié.","controls.luauValidation.help.response":"Si le Script est correct, la réponse de fin habituelle reste courte. WEPPY affiche des détails uniquement lorsqu’une erreur est trouvée ou que la vérification ne peut pas être terminée. Les Scripts volumineux peuvent prendre un peu plus de temps.","controls.luauValidation.help.nonBlocking":"Si WEPPY détecte une erreur de syntaxe ou ne peut pas terminer la vérification, la modification enregistrée du Script n’est pas annulée. Le résultat aide l’IA à corriger immédiatement le même Script.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Plusieurs fenêtres Studio connectées ont le même Place ID. Utilisez le Studio ID pour désigner cet endroit.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Les requêtes avec Studio ID, Connection ID ou Place ID ignorent cette priorité et sont envoyées au Studio indiqué.","controls.studioRouting.state.currentTarget":"Cible prioritaire actuelle","controls.studioRouting.noPriorityTarget":"Aucun Studio connecté","controls.studioRouting.help.auto":"Automatique utilise le Studio actif le plus prioritaire selon les commandes récentes et l’ordre de connexion.","controls.studioRouting.help.pinned":"Studio fixe utilise le Studio sélectionné lorsque la requête n’indique aucun identifiant de cible.","sync.migration.title":"Mise à jour du format Sync disponible","sync.migration.description":"Vérifiez les changements de métadonnées avant de faire passer ce Place du format Sync v2 au v3.","sync.migration.status.ready":"Prêt à vérifier","sync.migration.status.blocked":"Bloqué","sync.migration.preview":"Vérifier les changements","sync.migration.summary.add":"Ajouter","sync.migration.summary.modify":"Modifier","sync.migration.summary.delete":"Supprimer","sync.migration.summary.blocked":"Bloqué","sync.migration.changes":"Changements de métadonnées","sync.migration.blockers":"Éléments à résoudre","sync.migration.operation.add":"ajouter","sync.migration.operation.modify":"modifier","sync.migration.operation.delete":"supprimer","sync.migration.reason.serializer_regeneration":"Réécrit les métadonnées dans le format canonique v3.","sync.migration.reason.volatile_metadata_removal":"Supprime les métadonnées Sync temporaires.","sync.migration.reason.redundant_empty_metadata":"Supprime les métadonnées vides redondantes.","sync.migration.reason.runtime_ignore_policy":"Met à jour la règle d’exclusion du runtime gérée.","sync.migration.reason.reverse_pending":"Appliquez ou abandonnez d’abord les changements locaux en attente vers Studio.","sync.migration.reason.conflict":"Résolvez d’abord le conflit entre les fichiers locaux et Studio.","sync.migration.reason.local_canonical_change":"Vérifiez d’abord les métadonnées canoniques modifiées localement.","sync.migration.reason.source_mutation_detected":"Un fichier source utilisateur a changé pendant la validation.","sync.migration.blocked":"Résolvez les conflits Sync avant la mise à jour","sync.migration.stale":"L’aperçu a changé. Vérifiez la différence la plus récente.","sync.migration.error":"Impossible de mettre à jour le format Sync. Réessayez.","sync.migration.refresh":"Actualiser l’aperçu","sync.migration.refreshing":"Actualisation…","sync.migration.applying":"Application…","sync.migration.apply":"Appliquer la mise à jour","sync.migration.confirm.title":"Appliquer la mise à jour du format Sync ?","sync.migration.confirm.message":"Les métadonnées Sync indiquées seront sauvegardées puis mises à jour. Vos fichiers source Luau ne seront pas modifiés.","changelog.ownership.showGenerated":"Afficher les métadonnées générées","changelog.ownership.userSource":"Source utilisateur","changelog.ownership.canonicalMirror":"Métadonnées du miroir","changelog.ownership.generated":"Généré"},$y=["en","ko","es","pt-br","ja","id","de","fr-fr"],Ea="auto",Il={en:By,ko:Wy,es:Fy,"pt-br":Ky,ja:Vy,id:Yy,de:Gy,"fr-fr":Xy},An="dashboard-locale";function Ol(i){return $y.includes(i)}function Qy(){const n=((typeof navigator<"u"?navigator.language:"en")??"en").toLowerCase();return n==="ko"||n.startsWith("ko-")?"ko":n==="pt-br"?"pt-br":n==="ja"||n.startsWith("ja-")?"ja":n==="es"||n.startsWith("es-")?"es":n==="id"||n.startsWith("id-")?"id":n==="de"||n.startsWith("de-")?"de":n==="fr"||n.startsWith("fr-")?"fr-fr":"en"}function ep(){if(typeof localStorage<"u"){const i=localStorage.getItem(An);if(i===Ea)return Ea;if(i&&Ol(i))return i}return Ea}function tp(i){return i===Ea?Qy():i}const Up=R.createContext(null);function Zy({children:i}){const[n,r]=R.useState(ep),[d,u]=R.useState(()=>tp(ep())),p=R.useCallback((y,h)=>{const v=Il[d]??Il.en??{};if(y in v)return v[y];const C=Il.en;return C&&y in C?C[y]:h!==void 0?h:y},[d]),g=R.useCallback(y=>{typeof localStorage<"u"&&(y===Ea?localStorage.removeItem(An):Ol(y)?localStorage.setItem(An,y):localStorage.setItem(An,"en"));const h=y===Ea?Ea:Ol(y)?y:"en";r(h),u(tp(h))},[]);return R.createElement(Up.Provider,{value:{locale:d,selectedLocale:n,t:p,setLocale:g}},i)}function Lo(){const i=R.useContext(Up);if(!i)throw new Error("useLocale must be used within a LocaleProvider");return i}const Jy="_container_6jg7e_2",ef="_toast_6jg7e_14",tf="_slideIn_6jg7e_1",of="_success_6jg7e_39",af="_info_6jg7e_44",sf="_warning_6jg7e_49",nf="_error_6jg7e_54",Dl={container:Jy,toast:ef,slideIn:tf,success:of,info:af,warning:sf,error:nf},Mp=R.createContext(null),rf=3e3;function lf({children:i}){const[n,r]=R.useState([]),d=R.useRef(0),u=R.useCallback((p,g="info")=>{const y=d.current++;r(h=>[...h,{id:y,message:p,type:g}]),setTimeout(()=>{r(h=>h.filter(v=>v.id!==y))},rf)},[]);return x.jsxs(Mp.Provider,{value:{show:u},children:[i,x.jsx("div",{className:Dl.container,children:n.map(p=>x.jsx("div",{className:`${Dl.toast} ${Dl[p.type]}`,children:p.message},p.id))})]})}function df(){const i=R.useContext(Mp);return i||{show:()=>{}}}function uf(){const{level:i}=_n(),{show:n}=df(),{t:r}=Lo(),d=R.useRef(null);return R.useEffect(()=>{const u=d.current;d.current=i,u!==null&&u!==i&&(u==="disconnected"&&i==="serverOnly"?n(r("toast.serverConnected","MCP 서버 연결됨"),"success"):u==="serverOnly"&&i==="studioConnected"?n(r("toast.pluginConnected","플러그인 연결됨"),"success"):(u==="serverOnly"||u==="studioConnected")&&i==="disconnected"?n(r("toast.serverDisconnected","MCP 서버 연결 끊김"),"error"):u==="studioConnected"&&i==="serverOnly"&&n(r("toast.pluginDisconnected","플러그인 연결 끊김"),"warning"))},[i,n,r]),null}const cf="_wrapper_6ij3d_2",pf="_tooltip_6ij3d_11",gf="_tooltipVisible_6ij3d_33",jl={wrapper:cf,tooltip:pf,tooltipVisible:gf},li=8,xn=6;function Ft({text:i,disabled:n=!1,children:r}){const d=R.useRef(null),u=R.useRef(null),[p,g]=R.useState(!1),[y,h]=R.useState("top"),[v,C]=R.useState("center"),[P,D]=R.useState(null),L=i.trim(),B=R.useCallback(()=>{const W=d.current,oe=u.current;if(!W||!oe)return;const V=W.getBoundingClientRect(),pe=oe.getBoundingClientRect(),De=window.innerWidth,j=window.innerHeight;let $="top";V.top-pe.height-xn<li&&V.bottom+pe.height+xn<=j-li&&($="bottom");let Se="center";const ce=V.left+V.width/2,Te=pe.width/2;ce-Te<li?Se="left":ce+Te>De-li&&(Se="right");const we=$==="top"?V.top-pe.height-xn:V.bottom+xn;let ke;Se==="left"?ke=V.left:Se==="right"?ke=V.right-pe.width:ke=ce-Te,ke=Math.max(li,Math.min(ke,De-pe.width-li)),h($),C(Se),D({top:we,left:ke})},[]);if(R.useLayoutEffect(()=>{p&&B()},[p,B]),R.useEffect(()=>{if(!p)return;const W=()=>B();return window.addEventListener("scroll",W,!0),window.addEventListener("resize",W),()=>{window.removeEventListener("scroll",W,!0),window.removeEventListener("resize",W)}},[p,B]),R.useEffect(()=>{n&&g(!1)},[n]),!L)return x.jsx(x.Fragment,{children:r});const U=()=>{n||g(!0)},N=()=>g(!1),le=x.jsx("span",{ref:u,className:[jl.tooltip,p?jl.tooltipVisible:""].filter(Boolean).join(" "),"data-placement":v,"data-vertical":y,style:P?{top:P.top,left:P.left}:{top:-9999,left:-9999,visibility:"hidden"},children:L});return x.jsxs(x.Fragment,{children:[x.jsx("span",{ref:d,className:jl.wrapper,"data-tooltip-text":L,onMouseEnter:U,onMouseLeave:N,onFocus:U,onBlur:N,children:r}),!n&&typeof document<"u"?Ln.createPortal(le,document.body):null]})}function hf(i){return i==="auto"||i==="polar"||i==="gumroad"?i:void 0}function mf(i){if(!i||typeof i!="object")return!1;const n=i.status;return(i.tier==="basic"||i.tier==="pro")&&(n==="active"||n==="grace"||n==="invalid"||n==="revoked"||n==="unlicensed"||n==="unknown")}function Hp(i){return i&&typeof i=="object"&&"data"in i&&i.data?i.data:i}function _p(i){if(!i||typeof i!="object")return null;if(mf(i))return i;const n=i;if(typeof n.canUsePro!="boolean"||typeof n.status!="string"||n.status!=="active"&&n.status!=="grace"&&n.status!=="invalid"&&n.status!=="revoked"&&n.status!=="unlicensed"&&n.status!=="unknown")return null;const r=hf(n.provider);return{tier:n.canUsePro?"pro":"basic",status:n.status,...typeof n.statusDetail=="string"?{statusDetail:n.statusDetail}:{},...typeof n.maskedKey=="string"?{maskedKey:n.maskedKey}:{},...r?{provider:r}:{},refreshRequired:n.refreshRequired===!0,...typeof n.refreshBlockedReason=="string"?{refreshBlockedReason:n.refreshBlockedReason}:{}}}async function Np(i="auto"){const n=await jt.get("/api/dashboard/license/status",{provider:i});return _p(Hp(n))}function Zl(i){const n=Hp(i),r=n,d=_p(n),u=typeof(r==null?void 0:r.reasonCode)=="string"?r.reasonCode:void 0;return{ok:(r==null?void 0:r.ok)===!0,license:d?{...d,refreshRequired:d.refreshRequired||u==="missing_session_token",refreshBlockedReason:d.refreshBlockedReason??(u==="missing_session_token"?"missing_session_token":void 0)}:null,message:typeof(r==null?void 0:r.message)=="string"?r.message:null,reasonCode:u,recoverable:(r==null?void 0:r.recoverable)===!0}}async function zb(i){const n=i.provider??"auto",r=await jt.post("/api/dashboard/license/activate",{provider:n,licenseKey:i.licenseKey,clientType:"dashboard"});return Zl(r)}async function Ub(i={}){const n=i.provider??"auto",r=await jt.post("/api/dashboard/license/refresh",{provider:n,clientType:"dashboard"});return Zl(r)}async function Mb(i={}){const n=i.provider??"auto",r=await jt.post("/api/dashboard/license/reset",{provider:n,clientType:"dashboard"});return Zl(r)}/**
149
+ [exemple] rapport d'aperçu terminé`,"sidebar.whatsNew":"Quoi de neuf","sidebar.help.group":"Aide et commentaires","sidebar.help.bug":"Signaler un bug","sidebar.help.bug.tooltip":"Créer un bundle de diagnostic local, puis ouvrir un rapport de bug pré-rempli sur GitHub","bugReportDialog.title":"diagnostics.zip peut nous aider à analyser le problème","bugReportDialog.subtitle":"WEPPY a créé un zip de diagnostic sur cet ordinateur. Il contient des logs Studio, plugin, Sync et outils qui peuvent nous aider à comprendre ce qui s’est passé.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Vous pouvez envoyer le rapport sans ce fichier, mais joindre le zip nous aide souvent à trouver la cause plus vite.","bugReportDialog.attachHow":"Pour le joindre, téléchargez ou affichez le zip, puis ajoutez-le au champ Diagnostics ZIP (optional) de l’issue GitHub avant de l’envoyer.","bugReportDialog.download":"1. Télécharger diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Ouvrir l’issue GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Le zip peut contenir des logs locaux et du contexte de projet. Vérifiez-le avant de le joindre si vous voulez le partager.","sidebar.help.feature":"Suggérer une fonctionnalité","sidebar.help.feature.tooltip":"Suggérer une nouvelle fonctionnalité ou une amélioration sur GitHub","sidebar.help.discussions":"Aide pour l’installation et l’utilisation","sidebar.help.discussions.tooltip":"Demander de l'aide pour l'installation ou l'utilisation via GitHub Issues","sidebar.help.troubleshooting":"Guide de dépannage","sidebar.help.troubleshooting.tooltip":"Ouvrez le guide de dépannage officiel sur weppyai.com","header.whatsNew":"Quoi de neuf","header.whatsNew.tooltip":"Quoi de neuf","upgrade.title":"Voir Pro","upgrade.tagline":"Découvrir les fonctions Pro","upgrade.cta":"Voir Pro","upgrade.licenseShortcut":"Saisir la licence","upgrade.validUntil":"Jusqu'au {{date}}","whatsNew.pageTitle":"Quoi de neuf","whatsNew.pageSubtitle":"Restez informé des modifications apportées à MCP","whatsNew.unreadSection":"Non lu","whatsNew.allSection":"Toutes les annonces","whatsNew.empty":"Aucune annonce pour l'instant","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"IMPORTANT","whatsNew.category.release":"Libérer","whatsNew.category.notice":"Avis","whatsNew.category.deprecation":"Obsolète","whatsNew.category.tip":"Conseil","uiStudio.title":"UI Studio","uiStudio.empty":"Aucune capture d'écran enregistrée pour l'instant. Ils sont créés automatiquement lorsqu'un agent IA capture l'état actuel de l'interface utilisateur.","uiStudio.loading":"Chargement…","uiStudio.pluginGuide.title":"Le plugin Roblox Studio n'est pas connecté","uiStudio.pluginGuide.message":"UI Studio affiche des captures d'écran et l'historique des modifications à partir du lieu Studio connecté. Il sera mis à jour automatiquement après la connexion de Studio et de WEPPY Plugin.","uiStudio.pluginGuide.check1":"Roblox Studio est-il en cours d'exécution ?","uiStudio.pluginGuide.check2":"Le WEPPY Plugin est-il installé et en cours d'exécution ?","uiStudio.pluginGuide.waiting":"En attente de connexion au plugin...","uiStudio.capturedAt":"Capturé à","uiStudio.scope":"Portée","uiStudio.target":"Cible","uiStudio.briefId":"Brève pièce d'identité","uiStudio.detailClose":"Fermer","uiStudio.colCheck":"Vérifier","uiStudio.colPriority":"Priorité","uiStudio.colCurrent":"Actuel","uiStudio.colRecommended":"Recommandé","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Examinez d'abord","uiStudio.priorityLow":"Amélioration facultative","uiStudio.highPrioritySection":"Examinez d'abord","uiStudio.lowPrioritySection":"Améliorations facultatives","uiStudio.groupSummary":"articles","uiStudio.fixLabel":"Réparer","uiStudio.copyFixCommand":"Copier l'instruction IA","uiStudio.copiedToClipboard":"Copié","uiStudio.fullPath":"Chemin complet","uiStudio.falsePositiveWarning":"Ce groupe peut contenir des faux positifs","uiStudio.noSuggestions":"Aucune suggestion d'amélioration actuelle","uiStudio.sample.badge":"Aperçu du Pro UI Studio","uiStudio.sample.title":"Vous prévisualisez le UI Studio qui se déverrouille après la mise à niveau vers Pro.","uiStudio.sample.message":"Cet aperçu utilise des exemples de données provenant d’une interface utilisateur d’inventaire de démonstration. De vraies captures d'écran, un historique des révisions et des correctifs basés sur l'IA sont déverrouillés avec Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Histoire","uiStudio.analysis.reportsTitle":"Dernière analyse par cible d'interface utilisateur","uiStudio.analysis.recentCapturesTitle":"Captures récentes","uiStudio.analysis.detailDialog":"Détail de l'analyse","uiStudio.analysis.targetCountLabel":"Cibles analysées","uiStudio.analysis.captureLabel":"Captures","uiStudio.analysis.verdict.hasSuggestions":"Suggestions d'amélioration","uiStudio.analysis.verdict.needsFix":"Suggestions d'amélioration","uiStudio.analysis.verdict.review":"Suggestions d'amélioration","uiStudio.analysis.verdict.passed":"Aucune suggestion actuelle","uiStudio.analysis.verdictLabel":"Résumé des améliorations","uiStudio.analysis.thresholds":"Base de révision","uiStudio.analysis.issueSummary.passed":"Aucune suggestion d’amélioration supplémentaire dans le cadre de l’examen actuel.","uiStudio.history.title":"Historique des modifications","uiStudio.history.empty":"Pas d'historique pour l'instant. Lorsqu'un agent IA modifie l'interface utilisateur à l'aide de manage_ui, cela sera automatiquement enregistré.","uiStudio.history.loading":"Chargement...","uiStudio.history.loadingPlace":"Chargement du place actuel...","uiStudio.history.noPlace":"Aucune donnée du place actuel n'est encore disponible. Connectez le WEPPY Plugin et synchronisez un place pour voir l'historique des changements UI.","uiStudio.history.noPlaceAction":"Le place actuel n'est pas encore disponible.","uiStudio.history.error":"Erreur","uiStudio.history.clear":"Clair","uiStudio.history.filter.actions":"Type d'action","uiStudio.history.filter.actionAll":"Tous","uiStudio.history.filter.actionCreate":"Créer","uiStudio.history.filter.actionUpdate":"Mise à jour","uiStudio.history.filter.actionDelete":"Supprimer","uiStudio.history.filter.period":"Période","uiStudio.history.filter.dateAll":"Tous","uiStudio.history.filter.today":"Aujourd'hui","uiStudio.history.filter.yesterday":"Hier","uiStudio.history.filter.last7Days":"7 derniers jours","uiStudio.history.filter.last30Days":"30 derniers jours","uiStudio.history.filter.customRange":"Gamme personnalisée","uiStudio.history.filter.reset":"Réinitialiser","uiStudio.history.filter.from":"Depuis","uiStudio.history.filter.to":"À","uiStudio.history.row.affectedPaths":"Chemins","uiStudio.history.row.mutations":"Modifier les détails","uiStudio.history.row.expand":"▾ Développer","uiStudio.history.row.collapse":"▲ Réduire","uiStudio.history.row.expandDetails":"Afficher les détails de la modification {n}","uiStudio.history.row.collapseDetails":"Masquer les détails des modifications","uiStudio.history.row.toggleDetails":"Toggle modifier les détails","uiStudio.history.row.mutationsEmpty":"Aucun détail de changement","uiStudio.history.row.toolLabel":"Modifications de l'interface utilisateur ({n})","uiStudio.history.row.compare":"Avant/Après","uiStudio.history.row.noBeforeState":"Non avant l'état","uiStudio.history.row.noAfterState":"Non après l'état","uiStudio.history.row.qualityPlan":"Direction de la conception","uiStudio.history.row.designCheck":"Suggestions","uiStudio.history.row.designCheckUnavailable":"Suggestions: indisponible","uiStudio.history.row.designCheckNone":"Suggestions : aucune","uiStudio.history.selection.deleteSelected":"Supprimer la sélection","uiStudio.history.selection.selectAll":"Sélectionner tout","uiStudio.history.selection.clearSelection":"Effacer la sélection","uiStudio.history.confirm.deleteRequestsTitle":"Supprimer les enregistrements de modifications","uiStudio.history.confirm.deleteRequestsMessage":"Les enregistrements de modifications sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.history.confirm.clearRequestsTitle":"Effacer l'historique des modifications","uiStudio.history.confirm.clearRequestsMessage":"Cela efface l’historique actuel des changements de lieu. Les instances Studio ne sont pas affectées.","uiStudio.history.confirm.cascadeOption":"Supprimez également les captures d'écran liées","uiStudio.history.drawer.close":"Fermer","uiStudio.actions.previewAgain":"Aperçu à nouveau","uiStudio.actions.deleteSnapshot":"Supprimer cette capture d'écran","uiStudio.actions.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.actions.captureCurrentState":"Capturer l'état actuel","uiStudio.actions.checkSuggestionsAgain":"Revérifiez les suggestions","uiStudio.actions.previewRunning":"Capturer…","uiStudio.actions.previewRunningDetail":"Le nouvel ID de fichier de capture d'écran apparaîtra une fois la capture terminée.","uiStudio.actions.previewNeedsSaveCheck":"Capture terminée, la sauvegarde doit être révisée","uiStudio.actions.previewSaved":"Nouvelle capture d'écran enregistrée","uiStudio.actions.previewComplete":"Capture terminée","uiStudio.actions.previewSavedDetail":"Les captures d'écran existantes sont conservées ; cela a été enregistré en tant que nouveau fichier.","uiStudio.actions.previewSavedPathMissing":"Un nouvel ID de capture d'écran a été renvoyé, mais le chemin du fichier enregistré n'a pas pu être confirmé.","uiStudio.actions.previewSnapshotIdMissing":"Le nouvel ID de capture d'écran n'a pas pu être confirmé. Actualisez la liste pour vérifier si elle a été enregistrée.","uiStudio.actions.more":"Plus","uiStudio.gallery.selection.selectedCount":"choisi","uiStudio.confirm.deleteSnapshotTitle":"Supprimer la capture d'écran","uiStudio.confirm.deleteSnapshotMessage":"Seul ce fichier de capture d'écran sera supprimé (l'instance Studio est conservée).","uiStudio.confirm.deleteBatchTitle":"Supprimer les captures d'écran sélectionnées","uiStudio.confirm.deleteBatchMessage":"Les captures d'écran sélectionnées seront supprimées. Cette action ne peut pas être annulée.","uiStudio.gallery.selectMode":"Sélectionner","uiStudio.gallery.exitSelectMode":"Annuler","uiStudio.gallery.selectAll":"Sélectionner tout","uiStudio.gallery.clearSelection":"Effacer la sélection","uiStudio.gallery.deleteSelected":"Supprimer la sélection","common.save":"Enregistrer","common.cancel":"Annuler","common.delete":"Supprimer","uiStudio.storage.title":"UI Studio Données enregistrées","uiStudio.storage.usageLabel":"Utilisé","uiStudio.storage.historyBytes":"Changer l'historique","uiStudio.storage.snapshotBytes":"Captures d'écran","uiStudio.storage.requestCount":"Modifier les enregistrements","uiStudio.storage.mutationCount":"Modifier les détails","uiStudio.storage.snapshotCount":"Captures d'écran","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Dernier nettoyage automatique","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"libéré","uiStudio.storage.lastRunErrors":"Erreurs","uiStudio.storage.loading":"Chargement...","uiStudio.cleanup.policy.title":"Politique de suppression automatique","uiStudio.cleanup.policy.modeOff":"Désactivé","uiStudio.cleanup.policy.modeAge":"Basé sur l'âge","uiStudio.cleanup.policy.modeSize":"Basé sur la taille","uiStudio.cleanup.policy.cascade":"Supprimez également les captures d'écran liées","uiStudio.cleanup.policy.save":"Enregistrer la politique","uiStudio.cleanup.policy.runNow":"Exécuter la règle enregistrée","uiStudio.cleanup.policy.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmer la politique","uiStudio.cleanup.policy.confirm.messageStrict":"L'application de cette politique entraînera la suppression immédiate","uiStudio.cleanup.policy.confirm.requests":"modifier les enregistrements","uiStudio.cleanup.policy.confirm.snapshots":"captures d'écran","uiStudio.cleanup.policy.confirm.freed":"libéré — Postuler ?","uiStudio.cleanup.keepLastNDays":"Conserver les {n} derniers jours","uiStudio.cleanup.selectedDelete":"Supprimer la sélection…","uiStudio.cleanup.deleteAll":"Supprimer tout…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmer le nettoyage","uiStudio.cleanup.cleanupConfirmMessage":"Tous les éléments sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Les enregistrements de modifications et les captures d'écran datant de plus de 7 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Les enregistrements de modifications et les captures d'écran datant de plus de 30 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.all":"Les enregistrements de modifications enregistrées et les captures d'écran seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.label":"Nettoyage manuel","uiStudio.cleanup.studioPreservedNote":"Cela supprime uniquement les enregistrements de modifications enregistrées et les captures d'écran sur le disque ; Les instances Roblox Studio ne sont pas affectées.","uiStudio.history.sample.bannerBadge":"Aperçu de l'historique des modifications Pro","uiStudio.history.sample.bannerTitle":"Vous prévisualisez l'historique des modifications de l'interface utilisateur qui se déverrouille après la mise à niveau vers Pro.","uiStudio.history.sample.bannerMessage":"Cet aperçu utilise des exemples de données. Historique réel des modifications, comparaison avant/après et déverrouillage de suppression par lots avec Pro.","uiStudio.fix.touchTarget.label":"Taille de la cible tactile","uiStudio.fix.touchTarget.description":"Vérifie si les commandes sont suffisamment grandes pour appuyer confortablement sur mobile.","uiStudio.fix.touchTarget.howToFix":"Augmentez la taille du bouton à au moins 44 x 44 px ou agrandissez la zone tactile avec UIPadding.","uiStudio.fix.contrast.label":"Contraste du texte","uiStudio.fix.contrast.description":"Vérifie si le contraste du texte et de l’arrière-plan respecte les directives d’accessibilité.","uiStudio.fix.contrast.howToFix":"Utilisez un TextColor3 plus clair ou assombrissez le BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Les icônes Emoji peuvent être des faux positifs lorsque leur couleur est corrigée.","uiStudio.fix.textScaled.label":"Utilisation à l'échelle du texte","uiStudio.fix.textScaled.description":"TextScaled sans UITextSizeConstraint peut interrompre les mises en page lorsque le texte se développe.","uiStudio.fix.textScaled.howToFix":"Ajoutez un enfant UITextSizeConstraint au TextLabel et définissez MaxTextSize.","uiStudio.fix.safezone.label":"Placement en zone de sécurité","uiStudio.fix.safezone.description":"Vérifie si les contrôles restent à l’intérieur des zones de sécurité de la plate-forme.","uiStudio.fix.safezone.howToFix":"Déplacez la position à l’intérieur de la zone de sécurité ou réduisez le cadre parent.","uiStudio.fix.minTextSize.label":"Taille de police minimale","uiStudio.fix.minTextSize.description":"Vérifie si le texte est trop petit pour être lu confortablement.","uiStudio.fix.minTextSize.howToFix":"Augmentez TextSize à au moins 14 pour le corps du texte.","uiStudio.sample.history.request1.label":"Création initiale de la disposition du HUD","uiStudio.sample.history.request2.label":"Mise à jour de la conception modale de l'inventaire","uiStudio.sample.history.request3.label":"Mise à jour des couleurs du HUD HealthBar","uiStudio.sample.history.request4.label":"Cibles tactiles du bouton de l'onglet Développer l'inventaire","uiStudio.sample.history.request5.label":"Fenêtre contextuelle Supprimer les paramètres","uiStudio.sample.history.request6.label":"Ajouter un composant de mini-carte HUD","uiStudio.sample.history.request1.mutation1.diff":"Cadre créé + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Définir le point d'ancrage, la position et la taille","uiStudio.sample.history.request1.mutation5.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 pour un meilleur contraste","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, définissez BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (ton rouge)","uiStudio.sample.history.request3.mutation2.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request4.mutation1.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request5.mutation1.diff":"ScreenGui supprimé (interface utilisateur réservée aux paramètres uniquement)","uiStudio.sample.history.request6.mutation1.diff":"Tentative de création de Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Définir la taille, la position et la transparence de l'arrière-plan","uiStudio.sample.history.request6.mutation3.diff":"Interrompu par le redémarrage du serveur lors de la configuration d'ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Capture d'écran partielle enregistrée","uiStudio.sample.history.request6.mutation3.error":"server_restart : connexion perdue","uiStudio.sample.history.request6.mutation4.error":"capture d'écran partielle : couches manquantes","uiStudio.sample.history.detail.backgroundColor":"Couleur de fond","uiStudio.sample.history.detail.anchorPoint":"Ancre","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Taille","uiStudio.sample.history.detail.textColor":"Couleur du texte","uiStudio.sample.history.detail.textSize":"Taille du texte","uiStudio.sample.history.detail.borderSize":"Taille de la bordure","uiStudio.sample.history.detail.borderColor":"Couleur de la bordure","settings.dataHistory.title":"Données et historique","settings.dataHistory.title.tooltip":"Gérez les données enregistrées du tableau de bord en un seul endroit.","settings.dataHistory.collapse":"Réduire {title}","settings.dataHistory.expand":"Développez {title}","settings.dataHistory.scope":"Projet actuel","settings.dataHistory.scope.tooltip":"Des actions claires s’appliquent au projet en cours et au lieu actif le cas échéant.","settings.dataHistory.intro":"Consultez les données enregistrées du tableau de bord, ouvrez la page associée ou effacez les enregistrements stockés à partir d'un seul endroit.","settings.dataHistory.toolsActivity.title":"Activité de l'outil","settings.dataHistory.toolsActivity.description":"Exécutions d'outils enregistrées affichées sur la page Outils.","settings.dataHistory.toolStats.title":"Statistiques d'utilisation des outils","settings.dataHistory.toolStats.description":"Nombre d’outils agrégés et totaux d’état.","settings.dataHistory.syncLog.title":"Journal de synchronisation","settings.dataHistory.syncLog.description":"Événements de synchronisation de fichiers enregistrés pour le lieu actif.","settings.dataHistory.playtest.title":"Rapports de tests de jeu","settings.dataHistory.playtest.description":"Rapports et journaux de tests de jeu automatisés enregistrés.","settings.dataHistory.projectChanges.title":"Prorésumé des modifications du projet","settings.dataHistory.projectChanges.description":"Résumés enregistrés des modifications du projet.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Exécuter la règle enregistrée","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Journal de connexion","settings.dataHistory.connectionLog.description":"Enregistrement des événements de connexion MCP et Studio.","settings.dataHistory.uiStudio.title":"Historique et captures d'écran de UI Studio","settings.dataHistory.uiStudio.tooltip":"Gérez les enregistrements de modifications UI Studio enregistrés, les captures d'écran et la politique de suppression automatique.","settings.dataHistory.uiStudio.description":"Enregistrements de modifications, captures d'écran et politique de nettoyage UI Studio enregistrés.","settings.dataHistory.uiStudio.clear.title":"Effacer les données enregistrées UI Studio ?","settings.dataHistory.uiStudio.clear.message":"Cela supprime uniquement les enregistrements de modifications et les captures d'écran UI Studio enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.uiStudio.clear.success":"Les données enregistrées par UI Studio ont été effacées.","settings.dataHistory.uiStudio.clear.failed":"Échec de la suppression des données enregistrées UI Studio.","settings.dataHistory.metric.unavailable":"Indisponible","settings.dataHistory.metric.sizeUnavailable":"taille indisponible","settings.dataHistory.metric.records":"enregistrements","settings.dataHistory.metric.runs":"court","settings.dataHistory.metric.sessions":"séances","settings.dataHistory.metric.reports":"rapports","settings.dataHistory.open":"Ouvrir","settings.dataHistory.clearAll":"Tout effacer","settings.dataHistory.clear.title":"Effacer les données enregistrées ?","settings.dataHistory.clear.message":"Cela supprime uniquement les enregistrements de tableau de bord enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.clear.success":"Données enregistrées effacées.","settings.dataHistory.clear.failed":"Échec de la suppression des données enregistrées.","uiStudio.history.sample.tooltip":"Passez à Pro pour débloquer l'historique complet","toast.serverConnected":"Serveur MCP connecté","toast.serverDisconnected":"Serveur MCP déconnecté","toast.pluginConnected":"Plugin connecté","toast.pluginDisconnected":"Plugin déconnecté","toast.clearSuccess":"Effacé avec succès","toast.clearFailed":"Échec de la suppression des données","common.clear":"Clair","settings.license.activate":"Activer la licence","settings.license.refresh":"Actualiser la licence","settings.license.keyInput":"Clé de licence","settings.license.disconnected":"Déconnecté","settings.license.disconnected.tooltip":"Reconnectez-vous au serveur MCP pour gérer les actions de licence à partir de WEPPY Dashboard.","settings.license.live.tooltip":"Les actions de licence sont immédiatement envoyées au serveur MCP.","settings.license.status.activationRequired":"Activation requise","settings.license.status.activationRequired.tooltip":"L'activation manuelle de la licence est requise avant que WEPPY Dashboard puisse actualiser ce statut.","settings.license.status.grace":"Grâce","settings.license.status.grace.tooltip":"La vérification Provider est temporairement indisponible, mais l'accès Pro reste actif pendant la période de grâce.","settings.license.status.graceBilling.tooltip":"L'accès Pro est toujours disponible pendant une période de grâce liée à la facturation.","settings.license.detail.graceBilling":"L'accès Pro reste disponible pendant une période de grâce de facturation.","settings.license.detail.graceProviderUnavailable":"Provider indisponible. L'accès Pro reste actif pendant le mode grâce.","settings.license.detail.manualActivation":"Activation manuelle requise pour restaurer l'accès à Pro.","settings.license.detail.missingSessionToken":"L'actualisation est bloquée car le jeton de session en cours est manquant.","settings.license.detail.refreshRecommended":"La vérification des licences devrait être actualisée prochainement.","connection.agents.kill":"Tuer","connection.agents.kill.title":"Tuer l'agent ?","connection.agents.killed":"Agent tué","connection.agents.killFailed":"Impossible de tuer l'agent","connection.agents.lastCommand":"Dernière commande","connection.agents.lastCommand.tooltip":"Appel d'outil le plus récent exécuté par cet agent","connection.agents.lastSeen":"Vu pour la dernière fois","connection.agents.lastSeen.tooltip":"Battement de cœur ou activité la plus récente de cet agent","connection.clear.title":"Effacer le journal de connexion ?","connection.clear.message":"Cela supprime définitivement le journal de connexion stocké pour le projet en cours.","sync.clear.title":"Effacer le journal de synchronisation ?","sync.clear.message":"Cela supprime définitivement le journal de synchronisation stocké pour le lieu actuel.","playtest.clear.title":"Effacer l'historique des tests ?","playtest.clear.message":"Cela supprime définitivement les rapports de test de jeu stockés pour le lieu actuel.","changelog.clear.title":"Effacer le journal des modifications ?","changelog.clear.message":"Cela supprime définitivement le journal des modifications stocké pour le lieu actuel.","sync.status.placePath":"Placer le chemin","sync.status.placePath.tooltip":"Répertoire de lieu actif où les fichiers de l'explorateur sont synchronisés.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Zone représentative","changelog.card.verification":"Vérification","uiStudio.tabs.analysis.tooltip":"Parcourez les écrans d’interface utilisateur capturés par l’IA et trouvez rapidement quelles interfaces utilisateur doivent être améliorées.","uiStudio.tabs.history.tooltip":"Chaque changement d'interface utilisateur effectué par l'IA, dans l'ordre. Comparez les écrans avant et après.","uiStudio.title.tooltip":"Un endroit central pour examiner les écrans d’interface utilisateur générés par l’IA et les suggestions d’amélioration.","uiStudio.analysis.reportsTitle.tooltip":"Affiche le dernier résumé de capture et de suggestion par interface utilisateur (par exemple, fenêtre d'inventaire, menu principal).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Certaines améliorations ont été trouvées dans cette interface utilisateur. Cliquez sur la carte pour plus de détails.","uiStudio.analysis.verdict.passed.tooltip":"Aucune amélioration suggérée en vertu des seuils d'examen actuels.","uiStudio.analysis.counts.tooltip":"« Principal » sont les éléments clés à examiner en premier ; Les « notes » sont des raffinements agréables à avoir.","uiStudio.analysis.thresholds.tooltip":"Ensemble de seuils utilisé pour cet examen (par défaut ou personnalisé).","uiStudio.analysis.recentCapturesTitle.tooltip":"Toutes les captures récemment enregistrées par ordre chronologique.","uiStudio.gallery.selectAll.tooltip":"Sélectionnez toutes les captures visibles à la fois.","uiStudio.gallery.clearSelection.tooltip":"Effacez la sélection actuelle.","uiStudio.gallery.deleteSelected.tooltip":"Supprimez uniquement les fichiers de capture sélectionnés. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.gallery.cardCheckbox.tooltip":"Sélectionnez cette capture. Choisissez-en plusieurs pour les supprimer ensemble.","uiStudio.detailClose.tooltip":"Fermez ce panneau de détails.","uiStudio.actions.captureCurrentState.tooltip":"Enregistrez l'interface utilisateur actuellement affichée dans Studio en tant que nouvelle capture. Les captures existantes sont conservées.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recalculez les suggestions pour cette capture sans prendre une nouvelle capture d'écran.","uiStudio.actions.more.tooltip":"Ouvrez des actions supplémentaires.","uiStudio.actions.deleteSnapshot.tooltip":"Supprimez uniquement ce fichier de capture. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.capturedAt.tooltip":"Quand cet écran a été capturé.","uiStudio.scope.tooltip":"Portée de capture (plein écran ou interface utilisateur spécifique).","uiStudio.target.tooltip":"Chemin exact de l’instance d’interface utilisateur capturée.","uiStudio.briefId.tooltip":"Identifiant du cahier des charges qui a produit cette interface utilisateur.","uiStudio.analysis.verdictLabel.tooltip":"Verdict d'amélioration globale pour cette capture.","uiStudio.suggestionGroup.tooltip":"Suggestions du même genre regroupées. Cliquez pour agrandir ou réduire.","uiStudio.groupSummary.tooltip":"Nombre d'éléments d'interface utilisateur correspondant à ce groupe.","uiStudio.colCurrent.tooltip":"La valeur actuellement appliquée.","uiStudio.colRecommended.tooltip":"La valeur recommandée.","uiStudio.copyFixCommand.tooltip":"Copiez une invite demandant à l'IA de résoudre ce problème.","uiStudio.falsePositiveWarning.tooltip":"Cette vérification peut produire des faux positifs – vérifiez avant de postuler.","uiStudio.history.filter.actions.tooltip":"Filtrez les enregistrements en fonction du type de modification apportée par l'IA.","uiStudio.history.filter.period.tooltip":"Filtrer les enregistrements par plage horaire.","uiStudio.history.filter.from.tooltip":"Date de début de la requête.","uiStudio.history.filter.to.tooltip":"Date de fin de la requête.","uiStudio.history.filter.actionAll.tooltip":"Montrez tout type d'action.","uiStudio.history.filter.actionCreate.tooltip":"Afficher uniquement les actions qui ont créé une nouvelle interface utilisateur.","uiStudio.history.filter.actionUpdate.tooltip":"Afficher uniquement les actions qui ont mis à jour une interface utilisateur existante.","uiStudio.history.filter.actionDelete.tooltip":"Afficher uniquement les actions qui ont supprimé une interface utilisateur.","uiStudio.history.filter.dateAll.tooltip":"Afficher l'historique complet.","uiStudio.history.filter.today.tooltip":"Afficher uniquement les modifications apportées à aujourd'hui.","uiStudio.history.filter.yesterday.tooltip":"Afficher uniquement les modifications d'hier.","uiStudio.history.filter.last7Days.tooltip":"Afficher les modifications des 7 derniers jours.","uiStudio.history.filter.last30Days.tooltip":"Afficher les modifications des 30 derniers jours.","uiStudio.history.filter.customRange.tooltip":"Choisissez une date de début et de fin personnalisée.","uiStudio.history.filter.reset.tooltip":"Réinitialisez tous les filtres aux valeurs par défaut.","uiStudio.history.title.tooltip":"Une chronologie de chaque modification de l'interface utilisateur effectuée par l'IA.","uiStudio.history.clear.tooltip":"Supprimez tous les enregistrements de modifications pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.history.row.compare.tooltip":"Comparez les écrans avant et après. Cliquez pour ouvrir la vue de comparaison complète.","uiStudio.history.row.extraPaths.tooltip":"Nombre d'interfaces utilisateur supplémentaires modifiées dans cette action.","uiStudio.history.row.noBeforeState.tooltip":"Aucune capture enregistrée avant ce changement.","uiStudio.history.row.noAfterState.tooltip":"Aucune capture enregistrée après ce changement.","uiStudio.history.row.affectedPaths.tooltip":"Nombre d'interfaces utilisateur affectées par cette action.","uiStudio.history.row.mutations.tooltip":"Nombre de modifications détaillées (par exemple, modifications de propriétés).","uiStudio.history.row.qualityPlan.tooltip":"Brève direction de conception utilisée pour ce changement.","uiStudio.history.row.designCheck.tooltip":"Résumé des suggestions de contrôle de conception après modification.","uiStudio.history.row.toggleDetails.tooltip":"Afficher ou masquer une ventilation par ligne de ce qui a changé.","uiStudio.compare.before.tooltip":"L'écran a été enregistré juste avant que l'IA n'effectue la modification.","uiStudio.compare.after.tooltip":"L'écran a été enregistré juste après que l'IA ait effectué la modification.","uiStudio.compare.path.tooltip":"Chemin d'accès à l'instance d'interface utilisateur pour cet écran.","uiStudio.storage.title.tooltip":"Utilisation du disque des enregistrements de modifications et des captures d'écran de UI Studio.","uiStudio.storage.usageLabel.tooltip":"Espace disque actuellement utilisé par UI Studio pour ce projet.","uiStudio.storage.historyBytes.tooltip":"Espace occupé par les données d'enregistrement de modification (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Espace occupé par les fichiers image PNG capturés.","uiStudio.storage.requestCount.tooltip":"Nombre d'actions où l'IA a modifié l'interface utilisateur.","uiStudio.storage.mutationCount.tooltip":"Nombre de modifications détaillées dans les actions (une modification de propriété = 1).","uiStudio.storage.snapshotCount.tooltip":"Nombre de fichiers d'images de capture enregistrés.","uiStudio.storage.lastRun.tooltip":"Quand la stratégie de nettoyage automatique a été exécutée pour la dernière fois et ce qu’elle a supprimé.","uiStudio.cleanup.label.tooltip":"Nettoyez manuellement les enregistrements et les captures de modifications quand vous le souhaitez.","uiStudio.cleanup.keep7.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 7 jours.","uiStudio.cleanup.keep30.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 30 jours.","uiStudio.cleanup.deleteAll.tooltip":"Supprimez chaque enregistrement de modification et capture pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.cleanup.policy.title.tooltip":"Règles qui suppriment automatiquement les captures anciennes ou volumineuses.","uiStudio.cleanup.policy.modeOff.tooltip":"Désactivez le nettoyage automatique. Les données restent jusqu'à ce que vous les supprimiez manuellement.","uiStudio.cleanup.policy.modeAge.tooltip":"Supprimez automatiquement les données antérieures au nombre de jours configuré.","uiStudio.cleanup.policy.modeSize.tooltip":"Lorsque l'utilisation totale dépasse la limite, les données les plus anciennes sont supprimées en premier.","uiStudio.cleanup.policy.agePreset.tooltip":"Supprimez les données datant de plus de plusieurs jours.","uiStudio.cleanup.policy.ageInput.tooltip":"Entrez n'importe quelle valeur comprise entre 1 et 365 jours.","uiStudio.cleanup.policy.sizePreset.tooltip":"Gardez l’utilisation totale en dessous de cette taille.","uiStudio.cleanup.policy.sizeInput.tooltip":"Saisissez n'importe quelle valeur comprise entre 50 Mo et 10 000 Mo (10 Go).","uiStudio.cleanup.policy.cascade.tooltip":"Supprimez également les images de capture liées à ces enregistrements. Si cette option est désactivée, les images restent.","uiStudio.cleanup.policy.save.tooltip":"Enregistrez la règle de nettoyage actuelle. Il fonctionne désormais en arrière-plan.","uiStudio.cleanup.policy.runNow.tooltip":"Exécutez maintenant une fois la règle de nettoyage enregistrée, sans attendre la prochaine exécution planifiée.","settings.license.refresh.tooltip":"Récupérez à nouveau l'état actuel à partir du serveur de licences. Utile lorsqu'un changement de facturation n'est pas encore apparu.","settings.license.reset.tooltip":"Supprimez la clé de licence actuellement enregistrée. Utilisez-le avant d'activer avec une clé différente.","settings.license.activate.tooltip":"Activez les fonctionnalités Pro avec la clé de licence saisie.","tier.upgrade.tooltip":"Voir les fonctions Pro et les options d’achat.","settings.language.auto.tooltip":"Suivez la langue du système d'exploitation. Revient à l'anglais lorsqu'il n'est pas pris en charge.","settings.dataHistory.open.tooltip":"Ouvrez la page qui montre cet élément en détail.","settings.dataHistory.clear.tooltip":"Supprimez uniquement les enregistrements enregistrés pour cet élément. Les données Roblox Studio ne sont pas modifiées.","settings.dataHistory.toggle.tooltip":"Réduisez ou développez cette section.","settings.dataHistory.manageStorage":"Gérer le stockage","settings.dataHistory.manageStorage.tooltip":"Afficher ou masquer la politique de stockage et les options de nettoyage.","settings.dataHistory.manageStorage.projectChanges.aria":"Gérer le stockage du résumé des modifications du projet","settings.dataHistory.manageStorage.uiStudio.aria":"Gérer le stockage de l’historique et des captures d’écran UI Studio","settings.dataHistory.toolsActivity.metric.tooltip":"Nombre d'exécutions d'outils enregistrées et espace disque qu'elles utilisent.","settings.dataHistory.toolStats.metric.tooltip":"Nombre total d'exécutions et de sessions agrégées.","settings.dataHistory.syncLog.metric.tooltip":"Nombre d'événements de synchronisation enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.playtestReports.metric.tooltip":"Nombre de rapports de tests de jeu enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.projectChanges.metric.tooltip":"Nombre de résumés de modifications de projet enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.connectionLog.metric.tooltip":"Nombre d'événements de connexion enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio modifie le nombre d'enregistrements et de captures, ainsi que l'utilisation totale du disque.","uiStudio.designCheckResultsTitle":"Suggestions de contrôle de conception","uiStudio.designCheckResultsTitle.tooltip":"Toutes les suggestions d'amélioration trouvées dans cette capture.","uiStudio.actions.designCheckAgain":"Revérifier","uiStudio.actions.designCheckRunning":"Vérification des suggestions...","uiStudio.actions.designCheckRunningDetail":"Les décomptes d’articles examinés en premier, recommandés et facultatifs apparaîtront une fois la vérification terminée.","uiStudio.actions.designCheckComplete":"Vérification des suggestions terminée","uiStudio.actions.designCheckNoSnapshotSaved":"Cette action n'enregistre pas un nouveau fichier de capture d'écran.","uiStudio.sample.designCheck.contrast":"Le contraste du texte est inférieur à {expected} (actuel {actual}). Ajustez TextColor3 ou BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"La cible tactile est inférieure à {expected} (actuel {actual}). Augmentez la taille ou le rembourrage.","uiStudio.sample.designCheck.minTextSize":"TextSize est inférieur à {expected} (actuel {actual}). Augmentez-le pour plus de lisibilité.","uiStudio.gallery.priorityHighBadge.tooltip":"Nombre de suggestions à examiner en premier. Cliquez pour plus de détails.","uiStudio.gallery.priorityMediumBadge.tooltip":"Nombre de suggestions recommandées.","uiStudio.priorityMedium":"Examen recommandé","uiStudio.mediumPrioritySection":"Examen recommandé","uiStudio.gallery.priorityLowBadge.tooltip":"Nombre d'améliorations facultatives.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Erreur","uiStudio.analysis.expandChildren":"Afficher les cibles enfants","uiStudio.analysis.openDetail":"Détail ouvert","uiStudio.analysis.childTargets":"Enfants cibles","uiStudio.analysis.childDetailHint":"Ouvrir les détails de la cible enfant","uiStudio.compare.before":"Avant","uiStudio.compare.after":"Après","uiStudio.history.drawer.changeDetails":"Modifier les détails","uiStudio.gallery.cardCheckbox":"Sélectionnez une capture d'écran","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Toutes les portées","assets.explorer.label":"Explorateur de ressources","assets.breadcrumb.label":"Chemin de la ressource","assets.explorer.summary":"{direct} dans ce dossier · {descendant} dans les sous-dossiers","assets.folder.count.one":"1 ressource","assets.folder.count.many":"{count} ressources","assets.folder.type":"Dossier","assets.folders.title":"Dossiers","assets.folder.assetsTitle":"Ressources dans ce dossier","assets.organization.label":"Parcourir","assets.organization.folders":"Dossiers","assets.organization.all":"Toutes les ressources","assets.organization.summary":"{count} ressources","assets.view.options":"Options d’affichage","assets.view.mode":"Mode d’affichage","assets.view.grid":"Grille","assets.view.list":"Liste","assets.view.thumbnailSize":"Taille des miniatures","assets.view.thumbnailSize.listReason":"La taille des miniatures est disponible en vue Grille.","assets.view.size.small":"Petite","assets.view.size.medium":"Moyenne","assets.view.size.large":"Grande","assets.list.name":"Nom","assets.list.type":"Type","assets.list.scope":"Portée","assets.list.status":"Statut","assets.list.updated":"Mis à jour","assets.loading.scope":"Chargement des ressources de {scope}...","assets.partial.title":"Certains emplacements n’ont pas pu être chargés","assets.empty.folderTitle":"Aucune ressource correspondante dans ce dossier","assets.empty.folderBody":"Essayez un autre dossier ou filtre de catégorie.","assets.empty.filteredTitle":"Aucune ressource ne correspond à ce filtre","assets.empty.filteredBody":"Choisissez une autre catégorie ou analysez à nouveau les dossiers correspondants.","assets.place.selector":"Asset place","assets.place.context":"Contexte du lieu de la ressource","assets.place.sharedLibrary":"Bibliothèque partagée","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Fonctionnement","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Fermer","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Routage de Studio","controls.studioRouting.title.tooltip":"Priorité des requêtes MCP qui n’indiquent aucun Studio.","controls.studioRouting.settingLabel":"Requêtes sans Studio indiqué","controls.studioRouting.mode.auto":"Automatique","controls.studioRouting.mode.pinned":"Studio fixe","controls.studioRouting.state.auto":"État actuel : automatique","controls.studioRouting.state.pinned":"État actuel : Studio fixe","controls.studioRouting.saving":"Application…","controls.studioRouting.applied":"Appliqué","controls.studioRouting.failed":"Échec de l’application","controls.studioRouting.pinnedUnavailable":"Connectez un Studio pour utiliser le mode Studio fixe.","controls.studioRouting.helpLabel":"Fonctionnement du routage de Studio","controls.studioRouting.helpButton":"Comment ça marche ?","controls.studioRouting.selectTarget":"Sélectionner le Studio fixe","controls.studioRouting.select":"Sélectionner","controls.studioRouting.targetGroupLabel":"Cible du Studio fixe","controls.luauValidation.title":"Vérification de la syntaxe Luau","controls.luauValidation.settingLabel":"Vérifier automatiquement après modification des Scripts","controls.luauValidation.benefit":"Après une modification de Script par l’IA, recherchez les erreurs de syntaxe Luau.","controls.luauValidation.state.on":"État actuel : activée","controls.luauValidation.state.off":"État actuel : désactivée","controls.luauValidation.priority":"Si une demande de l’IA diffère de cette option, le réglage du Dashboard est utilisé. Activez ou désactivez ici pour modifier la vérification des Scripts.","controls.luauValidation.switchLabel":"Vérification automatique après modification des Scripts","controls.luauValidation.saving":"Enregistrement…","controls.luauValidation.applied":"Appliqué","controls.luauValidation.failed":"Échec de l’application","controls.luauValidation.helpLabel":"Fonctionnement de la vérification automatique de syntaxe Luau","controls.luauValidation.helpButton":"Comment ça marche ?","controls.luauValidation.help.behavior":"Lorsque l’option est activée, après que l’IA a remplacé, modifié, inséré ou supprimé des lignes de Script, WEPPY vérifie tout le code réellement enregistré. Lorsqu’elle est désactivée, seul le Script est modifié.","controls.luauValidation.help.response":"Si le Script est correct, la réponse de fin habituelle reste courte. WEPPY affiche des détails uniquement lorsqu’une erreur est trouvée ou que la vérification ne peut pas être terminée. Les Scripts volumineux peuvent prendre un peu plus de temps.","controls.luauValidation.help.nonBlocking":"Si WEPPY détecte une erreur de syntaxe ou ne peut pas terminer la vérification, la modification enregistrée du Script n’est pas annulée. Le résultat aide l’IA à corriger immédiatement le même Script.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Plusieurs fenêtres Studio connectées ont le même Place ID. Utilisez le Studio ID pour désigner cet endroit.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Les requêtes avec Studio ID, Connection ID ou Place ID ignorent cette priorité et sont envoyées au Studio indiqué.","controls.studioRouting.state.currentTarget":"Cible prioritaire actuelle","controls.studioRouting.noPriorityTarget":"Aucun Studio connecté","controls.studioRouting.help.auto":"Automatique utilise le Studio actif le plus prioritaire selon les commandes récentes et l’ordre de connexion.","controls.studioRouting.help.pinned":"Studio fixe utilise le Studio sélectionné lorsque la requête n’indique aucun identifiant de cible.","sync.migration.title":"Mise à jour du format Sync disponible","sync.migration.description":"Vérifiez les changements de métadonnées avant de faire passer ce Place du format Sync v2 au v3.","sync.migration.status.ready":"Prêt à vérifier","sync.migration.status.blocked":"Bloqué","sync.migration.preview":"Vérifier les changements","sync.migration.summary.add":"Ajouter","sync.migration.summary.modify":"Modifier","sync.migration.summary.delete":"Supprimer","sync.migration.summary.blocked":"Bloqué","sync.migration.changes":"Changements de métadonnées","sync.migration.blockers":"Éléments à résoudre","sync.migration.operation.add":"ajouter","sync.migration.operation.modify":"modifier","sync.migration.operation.delete":"supprimer","sync.migration.reason.serializer_regeneration":"Réécrit les métadonnées dans le format canonique v3.","sync.migration.reason.volatile_metadata_removal":"Supprime les métadonnées Sync temporaires.","sync.migration.reason.redundant_empty_metadata":"Supprime les métadonnées vides redondantes.","sync.migration.reason.runtime_ignore_policy":"Met à jour la règle d’exclusion du runtime gérée.","sync.migration.reason.reverse_pending":"Appliquez ou abandonnez d’abord les changements locaux en attente vers Studio.","sync.migration.reason.conflict":"Résolvez d’abord le conflit entre les fichiers locaux et Studio.","sync.migration.reason.local_canonical_change":"Vérifiez d’abord les métadonnées canoniques modifiées localement.","sync.migration.reason.source_mutation_detected":"Un fichier source utilisateur a changé pendant la validation.","sync.migration.blocked":"Résolvez les conflits Sync avant la mise à jour","sync.migration.stale":"L’aperçu a changé. Vérifiez la différence la plus récente.","sync.migration.error":"Impossible de mettre à jour le format Sync. Réessayez.","sync.migration.refresh":"Actualiser l’aperçu","sync.migration.refreshing":"Actualisation…","sync.migration.applying":"Application…","sync.migration.apply":"Appliquer la mise à jour","sync.migration.confirm.title":"Appliquer la mise à jour du format Sync ?","sync.migration.confirm.message":"Les métadonnées Sync indiquées seront sauvegardées puis mises à jour. Vos fichiers source Luau ne seront pas modifiés.","changelog.ownership.showGenerated":"Afficher les métadonnées générées","changelog.ownership.userSource":"Source utilisateur","changelog.ownership.canonicalMirror":"Métadonnées du miroir","changelog.ownership.generated":"Généré"},Xy=["en","ko","es","pt-br","ja","id","de","fr-fr"],Ea="auto",Il={en:By,ko:Wy,es:Fy,"pt-br":Ky,ja:Vy,id:Yy,de:Gy,"fr-fr":$y},An="dashboard-locale";function Ol(i){return Xy.includes(i)}function Qy(){const n=((typeof navigator<"u"?navigator.language:"en")??"en").toLowerCase();return n==="ko"||n.startsWith("ko-")?"ko":n==="pt-br"?"pt-br":n==="ja"||n.startsWith("ja-")?"ja":n==="es"||n.startsWith("es-")?"es":n==="id"||n.startsWith("id-")?"id":n==="de"||n.startsWith("de-")?"de":n==="fr"||n.startsWith("fr-")?"fr-fr":"en"}function ep(){if(typeof localStorage<"u"){const i=localStorage.getItem(An);if(i===Ea)return Ea;if(i&&Ol(i))return i}return Ea}function tp(i){return i===Ea?Qy():i}const Up=R.createContext(null);function Zy({children:i}){const[n,r]=R.useState(ep),[d,u]=R.useState(()=>tp(ep())),p=R.useCallback((y,h)=>{const v=Il[d]??Il.en??{};if(y in v)return v[y];const w=Il.en;return w&&y in w?w[y]:h!==void 0?h:y},[d]),g=R.useCallback(y=>{typeof localStorage<"u"&&(y===Ea?localStorage.removeItem(An):Ol(y)?localStorage.setItem(An,y):localStorage.setItem(An,"en"));const h=y===Ea?Ea:Ol(y)?y:"en";r(h),u(tp(h))},[]);return R.createElement(Up.Provider,{value:{locale:d,selectedLocale:n,t:p,setLocale:g}},i)}function Lo(){const i=R.useContext(Up);if(!i)throw new Error("useLocale must be used within a LocaleProvider");return i}const Jy="_container_6jg7e_2",ef="_toast_6jg7e_14",tf="_slideIn_6jg7e_1",of="_success_6jg7e_39",af="_info_6jg7e_44",sf="_warning_6jg7e_49",nf="_error_6jg7e_54",Dl={container:Jy,toast:ef,slideIn:tf,success:of,info:af,warning:sf,error:nf},Hp=R.createContext(null),rf=3e3;function lf({children:i}){const[n,r]=R.useState([]),d=R.useRef(0),u=R.useCallback((p,g="info")=>{const y=d.current++;r(h=>[...h,{id:y,message:p,type:g}]),setTimeout(()=>{r(h=>h.filter(v=>v.id!==y))},rf)},[]);return x.jsxs(Hp.Provider,{value:{show:u},children:[i,x.jsx("div",{className:Dl.container,children:n.map(p=>x.jsx("div",{className:`${Dl.toast} ${Dl[p.type]}`,children:p.message},p.id))})]})}function df(){const i=R.useContext(Hp);return i||{show:()=>{}}}function uf(){const{level:i}=Nn(),{show:n}=df(),{t:r}=Lo(),d=R.useRef(null);return R.useEffect(()=>{const u=d.current;d.current=i,u!==null&&u!==i&&(u==="disconnected"&&i==="serverOnly"?n(r("toast.serverConnected","MCP 서버 연결됨"),"success"):u==="serverOnly"&&i==="studioConnected"?n(r("toast.pluginConnected","플러그인 연결됨"),"success"):(u==="serverOnly"||u==="studioConnected")&&i==="disconnected"?n(r("toast.serverDisconnected","MCP 서버 연결 끊김"),"error"):u==="studioConnected"&&i==="serverOnly"&&n(r("toast.pluginDisconnected","플러그인 연결 끊김"),"warning"))},[i,n,r]),null}const cf="_wrapper_6ij3d_2",pf="_tooltip_6ij3d_11",gf="_tooltipVisible_6ij3d_33",jl={wrapper:cf,tooltip:pf,tooltipVisible:gf},li=8,xn=6;function Ft({text:i,disabled:n=!1,children:r}){const d=R.useRef(null),u=R.useRef(null),[p,g]=R.useState(!1),[y,h]=R.useState("top"),[v,w]=R.useState("center"),[P,D]=R.useState(null),L=i.trim(),B=R.useCallback(()=>{const W=d.current,oe=u.current;if(!W||!oe)return;const V=W.getBoundingClientRect(),pe=oe.getBoundingClientRect(),De=window.innerWidth,j=window.innerHeight;let X="top";V.top-pe.height-xn<li&&V.bottom+pe.height+xn<=j-li&&(X="bottom");let Se="center";const ce=V.left+V.width/2,Te=pe.width/2;ce-Te<li?Se="left":ce+Te>De-li&&(Se="right");const Ce=X==="top"?V.top-pe.height-xn:V.bottom+xn;let ke;Se==="left"?ke=V.left:Se==="right"?ke=V.right-pe.width:ke=ce-Te,ke=Math.max(li,Math.min(ke,De-pe.width-li)),h(X),w(Se),D({top:Ce,left:ke})},[]);if(R.useLayoutEffect(()=>{p&&B()},[p,B]),R.useEffect(()=>{if(!p)return;const W=()=>B();return window.addEventListener("scroll",W,!0),window.addEventListener("resize",W),()=>{window.removeEventListener("scroll",W,!0),window.removeEventListener("resize",W)}},[p,B]),R.useEffect(()=>{n&&g(!1)},[n]),!L)return x.jsx(x.Fragment,{children:r});const U=()=>{n||g(!0)},_=()=>g(!1),le=x.jsx("span",{ref:u,className:[jl.tooltip,p?jl.tooltipVisible:""].filter(Boolean).join(" "),"data-placement":v,"data-vertical":y,style:P?{top:P.top,left:P.left}:{top:-9999,left:-9999,visibility:"hidden"},children:L});return x.jsxs(x.Fragment,{children:[x.jsx("span",{ref:d,className:jl.wrapper,"data-tooltip-text":L,onMouseEnter:U,onMouseLeave:_,onFocus:U,onBlur:_,children:r}),!n&&typeof document<"u"?Ln.createPortal(le,document.body):null]})}function hf(i){return i==="auto"||i==="polar"||i==="gumroad"?i:void 0}function mf(i){if(!i||typeof i!="object")return!1;const n=i.status;return(i.tier==="basic"||i.tier==="pro")&&(n==="active"||n==="grace"||n==="invalid"||n==="revoked"||n==="unlicensed"||n==="unknown")}function Mp(i){return i&&typeof i=="object"&&"data"in i&&i.data?i.data:i}function Np(i){if(!i||typeof i!="object")return null;if(mf(i))return i;const n=i;if(typeof n.canUsePro!="boolean"||typeof n.status!="string"||n.status!=="active"&&n.status!=="grace"&&n.status!=="invalid"&&n.status!=="revoked"&&n.status!=="unlicensed"&&n.status!=="unknown")return null;const r=hf(n.provider);return{tier:n.canUsePro?"pro":"basic",status:n.status,...typeof n.statusDetail=="string"?{statusDetail:n.statusDetail}:{},...typeof n.maskedKey=="string"?{maskedKey:n.maskedKey}:{},...r?{provider:r}:{},refreshRequired:n.refreshRequired===!0,...typeof n.refreshBlockedReason=="string"?{refreshBlockedReason:n.refreshBlockedReason}:{}}}async function _p(i="auto"){const n=await jt.get("/api/dashboard/license/status",{provider:i});return Np(Mp(n))}function Zl(i){const n=Mp(i),r=n,d=Np(n),u=typeof(r==null?void 0:r.reasonCode)=="string"?r.reasonCode:void 0;return{ok:(r==null?void 0:r.ok)===!0,license:d?{...d,refreshRequired:d.refreshRequired||u==="missing_session_token",refreshBlockedReason:d.refreshBlockedReason??(u==="missing_session_token"?"missing_session_token":void 0)}:null,message:typeof(r==null?void 0:r.message)=="string"?r.message:null,reasonCode:u,recoverable:(r==null?void 0:r.recoverable)===!0}}async function zb(i){const n=i.provider??"auto",r=await jt.post("/api/dashboard/license/activate",{provider:n,licenseKey:i.licenseKey,clientType:"dashboard"});return Zl(r)}async function Ub(i={}){const n=i.provider??"auto",r=await jt.post("/api/dashboard/license/refresh",{provider:n,clientType:"dashboard"});return Zl(r)}async function Hb(i={}){const n=i.provider??"auto",r=await jt.post("/api/dashboard/license/reset",{provider:n,clientType:"dashboard"});return Zl(r)}/**
150
150
  * @license lucide-react v1.8.0 - ISC
151
151
  *
152
152
  * This source code is licensed under the ISC license.
@@ -176,7 +176,7 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
176
176
  *
177
177
  * This source code is licensed under the ISC license.
178
178
  * See the LICENSE file in the root directory of this source tree.
179
- */const Sf=i=>{for(const n in i)if(n.startsWith("aria-")||n==="role"||n==="title")return!0;return!1},vf=R.createContext({}),bf=()=>R.useContext(vf),Pf=R.forwardRef(({color:i,size:n,strokeWidth:r,absoluteStrokeWidth:d,className:u="",children:p,iconNode:g,...y},h)=>{const{size:v=24,strokeWidth:C=2,absoluteStrokeWidth:P=!1,color:D="currentColor",className:L=""}=bf()??{},B=d??P?Number(r??C)*24/Number(n??v):r??C;return R.createElement("svg",{ref:h,...El,width:n??v??El.width,height:n??v??El.height,stroke:i??D,strokeWidth:B,className:Op("lucide",L,u),...!p&&!Sf(y)&&{"aria-hidden":"true"},...y},[...g.map(([U,N])=>R.createElement(U,N)),...Array.isArray(p)?p:[p]])});/**
179
+ */const Sf=i=>{for(const n in i)if(n.startsWith("aria-")||n==="role"||n==="title")return!0;return!1},vf=R.createContext({}),bf=()=>R.useContext(vf),Pf=R.forwardRef(({color:i,size:n,strokeWidth:r,absoluteStrokeWidth:d,className:u="",children:p,iconNode:g,...y},h)=>{const{size:v=24,strokeWidth:w=2,absoluteStrokeWidth:P=!1,color:D="currentColor",className:L=""}=bf()??{},B=d??P?Number(r??w)*24/Number(n??v):r??w;return R.createElement("svg",{ref:h,...El,width:n??v??El.width,height:n??v??El.height,stroke:i??D,strokeWidth:B,className:Op("lucide",L,u),...!p&&!Sf(y)&&{"aria-hidden":"true"},...y},[...g.map(([U,_])=>R.createElement(U,_)),...Array.isArray(p)?p:[p]])});/**
180
180
  * @license lucide-react v1.8.0 - ISC
181
181
  *
182
182
  * This source code is licensed under the ISC license.
@@ -186,7 +186,7 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
186
186
  *
187
187
  * This source code is licensed under the ISC license.
188
188
  * See the LICENSE file in the root directory of this source tree.
189
- */const Cf=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]],wf=Ke("bell",Cf);/**
189
+ */const wf=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]],Cf=Ke("bell",wf);/**
190
190
  * @license lucide-react v1.8.0 - ISC
191
191
  *
192
192
  * This source code is licensed under the ISC license.
@@ -226,12 +226,12 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
226
226
  *
227
227
  * This source code is licensed under the ISC license.
228
228
  * See the LICENSE file in the root directory of this source tree.
229
- */const Mf=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]],Hf=Ke("folder",Mf);/**
229
+ */const Hf=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]],Mf=Ke("folder",Hf);/**
230
230
  * @license lucide-react v1.8.0 - ISC
231
231
  *
232
232
  * This source code is licensed under the ISC license.
233
233
  * See the LICENSE file in the root directory of this source tree.
234
- */const _f=[["line",{x1:"6",x2:"10",y1:"11",y2:"11",key:"1gktln"}],["line",{x1:"8",x2:"8",y1:"9",y2:"13",key:"qnk9ow"}],["line",{x1:"15",x2:"15.01",y1:"12",y2:"12",key:"krot7o"}],["line",{x1:"18",x2:"18.01",y1:"10",y2:"10",key:"1lcuu1"}],["path",{d:"M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z",key:"mfqc10"}]],Nf=Ke("gamepad-2",_f);/**
234
+ */const Nf=[["line",{x1:"6",x2:"10",y1:"11",y2:"11",key:"1gktln"}],["line",{x1:"8",x2:"8",y1:"9",y2:"13",key:"qnk9ow"}],["line",{x1:"15",x2:"15.01",y1:"12",y2:"12",key:"krot7o"}],["line",{x1:"18",x2:"18.01",y1:"10",y2:"10",key:"1lcuu1"}],["path",{d:"M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z",key:"mfqc10"}]],_f=Ke("gamepad-2",Nf);/**
235
235
  * @license lucide-react v1.8.0 - ISC
236
236
  *
237
237
  * This source code is licensed under the ISC license.
@@ -261,7 +261,7 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
261
261
  *
262
262
  * This source code is licensed under the ISC license.
263
263
  * See the LICENSE file in the root directory of this source tree.
264
- */const Xf=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],$f=Ke("loader-circle",Xf);/**
264
+ */const $f=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],Xf=Ke("loader-circle",$f);/**
265
265
  * @license lucide-react v1.8.0 - ISC
266
266
  *
267
267
  * This source code is licensed under the ISC license.
@@ -311,7 +311,55 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
311
311
  *
312
312
  * This source code is licensed under the ISC license.
313
313
  * See the LICENSE file in the root directory of this source tree.
314
- */const pS=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],gS=Ke("x",pS),Fp=[{labelKey:"sidebar.overview",route:"/",icon:Vf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./OverviewPage-BRwPqjqA.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]))},{labelKey:"sidebar.connection",route:"/connection",icon:iS,minLevel:"disconnected",lazy:()=>Kt(()=>import("./ConnectionPage-oMLfhLWb.js"),__vite__mapDeps([13,1,2,3,4,5,6,7,8,14,15,16,11,17,18]))},{labelKey:"sidebar.sync",route:"/sync",icon:Bp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./SyncPage-pGT5Kghx.js"),__vite__mapDeps([19,2,3,4,5,1,8,14,15,16,20,21,6,7,22]))},{labelKey:"sidebar.assets",route:"/assets",icon:oS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./AssetsPage-CV9wxK10.js"),__vite__mapDeps([23,14,15,16,2,3,4,5,8,17,24]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:qf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ChangelogPage-DKIsatBF.js"),__vite__mapDeps([25,2,3,4,5,14,15,16,20,21,8,26,27,28]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:Nf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./PlaytestPage-C00WHKjP.js"),__vite__mapDeps([29,2,3,4,5,1,20,21,8,14,15,16,30]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Wf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./UiStudioPage-Dtp8HLCl.js"),__vite__mapDeps([31,1,8,3,4,32,33,26,27,2,5,20,21,34]))},{labelKey:"sidebar.tools",route:"/tools",icon:cS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ToolsPage-B31Hx606.js"),__vite__mapDeps([35,2,3,4,5,8,14,15,16,20,21,26,27,36]))}],ql=[{labelKey:"sidebar.controls",route:"/controls",icon:Wp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ControlsPage-Y8OiNJre.js"),__vite__mapDeps([37,2,3,4,5,1,15,16,8,38,39,17]))},{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:wf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./WhatsNewPage-BGcnIkzC.js"),__vite__mapDeps([40,2,3,4,5,41]))}],Tl="https://github.com/hope1026/weppy-roblox-mcp",hS="https://weppyai.com";function Bl(i){return i?/Mac OS X|Macintosh/i.test(i)?"macOS":/Windows NT/i.test(i)?"Windows":/Linux/i.test(i)?"Linux":"":""}function Kp(i){var v,C,P,D,L;const n=Bl(typeof navigator<"u"?navigator.userAgent:""),r=i.status,d=(r==null?void 0:r.version)??"",u=((C=(v=r==null?void 0:r.pluginClients)==null?void 0:v[0])==null?void 0:C.pluginVersion)??"",p=((D=(P=r==null?void 0:r.pluginClients)==null?void 0:P[0])==null?void 0:D.studioVersion)??"",g=d||u||p?[d?`MCP ${d}`:"",u?`Plugin ${u}`:"",p?`Studio ${p}`:""].filter(Boolean).join(" / "):"",y=((L=r==null?void 0:r.aiClientNames)==null?void 0:L[0])??"",h=(r==null?void 0:r.nodeVersion)??"";return{os:n,nodeVersion:h,aiClient:y,pluginVersionLabel:g}}function mS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","bug_report.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}function yS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","install_help.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}const fS=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:Af,buildUrl:i=>`${Tl}/issues/new?${mS(i)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:Gf,buildUrl:()=>`${Tl}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:Zf,buildUrl:i=>`${Tl}/issues/new?${yS(i)}`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:xf,buildUrl:i=>`${hS}/${i.locale}/docs/troubleshooting/`}];function SS(){const[i,n]=R.useState("basic"),[r,d]=R.useState(0),[u,p]=R.useState(0),[g,y]=R.useState(0),[h,v]=R.useState(!0);R.useEffect(()=>{let P=!1;async function D(){try{return await Np("auto")}catch{return null}}async function L(){var N,le;try{const[W,oe]=await Promise.all([D(),jt.get("/api/dashboard/tool-stats").catch(()=>null)]);if(P)return;if(W!=null&&W.tier&&n(W.tier),oe!=null&&oe.tierSummary){const V=((N=oe.tierSummary.basic)==null?void 0:N.totalCalls)??0,pe=((le=oe.tierSummary.pro)==null?void 0:le.totalCalls)??0;y(V),p(pe),d(V+pe)}}catch{}finally{P||v(!1)}}L();const B=new Ql;B.connect();const U=B.on("license",()=>{D().then(N=>{!P&&(N!=null&&N.tier)&&n(N.tier)})});return()=>{P=!0,U(),B.disconnect()}},[]);const C=r>0?u/r*100:0;return{tier:i,proUsagePercent:C,totalCalls:r,proCalls:u,basicCalls:g,loading:h}}const vS="https://weppyai.com/plans/";function Ra(i){const n=new URLSearchParams({utm_source:"weppy_dashboard",utm_medium:"app",utm_campaign:"pro_upgrade",utm_content:i});return`${vS}?${n.toString()}`}const bS={sidebarUpgrade:Ra("sidebar_upgrade"),settingsLicense:Ra("settings_license"),sync:Ra("sync_tier_panel"),changelog:Ra("changelog_limit_notice"),playtest:Ra("playtest_sample_banner"),uiStudioAnalysis:Ra("ui_studio_analysis_banner"),uiStudioHistory:Ra("ui_studio_history_banner")},PS=5e3,CS=5;function wS(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function kS(i,n){const r=new URLSearchParams(n);if(i==="ui-studio")return r.get("tab")==="history"?"ui_studio_history":"ui_studio_analysis";if(i==="tools")return"tools_history";if(i==="changelog")return"changelog_all"}function ds(i,n){const r=wS(i);if(n===void 0)return r;const d=kS(r,n);return d?{page:r,tab:d}:{page:r}}let ci=[],np=null;function Vp(){if(ci.length===0)return;const i=ci.splice(0),n=`${Hn}/api/dashboard/analytics`,r=JSON.stringify({events:i});fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r}).catch(()=>{})}function xS(){np||(np=setInterval(Vp,PS))}function rp(i){ci.push(i),xS(),ci.length>=CS&&Vp()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(ci.length===0)return;const i=`${Hn}/api/dashboard/analytics`,n=JSON.stringify({events:ci.splice(0)});navigator.sendBeacon(i,new Blob([n],{type:"application/json"}))});function us(){const i=R.useCallback((r,d)=>{rp({name:r,params:d})},[]),n=R.useCallback(r=>{rp({name:"dashboard_page_view",params:{...typeof r=="string"?{page:r}:r}})},[]);return{trackEvent:i,trackPageView:n}}const RS="_widget_1q1ab_1",AS="_header_1q1ab_12",IS="_sparkle_1q1ab_18",DS="_title_1q1ab_23",jS="_actions_1q1ab_31",ES="_cta_1q1ab_37",TS="_licenseCta_1q1ab_38",LS="_collapsedGroup_1q1ab_70",zS="_collapsed_1q1ab_70",US="_collapsedSecondary_1q1ab_91",oo={widget:RS,header:AS,sparkle:IS,title:DS,actions:jS,cta:ES,licenseCta:TS,collapsedGroup:LS,collapsed:zS,collapsedSecondary:US};function MS({collapsed:i=!1}){const{tier:n}=SS(),{t:r}=Lo(),{trackEvent:d}=us(),{pathname:u,search:p}=Vt();if(n==="pro")return null;const g=bS.sidebarUpgrade,y="/settings?section=license",h=ds(u,p),v=()=>{d("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",...h})},C=()=>{d("dashboard_click_event",{click_target:"license_shortcut",placement:"sidebar_license",...h})};return i?x.jsxs("div",{className:oo.collapsedGroup,children:[x.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.collapsed,title:r("upgrade.title","View Pro"),"aria-label":r("upgrade.title","View Pro"),onClick:v,children:x.jsx(sp,{size:18,strokeWidth:1.75})}),x.jsx(ja,{to:y,className:`${oo.collapsed} ${oo.collapsedSecondary}`,title:r("upgrade.licenseShortcut","Enter License"),"aria-label":r("upgrade.licenseShortcut","Enter License"),onClick:C,children:x.jsx(ip,{size:18,strokeWidth:1.75})})]}):x.jsxs("div",{className:oo.widget,children:[x.jsxs("div",{className:oo.header,children:[x.jsx(sp,{size:16,strokeWidth:1.75,className:oo.sparkle}),x.jsx("span",{className:oo.title,children:r("upgrade.tagline","Check Pro features")})]}),x.jsxs("div",{className:oo.actions,children:[x.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.cta,onClick:v,children:[r("upgrade.cta","View Pro")," →"]}),x.jsxs(ja,{to:y,className:oo.licenseCta,onClick:C,children:[x.jsx(ip,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"}),x.jsx("span",{children:r("upgrade.licenseShortcut","Enter License")})]})]})]})}const HS="_backdrop_1r5ey_1",_S="_dialog_1r5ey_11",NS="_header_1r5ey_21",OS="_titleBlock_1r5ey_30",qS="_title_1r5ey_30",BS="_subtitle_1r5ey_42",WS="_closeButton_1r5ey_49",FS="_body_1r5ey_67",KS="_statusBox_1r5ey_73",VS="_errorBox_1r5ey_74",YS="_spin_1r5ey_92",GS="_bundleBlock_1r5ey_102",XS="_label_1r5ey_107",$S="_bundleName_1r5ey_115",QS="_guidanceBox_1r5ey_127",ZS="_includedList_1r5ey_143",JS="_includedItem_1r5ey_152",ev="_actions_1r5ey_163",tv="_button_1r5ey_169",ov="_primaryLink_1r5ey_170",av="_hint_1r5ey_206",We={backdrop:HS,dialog:_S,header:NS,titleBlock:OS,title:qS,subtitle:BS,closeButton:WS,body:FS,statusBox:KS,errorBox:VS,spin:YS,bundleBlock:GS,label:XS,bundleName:$S,guidanceBox:QS,includedList:ZS,includedItem:JS,actions:ev,button:tv,primaryLink:ov,hint:av};function Ll(){return typeof navigator<"u"?navigator.userAgent:""}function iv(i){window.open(i,"_blank","noopener,noreferrer")}function sv({open:i,fallbackHref:n,onClose:r}){const{locale:d,t:u}=Lo(),p=R.useId(),[g,y]=R.useState(!1),[h,v]=R.useState(null),[C,P]=R.useState(null),[D,L]=R.useState("idle");if(R.useEffect(()=>{if(!i)return;let V=!1;const pe=Ll();return y(!0),v(null),P(null),L("idle"),jt.post("/api/dashboard/support/bug-report",{os:Bl(pe),userAgent:pe,locale:d}).then(De=>{V||(v(De),y(!1))}).catch(()=>{V||(P(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1))}),()=>{V=!0}},[i,d]),R.useEffect(()=>{if(!i||g)return;function V(pe){pe.key==="Escape"&&r()}return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[i,g,r]),!i)return null;async function B(){if(h)try{L("opening"),await jt.post("/api/dashboard/support/bug-report/reveal",{bundleName:h.bundleName}),L("opened")}catch{L("failed")}}const U=h!==null,N=(h==null?void 0:h.issueUrl)??n,le=(h==null?void 0:h.includedFiles)??[],W=D==="opening"?u("bugReportDialog.reveal.opening","Opening..."):D==="opened"?u("bugReportDialog.reveal.opened","Opened location"):u("bugReportDialog.reveal","Reveal in Finder"),oe=x.jsx("div",{className:We.backdrop,onClick:g?void 0:r,children:x.jsxs("section",{className:We.dialog,role:"dialog","aria-modal":"true","aria-labelledby":p,onClick:V=>V.stopPropagation(),children:[x.jsxs("div",{className:We.header,children:[x.jsxs("div",{className:We.titleBlock,children:[x.jsx("h2",{id:p,className:We.title,children:u("bugReportDialog.title","diagnostics.zip can help us investigate")}),x.jsx("p",{className:We.subtitle,children:u("bugReportDialog.subtitle","WEPPY created a diagnostics zip on your computer. It includes Studio, plugin, Sync, and tool logs that can help us understand what happened.")})]}),x.jsx("button",{type:"button",className:We.closeButton,"aria-label":u("bugReportDialog.close","Close"),onClick:r,disabled:g,children:x.jsx(gS,{size:16,strokeWidth:1.75,"aria-hidden":"true"})})]}),x.jsxs("div",{className:We.body,children:[g&&x.jsxs("div",{className:We.statusBox,role:"status",children:[x.jsx($f,{className:We.spin,size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.loading","Preparing diagnostics.zip...")})]}),C&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(zf,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:C})]}),U&&x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:We.guidanceBox,children:[x.jsx("p",{children:u("bugReportDialog.optional","You can submit the bug report without this file, but attaching it usually helps us find the cause faster.")}),x.jsx("p",{children:u("bugReportDialog.attachHow","To attach it, download or reveal the zip, then add it to the Diagnostics ZIP (optional) upload field on GitHub before you submit.")})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.bundle","Bundle")}),x.jsx("code",{className:We.bundleName,children:h.bundleName})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.included","Included")}),x.jsx("ul",{className:We.includedList,children:le.length>0?le.map(V=>x.jsx("li",{className:We.includedItem,children:V.label},`${V.label}:${V.archivePath??V.path}`)):x.jsx("li",{className:We.includedItem,children:u("bugReportDialog.included.none","No log files found")})})]}),D==="failed"&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(ap,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.reveal.failed","Could not open the file location.")})]})]}),x.jsxs("div",{className:We.actions,children:[U&&x.jsxs(x.Fragment,{children:[x.jsxs("a",{className:We.primaryLink,href:h.downloadUrl,download:h.bundleName,children:[x.jsx(Ef,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.download","1. Download diagnostics.zip")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>void B(),disabled:D==="opening",children:[x.jsx(ap,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),W]})]}),C&&!U&&x.jsxs("button",{type:"button",className:We.button,onClick:()=>{P(null),y(!0),jt.post("/api/dashboard/support/bug-report",{os:Bl(Ll()),userAgent:Ll(),locale:d}).then(V=>{v(V),y(!1)}).catch(()=>{P(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1)})},children:[x.jsx(Bp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.retry","Try again")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>iv(N),disabled:g,children:[x.jsx(qp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),U?u("bugReportDialog.openGithub","2. Open GitHub issue"):u("bugReportDialog.openGithubFallback","Open GitHub without diagnostics")]})]}),x.jsx("p",{className:We.hint,children:u("bugReportDialog.hint","The zip can contain local logs and project context. Review it before attaching if you want to share it.")})]})]})});return typeof document>"u"?oe:Ln.createPortal(oe,document.body)}const nv="_sidebar_19hyu_2",rv="_brand_19hyu_17",lv="_brandIcon_19hyu_28",dv="_brandText_19hyu_33",uv="_brandTextPro_19hyu_44",cv="_nav_19hyu_50",pv="_spacer_19hyu_57",gv="_navLink_19hyu_63",hv="_active_19hyu_84",mv="_disabled_19hyu_91",yv="_icon_19hyu_102",fv="_label_19hyu_113",Sv="_secondaryDivider_19hyu_120",vv="_secondaryNav_19hyu_127",bv="_secondaryNavEntry_19hyu_134",Pv="_secondaryItemDivider_19hyu_140",Cv="_helpDivider_19hyu_147",wv="_helpGroupTitle_19hyu_154",kv="_helpNav_19hyu_165",xv="_externalIcon_19hyu_172",Je={sidebar:nv,brand:rv,brandIcon:lv,brandText:dv,brandTextPro:uv,nav:cv,spacer:pv,navLink:gv,active:hv,disabled:mv,icon:yv,label:fv,secondaryDivider:Sv,secondaryNav:vv,secondaryNavEntry:bv,secondaryItemDivider:Pv,helpDivider:Cv,helpGroupTitle:wv,helpNav:kv,externalIcon:xv},Rv={bug:"sidebar_help_bug",feature:"sidebar_help_feature",discussions:"sidebar_help_community",troubleshooting:"sidebar_help_troubleshooting"};function Av(){const[i,n]=R.useState(!1);return R.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const r=window.matchMedia("(max-width: 768px)"),d=()=>n(r.matches);return d(),r.addEventListener("change",d),()=>r.removeEventListener("change",d)},[]),i}const lp={disconnected:0,serverOnly:1,studioConnected:2};function Iv(i,n){return lp[i]>=lp[n]}function Dv(i,n){return i==="serverOnly"?n("sidebar.gate.l1","MCP server connection required"):i==="studioConnected"?n("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function dp({item:i}){const{level:n}=_n(),{t:r}=Lo(),d=Iv(n,i.minLevel),u=i.icon,p=x.jsxs(Iy,{to:i.route,end:i.route==="/",className:({isActive:g})=>[Je.navLink,g?Je.active:"",d?"":Je.disabled].filter(Boolean).join(" "),onClick:g=>{d||g.preventDefault()},children:[x.jsx("span",{className:Je.icon,children:x.jsx(u,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)})]});return d?p:x.jsx(Ft,{text:Dv(i.minLevel,r),children:p})}function jv({item:i,ctx:n}){const{t:r}=Lo(),{trackEvent:d}=us(),{pathname:u,search:p}=Vt(),g=i.icon,y=i.buildUrl(n),h=r(i.tooltipKey,""),v=ds(u,p),[C,P]=R.useState(!1),D=x.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:Je.navLink,"data-testid":`sidebar-help-${i.id}`,onClick:B=>{d("dashboard_click_event",{click_target:Rv[i.id],placement:"sidebar_help",...v}),i.id==="bug"&&(B.preventDefault(),P(!0))},children:[x.jsx("span",{className:Je.icon,children:x.jsx(g,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)}),x.jsx("span",{className:Je.externalIcon,"aria-hidden":"true",children:x.jsx(qp,{size:12,strokeWidth:1.75})})]}),L=h?x.jsx(Ft,{text:h,children:D}):D;return x.jsxs(x.Fragment,{children:[L,i.id==="bug"&&x.jsx(sv,{open:C,fallbackHref:y,onClose:()=>P(!1)})]})}function Ev(){const[i,n]=R.useState("basic"),r=Av(),{status:d}=_n(),{locale:u,t:p}=Lo(),g={locale:u,status:d};return R.useEffect(()=>{let y=!1;async function h(){try{const P=await Np("auto");!y&&(P!=null&&P.tier)&&n(P.tier)}catch{y||n("basic")}}h();const v=new Ql;v.connect();const C=v.on("license",()=>{h()});return()=>{y=!0,C(),v.disconnect()}},[]),x.jsxs("aside",{className:Je.sidebar,children:[x.jsxs("div",{className:Je.brand,children:[x.jsx("span",{className:Je.brandIcon,children:x.jsx(Df,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{"data-testid":"sidebar-brand-text",className:[Je.brandText,i==="pro"?Je.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),x.jsx("nav",{className:Je.nav,children:Fp.map(y=>x.jsx(dp,{item:y},y.route))}),x.jsx("div",{className:Je.secondaryDivider}),x.jsx("nav",{className:Je.secondaryNav,children:ql.map((y,h)=>x.jsxs("div",{className:Je.secondaryNavEntry,children:[x.jsx(dp,{item:y}),h<ql.length-1?x.jsx("div",{className:Je.secondaryItemDivider,"data-testid":"sidebar-controls-whats-new-divider","aria-hidden":"true"}):null]},y.route))}),x.jsx("div",{className:Je.helpDivider,"aria-hidden":"true"}),x.jsx("div",{className:Je.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),x.jsx("nav",{className:Je.helpNav,"aria-label":p("sidebar.help.group"),children:fS.map(y=>x.jsx(jv,{item:y,ctx:g},y.id))}),x.jsx("div",{className:Je.spacer}),x.jsx(MS,{collapsed:r})]})}async function Tv(){return jt.get("/api/dashboard/place-summary")}async function Lv(){return jt.get("/api/dashboard/sync-root")}async function Hb(){return jt.post("/api/dashboard/sync-root/pick")}async function _b(i){return jt.patch("/api/dashboard/sync-root",{projectRoot:i})}const zv=[{id:"2026-07-30-luau-syntax-validation",date:"2026-07-30",title:{en:"Catch Luau syntax errors before Playtest",ko:"Playtest 전에 Luau 문법 오류를 확인하세요",es:"Detecta errores de sintaxis Luau antes de Playtest","pt-br":"Encontre erros de sintaxe Luau antes do Playtest",ja:"Playtestの前にLuauの構文エラーを確認できます",id:"Temukan error sintaks Luau sebelum Playtest",de:"Luau-Syntaxfehler vor dem Playtest erkennen","fr-fr":"Détectez les erreurs de syntaxe Luau avant le Playtest"},body:{en:`Luau syntax validation is available for script work. It is Off by default. Turn it on under Controls > Luau Syntax Validation to check the source that was actually saved after supported script writes, without starting Playtest.
314
+ */const pS=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],gS=Ke("x",pS),Fp=[{labelKey:"sidebar.overview",route:"/",icon:Vf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./OverviewPage-CN7-ORIn.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]))},{labelKey:"sidebar.connection",route:"/connection",icon:iS,minLevel:"disconnected",lazy:()=>Kt(()=>import("./ConnectionPage-BRMJY695.js"),__vite__mapDeps([13,1,2,3,4,5,6,7,8,14,15,16,11,17,18]))},{labelKey:"sidebar.sync",route:"/sync",icon:Bp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./SyncPage-BPoKRe2z.js"),__vite__mapDeps([19,2,3,4,5,1,8,14,15,16,20,21,6,7,22]))},{labelKey:"sidebar.assets",route:"/assets",icon:oS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./AssetsPage-D2V0I3vJ.js"),__vite__mapDeps([23,14,15,16,2,3,4,5,8,17,24]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:qf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ChangelogPage-3W6oNyob.js"),__vite__mapDeps([25,2,3,4,5,14,15,16,20,21,8,26,27,28]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:_f,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./PlaytestPage-BkXd5qVL.js"),__vite__mapDeps([29,2,3,4,5,1,20,21,8,14,15,16,30]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Wf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./UiStudioPage-BJDqOz5h.js"),__vite__mapDeps([31,1,8,3,4,32,33,26,27,2,5,20,21,34]))},{labelKey:"sidebar.tools",route:"/tools",icon:cS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ToolsPage-B3j9RnJM.js"),__vite__mapDeps([35,2,3,4,5,8,14,15,16,20,21,26,27,36]))}],ql=[{labelKey:"sidebar.controls",route:"/controls",icon:Wp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ControlsPage-Bsvd6IMH.js"),__vite__mapDeps([37,2,3,4,5,1,15,16,8,38,39,17]))},{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:Cf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./WhatsNewPage-CQaXn8pK.js"),__vite__mapDeps([40,2,3,4,5,41]))}],Tl="https://github.com/hope1026/weppy-roblox-mcp",hS="https://weppyai.com";function Bl(i){return i?/Mac OS X|Macintosh/i.test(i)?"macOS":/Windows NT/i.test(i)?"Windows":/Linux/i.test(i)?"Linux":"":""}function Kp(i){var v,w,P,D,L;const n=Bl(typeof navigator<"u"?navigator.userAgent:""),r=i.status,d=(r==null?void 0:r.version)??"",u=((w=(v=r==null?void 0:r.pluginClients)==null?void 0:v[0])==null?void 0:w.pluginVersion)??"",p=((D=(P=r==null?void 0:r.pluginClients)==null?void 0:P[0])==null?void 0:D.studioVersion)??"",g=d||u||p?[d?`MCP ${d}`:"",u?`Plugin ${u}`:"",p?`Studio ${p}`:""].filter(Boolean).join(" / "):"",y=((L=r==null?void 0:r.aiClientNames)==null?void 0:L[0])??"",h=(r==null?void 0:r.nodeVersion)??"";return{os:n,nodeVersion:h,aiClient:y,pluginVersionLabel:g}}function mS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","bug_report.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}function yS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","install_help.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}const fS=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:Af,buildUrl:i=>`${Tl}/issues/new?${mS(i)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:Gf,buildUrl:()=>`${Tl}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:Zf,buildUrl:i=>`${Tl}/issues/new?${yS(i)}`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:xf,buildUrl:i=>`${hS}/${i.locale}/docs/troubleshooting/`}];function SS(){const[i,n]=R.useState("basic"),[r,d]=R.useState(0),[u,p]=R.useState(0),[g,y]=R.useState(0),[h,v]=R.useState(!0);R.useEffect(()=>{let P=!1;async function D(){try{return await _p("auto")}catch{return null}}async function L(){var _,le;try{const[W,oe]=await Promise.all([D(),jt.get("/api/dashboard/tool-stats").catch(()=>null)]);if(P)return;if(W!=null&&W.tier&&n(W.tier),oe!=null&&oe.tierSummary){const V=((_=oe.tierSummary.basic)==null?void 0:_.totalCalls)??0,pe=((le=oe.tierSummary.pro)==null?void 0:le.totalCalls)??0;y(V),p(pe),d(V+pe)}}catch{}finally{P||v(!1)}}L();const B=new Ql;B.connect();const U=B.on("license",()=>{D().then(_=>{!P&&(_!=null&&_.tier)&&n(_.tier)})});return()=>{P=!0,U(),B.disconnect()}},[]);const w=r>0?u/r*100:0;return{tier:i,proUsagePercent:w,totalCalls:r,proCalls:u,basicCalls:g,loading:h}}const vS="https://weppyai.com/plans/";function Ra(i){const n=new URLSearchParams({utm_source:"weppy_dashboard",utm_medium:"app",utm_campaign:"pro_upgrade",utm_content:i});return`${vS}?${n.toString()}`}const bS={sidebarUpgrade:Ra("sidebar_upgrade"),settingsLicense:Ra("settings_license"),sync:Ra("sync_tier_panel"),changelog:Ra("changelog_limit_notice"),playtest:Ra("playtest_sample_banner"),uiStudioAnalysis:Ra("ui_studio_analysis_banner"),uiStudioHistory:Ra("ui_studio_history_banner")},PS=5e3,wS=5;function CS(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function kS(i,n){const r=new URLSearchParams(n);if(i==="ui-studio")return r.get("tab")==="history"?"ui_studio_history":"ui_studio_analysis";if(i==="tools")return"tools_history";if(i==="changelog")return"changelog_all"}function ds(i,n){const r=CS(i);if(n===void 0)return r;const d=kS(r,n);return d?{page:r,tab:d}:{page:r}}let ci=[],np=null;function Vp(){if(ci.length===0)return;const i=ci.splice(0),n=`${Mn}/api/dashboard/analytics`,r=JSON.stringify({events:i});fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r}).catch(()=>{})}function xS(){np||(np=setInterval(Vp,PS))}function rp(i){ci.push(i),xS(),ci.length>=wS&&Vp()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(ci.length===0)return;const i=`${Mn}/api/dashboard/analytics`,n=JSON.stringify({events:ci.splice(0)});navigator.sendBeacon(i,new Blob([n],{type:"application/json"}))});function us(){const i=R.useCallback((r,d)=>{rp({name:r,params:d})},[]),n=R.useCallback(r=>{rp({name:"dashboard_page_view",params:{...typeof r=="string"?{page:r}:r}})},[]);return{trackEvent:i,trackPageView:n}}const RS="_widget_1q1ab_1",AS="_header_1q1ab_12",IS="_sparkle_1q1ab_18",DS="_title_1q1ab_23",jS="_actions_1q1ab_31",ES="_cta_1q1ab_37",TS="_licenseCta_1q1ab_38",LS="_collapsedGroup_1q1ab_70",zS="_collapsed_1q1ab_70",US="_collapsedSecondary_1q1ab_91",oo={widget:RS,header:AS,sparkle:IS,title:DS,actions:jS,cta:ES,licenseCta:TS,collapsedGroup:LS,collapsed:zS,collapsedSecondary:US};function HS({collapsed:i=!1}){const{tier:n}=SS(),{t:r}=Lo(),{trackEvent:d}=us(),{pathname:u,search:p}=Vt();if(n==="pro")return null;const g=bS.sidebarUpgrade,y="/settings?section=license",h=ds(u,p),v=()=>{d("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",...h})},w=()=>{d("dashboard_click_event",{click_target:"license_shortcut",placement:"sidebar_license",...h})};return i?x.jsxs("div",{className:oo.collapsedGroup,children:[x.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.collapsed,title:r("upgrade.title","View Pro"),"aria-label":r("upgrade.title","View Pro"),onClick:v,children:x.jsx(sp,{size:18,strokeWidth:1.75})}),x.jsx(ja,{to:y,className:`${oo.collapsed} ${oo.collapsedSecondary}`,title:r("upgrade.licenseShortcut","Enter License"),"aria-label":r("upgrade.licenseShortcut","Enter License"),onClick:w,children:x.jsx(ip,{size:18,strokeWidth:1.75})})]}):x.jsxs("div",{className:oo.widget,children:[x.jsxs("div",{className:oo.header,children:[x.jsx(sp,{size:16,strokeWidth:1.75,className:oo.sparkle}),x.jsx("span",{className:oo.title,children:r("upgrade.tagline","Check Pro features")})]}),x.jsxs("div",{className:oo.actions,children:[x.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.cta,onClick:v,children:[r("upgrade.cta","View Pro")," →"]}),x.jsxs(ja,{to:y,className:oo.licenseCta,onClick:w,children:[x.jsx(ip,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"}),x.jsx("span",{children:r("upgrade.licenseShortcut","Enter License")})]})]})]})}const MS="_backdrop_1r5ey_1",NS="_dialog_1r5ey_11",_S="_header_1r5ey_21",OS="_titleBlock_1r5ey_30",qS="_title_1r5ey_30",BS="_subtitle_1r5ey_42",WS="_closeButton_1r5ey_49",FS="_body_1r5ey_67",KS="_statusBox_1r5ey_73",VS="_errorBox_1r5ey_74",YS="_spin_1r5ey_92",GS="_bundleBlock_1r5ey_102",$S="_label_1r5ey_107",XS="_bundleName_1r5ey_115",QS="_guidanceBox_1r5ey_127",ZS="_includedList_1r5ey_143",JS="_includedItem_1r5ey_152",ev="_actions_1r5ey_163",tv="_button_1r5ey_169",ov="_primaryLink_1r5ey_170",av="_hint_1r5ey_206",We={backdrop:MS,dialog:NS,header:_S,titleBlock:OS,title:qS,subtitle:BS,closeButton:WS,body:FS,statusBox:KS,errorBox:VS,spin:YS,bundleBlock:GS,label:$S,bundleName:XS,guidanceBox:QS,includedList:ZS,includedItem:JS,actions:ev,button:tv,primaryLink:ov,hint:av};function Ll(){return typeof navigator<"u"?navigator.userAgent:""}function iv(i){window.open(i,"_blank","noopener,noreferrer")}function sv({open:i,fallbackHref:n,onClose:r}){const{locale:d,t:u}=Lo(),p=R.useId(),[g,y]=R.useState(!1),[h,v]=R.useState(null),[w,P]=R.useState(null),[D,L]=R.useState("idle");if(R.useEffect(()=>{if(!i)return;let V=!1;const pe=Ll();return y(!0),v(null),P(null),L("idle"),jt.post("/api/dashboard/support/bug-report",{os:Bl(pe),userAgent:pe,locale:d}).then(De=>{V||(v(De),y(!1))}).catch(()=>{V||(P(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1))}),()=>{V=!0}},[i,d]),R.useEffect(()=>{if(!i||g)return;function V(pe){pe.key==="Escape"&&r()}return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[i,g,r]),!i)return null;async function B(){if(h)try{L("opening"),await jt.post("/api/dashboard/support/bug-report/reveal",{bundleName:h.bundleName}),L("opened")}catch{L("failed")}}const U=h!==null,_=(h==null?void 0:h.issueUrl)??n,le=(h==null?void 0:h.includedFiles)??[],W=D==="opening"?u("bugReportDialog.reveal.opening","Opening..."):D==="opened"?u("bugReportDialog.reveal.opened","Opened location"):u("bugReportDialog.reveal","Reveal in Finder"),oe=x.jsx("div",{className:We.backdrop,onClick:g?void 0:r,children:x.jsxs("section",{className:We.dialog,role:"dialog","aria-modal":"true","aria-labelledby":p,onClick:V=>V.stopPropagation(),children:[x.jsxs("div",{className:We.header,children:[x.jsxs("div",{className:We.titleBlock,children:[x.jsx("h2",{id:p,className:We.title,children:u("bugReportDialog.title","diagnostics.zip can help us investigate")}),x.jsx("p",{className:We.subtitle,children:u("bugReportDialog.subtitle","WEPPY created a diagnostics zip on your computer. It includes Studio, plugin, Sync, and tool logs that can help us understand what happened.")})]}),x.jsx("button",{type:"button",className:We.closeButton,"aria-label":u("bugReportDialog.close","Close"),onClick:r,disabled:g,children:x.jsx(gS,{size:16,strokeWidth:1.75,"aria-hidden":"true"})})]}),x.jsxs("div",{className:We.body,children:[g&&x.jsxs("div",{className:We.statusBox,role:"status",children:[x.jsx(Xf,{className:We.spin,size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.loading","Preparing diagnostics.zip...")})]}),w&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(zf,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:w})]}),U&&x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:We.guidanceBox,children:[x.jsx("p",{children:u("bugReportDialog.optional","You can submit the bug report without this file, but attaching it usually helps us find the cause faster.")}),x.jsx("p",{children:u("bugReportDialog.attachHow","To attach it, download or reveal the zip, then add it to the Diagnostics ZIP (optional) upload field on GitHub before you submit.")})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.bundle","Bundle")}),x.jsx("code",{className:We.bundleName,children:h.bundleName})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.included","Included")}),x.jsx("ul",{className:We.includedList,children:le.length>0?le.map(V=>x.jsx("li",{className:We.includedItem,children:V.label},`${V.label}:${V.archivePath??V.path}`)):x.jsx("li",{className:We.includedItem,children:u("bugReportDialog.included.none","No log files found")})})]}),D==="failed"&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(ap,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.reveal.failed","Could not open the file location.")})]})]}),x.jsxs("div",{className:We.actions,children:[U&&x.jsxs(x.Fragment,{children:[x.jsxs("a",{className:We.primaryLink,href:h.downloadUrl,download:h.bundleName,children:[x.jsx(Ef,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.download","1. Download diagnostics.zip")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>void B(),disabled:D==="opening",children:[x.jsx(ap,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),W]})]}),w&&!U&&x.jsxs("button",{type:"button",className:We.button,onClick:()=>{P(null),y(!0),jt.post("/api/dashboard/support/bug-report",{os:Bl(Ll()),userAgent:Ll(),locale:d}).then(V=>{v(V),y(!1)}).catch(()=>{P(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1)})},children:[x.jsx(Bp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.retry","Try again")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>iv(_),disabled:g,children:[x.jsx(qp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),U?u("bugReportDialog.openGithub","2. Open GitHub issue"):u("bugReportDialog.openGithubFallback","Open GitHub without diagnostics")]})]}),x.jsx("p",{className:We.hint,children:u("bugReportDialog.hint","The zip can contain local logs and project context. Review it before attaching if you want to share it.")})]})]})});return typeof document>"u"?oe:Ln.createPortal(oe,document.body)}const nv="_sidebar_19hyu_2",rv="_brand_19hyu_17",lv="_brandIcon_19hyu_28",dv="_brandText_19hyu_33",uv="_brandTextPro_19hyu_44",cv="_nav_19hyu_50",pv="_spacer_19hyu_57",gv="_navLink_19hyu_63",hv="_active_19hyu_84",mv="_disabled_19hyu_91",yv="_icon_19hyu_102",fv="_label_19hyu_113",Sv="_secondaryDivider_19hyu_120",vv="_secondaryNav_19hyu_127",bv="_secondaryNavEntry_19hyu_134",Pv="_secondaryItemDivider_19hyu_140",wv="_helpDivider_19hyu_147",Cv="_helpGroupTitle_19hyu_154",kv="_helpNav_19hyu_165",xv="_externalIcon_19hyu_172",Je={sidebar:nv,brand:rv,brandIcon:lv,brandText:dv,brandTextPro:uv,nav:cv,spacer:pv,navLink:gv,active:hv,disabled:mv,icon:yv,label:fv,secondaryDivider:Sv,secondaryNav:vv,secondaryNavEntry:bv,secondaryItemDivider:Pv,helpDivider:wv,helpGroupTitle:Cv,helpNav:kv,externalIcon:xv},Rv={bug:"sidebar_help_bug",feature:"sidebar_help_feature",discussions:"sidebar_help_community",troubleshooting:"sidebar_help_troubleshooting"};function Av(){const[i,n]=R.useState(!1);return R.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const r=window.matchMedia("(max-width: 768px)"),d=()=>n(r.matches);return d(),r.addEventListener("change",d),()=>r.removeEventListener("change",d)},[]),i}const lp={disconnected:0,serverOnly:1,studioConnected:2};function Iv(i,n){return lp[i]>=lp[n]}function Dv(i,n){return i==="serverOnly"?n("sidebar.gate.l1","MCP server connection required"):i==="studioConnected"?n("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function dp({item:i}){const{level:n}=Nn(),{t:r}=Lo(),d=Iv(n,i.minLevel),u=i.icon,p=x.jsxs(Iy,{to:i.route,end:i.route==="/",className:({isActive:g})=>[Je.navLink,g?Je.active:"",d?"":Je.disabled].filter(Boolean).join(" "),onClick:g=>{d||g.preventDefault()},children:[x.jsx("span",{className:Je.icon,children:x.jsx(u,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)})]});return d?p:x.jsx(Ft,{text:Dv(i.minLevel,r),children:p})}function jv({item:i,ctx:n}){const{t:r}=Lo(),{trackEvent:d}=us(),{pathname:u,search:p}=Vt(),g=i.icon,y=i.buildUrl(n),h=r(i.tooltipKey,""),v=ds(u,p),[w,P]=R.useState(!1),D=x.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:Je.navLink,"data-testid":`sidebar-help-${i.id}`,onClick:B=>{d("dashboard_click_event",{click_target:Rv[i.id],placement:"sidebar_help",...v}),i.id==="bug"&&(B.preventDefault(),P(!0))},children:[x.jsx("span",{className:Je.icon,children:x.jsx(g,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)}),x.jsx("span",{className:Je.externalIcon,"aria-hidden":"true",children:x.jsx(qp,{size:12,strokeWidth:1.75})})]}),L=h?x.jsx(Ft,{text:h,children:D}):D;return x.jsxs(x.Fragment,{children:[L,i.id==="bug"&&x.jsx(sv,{open:w,fallbackHref:y,onClose:()=>P(!1)})]})}function Ev(){const[i,n]=R.useState("basic"),r=Av(),{status:d}=Nn(),{locale:u,t:p}=Lo(),g={locale:u,status:d};return R.useEffect(()=>{let y=!1;async function h(){try{const P=await _p("auto");!y&&(P!=null&&P.tier)&&n(P.tier)}catch{y||n("basic")}}h();const v=new Ql;v.connect();const w=v.on("license",()=>{h()});return()=>{y=!0,w(),v.disconnect()}},[]),x.jsxs("aside",{className:Je.sidebar,children:[x.jsxs("div",{className:Je.brand,children:[x.jsx("span",{className:Je.brandIcon,children:x.jsx(Df,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{"data-testid":"sidebar-brand-text",className:[Je.brandText,i==="pro"?Je.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),x.jsx("nav",{className:Je.nav,children:Fp.map(y=>x.jsx(dp,{item:y},y.route))}),x.jsx("div",{className:Je.secondaryDivider}),x.jsx("nav",{className:Je.secondaryNav,children:ql.map((y,h)=>x.jsxs("div",{className:Je.secondaryNavEntry,children:[x.jsx(dp,{item:y}),h<ql.length-1?x.jsx("div",{className:Je.secondaryItemDivider,"data-testid":"sidebar-controls-whats-new-divider","aria-hidden":"true"}):null]},y.route))}),x.jsx("div",{className:Je.helpDivider,"aria-hidden":"true"}),x.jsx("div",{className:Je.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),x.jsx("nav",{className:Je.helpNav,"aria-label":p("sidebar.help.group"),children:fS.map(y=>x.jsx(jv,{item:y,ctx:g},y.id))}),x.jsx("div",{className:Je.spacer}),x.jsx(HS,{collapsed:r})]})}async function Tv(){return jt.get("/api/dashboard/place-summary")}async function Lv(){return jt.get("/api/dashboard/sync-root")}async function Mb(){return jt.post("/api/dashboard/sync-root/pick")}async function Nb(i){return jt.patch("/api/dashboard/sync-root",{projectRoot:i})}const zv=[{id:"2026-08-13-asset-organization",date:"2026-08-13",title:{en:"Browse your Assets by folder or as one list",ko:"Assets를 폴더별로 정리해서 보세요",es:"Organiza tus Assets por carpetas o en una sola lista","pt-br":"Organize seus Assets por pastas ou em uma lista única",ja:"Assetsをフォルダー別または一覧で表示できます",id:"Kelola Asset berdasarkan folder atau dalam satu daftar",de:"Assets nach Ordnern oder als eine Liste anzeigen","fr-fr":"Parcourez vos Assets par dossier ou dans une seule liste"},body:{en:`The Dashboard Assets page now has a folder-based view. Open a folder to see its subfolders and assets, then use the breadcrumb to move back through nested folders.
315
+
316
+ Choose All assets when you want to see the matching assets without folder grouping. Choose All scopes to view assets from the current Place and the shared library together.
317
+
318
+ The existing Images, Decals, and RBXM category filters remain available. Grid and List layouts and Small, Medium, and Large thumbnail sizes can be changed independently. Your choices are remembered the next time you open Assets.
319
+
320
+ Your existing Asset Library data and folder paths are unchanged. No migration is required.`,ko:`Dashboard Assets 페이지에서 에셋을 폴더 단위로 탐색할 수 있습니다. 폴더를 열면 하위 폴더와 해당 위치의 에셋을 확인할 수 있고, breadcrumb로 중첩된 폴더에서 이전 위치로 돌아갈 수 있습니다.
321
+
322
+ 폴더 구분 없이 조건에 맞는 에셋을 한 번에 보고 싶다면 All assets를 선택하세요. All scopes를 선택하면 현재 Place와 공용 라이브러리의 에셋을 함께 확인할 수 있습니다.
323
+
324
+ 기존 Images, Decals, RBXM 카테고리 필터는 그대로 사용할 수 있습니다. Grid, List 레이아웃과 Small, Medium, Large 썸네일 크기도 독립적으로 바꿀 수 있으며, 선택한 보기 방식은 다음에 Assets를 열 때 유지됩니다.
325
+
326
+ 기존 Asset Library 데이터와 폴더 경로는 변경되지 않습니다. 별도 마이그레이션도 필요하지 않습니다.`,es:`La página Assets del Dashboard ahora ofrece una vista por carpetas. Abre una carpeta para ver sus subcarpetas y assets, y usa la ruta de navegación para volver por las carpetas anidadas.
327
+
328
+ Elige All assets para ver en una sola lista los assets que coinciden, sin agruparlos por carpeta. Elige All scopes para ver juntos los assets del Place actual y de la biblioteca compartida.
329
+
330
+ Los filtros de categoría Images, Decals y RBXM siguen disponibles. Puedes cambiar por separado los diseños Grid y List y los tamaños de miniatura Small, Medium y Large. Tus opciones se conservan al volver a abrir Assets.
331
+
332
+ Los datos existentes de Asset Library y las rutas de carpeta no cambian. No se necesita ninguna migración.`,"pt-br":`A página Assets do Dashboard agora oferece uma visualização por pastas. Abra uma pasta para ver suas subpastas e assets e use o caminho de navegação para voltar pelas pastas aninhadas.
333
+
334
+ Escolha All assets para ver em uma única lista os assets correspondentes, sem agrupá-los por pasta. Escolha All scopes para ver juntos os assets do Place atual e da biblioteca compartilhada.
335
+
336
+ Os filtros de categoria Images, Decals e RBXM continuam disponíveis. Você pode alterar separadamente os layouts Grid e List e os tamanhos de miniatura Small, Medium e Large. Suas opções são mantidas quando você abre Assets novamente.
337
+
338
+ Os dados existentes da Asset Library e os caminhos das pastas não são alterados. Nenhuma migração é necessária.`,ja:`DashboardのAssetsページでフォルダー別に表示できるようになりました。フォルダーを開くと、配下のサブフォルダーとアセットを確認できます。パンくずを使えば、ネストしたフォルダーを前の場所まで戻れます。
339
+
340
+ フォルダーで分けずに条件に合うアセットを一覧で見たい場合は、All assetsを選択してください。All scopesを選択すると、現在のPlaceと共有ライブラリのアセットをまとめて表示できます。
341
+
342
+ Images、Decals、RBXMのカテゴリーフィルターはこれまでどおり利用できます。GridとListのレイアウト、Small・Medium・Largeのサムネイルサイズは個別に変更できます。選択した表示設定は、次にAssetsを開いたときも保持されます。
343
+
344
+ 既存のAsset Libraryデータとフォルダーのパスは変更されません。手動の移行は必要ありません。`,id:`Halaman Assets di Dashboard kini memiliki tampilan berdasarkan folder. Buka folder untuk melihat subfolder dan asset di dalamnya, lalu gunakan breadcrumb untuk kembali melalui folder bertingkat.
345
+
346
+ Pilih All assets jika ingin melihat asset yang sesuai dalam satu daftar tanpa pengelompokan folder. Pilih All scopes untuk melihat asset dari Place saat ini dan library bersama secara bersamaan.
347
+
348
+ Filter kategori Images, Decals, dan RBXM tetap tersedia. Tata letak Grid dan List serta ukuran thumbnail Small, Medium, dan Large dapat diubah secara terpisah. Pilihan Anda akan tetap tersimpan saat membuka Assets kembali.
349
+
350
+ Data Asset Library dan jalur folder yang sudah ada tidak berubah. Tidak diperlukan migrasi.`,de:`Die Assets-Seite im Dashboard bietet jetzt eine Ordneransicht. Öffnen Sie einen Ordner, um seine Unterordner und Assets zu sehen, und verwenden Sie die Breadcrumb-Navigation, um durch verschachtelte Ordner zurückzugehen.
351
+
352
+ Wählen Sie All assets, wenn passende Assets ohne Ordnergruppierung in einer Liste erscheinen sollen. Wählen Sie All scopes, um Assets aus dem aktuellen Place und der gemeinsamen Bibliothek zusammen anzuzeigen.
353
+
354
+ Die vorhandenen Kategoriefilter Images, Decals und RBXM bleiben verfügbar. Die Layouts Grid und List sowie die Miniaturgrößen Small, Medium und Large lassen sich unabhängig voneinander ändern. Ihre Auswahl bleibt beim nächsten Öffnen von Assets erhalten.
355
+
356
+ Ihre vorhandenen Asset-Library-Daten und Ordnerpfade bleiben unverändert. Eine Migration ist nicht erforderlich.`,"fr-fr":`La page Assets du Dashboard propose maintenant une vue par dossiers. Ouvrez un dossier pour voir ses sous-dossiers et ses assets, puis utilisez le fil d’Ariane pour revenir dans les dossiers imbriqués.
357
+
358
+ Choisissez All assets pour afficher dans une seule liste les assets correspondants, sans regroupement par dossier. Choisissez All scopes pour voir ensemble les assets de la Place actuelle et de la bibliothèque partagée.
359
+
360
+ Les filtres de catégorie Images, Decals et RBXM restent disponibles. Les affichages Grid et List ainsi que les tailles de miniature Small, Medium et Large peuvent être modifiés séparément. Vos choix sont conservés à la prochaine ouverture d’Assets.
361
+
362
+ Vos données Asset Library et vos chemins de dossiers existants restent inchangés. Aucune migration n’est nécessaire.`},severity:"info",category:"release"},{id:"2026-07-30-luau-syntax-validation",date:"2026-07-30",title:{en:"Catch Luau syntax errors before Playtest",ko:"Playtest 전에 Luau 문법 오류를 확인하세요",es:"Detecta errores de sintaxis Luau antes de Playtest","pt-br":"Encontre erros de sintaxe Luau antes do Playtest",ja:"Playtestの前にLuauの構文エラーを確認できます",id:"Temukan error sintaks Luau sebelum Playtest",de:"Luau-Syntaxfehler vor dem Playtest erkennen","fr-fr":"Détectez les erreurs de syntaxe Luau avant le Playtest"},body:{en:`Luau syntax validation is available for script work. It is Off by default. Turn it on under Controls > Luau Syntax Validation to check the source that was actually saved after supported script writes, without starting Playtest.
315
363
 
316
364
  When a check is valid, automatic validation does not expand the normal write response. If syntax errors are found or validation is unavailable, WEPPY returns details. The script change remains applied in either case so the AI can fix it in the same script. You can also ask the AI to validate raw source or an existing Script directly on Basic and Pro.`,ko:`스크립트 작업에 Luau 문법 검사가 추가되었습니다. 기본값은 꺼짐입니다. Controls > Luau Syntax Validation에서 켜면 지원되는 스크립트 쓰기 후 실제로 저장된 source를 Playtest 없이 검사합니다.
317
365
 
@@ -535,164 +583,4 @@ Si le modèle généré contient des données mesh ou texture sans Roblox asset
535
583
 
536
584
  La page Assets du Dashboard affiche les détails de génération, les résultats de revue et le statut d'upload des RBXM enregistrés.
537
585
 
538
- Aucune migration manuelle n'est requise. Utilisez cette fonction lorsque vous voulez conserver le résultat de génération Studio comme sauvegarde RBXM locale ou l'envoyer pour le réutiliser avec un Roblox asset ID.`},severity:"info",category:"release"},{id:"2026-06-18-multi-studio-targets",date:"2026-06-18",title:{en:"One MCP server can control multiple Studio windows",ko:"하나의 MCP로 여러 Studio 창을 조작할 수 있습니다",es:"Un servidor MCP puede controlar varias ventanas de Studio","pt-br":"Um servidor MCP pode controlar várias janelas do Studio",ja:"1つのMCPで複数のStudioウィンドウを操作できます",id:"Satu server MCP dapat mengontrol beberapa jendela Studio",de:"Ein MCP-Server kann mehrere Studio-Fenster steuern","fr-fr":"Un serveur MCP peut contrôler plusieurs fenêtres Studio"},body:{en:`One MCP server can now keep multiple Roblox Studio windows connected as separate Studio targets.
539
-
540
- This is useful for lobby games and multi-place experiences. You can open the lobby place in one Studio window and a gameplay or test place in another, then tell the AI which Studio ID or place ID to use. Requests without a target follow the Dashboard Studio Routing setting: recent-priority or pinned Studio.
541
-
542
- The Dashboard also has a new Controls tab for MCP behavior settings. Use Controls > Studio Routing to switch between automatic recent priority and a pinned Studio window, set the priority target, and copy Studio IDs. Project Root and General Settings now live in Controls too.
543
-
544
- When several Studio windows are open, you no longer need to swap MCP registrations just to work on another place. You can run Playtest work in more than one Studio window at the same time, while WEPPY keeps each request, report, and tool history tied to the selected Studio target and place.
545
-
546
- No manual migration is required. Use the Dashboard header, Connection page, or Controls tab to see connected Studio targets and copy their Studio ID.`,ko:`이제 하나의 MCP 서버가 여러 Roblox Studio 창을 각각 Studio target으로 연결해 둘 수 있습니다.
547
-
548
- 로비 게임이나 여러 place로 구성된 경험을 만들 때 유용합니다. 로비 place는 한 Studio 창에, 실제 플레이 또는 테스트용 place는 다른 Studio 창에 열어 둔 뒤 AI에게 사용할 Studio ID나 place ID를 지정할 수 있습니다. 대상을 지정하지 않은 요청은 Dashboard의 Studio Routing 설정에 따라 최근 우선 대상 또는 pinned Studio로 전달됩니다.
549
-
550
- Dashboard에는 MCP 동작 설정을 모은 Controls 탭도 추가되었습니다. Controls > Studio Routing에서 자동 최근 우선과 수동 pinned Studio를 바꾸고, 우선 대상 Studio 창을 지정하며, Studio ID를 복사할 수 있습니다. Project Root와 General Settings도 이제 Controls에서 관리합니다.
551
-
552
- Studio 창이 여러 개 열려 있어도 다른 place를 작업하기 위해 MCP 등록을 바꿀 필요가 없습니다. 여러 Studio 창에서 Playtest 작업을 동시에 진행하면서도 WEPPY는 각 요청, 리포트, 도구 기록을 선택된 Studio target과 place 기준으로 처리합니다.
553
-
554
- 수동 마이그레이션은 필요 없습니다. Dashboard 상단 헤더, Connection 페이지, 또는 Controls 탭에서 연결된 Studio target과 Studio ID를 확인할 수 있습니다.`,es:`Un servidor MCP ahora puede mantener varias ventanas de Roblox Studio conectadas como Studio targets separados.
555
-
556
- Esto es útil para juegos con lobby y experiencias con varios places. Puedes abrir el place de lobby en una ventana de Studio y un place de juego o prueba en otra, y decirle a la IA qué Studio ID o place ID debe usar. Las solicitudes sin destino siguen la configuración Studio Routing del Dashboard: prioridad reciente o Studio fijado.
557
-
558
- El Dashboard también incluye una nueva pestaña Controls para los ajustes de comportamiento de MCP. En Controls > Studio Routing puedes cambiar entre prioridad reciente automática y una ventana Studio fijada, definir el destino prioritario y copiar Studio IDs. Project Root y General Settings también viven ahora en Controls.
559
-
560
- Cuando hay varias ventanas de Studio abiertas, ya no necesitas cambiar el registro MCP solo para trabajar en otro place. Puedes ejecutar trabajo de Playtest en más de una ventana de Studio al mismo tiempo, mientras WEPPY mantiene cada solicitud, informe e historial de herramientas asociado al Studio target y place seleccionados.
561
-
562
- No se requiere migración manual. Usa el encabezado del Dashboard, la página Connection o la pestaña Controls para ver los Studio targets conectados y copiar su Studio ID.`,"pt-br":`Um servidor MCP agora pode manter várias janelas do Roblox Studio conectadas como Studio targets separados.
563
-
564
- Isso ajuda em jogos com lobby e experiências com vários places. Você pode abrir o place de lobby em uma janela do Studio e um place de gameplay ou teste em outra, depois dizer à IA qual Studio ID ou place ID usar. Solicitações sem destino seguem a configuração Studio Routing do Dashboard: prioridade recente ou Studio fixado.
565
-
566
- O Dashboard também tem uma nova aba Controls para configurações de comportamento do MCP. Em Controls > Studio Routing, você pode alternar entre prioridade recente automática e uma janela Studio fixada, definir o target prioritário e copiar Studio IDs. Project Root e General Settings também ficam agora em Controls.
567
-
568
- Com várias janelas do Studio abertas, você não precisa trocar o registro MCP só para trabalhar em outro place. Você pode executar trabalho de Playtest em mais de uma janela do Studio ao mesmo tempo, enquanto o WEPPY mantém cada solicitação, relatório e histórico de ferramentas ligado ao Studio target e place selecionados.
569
-
570
- Nenhuma migração manual é necessária. Use o cabeçalho do Dashboard, a página Connection ou a aba Controls para ver os Studio targets conectados e copiar o Studio ID.`,ja:`1つのMCPサーバーで、複数のRoblox Studioウィンドウを別々のStudio targetとして接続できるようになりました。
571
-
572
- ロビーゲームや複数placeで構成された体験に便利です。ロビーplaceを1つのStudioウィンドウで開き、ゲームプレイ用またはテスト用placeを別のStudioウィンドウで開いて、AIに使用するStudio IDまたはplace IDを指定できます。対象を指定しないリクエストは、DashboardのStudio Routing設定に従い、recent-priorityまたはpinned Studioへ送られます。
573
-
574
- Dashboardには、MCPの動作設定をまとめる新しいControlsタブも追加されました。Controls > Studio Routingでは、自動のrecent priorityと固定したStudioウィンドウを切り替え、優先対象を設定し、Studio IDをコピーできます。Project RootとGeneral SettingsもControlsで管理します。
575
-
576
- 複数のStudioウィンドウが開いていても、別のplaceで作業するためにMCP登録を切り替える必要はありません。複数のStudioウィンドウでPlaytest作業を同時に進めながら、WEPPYは各リクエスト、レポート、ツール履歴を選択されたStudio targetとplaceに紐づけて扱います。
577
-
578
- 手動移行は不要です。Dashboardの上部ヘッダー、Connectionページ、またはControlsタブで、接続中のStudio targetとStudio IDを確認できます。`,id:`Satu server MCP sekarang dapat menjaga beberapa jendela Roblox Studio tetap terhubung sebagai Studio target terpisah.
579
-
580
- Ini berguna untuk game lobby dan experience dengan beberapa place. Anda bisa membuka place lobby di satu jendela Studio dan place gameplay atau test di jendela lain, lalu memberi tahu AI Studio ID atau place ID mana yang harus dipakai. Permintaan tanpa target mengikuti pengaturan Studio Routing di Dashboard: recent-priority atau pinned Studio.
581
-
582
- Dashboard juga memiliki tab Controls baru untuk pengaturan perilaku MCP. Di Controls > Studio Routing, Anda bisa beralih antara recent priority otomatis dan jendela Studio yang dipin, menetapkan target prioritas, dan menyalin Studio ID. Project Root dan General Settings sekarang juga dikelola di Controls.
583
-
584
- Saat beberapa jendela Studio terbuka, Anda tidak perlu mengganti registrasi MCP hanya untuk bekerja di place lain. Anda bisa menjalankan pekerjaan Playtest di lebih dari satu jendela Studio pada saat yang sama, sementara WEPPY menjaga setiap permintaan, laporan, dan riwayat tool tetap terhubung ke Studio target dan place yang dipilih.
585
-
586
- Tidak ada migrasi manual yang diperlukan. Gunakan header Dashboard, halaman Connection, atau tab Controls untuk melihat Studio target yang terhubung dan menyalin Studio ID.`,de:`Ein MCP-Server kann jetzt mehrere Roblox-Studio-Fenster als separate Studio Targets verbunden halten.
587
-
588
- Das ist nützlich für Lobby-Spiele und Experiences mit mehreren Places. Sie können den Lobby-Place in einem Studio-Fenster öffnen und einen Gameplay- oder Test-Place in einem anderen, und der KI dann die passende Studio ID oder place ID nennen. Anfragen ohne Ziel folgen der Studio-Routing-Einstellung im Dashboard: Recent priority oder pinned Studio.
589
-
590
- Das Dashboard hat außerdem einen neuen Controls-Tab für MCP-Verhaltenseinstellungen. Unter Controls > Studio Routing wechseln Sie zwischen automatischer Recent priority und einem angepinnten Studio-Fenster, legen das Priority-Ziel fest und kopieren Studio IDs. Project Root und General Settings werden jetzt ebenfalls in Controls verwaltet.
591
-
592
- Wenn mehrere Studio-Fenster geöffnet sind, müssen Sie die MCP-Registrierung nicht mehr wechseln, nur um an einem anderen Place zu arbeiten. Sie können Playtest-Arbeit in mehr als einem Studio-Fenster gleichzeitig ausführen, während WEPPY jede Anfrage, jeden Bericht und den Tool-Verlauf dem ausgewählten Studio Target und Place zuordnet.
593
-
594
- Eine manuelle Migration ist nicht erforderlich. Im Dashboard-Header, auf der Connection-Seite oder im Controls-Tab sehen Sie die verbundenen Studio Targets und können ihre Studio ID kopieren.`,"fr-fr":`Un serveur MCP peut maintenant garder plusieurs fenêtres Roblox Studio connectées comme Studio targets séparés.
595
-
596
- C'est utile pour les jeux avec lobby et les expériences composées de plusieurs places. Vous pouvez ouvrir la place de lobby dans une fenêtre Studio et une place de jeu ou de test dans une autre, puis indiquer à l'IA quel Studio ID ou place ID utiliser. Les requêtes sans cible suivent le réglage Studio Routing du Dashboard : recent-priority ou Studio épinglé.
597
-
598
- Le Dashboard inclut aussi un nouvel onglet Controls pour les réglages de comportement MCP. Dans Controls > Studio Routing, vous pouvez passer d'une priorité récente automatique à une fenêtre Studio épinglée, définir la cible prioritaire et copier les Studio IDs. Project Root et General Settings sont maintenant gérés dans Controls aussi.
599
-
600
- Lorsque plusieurs fenêtres Studio sont ouvertes, vous n'avez plus besoin de changer l'enregistrement MCP pour travailler sur une autre place. Vous pouvez lancer du travail Playtest dans plusieurs fenêtres Studio en même temps, pendant que WEPPY rattache chaque requête, rapport et historique d'outils au Studio target et à la place sélectionnés.
601
-
602
- Aucune migration manuelle n'est requise. Utilisez l'en-tête du Dashboard, la page Connection ou l'onglet Controls pour voir les Studio targets connectés et copier leur Studio ID.`},severity:"info",category:"release"},{id:"2026-06-15-playtest-studio-actions",date:"2026-06-15",title:{en:"Playtest controls moved to Studio actions, with fewer Stop retries",ko:"Playtest 액션이 Studio 제어로 정리되고 Stop 재시도가 줄었습니다",es:"Los controles de Playtest pasan a acciones Studio, con menos reintentos de Stop","pt-br":"Controles de Playtest agora ficam em ações Studio, com menos tentativas de Stop",ja:"Playtest操作をStudioアクションへ整理し、Stopの再試行を減らしました",id:"Kontrol Playtest dipindahkan ke aksi Studio, dengan lebih sedikit percobaan ulang Stop",de:"Playtest-Steuerung liegt jetzt bei Studio-Aktionen, mit weniger Stop-Wiederholungen","fr-fr":"Les contrôles Playtest passent aux actions Studio, avec moins de relances Stop"},body:{en:`Playtest start, stop, pause, resume, status, and automated test runs are now documented under Studio actions. AI agents and direct MCP integrations should use manage_studio.play_start, manage_studio.play_stop, manage_studio.play_pause, manage_studio.play_resume, manage_studio.play_status, and manage_studio.run_test. system_info stays focused on read-only status and diagnostics.
603
-
604
- Play Stop has also been fixed for cases where Roblox Studio creates more than one plugin connection after Play starts. WEPPY no longer relies on only one connection for Stop, and cleanup checks whether Studio returned to Edit mode when confirmation is needed. This reduces cases where the AI asks Studio to stop but the test keeps running until you retry.
605
-
606
- No manual migration is required. If you maintain custom prompts or direct MCP calls, update them to the manage_studio.play_* and manage_studio.run_test actions.`,ko:`Playtest 시작, 정지, 일시정지, 재개, 상태 확인, 자동 테스트 실행이 Studio 제어 액션 기준으로 정리되었습니다. AI Agent와 직접 MCP 연동에서는 manage_studio.play_start, manage_studio.play_stop, manage_studio.play_pause, manage_studio.play_resume, manage_studio.play_status, manage_studio.run_test를 사용해 주세요. system_info는 읽기 전용 상태와 진단 역할에 집중합니다.
607
-
608
- Play 시작 후 Roblox Studio가 플러그인 연결을 여러 개 만드는 경우에도 Stop 요청이 정상 동작하도록 수정하였습니다. WEPPY는 Stop 요청을 한 연결에만 맡기지 않고 필요한 경우 active plugin connection에도 보내며, 정리 단계에서는 Studio가 Edit 모드로 돌아왔는지 확인합니다. 이로 인해 AI가 Stop을 요청했는데 테스트가 계속 남아 있어 다시 시도해야 하는 상황이 줄어듭니다.
609
-
610
- 수동 마이그레이션은 필요 없습니다. 커스텀 프롬프트나 직접 MCP 호출을 관리 중이라면 manage_studio.play_* 및 manage_studio.run_test 기준으로 갱신해 주세요.`,es:`El inicio, la detención, la pausa, la reanudación, el estado y las pruebas automáticas de Playtest ahora se documentan como acciones Studio. Los agentes de IA y las integraciones MCP directas deben usar manage_studio.play_start, manage_studio.play_stop, manage_studio.play_pause, manage_studio.play_resume, manage_studio.play_status y manage_studio.run_test. system_info queda enfocado en estado de solo lectura y diagnóstico.
611
-
612
- También se corrigió Play Stop para los casos en que Roblox Studio crea más de una conexión del plugin después de iniciar Play. WEPPY ya no depende de una sola conexión para Stop, y durante la limpieza comprueba si Studio volvió al modo Edit cuando hace falta confirmación. Esto reduce los casos en los que la IA pide detener Studio pero la prueba sigue ejecutándose hasta que lo intentas de nuevo.
613
-
614
- No se requiere migración manual. Si mantienes prompts personalizados o llamadas MCP directas, actualízalos a las acciones manage_studio.play_* y manage_studio.run_test.`,"pt-br":`Iniciar, parar, pausar, retomar, consultar status e executar testes automáticos de Playtest agora ficam documentados como ações Studio. Agentes de IA e integrações MCP diretas devem usar manage_studio.play_start, manage_studio.play_stop, manage_studio.play_pause, manage_studio.play_resume, manage_studio.play_status e manage_studio.run_test. system_info fica focado em status somente leitura e diagnósticos.
615
-
616
- O Play Stop também foi corrigido para casos em que o Roblox Studio cria mais de uma conexão do plugin depois que o Play começa. O WEPPY não depende mais de uma única conexão para Stop, e a limpeza verifica se o Studio voltou ao modo Edit quando essa confirmação é necessária. Isso reduz casos em que a IA pede para parar o Studio, mas o teste continua rodando até você tentar de novo.
617
-
618
- Nenhuma migração manual é necessária. Se você mantém prompts personalizados ou chamadas MCP diretas, atualize para as ações manage_studio.play_* e manage_studio.run_test.`,ja:`Playtestの開始、停止、一時停止、再開、状態確認、自動テスト実行は、Studioアクションとして整理されました。AI Agentや直接MCP連携では、manage_studio.play_start、manage_studio.play_stop、manage_studio.play_pause、manage_studio.play_resume、manage_studio.play_status、manage_studio.run_testを使用してください。system_infoは読み取り専用の状態確認と診断に集中します。
619
-
620
- Play開始後にRoblox Studioが複数のプラグイン接続を作る場合でも、Play Stopが正常に動作するよう修正しました。WEPPYはStopを1つの接続だけに任せず、必要に応じてactive plugin connectionにも送ります。クリーンアップでは、確認が必要な場合にStudioがEditモードへ戻ったかを確認します。これにより、AIがStopを要求したのにテストが残り、もう一度試す必要があるケースが減ります。
621
-
622
- 手動移行は不要です。カスタムプロンプトや直接MCP呼び出しを管理している場合は、manage_studio.play_*およびmanage_studio.run_testのアクションに更新してください。`,id:`Memulai, menghentikan, menjeda, melanjutkan, memeriksa status, dan menjalankan tes otomatis Playtest kini didokumentasikan sebagai aksi Studio. AI Agent dan integrasi MCP langsung sebaiknya memakai manage_studio.play_start, manage_studio.play_stop, manage_studio.play_pause, manage_studio.play_resume, manage_studio.play_status, dan manage_studio.run_test. system_info tetap berfokus pada status baca-saja dan diagnostik.
623
-
624
- Play Stop juga diperbaiki untuk kasus ketika Roblox Studio membuat lebih dari satu koneksi plugin setelah Play dimulai. WEPPY tidak lagi bergantung pada satu koneksi saja untuk Stop, dan proses cleanup memeriksa apakah Studio sudah kembali ke mode Edit saat konfirmasi dibutuhkan. Ini mengurangi kasus ketika AI meminta Studio berhenti tetapi tes tetap berjalan sampai Anda mencoba lagi.
625
-
626
- Tidak ada migrasi manual yang diperlukan. Jika Anda mengelola prompt kustom atau panggilan MCP langsung, perbarui ke aksi manage_studio.play_* dan manage_studio.run_test.`,de:`Playtest starten, stoppen, pausieren, fortsetzen, Status abfragen und automatische Tests ausführen ist jetzt als Studio-Aktionen dokumentiert. KI-Agenten und direkte MCP-Integrationen sollten manage_studio.play_start, manage_studio.play_stop, manage_studio.play_pause, manage_studio.play_resume, manage_studio.play_status und manage_studio.run_test verwenden. system_info bleibt auf schreibgeschützten Status und Diagnose ausgerichtet.
627
-
628
- Play Stop wurde außerdem für Fälle korrigiert, in denen Roblox Studio nach dem Start von Play mehr als eine Plugin-Verbindung erstellt. WEPPY verlässt sich bei Stop nicht mehr nur auf eine Verbindung, und die Bereinigung prüft bei Bedarf, ob Studio wieder im Edit-Modus ist. Dadurch gibt es weniger Fälle, in denen die KI Studio stoppen möchte, der Test aber weiterläuft, bis Sie es erneut versuchen.
629
-
630
- Eine manuelle Migration ist nicht erforderlich. Wenn Sie eigene Prompts oder direkte MCP-Aufrufe pflegen, aktualisieren Sie sie auf die Aktionen manage_studio.play_* und manage_studio.run_test.`,"fr-fr":`Le démarrage, l'arrêt, la pause, la reprise, le statut et les tests automatiques Playtest sont maintenant documentés comme des actions Studio. Les agents IA et les intégrations MCP directes doivent utiliser manage_studio.play_start, manage_studio.play_stop, manage_studio.play_pause, manage_studio.play_resume, manage_studio.play_status et manage_studio.run_test. system_info reste centré sur le statut en lecture seule et le diagnostic.
631
-
632
- Play Stop a aussi été corrigé pour les cas où Roblox Studio crée plusieurs connexions du plugin après le démarrage de Play. WEPPY ne s'appuie plus sur une seule connexion pour Stop, et le nettoyage vérifie si Studio est revenu en mode Edit lorsqu'une confirmation est nécessaire. Cela réduit les cas où l'IA demande à Studio de s'arrêter, mais où le test continue jusqu'à une nouvelle tentative.
633
-
634
- Aucune migration manuelle n'est requise. Si vous maintenez des prompts personnalisés ou des appels MCP directs, mettez-les à jour vers les actions manage_studio.play_* et manage_studio.run_test.`},severity:"info",category:"release"},{id:"2026-06-14-assets-library-experimental",date:"2026-06-14",title:{en:"Experimental Assets: use AI-generated images and Studio RBXM files in your game",ko:"Assets 실험 기능: AI가 만든 이미지와 Studio RBXM을 게임에 넣을 수 있습니다",es:"Assets experimental: usa imágenes generadas por IA y archivos RBXM de Studio en tu juego","pt-br":"Assets experimental: use imagens geradas por IA e arquivos RBXM do Studio no seu jogo",ja:"Assets実験機能:AI生成画像とStudioのRBXMをゲームに追加できます",id:"Assets eksperimental: gunakan gambar buatan AI dan file RBXM Studio di game Anda",de:"Experimentelle Assets: KI-generierte Bilder und Studio-RBXM-Dateien im Spiel verwenden","fr-fr":"Assets expérimental : utilisez des images générées par IA et des fichiers RBXM Studio dans votre jeu"},body:{en:`The Dashboard now includes an experimental Assets page. This first version supports Images, Decals, and RBXM.
635
-
636
- With image-capable AI agents such as Codex Desktop and Antigravity, you can generate an image, save it into the local Asset Library, upload it to Roblox through Open Cloud, and use the resulting Roblox Asset ID or rbxassetid:// URI in your game.
637
-
638
- You can also export selected objects from Roblox Studio as RBXM files through the WEPPY Plugin Assets tab. Saved RBXM files appear in the Dashboard and can be inserted back into the connected Studio place.
639
-
640
- Roblox uploads require a Roblox Open Cloud API key and Creator ID. The API key is encrypted on your computer. WEPPY does not store it in an external service or send it to a separate WEPPY server; the local MCP server only uses it for Roblox Open Cloud upload requests.
641
-
642
- Assets is still experimental. More categories will be added over time.`,ko:`Dashboard에 Assets 페이지가 실험 기능으로 추가되었습니다. 이번 버전에서는 Images, Decals, RBXM을 먼저 사용할 수 있습니다.
643
-
644
- Codex Desktop, Antigravity처럼 이미지 생성이 가능한 AI Agent에서 이미지를 만든 뒤, 그 파일을 로컬 Asset Library에 저장하고 Roblox Open Cloud로 업로드할 수 있습니다. 업로드가 끝나면 Roblox Asset ID와 rbxassetid:// URI를 확인하고 게임 안에서 사용할 수 있습니다.
645
-
646
- Roblox Studio에서 선택한 오브젝트는 WEPPY Plugin의 Assets 탭에서 RBXM 파일로 저장할 수 있습니다. 저장된 RBXM은 Dashboard에서 확인한 뒤 연결된 Studio place에 다시 삽입할 수 있습니다.
647
-
648
- 에셋 업로드에는 Roblox Open Cloud API Key와 Creator ID가 필요합니다. API Key는 사용자의 컴퓨터에 암호화되어 저장됩니다. WEPPY는 이 키를 외부 저장소나 별도 WEPPY 서버에 저장하지 않으며, 업로드할 때 로컬 MCP 서버가 Roblox Open Cloud 요청에만 사용합니다.
649
-
650
- Assets는 아직 실험 기능입니다. 다른 카테고리는 차차 추가할 예정입니다.`,es:`El Dashboard ahora incluye una página Assets experimental. Esta primera versión admite Images, Decals y RBXM.
651
-
652
- Con agentes de IA que pueden generar imágenes, como Codex Desktop y Antigravity, puedes crear una imagen, guardarla en la Asset Library local, subirla a Roblox mediante Open Cloud y usar el Roblox Asset ID o URI rbxassetid:// resultante en tu juego.
653
-
654
- También puedes exportar objetos seleccionados de Roblox Studio como archivos RBXM desde la pestaña Assets del WEPPY Plugin. Los archivos RBXM guardados aparecen en el Dashboard y se pueden insertar de nuevo en el lugar de Studio conectado.
655
-
656
- Las subidas a Roblox requieren una API key de Roblox Open Cloud y un Creator ID. La API key se cifra en tu computadora. WEPPY no la guarda en un servicio externo ni la envía a un servidor WEPPY separado; el servidor MCP local solo la usa para solicitudes de subida a Roblox Open Cloud.
657
-
658
- Assets todavía es experimental. Se agregarán más categorías con el tiempo.`,"pt-br":`O Dashboard agora inclui uma página Assets experimental. Esta primeira versão oferece suporte a Images, Decals e RBXM.
659
-
660
- Com agentes de IA que conseguem gerar imagens, como Codex Desktop e Antigravity, você pode criar uma imagem, salvá-la na Asset Library local, enviá-la ao Roblox pelo Open Cloud e usar o Roblox Asset ID ou URI rbxassetid:// resultante no seu jogo.
661
-
662
- Você também pode exportar objetos selecionados do Roblox Studio como arquivos RBXM pela aba Assets do WEPPY Plugin. Os arquivos RBXM salvos aparecem no Dashboard e podem ser inseridos de volta no place do Studio conectado.
663
-
664
- Uploads para Roblox exigem uma API key do Roblox Open Cloud e um Creator ID. A API key é criptografada no seu computador. O WEPPY não a salva em um serviço externo nem a envia para um servidor WEPPY separado; o servidor MCP local só a usa em solicitações de upload ao Roblox Open Cloud.
665
-
666
- Assets ainda é experimental. Mais categorias serão adicionadas com o tempo.`,ja:`Dashboardに実験機能としてAssetsページが追加されました。最初のバージョンではImages、Decals、RBXMに対応しています。
667
-
668
- Codex DesktopやAntigravityのように画像生成ができるAI Agentを使うと、画像を生成し、ローカルAsset Libraryに保存し、Roblox Open Cloudでアップロードして、返されたRoblox Asset IDまたはrbxassetid:// URIをゲーム内で使用できます。
669
-
670
- Roblox Studioで選択したオブジェクトは、WEPPY PluginのAssetsタブからRBXMファイルとして書き出すこともできます。保存されたRBXMファイルはDashboardに表示され、接続中のStudio placeへ再挿入できます。
671
-
672
- Robloxへのアップロードには、Roblox Open Cloud API KeyとCreator IDが必要です。API Keyはお使いのコンピューター上で暗号化して保存されます。WEPPYはこのキーを外部サービスに保存したり、別のWEPPYサーバーへ送信したりしません。ローカルMCPサーバーがRoblox Open Cloudへのアップロード要求にのみ使用します。
673
-
674
- Assetsはまだ実験機能です。他のカテゴリーは順次追加予定です。`,id:`Dashboard kini memiliki halaman Assets eksperimental. Versi pertama ini mendukung Images, Decals, dan RBXM.
675
-
676
- Dengan AI Agent yang dapat membuat gambar, seperti Codex Desktop dan Antigravity, Anda bisa membuat gambar, menyimpannya ke Asset Library lokal, mengunggahnya ke Roblox melalui Open Cloud, lalu memakai Roblox Asset ID atau URI rbxassetid:// yang dihasilkan di game Anda.
677
-
678
- Anda juga bisa mengekspor objek yang dipilih di Roblox Studio sebagai file RBXM melalui tab Assets di WEPPY Plugin. File RBXM yang disimpan akan muncul di Dashboard dan dapat dimasukkan kembali ke Studio place yang terhubung.
679
-
680
- Upload ke Roblox memerlukan Roblox Open Cloud API key dan Creator ID. API key dienkripsi di komputer Anda. WEPPY tidak menyimpannya di layanan eksternal atau mengirimkannya ke server WEPPY terpisah; server MCP lokal hanya menggunakannya untuk permintaan upload ke Roblox Open Cloud.
681
-
682
- Assets masih eksperimental. Kategori lain akan ditambahkan secara bertahap.`,de:`Das Dashboard enthält jetzt eine experimentelle Assets-Seite. Diese erste Version unterstützt Images, Decals und RBXM.
683
-
684
- Mit KI-Agenten, die Bilder erzeugen können, etwa Codex Desktop und Antigravity, können Sie ein Bild erstellen, es in der lokalen Asset Library speichern, über Roblox Open Cloud hochladen und die zurückgegebene Roblox Asset ID oder rbxassetid:// URI in Ihrem Spiel verwenden.
685
-
686
- Sie können außerdem ausgewählte Objekte aus Roblox Studio über den Assets-Tab des WEPPY Plugin als RBXM-Dateien exportieren. Gespeicherte RBXM-Dateien erscheinen im Dashboard und können wieder in den verbundenen Studio-Place eingefügt werden.
687
-
688
- Roblox-Uploads benötigen einen Roblox Open Cloud API Key und eine Creator ID. Der API Key wird auf Ihrem Computer verschlüsselt gespeichert. WEPPY speichert ihn nicht in einem externen Dienst und sendet ihn nicht an einen separaten WEPPY-Server; der lokale MCP-Server verwendet ihn nur für Upload-Anfragen an Roblox Open Cloud.
689
-
690
- Assets ist noch experimentell. Weitere Kategorien werden nach und nach ergänzt.`,"fr-fr":`Le Dashboard inclut maintenant une page Assets expérimentale. Cette première version prend en charge Images, Decals et RBXM.
691
-
692
- Avec des agents IA capables de générer des images, comme Codex Desktop et Antigravity, vous pouvez créer une image, l'enregistrer dans l'Asset Library locale, l'envoyer à Roblox via Open Cloud, puis utiliser le Roblox Asset ID ou l'URI rbxassetid:// obtenu dans votre jeu.
693
-
694
- Vous pouvez aussi exporter des objets sélectionnés dans Roblox Studio en fichiers RBXM depuis l'onglet Assets du WEPPY Plugin. Les fichiers RBXM enregistrés apparaissent dans le Dashboard et peuvent être réinsérés dans la place Studio connectée.
695
-
696
- Les uploads Roblox nécessitent une API key Roblox Open Cloud et un Creator ID. L'API key est chiffrée sur votre ordinateur. WEPPY ne l'enregistre pas dans un service externe et ne l'envoie pas à un serveur WEPPY séparé ; le serveur MCP local l'utilise uniquement pour les demandes d'upload Roblox Open Cloud.
697
-
698
- Assets est encore expérimental. D'autres catégories seront ajoutées progressivement.`},severity:"info",category:"release"}],Jl="weppy-dashboard.whatsNew.readIds";function Yp(){try{const i=localStorage.getItem(Jl);if(!i)return new Set;const n=JSON.parse(i);return Array.isArray(n)?new Set(n.filter(r=>typeof r=="string")):new Set}catch{return new Set}}function Uv(i){try{localStorage.setItem(Jl,JSON.stringify([...i]))}catch{}}let di=Yp(),Gp=di;const Wl=new Set;function Xp(){Gp=new Set(di);for(const i of Wl)i()}const zl={subscribe(i){return Wl.add(i),()=>{Wl.delete(i)}},getSnapshot(){return Gp},markRead(i){let n=!1;for(const r of i)di.has(r)||(di.add(r),n=!0);n&&(Uv(di),Xp())}};typeof window<"u"&&window.addEventListener("storage",i=>{i.key===Jl&&(di=Yp(),Xp())});function Mv(){const i=R.useSyncExternalStore(zl.subscribe,zl.getSnapshot),n=zv.filter(r=>!i.has(r.id)).length;return{readSet:i,unreadCount:n,markRead:zl.markRead}}const Hv="_header_1do17_2",_v="_row1_1do17_17",Nv="_contextGroups_1do17_25",Ov="_projectGroup_1do17_33",qv="_studioGroup_1do17_34",Bv="_groupTitleRow_1do17_52",Wv="_groupLabel_1do17_59",Fv="_groupIcon_1do17_73",Kv="_projectName_1do17_78",Vv="_placeChips_1do17_90",Yv="_metaActions_1do17_99",Gv="_placeChip_1do17_90",Xv="_placeChipStatic_1do17_122",$v="_placeChipMuted_1do17_123",Qv="_placeChipActive_1do17_127",Zv="_placeChipInactive_1do17_134",Jv="_placeChipId_1do17_145",eb="_placeChipClient_1do17_160",tb="_placeChipState_1do17_166",ob="_placeChipBadge_1do17_172",ab="_placeDot_1do17_180",ib="_placeChipName_1do17_188",sb="_row2_1do17_196",nb="_pathRow_1do17_208",rb="_auxiliaryPath_1do17_209",lb="_pathLabel_1do17_221",db="_projectPath_1do17_232",ub="_changeButton_1do17_242",cb="_iconButton_1do17_276",be={header:Hv,row1:_v,contextGroups:Nv,projectGroup:Ov,studioGroup:qv,groupTitleRow:Bv,groupLabel:Wv,groupIcon:Fv,projectName:Kv,placeChips:Vv,metaActions:Yv,placeChip:Gv,placeChipStatic:Xv,placeChipMuted:$v,placeChipActive:Qv,placeChipInactive:Zv,placeChipId:Jv,placeChipClient:eb,placeChipState:tb,placeChipBadge:ob,placeDot:ab,placeChipName:ib,row2:sb,pathRow:nb,auxiliaryPath:rb,pathLabel:lb,projectPath:db,changeButton:ub,iconButton:cb},pb="_bellWrapper_tae21_2",gb="_unreadDot_tae21_8",up={bellWrapper:pb,unreadDot:gb};function hb(){const{t:i}=Lo(),{unreadCount:n}=Mv(),{trackEvent:r}=us(),{pathname:d,search:u}=Vt(),p=ds(d,u),g=n>0?`${i("header.whatsNew","What's New")} (${n})`:i("header.whatsNew","What's New");return x.jsx(Ft,{text:i("header.whatsNew.tooltip","What's New"),children:x.jsxs("span",{className:up.bellWrapper,children:[x.jsx(ja,{to:"/whats-new","aria-label":g,className:be.iconButton,onClick:()=>r("dashboard_click_event",{click_target:"top_header_notification_bell",placement:"top_header",...p}),children:"🔔"}),n>0&&x.jsx("span",{className:up.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}function $p(i,n,r){const d=n==="pinned"?r:null;return[...i].sort((u,p)=>mb(u,p,d))}function Nb(i,n,r){return $p(i,n,r)[0]}function mb(i,n,r){if(r){const h=i.clientId===r,v=n.clientId===r;if(h!==v)return h?-1:1}const d=i.lastRoutedAt,u=n.lastRoutedAt,p=d!==void 0;if(p!==(u!==void 0))return p?-1:1;if(d!==void 0&&u!==void 0&&d!==u)return u-d;const y=(i.connectedAt??0)-(n.connectedAt??0);return y!==0?y:i.clientId.localeCompare(n.clientId)}function cp(i){if(!i)return"";const n=i.split(/[\\/]/).filter(Boolean);return n[n.length-1]??""}function yb(i){var d,u;const n=((d=i==null?void 0:i.mcpInstances)==null?void 0:d.filter(p=>!p.isServer&&p.aiClientName))??[];if(n.length===0){const p=((u=i==null?void 0:i.mcpInstances)==null?void 0:u.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}n.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const r=n[0];return r.projectRoot??r.cwd??null}function pp(i,n){return i??n}function fb(i){const n=i.replace(/^\//,"").split("/")[0];return n===""||n==="overview"}function Sb(i){return i.replace(/^\//,"").split("/")[0]==="whats-new"}function vb(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function gp(i,n){return Object.entries(n).reduce((r,[d,u])=>r.split(`{${d}}`).join(u||"-"),i)}function bb(i,n){const r=i.studioState??"unknown",d={edit:n("connection.targets.studioState.edit","Edit"),running:n("connection.targets.studioState.running","Running"),paused:n("connection.targets.studioState.paused","Paused"),unknown:n("connection.targets.studioState.unknown","Unknown")},u=i.playtestMode&&i.playtestMode!=="unknown"?`/${i.playtestMode}`:"";return`${d[r]}${u}`}function Pb(){var z,ye;const{pathname:i,search:n}=Vt(),{level:r,status:d}=_n(),{t:u}=Lo(),{trackEvent:p}=us(),[g,y]=R.useState(null),[h,v]=R.useState(null),[C,P]=R.useState(null),[D,L]=R.useState(!1),B=u("header.placeNotConnected","Place not connected"),U=(d==null?void 0:d.studioRoutingMode)??"recentPriority",N=(d==null?void 0:d.pinnedTargetClientId)??null,le=$p((d==null?void 0:d.pluginClients)??[],U,N),W=le[0],oe=fb(i),V=Sb(i),pe=ds(i,n);R.useEffect(()=>{let K=!1;async function ae(){if(r==="disconnected"){y(null);return}try{const ue=await jt.get("/connection-info");K||y(ue)}catch{K||y(null)}}return ae(),()=>{K=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let K=!1;async function ae(){if(r==="disconnected"){v(null),L(!1);return}v(null),L(!1);try{const ue=await Lv();K||(v(ue),L(!1))}catch{K||(v(null),L(!0))}}return ae(),()=>{K=!0}},[oe,r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let K=!1;async function ae(){if(r==="disconnected"){P(null);return}try{const ue=await Tv();K||P(ue)}catch{K||P(null)}}return ae(),()=>{K=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]);const De=yb(g)??"",j=r==="disconnected"?"blocked":h?"ready":D?"error":"loading",$=j==="ready"?(h==null?void 0:h.projectRoot)??"":j==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"),Se=j==="ready"?(h==null?void 0:h.projectRoot)??"":oe?"":De,ce=oe||j==="ready"?j==="ready"?cp(Se)||u("header.unknownProject","Unknown project"):j==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"):cp(Se)||u("header.unknownProject","Unknown project"),Te=pp((ye=(z=d==null?void 0:d.pluginClients)==null?void 0:z[0])==null?void 0:ye.placeName,B),we=C!=null&&C.pluginConnected?C.activePlaceId:(C==null?void 0:C.lastActivePlaceId)??null,ke=[...(C==null?void 0:C.places)??[]].sort((K,ae)=>{const ue=K.placeId===we,Pe=ae.placeId===we;return ue!==Pe?ue?-1:1:K.isConnected!==ae.isConnected?K.isConnected?-1:1:K.placeName.localeCompare(ae.placeName)}),He=le.length>0?ke.filter(K=>!le.some(ae=>ae.placeId!==void 0&&ae.placeId===K.placeId)):ke,et=oe?j==="loading"?u("header.currentProject.loading.tooltip","Project root information is still loading"):j==="error"?u("header.currentProject.unavailable.tooltip","Current project root information is unavailable"):u("header.currentProject.tooltip","Currently selected project folder"):u("header.currentProject.tooltip","Currently selected project folder"),ot=u("header.manageProjectRoot.tooltip","Open Project Root controls"),_e=u("header.activeStudio.tooltip","Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target."),O=ke.find(K=>K.placeId===we)??null,de=vb(i),G=h!=null&&h.projectSyncRoot&&O?`${h.projectSyncRoot}/${O.placeDirName}`:null,w=de==="playtest"?O!=null&&O.testsPath?{label:u("header.testFiles.label","Test Files"),value:O.testsPath,tooltip:u("header.testFiles.tooltip","Current playtest files directory for the selected place")}:null:["sync","changelog","ui-studio"].includes(de)&&G?{label:u("header.placeData.label","Place Data"),value:G,tooltip:u("header.placeData.tooltip","Current place data directory")}:null;return x.jsx(x.Fragment,{children:x.jsxs("header",{className:be.header,children:[x.jsxs("div",{className:be.row1,children:[x.jsxs("div",{className:be.contextGroups,children:[x.jsxs("section",{className:be.projectGroup,"aria-label":u("header.projectGroup.label","Project"),children:[x.jsxs("div",{className:be.groupTitleRow,children:[x.jsxs("span",{className:be.groupLabel,children:[x.jsx(Hf,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.projectGroup.label","Project")]}),x.jsx(Ft,{text:et,children:x.jsx("h1",{className:be.projectName,children:ce})}),x.jsx(Ft,{text:ot,children:x.jsx(ja,{to:"/controls?section=project-root",className:be.changeButton,onClick:()=>p("dashboard_click_event",{click_target:"project_root_manage",placement:"top_header",...pe}),children:u("header.manageProjectRoot","Manage Project Root")})})]}),x.jsxs("div",{className:be.pathRow,children:[x.jsx("span",{className:be.pathLabel,children:u("header.projectRoot.label","Project Root")}),x.jsx("span",{className:be.projectPath,title:$,children:$})]})]}),x.jsxs("section",{className:be.studioGroup,"aria-label":u("header.activeStudio.label","Active Studio"),children:[x.jsx(Ft,{text:_e,children:x.jsxs("span",{className:be.groupLabel,children:[x.jsx(eS,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.activeStudio.label","Active Studio")]})}),x.jsxs("div",{className:be.placeChips,children:[le.map(K=>{const ae=K.targetAlias,ue=pp(K.placeName,B),Pe=K.connectionState??"connected",xe=le.filter(yo=>yo.placeId!==void 0&&yo.placeId===K.placeId).length>1,Le=U==="pinned"&&N===K.clientId?u("connection.routing.pinnedBadge","Pinned"):U==="recentPriority"&&(W==null?void 0:W.clientId)===K.clientId?u("connection.routing.priorityBadge","Priority"):"-",gt=gp(u("header.studioTarget.tooltip","Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}"),{studioId:ae,connectionId:K.clientId,placeName:ue,placeId:K.placeId!==void 0?String(K.placeId):"-",state:Pe,runtimeState:bb(K,u),routing:Le});return x.jsx(Ft,{text:gt,children:x.jsxs("span",{className:`${be.placeChip} ${be.placeChipStatic} ${be.placeChipActive}`,children:[x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}),x.jsx("span",{className:be.placeChipName,children:ue}),K.placeId!==void 0?x.jsx("span",{className:be.placeChipId,children:K.placeId}):null,x.jsx("span",{className:be.placeChipState,children:Pe}),xe?x.jsx("span",{className:be.placeChipClient,children:ae}):null,Le!=="-"?x.jsx("span",{className:be.placeChipBadge,children:Le}):null]})},K.clientId)}),le.length===0&&He.length===0?x.jsx(Ft,{text:u("header.activeStudio.emptyTooltip","No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin."),children:x.jsx("span",{className:`${be.placeChip} ${be.placeChipMuted}`,children:x.jsx("span",{className:be.placeChipName,children:Te})})}):He.map(K=>{const ae=K.placeId===we,ue=!!(C!=null&&C.pluginConnected)&&K.isConnected,Pe=ue?u("header.places.active","Active"):u("header.places.inactive","Inactive"),xe=gp(u("header.storedPlace.tooltip","Stored project place: {placeName} · Place ID: {placeId} · State: {state}"),{placeName:K.placeName,placeId:String(K.placeId),state:Pe}),Le=[be.placeChip,be.placeChipStatic,ae&&ue?be.placeChipActive:be.placeChipInactive].filter(Boolean).join(" ");return x.jsx(Ft,{text:xe,children:x.jsxs("span",{className:Le,children:[ae&&ue?x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}):null,x.jsx("span",{className:be.placeChipName,children:K.placeName}),x.jsx("span",{className:be.placeChipId,children:K.placeId})]})},`${K.placeId}:${K.placeDirName}`)})]})]})]}),x.jsxs("div",{className:be.metaActions,children:[!V&&x.jsx(hb,{}),x.jsx(Ft,{text:u("sidebar.controls","Controls"),children:x.jsx(ja,{to:"/controls","aria-label":u("sidebar.controls","Controls"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_controls",placement:"top_header",...pe}),children:x.jsx(Wp,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})}),x.jsx(Ft,{text:u("sidebar.settings","Settings"),children:x.jsx(ja,{to:"/settings","aria-label":u("sidebar.settings","Settings"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_settings",placement:"top_header",...pe}),children:x.jsx(rS,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),x.jsx("div",{className:be.row2,"data-testid":"top-header-auxiliary-slot","data-state":w?"visible":"empty","aria-hidden":w?void 0:!0,children:w?x.jsx(Ft,{text:w.tooltip,children:x.jsxs("div",{className:be.auxiliaryPath,children:[x.jsx("span",{className:be.pathLabel,children:w.label}),x.jsx("span",{className:be.projectPath,title:w.value,children:w.value})]})}):null})]})})}const Cb="_layout_19mmz_2",wb="_mainShell_19mmz_8",kb="_content_19mmz_17",xb="_loading_19mmz_26",In={layout:Cb,mainShell:wb,content:kb,loading:xb};function Rb(){const{pathname:i,search:n}=Vt(),{trackPageView:r}=us();return R.useEffect(()=>{r(ds(i,n))},[i,n,r]),null}function Ab(){const{t:i}=Lo();return x.jsx("div",{className:In.loading,children:i("common.loading","Loading...")})}function Ib(){return x.jsx(Zy,{children:x.jsx(lf,{children:x.jsxs(qy,{children:[x.jsx(uf,{}),x.jsx(Rb,{}),x.jsxs("div",{className:In.layout,children:[x.jsx(Ev,{}),x.jsxs("div",{className:In.mainShell,children:[x.jsx(Pb,{}),x.jsx("main",{className:In.content,children:x.jsx(R.Suspense,{fallback:x.jsx(Ab,{}),children:x.jsx(ny,{})})})]})]})]})})})}function hp(i){return i.route==="/"?{index:!0,lazy:i.lazy}:{path:i.route.slice(1),lazy:i.lazy}}const Db=my([{path:"/",element:x.jsx(Ib,{}),children:[...Fp.map(hp),...ql.map(hp),{path:"changelog/:id",lazy:()=>Kt(()=>import("./ChangelogDetailPage-gpaNW7UJ.js"),__vite__mapDeps([42,1,9,10,8,3,4,43]))},{path:"settings",lazy:()=>Kt(()=>import("./SettingsPage-Camuqp3Q.js"),__vite__mapDeps([44,2,3,4,5,1,8,38,39,14,15,16,32,33,45]))}]}]);qh.createRoot(document.getElementById("root")).render(x.jsx(wy,{router:Db}));export{Ea as A,zb as B,Ub as C,Ql as D,qp as E,Hf as F,Mb as G,Mv as H,Wf as I,zv as J,Ln as K,ja as L,eS as M,Tb as N,oS as P,Bp as R,$y as S,bS as T,gS as X,jt as a,Eb as b,$l as c,Vt as d,us as e,_n as f,Tv as g,SS as h,Ke as i,x as j,Ft as k,df as l,My as m,ds as n,Hn as o,Ef as p,rS as q,R as r,$p as s,Lb as t,Lo as u,Lv as v,_b as w,Hb as x,Nb as y,Np as z};
586
+ Aucune migration manuelle n'est requise. Utilisez cette fonction lorsque vous voulez conserver le résultat de génération Studio comme sauvegarde RBXM locale ou l'envoyer pour le réutiliser avec un Roblox asset ID.`},severity:"info",category:"release"}],Jl="weppy-dashboard.whatsNew.readIds";function Yp(){try{const i=localStorage.getItem(Jl);if(!i)return new Set;const n=JSON.parse(i);return Array.isArray(n)?new Set(n.filter(r=>typeof r=="string")):new Set}catch{return new Set}}function Uv(i){try{localStorage.setItem(Jl,JSON.stringify([...i]))}catch{}}let di=Yp(),Gp=di;const Wl=new Set;function $p(){Gp=new Set(di);for(const i of Wl)i()}const zl={subscribe(i){return Wl.add(i),()=>{Wl.delete(i)}},getSnapshot(){return Gp},markRead(i){let n=!1;for(const r of i)di.has(r)||(di.add(r),n=!0);n&&(Uv(di),$p())}};typeof window<"u"&&window.addEventListener("storage",i=>{i.key===Jl&&(di=Yp(),$p())});function Hv(){const i=R.useSyncExternalStore(zl.subscribe,zl.getSnapshot),n=zv.filter(r=>!i.has(r.id)).length;return{readSet:i,unreadCount:n,markRead:zl.markRead}}const Mv="_header_1do17_2",Nv="_row1_1do17_17",_v="_contextGroups_1do17_25",Ov="_projectGroup_1do17_33",qv="_studioGroup_1do17_34",Bv="_groupTitleRow_1do17_52",Wv="_groupLabel_1do17_59",Fv="_groupIcon_1do17_73",Kv="_projectName_1do17_78",Vv="_placeChips_1do17_90",Yv="_metaActions_1do17_99",Gv="_placeChip_1do17_90",$v="_placeChipStatic_1do17_122",Xv="_placeChipMuted_1do17_123",Qv="_placeChipActive_1do17_127",Zv="_placeChipInactive_1do17_134",Jv="_placeChipId_1do17_145",eb="_placeChipClient_1do17_160",tb="_placeChipState_1do17_166",ob="_placeChipBadge_1do17_172",ab="_placeDot_1do17_180",ib="_placeChipName_1do17_188",sb="_row2_1do17_196",nb="_pathRow_1do17_208",rb="_auxiliaryPath_1do17_209",lb="_pathLabel_1do17_221",db="_projectPath_1do17_232",ub="_changeButton_1do17_242",cb="_iconButton_1do17_276",be={header:Mv,row1:Nv,contextGroups:_v,projectGroup:Ov,studioGroup:qv,groupTitleRow:Bv,groupLabel:Wv,groupIcon:Fv,projectName:Kv,placeChips:Vv,metaActions:Yv,placeChip:Gv,placeChipStatic:$v,placeChipMuted:Xv,placeChipActive:Qv,placeChipInactive:Zv,placeChipId:Jv,placeChipClient:eb,placeChipState:tb,placeChipBadge:ob,placeDot:ab,placeChipName:ib,row2:sb,pathRow:nb,auxiliaryPath:rb,pathLabel:lb,projectPath:db,changeButton:ub,iconButton:cb},pb="_bellWrapper_tae21_2",gb="_unreadDot_tae21_8",up={bellWrapper:pb,unreadDot:gb};function hb(){const{t:i}=Lo(),{unreadCount:n}=Hv(),{trackEvent:r}=us(),{pathname:d,search:u}=Vt(),p=ds(d,u),g=n>0?`${i("header.whatsNew","What's New")} (${n})`:i("header.whatsNew","What's New");return x.jsx(Ft,{text:i("header.whatsNew.tooltip","What's New"),children:x.jsxs("span",{className:up.bellWrapper,children:[x.jsx(ja,{to:"/whats-new","aria-label":g,className:be.iconButton,onClick:()=>r("dashboard_click_event",{click_target:"top_header_notification_bell",placement:"top_header",...p}),children:"🔔"}),n>0&&x.jsx("span",{className:up.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}function Xp(i,n,r){const d=n==="pinned"?r:null;return[...i].sort((u,p)=>mb(u,p,d))}function _b(i,n,r){return Xp(i,n,r)[0]}function mb(i,n,r){if(r){const h=i.clientId===r,v=n.clientId===r;if(h!==v)return h?-1:1}const d=i.lastRoutedAt,u=n.lastRoutedAt,p=d!==void 0;if(p!==(u!==void 0))return p?-1:1;if(d!==void 0&&u!==void 0&&d!==u)return u-d;const y=(i.connectedAt??0)-(n.connectedAt??0);return y!==0?y:i.clientId.localeCompare(n.clientId)}function cp(i){if(!i)return"";const n=i.split(/[\\/]/).filter(Boolean);return n[n.length-1]??""}function yb(i){var d,u;const n=((d=i==null?void 0:i.mcpInstances)==null?void 0:d.filter(p=>!p.isServer&&p.aiClientName))??[];if(n.length===0){const p=((u=i==null?void 0:i.mcpInstances)==null?void 0:u.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}n.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const r=n[0];return r.projectRoot??r.cwd??null}function pp(i,n){return i??n}function fb(i){const n=i.replace(/^\//,"").split("/")[0];return n===""||n==="overview"}function Sb(i){return i.replace(/^\//,"").split("/")[0]==="whats-new"}function vb(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function gp(i,n){return Object.entries(n).reduce((r,[d,u])=>r.split(`{${d}}`).join(u||"-"),i)}function bb(i,n){const r=i.studioState??"unknown",d={edit:n("connection.targets.studioState.edit","Edit"),running:n("connection.targets.studioState.running","Running"),paused:n("connection.targets.studioState.paused","Paused"),unknown:n("connection.targets.studioState.unknown","Unknown")},u=i.playtestMode&&i.playtestMode!=="unknown"?`/${i.playtestMode}`:"";return`${d[r]}${u}`}function Pb(){var z,ye;const{pathname:i,search:n}=Vt(),{level:r,status:d}=Nn(),{t:u}=Lo(),{trackEvent:p}=us(),[g,y]=R.useState(null),[h,v]=R.useState(null),[w,P]=R.useState(null),[D,L]=R.useState(!1),B=u("header.placeNotConnected","Place not connected"),U=(d==null?void 0:d.studioRoutingMode)??"recentPriority",_=(d==null?void 0:d.pinnedTargetClientId)??null,le=Xp((d==null?void 0:d.pluginClients)??[],U,_),W=le[0],oe=fb(i),V=Sb(i),pe=ds(i,n);R.useEffect(()=>{let K=!1;async function ae(){if(r==="disconnected"){y(null);return}try{const ue=await jt.get("/connection-info");K||y(ue)}catch{K||y(null)}}return ae(),()=>{K=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let K=!1;async function ae(){if(r==="disconnected"){v(null),L(!1);return}v(null),L(!1);try{const ue=await Lv();K||(v(ue),L(!1))}catch{K||(v(null),L(!0))}}return ae(),()=>{K=!0}},[oe,r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let K=!1;async function ae(){if(r==="disconnected"){P(null);return}try{const ue=await Tv();K||P(ue)}catch{K||P(null)}}return ae(),()=>{K=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]);const De=yb(g)??"",j=r==="disconnected"?"blocked":h?"ready":D?"error":"loading",X=j==="ready"?(h==null?void 0:h.projectRoot)??"":j==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"),Se=j==="ready"?(h==null?void 0:h.projectRoot)??"":oe?"":De,ce=oe||j==="ready"?j==="ready"?cp(Se)||u("header.unknownProject","Unknown project"):j==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"):cp(Se)||u("header.unknownProject","Unknown project"),Te=pp((ye=(z=d==null?void 0:d.pluginClients)==null?void 0:z[0])==null?void 0:ye.placeName,B),Ce=w!=null&&w.pluginConnected?w.activePlaceId:(w==null?void 0:w.lastActivePlaceId)??null,ke=[...(w==null?void 0:w.places)??[]].sort((K,ae)=>{const ue=K.placeId===Ce,Pe=ae.placeId===Ce;return ue!==Pe?ue?-1:1:K.isConnected!==ae.isConnected?K.isConnected?-1:1:K.placeName.localeCompare(ae.placeName)}),Me=le.length>0?ke.filter(K=>!le.some(ae=>ae.placeId!==void 0&&ae.placeId===K.placeId)):ke,et=oe?j==="loading"?u("header.currentProject.loading.tooltip","Project root information is still loading"):j==="error"?u("header.currentProject.unavailable.tooltip","Current project root information is unavailable"):u("header.currentProject.tooltip","Currently selected project folder"):u("header.currentProject.tooltip","Currently selected project folder"),ot=u("header.manageProjectRoot.tooltip","Open Project Root controls"),Ne=u("header.activeStudio.tooltip","Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target."),O=ke.find(K=>K.placeId===Ce)??null,de=vb(i),G=h!=null&&h.projectSyncRoot&&O?`${h.projectSyncRoot}/${O.placeDirName}`:null,C=de==="playtest"?O!=null&&O.testsPath?{label:u("header.testFiles.label","Test Files"),value:O.testsPath,tooltip:u("header.testFiles.tooltip","Current playtest files directory for the selected place")}:null:["sync","changelog","ui-studio"].includes(de)&&G?{label:u("header.placeData.label","Place Data"),value:G,tooltip:u("header.placeData.tooltip","Current place data directory")}:null;return x.jsx(x.Fragment,{children:x.jsxs("header",{className:be.header,children:[x.jsxs("div",{className:be.row1,children:[x.jsxs("div",{className:be.contextGroups,children:[x.jsxs("section",{className:be.projectGroup,"aria-label":u("header.projectGroup.label","Project"),children:[x.jsxs("div",{className:be.groupTitleRow,children:[x.jsxs("span",{className:be.groupLabel,children:[x.jsx(Mf,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.projectGroup.label","Project")]}),x.jsx(Ft,{text:et,children:x.jsx("h1",{className:be.projectName,children:ce})}),x.jsx(Ft,{text:ot,children:x.jsx(ja,{to:"/controls?section=project-root",className:be.changeButton,onClick:()=>p("dashboard_click_event",{click_target:"project_root_manage",placement:"top_header",...pe}),children:u("header.manageProjectRoot","Manage Project Root")})})]}),x.jsxs("div",{className:be.pathRow,children:[x.jsx("span",{className:be.pathLabel,children:u("header.projectRoot.label","Project Root")}),x.jsx("span",{className:be.projectPath,title:X,children:X})]})]}),x.jsxs("section",{className:be.studioGroup,"aria-label":u("header.activeStudio.label","Active Studio"),children:[x.jsx(Ft,{text:Ne,children:x.jsxs("span",{className:be.groupLabel,children:[x.jsx(eS,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.activeStudio.label","Active Studio")]})}),x.jsxs("div",{className:be.placeChips,children:[le.map(K=>{const ae=K.targetAlias,ue=pp(K.placeName,B),Pe=K.connectionState??"connected",xe=le.filter(yo=>yo.placeId!==void 0&&yo.placeId===K.placeId).length>1,Le=U==="pinned"&&_===K.clientId?u("connection.routing.pinnedBadge","Pinned"):U==="recentPriority"&&(W==null?void 0:W.clientId)===K.clientId?u("connection.routing.priorityBadge","Priority"):"-",gt=gp(u("header.studioTarget.tooltip","Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}"),{studioId:ae,connectionId:K.clientId,placeName:ue,placeId:K.placeId!==void 0?String(K.placeId):"-",state:Pe,runtimeState:bb(K,u),routing:Le});return x.jsx(Ft,{text:gt,children:x.jsxs("span",{className:`${be.placeChip} ${be.placeChipStatic} ${be.placeChipActive}`,children:[x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}),x.jsx("span",{className:be.placeChipName,children:ue}),K.placeId!==void 0?x.jsx("span",{className:be.placeChipId,children:K.placeId}):null,x.jsx("span",{className:be.placeChipState,children:Pe}),xe?x.jsx("span",{className:be.placeChipClient,children:ae}):null,Le!=="-"?x.jsx("span",{className:be.placeChipBadge,children:Le}):null]})},K.clientId)}),le.length===0&&Me.length===0?x.jsx(Ft,{text:u("header.activeStudio.emptyTooltip","No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin."),children:x.jsx("span",{className:`${be.placeChip} ${be.placeChipMuted}`,children:x.jsx("span",{className:be.placeChipName,children:Te})})}):Me.map(K=>{const ae=K.placeId===Ce,ue=!!(w!=null&&w.pluginConnected)&&K.isConnected,Pe=ue?u("header.places.active","Active"):u("header.places.inactive","Inactive"),xe=gp(u("header.storedPlace.tooltip","Stored project place: {placeName} · Place ID: {placeId} · State: {state}"),{placeName:K.placeName,placeId:String(K.placeId),state:Pe}),Le=[be.placeChip,be.placeChipStatic,ae&&ue?be.placeChipActive:be.placeChipInactive].filter(Boolean).join(" ");return x.jsx(Ft,{text:xe,children:x.jsxs("span",{className:Le,children:[ae&&ue?x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}):null,x.jsx("span",{className:be.placeChipName,children:K.placeName}),x.jsx("span",{className:be.placeChipId,children:K.placeId})]})},`${K.placeId}:${K.placeDirName}`)})]})]})]}),x.jsxs("div",{className:be.metaActions,children:[!V&&x.jsx(hb,{}),x.jsx(Ft,{text:u("sidebar.controls","Controls"),children:x.jsx(ja,{to:"/controls","aria-label":u("sidebar.controls","Controls"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_controls",placement:"top_header",...pe}),children:x.jsx(Wp,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})}),x.jsx(Ft,{text:u("sidebar.settings","Settings"),children:x.jsx(ja,{to:"/settings","aria-label":u("sidebar.settings","Settings"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_settings",placement:"top_header",...pe}),children:x.jsx(rS,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),x.jsx("div",{className:be.row2,"data-testid":"top-header-auxiliary-slot","data-state":C?"visible":"empty","aria-hidden":C?void 0:!0,children:C?x.jsx(Ft,{text:C.tooltip,children:x.jsxs("div",{className:be.auxiliaryPath,children:[x.jsx("span",{className:be.pathLabel,children:C.label}),x.jsx("span",{className:be.projectPath,title:C.value,children:C.value})]})}):null})]})})}const wb="_layout_19mmz_2",Cb="_mainShell_19mmz_8",kb="_content_19mmz_17",xb="_loading_19mmz_26",In={layout:wb,mainShell:Cb,content:kb,loading:xb};function Rb(){const{pathname:i,search:n}=Vt(),{trackPageView:r}=us();return R.useEffect(()=>{r(ds(i,n))},[i,n,r]),null}function Ab(){const{t:i}=Lo();return x.jsx("div",{className:In.loading,children:i("common.loading","Loading...")})}function Ib(){return x.jsx(Zy,{children:x.jsx(lf,{children:x.jsxs(qy,{children:[x.jsx(uf,{}),x.jsx(Rb,{}),x.jsxs("div",{className:In.layout,children:[x.jsx(Ev,{}),x.jsxs("div",{className:In.mainShell,children:[x.jsx(Pb,{}),x.jsx("main",{className:In.content,children:x.jsx(R.Suspense,{fallback:x.jsx(Ab,{}),children:x.jsx(ny,{})})})]})]})]})})})}function hp(i){return i.route==="/"?{index:!0,lazy:i.lazy}:{path:i.route.slice(1),lazy:i.lazy}}const Db=my([{path:"/",element:x.jsx(Ib,{}),children:[...Fp.map(hp),...ql.map(hp),{path:"changelog/:id",lazy:()=>Kt(()=>import("./ChangelogDetailPage-Blm2KD_v.js"),__vite__mapDeps([42,1,9,10,8,3,4,43]))},{path:"settings",lazy:()=>Kt(()=>import("./SettingsPage-DcuPwNrv.js"),__vite__mapDeps([44,2,3,4,5,1,8,38,39,14,15,16,32,33,45]))}]}]);qh.createRoot(document.getElementById("root")).render(x.jsx(Cy,{router:Db}));export{Ea as A,zb as B,Ub as C,Ql as D,qp as E,Mf as F,Hb as G,Hv as H,Wf as I,zv as J,Ln as K,ja as L,eS as M,Tb as N,oS as P,Bp as R,Xy as S,bS as T,gS as X,jt as a,Eb as b,Xl as c,Vt as d,us as e,Nn as f,Tv as g,SS as h,Ke as i,x as j,Ft as k,df as l,Hy as m,ds as n,Mn as o,Ef as p,rS as q,R as r,Xp as s,Lb as t,Lo as u,Lv as v,Nb as w,Mb as x,_b as y,_p as z};